<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Meronq</title>
    <description>The latest articles on DEV Community by Meronq (@meronq).</description>
    <link>https://dev.to/meronq</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4009336%2Fb52c3d09-f274-4995-8936-79de7e66fe1e.png</url>
      <title>DEV Community: Meronq</title>
      <link>https://dev.to/meronq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/meronq"/>
    <language>en</language>
    <item>
      <title>We built a product around context cost and never measured our own tools</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Sun, 30 Aug 2026 11:46:58 +0000</pubDate>
      <link>https://dev.to/meronq/we-built-a-product-around-context-cost-and-never-measured-our-own-tools-3pg1</link>
      <guid>https://dev.to/meronq/we-built-a-product-around-context-cost-and-never-measured-our-own-tools-3pg1</guid>
      <description>&lt;p&gt;Meronq is an engineering-intelligence layer: it keeps a model of your project — components, decisions, evidence — and serves it to AI assistants over MCP. Context cost is the whole premise. We have an ADR that prices understanding against tokens. Our handshake tool sends a vitality-focused slice, 21 entities out of 176, precisely so a session does not pay for the entire graph.&lt;/p&gt;

&lt;p&gt;Then we measured what the &lt;em&gt;other&lt;/em&gt; tools returned.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;memory_sync&lt;/code&gt; — the tool whose useful answer is "synced, here is what changed" — was returning &lt;strong&gt;84,484 bytes&lt;/strong&gt; on a real project. The entire Canonical Engineering Model plus the entire project scan. About 21,000 tokens to confirm a sync.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;project_list&lt;/code&gt;, which answers "which projects can I work on", returned &lt;strong&gt;46,190 bytes&lt;/strong&gt;. The local registry had grown to 240 entries; 227 of them pointed at temp directories that no longer existed. Every call shipped all of them.&lt;/p&gt;

&lt;p&gt;That is the uncomfortable part: none of this was discovered by a user complaint or a benchmark. It was sitting in our own instrumentation the whole time — &lt;code&gt;access_events.response_bytes&lt;/code&gt;, a column we wrote and never read.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix is deliberately boring
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Return counts by default.&lt;/strong&gt; &lt;code&gt;memory_sync&lt;/code&gt;, &lt;code&gt;project_scan&lt;/code&gt; and &lt;code&gt;github_sync&lt;/code&gt; share one code path. It now returns graph counts, what the sync changed, warnings, and a hint. The full payload is one argument away:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;before&lt;/th&gt;
&lt;th&gt;after&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;memory_sync&lt;/code&gt; (Unity project)&lt;/td&gt;
&lt;td&gt;85,061 B&lt;/td&gt;
&lt;td&gt;3,528 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;memory_sync&lt;/code&gt; (our monorepo)&lt;/td&gt;
&lt;td&gt;137,358 B&lt;/td&gt;
&lt;td&gt;1,521 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project_list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;46,190 B&lt;/td&gt;
&lt;td&gt;2,377 B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nothing is lost. The graph is in SQLite either way, semantic search reaches it, and &lt;code&gt;detail="full"&lt;/code&gt; still returns everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Put a ceiling on the shared response helper.&lt;/strong&gt; Every result now passes a 32,000-byte limit. One detail mattered more than the number: an oversized &lt;em&gt;object&lt;/em&gt; is replaced by a notice carrying its actual size, not truncated. Half a JSON object is not JSON, and handing an agent an unparseable fragment is worse than telling it plainly that the response was too large and how to narrow it. Oversized strings keep their head, which is usually the useful part of a log.&lt;/p&gt;

&lt;p&gt;The ceiling also has an escape hatch. A caller who explicitly asks for full detail raises it rather than being overruled. A limit that argues with an explicit request is a bug, not a safeguard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop shipping dead rows.&lt;/strong&gt; &lt;code&gt;project_list&lt;/code&gt; lists what exists on disk and counts the rest. The cause of the pile-up turned out to be our own test suite: project initialization registered into the real &lt;code&gt;~/.meronq/projects.json&lt;/code&gt; whenever no session was passed, so every full test run left rows behind in the developer's own registry. It takes an isolated registry home now.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did not ship, and why
&lt;/h2&gt;

&lt;p&gt;We bundle a multilingual e5-small model for offline semantic search. The obvious next step is to use it for &lt;em&gt;selection&lt;/em&gt; — pick the entities that best cover the graph instead of the hottest ones. A maximal-marginal-relevance pass over the stored vectors already does better on paper: seven entity types in a twenty-item budget instead of three.&lt;/p&gt;

&lt;p&gt;It is not enabled, because of what we feed the model. The embedded text is &lt;code&gt;name + summary + type + layer&lt;/code&gt;, and component summaries are formulaic — "Package: packages/x". The model reads the template, not the meaning. Clustering at cosine 0.95 cheerfully merged 64 distinct Unity modules into one group, and four unrelated packages of ours into another. Fix the input before trusting the output.&lt;/p&gt;

&lt;p&gt;One instrumentation gap is also still open: rows written outside the MCP dispatcher — our handshake's own presence row, and every desktop sidecar call — carry no response size. That is how 970 handshake rows ended up with 11 measurements, and why this took so long to notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson we actually take from this
&lt;/h2&gt;

&lt;p&gt;Having the right principle, the right ADR and the right instrumentation is not the same as looking at the number. We had all three for months. The tool that violated the principle hardest was the one nobody thought to check, because it "just syncs".&lt;/p&gt;

&lt;p&gt;If your product has a cost you care about, put one measurement of it somewhere you cannot avoid reading.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/" rel="noopener noreferrer"&gt;meronq.pages.dev&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Meronq-dev/meronq/tree/main/docs/blog" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Sprint 21 closed: keyword-first search, meaning when the string misses</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Wed, 19 Aug 2026 11:24:26 +0000</pubDate>
      <link>https://dev.to/meronq/sprint-21-closed-keyword-first-search-meaning-when-the-string-misses-2na6</link>
      <guid>https://dev.to/meronq/sprint-21-closed-keyword-first-search-meaning-when-the-string-misses-2na6</guid>
      <description>&lt;p&gt;Until this sprint, &lt;code&gt;memory_search&lt;/code&gt; was a contiguous SQL &lt;code&gt;LIKE&lt;/code&gt;. A question that shared no literal substring with the stored entity — a Russian paraphrase of an English ADR title, a reordered identifier — returned nothing. Assistants then opened files they did not need.&lt;/p&gt;

&lt;p&gt;Sprint 21 keeps the keyword path as the fast default and adds a &lt;strong&gt;bundled, offline&lt;/strong&gt; embedding fallback when &lt;code&gt;LIKE&lt;/code&gt; is empty (&lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/adr/ADR-0020-semantic-memory-retrieval.md" rel="noopener noreferrer"&gt;ADR-0020&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Keyword first, meaning when it misses
&lt;/h2&gt;

&lt;p&gt;Exact id / name / summary hits are unchanged. Only an empty keyword result runs cosine over that project's vectors. There is no Hugging Face fetch at runtime: &lt;code&gt;intfloat/multilingual-e5-small&lt;/code&gt; (int8 ONNX, 384-d) is vendored next to the process, one model per process, one &lt;code&gt;memory.db&lt;/code&gt; per project. Unchanged entities are not re-embedded.&lt;/p&gt;

&lt;p&gt;The number this sprint claimed to move, on a fixed bilingual suite with &lt;strong&gt;zero&lt;/strong&gt; substring overlap:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Recall&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Keyword &lt;code&gt;LIKE&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bundled e5 fallback&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Ranking that matches meaning, not heat
&lt;/h2&gt;

&lt;p&gt;On a live ~170-entity graph, e5 compresses almost every row into cosine 0.76–0.82. Adding vitality (up to +9) on top of that range returned the hottest components — the project node at strength 423 — instead of Sprint 21. Semantic fallback now ranks &lt;strong&gt;cosine first&lt;/strong&gt;, keeps neighbours within 0.02 of the best hit, and uses vitality only as a tie-break.&lt;/p&gt;

&lt;p&gt;Routine &lt;code&gt;chore&lt;/code&gt; / &lt;code&gt;ci&lt;/code&gt; / lockfile commits stay on the keyword path. &lt;code&gt;feat&lt;/code&gt; / &lt;code&gt;fix&lt;/code&gt; / ADR-touching commits remain eligible, with a small cosine penalty so a sprint or ADR of similar meaning wins the near-tie. ADR entities now carry a Context (else Decision) paragraph, so the embed-string is no longer title-only.&lt;/p&gt;

&lt;p&gt;Dogfood query &lt;em&gt;«найти знания когда точное совпадение строки ничего не даёт»&lt;/em&gt;: Sprint 21 first, sprint tasks next, important &lt;code&gt;fix(scanner)&lt;/code&gt; commits still present, version bumps gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licence and packaging
&lt;/h2&gt;

&lt;p&gt;Meronq is Apache-2.0. The bundled model is MIT (intfloat); transformers.js is Apache-2.0. End users do not download e5 from Hugging Face. Developers clone once and run &lt;code&gt;pnpm --filter @meronq/embeddings vendor-model&lt;/code&gt;. If weights are missing, search degrades to keywords without failing the session.&lt;/p&gt;

&lt;p&gt;Desktop copies the model into installer resources. &lt;code&gt;@huggingface/transformers&lt;/code&gt; stays &lt;strong&gt;external&lt;/strong&gt; to the sidecar — a packaged build that cannot resolve the WASM module remains keyword-only. MCP and &lt;code&gt;pnpm dev&lt;/code&gt; use the local vendored weights. That installer gap is the next sprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principle
&lt;/h2&gt;

&lt;p&gt;Keep the exact match when it exists. When it does not, look up meaning locally — and do not let heat or a version bump outrank the decision.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/2026-08-19-sprint-21-semantic-memory-retrieval/" rel="noopener noreferrer"&gt;meronq.pages.dev&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Meronq-dev/meronq/tree/main/docs/blog" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>ai</category>
      <category>opensource</category>
      <category>engineering</category>
    </item>
    <item>
      <title>Sprint 20 closed: tools that answer questions, and traces that prove they do</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Sun, 09 Aug 2026 21:04:03 +0000</pubDate>
      <link>https://dev.to/meronq/sprint-20-closed-tools-that-answer-questions-and-traces-that-prove-they-do-1cgb</link>
      <guid>https://dev.to/meronq/sprint-20-closed-tools-that-answer-questions-and-traces-that-prove-they-do-1cgb</guid>
      <description>&lt;p&gt;Until this sprint, Meronq's product tools introduced themselves the way connectors do: by naming the system they talk to. &lt;code&gt;github_sync&lt;/code&gt;, &lt;code&gt;memory_search&lt;/code&gt;, &lt;code&gt;project_build&lt;/code&gt;. Accurate labels — and the wrong unit for a host assistant that is trying to finish a job.&lt;/p&gt;

&lt;p&gt;Sprint 20 flips the surface to the question each tool answers, leaves a trace on every call, and finally writes into the two CEM layers that Sprint 19 left empty on purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools by intent
&lt;/h2&gt;

&lt;p&gt;Product tool descriptions are now questions. Handshake &lt;code&gt;next_steps&lt;/code&gt; name the tool to call next, not a vague suggestion. The ListTools payload grew — &lt;strong&gt;12245 → 13285&lt;/strong&gt; bytes — because question-form copy is longer; consolidation stays deferred. We measured before and after instead of guessing.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;memory_search&lt;/code&gt; gained a &lt;code&gt;layer&lt;/code&gt; filter so the closed CEM axis is reachable from chat, not only from the Temperature Map chips.&lt;/p&gt;

&lt;h2&gt;
  
  
  The empty layers get writers
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;project_build&lt;/code&gt; and &lt;code&gt;project_test&lt;/code&gt; used to throw their outcomes away. They now persist bounded CEM entities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Entity&lt;/th&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project_build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;build_result&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;artifact&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project_test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;test_run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;validation&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Retention is the latest ten of each kind. Results survive CEM rebuild and are excluded from the archive sweep.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instrumentation that can prove it
&lt;/h2&gt;

&lt;p&gt;Every product tool records an access event when a project is resolvable — not only &lt;code&gt;handshake&lt;/code&gt; and &lt;code&gt;memory_search&lt;/code&gt;. The MCP &lt;code&gt;initialize&lt;/code&gt; &lt;code&gt;clientInfo&lt;/code&gt; is threaded into that context, so later focus-steering work can answer &lt;em&gt;which assistant asked&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Init and cold Connect
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initialize&lt;/strong&gt; an empty folder seeds foundation docs and scan/syncs so Tasks and the map show a sprint immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cold Connect&lt;/strong&gt; — a repo with docs but no &lt;code&gt;.meronq&lt;/code&gt; store — materializes the store and scan/syncs without inventing docs into a foreign tree.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Still open
&lt;/h2&gt;

&lt;p&gt;Sprint 21 takes semantic retrieval: keyword-first &lt;code&gt;memory_search&lt;/code&gt; with a bundled embedding fallback. Focus steering waits on real per-client access histograms from this sprint's substrate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/2026-08-10-sprint-20-tools-by-intent/" rel="noopener noreferrer"&gt;meronq.pages.dev&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/blog/2026-08-10-sprint-20-tools-by-intent.md" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Sprint 17 closed: desktop distribution on R2 + in-app updates</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Thu, 30 Jul 2026 18:34:18 +0000</pubDate>
      <link>https://dev.to/meronq/sprint-17-closed-desktop-distribution-on-r2-in-app-updates-1005</link>
      <guid>https://dev.to/meronq/sprint-17-closed-desktop-distribution-on-r2-in-app-updates-1005</guid>
      <description>&lt;p&gt;Sprint 17 is &lt;strong&gt;closed&lt;/strong&gt;. Meronq Desktop can be downloaded from the website and updated in-app via signed Tauri updater artifacts on Cloudflare R2 (ADR-0016).&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No launcher&lt;/strong&gt; — distribute and update the Desktop app itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public R2 CDN&lt;/strong&gt; (&lt;code&gt;*.r2.dev&lt;/code&gt;) — versioned installers, &lt;code&gt;latest/&lt;/code&gt; aliases, and &lt;code&gt;latest.json&lt;/code&gt; for the updater.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website&lt;/strong&gt; &lt;a href="https://meronq.pages.dev/download/" rel="noopener noreferrer"&gt;/download/&lt;/a&gt; — Windows installers (macOS when artifacts land).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-app Check for updates&lt;/strong&gt; — &lt;code&gt;tauri-plugin-updater&lt;/code&gt; against the R2 manifest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish path&lt;/strong&gt; — GitHub Actions on &lt;code&gt;desktop-v*&lt;/code&gt; tags, plus local &lt;code&gt;publish-to-r2.mjs&lt;/code&gt; when Actions cannot start.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dogfood notes
&lt;/h2&gt;

&lt;p&gt;First publish is &lt;strong&gt;Windows &lt;code&gt;0.1.0&lt;/code&gt;&lt;/strong&gt;. macOS CDN packs, custom domain, and OS notarization stay deferred.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/2026-07-30-sprint-17-closed-desktop-distribution-r2-updater/" rel="noopener noreferrer"&gt;meronq.pages.dev&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/blog/2026-07-30-sprint-17-closed-desktop-distribution-r2-updater.md" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>tauri</category>
      <category>cloudflare</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Sprint 16 closed: memory soft sync and Temperature Map UX</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Thu, 30 Jul 2026 13:27:00 +0000</pubDate>
      <link>https://dev.to/meronq/sprint-16-closed-memory-soft-sync-and-temperature-map-ux-20ja</link>
      <guid>https://dev.to/meronq/sprint-16-closed-memory-soft-sync-and-temperature-map-ux-20ja</guid>
      <description>&lt;p&gt;Sprint 16 is &lt;strong&gt;closed&lt;/strong&gt;. Desktop memory refresh no longer depends on knowing &lt;code&gt;memory_sync&lt;/code&gt; by name, and the Temperature Map is easier to navigate when heat and focus matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soft sync policy&lt;/strong&gt; — handshake remains primary; Desktop adds debounced soft sync on window focus / visibility plus an explicit &lt;strong&gt;Refresh Memory&lt;/strong&gt; control (&lt;code&gt;POST /api/memory-sync&lt;/code&gt;). No git-triggered sync.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open GitHub counts&lt;/strong&gt; — handshake / agents / CLI report true open issues and open PRs after closed issues and merged PRs stayed in the CEM snapshot (ADR-0013).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temperature Map UX&lt;/strong&gt; — clickable Relations list to focus related nodes; Show archived + Expand/Pack without remounting the graph or jumping scroll; focus ranking by BFS from selection, then strength/score, then heat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Principle
&lt;/h2&gt;

&lt;p&gt;Memory should stay warm while you work. Refresh follows Connect/handshake, Desktop focus, and an explicit button — not a hidden MCP ritual.&lt;/p&gt;

&lt;p&gt;Cloud edge stays Workers-seeded. Desktop distribution and updater move to Sprint 17.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/2026-07-30-sprint-16-closed-memory-soft-sync-and-map-ux/" rel="noopener noreferrer"&gt;meronq.pages.dev&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/blog/2026-07-30-sprint-16-closed-memory-soft-sync-and-map-ux.md" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Sprint 14 closed: Memory Temperature Map</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Wed, 29 Jul 2026 18:09:29 +0000</pubDate>
      <link>https://dev.to/meronq/sprint-14-closed-memory-temperature-map-2kkk</link>
      <guid>https://dev.to/meronq/sprint-14-closed-memory-temperature-map-2kkk</guid>
      <description>&lt;h1&gt;
  
  
  Sprint 14 closed: Memory Temperature Map
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Date:&lt;/strong&gt; 2026-07-29&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Author:&lt;/strong&gt; Meronq team&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Tags:&lt;/strong&gt; sprint-14, memory, desktop, adr-0013, knowledge-vitality, temperature-map&lt;/p&gt;




&lt;p&gt;Sprint 14 is &lt;strong&gt;closed&lt;/strong&gt;. Knowledge Vitality is now visible in Meronq Desktop as a force-directed CEM graph — hot, warm, cold, and archived — with session-local Expand / Pack dials that never mutate shared SQLite (ADR-0013).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://meronq.pages.dev/blog/2026-07-29-sprint-14-closed-memory-temperature-map/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnas4vd7rvbjc88g1xyex.png" alt="Meronq Desktop Memory Temperature Map — force-directed CEM graph with hot/warm/cold nodes and heat-relief background" width="407" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Desktop Temperature Map: vitality-colored nodes, semantic edges, and a continuous heat-relief field. Click the image for the full recap.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;MemoryStore.getGraphSnapshot&lt;/code&gt;&lt;/strong&gt; — ranked subgraph with containment layers, plus derived semantic edges (&lt;code&gt;part_of&lt;/code&gt;, &lt;code&gt;evidenced_with&lt;/code&gt;) so the map is not only a sun of &lt;code&gt;contains&lt;/code&gt; through the project node.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sidecar &lt;code&gt;GET /api/memory-graph&lt;/code&gt;&lt;/strong&gt; — Desktop loads the temperature graph after Connect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temperature Map&lt;/strong&gt; — vis-network layout with a continuous heat-relief background, multi-select, edge labels only for the selection, and a persistent mount so clicks do not remount physics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expand / Pack&lt;/strong&gt; — session focus budget + estimated focus bytes; selection pulls 1-hop neighbors into focus without rewriting team memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Principle
&lt;/h2&gt;

&lt;p&gt;Sprint 12: real work leaves a signal.&lt;br&gt;&lt;br&gt;
Sprint 13: measure memory health — and understanding with control values.&lt;br&gt;&lt;br&gt;
Sprint 14: &lt;strong&gt;see&lt;/strong&gt; the temperature of that memory, and steer attention locally.&lt;/p&gt;

&lt;p&gt;MCP wrappers named &lt;code&gt;memory_expand&lt;/code&gt; / &lt;code&gt;memory_pack&lt;/code&gt; remain follow-up; the Desktop dials are the product vocabulary for the same viewport model.&lt;/p&gt;

&lt;p&gt;Canonical: &lt;a href="https://meronq.pages.dev/blog/2026-07-29-sprint-14-closed-memory-temperature-map/" rel="noopener noreferrer"&gt;https://meronq.pages.dev/blog/2026-07-29-sprint-14-closed-memory-temperature-map/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Sprint 9 closed: Desktop MVP</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Mon, 06 Jul 2026 04:21:00 +0000</pubDate>
      <link>https://dev.to/meronq/sprint-9-closed-desktop-mvp-288a</link>
      <guid>https://dev.to/meronq/sprint-9-closed-desktop-mvp-288a</guid>
      <description>&lt;p&gt;Sprint 9 is &lt;strong&gt;closed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal was to &lt;strong&gt;ship the first desktop shell&lt;/strong&gt; over Meronq's existing packages — a native window that connects a project, shows its handshake and memory, and manages the product MCP server. Sprint 8 explored productization; Sprint 9 turned the desktop track into running code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Sprint 9 delivered
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tauri 2 scaffold&lt;/strong&gt; in &lt;code&gt;apps/desktop&lt;/code&gt; — native window wrapping the web UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project folder picker&lt;/strong&gt; → sets &lt;code&gt;MERONQ_PATH&lt;/code&gt; for the connected project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handshake and memory stats UI&lt;/strong&gt; — vision, sprint, ADRs, and memory counts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server lifecycle&lt;/strong&gt; — start/stop with live status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The desktop is a &lt;strong&gt;shell over existing packages&lt;/strong&gt; (&lt;code&gt;@meronq/server-core&lt;/code&gt;, &lt;code&gt;@meronq/memory&lt;/code&gt;, &lt;code&gt;@meronq/mcp-server&lt;/code&gt;), consistent with ADR-0008.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Web UI (Vite)  →  Node sidecar (HTTP :39281)  →  &amp;lt;project&amp;gt;/.meronq/
                   · handshake (server-core)
                   · memory stats
                   · spawn mcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tauri 2 (&lt;code&gt;src-tauri/&lt;/code&gt;) adds the native window and folder picker; the same UI runs in the browser for fast iteration without compiling Rust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two ways to run it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web dev&lt;/strong&gt; (browser, no Rust): &lt;code&gt;pnpm --filter @meronq/desktop dev&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tauri native&lt;/strong&gt; (Rust): &lt;code&gt;pnpm --filter @meronq/desktop tauri:dev&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Web dev mode boots the sidecar and Vite UI on &lt;code&gt;http://localhost:1420&lt;/code&gt; and builds the &lt;code&gt;server-core&lt;/code&gt; / &lt;code&gt;mcp-server&lt;/code&gt; dependencies automatically on first run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect → inspect → run
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Empty folder&lt;/strong&gt; → &lt;code&gt;Initialize&lt;/code&gt; (creates README, &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;.meronq/local&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Existing repo&lt;/strong&gt; → &lt;code&gt;Connect&lt;/code&gt; (handshake + memory stats)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start MCP&lt;/strong&gt; → spawns &lt;code&gt;meronq-mcp&lt;/code&gt; with &lt;code&gt;MERONQ_PATH&lt;/code&gt; set to the connected project&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Sprint 10 — Desktop polish and cloud spike
&lt;/h2&gt;

&lt;p&gt;Native build verification (Windows/macOS), sidecar auto-start, memory search UI, and a cloud workspace API spike.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow along
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/operations/desktop.md" rel="noopener noreferrer"&gt;Desktop setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://meronq.pages.dev/blog/" rel="noopener noreferrer"&gt;Development blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/2026-07-06-sprint-9-closed-desktop-mvp/" rel="noopener noreferrer"&gt;meronq.pages.dev&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Meronq-dev/meronq/tree/main/docs/blog" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>tauri</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Sprint 8 closed: Productization</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Thu, 02 Jul 2026 00:26:26 +0000</pubDate>
      <link>https://dev.to/meronq/sprint-8-closed-productization-58if</link>
      <guid>https://dev.to/meronq/sprint-8-closed-productization-58if</guid>
      <description>&lt;p&gt;Sprint 8 is &lt;strong&gt;closed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal was to &lt;strong&gt;turn prototypes into a usable product direction&lt;/strong&gt; — desktop and cloud exploration, team workspace model, authentication, and billing — without over-building before validation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Sprint 8 delivered
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Desktop app exploration&lt;/strong&gt; — Tauri 2 direction, MVP scope, &lt;code&gt;apps/desktop&lt;/code&gt; stub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud backend exploration&lt;/strong&gt; — optional sync, org admin, API boundaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team workspace model&lt;/strong&gt; — Organization → Workspace → Project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication model&lt;/strong&gt; — local-only default, GitHub OAuth for teams, API keys for automation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Billing and pricing exploration&lt;/strong&gt; — Local / Team / Enterprise tiers (no payment integration)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Canonical decisions live in &lt;strong&gt;ADR-0008&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  New package: &lt;code&gt;@meronq/product&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Shared TypeScript types for product boundaries (exploration only — no cloud service yet):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Organization&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Billing and SSO boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Workspace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Team grouping for projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ProjectLink&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Repo connection inside a workspace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;WorkspaceMember&lt;/code&gt; / &lt;code&gt;WorkspaceRole&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Access control model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BillingTier&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;local&lt;/code&gt; · &lt;code&gt;team&lt;/code&gt; · &lt;code&gt;enterprise&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AuthMode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;local_only&lt;/code&gt; · &lt;code&gt;github_oauth&lt;/code&gt; · &lt;code&gt;api_key&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Delivery phases (ADR-0008)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Now     CLI + MCP     Power users, IDE integration
Next    Desktop       Project picker, handshake, memory viewer
Later   Cloud         Optional team sync and org admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meronq stays &lt;strong&gt;local-first&lt;/strong&gt;. Desktop is a shell over existing packages — not a parallel codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sprint 9 — Desktop MVP
&lt;/h2&gt;

&lt;p&gt;Tauri scaffold, project folder picker, handshake and memory stats UI, MCP lifecycle status.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow along
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/adr/ADR-0008-productization-and-delivery-model.md" rel="noopener noreferrer"&gt;ADR-0008 on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://meronq.pages.dev/blog/" rel="noopener noreferrer"&gt;Development blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/2026-07-04-sprint-8-closed-productization/" rel="noopener noreferrer"&gt;meronq.pages.dev&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Meronq-dev/meronq/tree/main/docs/blog" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>ai</category>
      <category>opensource</category>
      <category>engineering</category>
    </item>
    <item>
      <title>Sprint 7 closed: Engineering Agents</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Wed, 01 Jul 2026 23:14:37 +0000</pubDate>
      <link>https://dev.to/meronq/sprint-7-closed-engineering-agents-1d35</link>
      <guid>https://dev.to/meronq/sprint-7-closed-engineering-agents-1d35</guid>
      <description>&lt;p&gt;Sprint 7 is &lt;strong&gt;closed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal was &lt;strong&gt;specialized engineering agents&lt;/strong&gt; — architecture, code review, documentation, debugging, and onboarding — built on skills, memory, and MCP. Agents gather evidence and return structured briefings; they do not call external LLMs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Sprint 7 delivered
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@meronq/agents&lt;/code&gt;&lt;/strong&gt; — types, registry, context gathering, runner&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Five built-in agents&lt;/strong&gt; — &lt;code&gt;architecture&lt;/code&gt;, &lt;code&gt;code_review&lt;/code&gt;, &lt;code&gt;documentation&lt;/code&gt;, &lt;code&gt;debugging&lt;/code&gt;, &lt;code&gt;onboarding&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP + CLI&lt;/strong&gt; — &lt;code&gt;agent_list&lt;/code&gt;, &lt;code&gt;agent_run&lt;/code&gt;, &lt;code&gt;meronq agent run&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handshake&lt;/strong&gt; — &lt;code&gt;available_agents[]&lt;/code&gt; for discovery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Product MCP &lt;strong&gt;v1.2.0&lt;/strong&gt;. Local MCP &lt;strong&gt;v1.18.0&lt;/strong&gt;. &lt;code&gt;agent_run&lt;/code&gt; is read-only in v0.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;meronq agent list
meronq agent run onboarding
meronq agent run debugging &lt;span class="nt"&gt;--symptom&lt;/span&gt; &lt;span class="s2"&gt;"pnpm test fails"&lt;/span&gt;
meronq agent run code_review &lt;span class="nt"&gt;--pr&lt;/span&gt; 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How it fits
&lt;/h2&gt;

&lt;p&gt;Skills answer &lt;em&gt;how&lt;/em&gt; (build, test, ADR). Agents answer &lt;em&gt;when&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt;, with checklists, system guidance, and recommended skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sprint 8 — Productization
&lt;/h2&gt;

&lt;p&gt;Desktop app, cloud backend, team workspace, auth, and billing exploration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow along
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/architecture/agents.md" rel="noopener noreferrer"&gt;Agents architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://meronq.pages.dev/blog/" rel="noopener noreferrer"&gt;Development blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/2026-07-03-sprint-7-closed-engineering-agents/" rel="noopener noreferrer"&gt;meronq.pages.dev&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Meronq-dev/meronq/tree/main/docs/blog" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>ai</category>
      <category>opensource</category>
      <category>engineering</category>
    </item>
    <item>
      <title>Sprint 6 closed: Skills and Workflows</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Wed, 01 Jul 2026 22:39:12 +0000</pubDate>
      <link>https://dev.to/meronq/sprint-6-closed-skills-and-workflows-5b9p</link>
      <guid>https://dev.to/meronq/sprint-6-closed-skills-and-workflows-5b9p</guid>
      <description>&lt;p&gt;Sprint 6 is &lt;strong&gt;closed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal was to &lt;strong&gt;introduce reusable procedural engineering knowledge&lt;/strong&gt; — versioned Project Skills that offload deterministic workflows from LLM prompts into inspectable project code. See &lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/adr/" rel="noopener noreferrer"&gt;ADR-0006&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Sprint 6 delivered
&lt;/h2&gt;

&lt;p&gt;Every item on the &lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/roadmap.md" rel="noopener noreferrer"&gt;roadmap&lt;/a&gt; is checked off:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project Skill format&lt;/strong&gt; — JSON schema with inputs, steps, safety, and evidence rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;project.build&lt;/code&gt;&lt;/strong&gt; — run build via detected package manager&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;project.test&lt;/code&gt;&lt;/strong&gt; — run test suite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;adr.create&lt;/code&gt;&lt;/strong&gt; — write a new ADR from template (&lt;code&gt;title&lt;/code&gt;, optional &lt;code&gt;context&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow execution&lt;/strong&gt; — sequential steps with fail-fast and structured results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Local MCP is now &lt;strong&gt;v1.16.0&lt;/strong&gt; with &lt;code&gt;skill_list&lt;/code&gt; and &lt;code&gt;skill_run&lt;/code&gt;. Product MCP and CLI expose the same skill surface.&lt;/p&gt;




&lt;h2&gt;
  
  
  New package: &lt;code&gt;@meronq/skills&lt;/code&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;listSkills()&lt;/code&gt; / &lt;code&gt;getSkill()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Built-ins + &lt;code&gt;.meronq/skills/*.skill.json&lt;/code&gt; overrides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;runSkill()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Execute steps through injected &lt;code&gt;SkillExecutionContext&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;buildAdrDraft()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ADR numbering, slug, and markdown template&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Built-in safety cannot be weakened by project overrides. Custom skills in v0 support &lt;code&gt;create_adr&lt;/code&gt; steps only; command steps remain built-in exclusive.&lt;/p&gt;




&lt;h2&gt;
  
  
  Surfaces
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;meronq skill list
meronq skill run project.build
meronq skill run adr.create &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"My Decision"&lt;/span&gt; &lt;span class="nt"&gt;--context&lt;/span&gt; &lt;span class="s2"&gt;"Why we need this."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP tools: &lt;code&gt;skill_list&lt;/code&gt;, &lt;code&gt;skill_run&lt;/code&gt;. Handshake returns &lt;code&gt;available_skills[]&lt;/code&gt; so assistants discover workflows without guessing shell commands.&lt;/p&gt;

&lt;p&gt;Execution context lives in &lt;code&gt;@meronq/server-core&lt;/code&gt; (&lt;code&gt;createSkillContext&lt;/code&gt;) to avoid circular dependencies between skills and runtime.&lt;/p&gt;




&lt;h2&gt;
  
  
  Permission hardening
&lt;/h2&gt;

&lt;p&gt;Post-sprint review added &lt;strong&gt;&lt;code&gt;MERONQ_ALLOW_FILE_WRITE=true&lt;/code&gt;&lt;/strong&gt; for skills that write files (e.g. &lt;code&gt;adr.create&lt;/code&gt;) on the product MCP server. Runtime skills still require &lt;code&gt;MERONQ_ALLOW_RUNTIME=true&lt;/code&gt;. Local MCP and CLI run skills without those gates for dogfooding and local use.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pipeline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intent (skill name + inputs)
  → getSkill / safety checks
  → createSkillContext (package manager, paths, runCommand)
  → sequential step execution
  → SkillRunResult (steps, output, action id)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Evidence recording into CEM/memory is planned; the schema is ready in skill definitions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sprint 7 — Agents
&lt;/h2&gt;

&lt;p&gt;Sprint 7 goal: &lt;strong&gt;specialized engineering agents&lt;/strong&gt; — architecture, code review, documentation, debugging, and onboarding — built on skills, memory, and MCP.&lt;/p&gt;

&lt;p&gt;Procedures are now deterministic. Agents will decide &lt;em&gt;when&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt; to invoke them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Follow along
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/architecture/skills.md" rel="noopener noreferrer"&gt;Skills architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/roadmap.md" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://meronq.pages.dev/blog/" rel="noopener noreferrer"&gt;Development blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Meronq-dev/meronq" rel="noopener noreferrer"&gt;Meronq-dev/meronq&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sprint 5 made Meronq portable. Sprint 6 makes engineering procedures reusable across AI clients.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/2026-07-02-sprint-6-closed-skills-and-workflows/" rel="noopener noreferrer"&gt;meronq.pages.dev&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Meronq-dev/meronq/tree/main/docs/blog" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>ai</category>
      <category>opensource</category>
      <category>engineering</category>
    </item>
    <item>
      <title>Sprint 5 closed: MCP Server</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Wed, 01 Jul 2026 22:38:25 +0000</pubDate>
      <link>https://dev.to/meronq/sprint-5-closed-mcp-server-3b9b</link>
      <guid>https://dev.to/meronq/sprint-5-closed-mcp-server-3b9b</guid>
      <description>&lt;p&gt;Sprint 5 is &lt;strong&gt;closed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal was to &lt;strong&gt;expose Meronq capabilities through MCP&lt;/strong&gt; so AI assistants can use Meronq as a product tool layer — not only when developing Meronq itself. GitHub data and local memory from earlier sprints now ship through a dedicated product server with an explicit permission model.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Sprint 5 delivered
&lt;/h2&gt;

&lt;p&gt;Every item on the &lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/roadmap.md" rel="noopener noreferrer"&gt;roadmap&lt;/a&gt; is checked off:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP tool surface&lt;/strong&gt; — handshake, scan, memory, GitHub, runtime, and git read tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product server&lt;/strong&gt; — &lt;code&gt;apps/mcp-server&lt;/code&gt; v1.1.0 for any Meronq-enabled repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared server core&lt;/strong&gt; — &lt;code&gt;@meronq/server-core&lt;/code&gt; (handshake, permissions, runtime, CEM sync)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory search&lt;/strong&gt; — &lt;code&gt;memory_search&lt;/code&gt; and &lt;code&gt;memory_stats&lt;/code&gt; over SQLite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety model&lt;/strong&gt; — runtime and network gates via environment variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Local MCP refactored onto &lt;code&gt;@meronq/server-core&lt;/code&gt; (v1.15.0) while keeping dogfooding tools: git write, social distribution, and extended allowlists.&lt;/p&gt;




&lt;h2&gt;
  
  
  Product vs local MCP
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;Use when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apps/mcp-server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Connecting assistants to &lt;strong&gt;your&lt;/strong&gt; project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apps/local-mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Developing Meronq itself (social, git write, dogfooding)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Point either server at a repo with &lt;code&gt;MERONQ_PROJECT_PATH&lt;/code&gt; (or &lt;code&gt;MERONQ_PATH&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  New package: &lt;code&gt;@meronq/server-core&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Shared logic extracted from local MCP:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;buildHandshake()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Onboarding payload with CEM, memory, GitHub, sprint context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;buildAndSyncCem()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scan + optional GitHub fetch → SQLite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ProjectRuntime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Package manager and git command execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;permissions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;MERONQ_ALLOW_RUNTIME&lt;/code&gt;, &lt;code&gt;MERONQ_ALLOW_NETWORK&lt;/code&gt;, git write&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Product MCP exposes &lt;strong&gt;14 tools&lt;/strong&gt; including &lt;code&gt;memory_search&lt;/code&gt;, &lt;code&gt;github_sync&lt;/code&gt;, &lt;code&gt;project_build&lt;/code&gt;, and allowlisted commands. Git write stays off the product surface by design.&lt;/p&gt;




&lt;h2&gt;
  
  
  Permission model
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MERONQ_ALLOW_RUNTIME=true   → build, test, install/dev allowlist
MERONQ_ALLOW_NETWORK=true   → GitHub API refresh (or set GITHUB_TOKEN)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read-only git tools (&lt;code&gt;git_status&lt;/code&gt;, &lt;code&gt;git_diff&lt;/code&gt;) work without extra flags. See &lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/operations/mcp-server.md" rel="noopener noreferrer"&gt;MCP server guide&lt;/a&gt; for Cursor configuration.&lt;/p&gt;




&lt;h2&gt;
  
  
  Memory search
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;memory_search&lt;/code&gt; queries entities in &lt;code&gt;.meronq/local/memory.db&lt;/code&gt; with optional type filters. Access events are recorded when results are returned — aligned with &lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/adr/" rel="noopener noreferrer"&gt;ADR-0005&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# MCP: memory_search { "query": "github", "limit": 10 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Sprint 6 — Skills and Workflows
&lt;/h2&gt;

&lt;p&gt;Sprint 6 goal: &lt;strong&gt;introduce reusable procedural engineering knowledge&lt;/strong&gt; — &lt;code&gt;project.build&lt;/code&gt;, &lt;code&gt;project.test&lt;/code&gt;, and &lt;code&gt;adr.create&lt;/code&gt; as versioned Project Skills callable from MCP and CLI.&lt;/p&gt;

&lt;p&gt;The product MCP surface is live; Sprint 6 adds deterministic workflows on top of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Follow along
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/roadmap.md" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt; — sprint plan&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/operations/mcp-server.md" rel="noopener noreferrer"&gt;MCP server setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://meronq.pages.dev/blog/" rel="noopener noreferrer"&gt;Development blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Meronq-dev/meronq" rel="noopener noreferrer"&gt;Meronq-dev/meronq&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sprint 4 connected GitHub. Sprint 5 makes project intelligence portable. Sprint 6 teaches assistants &lt;em&gt;how&lt;/em&gt; to run repeatable engineering work.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/2026-07-02-sprint-5-closed-mcp-server/" rel="noopener noreferrer"&gt;meronq.pages.dev&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Meronq-dev/meronq/tree/main/docs/blog" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>ai</category>
      <category>opensource</category>
      <category>engineering</category>
    </item>
    <item>
      <title>Sprint 4 closed: GitHub Integration</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Wed, 01 Jul 2026 20:41:01 +0000</pubDate>
      <link>https://dev.to/meronq/sprint-4-closed-github-integration-5be</link>
      <guid>https://dev.to/meronq/sprint-4-closed-github-integration-5be</guid>
      <description>&lt;p&gt;Sprint 4 is &lt;strong&gt;closed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal was to &lt;strong&gt;connect Meronq to GitHub as the first external engineering system&lt;/strong&gt; — reading metadata, issues, and pull requests, then translating that data into CEM and local memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Sprint 4 delivered
&lt;/h2&gt;

&lt;p&gt;Every item on the &lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/roadmap.md" rel="noopener noreferrer"&gt;roadmap&lt;/a&gt; is checked off:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository metadata&lt;/strong&gt; — stars, branch, description&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issues and PRs&lt;/strong&gt; — GitHub REST API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CEM translation&lt;/strong&gt; — &lt;code&gt;issue:owner/repo#N&lt;/code&gt;, &lt;code&gt;pull_request:owner/repo#N&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summaries&lt;/strong&gt; — issue and PR text summaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Doc draft&lt;/strong&gt; — markdown from git log + GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Local MCP &lt;strong&gt;v1.13.0&lt;/strong&gt; — &lt;code&gt;github_sync&lt;/code&gt;, &lt;code&gt;github_status&lt;/code&gt;, &lt;code&gt;github_summarize&lt;/code&gt;, &lt;code&gt;github_doc_draft&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  New package: &lt;code&gt;@meronq/github&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scanProject → CEM → fetchGitHubSnapshot → appendGithubToCem → SQLite memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Auth: &lt;strong&gt;&lt;code&gt;GITHUB_TOKEN&lt;/code&gt;&lt;/strong&gt; (PAT). Cache: &lt;code&gt;.meronq/local/github-snapshot.json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;meronq github &lt;span class="nb"&gt;sync
&lt;/span&gt;meronq github status
meronq github summarize issue 3
meronq github doc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sprint 5 — MCP Server
&lt;/h2&gt;

&lt;p&gt;Expose Meronq as a product MCP surface with handshake, memory search, and permissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow along
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/roadmap.md" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Meronq-dev/meronq/blob/main/docs/operations/github.md" rel="noopener noreferrer"&gt;GitHub setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://meronq.pages.dev/blog/" rel="noopener noreferrer"&gt;Development blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;







&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/2026-07-01-sprint-4-closed-github-integration/" rel="noopener noreferrer"&gt;meronq.pages.dev&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Meronq-dev/meronq/tree/main/docs/blog" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>ai</category>
      <category>opensource</category>
      <category>engineering</category>
    </item>
  </channel>
</rss>
