@adhd/backlog 0.1.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +80 -47
  2. package/README.md +332 -81
  3. package/api.d.ts +146 -0
  4. package/cli.d.ts +45 -18
  5. package/env.d.ts +23 -3
  6. package/envelope.d.ts +163 -0
  7. package/index.d.ts +11 -10
  8. package/index.js +531 -173
  9. package/index.mjs +30039 -15879
  10. package/install-skill.d.ts +23 -0
  11. package/package.json +50 -15
  12. package/query/card.d.ts +31 -0
  13. package/query/get.d.ts +11 -0
  14. package/query/index.d.ts +67 -0
  15. package/query/markdown.d.ts +11 -0
  16. package/query/query.d.ts +131 -0
  17. package/query/resolve.d.ts +123 -0
  18. package/query/types.d.ts +450 -0
  19. package/query/views/registry.d.ts +43 -0
  20. package/query/views/semantic.d.ts +101 -0
  21. package/query/views/stats.d.ts +109 -0
  22. package/search-shortcut.d.ts +79 -0
  23. package/serve.d.ts +18 -0
  24. package/server.d.ts +139 -4
  25. package/skill/SKILL.md +619 -138
  26. package/store/graph-backlog-store.d.ts +80 -17
  27. package/store/immediate-retry.d.ts +24 -13
  28. package/store/type-policy.d.ts +4 -0
  29. package/store/vocabulary-guard.d.ts +52 -0
  30. package/write/audit.d.ts +36 -0
  31. package/write/bootstrap.d.ts +123 -0
  32. package/write/catalog.d.ts +351 -0
  33. package/write/claim-lease.d.ts +21 -0
  34. package/write/claim.d.ts +80 -0
  35. package/write/create-issue.d.ts +250 -0
  36. package/write/delete.d.ts +39 -0
  37. package/write/embed-drain.d.ts +68 -0
  38. package/write/embedding-observer.d.ts +80 -0
  39. package/write/errors.d.ts +303 -0
  40. package/write/issue-status.d.ts +10 -0
  41. package/write/move.d.ts +70 -0
  42. package/write/relate.d.ts +52 -0
  43. package/write/transition.d.ts +60 -0
  44. package/write/tx.d.ts +344 -0
  45. package/write/update.d.ts +81 -0
  46. package/client.d.ts +0 -174
  47. package/markdown.d.ts +0 -75
  48. package/migration-admin.d.ts +0 -26
  49. package/model.d.ts +0 -437
  50. package/store/audit-log.d.ts +0 -16
  51. package/store/claim.d.ts +0 -24
  52. package/store/crud.d.ts +0 -62
  53. package/store/ids.d.ts +0 -24
  54. package/store/lifecycle.d.ts +0 -36
  55. package/store/mapping.d.ts +0 -101
  56. package/store/mutate-metadata.d.ts +0 -8
  57. package/store/query.d.ts +0 -68
  58. package/store/repo-migration.d.ts +0 -51
  59. package/store/serve-lock.d.ts +0 -42
  60. package/store/structure.d.ts +0 -66
package/CHANGELOG.md CHANGED
@@ -1,5 +1,65 @@
1
- ## 0.1.9 (2026-08-20)
1
+ ## 1.0.0 (Unreleased)
2
+
3
+ The first stable release. `@adhd/backlog` is a self-contained backlog system: one store, mounted live to a CLI, an MCP server, and an HTTP surface with zero duplicated logic across hosts. Every operation returns an outcome envelope — `{ok:true, data}` or `{ok:false, error:{code,message,details}}` — so a caller never has to guess whether a call succeeded from a thrown exception.
4
+
5
+ ### 🚀 Features
6
+
7
+ - **backlog:** the application layer settles on 14 verbs — `get`, `query`, `lookup`, `create`, `update`, `transition`, `claim`, `relate`, `move`, `upsertProject`, `upsertComponent`, `upsertLocation`, `rmLocation`, `delete` — each mounted identically to CLI, MCP, and HTTP.
8
+ - **backlog:** `create` takes a flat `{ title, body, project, by }` input plus optional `component`, `kind`, `status`, `priority`, `citations`, `author`, `assignee`, and `duplicateAction` (`'abort' | 'force' | 'comment'`, default `'abort'`); a resolved `project` is required — `create` never mints one.
9
+ - **backlog:** `query` accepts a natural-language `text` that routes to semantic or keyword search, and pages results by `limit`/`after` with `hasMore`/`nextCursor`.
10
+ - **backlog:** on-write embeddings, with an audit row per write, back semantic search.
11
+ - **backlog:** citations are persisted on every item, and repo moves apply their rename plan in two passes so a rename can't cascade mid-write.
12
+ - **backlog:** `buildBacklogEnv` now accepts an explicit `namespace` option (`BuildBacklogEnvOptions.namespace`, defaulting to `'production'`), threaded through the CLI (`RunBacklogCliOpts`), `serve` (`RunServeCommandOpts`), and the server library (`StartOpts`) down to `EnvironmentOptions.namespace` — mirroring how `scope` already resolves via an explicit-parameter-first cascade. `backlogEnvironmentSpec.namespaces` declares three values, `['production', 'test', 'sandbox']` (added, `'production'` stays first — every existing caller that omits `namespace` is unaffected). Deliberately no `ADHD_BACKLOG_NAMESPACE` env var: namespace selection is explicit-parameter-only, so it can never be silently overridden by an ambient shell variable.
13
+ - **backlog:** a new CLI flag, `--namespace <value>` (SPEC.md §5c), recognized anywhere in argv (like `--help`), selects which declared namespace an invocation resolves under — `production` (default), `test` (a persisted, non-ephemeral store), or `sandbox`. `--namespace sandbox` layers ephemeral-root-minting on top of namespace selection: it mints a fresh throwaway `adhdRoot`, and writes a REAL `config.yaml` there with `embedding.enabled: false` on every invocation, before any config file layer is ever read (D8) — an isolated invocation's embeddings are now off DELIBERATELY, never as an accident of an empty directory (a stray pre-existing `config.yaml` at that path is overwritten, not silently honored). An unrecognized `--namespace` value is rejected before dispatch with the same `invalid_argument` envelope every other CLI failure uses, naming all three valid values and suggesting the nearest match on a near-miss typo. `sandbox-path`'s JSON payload reports `{adhdRoot, namespace, dbPath, embeddingEnabled}`.
14
+
15
+ ### 🩹 Fixes
16
+
17
+ - **backlog:** the cutover ETL's component mint (`tools/etl/catalog-upsert.ts`'s `upsertComponentTx`) now writes the `owns_project` edge back to its project in the same transaction, matching real `upsertComponent`. Previously a minted component had no incoming `owns_project` edge, leaving it (and every issue under it) unreachable from a project→component→issue two-hop walk — found and root-caused during the cutover tooling's own proving run (SPEC.md §7a): 108 of 145 target components affected, 502 issues unreachable, 0 issues incorrectly written (status/kind/priority/citations/notes all matched).
18
+ - **backlog:** the ETL's hand-rolled `upsertProjectTx`/`upsertComponentTx` (`tools/etl/catalog-upsert.ts`) — a duplicate reimplementation of the real registry verbs' find-then-create logic, predating those verbs' existence — are gone. `src/write/catalog.ts`'s `upsertProject`/`upsertComponent` are now split into a transaction-PARTICIPANT core (`upsertProjectTx`/`upsertComponentTx`, taking the caller's own open `tx`) and a thin `executeWriteTransaction`-opening public wrapper, the same shape `claim.ts`/`transition.ts` already use; the ETL's `catalog-upsert.ts` is now a thin adapter that calls the real `*Tx` cores (re-fetching `rowid` via `getNodeByUidTx`, since neither outcome type carries it) instead of hand-rolling the SQL. This closes the exact duplication class that caused the `owns_project`-edge bug above — a future divergence between the two registry verbs and the ETL's own copy is no longer possible, because there is only one copy. Re-proven: an 1788-item re-run against the current corpus into a fresh target reproduces all four parity comparisons clean, including the `owns_project` reachability walk.
19
+ - **backlog:** editing an issue's body no longer discards the rest of its graph. The supersede path carried exactly five edges onto the successor — the set the issue CARD reads — so a single body edit silently detached the issue's blockers, dependencies, notes, citations, transitions and entire audit trail. Every remaining edge is now carried forward in both directions, since an issue is the source of some relations and the target of others.
20
+ - **backlog:** a burndown no longer inflates after an edit. The open-curve view counted every row alive at a sampled instant, so one logical issue appeared twice after one edit and three times after two; it now resolves each identity chain to its head per instant.
21
+ - **backlog:** a ranked or semantic result no longer returns an issue alongside its own stale copy. The relevance path hands its filter to a search backend whose contract cannot express the current-row predicate, so superseded rows stayed rankable — and outranked the live row, since their text is what the query resembled. Those rows are now dropped from the ranked page, with over-fetch so the page stays full.
22
+ - **backlog:** the outcome envelope and its error codes now live in one module, mapped by error class rather than by retry bucket.
23
+ - **backlog:** id collisions on concurrent `create` are hardened, alongside repo-lookup UX and install/skill packaging.
24
+ - **backlog:** superseded ids are rejected on `claim`/`relate`/`move`/`delete` instead of silently operating on a stale record.
25
+ - **backlog:** avoid opening the graph store for status-only CLI paths (`--help`, no-args) (DEBT-BACKLOG-CLI-EAGER-STORE-OPEN-001, DEBT-BACKLOG-CLI-STORE-OPEN-001).
26
+ - **backlog:** `--namespace sandbox` routes through an explicit `namespace: 'sandbox'` parameter, on top of (never instead of) its throwaway `adhdRoot` swap, closing `BUG-BACKLOG-SANDBOX-SILENT-BYPASS-001`'s bug class structurally — an explicit function parameter cannot be silently overridden by an ambient `ADHD_ROOT` the way a `process.env` read previously could. Also fixes `BUG-BACKLOG-SANDBOX-SERVE-TELEMETRY-001`, found while proving the sandbox flag against `serve`: `runServeCommand`'s own telemetry re-init (BUG-014, re-stamping the process `role:'live-service'` before request handling starts) carried no `logDir` override at all, silently undoing the bin-entry guard's own sandbox-telemetry redirect the moment a long-lived `--namespace sandbox serve` session re-stamped its role — a sandboxed `serve` invocation's telemetry ended up written to the real, HOME-anchored `~/.adhd/sox-ecosystem/backlog/logs` after all. `runServeCommand` now mints its own sandbox log dir the same way `index.ts`'s bin-entry guard does, keyed off `opts.namespace === 'sandbox'`.
27
+ - **backlog:** a failed audit write must not fail an already-committed claim.
28
+ - **backlog:** a live claim now actually protects an issue. `transition` previously ignored `claimedBy` entirely, so any agent could change an issue's status out from under a claim someone else was actively holding — `claim` was advisory-only. `transition` now blocks with the same `ClaimHeldError`/`conflict` a competing `claim` call would get, unless the claim is stale or held by the same agent, matching `claim`'s own staleness rule (the shared staleness logic moved into `claim-lease.ts` so both verbs stay in sync).
29
+ - **backlog:** `claim` no longer accepts a claim on an already-closed issue. There was nothing to lease on a terminal issue, so this now rejects with a new `IssueTerminalError` (`precondition_failed`) — release/renew are unaffected, since cleaning up a claim on an issue that closed out from under you must still succeed.
30
+ - **backlog:** a per-verb `--help` (e.g. `backlog create --help`) now points at `batch action` when it exists as a bulk alternative — real usage testing showed agents doing many one-at-a-time calls in a row without ever discovering the batch primitive, because per-verb help had no cross-reference to it.
31
+ - **backlog:** `query --input '{"filter":{"kind":"typo"}}'` (or `status`/`priority`) now rejects with a `BacklogValidationError` naming the unresolved value and suggesting the nearest existing catalog name, instead of silently returning `{total:0, items:[]}` indistinguishable from filtering by a real, sparse (currently zero-issue) value. `kind`/`status`/`priority` are validated against the catalog's own live rows — the real, dynamic value space those open vocabularies have (DATA_MODEL.md §0.2/§2) — never a fixed enum, so a legitimate sparse filter still returns cleanly empty.
32
+ - **backlog:** `query`'s `format:'markdown'` is now implemented (`src/query/markdown.ts`) instead of unconditionally rejecting as "not implemented in this slice." Every item-list view (`list`/`ready`/`stale`/`similar`) supports it; `graph`/`order`/`overlap`/`projects`/`components`/`locations` reject it with a clear `InvalidArgumentError` naming why (no item-list shape to render).
33
+ - **backlog:** `query --help` and SPEC.md now document that `view:"similar"` requires `filter.anchor` OR `filter.semantic` — previously a caller had to hit the runtime error to discover this.
34
+ - **backlog:** `backlog get --help` no longer collapses its mounted `uid`-vs-`registry` union input to the useless `{ input: union }`. The shared apigen `--help`/tool-description generator (`describeParams` in `@adhd/apigen-engine-runtime`) now expands a top-level union's member shapes (`{ uid: string, fields?: ... } | { registry: ..., name: ..., filter?: ... }`) and renders an enum's actual allowed values (`view?: 'list'|'similar'|'projects'|'components'|'locations'|...`) instead of the bare, contentless words `union`/`enum` — this fixes every apigen-mounted CLI/MCP tool's `--help`/description across the monorepo, not just `backlog`.
35
+ - **backlog:** `query --help` and `skill/SKILL.md` now surface `view:"projects"`/`"components"`/`"locations"` (the project/component/location registry LIST views) — previously undiscoverable short of reading source, since `view?`'s allowed values rendered as the bare word `enum`.
36
+ - **backlog (BUG-BACKLOG-QUERY-REGISTRY-VIEW-STRIPPED-001, root-caused while verifying the above against the real built binary — the prior claim that these three views "already work correctly" was wrong):** `query --input '{"view":"projects"}'` (and `"components"`/`"locations"`) silently stripped every field but `uid` over EVERY transport (CLI/MCP/HTTP) — `{"items":[{"uid":"..."}]}`, with `name`/`path`/`projectUid`/`locType`/`value`/`componentUid` all gone. Root cause was one level up the stack, in `@adhd/apigen-base-logical`'s shared response encoder: `IIssueQueryResult`'s `view`-tagged members declare no `discriminator`, and several branches (`ready`/`stale`/`similar`/`projects`/`components`/`locations`) share identical top-level property names (`view`, `items`), so the encoder's structural tie-break silently re-encoded every one of them through whichever branch was declared earliest (an `items: IIssueCard[]` shape) — correct by coincidence for `ready`/`stale`/`similar` (their items genuinely are `IIssueCard`s) and silently wrong for the three registry views. Fixed at the root in `apigen-base-logical`'s `pickUnionBranch` (an implicit literal-discriminator fallback, before structural scoring) — this fixes every apigen-mounted verb across the monorepo whose response union has this shape, not just `backlog query`.
37
+ - **backlog:** the `[inv:singleton]` PID-file writer lock added for `serve` in 0.1.8 (BUG-020) is REMOVED. A deeper read of the currently-pinned `@adhd/sox-store-adapter@0.9.1` found the lock guards a path real `backlog` code cannot reach (the adapter's WAL-checkpoint strategy is hardcoded `'gated'` in production; the adapter's own 1,180-trial internal safety experiment found zero crashes through that gated path) and that the original incident traced to a separate, since-fixed adapter bug (`BUG-STOREADAPTER-COORDINATION-PATH-ASYMMETRY` — a non-canonicalized quiescence check, not a concurrency hazard requiring application-level mutual exclusion). Re-verified empirically: three real two-process sustained-concurrent-write trials via the actual built MCP server, zero failures, exact persisted counts every trial (see STATE.md A17). `backlog serve` now supports any number of concurrent instances against the same store with no coordination between them, matching every other write path in this package (SPEC.md §3/§4's parallel-process-enabled design) — a hard requirement for this rewrite. Durable proof: `src/serve.singleton.spec.ts`.
38
+
39
+ ### 📖 Documentation & tests
40
+
41
+ - **backlog:** `SPEC.md` describes one surface and nothing else. The data-load section and every reference to it are gone, along with the superseded interface and graph-model documents the package's own source still cited.
42
+ - **backlog:** two acceptance criteria were corrected against the shipped design rather than left contradicting it — uniqueness now states the edge-scoped resolve-then-create the write layer performs (it never rejected a duplicate name), and the concurrency gate now names a negative control that is deterministically reachable.
43
+ - **backlog:** the audit contract is proven end to end: `actor`, `action` and a **recomputed** `sha` are read off the raw audit node for all six write verbs.
44
+ - **backlog:** the banned-terms gate now scans the package's own documents, not just `src/`. Scoping it to source is how a whole stale spec section survived an earlier sweep.
45
+
46
+ ### ❤️ Thank You
47
+
48
+ - pseudosky
49
+
50
+ ## 0.1.10 (2026-08-20)
2
51
 
52
+ ### 🩹 Fixes
53
+
54
+ - **backlog:** don't open the graph store for status-only CLI paths (DEBT-BACKLOG-CLI-STORE-OPEN-001)
55
+
56
+ - **backlog:** a failed audit write must not fail an already-committed claim
57
+
58
+ ### ❤️ Thank You
59
+
60
+ - pseudosky
61
+
62
+ ## 0.1.9 (2026-08-20)
3
63
 
4
64
  ### 🩹 Fixes
5
65
 
@@ -9,159 +69,135 @@
9
69
 
10
70
  - **backlog:** don't open the graph store for --help/version (DEBT-BACKLOG-CLI-EAGER-STORE-OPEN-001)
11
71
 
12
-
13
- ### ❤️ Thank You
72
+ ### ❤️ Thank You
14
73
 
15
74
  - pseudosky
16
75
 
17
76
  ## 0.1.8 (2026-08-19)
18
77
 
19
-
20
78
  ### 🩹 Fixes
21
79
 
22
80
  - **backlog:** singleton writer lock for `serve` — two concurrent servers against one store corrupted the db (BUG-020). O_EXCL PID-file lock keyed on the canonical realpath'd db path, held from before the store opens until after it is fully closed, so a second `serve` during shutdown drain is refused rather than admitted. Dead holders reclaimed; refusal names the holder pid and lock path.
23
81
  - **backlog:** consume `@adhd/sox-store-adapter` 0.7.0. The dependency was pinned `^0.5.8`, and a caret on a 0.x pins the MINOR — so it could never resolve past 0.6.0 and none of the WAL/durability work reached this store. Brings the adaptive idle-flush debounce (BL-590), baseline-relative WAL cap (BL-587), and verified busy-error classification in the wal-cap backstop (BUG-019).
24
82
 
25
-
26
- ### ❤️ Thank You
83
+ ### ❤️ Thank You
27
84
 
28
85
  - pseudosky
29
86
 
30
87
  ## 0.1.7 (2026-08-14)
31
88
 
32
-
33
89
  ### 🩹 Fixes
34
90
 
35
- - **backlog:** persist citations, atomic repo migration, signal cleanup
36
-
91
+ - **backlog:** persist citations, atomic repo moves, signal cleanup
37
92
 
38
- ### ❤️ Thank You
93
+ ### ❤️ Thank You
39
94
 
40
95
  - pseudosky
41
96
 
42
97
  ## 0.1.6 (2026-08-12)
43
98
 
44
-
45
99
  ### 🩹 Fixes
46
100
 
47
101
  - **backlog:** honor ADHD_BACKLOG_DATABASE_PATH env override (BUG-002)
48
102
 
49
-
50
- ### ❤️ Thank You
103
+ ### ❤️ Thank You
51
104
 
52
105
  - pseudosky
53
106
 
54
107
  ## 0.1.5 (2026-08-12)
55
108
 
56
-
57
109
  ### 🚀 Features
58
110
 
59
- - **backlog:** swap raw better-sqlite3 handle for sox store adapter (F-01)
111
+ - **backlog:** swap the raw embedded-database handle for the sox store adapter (F-01)
60
112
 
61
- - **backlog:** F-01 turso adapter migration (resolves blockers)
113
+ - **backlog:** F-01 adopt the turso store adapter (resolves blockers)
62
114
 
63
115
  - **backlog:** convert store to turso store-adapter (F-01+F-02)
64
116
 
65
-
66
117
  ### 🩹 Fixes
67
118
 
68
119
  - **backlog:** dedupe-scan weak FTS match + required-field completeness
69
120
 
70
121
  - **apigen-cli:** restore 2768 files mass-deleted by 0117eb22 (BUG-APIGEN-052)
71
122
 
72
- - **backlog:** remove better-sqlite3 — turso-native concurrency fixtures (substrate invariant)
123
+ - **backlog:** drop the embedded-database dependency — turso-native concurrency fixtures (substrate invariant)
73
124
 
74
125
  - **backlog:** best-effort store close in finally paths (close error must not mask command outcome)
75
126
 
76
127
  - **backlog:** init telemetry at CLI composition root (stop silent record drop, role:'cli')
77
128
 
78
-
79
- ### ❤️ Thank You
129
+ ### ❤️ Thank You
80
130
 
81
131
  - parity-harness-self-test
82
132
  - pseudosky
83
133
 
84
134
  ## 0.1.3 (2026-07-30)
85
135
 
86
-
87
136
  ### 🚀 Features
88
137
 
89
138
  - **apigen:** generic batch/bulk fan-out operations (FEAT-APIGEN-BULK-OPS-001)
90
139
 
91
-
92
140
  ### 🩹 Fixes
93
141
 
94
- - **backlog:** humanId collision hardening + repo-lookup UX + install/skill packaging
142
+ - **backlog:** id collision hardening + repo-lookup UX + install/skill packaging
95
143
 
96
-
97
- ### ❤️ Thank You
144
+ ### ❤️ Thank You
98
145
 
99
146
  - pseudosky
100
147
 
101
148
  ## 0.1.2 (2026-07-27)
102
149
 
103
-
104
150
  ### 🚀 Features
105
151
 
106
152
  - **backlog:** add `backlog install` command — installs the skill AND registers the MCP server into host configs (Claude Code `~/.claude.json` + project `.mcp.json`; opencode `~/.config/opencode/opencode.json` + project) idempotently, at user/project scopes; `install-skill` retained as an alias.
107
153
 
108
-
109
154
  ### 🩹 Fixes
110
155
 
111
156
  - **backlog:** ship `skill/SKILL.md` into `dist/` via a vite `writeBundle` copy plugin (project.json `build.options.assets` is a no-op under `@nx/vite:build`); fix `install-skill` packaged-skill path escaping to `@adhd/skill` in the published rebased layout (BUG-013, BUG-012 class). Harden the inferred `assets` nx target with explicit `outputs` so a `build` cache-hit can't wipe copied assets.
112
157
 
113
-
114
158
  ## 0.1.1 (2026-07-27)
115
159
 
116
-
117
160
  ### 🩹 Fixes
118
161
 
119
162
  - **backlog:** fix published tarball crashing at mount — `backlogDistDir()` resolved `client.d.ts` via `import.meta.url + '../dist'`, which escaped to the nonexistent `node_modules/@adhd/dist` once `dist-manifest` rebased the package to its root; now probes for the sibling `client.d.ts` (BUG-012). Adds `server.published-layout.spec.ts` reproducing the published rebased-to-root layout.
120
163
 
121
-
122
- ### ❤️ Thank You
164
+ ### ❤️ Thank You
123
165
 
124
166
  - pseudosky
125
167
 
126
168
  ## 0.0.3 (2026-07-25)
127
169
 
128
-
129
170
  ### 🩹 Fixes
130
171
 
131
172
  - **apigen,backlog:** killable serve, configurable namespace, flaky test + log spam
132
173
 
133
174
  - **backlog:** match archived-item exclusion between render and its verify
134
175
 
135
-
136
- ### ❤️ Thank You
176
+ ### ❤️ Thank You
137
177
 
138
178
  - pseudosky
139
179
 
140
180
  ## 0.0.2 (2026-07-24)
141
181
 
142
-
143
182
  ### 🚀 Features
144
183
 
145
184
  - **backlog:** add CLI entrypoint + bin (live apigen cli-output mount)
146
185
 
147
- - **backlog:** add migration.phase signal + migrationStatus op (MIGRATION.md §4.4)
148
-
149
- - **backlog:** Phase 1/2 apigen import + CI parity gate + durable migration.phase admin write
186
+ - **backlog:** Phase 1/2 apigen import + CI parity gate
150
187
 
151
- - **backlog:** author backlog-usage skill + install-skill CLI (MIGRATION.md sec 4.2/4.3)
188
+ - **backlog:** author backlog-usage skill + install-skill CLI
152
189
 
153
- - **backlog:** add `serve` CLI command so .mcp.json has a real entry to spawn (MIGRATION.md sec 4.5)
190
+ - **backlog:** add `serve` CLI command so .mcp.json has a real entry to spawn
154
191
 
155
192
  - **backlog:** rootLevel projection filter so new tool items reach root
156
193
 
157
-
158
194
  ### 🩹 Fixes
159
195
 
160
- - **backlog:** close Phase-3 migration gate — CI Node floor, content-hash collision verified, FTS content immutability, bounded busy-retry; plus import provenance/silent-drop fixes
196
+ - **backlog:** close out CI Node floor, content-hash collision verification, FTS content immutability, and bounded busy-retry; plus import provenance/silent-drop fixes
161
197
 
162
198
  - **backlog:** runBacklogCli no longer eagerly opens the store for --help/no-args (DEBT-BACKLOG-CLI-EAGER-STORE-OPEN-001)
163
199
 
164
- - **backlog:** concurrent createItem id-collision + FTS sanitizer gap (MIGRATION.md sec 3.3 scale test)
200
+ - **backlog:** concurrent createItem id-collision + FTS sanitizer gap
165
201
 
166
202
  - **backlog:** implement real transition/claim audit-log (DEBT-BACKLOG-AUDIT-TRAIL-PARTIAL-001)
167
203
 
@@ -171,9 +207,6 @@
171
207
 
172
208
  - **backlog:** re-import backfills ownership + resurrects superseded ids
173
209
 
174
-
175
- ### ❤️ Thank You
210
+ ### ❤️ Thank You
176
211
 
177
212
  - pseudosky
178
-
179
- ## Unreleased