akm-cli 0.9.29 → 0.9.31

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 (162) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +10 -10
  3. package/ROADMAP.md +112 -0
  4. package/dist/commands/improve/improve-cli.js +33 -12
  5. package/dist/commands/sources/plugin-upgrade.js +46 -23
  6. package/dist/core/file-lock.js +10 -1
  7. package/dist/llm/client.js +33 -3
  8. package/dist/scripts/akm-migrate-node.js +5 -1
  9. package/dist/scripts/akm-migrate.js +5 -1
  10. package/docs/README.md +42 -41
  11. package/docs/agents/README.md +15 -0
  12. package/docs/agents/agent-install.md +14 -0
  13. package/docs/architecture/README.md +67 -0
  14. package/docs/architecture/adapters.md +272 -0
  15. package/docs/architecture/akm-architecture-decision-history.md +2055 -0
  16. package/docs/architecture/akm-core-principles.md +126 -0
  17. package/docs/architecture/architecture.md +579 -0
  18. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +550 -0
  19. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +72 -0
  20. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +142 -0
  21. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +189 -0
  22. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +97 -0
  23. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +108 -0
  24. package/docs/architecture/decisions/0006-task-source-version-routing.md +124 -0
  25. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +83 -0
  26. package/docs/architecture/decisions/0008-task-binding-normalization.md +88 -0
  27. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +80 -0
  28. package/docs/architecture/decisions/0010-driver-protocol-cut.md +36 -0
  29. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +125 -0
  30. package/docs/architecture/decisions/README.md +62 -0
  31. package/docs/architecture/improvement.md +440 -0
  32. package/docs/architecture/internals/classification.md +154 -0
  33. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +40 -0
  34. package/docs/architecture/internals/functional-contract-patterns.md +340 -0
  35. package/docs/architecture/internals/health-advisories.md +110 -0
  36. package/docs/architecture/internals/improve-workflow.md +713 -0
  37. package/docs/architecture/internals/indexing.md +498 -0
  38. package/docs/architecture/internals/registry-network-boundary.md +57 -0
  39. package/docs/architecture/internals/search.md +249 -0
  40. package/docs/architecture/internals/storage-locations.md +943 -0
  41. package/docs/architecture/persisted-data-compat.md +59 -0
  42. package/docs/architecture/reviews/env-secret-access.md +319 -0
  43. package/docs/architecture/runtime-boundary-design.md +153 -0
  44. package/docs/architecture/specs/0.9.0-close-out-plan.md +361 -0
  45. package/docs/architecture/specs/0.9.0-decisions.md +528 -0
  46. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +745 -0
  47. package/docs/architecture/specs/0.9.0-open-items-register.md +135 -0
  48. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +740 -0
  49. package/docs/architecture/specs/0.9.0-release-surface-review.md +636 -0
  50. package/docs/architecture/specs/agent-command-engine-model-design.md +513 -0
  51. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +501 -0
  52. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +291 -0
  53. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +2059 -0
  54. package/docs/architecture/specs/di-seams-plan.md +539 -0
  55. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +275 -0
  56. package/docs/architecture/specs/fact-asset-type.md +142 -0
  57. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +634 -0
  58. package/docs/architecture/specs/okf-support.md +148 -0
  59. package/docs/architecture/specs/ref.md +329 -0
  60. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +72 -0
  61. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +152 -0
  62. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +352 -0
  63. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +300 -0
  64. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +402 -0
  65. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +758 -0
  66. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +645 -0
  67. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +602 -0
  68. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +27 -0
  69. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +27 -0
  70. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +74 -0
  71. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +15 -0
  72. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +132 -0
  73. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +147 -0
  74. package/docs/architecture/specs/stash-conventions-code-spec.md +275 -0
  75. package/docs/architecture/specs/stash-organization-conventions.md +377 -0
  76. package/docs/architecture/specs/task-workflow-format-unification.md +721 -0
  77. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +231 -0
  78. package/docs/architecture/specs/workflow-format-unification.md +437 -0
  79. package/docs/architecture/testing/manual-testing-checklist.md +3420 -0
  80. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +924 -0
  81. package/docs/architecture/testing/task-workflow-manual-tests.md +1817 -0
  82. package/docs/architecture/testing/testing-workflow.md +446 -0
  83. package/docs/architecture/workflow-engine.md +274 -0
  84. package/docs/guides/README.md +33 -0
  85. package/docs/guides/author-bundles.md +310 -0
  86. package/docs/guides/author-workflows.md +520 -0
  87. package/docs/guides/bundles.md +321 -0
  88. package/docs/guides/capture-knowledge.md +136 -0
  89. package/docs/guides/claude-code-vs-akm-workflows.md +30 -0
  90. package/docs/guides/concepts.md +93 -0
  91. package/docs/guides/discover-and-load.md +158 -0
  92. package/docs/guides/getting-started.md +240 -0
  93. package/docs/guides/improve-the-library.md +246 -0
  94. package/docs/guides/knowledge-management.md +18 -0
  95. package/docs/guides/recipes/headless-install.md +97 -0
  96. package/docs/guides/recipes/website-source.md +28 -0
  97. package/docs/guides/run-workflows.md +279 -0
  98. package/docs/guides/scheduling.md +123 -0
  99. package/docs/guides/use-with-any-agent.md +129 -0
  100. package/docs/guides/wikis.md +81 -0
  101. package/docs/maintainers/README.md +19 -0
  102. package/docs/maintainers/curate-workmap.md +336 -0
  103. package/docs/maintainers/eval.md +3 -0
  104. package/docs/maintainers/local-development.md +108 -0
  105. package/docs/maintainers/release-checklist.md +103 -0
  106. package/docs/migration/README.md +2 -2
  107. package/docs/migration/release-notes/0.0.13.md +1 -1
  108. package/docs/migration/release-notes/0.1.0.md +1 -1
  109. package/docs/migration/release-notes/0.2.0.md +1 -1
  110. package/docs/migration/release-notes/0.3.0.md +1 -1
  111. package/docs/migration/release-notes/0.5.0.md +1 -1
  112. package/docs/migration/release-notes/0.6.0.md +1 -1
  113. package/docs/migration/release-notes/0.7.0.md +1 -1
  114. package/docs/migration/release-notes/0.7.3.md +2 -2
  115. package/docs/migration/release-notes/0.7.4.md +1 -1
  116. package/docs/migration/release-notes/0.7.5.md +1 -1
  117. package/docs/migration/release-notes/0.8.0.md +1 -1
  118. package/docs/migration/release-notes/0.9.0.md +1 -1
  119. package/docs/migration/release-notes/0.9.14.md +1 -1
  120. package/docs/migration/release-notes/0.9.15.md +1 -1
  121. package/docs/migration/release-notes/0.9.16.md +1 -1
  122. package/docs/migration/release-notes/0.9.17.md +1 -1
  123. package/docs/migration/release-notes/0.9.19.md +1 -1
  124. package/docs/migration/release-notes/0.9.2.md +1 -1
  125. package/docs/migration/release-notes/README.md +27 -31
  126. package/docs/migration/v0.5-to-v0.6.md +759 -0
  127. package/docs/migration/v0.8-to-v0.9.md +1 -1
  128. package/docs/plans/0.9.2-agent-command-workflow-plan.md +423 -0
  129. package/docs/posts/README.md +30 -0
  130. package/docs/posts/akm-command-tour.md +495 -0
  131. package/docs/posts/akm-logo-sized.webp +0 -0
  132. package/docs/posts/belief-aware-memory-12.md +139 -0
  133. package/docs/posts/config-v2-lessons-16.md +191 -0
  134. package/docs/posts/improve-loop-autonomous-10.md +225 -0
  135. package/docs/posts/improve-pipeline-debugging-0803.md +179 -0
  136. package/docs/posts/intro-part-01.md +76 -0
  137. package/docs/posts/intro-part-02.md +221 -0
  138. package/docs/posts/intro-part-03.md +190 -0
  139. package/docs/posts/intro-part-04.md +221 -0
  140. package/docs/posts/llm-mode-reflect-13.md +166 -0
  141. package/docs/posts/openpalm-built-on-akm.md +86 -0
  142. package/docs/posts/progressive-disclosure-06.md +129 -0
  143. package/docs/posts/proposal-safety-net-15.md +112 -0
  144. package/docs/posts/release-0.5.0.md +247 -0
  145. package/docs/posts/release-0.6.0.md +117 -0
  146. package/docs/posts/release-0.7.0.md +159 -0
  147. package/docs/posts/release-0.8.0.md +332 -0
  148. package/docs/posts/scattered-skills-05.md +100 -0
  149. package/docs/posts/task-assets-persistent-workflows-11.md +222 -0
  150. package/docs/posts/team-skills-07.md +198 -0
  151. package/docs/posts/wiki-agent-knowledge-08.md +223 -0
  152. package/docs/posts/workflows-vaults-09.md +321 -0
  153. package/docs/product-surface.md +54 -0
  154. package/docs/reference/README.md +1 -2
  155. package/docs/reference/asset-types.md +168 -0
  156. package/docs/reference/cli.md +5 -6
  157. package/docs/reference/env-and-secrets.md +126 -0
  158. package/docs/reference/memory.md +124 -0
  159. package/docs/reference/refs.md +156 -0
  160. package/docs/reference/registry.md +489 -0
  161. package/docs/reference/website-sources.md +141 -0
  162. package/package.json +12 -15
@@ -0,0 +1,740 @@
1
+ # Public API review — tracked issue backlog (v0.9.0-rc.10)
2
+
3
+ Status: proposed — reconciled 2026-07-26 against the maintainer rulings on
4
+ Q-01..Q-19. Items carrying a `> Ruled 2026-07-26 (Q-NN)` note below are
5
+ settled, re-scoped, or partially cancelled by a ruling; where a ruling bears on
6
+ an item, **the ruling is authoritative**.
7
+ Source: implementation-only review of the CLI surface and code (documentation claims
8
+ deliberately ignored). Line references are against the tree at the time of review
9
+ and may drift; each item names the file and the observable behavior so it can be
10
+ re-verified independently.
11
+ Note: items below cite `docs/agents/AGENTS.md` / `AGENTS.full.md`. Those files
12
+ were deleted during the 0.9.0 docs sweep — they fed nothing at runtime after
13
+ R-006 and kept re-diverging from the embedded copy. Their still-true content
14
+ now lives in `src/assets/hints/cli-hints-full.md` / `cli-hints-short.md`, which
15
+ is what `akm hints` prints and what `loadHints` reads.
16
+ Baseline: items were found against `a8464f2` and re-verified 2026-07-26 against
17
+ the base branch `claude/0-9-0-release-review-bcjxxu` @ `453a0ba`, which has
18
+ since fixed some of them. A further pass on 2026-07-27 @ `2d2edc1` (code
19
+ identical to `453a0ba`) re-checked the contested items individually and added
20
+ `> Status 2026-07-27:` notes where the tree disagrees with the item as
21
+ written — including two items this register had over- or under-reported
22
+ (R-004 fixed-in-surface; R-046 superseded by the D6 ruling). Items carrying a **Fixed / Reframed / Rejected on the
23
+ base branch** note have been re-checked; the rest were not re-verified
24
+ individually and may have been incidentally affected. See the
25
+ "Implementation status against the base branch" table in the companion drift
26
+ register for per-ruling status.
27
+ Companion: `0.9.0-docs-code-drift-register.md` covers the docs-vs-code
28
+ comparison this review deliberately excluded — including the intent questions
29
+ (Q-01..Q-19) where the decision record and the code conflict. All 19 were ruled
30
+ by the maintainer on 2026-07-26; see the **"Maintainer rulings — 2026-07-26"**
31
+ table in that register for the authoritative direction.
32
+
33
+ ## Framing
34
+
35
+ This backlog evaluates akm as what it has grown into: **a self-contained agent
36
+ toolkit** — one CLI that gives AI agents the capabilities that normally require a
37
+ stack of tools and a database server (indexed knowledge retrieval, secret/env
38
+ management, harness-agnostic workflow execution and delegation, scheduling), while
39
+ staying agent-, harness-, and content-format-agnostic (e.g. OKF alongside
40
+ markdown).
41
+
42
+ Under that identity, the env/secret manager, the workflow engine, the agent
43
+ dispatcher, the OS-scheduler integration, and the improve loop are **in-scope
44
+ features, not scope creep**, and no issue below asks for their removal. The
45
+ identity instead raises the bar in three specific ways, and most of this backlog
46
+ follows from them:
47
+
48
+ 1. **Agents are the primary consumers.** Machine-facing guidance (`akm hints`,
49
+ rendered command suggestions, help text, completions) is the product's API
50
+ documentation *and* its runtime behavior. Every place it misleads an agent is a
51
+ P0, not a docs nit.
52
+ 2. **The abstraction claims must hold at the seams.** "Harness-agnostic" and
53
+ "format-agnostic" are testable properties; half-wired normalizers and
54
+ format special-cases are gaps in the core value proposition.
55
+ 3. **An autonomous toolkit must be trustworthy by default.** Defaults that
56
+ schedule LLM rewrites, push git remotes, or mine other tools' session
57
+ transcripts need explicit opt-in or loud disclosure.
58
+
59
+ Severity legend:
60
+
61
+ - **P0** — the surface actively misleads its consumers, or an advertised path is
62
+ broken/unreachable.
63
+ - **P1** — incorrect or surprising behavior/semantics; wrong results or side
64
+ effects.
65
+ - **P2** — coherence, naming, and abstraction-seam debt.
66
+ - **P3** — cleanup: dead code, stale comments, duplication.
67
+
68
+ Counts: 9 × P0, 26 × P1, 21 × P2, 12 × P3 (68 tracked). The counts reflect the
69
+ tier labels as written; two items carry ruling-driven re-tier recommendations
70
+ not yet applied — R-045 (Q-18 makes it mandated feature work) and the `--format`
71
+ half of R-050 (Q-04 makes it Stable-tier contract work, and the item should be
72
+ split first). Recompute when those land.
73
+
74
+ ---
75
+
76
+ ## A. Agent-facing guidance correctness (P0)
77
+
78
+ - **R-001 (P0) — `akm hints` documents a `wiki` command that does not exist.**
79
+ The short and full hints corpora instruct agents to run `akm wiki list`,
80
+ `akm wiki show <name>`, `akm wiki ingest <name>`, use `--type wiki`, and
81
+ `akm show wiki:<name>`. No `wiki` subcommand is registered in
82
+ `src/cli.ts:509-550`; an agent following the tool's own onboarding issues
83
+ failing commands. Either ship the command or strip it from
84
+ `src/assets/hints/cli-hints-*.md` and `docs/agents/AGENTS*.md`.
85
+ > Note (Q-02, ruled 2026-07-26): the quoted `akm show wiki:<name>` example
86
+ > uses the colon grammar Q-02 removes — the hints sweep hits these lines
87
+ > either way; if the wiki content is kept (ship-the-command path), its ref
88
+ > examples must move to the slash form.
89
+
90
+ - **R-002 (P0) — `akm show --format text` renders copy-pasteable commands in the
91
+ retired `type:name` ref grammar.** `appendShowDirectives` builds
92
+ `` `${assetType}:${r.name}` `` and emits e.g.
93
+ `akm feedback 'knowledge:guide' --positive` (`src/output/show-directives.ts:26,57,75,87`),
94
+ which the 0.9 parser rejects. The same file renders `workflows/${name}`
95
+ correctly two lines down. Every APPLY footer suggestion currently fails when
96
+ executed.
97
+ > Ruled 2026-07-26 (Q-02): the colon grammar is removed entirely — no alias,
98
+ > no deprecation window — so re-accepting `type:name` in the parser is not a
99
+ > fix option. `appendShowDirectives` must emit slash refs (as it already does
100
+ > for `workflows/${name}`); include `show-directives.ts` in the Q-02 colon
101
+ > sweep alongside `search --help`, `akm hints`, and the ref-prefix tests.
102
+ > **Still open at base `0475870`** — and now strictly worse: Q-02 landed
103
+ > (the colon browse grammar is gone) while `show-directives.ts:26` still
104
+ > builds `` `${assetType}:${r.name}` ``. Raise with the Q-02 sweep.
105
+ > Status 2026-07-27: confirmed still open; the file now lives at
106
+ > `src/output/text/show-directives.ts` (`:26` builds the colon ref that
107
+ > `:37,57,75` interpolate into `akm feedback` suggestions). The fix is one
108
+ > line — build `assetRef` from the entry's conceptId (`workflows/${name}`
109
+ > two lines down shows the pattern) — plus refreshing the show-format text
110
+ > goldens that pin the footer.
111
+
112
+ - **R-003 (P0) — `akm feedback` help contradicts the implementation.** Help
113
+ (`src/cli.ts` command description; `src/commands/feedback-cli.ts:189-206`)
114
+ states negative feedback "does NOT immediately lower the asset's ranking — run
115
+ `akm index` after". The code applies the EMA utility update unconditionally
116
+ and immediately for both signals (`feedback-cli.ts:170-176`). Fix the text or
117
+ the behavior — currently agents are told to run an unnecessary reindex.
118
+
119
+ - **R-004 (P0) — feedback threshold hint references a nonexistent command.**
120
+ `feedback-cli.ts:365` prints "run `akm events list --type improve_review_needed`";
121
+ the command is `akm log`. (`events-list`/`events-tail` shape names and text
122
+ formatter headers carry the same retired name — see R-060.)
123
+ > Status 2026-07-27: ✅ **fixed in surface** — the printed hint no longer
124
+ > exists; `akm events list` survives only in two code comments
125
+ > (`feedback-cli.ts:341,365`). Downgrade to comment cleanup and fold into
126
+ > R-065; the R-060 shape-name half is unaffected.
127
+
128
+ - **R-005 (P0) — the shipped conventions fact contradicts `akm mv`.** The
129
+ scaffolded `facts/conventions/organization.md` asset teaches "A rename is
130
+ delete plus create. There is no command that preserves an asset's identity or
131
+ learned state across one" and demonstrates raw `mv` + manual grep — while
132
+ top-level `akm mv` exists precisely to move the file, rewrite inbound refs,
133
+ and re-key the index row plus usage/salience history in place
134
+ (`src/commands/mv-cli.ts`). Agents reading the stash's own guidance will avoid
135
+ the safe command and hand-roll the dangerous procedure it automates.
136
+ > Ruled 2026-07-26 (Q-01): `akm mv` stays; D3 is superseded. The fix is
137
+ > one-directional — rewrite `facts/conventions/organization.md` and the other
138
+ > D3-side docs to teach `mv`, and add the missing Experimental tier entry for
139
+ > `mv` to STABILITY.md. Removing `mv` is off the table.
140
+
141
+ - **R-006 (P0) — `akm hints` output depends on install method, and the copies
142
+ have drifted.** `loadHints` prefers `<pkgroot>/docs/agents/AGENTS[.full].md`
143
+ on disk and falls back to embedded `src/assets/hints/cli-hints-*.md`
144
+ (`src/commands/observability-cli.ts:240-257`). npm packs neither `docs/agents/`
145
+ nor `src/` (`package.json` `files`), so npm installs always get the embedded
146
+ copy while repo checkouts get `docs/` — and the two corpora already differ in
147
+ size and content. Single-source the corpus.
148
+ > Note (Q-02/Q-08, ruled 2026-07-26): both rulings mandate spelling sweeps of
149
+ > `akm hints` (colon→slash ref grammar; `env:`/`secret:`→slash) — land the
150
+ > single-sourcing first, or sweep both copies atomically, so the ruled
151
+ > changes don't re-drift the corpora.
152
+
153
+ - **R-007 (P0) — advertised `owner/repo` shorthand is unreachable.**
154
+ `add-cli.ts:234` and `git-install.ts:489` advertise the form, but
155
+ `isPathLikeRef` returns true for any string containing `/`
156
+ (`src/registry/resolve.ts:298`), so `tryParseLocalRef` throws
157
+ `Local path not found` before the `parseGithubShorthand` fallback at
158
+ `resolve.ts:86-90` can run. The fallback is dead code; `akm add itlackey/akm-stash`
159
+ fails. Reorder the dispatch (try shorthand when the local path doesn't exist).
160
+ > Note (Q-19, ruled 2026-07-26): the resolver fix (`resolveSourcesForOrigin`
161
+ > matching `github:owner/repo` install refs) confirms install-ref shorthand is
162
+ > intended surface, so the fix direction here — reorder the dispatch, don't
163
+ > retire the advertised form — is sanctioned. Land both together so
164
+ > `show //meta`'s "Run: akm add …" hint chain works end to end.
165
+
166
+ - **R-008 (P0) — `akm registry search` ignores registries added via
167
+ `akm registry add`.** `registry-cli.ts:128` calls `searchRegistry` without a
168
+ `registries` option; the fallback resolves `DEFAULT_CONFIG.registries`, never
169
+ the on-disk config (`src/commands/read/registry-search.ts:35,166`). Meanwhile
170
+ `akm search --source registry` passes `config.registries` and honors them.
171
+ Configured registries are listed by `registry list` but never searched by
172
+ `registry search`.
173
+
174
+ - **R-009 (P0) — `akm search` rejects the empty query its own help advertises.**
175
+ The positional's description says "omit to list all assets"
176
+ (`src/commands/read/search-cli.ts:36-39`) but the handler throws
177
+ `MISSING_REQUIRED_ARGUMENT` for an empty query (`:79-86`), making the
178
+ `enumerateEntries` browse path reachable only via `<type>:` prefix queries or
179
+ queries that sanitize to empty. Allow the bare listing or fix the description.
180
+ > Note (Q-02, ruled 2026-07-26): the `<type>:` escape hatch named here is
181
+ > removed with the colon grammar; post-ruling the browse path is reachable via
182
+ > the slash forms (`memories/`, `bundle//`). The empty-query question itself
183
+ > is unaffected — update the parenthetical when Q-02 lands.
184
+
185
+ ---
186
+
187
+ ## B. Broken or surprising command behavior (P1)
188
+
189
+ - **R-010 (P1) — the lockfile locks nothing.** `akm.lock` records
190
+ `resolvedVersion`/`resolvedRevision`/`integrity`, but the only field consumed
191
+ for behavior is `localRoot` (`src/integrations/lockfile.ts:122-130`).
192
+ `akm update` re-resolves the original ref (npm `latest`, git branch HEAD) and
193
+ overwrites the lock (`installed-stashes.ts:384`); nothing reproduces a locked
194
+ state; stored integrity is never re-verified. Either implement
195
+ lock-consumption (frozen installs, integrity re-check) or stop recording the
196
+ fields and drop the "lockfile" concept from the surface.
197
+
198
+ - **R-011 (P1) — git/github installs have no integrity verification at all.**
199
+ `verifyArchiveIntegrity` returns early for git sources
200
+ (`src/sources/providers/tar-utils.ts:42`); the sha256 computed at install time
201
+ is stored and never compared.
202
+
203
+ - **R-012 (P1) — corrupt lockfile fails silently open.** Unparseable JSON →
204
+ `return []`; malformed entries silently filtered (`lockfile.ts:99-106`). Every
205
+ managed bundle vanishes from `akm list` with no warning.
206
+
207
+ - **R-013 (P1) — `akm add --provider` combinations are broken.**
208
+ `providerType` is honored only when the target is a remote URL
209
+ (`source-manage.ts:71-100`): `akm add lodash --provider npm` silently creates
210
+ a *filesystem* bundle at `./lodash`; `akm add <url> --provider npm` stores the
211
+ URL as an npm path that later resolves as a filesystem path
212
+ (`config-sources.ts:102-104`, `npm.ts:54-59`).
213
+
214
+ - **R-014 (P1) — `akm add`'s two paths return two incompatible response
215
+ shapes.** Path A (`--provider`) returns `SourceAddResult`, Path B returns
216
+ `AddResponse`; the shared text renderer reads Path B fields and prints
217
+ `Installed undefined (0 directories scanned, 0 total assets indexed)` for
218
+ Path A (`output/text/command-format.ts:510-514`).
219
+
220
+ - **R-015 (P1) — `akm update --all` silently skips plain (non-lock-backed)
221
+ sources.** `selectManagedTargets` returns lock-backed installs only
222
+ (`installed-stashes.ts:519-522`); a configured plain `git`/`website` bundle is
223
+ never refreshed by `--all` and must be named individually. Skip should at
224
+ minimum be reported.
225
+ > Note (Q-09, ruled 2026-07-26): the user-facing kind axis stays
226
+ > `filesystem`/`git`/`npm`/`website`, so the lock-backed "managed" split stays
227
+ > behavioral-only with no taxonomy surface — making the skip report asked for
228
+ > here the sole disclosure of it.
229
+
230
+ - **R-016 (P1) — `akm setup --yes` silently skips 7 of 8 wizard steps.** Only
231
+ the `stash-dir` step sets `nonInteractive: true` (`setup/setup.ts:436`;
232
+ skip logic `setup/steps.ts:98`); embedding, llm, semantic-search, registries,
233
+ stash-sources, agent-cli, and output steps never run, while the call-site
234
+ comment claims defaults are applied (`setup.ts:776`). Also
235
+ `runSetupWithDefaults` hardcodes `online: false` yet still runs network
236
+ detection (`setup.ts:779,788`).
237
+
238
+ - **R-017 (P1) — `akm setup --config/--from` silently drops five valid config
239
+ keys.** `ALLOWED_KEYS` (`setup.ts:1013-1027`) omits `index`, `search`,
240
+ `feedback`, `workflow`, `archiveRetentionDays` — all present in
241
+ `AkmConfigShape` — deleting them with only a stderr warn.
242
+
243
+ - **R-018 (P1) — `akm curate --type` bypasses the entire curation algorithm.**
244
+ With an explicit type the result is `stashHits.slice(0, limit)` — no family
245
+ collapse, no intent nudges, no score floor (`curate.ts:255-262`). Two
246
+ qualitatively different products under one command name.
247
+
248
+ - **R-019 (P1) — curate hard-caps registry results at 2 regardless of
249
+ `--limit`** (`curate.ts:264-265`), and the fallback path can issue up to 7
250
+ registry searches per invocation (`curate.ts:549-566`).
251
+
252
+ - **R-020 (P1) — `akm show` drops the canonical `ref` from default and summary
253
+ output.** `showLocal` computes it, brief/summary builders include it, and the
254
+ shaper's `pickFields` allow-lists omit `"ref"` for human and summary shapes
255
+ (`output/shapes/helpers.ts:453-496`). Only `--shape agent` emits the one
256
+ identifier agents need for follow-up commands.
257
+
258
+ - **R-021 (P1) — `--detail brief` behaves differently as a flag vs as config
259
+ default.** `showCommand` detects only the literal CLI token via
260
+ `getFlagValue("--detail")` to trigger `buildBriefResponse`
261
+ (`search-cli.ts:223-227`); config `output.detail: "brief"` reaches only the
262
+ shaper, which treats brief and normal identically. Same nominal level, two
263
+ payloads.
264
+
265
+ - **R-022 (P1) — `akm index --dry-run` alone performs a full real index.** The
266
+ flag is only consulted inside the `--clean` branch (`indexer.ts:715-726`).
267
+
268
+ - **R-023 (P1) — `akm index --background` claims to manage a PID file; none
269
+ exists.** The flag only suppresses the spinner and the final output
270
+ (`stash-cli.ts:95-99,127,157`) — the command still runs in the foreground and
271
+ prints nothing.
272
+
273
+ - **R-024 (P1) — `akm graph update --source <bundle>` validates the name, then
274
+ extracts the primary stash anyway.** The validated result is discarded and
275
+ extraction always uses `sources[0]` (`graph.ts:529-538`,
276
+ `graph-extraction.ts:406`).
277
+
278
+ - **R-025 (P1) — `akm config get <scalar>` returns secrets unredacted.**
279
+ `redactConfigValue` only redacts inside objects (`config-cli.ts:66`):
280
+ `akm config get embedding.apiKey` prints the literal value while
281
+ `akm config get embedding` redacts it. (Mitigated by write-time
282
+ sanitization, but the read surface is inconsistent.)
283
+
284
+ - **R-026 (P1) — `akm env unset` argv workaround can silently drop keys.** The
285
+ positional filter removes any token equal to a global flag's *value*
286
+ (`env-cli.ts:474-482`), so unsetting a key literally named `json` while
287
+ `--format json` is set is a silent no-op; `--target` is wrongly included in
288
+ the global-flag list; the comment cites `cli.ts:1335` in a 666-line file.
289
+ > Status 2026-07-27: ✅ **fixed** (`0475870`) — the workaround is deleted
290
+ > outright. The root cause was citty parsing each command level against only
291
+ > its own declared args; `GLOBAL_OUTPUT_ARGS` now declares the global output
292
+ > flags on every leaf so their values are consumed by the parser, and keys
293
+ > literally named `json` unset correctly (verified end-to-end alongside the
294
+ > `sync --format json` case). See R-051's companion note.
295
+
296
+ - **R-027 (P1) — `akm secret path`/`remove` can resolve to different files than
297
+ the read path for the same ref.** Reads use `findEnvSource` (all sources);
298
+ mutations use `resolveMutationTarget` (`core/env-secret-ref.ts:64-85` vs
299
+ `198-255`).
300
+
301
+ - **R-028 (P1) — `akm import <url>`'s private-host allowance is gated on a
302
+ test-shaped predicate in production.** `allowPrivateHosts` defaults to
303
+ `shouldAllowPrivateWebsiteUrlForTests(source)` (`stash-cli.ts:256`,
304
+ `knowledge.ts:141-146`).
305
+
306
+ - **R-029 (P1) — `akm backup` does not back up the stash.** Artifact set is
307
+ `config.json`, `state.db`, `workflow.db`, `index.db`
308
+ (`scripts/akm-migrate/migration-backup.ts:57-61`) — the markdown assets, env
309
+ files, and secrets are excluded. Additionally `--for` accepts only the literal
310
+ `"0.9.0"` (`backup-cli.ts:9-16`), and both `backup` and `migrate` hard-require
311
+ Bun on PATH under the supported Node install (`migration-tool.ts:21`). Rename
312
+ the command to match its migration-snapshot scope, or extend it to cover the
313
+ knowledge.
314
+ > Note (Q-14, ruled 2026-07-26): `backup` must receive a stability tier and
315
+ > either a cli.md section or an explicit internal listing — make the
316
+ > rename-vs-extend decision as part of that follow-through.
317
+ > Ruled 2026-07-27: **removed from the CLI** — neither renamed nor extended.
318
+ > `backup-cli.ts` deleted and the `backup` registration dropped; the
319
+ > capability remains at `akm-migrate backup` / `akm-migrate restore` (already
320
+ > present in that binary's surface). A cleaner backup story is deferred past
321
+ > 0.9.0. Migration guide + 0.9.0 release notes swept to the new spelling; the
322
+ > Q-14 tier question for `backup` is moot. ✅ landed same day.
323
+
324
+ - **R-030 (P1) — `akm health` writes to the append-only event stream on every
325
+ run.** The state-db round-trip probe appends a `health_probe` event
326
+ (`health/metrics.ts:35-38`); CI polling accumulates rows indefinitely. Use a
327
+ transaction-rollback probe or a dedicated probe table.
328
+
329
+ - **R-031 (P1) — `akm health --format html` overrides `--group-by`** (forces
330
+ `groupBy: "run"`, `cli.ts:341-360`) and runs the health computation twice with
331
+ a second window read — undocumented and inconsistent with the other formats.
332
+ > **Fixed on the base branch (`0475870`).** `akm health` no longer branches on
333
+ > `--format` anywhere: `--report` is now a data flag carrying runs/deltas/the
334
+ > pending-proposal queue in the envelope, the md/html renderers are pure
335
+ > functions of the result, `setHealthHtmlContext` is gone, and the html-only
336
+ > `--compare` was removed in favor of `--window-compare`. Breaking: bare
337
+ > `akm health --format html` renders the plain check generically — use
338
+ > `--report`. Verify and close.
339
+ > Follow-up in `453a0ba`: `--report` had been seeding `windowCompare` from
340
+ > `--since` unconditionally, so an absolute date/ISO/epoch `--since` reached a
341
+ > duration-only parser and threw, and an explicit `--windows` tripped the
342
+ > mutual-exclusivity guard. Precedence is now `--window-compare`, then a
343
+ > duration-valued `--since`, and nothing alongside `--windows`.
344
+
345
+ - **R-032 (P1) — unknown-command handling is inconsistent with the exit-code
346
+ contract.** `akm totally-bogus` exits 1; `akm wiki list` prints top-level
347
+ usage and exits **0**; the CLI's own table says usage errors are exit 2.
348
+ Verified against the running CLI.
349
+
350
+ - **R-033 (P1) — `akm feedback --tag` reads raw argv, including tokens after
351
+ `--`.** The declared citty arg is decorative; `parseAllFlagValues("--tag")`
352
+ scans the whole argv (`feedback-cli.ts:220,288`). Also `--applied-to` is a
353
+ silent no-op for non-lesson refs (`:397`).
354
+
355
+ - **R-034 (P1) — feedback silently skips the ranking update for non-`user`
356
+ event sources.** With `AKM_EVENT_SOURCE` set to anything else — including
357
+ invalid values coerced to `"unknown"` — the usage event is recorded but the
358
+ utility score is untouched, with no output signal (`feedback-cli.ts:170`,
359
+ `usage-events.ts:31-35`).
360
+
361
+ - **R-035 (P1) — the `AKM_NPM_REGISTRY` hint is false.** The env var only
362
+ widens the tarball-host allowlist (`resolve.ts:332-344`); metadata fetches are
363
+ hardcoded to `registry.npmjs.org` (`resolve.ts:375`), so installs from a
364
+ private mirror do not work despite the error hint saying they do
365
+ (`resolve.ts:322`).
366
+
367
+ ---
368
+
369
+ ## C. Trust and safety defaults (P1)
370
+
371
+ - **R-036 (P1) — `akm setup` installs five cron/launchd/schtasks entries by
372
+ default** (hourly/4-hourly/nightly `akm improve` variants,
373
+ `commands/tasks/default-tasks.ts:51-92`), and embedded task templates add
374
+ `akm extract --auto` every 30 minutes. An OS-scheduler mutation deserves an
375
+ explicit, itemized opt-in step in the wizard and a flag in `--yes` mode.
376
+ > Ruled 2026-07-26 (Q-05/Q-14): `experimental.improveAutonomy` ships as
377
+ > STABILITY.md documents it, and `extract` is tiered Experimental. The
378
+ > scheduled `improve` entries must sit behind that off-by-default gate, and
379
+ > the embedded `akm extract --auto` template schedules an Experimental-tier
380
+ > command — implement the opt-in asked for here as the gate plus an explicit
381
+ > wizard step (and a flag in `--yes` mode).
382
+
383
+ - **R-037 (P1) — `akm improve` commits and pushes the stash by default** for
384
+ git-backed stashes (`improve-cli.ts:145-154`). Combined with R-036 this means
385
+ a default setup schedules unattended LLM rewrites that push to a remote.
386
+ Default should be commit-only (or off) with push as explicit opt-in.
387
+ > **Rejected on the base branch (`84bba7a`, 2026-07-26)** — supersedes this
388
+ > item's recommendation and the earlier Q-05 note here. `sync.push` stays
389
+ > default-on and *outside* the autonomy gate: it publishes already-committed
390
+ > content to a remote configured for that purpose rather than mutating or
391
+ > deleting assets without review, and it already has two documented opt-outs
392
+ > (`sync.push: false`, `--no-push`). D8 gates five lanes — consolidate
393
+ > merge/delete/contradict, memory-cleanup and contradiction passes,
394
+ > memory-inference writes, and triage `applyMode: "promote"` — and `push`
395
+ > joins extract's session indexing as an ungated-by-design write. The R-036
396
+ > half (scheduling unattended runs) is unaffected and still stands.
397
+
398
+ - **R-038 (P1) — `akm extract` mines other harnesses' private session
399
+ transcripts (claude-code JSONL, opencode storage) and sends content to the
400
+ configured LLM** (`improve/extract.ts`, `integrations/session-logs/`), with a
401
+ `--watch` mode that tails those directories indefinitely
402
+ (`extract-cli.ts:267-319`). Legitimate feature; needs first-run consent and
403
+ prominent disclosure given it reads data the user may not consider akm's.
404
+ > Ruled 2026-07-26 (Q-14): `extract` is tiered **Experimental** and must be
405
+ > documented (or explicitly listed internal) in cli.md. Land the first-run
406
+ > consent and prominent-disclosure requirements in that new STABILITY.md tier
407
+ > entry and reference section rather than as a standalone fix.
408
+
409
+ - **R-039 (P1) — default `akm index` attempts an implicit ~130 MB embedding
410
+ model download.** With `semanticSearchMode: "auto"` and no endpoint,
411
+ `embedBatch` falls through to `@huggingface/transformers` →
412
+ `Xenova/bge-small-en-v1.5` (`llm/embedder.ts:158-176`). Failure downgrades
413
+ gracefully, but the download itself should be prompted.
414
+ > Ruled (owner ruling 9, X-RULING-9, `f04932f`): `semanticSearchMode` now
415
+ > defaults to `"off"` — a bare/headless install never attempts the
416
+ > download; the interactive `akm setup` wizard still pre-selects it on,
417
+ > with the download warning moved ahead of the prompt.
418
+
419
+ - **R-040 (P1) — dynamic code loading from the stash.** Wiki snapshot fetchers
420
+ `import()` arbitrary `.ts`/`.js` from `<stashDir>/scripts/wiki-fetchers/`
421
+ (`sources/snapshot-fetchers/registry.ts:34-46`) — a code-execution surface
422
+ reachable from synced content. Should be gated by the same
423
+ third-party/first-party activation policy used for env keys. Related: the
424
+ built-in YouTube fetcher calls the private InnerTube API with a hardcoded key
425
+ impersonating the Android client (`snapshot-fetchers/youtube.ts:35-42`) —
426
+ fragile and worth an explicit support decision.
427
+
428
+ - **R-041 (P1) — `akm graph export --out` writes anywhere with default 0644**
429
+ (`graph.ts:302-315`) while `akm env export` enforces 0600. Graph contents are
430
+ LLM-extracted from the user's knowledge; align the posture.
431
+
432
+ ---
433
+
434
+ ## D. Abstraction-seam gaps (P2) — where the agnosticism claims leak
435
+
436
+ - **R-042 (P2) — harness result normalization is half-wired.** All harnesses
437
+ ship `result-extractor.ts` normalizers, but only the workflow native engine
438
+ consumes them (`workflows/exec/native-executor.ts:1259-1267`); `akm agent`,
439
+ `akm propose`, and reflect return raw harness stdout. Harness-agnosticism
440
+ currently holds only inside `workflow run`.
441
+
442
+ - **R-043 (P2) — OKF is special-cased in `akm show`.** OKF-adapter entries
443
+ bypass the renderer registry for a hand-rolled markdown path
444
+ (`show.ts:369-370,545-586`). If format-agnosticism is the goal, OKF should go
445
+ through the same adapter/renderer seam as markdown assets.
446
+ > Ruled 2026-07-26 (Q-07): the parser half of this special-casing is settled
447
+ > — the ref-parser seam is fixed centrally so opaque conceptIds are accepted
448
+ > across graph, tasks, improve, proposals, the utility repo, and the indexer
449
+ > walk, removing `show`'s need to bypass `parseRefInput`. The
450
+ > renderer-registry half remains this item's ask and aligns with the ruling.
451
+ > **Largely fixed on the base branch (`453a0ba`).** `show`'s
452
+ > `indexedEntry?.adapterId === "okf"` branch became `usesIndexedProjection`
453
+ > (`read/show.ts:536-559`): OKF plus any indexed item whose type AKM does not
454
+ > place keeps its adapter's projection, so a `website` entry no longer comes
455
+ > back typed as AKM placement and a generic `file` no longer loses its
456
+ > content. OKF is still named explicitly — deliberately, since its `type` is
457
+ > open frontmatter and may collide with an AKM placement type — and
458
+ > `env`/`secret` stay pinned to the dotenv renderer so values are never
459
+ > dumped. What remains of this item is only that residual OKF name-check;
460
+ > the general seam now exists.
461
+
462
+ - **R-044 (P2) — two disjoint secret systems; the toolkit doesn't dogfood its
463
+ own.** akm's LLM/embedding keys come from env vars or `$VAR` config refs
464
+ (`config.ts:437-444`) and cannot be supplied from `akm secret`. Letting config
465
+ reference `secrets/<name>` would close the loop and demonstrate the feature.
466
+ > Ruled 2026-07-26 (Q-08): slash spelling only, no colon alias — if config
467
+ > learns to reference managed secrets, the spelling must be the slash form
468
+ > `secrets/<name>` (e.g. `secrets/OPENAI_KEY`), not the `secret:NAME` form
469
+ > this item originally proposed.
470
+
471
+ - **R-045 (P2) — the `instruction` asset type is half-registered.** It exists
472
+ in `KNOWN_TYPES`/`TYPE_PRESENTATION` but not `PLACEMENT_SPECS`
473
+ (`core/asset/asset-placement.ts:89-166` vs `core/recognition-util.ts:92-106`),
474
+ so it is invisible to `akm info`, unbrowsable via prefix queries, and its refs
475
+ don't round-trip. Register or remove it; add a compile-time exhaustiveness
476
+ check tying the two registries together.
477
+ > Ruled 2026-07-26 (Q-18): "register or remove" is settled — **register**.
478
+ > The two-registry split stays the core truth (`KNOWN_TYPES` = presentation
479
+ > vocabulary, `PLACEMENT_SPECS` = stash-resident subset), so the
480
+ > exhaustiveness check is a **subset** assertion (placement keys ⊆ known
481
+ > types), not equality. `instruction` gains a `PLACEMENT_SPECS` entry with an
482
+ > `instructions/` stash dir on the markdown spec, becoming creatable,
483
+ > browsable, and listed by `akm info` like knowledge; adapter-emitted
484
+ > `instruction` docs round-trip via the Q-07 opaque-conceptId fix. This is now
485
+ > mandated 0.9.0 feature work — **raise to P1**.
486
+
487
+ - **R-046 (P2) — `--type` is unvalidated everywhere, and the help enumerates 11
488
+ of the 13 real types** (missing `fact`, `task`, `session`;
489
+ `search-cli.ts:41-43,125-127`). `--type bogus` silently returns zero hits.
490
+ Validate against `placementTypes()` and generate the help list from it.
491
+ > Note (Q-18, ruled 2026-07-26): `instruction` becomes a placement type,
492
+ > shifting the real-type count from 13 to 14 — a further reason to generate
493
+ > the help list and validation from `placementTypes()` rather than
494
+ > re-hardcoding.
495
+ > Status 2026-07-27: **superseded by the D6 decision** — the validation half
496
+ > of this item conflicts with a maintainer ruling this register missed.
497
+ > `type` is a free-form open string BY DESIGN (adapters emit `website`,
498
+ > `wiki-source`, OKF frontmatter types outside any placement list), so
499
+ > validating against `placementTypes()` would reject valid filters; D6 and
500
+ > `STABILITY.md`'s Stable-tier bullet both pin "deliberately not validated:
501
+ > an unrecognized type returns zero hits, not an error". The help half is
502
+ > already fixed: `search`/`curate` `--type` help now enumerates all 14
503
+ > built-ins **and states the set is open** (`search-cli.ts:43`). Nothing
504
+ > remains except keeping that string current — do not implement validation.
505
+
506
+ - **R-047 (P2) — same concept, two flag names: `search --filter` vs
507
+ `show --scope`** for the identical `user=/agent=/run=/channel=` narrowing.
508
+ Pick one (keep the other as a hidden alias for one release).
509
+ > Ruled 2026-07-27: **unify on `--filter`, remove `--scope` with no alias.**
510
+ > ✅ landed same day: `show` declares `filter`, parses repeatable `--filter`
511
+ > through the same `parseScopeFilterFlags` helper as `search`; cli.md swept.
512
+ > The removed spelling fails loudly rather than silently un-narrowing —
513
+ > citty drops the unknown flag and its value lands in the positional slot,
514
+ > where `rejectExtraShowPositionals` raises exit 2 (pinned by a new CLI test
515
+ > in `scope-flags.test.ts`).
516
+
517
+ - **R-048 (P2) — package identity: the npm description still says "package
518
+ manager".** Under the accepted toolkit framing this misstates the product to
519
+ its distribution channel and sets the wrong expectations for the verbs in §E.
520
+ Reposition the one-liner (`package.json:5`).
521
+
522
+ ---
523
+
524
+ ## E. Verb semantics and surface coherence (P2)
525
+
526
+ - **R-049 (P2) — `update` / `upgrade` / `sync` are three unrelated operations
527
+ wearing package-manager names.** Refresh sources / self-update the akm binary
528
+ / git-commit-and-push the stash. Given the toolkit identity, consider
529
+ `akm self update` (or `self-upgrade`) and `akm stash sync` (or `save`) to
530
+ free the ecosystem-conventional meanings; `sync` still emits
531
+ `eventType: "save"` and `output("save", …)` from its retired name
532
+ (`sources-cli.ts:181-185`).
533
+
534
+ - **R-050 (P2) — global flags that are mostly not global.** `--detail` is an
535
+ identity no-op for `init`/`index`/`info`/`import`/`remember` (and
536
+ brief==normal on `show`); `--format md|html` is accepted globally but valid
537
+ only for `health`; `--shape summary` only for `show`. Either scope the flags
538
+ to the commands that honor them in help output, or implement them uniformly.
539
+ > Ruled 2026-07-26 (Q-04): for `--format` the either/or is settled —
540
+ > implement basic support on every non-exempt command, with `text` and `md`
541
+ > collapsed into a single format, plus alignment of the persisted
542
+ > `output.format` schema and the `INVALID_FORMAT_VALUE` hint. Only the
543
+ > `--detail`/`--shape` halves of this item remain an open choice. Split the
544
+ > ruled `--format` work into its own item and **raise it to P1**: it is
545
+ > mandated Stable-tier contract work, not coherence debt.
546
+ > Status 2026-07-27: the "implement on every non-exempt command" half
547
+ > **landed** (D7: renderer registries, generic md/html fallbacks, declared
548
+ > exemptions in `format-exempt.ts`, `output.format` schema widened to six),
549
+ > but as SIX formats — the text/md collapse was not applied, and the
550
+ > `INVALID_FORMAT_VALUE` hint still lists four values (`errors.ts:111`).
551
+ > The Q-04 conflict in the drift register is the open decision; the hint
552
+ > fix is deferred until that call so it is corrected once, to the final set.
553
+
554
+ - **R-051 (P2) — per-command `--format/--detail/--shape` declarations are
555
+ decorative.** Declared on `search`/`curate`/`show` but never read from
556
+ `args`; values come from the process-wide singleton (`search-cli.ts:63-64,
557
+ 131-136`). Users see help entries for flags the handler ignores.
558
+ > **Reframed by the base branch (`0475870`).** The redundant declarations turn
559
+ > out to be load-bearing: citty parses each command level against only its own
560
+ > declared args, so a root-declared global was unknown at the leaf and its
561
+ > space-separated value fell through as a positional (`akm sync --format json`
562
+ > synced a bundle named "json"). `GLOBAL_OUTPUT_ARGS` now redeclares
563
+ > `--format`/`--detail`/`--shape`/`--output` on **every** leaf, parse-only,
564
+ > with the mode still read once from the invocation singleton
565
+ > (`cli/shared.ts:138-159`). The declarations are no longer decorative — this
566
+ > item is closed as fixed-by-design; only the help-text clarity ask remains.
567
+ > **Completed in `453a0ba`:** the first pass covered only `defineJsonCommand`
568
+ > leaves, so `improve`, `propose`, and `tasks run` (plain `defineCommand`)
569
+ > still had citty parse `--format` as a boolean and spill its value into the
570
+ > next positional — `improve --dry-run --format md` read "md" as the scope,
571
+ > `tasks run --format md nightly` lost the task id. Each leaf now declares
572
+ > the flags.
573
+
574
+ - **R-052 (P2) — bash completions advertise wrong values.** `FLAG_VALUES`
575
+ offers `--detail … summary` (a `--shape` value that errors) and omits
576
+ `md`/`html` from `--format` (see the Q-04 note below); the table is keyed globally by flag name, so
577
+ `graph --source <TAB>` suggests search's `stash registry both`
578
+ (`commands/completions.ts:15-21`). The `completions` handler is also the only
579
+ one not wrapped in `runWithJsonErrors`, so a non-bash shell error surfaces as
580
+ `UNHANDLED_REJECTION`/exit 1 instead of a usage error/exit 2 (`cli.ts:449-452`).
581
+ > Ruled 2026-07-26 (Q-04): `text` and `md` collapse into a single format, so
582
+ > the accepted `--format` value set is changing — fix the completions table
583
+ > against the post-Q-04 set rather than adding `md`/`html` to today's list.
584
+
585
+ - **R-053 (P2) — bare-group behavior is inconsistent three ways.**
586
+ `akm log`/`akm lessons` print help and exit 0; `akm backup`/`akm migrate`
587
+ throw usage errors (exit 2); `akm env`/`akm config`/`akm graph` run a default
588
+ action. Pick one convention.
589
+
590
+ - **R-054 (P2) — `akm lessons` advertises "strength queries" that don't
591
+ exist.** The group description promises them (`observability-cli.ts:205`);
592
+ `lessonStrength` is written by feedback and read by ranking but not queryable
593
+ from any command. Implement `lessons strength <ref>` or fix the description.
594
+
595
+ - **R-055 (P2) — reads are writes, undisclosed.** `search`/`show`/`curate`
596
+ append events, insert usage rows, and search bumps EMA utility scores —
597
+ running a search changes future rankings (`search.ts:393`). Legitimate design
598
+ for a learning index, but it should be stated on the command surface and
599
+ offer an opt-out (the internal `skipLogging` already exists).
600
+
601
+ - **R-056 (P2) — `akm index` writes to `config.json`** (persisting detected
602
+ adapters via `mutateConfig`, `indexer.ts:600-622`). Surprising for an "build
603
+ the index" command; disclose or relocate to `add`/`setup`.
604
+
605
+ - **R-057 (P2) — `akm info` omits the most basic facts.** No `stashDir`, no
606
+ `defaultBundle`, no per-type asset counts (`info.ts:64-78`); `searchModes`
607
+ reports semantic readiness from a cached status file, not a live probe; its
608
+ stats warning writes raw `process.stderr`, bypassing `--quiet`
609
+ (`info.ts:103`).
610
+
611
+ - **R-058 (P2) — remove/update destructive-action asymmetry.** `akm remove`
612
+ prompts for confirmation; `akm update`, which can `rm -rf` the prior
613
+ materialized root (`installed-stashes.ts:421-428`), does not. Also removing a
614
+ plain git/website bundle leaves its mirror cache behind, and `akm clone` of an
615
+ unregistered origin downloads a full package into the cache with no bundle or
616
+ lock record (orphaned disk).
617
+
618
+ - **R-059 (P2) — two parallel cache schemes for the same upstream.** Managed
619
+ installs key `getRegistryCacheDir()` by version/revision; plain git/website
620
+ mirrors key `getRegistryIndexCacheDir()` by URL hash — adding the same repo
621
+ both ways stores two copies.
622
+
623
+ - **R-060 (P2) — `akm log` is still `akm events` internally.** Output shapes
624
+ `events-list`/`events-tail`, text headers, and the R-004 hint all use the old
625
+ name. Rename the shapes at the next schemaVersion bump.
626
+
627
+ - **R-061 (P2) — argv is parsed in three layers with four workaround
628
+ patterns.** citty; the pre-citty `normalizeShowArgv` rewrite; the
629
+ `ParsedInvocation` raw-argv singleton for repeatable flags; plus ad-hoc
630
+ `process.argv.includes("--no-init")` and the `remember` positional-swallowing
631
+ heuristic that covers `--format`/`--detail` but not `--shape`/`--output`
632
+ (`remember.ts:303-370`). Consolidate on one parse or replace the framework —
633
+ each workaround has already produced user-visible bugs (R-026, R-033).
634
+ > Ruled 2026-07-26 (Q-03): `normalizeShowArgv` and the hidden `--akm*` flags
635
+ > it feeds are deleted with the show view modes, removing one of the four
636
+ > workaround patterns outright. Consolidate the remaining three; do not invest
637
+ > further in the pre-citty rewrite layer.
638
+ > Status 2026-07-27: two of the four are gone — `normalizeShowArgv` (Q-03)
639
+ > and the env-unset value filter (R-026, root-caused by
640
+ > `GLOBAL_OUTPUT_ARGS`). Remaining: the `ParsedInvocation` singleton (now
641
+ > load-bearing by design — the one-parse rule), ad-hoc
642
+ > `process.argv.includes` probes, and the `remember` positional-swallowing
643
+ > heuristic, which `GLOBAL_OUTPUT_ARGS` on the `remember` leaf may make
644
+ > deletable — verify against `remember.ts:303-370` before consolidating.
645
+
646
+ - **R-062 (P2) — `--showSimilar` is the CLI's only camelCase flag**
647
+ (`remember-cli.ts:141-144`); everything else is kebab-case, and
648
+ `migrate apply` declares `dryRun` where the codebase convention is
649
+ `"dry-run"`.
650
+
651
+ ---
652
+
653
+ ## F. Cleanup batch (P3)
654
+
655
+ - **R-063 (P3) — confirmed dead code.** `parseGithubShorthand` branch
656
+ (unreachable, see R-007); `injectIntoEnv` (`env.ts:115` — mutates
657
+ `process.env`, forbidden by its own module docstring); secret `listNames`
658
+ (`secret.ts:96`); `loadGraphMetaOnly` / `loadGraphEntitiesByPath`
659
+ (`graph-db.ts:343,403`); `parseConfigValue` shim and the unreachable
660
+ `toggleComponent` throw and dead `--list` flag (`config-cli.ts:44,129,136`);
661
+ `listStashes`/`SourceListResult` (`source-manage.ts:36-39`);
662
+ `resolveRegistries` on the search path (`registry-search.ts:35`); the
663
+ `semanticSearch` projection branch (`helpers.ts:290`); curate's
664
+ colon-grammar family regexes (`curate.ts:769,779`); the
665
+ `session-log-failures` advisory hardwired to pass (`checks.ts:464-482`);
666
+ `setup.taskSchedules` schema key nothing reads or writes.
667
+ > Note (Q-02, ruled 2026-07-26): curate's colon-grammar family regexes
668
+ > (`curate.ts:769,779`) are now part of the mandated colon-removal sweep —
669
+ > schedule their deletion with the Q-02 work, not as standalone cleanup.
670
+
671
+ - **R-064 (P3) — dead fields threaded through live signatures.**
672
+ `IndexOptions.reEnrich` (flag removed, parameter still threaded three layers;
673
+ `stash-cli.ts:103-112`, `indexer.ts:179-183`); `IndexResponse.graphQuality`
674
+ (declared, never assigned); `acceptedActions` "always 0 since the 0.9.0
675
+ confidence-gate deletion" (`loop-stages.ts:746-750`); `durationMs` computed
676
+ then `void`-ed (`improve-cli.ts:359-360`); `SourceEntry.updatable` and
677
+ `.provider` set-but-never-read; `installedKitCount` (retired "Agent Kit
678
+ Manager" naming) still in the public JSON envelope of add/remove/update;
679
+ `workflow.db` still in the backup artifact set after the 0.9 state.db merge.
680
+
681
+ - **R-065 (P3) — stale comments that assert the opposite of adjacent code.**
682
+ `init.ts:9` ("ensures ripgrep is available" — nothing uses ripgrep);
683
+ `info.ts:57-61` (claims to avoid the `getDbPath()` call it makes);
684
+ `graph-extraction.ts:34-37` (describes retired fs.writeFile storage);
685
+ `history.ts:11-15` (`events.jsonl` vs actual `state.db`); the four
686
+ `TODO(R2)` markers in `workflows/program/{parser,schema}.ts` and
687
+ `ir/compile.ts` describing gate loops / retry / isolation / schema validation
688
+ as unimplemented — all four are implemented in `native-executor.ts`;
689
+ `reflect.ts:6` / `distill.ts` / `consolidate.ts` headers documenting
690
+ `akm reflect` etc. as CLI commands that were never registered;
691
+ `metrics.ts:270-274` documenting a deleted metric; `setup.ts:776` (R-016).
692
+
693
+ - **R-066 (P3) — duplicated logic.** Two secret-directory walkers
694
+ (`secret.ts:96-115` vs `secret-cli.ts:50-74`); `ACTIVE_RUN_WARN_MS` defined
695
+ twice (`health/types-result.ts:37`, `health/checks.ts:20`); the `--limit`
696
+ guard copy-pasted five times in `graph.ts`; `assertSetupSandbox` invoked
697
+ 2–3× per setup path; `getEffectiveRegistries()` exists but `registry list`
698
+ re-implements it inline.
699
+
700
+ - **R-067 (P3) — `process.exit()` mid-command bypasses cleanup.**
701
+ `env run`, `secret run` (`env-cli.ts:305`, `secret-cli.ts:257`), and
702
+ `runMigrationTool` exit directly, skipping the `disposeDispatchResources()`
703
+ finally in `cli.ts:663-665`.
704
+
705
+ - **R-068 (P3) — misc small fixes.** `show lines` coerces `start` with
706
+ `Number` and `end` with `parseInt` (NaN accepted, `search-cli.ts:206-212`);
707
+ `init` never checks `git init`'s exit status (`init.ts:183-188`);
708
+ `.akm-include` referenced in seven comments but the real mechanism is
709
+ `package.json` `akm.include`; the `semver` npm package is a runtime
710
+ dependency imported nowhere in `src/` while a hand-rolled subset rejects
711
+ valid ranges (`registry/semver.ts:58-99`); `graphPath` in every graph
712
+ command's output is the index.db path (field name fossil,
713
+ `graph-db.ts:471`); graph read commands open/close index.db twice per
714
+ invocation; `--belief` is described as memory-only but filters any entry
715
+ with a `beliefState` (`db-search.ts:770-787`).
716
+ > Ruled 2026-07-26 (Q-03): drop the `show lines` coercion sub-item — the
717
+ > `lines` view mode and the `normalizeShowArgv`/`--akmStart`/`--akmEnd`
718
+ > plumbing it lives in are deleted per D2, with fragment refs as the
719
+ > successor. The remaining sub-items stand.
720
+ > Status 2026-07-27: D2 has landed, so the `show lines` sub-item is now moot
721
+ > in code, not just ruled away. The remaining sub-items were not
722
+ > individually re-verified.
723
+
724
+ ---
725
+
726
+ ## Explicitly reclassified as in-scope (no issue filed)
727
+
728
+ Under the agent-toolkit identity, the following were reviewed and are **not**
729
+ defects of scope, only subject to the coherence/safety issues above:
730
+ `akm env`/`akm secret` (including run-injection and `${secret:}` interpolation),
731
+ `akm agent` and the ten harness integrations, the workflow engine including the
732
+ `brief`/`report` external-driver protocol, `akm tasks` and its three OS
733
+ backends, the improve/proposal/collapse-detector loop, and the health
734
+ observability surface.
735
+
736
+ Also noted as genuinely strong and worth preserving: the journaled
737
+ fs-transaction promotion/revert machinery, tar-extraction and website-crawl
738
+ SSRF hardening, git-URL scheme allowlisting, the exact-path git staging in
739
+ stash sync, the values-never-in-stdout secret discipline, and the uniform
740
+ `{ok, error, code, hint}` error envelope.