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.
- package/CHANGELOG.md +41 -0
- package/README.md +10 -10
- package/ROADMAP.md +112 -0
- package/dist/commands/improve/improve-cli.js +33 -12
- package/dist/commands/sources/plugin-upgrade.js +46 -23
- package/dist/core/file-lock.js +10 -1
- package/dist/llm/client.js +33 -3
- package/dist/scripts/akm-migrate-node.js +5 -1
- package/dist/scripts/akm-migrate.js +5 -1
- package/docs/README.md +42 -41
- package/docs/agents/README.md +15 -0
- package/docs/agents/agent-install.md +14 -0
- package/docs/architecture/README.md +67 -0
- package/docs/architecture/adapters.md +272 -0
- package/docs/architecture/akm-architecture-decision-history.md +2055 -0
- package/docs/architecture/akm-core-principles.md +126 -0
- package/docs/architecture/architecture.md +579 -0
- package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +550 -0
- package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +72 -0
- package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +142 -0
- package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +189 -0
- package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +97 -0
- package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +108 -0
- package/docs/architecture/decisions/0006-task-source-version-routing.md +124 -0
- package/docs/architecture/decisions/0007-workflow-composition-bounds.md +83 -0
- package/docs/architecture/decisions/0008-task-binding-normalization.md +88 -0
- package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +80 -0
- package/docs/architecture/decisions/0010-driver-protocol-cut.md +36 -0
- package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +125 -0
- package/docs/architecture/decisions/README.md +62 -0
- package/docs/architecture/improvement.md +440 -0
- package/docs/architecture/internals/classification.md +154 -0
- package/docs/architecture/internals/fresh-host-rebuild-runbook.md +40 -0
- package/docs/architecture/internals/functional-contract-patterns.md +340 -0
- package/docs/architecture/internals/health-advisories.md +110 -0
- package/docs/architecture/internals/improve-workflow.md +713 -0
- package/docs/architecture/internals/indexing.md +498 -0
- package/docs/architecture/internals/registry-network-boundary.md +57 -0
- package/docs/architecture/internals/search.md +249 -0
- package/docs/architecture/internals/storage-locations.md +943 -0
- package/docs/architecture/persisted-data-compat.md +59 -0
- package/docs/architecture/reviews/env-secret-access.md +319 -0
- package/docs/architecture/runtime-boundary-design.md +153 -0
- package/docs/architecture/specs/0.9.0-close-out-plan.md +361 -0
- package/docs/architecture/specs/0.9.0-decisions.md +528 -0
- package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +745 -0
- package/docs/architecture/specs/0.9.0-open-items-register.md +135 -0
- package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +740 -0
- package/docs/architecture/specs/0.9.0-release-surface-review.md +636 -0
- package/docs/architecture/specs/agent-command-engine-model-design.md +513 -0
- package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +501 -0
- package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +291 -0
- package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +2059 -0
- package/docs/architecture/specs/di-seams-plan.md +539 -0
- package/docs/architecture/specs/driver-protocol-keep-or-cut.md +275 -0
- package/docs/architecture/specs/fact-asset-type.md +142 -0
- package/docs/architecture/specs/improve-collapse-churn-detector-design.md +634 -0
- package/docs/architecture/specs/okf-support.md +148 -0
- package/docs/architecture/specs/ref.md +329 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/README.md +72 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +152 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +352 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +300 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +402 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +758 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +645 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +602 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +27 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +27 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +74 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +15 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +132 -0
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +147 -0
- package/docs/architecture/specs/stash-conventions-code-spec.md +275 -0
- package/docs/architecture/specs/stash-organization-conventions.md +377 -0
- package/docs/architecture/specs/task-workflow-format-unification.md +721 -0
- package/docs/architecture/specs/workflow-engine-buy-vs-build.md +231 -0
- package/docs/architecture/specs/workflow-format-unification.md +437 -0
- package/docs/architecture/testing/manual-testing-checklist.md +3420 -0
- package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +924 -0
- package/docs/architecture/testing/task-workflow-manual-tests.md +1817 -0
- package/docs/architecture/testing/testing-workflow.md +446 -0
- package/docs/architecture/workflow-engine.md +274 -0
- package/docs/guides/README.md +33 -0
- package/docs/guides/author-bundles.md +310 -0
- package/docs/guides/author-workflows.md +520 -0
- package/docs/guides/bundles.md +321 -0
- package/docs/guides/capture-knowledge.md +136 -0
- package/docs/guides/claude-code-vs-akm-workflows.md +30 -0
- package/docs/guides/concepts.md +93 -0
- package/docs/guides/discover-and-load.md +158 -0
- package/docs/guides/getting-started.md +240 -0
- package/docs/guides/improve-the-library.md +246 -0
- package/docs/guides/knowledge-management.md +18 -0
- package/docs/guides/recipes/headless-install.md +97 -0
- package/docs/guides/recipes/website-source.md +28 -0
- package/docs/guides/run-workflows.md +279 -0
- package/docs/guides/scheduling.md +123 -0
- package/docs/guides/use-with-any-agent.md +129 -0
- package/docs/guides/wikis.md +81 -0
- package/docs/maintainers/README.md +19 -0
- package/docs/maintainers/curate-workmap.md +336 -0
- package/docs/maintainers/eval.md +3 -0
- package/docs/maintainers/local-development.md +108 -0
- package/docs/maintainers/release-checklist.md +103 -0
- package/docs/migration/README.md +2 -2
- package/docs/migration/release-notes/0.0.13.md +1 -1
- package/docs/migration/release-notes/0.1.0.md +1 -1
- package/docs/migration/release-notes/0.2.0.md +1 -1
- package/docs/migration/release-notes/0.3.0.md +1 -1
- package/docs/migration/release-notes/0.5.0.md +1 -1
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +1 -1
- package/docs/migration/release-notes/0.7.3.md +2 -2
- package/docs/migration/release-notes/0.7.4.md +1 -1
- package/docs/migration/release-notes/0.7.5.md +1 -1
- package/docs/migration/release-notes/0.8.0.md +1 -1
- package/docs/migration/release-notes/0.9.0.md +1 -1
- package/docs/migration/release-notes/0.9.14.md +1 -1
- package/docs/migration/release-notes/0.9.15.md +1 -1
- package/docs/migration/release-notes/0.9.16.md +1 -1
- package/docs/migration/release-notes/0.9.17.md +1 -1
- package/docs/migration/release-notes/0.9.19.md +1 -1
- package/docs/migration/release-notes/0.9.2.md +1 -1
- package/docs/migration/release-notes/README.md +27 -31
- package/docs/migration/v0.5-to-v0.6.md +759 -0
- package/docs/migration/v0.8-to-v0.9.md +1 -1
- package/docs/plans/0.9.2-agent-command-workflow-plan.md +423 -0
- package/docs/posts/README.md +30 -0
- package/docs/posts/akm-command-tour.md +495 -0
- package/docs/posts/akm-logo-sized.webp +0 -0
- package/docs/posts/belief-aware-memory-12.md +139 -0
- package/docs/posts/config-v2-lessons-16.md +191 -0
- package/docs/posts/improve-loop-autonomous-10.md +225 -0
- package/docs/posts/improve-pipeline-debugging-0803.md +179 -0
- package/docs/posts/intro-part-01.md +76 -0
- package/docs/posts/intro-part-02.md +221 -0
- package/docs/posts/intro-part-03.md +190 -0
- package/docs/posts/intro-part-04.md +221 -0
- package/docs/posts/llm-mode-reflect-13.md +166 -0
- package/docs/posts/openpalm-built-on-akm.md +86 -0
- package/docs/posts/progressive-disclosure-06.md +129 -0
- package/docs/posts/proposal-safety-net-15.md +112 -0
- package/docs/posts/release-0.5.0.md +247 -0
- package/docs/posts/release-0.6.0.md +117 -0
- package/docs/posts/release-0.7.0.md +159 -0
- package/docs/posts/release-0.8.0.md +332 -0
- package/docs/posts/scattered-skills-05.md +100 -0
- package/docs/posts/task-assets-persistent-workflows-11.md +222 -0
- package/docs/posts/team-skills-07.md +198 -0
- package/docs/posts/wiki-agent-knowledge-08.md +223 -0
- package/docs/posts/workflows-vaults-09.md +321 -0
- package/docs/product-surface.md +54 -0
- package/docs/reference/README.md +1 -2
- package/docs/reference/asset-types.md +168 -0
- package/docs/reference/cli.md +5 -6
- package/docs/reference/env-and-secrets.md +126 -0
- package/docs/reference/memory.md +124 -0
- package/docs/reference/refs.md +156 -0
- package/docs/reference/registry.md +489 -0
- package/docs/reference/website-sources.md +141 -0
- 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.
|