akm-cli 0.9.31 → 0.10.261001-beta
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 +409 -0
- package/STABILITY.md +99 -57
- package/dist/api-node.mjs +20 -0
- package/dist/api.d.ts +23 -0
- package/dist/api.js +45 -0
- package/dist/assets/hints/cli-hints-full.md +15 -29
- package/dist/assets/hints/cli-hints-short.md +2 -2
- package/dist/assets/improve-strategies/default.json +3 -3
- package/dist/assets/prompts/consolidate-pair.md +9 -7
- package/dist/assets/stash-skeleton/README.md +1 -1
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
- package/dist/cli/shared.js +31 -48
- package/dist/cli/unknown-flags.js +6 -43
- package/dist/cli.js +8 -34
- package/dist/commands/agent/contribute-cli.js +1 -1
- package/dist/commands/completions.js +1 -2
- package/dist/commands/config-cli.js +5 -28
- package/dist/commands/env/env-cli.js +5 -5
- package/dist/commands/env/secret-cli.js +2 -2
- package/dist/commands/feedback-cli.js +75 -49
- package/dist/commands/health/checks.js +41 -16
- package/dist/commands/health/plugin-staleness.js +52 -22
- package/dist/commands/improve/autonomy-gate.js +5 -3
- package/dist/commands/improve/consolidate/chunking.js +3 -10
- package/dist/commands/improve/consolidate/continuity-check.js +4 -4
- package/dist/commands/improve/consolidate/pair-pass.js +29 -10
- package/dist/commands/improve/consolidate.js +10 -65
- package/dist/commands/improve/distill/lesson-update.js +91 -0
- package/dist/commands/improve/distill-guards.js +1 -43
- package/dist/commands/improve/distill.js +148 -21
- package/dist/commands/improve/eligibility.js +14 -1
- package/dist/commands/improve/extract-cli.js +1 -1
- package/dist/commands/improve/extract-prompt.js +17 -7
- package/dist/commands/improve/extract.js +5 -7
- package/dist/commands/improve/improve-cli.js +92 -106
- package/dist/commands/improve/improve-strategies.js +8 -12
- package/dist/commands/improve/improve.js +134 -52
- package/dist/commands/improve/loop-stages.js +18 -5
- package/dist/commands/improve/planner.js +0 -1
- package/dist/commands/improve/preparation.js +40 -99
- package/dist/commands/improve/proactive-maintenance.js +2 -2
- package/dist/commands/improve/reflect-noise.js +3 -55
- package/dist/commands/improve/reflect.js +29 -34
- package/dist/commands/improve/retrieval-queries.js +37 -0
- package/dist/commands/improve/retrieval-scope.js +2 -2
- package/dist/commands/improve/salience.js +2 -9
- package/dist/commands/improve/session-asset.js +4 -1
- package/dist/commands/improve/stage.js +23 -12
- package/dist/commands/lint/index.js +5 -20
- package/dist/commands/observability-cli.js +3 -9
- package/dist/commands/proposal/drain.js +43 -6
- package/dist/commands/proposal/proposal-cli.js +11 -31
- package/dist/commands/proposal/repository.js +20 -14
- package/dist/commands/proposal/validators/proposal-quality-validators.js +0 -3
- package/dist/commands/read/knowledge.js +3 -3
- package/dist/commands/read/remember-cli.js +0 -13
- package/dist/commands/read/search-cli.js +29 -97
- package/dist/commands/read/search.js +0 -11
- package/dist/commands/read/show.js +0 -19
- package/dist/commands/sources/plugin-upgrade.js +164 -101
- package/dist/commands/sources/sources-cli.js +1 -15
- package/dist/commands/sources/stash-cli.js +6 -14
- package/dist/commands/tasks/tasks-cli.js +4 -115
- package/dist/commands/workflow/plan.js +11 -33
- package/dist/commands/workflow-cli.js +2 -7
- package/dist/core/adapter/adapter-ids.js +1 -2
- package/dist/core/adapter/adapters/agent-skills-adapter.js +0 -4
- package/dist/core/adapter/adapters/akm-adapter.js +9 -48
- package/dist/core/adapter/adapters/akm-lint.js +10 -26
- package/dist/core/adapter/adapters/akm-metadata.js +2 -72
- package/dist/core/adapter/adapters/akm-task-adapter.js +0 -5
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +9 -28
- package/dist/core/adapter/adapters/dotenv-adapter.js +1 -20
- package/dist/core/adapter/adapters/generic-files-adapter.js +0 -10
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +0 -4
- package/dist/core/adapter/adapters/tool-dir-shared.js +0 -24
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +4 -4
- package/dist/core/adapter/recognize-match.js +3 -4
- package/dist/core/common.js +18 -2
- package/dist/core/config/config-schema.js +12 -15
- package/dist/core/config/config-types.js +6 -15
- package/dist/core/config/config-walker.js +6 -23
- package/dist/core/config/config.js +17 -80
- package/dist/core/config/engine-semantics.js +7 -3
- package/dist/core/config/schema/engines.js +7 -7
- package/dist/core/config/schema/improve-processes.js +10 -63
- package/dist/core/config/schema/improve.js +2 -21
- package/dist/core/config/schema/index-config.js +6 -39
- package/dist/core/env-secret-ref.js +2 -45
- package/dist/core/errors.js +1 -2
- package/dist/core/extra-params.js +2 -86
- package/dist/core/file-lock.js +2 -6
- package/dist/core/improve-result.js +13 -1
- package/dist/core/mutation-target.js +2 -2
- package/dist/core/paths.js +4 -0
- package/dist/core/recognition-util.js +4 -5
- package/dist/core/run-lock.js +1 -1
- package/dist/core/subprocess.js +49 -0
- package/dist/core/warn.js +21 -4
- package/dist/core/write-source.js +3 -3
- package/dist/execution/target-ref.js +1 -2
- package/dist/indexer/indexer.js +15 -6
- package/dist/indexer/passes/memory-inference.js +15 -6
- package/dist/indexer/search/db-search.js +49 -36
- package/dist/indexer/search/fts-query.js +0 -19
- package/dist/indexer/search/ranking.js +29 -1
- package/dist/indexer/usage/usage-events.js +21 -16
- package/dist/integrations/agent/engine-resolution.js +5 -2
- package/dist/integrations/agent/index.js +1 -1
- package/dist/integrations/agent/profiles.js +41 -98
- package/dist/integrations/agent/request-lowering.js +3 -3
- package/dist/integrations/harnesses/aider/index.js +5 -0
- package/dist/integrations/harnesses/amazonq/index.js +1 -0
- package/dist/integrations/harnesses/claude/config-import.js +2 -3
- package/dist/integrations/harnesses/claude/index.js +5 -0
- package/dist/integrations/harnesses/codex/index.js +1 -0
- package/dist/integrations/harnesses/copilot/index.js +1 -0
- package/dist/integrations/harnesses/gemini/index.js +1 -0
- package/dist/integrations/harnesses/index.js +18 -39
- package/dist/integrations/harnesses/opencode/agent-builder.js +60 -35
- package/dist/integrations/harnesses/opencode/config-import.js +121 -52
- package/dist/integrations/harnesses/opencode/index.js +22 -0
- package/dist/integrations/harnesses/opencode/plugin-layout.js +68 -0
- package/dist/integrations/harnesses/opencode/session-log-types.js +12 -0
- package/dist/integrations/harnesses/opencode/session-log-v1.js +72 -0
- package/dist/integrations/harnesses/opencode/session-log-v2.js +140 -0
- package/dist/integrations/harnesses/opencode/session-log.js +104 -115
- package/dist/integrations/harnesses/opencode/version.js +98 -0
- package/dist/integrations/harnesses/opencode-sdk/{harness.js → index.js} +5 -17
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +105 -206
- package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +199 -0
- package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +254 -0
- package/dist/integrations/harnesses/opencode-sdk/wire.js +66 -0
- package/dist/integrations/harnesses/openhands/index.js +1 -0
- package/dist/integrations/harnesses/pi/index.js +1 -0
- package/dist/integrations/harnesses/shared.js +2 -0
- package/dist/integrations/harnesses/types.js +2 -0
- package/dist/llm/client.js +41 -11
- package/dist/output/cli-hints.js +1 -1
- package/dist/output/context.js +10 -19
- package/dist/output/format-exempt.js +5 -8
- package/dist/output/shapes/helpers.js +1 -22
- package/dist/output/shapes/passthrough.js +0 -1
- package/dist/output/shapes.js +3 -31
- package/dist/output/stdout.js +5 -1
- package/dist/output/text/command-format.js +6 -1
- package/dist/output/text/workflow-format.js +4 -22
- package/dist/scripts/akm-migrate-node.js +15745 -16711
- package/dist/scripts/akm-migrate.js +16318 -17280
- package/dist/setup/detect.js +10 -4
- package/dist/setup/harness-config-import.js +5 -14
- package/dist/setup/setup.js +1 -1
- package/dist/setup/steps/tasks.js +12 -13
- package/dist/sources/providers/git-stash.js +94 -13
- package/dist/storage/repositories/index-utility-repository.js +2 -32
- package/dist/storage/repositories/index-vec-repository.js +4 -0
- package/dist/storage/repositories/task-history-repository.js +0 -5
- package/dist/storage/repositories/workflow-runs-repository.js +5 -15
- package/dist/tasks/embedded.js +2 -1
- package/dist/tasks/run/run-command-task.js +9 -1
- package/dist/tasks/run/run-workflow-task.js +4 -3
- package/dist/tasks/run/task-history.js +0 -2
- package/dist/tasks/run/task-log.js +38 -1
- package/dist/tasks/schedule-gates.js +39 -0
- package/dist/tasks/scheduler-binding.js +0 -16
- package/dist/tasks/scheduler-sync.js +3 -97
- package/dist/tasks/source/bounded-document.js +1 -1
- package/dist/tasks/source/task-source-v4.js +2 -12
- package/dist/tasks/task-run-reserved-flags.js +2 -31
- package/dist/workflows/authoring/authoring.js +6 -6
- package/dist/workflows/compile.js +8 -65
- package/dist/workflows/exec/child-workflow.js +22 -3
- package/dist/workflows/exec/native-executor.js +12 -147
- package/dist/workflows/exec/run-workflow.js +31 -103
- package/dist/workflows/exec/step-work.js +9 -178
- package/dist/workflows/exec/unit-dispatch.js +0 -10
- package/dist/workflows/freeze/environment.js +3 -44
- package/dist/workflows/freeze/freeze.js +8 -41
- package/dist/workflows/freeze/targets/child-workflow.js +27 -63
- package/dist/workflows/freeze/targets/command.js +2 -16
- package/dist/workflows/freeze/targets/shell.js +0 -2
- package/dist/workflows/freeze/task-bindings.js +2 -28
- package/dist/workflows/ir/params.js +12 -2
- package/dist/workflows/parser.js +82 -232
- package/dist/workflows/plan.js +1 -1
- package/dist/workflows/renderer.js +10 -19
- package/dist/workflows/runtime/run-plan.js +11 -53
- package/dist/workflows/runtime/runs.js +4 -27
- package/dist/workflows/source-files.js +12 -16
- package/dist/workflows/source-semantics.js +1 -93
- package/docs/README.md +1 -1
- package/docs/agents/README.md +3 -3
- package/docs/agents/agent-install.md +1 -1
- package/docs/architecture/0.10-process-rules.md +827 -0
- package/docs/architecture/adapters.md +17 -31
- package/docs/architecture/architecture.md +4 -5
- package/docs/architecture/improvement.md +115 -76
- package/docs/architecture/internals/improve-workflow.md +22 -16
- package/docs/architecture/internals/indexing.md +1 -1
- package/docs/architecture/internals/search.md +1 -2
- package/docs/architecture/internals/storage-locations.md +6 -6
- package/docs/architecture/persisted-data-compat.md +13 -4
- package/docs/architecture/specs/0.9.0-decisions.md +6 -2
- package/docs/architecture/specs/improve-collapse-churn-detector-design.md +2 -2
- package/docs/architecture/specs/workflow-format-unification.md +1 -6
- package/docs/architecture/testing/manual-testing-checklist.md +21 -30
- package/docs/architecture/testing/task-workflow-manual-tests.md +106 -203
- package/docs/architecture/testing/testing-workflow.md +1 -1
- package/docs/architecture/workflow-engine.md +5 -56
- package/docs/guides/author-workflows.md +39 -69
- package/docs/guides/bundles.md +3 -1
- package/docs/guides/capture-knowledge.md +1 -1
- package/docs/guides/claude-code-vs-akm-workflows.md +1 -2
- package/docs/guides/discover-and-load.md +4 -4
- package/docs/guides/getting-started.md +1 -1
- package/docs/guides/improve-the-library.md +10 -9
- package/docs/guides/recipes/headless-install.md +2 -2
- package/docs/guides/run-workflows.md +1 -1
- package/docs/guides/scheduling.md +9 -1
- package/docs/guides/use-with-any-agent.md +49 -4
- package/docs/integration/bundling-akm.md +7 -6
- package/docs/maintainers/curate-workmap.md +1 -2
- package/docs/maintainers/release-checklist.md +33 -1
- package/docs/migration/README.md +2 -0
- package/docs/migration/release-notes/0.10.0.md +201 -0
- package/docs/migration/release-notes/README.md +1 -0
- package/docs/migration/v0.9-to-v0.10.md +507 -0
- package/docs/posts/akm-command-tour.md +3 -3
- package/docs/product-surface.md +1 -1
- package/docs/reference/README.md +1 -0
- package/docs/reference/api.md +65 -0
- package/docs/reference/asset-types.md +3 -5
- package/docs/reference/bundle-types.md +2 -4
- package/docs/reference/cli.md +160 -188
- package/docs/reference/configuration.md +101 -20
- package/docs/reference/data-and-telemetry.md +2 -2
- package/docs/reference/env-and-secrets.md +2 -2
- package/docs/reference/supported-formats.md +3 -4
- package/docs/reference/tasks.md +12 -19
- package/docs/reference/website-sources.md +1 -1
- package/docs/reference/workflow-schema.md +89 -317
- package/docs/reference/workflows.md +20 -48
- package/package.json +12 -2
- package/schemas/akm-config.json +2 -243
- package/schemas/akm-task.json +2 -3
- package/schemas/akm-workflow.json +47 -84
- package/dist/assets/improve-strategies/catchup.json +0 -41
- package/dist/assets/improve-strategies/proactive-maintenance.json +0 -24
- package/dist/assets/improve-strategies/quick.json +0 -17
- package/dist/assets/improve-strategies/reflect-distill.json +0 -29
- package/dist/assets/improve-strategies/thorough.json +0 -49
- package/dist/assets/prompts/retrieval-relevance-judge.md +0 -6
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +0 -6
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +0 -4
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +0 -4
- package/dist/cli/retired-commands.js +0 -118
- package/dist/commands/improve/retrieval-gate.js +0 -132
- package/dist/commands/tasks/validate.js +0 -176
- package/dist/core/config/legacy-source-shape-shim.js +0 -117
- package/dist/indexer/feedback/utility-policy.js +0 -75
- package/dist/integrations/harnesses/ids.js +0 -28
- package/dist/tasks/source/task-source-v3-frozen.js +0 -424
- package/dist/tasks/source/task-to-v4.js +0 -863
- package/dist/workflows/exec/worktree.js +0 -372
- package/dist/workflows/freeze/child-output-references.js +0 -83
- package/dist/workflows/freeze/identity.js +0 -22
- package/dist/workflows/freeze/targets/script.js +0 -50
- package/dist/workflows/freeze/targets/task.js +0 -124
- package/dist/workflows/github-yaml.js +0 -506
- package/dist/workflows/runtime/run-outputs.js +0 -80
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,401 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.10.261001] - 2026-10-12
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- **0.10 release numbers are monthly, `0.10.YYMMNN`, not daily (#1089).** The patch is the UTC year, the month and the
|
|
14
|
+
release within that month (`NN`, `01` to `99`), two digits each. Every release takes the next `NN`, whatever its
|
|
15
|
+
stage (`0.10.261001-alpha`, then `0.10.261002-beta`, then `0.10.261003`); a build is no longer promoted through
|
|
16
|
+
`-alpha`, `-beta` and `-rc` under one number. `bun scripts/release-version.ts next` now counts the month's releases on
|
|
17
|
+
npm, and the Release workflow rejects the old 8-digit `YYMMDDNN` form for a new release. **Known, accepted break:**
|
|
18
|
+
semver compares the patch numerically, so every `0.10.YYMMNN` sorts below the 0.10 daily alphas
|
|
19
|
+
(`0.10.26101001-alpha` to `0.10.26101202-alpha`), and `akm upgrade` will not offer it from one. The next release is
|
|
20
|
+
`0.10.261001-beta`; if you are on a 0.10 daily alpha, install it explicitly once
|
|
21
|
+
(`npm install -g akm-cli@0.10.261001-beta`), after which `akm upgrade` works as before.
|
|
22
|
+
|
|
23
|
+
### Deprecated
|
|
24
|
+
|
|
25
|
+
- **The `opencode` CLI dispatch path.** An agent engine with `platform: "opencode"`, which runs `opencode run` for each
|
|
26
|
+
call, still works on OpenCode 1 and 2 throughout 0.10, but is deprecated: use an `opencode-sdk` engine, which covers
|
|
27
|
+
it, including a default agent (#1098). It may be removed in 0.11 or later (STABILITY.md).
|
|
28
|
+
|
|
29
|
+
## [0.10.26101202] - 2026-10-12
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- **A signal to `akm agent` no longer leaves the CLI harness running (#1049).** `akm agent` on the `opencode`,
|
|
34
|
+
`claude` and `codex` CLI engines runs the harness in its own process group, so SIGTERM or SIGINT to akm ended akm and
|
|
35
|
+
left `opencode run` (and, on OpenCode 2, its `serve --stdio` child) running. The managed-subprocess primitive now runs
|
|
36
|
+
the timeout kill ladder on every live group child when akm gets such a signal with no handler of its own, then
|
|
37
|
+
re-raises it so akm still ends by the signal.
|
|
38
|
+
- **An OpenCode 2 SDK dispatch ends when akm rejects a permission request (#1049).** OpenCode 2 interrupts the step
|
|
39
|
+
(`aborted`, "Step interrupted") and goes idle without writing the closing `idle` message, so the dispatch waited out
|
|
40
|
+
its whole deadline. It now returns at once with `reason: "aborted"` and the declined tool call in `error`.
|
|
41
|
+
- **Documented: OpenCode permission defaults in a dispatch (#1049).** OpenCode 1 asks before reading or writing outside
|
|
42
|
+
the project directory; OpenCode 2 does not unless its config says `ask`, so akm's permission rejection only happens
|
|
43
|
+
on OpenCode 2 once you add that rule. akm changes no default. See [Configuration](docs/reference/configuration.md#engines).
|
|
44
|
+
|
|
45
|
+
## [0.10.26101201] - 2026-10-12
|
|
46
|
+
|
|
47
|
+
### Removed
|
|
48
|
+
|
|
49
|
+
- **Reflect's retrieval regression gate (#1171).** After the quality judge passed a revision, reflect graded the old and the new text against up to five of the asset's own retrieval queries and refused the revision (`quality_rejected`, a 14-day window) when the mean grade fell at all. Re-measured on 0.10 it refused 12-17% of the revisions the judge had passed and lowered defects fixed from 84 to 77 (35B) and from 92 to 77 (27B) of 96, now that reflect edits frontmatter only. A judge-passed revision is now minted as a proposal with no further check. This also removes the `retrieval-ungraded` review reason, the `retrievalRegression`/`retrievalUngraded` event metadata and the `retrieval-relevance-judge.md` prompt. No config key existed for the gate, so no config changes.
|
|
50
|
+
|
|
51
|
+
## [0.10.26101101] - 2026-10-11
|
|
52
|
+
|
|
53
|
+
### Changed
|
|
54
|
+
|
|
55
|
+
- **A manual fix to an asset applies at once.** `akm feedback --negative ... --replace/--with/--source`, `--superseded-by` and `--outdated` used to queue a `feedback` proposal that waited for `akm proposal accept` and expired after 90 days. The command now files the proposal and accepts it in the same run, through the ordinary accept (a git-backed bundle gets the usual commit; `akm proposal revert` undoes it), with gate decision `manual-fix` and no judge. If the accept refuses, the proposal is rejected, the file is untouched and the command fails. The edited asset stays eligible for every improve process.
|
|
56
|
+
- **`akm improve` syncs before it runs, not only after (#1091).** A live run on a git-backed bundle now does the same
|
|
57
|
+
fetch / fast-forward-or-merge / commit / push as `akm sync` right after taking its lock and before the index and plan
|
|
58
|
+
stages, so it plans from what other hosts pushed. It honours `--no-sync` and `--no-push`. A conflict or fetch failure
|
|
59
|
+
warns and the run continues on the local state; the outcome is `preRunSync` on the result and a `stash_synced` event
|
|
60
|
+
with `phase: "pre-run"`. Pending hand edits in the managed paths are committed by it, as `akm sync` would.
|
|
61
|
+
- **Reflect no longer locks an asset for 14 days over an uncertain verdict; it asks a person.** A reflect revision the
|
|
62
|
+
quality judge does not pass but scores 3.5 or more (the judge's own review label begins at 2.5) is now queued as a
|
|
63
|
+
pending proposal for a person (`judge-uncertain`, with the per-criterion scores and the judge's reason) and records
|
|
64
|
+
no `quality_rejected` window; a lower score is refused as before. Likewise a retrieval check that cannot grade a
|
|
65
|
+
revision (transport error, timeout, unreadable reply) queues it for a person (`retrieval-ungraded`) instead of
|
|
66
|
+
refusing it as a regression, and a distill lesson or promotion whose judge is missing at judge time is queued for
|
|
67
|
+
review instead of recording a 30-day `quality_rejected` window. Triage never accepts any of these. `akm proposal
|
|
68
|
+
list` shows the reason as `gate=deferred:<reason>`.
|
|
69
|
+
- **Feedback now changes `akm search` and `akm curate` ranking, as `akm feedback` always said it did.** The fused
|
|
70
|
+
score is scaled by `1 + 0.03 x (ln(1 + positives) - ln(1 + negatives))`, counting the user's recorded feedback
|
|
71
|
+
events for the asset (improve, task and audit feedback does not count). The rule is the same for every asset, rises
|
|
72
|
+
with each positive and falls with each negative, and gains less per vote as votes pile up: about +2% / +3% / +5% /
|
|
73
|
+
+9% for 1 / 2 / 5 / 20 positives, so an asset with 5 positives outranks one with 2, and the effect reorders close
|
|
74
|
+
matches without overriding relevance. The counts are read from `state.db` in one query per search. `utility_scores`
|
|
75
|
+
is still written and read by improve and metrics, but search does not use it.
|
|
76
|
+
- **`akm feedback` reports the real ranking effect.** `rankingUpdate.applied` in its output used to mean the utility
|
|
77
|
+
EMA write succeeded, which no longer has anything to do with ranking. It is now `true` exactly when the recorded
|
|
78
|
+
event is user-attributed (the events search counts) and `false` with a reason for improve, task, audit or unknown
|
|
79
|
+
attribution; a utility-write failure only warns and no longer flips it.
|
|
80
|
+
- **Utility has one formula and one implementation.** `akm feedback` used to move utility with its own bounded step
|
|
81
|
+
toward the cumulative positive share while `akm index` recomputed the same table with a different formula, so the
|
|
82
|
+
stored value depended on which ran last. `akm feedback` now calls the indexer's `recomputeUtilityScores` for the one
|
|
83
|
+
entry (user-attributed events only), so the value it stores is the one `akm index` would compute at that moment; the
|
|
84
|
+
bounded-step code (`utility-policy.ts`) is removed. A first positive on an entry with no utility row now gives 0.3
|
|
85
|
+
(the old start was 0.5). Search still does not read utility.
|
|
86
|
+
|
|
87
|
+
### Fixed
|
|
88
|
+
|
|
89
|
+
- **The 02:00 nightly `akm improve` can no longer lose its night to the consolidate task's lock.** The shipped
|
|
90
|
+
`akm-improve-consolidate` task (`20 */4 * * *`) kept the default 2-hour budget, so a 00:20 run could still hold
|
|
91
|
+
`improve.lock` at 02:00 and the nightly (deliberately without `--skip-if-locked`) failed with `IMPROVE_LOCK_HELD`.
|
|
92
|
+
The consolidate task now passes `--timeout-ms 3600000`; the nightly is unchanged.
|
|
93
|
+
- **Scheduled command tasks (`uses: commands/…`) get the 6-hour unattended default timeout.** Only workflow and native
|
|
94
|
+
shell/script tasks had it, so a wedged engine call could hold a command task forever. An explicit task `timeout:`,
|
|
95
|
+
an engine timeout, or `timeout: null` still wins.
|
|
96
|
+
- **`akm search` no longer warns "no embedding provider is configured" on a default install.** With
|
|
97
|
+
`semanticSearchMode: auto` and no embedding settings, search uses the built-in local model, so the warning was
|
|
98
|
+
false on every query. It now fires only for a remote `embedding.endpoint` set without `embedding.model` (the one
|
|
99
|
+
config that cannot work), and the remedy names that field.
|
|
100
|
+
- **`akm sync` fetches the remote and brings other hosts' changes in before it pushes.** It used to check the stale
|
|
101
|
+
local tracking ref, so once another host had pushed, the lease push failed and `akm sync` exited 70 instead of
|
|
102
|
+
committing, and a two-host filesystem bundle never converged. A writable bundle with a remote now fetches, then
|
|
103
|
+
fast-forwards (or merges with git's default merge) the upstream, then pushes; a host with nothing to commit still
|
|
104
|
+
receives the upstream. A merge that conflicts is aborted, your commit stays, the push is skipped, and
|
|
105
|
+
`reason` reads `not pushed: merging upstream conflicts in <files> ...`. A failed fetch likewise only skips the push.
|
|
106
|
+
`--no-push` and read-only bundles never touch the network.
|
|
107
|
+
- **The end-of-run improve sync reports `committed: true` when only the push failed.** The commit had landed, but the
|
|
108
|
+
result and the `stash_synced` event said `committed: false`.
|
|
109
|
+
- **The extract per-session lock no longer reclaims a live holder.** It was reclaimed once its file was five minutes
|
|
110
|
+
old, but one session can hold it across two extraction attempts and the summary call, so a session-end hook racing
|
|
111
|
+
the improve run processed the session twice. Only a lock whose holder process is dead is reclaimed, as with the
|
|
112
|
+
improve run lock.
|
|
113
|
+
- **Memory inference writes to the default bundle, not the first bundle in the list.** The pass took `sources[0]`, so
|
|
114
|
+
it relied on list order and did nothing, silently, when that entry was not an akm bundle. It now selects the source
|
|
115
|
+
flagged as the default bundle and warns when there is none or when it is not an akm bundle.
|
|
116
|
+
- **Memory inference no longer reverts a parent memory's frontmatter edit.** The `inferenceProcessed` stamp rewrote
|
|
117
|
+
frontmatter parsed before the model call, so an edit made to the memory in the meantime (accepted proposal,
|
|
118
|
+
feedback hash) was lost. The stamp now adds its key to the file's current frontmatter.
|
|
119
|
+
- **The session summary prompt fences the transcript as untrusted.** Extract's summary call sent the raw, unfiltered
|
|
120
|
+
event stream with no boundary, so a crafted session could steer the text written into the session asset. It now
|
|
121
|
+
uses the same pre-filter and the same `UNTRUSTED SESSION TRANSCRIPT` fence, with forged fence markers neutralised,
|
|
122
|
+
as the extraction call.
|
|
123
|
+
- **`akm proposal revert` of a retirement still works after the 30-day archive purge.** When the graced purge has
|
|
124
|
+
deleted the archived copy, the primary is restored byte for byte from the proposal's recorded `backupContent`
|
|
125
|
+
instead of the revert refusing. A file that now occupies the path is still never overwritten.
|
|
126
|
+
- **Retire proposals can no longer become permanent.** They now expire by age like every other proposal (`akm proposal
|
|
127
|
+
reopen` brings one back, so the old "never expires" rationale is gone), a staged one whose file or successor is gone
|
|
128
|
+
or changed is auto-rejected once as `stale-target` instead of failing every drain run, and an expired or stale-target
|
|
129
|
+
retire proposal no longer counts as a person's rejection that settles its pair.
|
|
130
|
+
- **The consolidate pair pass no longer marks assets judged when they have no stored embedding.** With
|
|
131
|
+
`semanticSearchMode: off` (or before an asset is embedded) the neighbour query could not run, yet the pass wrote a
|
|
132
|
+
`judged_no_action` row that held the asset until its body changed. It now writes no row for such an asset, so
|
|
133
|
+
enabling embeddings reconsiders it, and warns once per run that the pair pass needs stored embeddings.
|
|
134
|
+
- **A transient reflect failure no longer consumes the feedback that planned it.** A transport error, parse error,
|
|
135
|
+
timeout, budget abort or crash wrote a `failed` ledger row that advanced the signal cursor, so the ref was not
|
|
136
|
+
retried until new feedback arrived. Like distill, these now write no row; guard rejections and quality rejections
|
|
137
|
+
are unchanged.
|
|
138
|
+
- **The per-run `akm improve` and `akm index` log files are now purged by the retention pass.**
|
|
139
|
+
`$CACHE/logs/improve/<ISO>.log` and `$CACHE/logs/index/<ISO>.log` were outside the purge and grew without bound;
|
|
140
|
+
they now follow `improve.eventRetentionDays` like the task log files.
|
|
141
|
+
- **A run hard-killed by the budget watchdog now leaves a record and banks its writes.** The forced `process.exit(0)`
|
|
142
|
+
(exit code unchanged) skipped every finally block, so the run left no `improve_runs` row and the files it had
|
|
143
|
+
written were never committed. Before exiting, the watchdog now records the run as terminated
|
|
144
|
+
(`budget_exhausted`) and makes the same provenance-scoped auto-sync commit, without pushing.
|
|
145
|
+
|
|
146
|
+
### Changed
|
|
147
|
+
|
|
148
|
+
- **`captureMode: hot` memories are consolidated like any other memory.** The pair pass may now retire one, the promote
|
|
149
|
+
pass may promote one (accepting archives the source, as for any memory), and a chunk of only hot memories goes to the
|
|
150
|
+
model instead of being skipped as judged no-action. The hot-specific retire guard, chunk skip and promote-prompt
|
|
151
|
+
annotation are gone; `akm remember` still writes `captureMode: hot`.
|
|
152
|
+
|
|
153
|
+
## [0.10.26101002] - 2026-10-10
|
|
154
|
+
|
|
155
|
+
### Changed
|
|
156
|
+
|
|
157
|
+
- **Triage accepts up to 200 proposals per run by default, up from 25.** The consolidate pair pass stages about 90
|
|
158
|
+
pairs a night on a real stash, so a lower cap let the review queue grow every night. `maxAcceptsPerRun` still bounds
|
|
159
|
+
a run, and `akm proposal drain` uses the same default.
|
|
160
|
+
- **`akm improve <scope>` warns when the scope matches no asset.** A type scope that matches nothing in the stash
|
|
161
|
+
(`akm improve typo`, `improve skills`, `improve memorys`) prints one warning on stderr naming the scope and, for a
|
|
162
|
+
near-miss of a real type, the likely intended one. The exit code and the empty plan are unchanged, and a valid scope
|
|
163
|
+
with nothing eligible does not warn.
|
|
164
|
+
|
|
165
|
+
## [0.10.26101001] - 2026-10-10
|
|
166
|
+
|
|
167
|
+
### Added
|
|
168
|
+
|
|
169
|
+
- **OpenCode 2 is the primary OpenCode integration; OpenCode 1 keeps working (#1049).** akm detects the major from
|
|
170
|
+
the engine's binary (`<bin> --version`, once per binary per process; `opencode2` is preferred when it is on PATH)
|
|
171
|
+
and drives it through a per-major adapter for SDK dispatch (`opencode-sdk`, on `@opencode/client` 2.0.26 or
|
|
172
|
+
`@opencode-ai/sdk` 1.2.20), CLI dispatch (`opencode run`, which adds `--standalone` on OpenCode 2 so no background
|
|
173
|
+
service is left running), session history (chosen from `opencode.db`'s own tables, read-only, with retained
|
|
174
|
+
OpenCode 1 rows still readable after a native upgrade) and native config import. OpenCode 1 warns once that
|
|
175
|
+
upgrading is recommended; a binary of an unknown major is driven as OpenCode 2 with a warning, never refused.
|
|
176
|
+
`akm upgrade` and `akm health` know the `akm-opencode-v2` plugin beside `akm-opencode`.
|
|
177
|
+
- **`akm-cli/api`: the one supported programmatic entry point.** `curate(query, { limit, type, format })` returns
|
|
178
|
+
exactly the stdout of `akm --detail agent -q curate …`, computed in-process, and rejects with the CLI's message and
|
|
179
|
+
`code`. It is for in-process recall by the akm plugins; everything else stays CLI-only. `package.json` gains an
|
|
180
|
+
`exports` map (`./api`, `./package.json`, `./dist/*`); `bin` and `files` behave as before. See
|
|
181
|
+
[`docs/reference/api.md`](docs/reference/api.md).
|
|
182
|
+
- **Distill extends an existing lesson that a memory repeats (#1090).** When the writer's lesson repeats one the library
|
|
183
|
+
holds (the judge scores its non-redundancy 2 or below), or the writer answers `NONE` with a lesson nearby, distill
|
|
184
|
+
asks for that lesson's body again with the lines the memory adds. If every existing line is kept, and the judge
|
|
185
|
+
passes the added lines against the lesson and the memory, the update is a pending proposal on the lesson's own
|
|
186
|
+
ref (reason `distill-update`, with the lesson's before-hash), left for a person: the triage drain does not accept
|
|
187
|
+
it. Otherwise nothing is proposed and the outcome is what it was. The result and the `distill_invoked` event carry
|
|
188
|
+
`updatesExisting: true`. No new setting; it needs the quality gate.
|
|
189
|
+
|
|
190
|
+
### Removed
|
|
191
|
+
|
|
192
|
+
- **The GitHub-shaped YAML workflow format (#1096).** A `.yml` workflow (`name`/`on`/`jobs`, one job, `uses:` and `run:`
|
|
193
|
+
steps) is gone, with everything that existed only to carry it: workflow-step `uses: tasks/<ref>` (task composition),
|
|
194
|
+
`uses: scripts/<ref>` and `uses: commands/<ref>` targets, the `with:` rejection classifier for them, YAML `on.schedule`
|
|
195
|
+
triggers (and the scheduler sync of them), and the `script` frozen target. `.yml` under `workflows/` is skipped at
|
|
196
|
+
index time with a message saying it must use `.md`. Nothing in the owner's bundle or in OpenPalm used it. **Kept:** a
|
|
197
|
+
task that runs a workflow (`uses: workflows/<ref>`, or a `run:` calling `akm workflow run`) is a task feature and is
|
|
198
|
+
unchanged. A stored run whose plan has a `script` target can no longer be decoded and is abandoned like any other
|
|
199
|
+
undecodable plan.
|
|
200
|
+
- **Top-level workflow `outputs:` (#1096).** Its only consumer was a parent reading a child's exports. A completed
|
|
201
|
+
child workflow now returns the output of its last step, so `outputs:` is a lint error and the child-output reference
|
|
202
|
+
check at freeze is gone; a parent reads `steps.<composing-step>.output`. The `outputs_json` column stays readable.
|
|
203
|
+
- **Workflow `route` steps (#1096).** A step can no longer declare `route:` (branch on a value to a later step). It was
|
|
204
|
+
unused by any workflow found, and its cost was the replay journal for route decisions and cascaded skips. Branching is
|
|
205
|
+
an `exec` step or an agent step that reads its inputs, plus a gate for "go back and fix it". `route` is now an
|
|
206
|
+
unknown-key lint error; a stored plan that still has a route step cannot be decoded, so that run is abandoned.
|
|
207
|
+
- **`unit.isolation: worktree` (#1096).** A workflow unit can no longer declare per-attempt git-worktree isolation
|
|
208
|
+
(`exec/worktree.ts` and the attempt prepare/cleanup in the native executor). It was unused by any workflow found, and
|
|
209
|
+
the largest standalone block in the engine. `unit.isolation` is now an unknown-key lint error; a stored plan that
|
|
210
|
+
still carries it decodes and runs the unit in the engine's working directory. The `worktree_path` columns stay readable.
|
|
211
|
+
- **Runtime conversion of config older than 0.9.15 (#1091).** 0.10 reads what 0.9.15 and later wrote; an install on an
|
|
212
|
+
earlier release runs `akm migrate apply` under akm 0.9.x first. Removed: the in-memory `stashDir`/`sources[]`/
|
|
213
|
+
`installed[]` to `bundles` conversion (`legacy-source-shape-shim.ts`), the `engines.*.extraParams` lift onto
|
|
214
|
+
`temperature`/`maxTokens`/`enableThinking`/`reasoningEffort`, and the `{kind, ref, sourceId}` write-back of
|
|
215
|
+
`scheduler.enabled` that kept 0.9.16 able to read what a newer release wrote (0.10 writes plain refs, still reads the
|
|
216
|
+
object form). A config with a retired source key now fails to load with one message naming `akm migrate apply` under
|
|
217
|
+
akm 0.9.x; a legacy `extraParams` key is refused with the first-class field to set. Kept, because 0.9.15 or 0.9.16
|
|
218
|
+
wrote them: scheduler adoption for a config with no `scheduler.enabled`, the `{kind, ref, sourceId}` reader, and the
|
|
219
|
+
irVersion 5 frozen-plan reader (there was no separate irVersion 4 reader to remove). `akm migrate apply` and
|
|
220
|
+
`akm migrate status` are unchanged for 0.9.15 and later data; the task-source migrator moved to
|
|
221
|
+
`scripts/akm-migrate/migrate/`. See `STABILITY.md` and `docs/architecture/persisted-data-compat.md`.
|
|
222
|
+
- **The `quick`, `reflect-distill`, `thorough` and `catchup` built-in improve strategies, and the `akm-improve-frequent`
|
|
223
|
+
and `akm-improve-catchup` task templates (#1130).** Measured (nightly eval, n=3, `gpt-5.6-terra` and `qwen3.8-27b`):
|
|
224
|
+
`quick` solved 0.76 / 0.75 items against `default`'s 0.92 / 0.89, `reflect-distill` 0.78 / 0.77, and `thorough` (the
|
|
225
|
+
judged triage drain) 0.67 / 0.70 with harmed items at 9 / 6.3 (unsafe retirements accepted, an exact fix applied
|
|
226
|
+
unreviewed); `catchup` was identical to `consolidate` on the pool (it differed only in the judged triage drain, `maxChunkSize` 50 instead of 25, and `minPoolSize: 0`, which is already the default). An `improve.strategies.<name>` block with one of
|
|
227
|
+
these names stays valid as an ordinary user-defined strategy, but it now inherits `default` and no longer carries the
|
|
228
|
+
old built-in's settings (for example the triage drain). `--strategy` or `defaults.improveStrategy` naming one with no
|
|
229
|
+
such block fails at resolution with an error that names `default`; config load still succeeds. The shipped
|
|
230
|
+
`akm-improve-nightly` task would now run `default` at 02:15, the same as the `core/improve` task at 02:00, and the
|
|
231
|
+
hourly `akm-improve-frequent` task would only repeat that pass; `akm-improve-catchup` ran the same `consolidate` as
|
|
232
|
+
`akm-improve-consolidate`. All three are gone, and setup's server-install preselection now suggests `core/improve`. A task copied from
|
|
233
|
+
any of them into a bundle keeps its `--strategy` and must be changed to `default` or `consolidate`. (#1130)
|
|
234
|
+
- **The high-salience improve lane and `improve.salience.salienceThreshold` (#1129).** The lane admitted nothing in
|
|
235
|
+
the measurement and was reachable only by back-dating feedback. The key still loads from an old config with a
|
|
236
|
+
warning and does nothing; `akm migrate apply` drops it. The `high-salience` lane name stays valid on rows older releases wrote.
|
|
237
|
+
- **The `proactive-maintenance` built-in improve strategy (#1129).** The lane now lives in `default`. A
|
|
238
|
+
`improve.strategies.proactive-maintenance` block in your config keeps working as a user-defined strategy, merged
|
|
239
|
+
onto `default`; `defaults.improveStrategy: "proactive-maintenance"` without such a block still loads and fails
|
|
240
|
+
when improve runs, with the same "removed in 0.10" error as `quick` and the other removed strategies (#1130).
|
|
241
|
+
- **`BundleAdapter.placeNew()` (internal, #1091).** The optional adapter method, its nine implementations and their
|
|
242
|
+
tests were never called: every write already resolves through the fixed type-to-directory table. No behaviour
|
|
243
|
+
change. Writable bundles in a layout other than akm's own would need it back; see #1163.
|
|
244
|
+
|
|
245
|
+
### Changed
|
|
246
|
+
|
|
247
|
+
- **Child workflows are kept in a simple form (#1096).** A markdown step declares `unit: { workflow: workflows/<name>,
|
|
248
|
+
with: { <param>: <literal or { from: <reference> }> } }` and the engine starts the child as its own run and drives it
|
|
249
|
+
to completion; the child's last step output is the composing step's output. The form is Experimental. The freeze,
|
|
250
|
+
idempotent publish, resume, blocked-child recovery, cycle check and `workflow list --children` behaviour of the existing
|
|
251
|
+
child executor is unchanged.
|
|
252
|
+
- **`default` drains the proposal queue through the deterministic gates (#1143).** The `default` strategy now runs
|
|
253
|
+
triage in `promote` mode with judgment off, up to `maxAcceptsPerRun: 25` accepts per run, so the backlog drains
|
|
254
|
+
without `experimental.improveAutonomy`. The nightly eval's baseline is exactly this path (`proposal drain --promote`
|
|
255
|
+
without judgment): 0.91 (terra) and 0.89 (qwen) of items solved, 0 to 1 harmed; the judged drain is what caused
|
|
256
|
+
harm (#1132). The autonomy gate's `triagePromote` lane is now gated only when the triage stage has judgment on: a
|
|
257
|
+
promote with judgment on and no opt-in is still downgraded to `queue` and reported (`improve_skipped`,
|
|
258
|
+
`akm task doctor`). Memory inference and memory cleanup stay gated. No new setting. (#1143)
|
|
259
|
+
- **`akm improve` plans the proactive-maintenance lane's picks again, and the lane is on in `default` (#1129).**
|
|
260
|
+
Measured on assets with silent defects and no feedback (8 planted): 0 fixed with the picks scored only, 6 to 7 with
|
|
261
|
+
them planned, no harm, about five times the model calls. The picks carry the `proactive` lane on their
|
|
262
|
+
proposals. The cap against a proposal flood already existed and is now consistent: `maxPerRun` limits the picks per
|
|
263
|
+
run, `dueDays` (30) admits only an asset not reflected or distilled for 30 days, and reflect's `limit` (25) bounds
|
|
264
|
+
the run. The code fallback for `maxPerRun` is 15, the shipped value, where it was 25. No new setting.
|
|
265
|
+
`--require-feedback-signal` turns the lane off for a run.
|
|
266
|
+
- **The judged drain accepts only consolidate promotions, and no built-in strategy turns judgment on (#1132).** On the
|
|
267
|
+
nightly eval, judging every proposal kind with `experimental.improveAutonomy` solved about half the items
|
|
268
|
+
(0.49 gpt-5.6-terra, 0.53 qwen3.8-27b) and harmed 14 and 11, changing 18 and 21 notes outside the planted set: it
|
|
269
|
+
accepted unsafe retirements and applied exact fixes unreviewed. Judging promotions alone was reasonable. The judgment
|
|
270
|
+
tier now accepts only a consolidate promotion; any other kind it would accept (a retirement, an exact fix, a reflect
|
|
271
|
+
revision) is left for a person with reason `judgment-not-promotion`, whatever the strategy says. `thorough`, `catchup`,
|
|
272
|
+
`reflect-distill` and `proactive-maintenance` no longer enable triage judgment. Deterministic promote gates are
|
|
273
|
+
unchanged. (#1132)
|
|
274
|
+
- **Built-in improve strategies are patches onto `default`, not "complete presets" (#1130).** `docs/reference/configuration.md`
|
|
275
|
+
said otherwise; the strategy list in the docs, the `--strategy` help and the hints now name only `default`
|
|
276
|
+
and `consolidate`. (#1130)
|
|
277
|
+
- **A proposal from the proactive lane waits for a person (#1147).** With the lane on in `default` and the default
|
|
278
|
+
drain promoting through the deterministic gates, a reflect edit on an asset with no feedback was accepted unattended
|
|
279
|
+
once reflect's judge passed it (the nightly eval showed `when_to_use`, `type` and provenance stamps and a title
|
|
280
|
+
heading added to assets no one had asked about). `proposal drain` now never accepts a proposal whose
|
|
281
|
+
`eligibilitySource` is `proactive`, through a deterministic gate, the judgment tier or an earlier staged accept: it is
|
|
282
|
+
left for review with reason `proactive-needs-review` (and is not sent to the judgment tier). Feedback-driven
|
|
283
|
+
proposals (`signal-delta`, `scope`) are unchanged. No new setting. (#1147)
|
|
284
|
+
- **0.10 releases are daily builds, `0.10.YYMMDDNN`, with `-alpha`, `-beta` and `-rc` stages (#1089).** The patch
|
|
285
|
+
number is the UTC year, month and day plus the build that day (`NN`, `01` to `99`), two digits each: the first build
|
|
286
|
+
on 2026-10-10 is `0.10.26101001`. A prerelease carries its stage only (`0.10.26101001-alpha`, no `.N`), so one build
|
|
287
|
+
is promoted `-alpha` < `-beta` < `-rc` < `0.10.26101001`; prereleases publish to the npm `next` tag and stable builds
|
|
288
|
+
to `latest`. The Release workflow validates the format and takes a new `stage` input (`scripts/release-version.ts`);
|
|
289
|
+
`bun scripts/release-version.ts next` prints the next free build number for today from the versions on npm. Versions
|
|
290
|
+
sort by date across months and years, so `akm upgrade` and semver ranges order them correctly. The 0.9 line keeps
|
|
291
|
+
`0.9.N`. See `STABILITY.md`. (#1089)
|
|
292
|
+
|
|
293
|
+
### Removed
|
|
294
|
+
|
|
295
|
+
- **Six improve knobs that measured no effect (#1131).** Each is removed with the code that served only it; a config
|
|
296
|
+
that still sets one loads (named once by the unknown-key warning, dropped by `akm migrate apply`).
|
|
297
|
+
- `processes.consolidate.antiCollapse`: the random cluster-member injection. Identical results with it off on an
|
|
298
|
+
80-memory pool.
|
|
299
|
+
- `processes.consolidate.p90ChunkSecondsDefault`: the up-front budget cap on the consolidation pool keeps its
|
|
300
|
+
behaviour with a fixed 30 s per chunk. Identical at 10, 30 and 90 s under a 180 s budget.
|
|
301
|
+
- `processes.consolidate.minPoolSize`: the minimum-pool skip, its `pool_below_min_size` `improve_skipped` reason and
|
|
302
|
+
the `minPoolSize` / `gates.minimumPool` fields of the consolidation plan. It was bypassed by `--strategy`, and the
|
|
303
|
+
documented default (500) differed from the code's (0). `improve_runs` rows that carry the plan fields still read.
|
|
304
|
+
- `processes.distill.fidelityCheck`: the negation-pattern contradiction check. No difference at n=3.
|
|
305
|
+
- `processes.reflect.lowValueFilter`: the low-value tier of the reflect noise classifier. Reflect edits only
|
|
306
|
+
frontmatter, which the filter always passes. No-op and cosmetic edits are still refused.
|
|
307
|
+
- `improve.salience.outcomeWeightEnabled`: the toggle and its parity weights. The outcome term stays on
|
|
308
|
+
(w_e 0.25, w_o 0.15, w_r 0.60), as it was by default.
|
|
309
|
+
|
|
310
|
+
- **`akm workflow create --reset` (#1091).** Declared since 0.9.12 as a deprecated alias of `--force`, never read.
|
|
311
|
+
`--force` alone replaces a workflow with a fresh template; `--force --from <file>` replaces it from the file.
|
|
312
|
+
- **`akm improve --plan` (#1091).** An exact alias of `--dry-run` with no other callers. Use `--dry-run`; it prints the
|
|
313
|
+
same `plan.processes` routing table.
|
|
314
|
+
- **`akm task list` (#1091).** A delegating alias of `akm search --type task` (added in 0.9.15, #951) with no callers
|
|
315
|
+
in the plugins, akm-eval or OpenPalm. Use `akm search --type task`.
|
|
316
|
+
- **Improve config keys nothing read (#1091).** `processes.distill.limit`, `processes.memoryInference.cls`,
|
|
317
|
+
`processes.proactiveMaintenance.limit` (an alias of `maxPerRun`) and `triage.policy` (set in the shipped `default`
|
|
318
|
+
strategy, read by no code) are gone from the schema and the shipped strategy. A config that still sets one loads
|
|
319
|
+
(named once by the unknown-key warning). `plan.triage.maxDiffLines` leaves the plan type; stored runs that carry it,
|
|
320
|
+
or `plan.proactive.configured.limit`, still decode. `processes.distill.cls` is read and stays. OpenPalm's improve
|
|
321
|
+
editor writes the strategy-level `limit`, not per-process ones, so the process `limit` of reflect and consolidate
|
|
322
|
+
stays.
|
|
323
|
+
- **The `targetVocab: 2` marker on `task_history` rows, and the `"mcp"` package keyword (#1091).** Nothing read the
|
|
324
|
+
marker since migration 025 backfilled the old result vocabulary, so new rows no longer carry it and a stored one is
|
|
325
|
+
ignored; its newer-than-2 warning is gone. akm has no MCP code left, so `package.json` no longer lists `mcp`.
|
|
326
|
+
- **The hard-error and bespoke-warning hints for old config keys (#1091).** `defaults.llm`, `defaults.agent` and
|
|
327
|
+
`defaults.improve` (rejected since 0.9), the `feedbackDistillation` process (rejected since 0.8.0), and the engine
|
|
328
|
+
settings under `index.<pass>` and `index.stalenessDetection` (dropped with a bespoke message) now load like any other
|
|
329
|
+
unknown key: named once by the unknown-key warning, ignored, and dropped by `akm migrate apply`.
|
|
330
|
+
- **`akm improve --auto-accept` is a hard error (#1091).** It was removed in 0.9.0 and has been accepted-and-warned
|
|
331
|
+
since; it is now an unknown flag like any other (exit 2), and `--auto-accept 90` no longer reaches the scope. Use
|
|
332
|
+
`akm improve && akm proposal drain --promote --yes`, or a `triage` block with `applyMode: "promote"`.
|
|
333
|
+
- **The hint tables for the 0.9.0 renames (#1091).** `RETIRED_COMMAND_HINTS` (39 entries), `RETIRED_FLAG_HINTS` (5) and
|
|
334
|
+
`SELF_DIAGNOSED_FLAGS` (`src/cli/retired-commands.ts` is gone), the per-command `--target`, `--source`, `--scope`,
|
|
335
|
+
`--enrich`/`--re-enrich` and `proposal drain --profile` rejections, the `akm improve canary` scope rejection, the
|
|
336
|
+
`akm show` colon-ref tip and the `<type>:` search tip. A retired command is now an ordinary `UNKNOWN_COMMAND` (with a
|
|
337
|
+
did-you-mean when one is close, within a third of the name's length) and a retired flag an ordinary `UNKNOWN_FLAG`
|
|
338
|
+
(exit 2), with no migration pointer. The same goes for the `--from stash|both` rename error (a bundle may now be named
|
|
339
|
+
`stash`), the `vault:`/`env:`/`secret:` ref rejections (`env/`, `secrets/`, `secret://` and `${secret:NAME}` are
|
|
340
|
+
unchanged), the `config get` replacement hints for `stashDir`, `sources`, `installed`, `wiki`, `wikiName` and `llm`,
|
|
341
|
+
and the retired-spelling notes in the agent hints.
|
|
342
|
+
`task run`/`task explain` no longer reserve the input name `target`, so a task may declare an input of that name.
|
|
343
|
+
`akm improve canary` is now an asset-type scope that matches nothing.
|
|
344
|
+
- **`akm help agents` (#1091).** It printed the same two guides as `akm hints` with the opposite default (short, with
|
|
345
|
+
`--full` for the complete one). `akm hints` is the one command: the complete guide by default, `--detail brief` for the
|
|
346
|
+
short one (`akm help agents >> AGENTS.md` becomes `akm hints --detail brief >> AGENTS.md`). `akm help agents` is now an
|
|
347
|
+
ordinary unknown command.
|
|
348
|
+
- **`--shape` (#1091).** It acted on three commands (`search`, `curate`, `show`; `summary` only on `show`) while about 55
|
|
349
|
+
others ignored it and `--detail`. `--detail agent` replaces `--shape agent`, and `--detail` now takes
|
|
350
|
+
`brief|normal|full|agent`. `--shape summary` had no caller; use `--detail brief` on `show`. `--shape` is an unknown flag
|
|
351
|
+
(exit 2, `UNKNOWN_FLAG`) with no alias, so callers must change in step: the akm plugins, akm-eval's retrieval,
|
|
352
|
+
skillret and longmemeval benchmarks, and `akm help agents`-style scripts. `INVALID_SHAPE_VALUE` is gone, and
|
|
353
|
+
`INVALID_DETAIL_VALUE` now lists `agent`. The CLI reference no longer claims `--shape summary` errors outside `show`
|
|
354
|
+
(it warned and fell back to `agent`).
|
|
355
|
+
- **`--target` on `import`, `env create`, `env remove`, `secret set` and `proposal accept`/`diff`/`revert` (#1091).**
|
|
356
|
+
`--bundle` is the one write-destination flag, as on `remember`, `clone`, `improve` and `task`; `--target` is an
|
|
357
|
+
unknown flag (exit 2) with no alias. The plugins, akm-eval and OpenPalm pass no `--target`. Errors and hints that said
|
|
358
|
+
`--target` now say `--bundle`.
|
|
359
|
+
- **`akm task validate` (#1091).** Folded into `akm lint --type tasks`, as `akm workflow validate` was. Lint already parsed
|
|
360
|
+
every task file through the same version router; it now also runs the two gates `akm task sync` runs before it installs
|
|
361
|
+
a schedule (the cron suits the local scheduler backend; each schedule entry's `inputs` satisfy the declared contract),
|
|
362
|
+
so it never reports clean a task sync would refuse. Gone with the command: the `valid`/`blocked`/`invalid`/`not-a-task`
|
|
363
|
+
outcome, the `resolved` shape and the bare-path argument (point `akm lint --dir` at a bundle root). The
|
|
364
|
+
owner's crontab and tasks, the plugins, akm-eval and OpenPalm do not call it.
|
|
365
|
+
- **`akm config path --all` (#1091).** `akm info` already reports the bundle, config, data, cache and state directories
|
|
366
|
+
(the index is `<dataDir>/index.db`), and `--all` was the one place `config path` printed an envelope instead of a bare
|
|
367
|
+
path. `akm config path` still prints the config file path and still runs when the config itself fails to load; `--all`
|
|
368
|
+
is an unknown flag (exit 2). Hints that sent you to `config path --all` now say `akm info`.
|
|
369
|
+
- **`akm improve report` and `akm improve judge` are real subcommands (#1091).** They were magic values of the `scope`
|
|
370
|
+
positional. Both spellings keep working. `--run` and `--since` are now flags of `report` alone, so `akm improve --run x`
|
|
371
|
+
and `akm improve skills --since 7d` are unknown flags (exit 2) instead of a usage error from a hand-written check;
|
|
372
|
+
`--strategy` is `judge`'s own flag too. `akm improve [scope]` is unchanged, and `akm-eval`'s judge-gate keeps calling
|
|
373
|
+
`akm improve judge`.
|
|
374
|
+
|
|
375
|
+
### Fixed
|
|
376
|
+
|
|
377
|
+
- **A workflow param's `default:` is now applied (#1096).** An omitted param was absent from the run and the unit
|
|
378
|
+
prompt said `Run parameters: {}`, so workflows restated their defaults in prose. A run now starts with each declared
|
|
379
|
+
default for the params it was not given; explicit values still win.
|
|
380
|
+
- **A call recovered by the retry without the schema is one successful call in the usage rows.** The failed schema
|
|
381
|
+
attempt (`format_ignored` or a 4xx schema rejection) was recorded as a failed call with 0 tokens next to the retry's
|
|
382
|
+
success, so `akm improve` usage showed e.g. `distill freellm/gpt-oss:120b calls 1 failures 1` beside 17 successes. Only
|
|
383
|
+
the retry is recorded now; a retry that also fails is still one failure.
|
|
384
|
+
- **Distill's lesson update (#1139) is judged as the lesson it makes, and costs a call only for a lesson that is named.**
|
|
385
|
+
The judge read only the added lines as a standalone lesson, so a single added fact failed `reusable` and no update
|
|
386
|
+
passed (0 of 8 on the akm-eval `lesson-update` class, on two models). It now reads the extended lesson (old body plus
|
|
387
|
+
added lines) as one lesson, in the same single call: reusable and grounded as a whole (a line is grounded when the
|
|
388
|
+
memory or the lesson states it), and each added line must state something the lesson does not already hold. An update is also tried only for a related lesson that the writer's NONE reason, or the judge's
|
|
389
|
+
non-redundancy finding, names, or for the only related lesson, not for every lesson among the nearest three. The
|
|
390
|
+
update writer lists the memory's new facts before the body, and an update that lists none is not proposed. (#1090)
|
|
391
|
+
- **consolidate's pair judge no longer lets a later date alone make one note replace another (#1134).** After the
|
|
392
|
+
same-age fix (#1146), `gpt-oss:120b` retired notes about a different named thing (two partners on one template:
|
|
393
|
+
"B is newer and replaces Alder with Birch") as `supersedes`, 1 to 2 unsafe retirements of 60 per run where the build
|
|
394
|
+
before it had none. The pair prompt now says a note replaces another only when both are about the same named thing
|
|
395
|
+
(service, integration, partner, component, region, file), and that notes about different named things never replace
|
|
396
|
+
each other whatever their dates; `unrelated` covers different named things written to one layout. Measured with
|
|
397
|
+
akm-eval `evals/consolidate`, per-case n=3: `gpt-oss:120b` unsafe retirements 1, 2, 1 -> 0, 0, 0 with recall
|
|
398
|
+
0.97 -> 0.99; qwen3.8-27b stays at 0 unsafe, recall 0.70.
|
|
399
|
+
- **A gateway that answers 5xx `format_ignored` no longer fails every schema call (#1150).** A `provider_error` 5xx whose
|
|
400
|
+
body names the response format (`format_ignored`, `response_format` or `json_schema`) is now answered like the 4xx
|
|
401
|
+
schema rejection: one retry without the schema, remembered for the connection. `gpt-oss:120b` through the lab
|
|
402
|
+
gateway needed `supportsJsonSchema: false` set by hand. Other 5xx answers keep the transient-retry path. (#1150)
|
|
403
|
+
|
|
9
404
|
## [0.9.31] - 2026-10-09
|
|
10
405
|
|
|
11
406
|
A patch release: concurrent config writes no longer lose a change, OpenAI's reasoning models work as `llm`
|
|
@@ -13,6 +408,16 @@ engines, `akm improve --require-engines` probes send API keys, and the npm packa
|
|
|
13
408
|
|
|
14
409
|
### Fixed
|
|
15
410
|
|
|
411
|
+
- **consolidate's pair judge no longer reads two same-age notes with different values as an update (#1134).** On the
|
|
412
|
+
60 labelled pairs `gpt-5.6-terra` retired 10 notes that held a claim the kept note lacked, in every run, always
|
|
413
|
+
from the ten `contradicts` pairs: it labelled them `supersedes`, because the prompt called B "newer" although both
|
|
414
|
+
notes had the same file time, and listed no claim for the old value because "updates" were left out of the lists.
|
|
415
|
+
The judge now sees "A (same age as B)" / "B (same age as A)" when the dates tie, and a different value counts as a
|
|
416
|
+
replacement only when B says so or is created later; otherwise both values are listed and the pair is
|
|
417
|
+
`contradicts`. Measured with akm-eval `evals/consolidate`, n=3 per-case: terra unsafe retirements 10 of 60 ->
|
|
418
|
+
1 to 3 (first prompt) and 0 on the final build's first run; qwen3.8-27b stays at 0 unsafe, recall 0.69 -> 0.71.
|
|
419
|
+
Pool (80 memories): terra 2 unsafe per run -> 0 to 2; qwen 0, recall 0.77 -> 0.79.
|
|
420
|
+
|
|
16
421
|
- **`akm improve --require-engines` sends each engine's API key with its probe.** The probe used the engine's
|
|
17
422
|
connection as resolved, where the key is still a symbolic reference that a dispatch reads only when it sends a
|
|
18
423
|
request, so every keyed endpoint (OpenAI, a gateway that enforces auth) answered 401 and the run stopped with
|
|
@@ -56,6 +461,10 @@ plugin on a host that follows `akm-opencode@next`.
|
|
|
56
461
|
|
|
57
462
|
- **`akm upgrade` is Stable**, including its plugin step and `--next`, after real-host, empty-container and
|
|
58
463
|
failure-path runs on 0.9.28 (#1099).
|
|
464
|
+
- **`akm proposal extract` and the improve `extract` process move from Experimental to Evolving.** The extract eval
|
|
465
|
+
(akm-eval `evals/extract`, n=3) measured insights saved 1.00 (terra) / 0.97 (qwen), routine sessions left empty
|
|
466
|
+
1.00, and planted instructions saved 0. Evolving rather than Stable because 0.10 is still settling the improve
|
|
467
|
+
defaults; the eval stays its gate (#1133).
|
|
59
468
|
|
|
60
469
|
### Fixed
|
|
61
470
|
|