<?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 shipped an installer that could not find its own engine</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Thu, 10 Sep 2026 15:57:57 +0000</pubDate>
      <link>https://dev.to/meronq/we-shipped-an-installer-that-could-not-find-its-own-engine-1d6</link>
      <guid>https://dev.to/meronq/we-shipped-an-installer-that-could-not-find-its-own-engine-1d6</guid>
      <description>&lt;p&gt;We gave someone the Meronq Desktop &lt;strong&gt;0.1.6&lt;/strong&gt; installer for their own repo. Connect never ran. The error told them to run &lt;code&gt;pnpm --filter @meronq/desktop fetch:node&lt;/code&gt; — a command that only exists inside the Meronq monorepo.&lt;/p&gt;

&lt;p&gt;Tauri &lt;code&gt;externalBin&lt;/code&gt; already copies &lt;code&gt;meronq-node&lt;/code&gt; next to the exe. The Rust host never looked there. It used &lt;code&gt;CARGO_MANIFEST_DIR&lt;/code&gt;, which is baked in at compile time. On the build PC the binaries folder still exists, so dogfood lied. On &lt;code&gt;%LOCALAPPDATA%\Meronq Desktop\&lt;/code&gt; it does not. The watchdog retried the miss five times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0.1.7&lt;/strong&gt; searches the exe dir and resource dir first. React chrome (sidebar, Assistants, map island) is in the tag; the reason to cut today is Connect on a machine that is not the build machine.&lt;/p&gt;

&lt;p&gt;Canonical write-up: &lt;a href="https://meronq.pages.dev/blog/2026-09-10-desktop-0-1-7-installer-sidecar/" rel="noopener noreferrer"&gt;https://meronq.pages.dev/blog/2026-09-10-desktop-0-1-7-installer-sidecar/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Windows installer: &lt;a href="https://pub-f4e9aaa767d24ebab1fd7eda766d6a7c.r2.dev/desktop/stable/latest/windows-x86_64-setup.exe" rel="noopener noreferrer"&gt;https://pub-f4e9aaa767d24ebab1fd7eda766d6a7c.r2.dev/desktop/stable/latest/windows-x86_64-setup.exe&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>opensource</category>
      <category>rust</category>
      <category>windows</category>
    </item>
    <item>
      <title>We tagged a Desktop release and immediately broke Windows Check for updates</title>
      <dc:creator>Meronq</dc:creator>
      <pubDate>Thu, 10 Sep 2026 11:17:29 +0000</pubDate>
      <link>https://dev.to/meronq/we-tagged-a-desktop-release-and-immediately-broke-windows-check-for-updates-26j6</link>
      <guid>https://dev.to/meronq/we-tagged-a-desktop-release-and-immediately-broke-windows-check-for-updates-26j6</guid>
      <description>&lt;p&gt;We tagged Desktop 0.1.6, Codemagic published a signed macOS build, and Windows Check for updates died.&lt;/p&gt;

&lt;p&gt;Tauri 2 looks up &lt;code&gt;windows-x86_64-nsis&lt;/code&gt; first, then &lt;code&gt;windows-x86_64&lt;/code&gt;. A darwin-only channel &lt;code&gt;latest.json&lt;/code&gt; has neither:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;None of the fallback platforms ["windows-x86_64-nsis", "windows-x86_64"] were found&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The tempting fix — copy yesterday's Windows bits into today's &lt;code&gt;version&lt;/code&gt; field — would have been worse. Existing Windows installs would loop on a same-version "update".&lt;/p&gt;

&lt;h2&gt;
  
  
  Same-version merge, not a franken-manifest
&lt;/h2&gt;

&lt;p&gt;Merge platforms only when the version matches. Alias &lt;code&gt;windows-x86_64&lt;/code&gt; to &lt;code&gt;windows-x86_64-nsis&lt;/code&gt;. Keep a versioned &lt;code&gt;desktop/stable/{version}/latest.json&lt;/code&gt; so the second OS can catch up even if the channel file is left alone. Refuse to replace the channel when a new version would drop Windows or darwin.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;desktop_cdn_status&lt;/code&gt; on meronq-local is the probe we wished we had before the first Windows user hit Check for updates. The website &lt;a href="https://meronq.pages.dev/download/" rel="noopener noreferrer"&gt;/download/&lt;/a&gt; is static aliases into R2 — a Desktop version bump does not need a Pages rebuild.&lt;/p&gt;

&lt;p&gt;Windows-first when you can. If Codemagic already wrote darwin-only, a Windows &lt;code&gt;pnpm desktop:release&lt;/code&gt; of the same version restores the missing platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else is in the tag
&lt;/h2&gt;

&lt;p&gt;The sidecar now records &lt;code&gt;response_bytes&lt;/code&gt; the same way MCP tools do — 0.1.5 capped MCP answers; Desktop access rows still had no size. &lt;code&gt;skill_propose&lt;/code&gt; / &lt;code&gt;skill_apply&lt;/code&gt; sit next to JSON Project Skills (custom &lt;code&gt;kind: command&lt;/code&gt; stays locked in v0). The old social publishing module is now &lt;strong&gt;deploy&lt;/strong&gt;: Codemagic plus Discord / Telegram / dev.to / LinkedIn, on meronq-local only.&lt;/p&gt;

&lt;p&gt;This is a Desktop release, not a sprint close. Sprint 24's UI shell did not ship.&lt;/p&gt;

&lt;p&gt;Windows and macOS both update in place.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Read the full post on &lt;a href="https://meronq.pages.dev/blog/2026-09-10-desktop-0-1-6-signed-updates-both-oses/" 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-09-10-desktop-0-1-6-signed-updates-both-oses.md" 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>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>
  </channel>
</rss>
