akm-cli 0.9.17-alpha.3 → 0.9.17-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/CHANGELOG.md +731 -0
  2. package/dist/akm +94 -196
  3. package/dist/cli/shared.js +6 -2
  4. package/dist/cli.js +22 -9
  5. package/dist/commands/agent/agent-dispatch.js +1 -1
  6. package/dist/commands/command/command-execution.js +24 -62
  7. package/dist/commands/feedback-cli.js +0 -1
  8. package/dist/commands/health/accept-rate.js +2 -2
  9. package/dist/commands/health/checks.js +30 -75
  10. package/dist/commands/health/config-skew.js +38 -0
  11. package/dist/commands/health/egress.js +54 -0
  12. package/dist/commands/health/html-report.js +0 -38
  13. package/dist/commands/health/improve-metrics.js +123 -562
  14. package/dist/commands/health/plugin-staleness.js +53 -3
  15. package/dist/commands/health/renderers.js +12 -4
  16. package/dist/commands/health/report-view-model.js +11 -106
  17. package/dist/commands/health/types-improve.js +4 -19
  18. package/dist/commands/health/windows.js +64 -73
  19. package/dist/commands/health.js +122 -143
  20. package/dist/commands/improve/consolidate/chunking.js +25 -100
  21. package/dist/commands/improve/consolidate/sanitize.js +54 -149
  22. package/dist/commands/improve/consolidate.js +538 -1075
  23. package/dist/commands/improve/content-hash.js +16 -24
  24. package/dist/commands/improve/distill/content-repair.js +18 -100
  25. package/dist/commands/improve/distill-guards.js +20 -81
  26. package/dist/commands/improve/distill-promotion-policy.js +23 -243
  27. package/dist/commands/improve/distill.js +608 -1075
  28. package/dist/commands/improve/eligibility.js +126 -400
  29. package/dist/commands/improve/execution.js +3 -5
  30. package/dist/commands/improve/extract.js +487 -1046
  31. package/dist/commands/improve/feedback-valence.js +0 -25
  32. package/dist/commands/improve/improve-cli.js +29 -166
  33. package/dist/commands/improve/improve-result-file.js +10 -66
  34. package/dist/commands/improve/improve-strategies.js +12 -7
  35. package/dist/commands/improve/improve-usage-report.js +18 -64
  36. package/dist/commands/improve/improve.js +443 -1063
  37. package/dist/commands/improve/ledger.js +114 -0
  38. package/dist/commands/improve/locks.js +2 -8
  39. package/dist/commands/improve/loop-stages.js +459 -1172
  40. package/dist/commands/improve/memory/derived-ref.js +12 -77
  41. package/dist/commands/improve/memory/memory-belief.js +14 -118
  42. package/dist/commands/improve/memory/memory-improve.js +4 -3
  43. package/dist/commands/improve/outcome-loop.js +28 -156
  44. package/dist/commands/improve/planner.js +5 -10
  45. package/dist/commands/improve/preparation.js +851 -2339
  46. package/dist/commands/improve/proactive-maintenance.js +34 -101
  47. package/dist/commands/improve/reflect-noise.js +104 -280
  48. package/dist/commands/improve/reflect.js +621 -1367
  49. package/dist/commands/improve/salience.js +46 -232
  50. package/dist/commands/improve/session-asset.js +19 -100
  51. package/dist/commands/improve/stage.js +323 -0
  52. package/dist/commands/proposal/drain.js +251 -644
  53. package/dist/commands/proposal/proposal-cli.js +3 -18
  54. package/dist/commands/proposal/proposal-types.js +20 -41
  55. package/dist/commands/proposal/proposal.js +1 -2
  56. package/dist/commands/proposal/propose.js +134 -160
  57. package/dist/commands/proposal/repository.js +502 -1487
  58. package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
  59. package/dist/commands/proposal/validators/proposal-validators.js +1 -1
  60. package/dist/commands/proposal/validators/proposals.js +13 -89
  61. package/dist/commands/read/curate.js +63 -413
  62. package/dist/commands/read/search-cli.js +16 -33
  63. package/dist/commands/read/search.js +17 -23
  64. package/dist/commands/read/show.js +2 -13
  65. package/dist/commands/sources/bundle-cli.js +25 -2
  66. package/dist/commands/sources/bundle-config-ops.js +7 -0
  67. package/dist/commands/sources/dangerous-env-audit.js +1 -2
  68. package/dist/commands/sources/info.js +2 -11
  69. package/dist/commands/sources/installed-stashes.js +197 -746
  70. package/dist/commands/sources/schema-repair.js +98 -129
  71. package/dist/commands/sources/source-add.js +62 -12
  72. package/dist/commands/sources/stash-cli.js +1 -1
  73. package/dist/commands/tasks/explain.js +10 -13
  74. package/dist/commands/tasks/tasks-cli.js +9 -8
  75. package/dist/commands/tasks/tasks.js +326 -930
  76. package/dist/commands/tasks/validate.js +42 -21
  77. package/dist/commands/workflow/plan.js +22 -29
  78. package/dist/commands/workflow-cli.js +4 -4
  79. package/dist/core/adapter/adapters/akm-adapter.js +0 -1
  80. package/dist/core/adapter/adapters/akm-lint.js +2 -3
  81. package/dist/core/adapter/adapters/akm-metadata.js +11 -12
  82. package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
  83. package/dist/core/adapter/execution-source.js +17 -29
  84. package/dist/core/asset/resolve-ref.js +1 -1
  85. package/dist/core/bundle-id.js +42 -5
  86. package/dist/core/bundle-rename.js +291 -0
  87. package/dist/core/config/config-io.js +1 -2
  88. package/dist/core/config/config-schema.js +1 -33
  89. package/dist/core/config/config-walker.js +1 -1
  90. package/dist/core/config/config.js +163 -68
  91. package/dist/core/config/legacy-source-shape-shim.js +38 -9
  92. package/dist/core/config/schema/embedding.js +20 -5
  93. package/dist/core/config/schema/engines.js +5 -0
  94. package/dist/core/config/schema/execution.js +1 -1
  95. package/dist/core/config/schema/experimental.js +1 -1
  96. package/dist/core/config/schema/improve-processes.js +21 -95
  97. package/dist/core/config/schema/improve.js +4 -42
  98. package/dist/core/config/schema/scheduler.js +12 -12
  99. package/dist/core/config/schema/search.js +6 -22
  100. package/dist/core/env-secret-ref.js +0 -1
  101. package/dist/core/errors.js +8 -9
  102. package/dist/core/file-lock.js +76 -173
  103. package/dist/core/logs-db.js +2 -2
  104. package/dist/core/paths.js +0 -27
  105. package/dist/core/redaction.js +109 -2
  106. package/dist/core/run-lock.js +2 -5
  107. package/dist/core/spawn-env.js +1 -1
  108. package/dist/core/state/migrations.js +108 -61
  109. package/dist/core/state-db-scope.js +2 -4
  110. package/dist/core/state-db.js +126 -692
  111. package/dist/core/type-presentation.js +1 -9
  112. package/dist/core/write-source.js +293 -1012
  113. package/dist/execution/input-contract.js +1 -1
  114. package/dist/execution/resolved-request.js +135 -689
  115. package/dist/execution/source.js +63 -257
  116. package/dist/execution/target-ref.js +1 -1
  117. package/dist/indexer/bundle-identity-guard.js +2 -2
  118. package/dist/indexer/db/graph-db.js +106 -46
  119. package/dist/indexer/ensure-index.js +44 -85
  120. package/dist/indexer/graph/graph-extraction.js +340 -562
  121. package/dist/indexer/graph/graph-related.js +130 -0
  122. package/dist/indexer/index-rebuild-lock.js +3 -11
  123. package/dist/indexer/index-writer-lock.js +8 -17
  124. package/dist/indexer/index-written-assets.js +139 -151
  125. package/dist/indexer/indexer.js +524 -846
  126. package/dist/indexer/materialize-embeddings.js +60 -397
  127. package/dist/indexer/passes/memory-inference.js +81 -90
  128. package/dist/indexer/passes/metadata.js +132 -200
  129. package/dist/indexer/read-preflight.js +0 -7
  130. package/dist/indexer/scan/doc-to-entry.js +1 -3
  131. package/dist/indexer/scan/drain-dir.js +1 -1
  132. package/dist/indexer/search/db-search.js +181 -590
  133. package/dist/indexer/search/fts-query.js +30 -41
  134. package/dist/indexer/search/ranking.js +28 -154
  135. package/dist/indexer/search/search-attribution.js +12 -32
  136. package/dist/indexer/search/search-fields.js +11 -15
  137. package/dist/indexer/search/search-hit-enrichers.js +54 -85
  138. package/dist/indexer/search/search-source.js +1 -4
  139. package/dist/indexer/usage/usage-events.js +2 -7
  140. package/dist/integrations/agent/engine-fallback.js +23 -40
  141. package/dist/integrations/agent/engine-resolution.js +93 -183
  142. package/dist/integrations/agent/execution.js +507 -0
  143. package/dist/integrations/agent/model-map.js +28 -156
  144. package/dist/integrations/agent/request-lowering.js +66 -141
  145. package/dist/integrations/agent/runner-dispatch.js +143 -321
  146. package/dist/integrations/agent/runner.js +54 -14
  147. package/dist/integrations/lockfile.js +53 -101
  148. package/dist/llm/embedders/deterministic.js +2 -3
  149. package/dist/llm/embedders/profile.js +71 -0
  150. package/dist/llm/embedders/remote.js +10 -15
  151. package/dist/llm/graph-extract.js +3 -12
  152. package/dist/llm/index-passes.js +3 -5
  153. package/dist/llm/memory-infer.js +1 -2
  154. package/dist/llm/metadata-enhance.js +1 -2
  155. package/dist/llm/structured-call.js +5 -24
  156. package/dist/output/generic-render.js +23 -11
  157. package/dist/output/html-render.js +13 -10
  158. package/dist/output/render-registry.js +3 -32
  159. package/dist/output/shapes/helpers.js +2 -34
  160. package/dist/output/shapes/passthrough.js +1 -9
  161. package/dist/{indexer/search/ranking-types.js → output/text/bundle-rename.js} +4 -1
  162. package/dist/output/text/command-format.js +60 -23
  163. package/dist/output/text/helpers.js +1 -1
  164. package/dist/output/text/migrate.js +5 -14
  165. package/dist/output/text/proposal-format.js +1 -2
  166. package/dist/output/text/workflow-format.js +0 -32
  167. package/dist/output/text.js +2 -0
  168. package/dist/registry/factory.js +4 -19
  169. package/dist/registry/network.js +66 -220
  170. package/dist/registry/providers/index.js +0 -2
  171. package/dist/registry/providers/skills-sh.js +3 -14
  172. package/dist/registry/providers/static-index.js +24 -26
  173. package/dist/registry/resolve.js +55 -131
  174. package/dist/scripts/akm-migrate-node.js +43937 -93313
  175. package/dist/scripts/akm-migrate.js +43697 -93071
  176. package/dist/setup/registry-stash-loader.js +4 -13
  177. package/dist/setup/semantic-assets.js +3 -44
  178. package/dist/setup/setup.js +1 -1
  179. package/dist/setup/steps/tasks.js +25 -15
  180. package/dist/sources/provider-factory.js +17 -18
  181. package/dist/sources/providers/filesystem.js +2 -3
  182. package/dist/sources/providers/git-install.js +7 -1
  183. package/dist/sources/providers/git-provider.js +0 -3
  184. package/dist/sources/providers/git-stash.js +0 -17
  185. package/dist/sources/providers/npm.js +2 -4
  186. package/dist/sources/providers/provider-utils.js +5 -10
  187. package/dist/sources/providers/website.js +0 -2
  188. package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
  189. package/dist/sources/website-url.js +2 -2
  190. package/dist/storage/database.js +9 -35
  191. package/dist/storage/repositories/improve-ledger-repository.js +168 -0
  192. package/dist/storage/repositories/index-connection.js +34 -70
  193. package/dist/storage/repositories/index-entries-repository.js +69 -111
  194. package/dist/storage/repositories/index-entry-mapper.js +1 -2
  195. package/dist/storage/repositories/index-entry-schema.js +83 -269
  196. package/dist/storage/repositories/index-fts-repository.js +86 -256
  197. package/dist/storage/repositories/index-llm-cache-repository.js +17 -0
  198. package/dist/storage/repositories/index-meta-repository.js +6 -4
  199. package/dist/storage/repositories/index-schema.js +192 -220
  200. package/dist/storage/repositories/index-utility-repository.js +8 -29
  201. package/dist/storage/repositories/index-vec-repository.js +133 -414
  202. package/dist/storage/repositories/outcome-repository.js +2 -1
  203. package/dist/storage/repositories/proposals-repository.js +35 -0
  204. package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
  205. package/dist/storage/repositories/task-history-repository.js +26 -4
  206. package/dist/storage/repositories/workflow-runs-repository.js +53 -244
  207. package/dist/storage/sqlite-migrations.js +136 -0
  208. package/dist/storage/sqlite-pragmas.js +11 -9
  209. package/dist/storage/sqlite-transaction.js +170 -0
  210. package/dist/storage/state-db-integrity.js +34 -27
  211. package/dist/tasks/activation-config.js +134 -62
  212. package/dist/tasks/backends/cron.js +129 -277
  213. package/dist/tasks/backends/exec-utils.js +2 -5
  214. package/dist/tasks/backends/launchd.js +125 -745
  215. package/dist/tasks/backends/schtasks.js +101 -620
  216. package/dist/tasks/prepare/prepare-support.js +5 -15
  217. package/dist/tasks/prepare/prepare.js +0 -2
  218. package/dist/tasks/resolve-akm-bin.js +20 -79
  219. package/dist/tasks/run/attempt-lifecycle.js +0 -1
  220. package/dist/tasks/scheduler-binding.js +18 -238
  221. package/dist/tasks/scheduler-invocation.js +52 -52
  222. package/dist/tasks/scheduler-lock.js +53 -0
  223. package/dist/tasks/scheduler-sync.js +361 -751
  224. package/dist/tasks/source/parse-task-source.js +160 -10
  225. package/dist/tasks/source/task-source-v3-frozen.js +3 -4
  226. package/dist/tasks/source/task-to-v4.js +2 -2
  227. package/dist/workflows/authoring/authoring.js +3 -12
  228. package/dist/workflows/compile.js +211 -0
  229. package/dist/workflows/concurrency-policy.js +13 -74
  230. package/dist/workflows/exec/child-invocation.js +3 -17
  231. package/dist/workflows/exec/child-workflow.js +32 -141
  232. package/dist/workflows/exec/dispatch-redaction.js +13 -53
  233. package/dist/workflows/exec/environment.js +98 -0
  234. package/dist/workflows/exec/exec-unit.js +33 -140
  235. package/dist/workflows/exec/frozen-judge.js +7 -59
  236. package/dist/workflows/exec/native-executor.js +82 -341
  237. package/dist/workflows/exec/param-secrets.js +29 -47
  238. package/dist/workflows/exec/run-workflow.js +154 -387
  239. package/dist/workflows/exec/scheduler.js +9 -36
  240. package/dist/workflows/exec/step-work.js +127 -430
  241. package/dist/workflows/exec/unit-dispatch.js +11 -63
  242. package/dist/workflows/exec/unit-writer.js +8 -52
  243. package/dist/workflows/exec/worktree.js +39 -273
  244. package/dist/workflows/freeze/child-output-references.js +4 -15
  245. package/dist/workflows/freeze/environment.js +99 -92
  246. package/dist/workflows/freeze/freeze.js +172 -0
  247. package/dist/workflows/freeze/step-values.js +19 -21
  248. package/dist/workflows/freeze/targets/child-workflow.js +23 -92
  249. package/dist/workflows/freeze/targets/command.js +10 -33
  250. package/dist/workflows/freeze/targets/script.js +5 -12
  251. package/dist/workflows/freeze/targets/shell.js +3 -6
  252. package/dist/workflows/freeze/targets/task.js +25 -80
  253. package/dist/workflows/freeze/task-bindings.js +20 -67
  254. package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
  255. package/dist/workflows/ir/params.js +6 -51
  256. package/dist/workflows/ir/plan-hash.js +2 -34
  257. package/dist/workflows/parser.js +140 -43
  258. package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
  259. package/dist/workflows/renderer.js +36 -69
  260. package/dist/workflows/resource-limits.js +12 -120
  261. package/dist/workflows/runtime/agent-identity.js +8 -40
  262. package/dist/workflows/runtime/run-outputs.js +3 -6
  263. package/dist/workflows/runtime/run-plan.js +316 -0
  264. package/dist/workflows/runtime/runs.js +48 -200
  265. package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
  266. package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
  267. package/dist/workflows/validate-summary.js +2 -7
  268. package/docs/integration/bundling-akm.md +49 -42
  269. package/docs/migration/README.md +1 -0
  270. package/docs/migration/release-notes/0.9.17.md +41 -0
  271. package/docs/migration/v0.9.1-to-v0.9.2.md +19 -7
  272. package/docs/reference/cli.md +182 -125
  273. package/docs/reference/configuration.md +49 -56
  274. package/docs/reference/data-and-telemetry.md +19 -20
  275. package/docs/reference/tasks.md +86 -38
  276. package/docs/reference/workflow-schema.md +14 -18
  277. package/docs/reference/workflows.md +6 -9
  278. package/package.json +1 -1
  279. package/schemas/akm-config.json +87 -406
  280. package/dist/commands/health/advisories.js +0 -150
  281. package/dist/commands/health/metrics.js +0 -329
  282. package/dist/commands/health/surfaces.js +0 -102
  283. package/dist/commands/improve/anti-collapse.js +0 -83
  284. package/dist/commands/improve/collapse-detector.js +0 -432
  285. package/dist/commands/improve/consolidate/eligibility.js +0 -48
  286. package/dist/commands/improve/consolidate/merge.js +0 -146
  287. package/dist/commands/improve/distill/promote-memory.js +0 -329
  288. package/dist/commands/improve/distill/quality-gate.js +0 -500
  289. package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
  290. package/dist/commands/improve/proposal-envelope.js +0 -31
  291. package/dist/commands/improve/run-context.js +0 -123
  292. package/dist/commands/improve/shared.js +0 -21
  293. package/dist/commands/improve/source-identity.js +0 -28
  294. package/dist/commands/improve/triage.js +0 -96
  295. package/dist/commands/proposal/drain-policies.js +0 -151
  296. package/dist/commands/sources/update-transaction.js +0 -220
  297. package/dist/core/action-contributors.js +0 -28
  298. package/dist/core/config/config-version-shim.js +0 -101
  299. package/dist/core/config/retired-experimental-keys-shim.js +0 -62
  300. package/dist/core/fs-txn.js +0 -405
  301. package/dist/core/lexical-score.js +0 -25
  302. package/dist/core/maintenance-barrier.js +0 -167
  303. package/dist/execution/executable-identity.js +0 -105
  304. package/dist/execution/guarded-source.js +0 -441
  305. package/dist/indexer/graph/graph-boost.js +0 -427
  306. package/dist/indexer/graph/graph-dedup.js +0 -95
  307. package/dist/indexer/search/name-match.js +0 -35
  308. package/dist/indexer/search/ranking-contributors.js +0 -515
  309. package/dist/indexer/walk/project-context.js +0 -192
  310. package/dist/integrations/agent/execution-cascade.js +0 -566
  311. package/dist/integrations/agent/execution-definitions.js +0 -202
  312. package/dist/integrations/agent/execution-lowering.js +0 -841
  313. package/dist/integrations/agent/execution-preparation.js +0 -98
  314. package/dist/integrations/agent/inline-execution.js +0 -74
  315. package/dist/registry/create-provider-registry.js +0 -29
  316. package/dist/registry/pinned-request-helper.js +0 -247
  317. package/dist/registry/pinned-transport.js +0 -717
  318. package/dist/sources/providers/index.js +0 -14
  319. package/dist/storage/engines/sqlite-migrations.js +0 -271
  320. package/dist/storage/repositories/canaries-repository.js +0 -107
  321. package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
  322. package/dist/storage/repositories/registry-cache.js +0 -113
  323. package/dist/tasks/scheduler-sync-preview.js +0 -52
  324. package/dist/workflows/freeze/resolve-steps.js +0 -86
  325. package/dist/workflows/freeze/source-freeze.js +0 -64
  326. package/dist/workflows/ir/compile.js +0 -321
  327. package/dist/workflows/ir/environment-v4.js +0 -330
  328. package/dist/workflows/ir/freeze-v4.js +0 -153
  329. package/dist/workflows/ir/schema-v4.js +0 -745
  330. package/dist/workflows/ir/schema.js +0 -354
  331. package/dist/workflows/program/schema.js +0 -78
  332. package/dist/workflows/runtime/checkin.js +0 -57
  333. package/dist/workflows/runtime/plan-classifier.js +0 -196
  334. package/dist/workflows/runtime/unit-checkin.js +0 -45
  335. package/dist/workflows/runtime/unit-phases.js +0 -20
  336. package/dist/workflows/schema.js +0 -4
  337. package/dist/workflows/source-ir/compile.js +0 -200
  338. package/dist/workflows/source-ir/program.js +0 -50
  339. package/dist/workflows/source-ir/result.js +0 -26
  340. package/dist/workflows/source-ir/schema.js +0 -786
  341. package/dist/workflows/source-ir/triggers.js +0 -79
  342. package/dist/workflows/source-ir/uses.js +0 -40
  343. package/dist/workflows/validator.js +0 -60
@@ -1,12 +1,12 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- /** Shared semantic validation for every workflow source-IR producer and decoder. */
4
+ /** Semantic checks shared by the workflow grammars (`parser.ts`, `github-yaml.ts`) and freeze. */
5
5
  import fs from "node:fs";
6
6
  import path from "node:path";
7
- import { parseBuiltinCommandAction } from "../../commands/command/builtin-action.js";
8
- import { parseSchedule } from "../../tasks/schedule.js";
9
- import { classifyWorkflowSourceUses } from "./uses.js";
7
+ import { parseBuiltinCommandAction } from "../commands/command/builtin-action.js";
8
+ import { classifyTargetRef } from "../execution/target-ref.js";
9
+ import { parseSchedule } from "../tasks/schedule.js";
10
10
  export class WorkflowSourceSemanticError extends Error {
11
11
  code;
12
12
  constructor(code, message) {
@@ -15,6 +15,14 @@ export class WorkflowSourceSemanticError extends Error {
15
15
  this.name = "WorkflowSourceSemanticError";
16
16
  }
17
17
  }
18
+ /** The argv a `run:` string executes under `shell`. */
19
+ export function workflowShellCommand(shell, content) {
20
+ if (shell === "cmd")
21
+ return ["cmd", "/d", "/s", "/c", content];
22
+ if (shell === "pwsh" || shell === "powershell")
23
+ return [shell, "-Command", content];
24
+ return [shell, "-c", content];
25
+ }
18
26
  export function canonicalizeWorkflowCron(value) {
19
27
  const canonical = value.trim().split(/\s+/).join(" ");
20
28
  if (canonical.startsWith("@") || canonical.split(" ").length !== 5) {
@@ -66,28 +74,21 @@ function hasControlCharacter(value) {
66
74
  }
67
75
  return false;
68
76
  }
69
- export function classifyWorkflowStepUses(value, classifier = classifyWorkflowSourceUses) {
77
+ export function classifyWorkflowStepUses(value) {
70
78
  if (value.includes("${{")) {
71
79
  throw new WorkflowSourceSemanticError("unsupported-github-expression", "GitHub expressions are unsupported in uses.");
72
80
  }
73
81
  if (value.length === 0 || value.trim() !== value || /\s/.test(value)) {
74
82
  throw new WorkflowSourceSemanticError("unsupported-uses-target", "uses must be one exact, non-empty executable ref");
75
83
  }
76
- let target;
84
+ if (value === "akm/command")
85
+ return { kind: "builtin-command", ref: "akm/command" };
77
86
  try {
78
- target = classifier(value);
87
+ return classifyTargetRef(value);
79
88
  }
80
89
  catch (cause) {
81
90
  throw usesFailure(value, cause);
82
91
  }
83
- // P3a (docs/plans/specs/p3a-plan-v5-child-freeze.md §1.3(2)/§4, A-N4): a
84
- // `kind: "workflow"` target used to throw `nested-workflow-unsupported`
85
- // here. That rejection is REMOVED — classification returns the workflow
86
- // target like any other target-ref-shaped `uses:`, and freeze decides
87
- // (`src/workflows/freeze/targets/child-workflow.ts`, the ONE recursive
88
- // child-workflow resolver both the direct and task-wrapped composition
89
- // forms route through).
90
- return target;
91
92
  }
92
93
  /**
93
94
  * Validate AKM's built-in command action at the shared source/decoder boundary.
@@ -121,11 +122,6 @@ export function validateWorkflowBuiltinCommand(value, mode) {
121
122
  }
122
123
  return action;
123
124
  }
124
- export function rejectNulInArgv(command) {
125
- if (command.some((argument) => argument.includes("\0"))) {
126
- throw new WorkflowSourceSemanticError("invalid-exec-argv", "Direct exec argv may not contain NUL bytes.");
127
- }
128
- }
129
125
  function usesFailure(value, cause) {
130
126
  const message = cause instanceof Error ? cause.message : String(cause);
131
127
  const code = value.startsWith("docker://")
@@ -18,13 +18,8 @@
18
18
  import validateSummaryJudgePrompt from "../assets/prompts/validate-summary-judge.md" with { type: "text" };
19
19
  import { parseJsonResponse } from "../core/parse.js";
20
20
  /**
21
- * Parse the judge's raw response into a well-formed verdict, or `undefined`
22
- * when the response is malformed (unparseable, or missing a boolean
23
- * `complete`). This is the ONE verdict parser: {@link validateStepSummary}
24
- * fails closed through it, and the engine's gate wrapper (step-work.ts) uses
25
- * the same function to classify a malformed verdict as verifier
26
- * INFRASTRUCTURE failure — never an honest rejection that would consume a
27
- * gate loop — so the two classifications cannot drift.
21
+ * The one verdict parser: a well-formed verdict, or `undefined` when malformed
22
+ * (which the engine treats as a verifier failure, never a rejection).
28
23
  */
29
24
  export function parseJudgeVerdict(raw) {
30
25
  const parsed = parseJsonResponse(raw);
@@ -29,49 +29,57 @@ akm migrate apply
29
29
 
30
30
  In order, every run applies (or, under `status`/`--dry-run`, plans):
31
31
 
32
- 1. **Legacy config lift** — `extraParams` keys on an engine config moved onto
33
- first-class fields.
34
- 2. **Pending `state.db` migrations**, historical-destructive ones included.
35
- This is the only path (besides `akm upgrade`, which calls the same code)
36
- that is allowed to apply a destructive migration to an existing,
37
- unversioned or behind-generation `state.db` — see
32
+ 1. **config.json in its current shape** (`configFile`): retired and unknown
33
+ keys dropped, legacy `extraParams` lifted onto first-class fields, the
34
+ legacy `stashDir`/`sources[]`/`installed` layout converted to
35
+ `bundles`/`defaultBundle`. Config loading already does all of this in
36
+ memory; this persists it under a backup.
37
+ 2. **Pending `state.db` migrations**, historical-destructive ones included
38
+ (`stateMigrations`). This is the only path (besides `akm upgrade`, which
39
+ calls the same code) that is allowed to apply a destructive migration to an
40
+ existing, unversioned or behind-generation `state.db` — see
38
41
  [One-way state.db](#one-way-note-statedb-migrations-are-one-way) below.
39
- 3. **Task sources**: task-v2 files to task v3, then task-v3 files to task
40
- source v4. Each generation keeps its own lock and backup, so a file
41
- blocked in one generation does not stop the other from converting files
42
- that are already current.
43
- 4. **Stash residue sweeps**: superseded pre-0.9.0 `.akm` files and stale
44
- filesystem transactions, scoped to the configured bundle (skipped
45
- entirely when no bundle is configured yet).
42
+ 3. **Task files**: every task file at version 2 or 3, and every version 4
43
+ file still carrying the retired `schedule[].enabled` key, rewritten as
44
+ task source v4 (`taskFiles`) under one backup directory per run. A file
45
+ the planner cannot convert unambiguously is reported `blocked` and left
46
+ alone; the rest still convert.
47
+ 4. **Residue sweep**: superseded pre-0.9.0 `.akm` files in the stash and the
48
+ transaction-journal, maintenance-barrier, lock-mutex and version-stamp
49
+ files older releases kept under `$DATA`/`$STATE`/`$CONFIG` (`deadResidue`).
50
+
51
+ The step list in [`docs/reference/cli.md`](../reference/cli.md#migrate) is the
52
+ authoritative one; the two must agree.
46
53
 
47
54
  ### The plan JSON
48
55
 
49
- One JSON object on stdout, always. A current install, nothing to do:
56
+ One JSON object on stdout, always, with one field per step. A current
57
+ install, nothing to do, as `akm migrate status` prints it (under `apply` the
58
+ per-step objects carry results instead — `applied`, `removed` — with the
59
+ same step names):
50
60
 
51
61
  ```json
52
62
  {
53
63
  "schemaVersion": 1,
54
64
  "status": "current",
55
65
  "blockers": [],
56
- "configExtraParams": { "applied": false, "lifted": [], "conflicts": [] },
66
+ "configFile": { "keys": [], "changed": false, "applied": false },
57
67
  "stateMigrations": { "pending": [] },
58
- "taskV3Migration": { "schemaVersion": 1, "generation": "task-v2-to-v3", "changed": 0, "skipped": 4, "blocked": 0, "files": [] },
59
- "taskV4Migration": { "schemaVersion": 1, "generation": "task-v3-to-v4", "changed": 0, "skipped": 4, "blocked": 0, "files": [] }
68
+ "taskFiles": { "schemaVersion": 1, "changed": 0, "skipped": 0, "blocked": 0, "files": [] },
69
+ "deadResidue": { "pending": [] }
60
70
  }
61
71
  ```
62
72
 
63
- `akm migrate status` against a tree with one blocked task file (`taskV3Migration`
64
- omitted below for brevity — its shape is identical):
73
+ `akm migrate status` against a tree with one blocked task file:
65
74
 
66
75
  ```json
67
76
  {
68
77
  "schemaVersion": 1,
69
78
  "status": "blocked",
70
- "blockers": ["with-on-non-command-target"],
79
+ "blockers": ["tasks/nightly.yml: with-on-non-command-target"],
71
80
  "stateMigrations": { "pending": [] },
72
- "taskV4Migration": {
81
+ "taskFiles": {
73
82
  "schemaVersion": 1,
74
- "generation": "task-v3-to-v4",
75
83
  "changed": 3,
76
84
  "skipped": 1,
77
85
  "blocked": 1,
@@ -109,16 +117,14 @@ Key fields:
109
117
  | Field | Meaning |
110
118
  | --- | --- |
111
119
  | `stateMigrations` | `{ pending: string[] }` under `status`/`--dry-run`; `{ applied: string[], safetyCopyPath?: string }` after a real `apply`. `safetyCopyPath` is present only when a historical-destructive migration ran — see below. |
112
- | `taskV3Migration` / `taskV4Migration` | Per-generation summary: `changed`/`skipped`/`blocked` counts and a `files[]` array with each file's `status` and `reason`. |
113
- | `backupPath` / `taskV4BackupPath` | Present after a real apply that changed at least one file in that generation — a timestamped snapshot directory. |
114
- | `deadResidue` / `staleTxns` | Present only when a bundle is configured. `{ pending: [...] }` under a read-only run, `{ removed: [...] }` / `{ recovered: [...] }` after apply. |
120
+ | `taskFiles` | `changed`/`skipped`/`blocked` counts and a `files[]` array with each file's `status` and `reason`. |
121
+ | `backupPath` / `applied` | Present after a real apply that rewrote at least one task file: the run's backup directory and how many files it rewrote. |
122
+ | `deadResidue` | `{ pending: [...] }` under a read-only run, `{ removed: [...] }` / `{ recovered: [...], quarantined: [...], deferred: [...] }` after apply. An untrusted journal (unreadable `journal.json`, or a fence violation) is quarantined to `$DATA/txn-quarantine`; a trusted, fenced journal whose `rollback`/`finalize` throws is deferred, left in place under `$DATA/txn/<rootNs>/`. Neither is thrown, and neither sets `status` to `blocked`. `staleTxns.pending` entries carry `wouldQuarantine: { reason }` when the journal's read-only fence check alone (not a `rollback`/`finalize` run) already shows it would be quarantined by a real apply. |
115
123
 
116
124
  **Backups and their retention:**
117
125
 
118
- - Task-source backups (task-v2→v3 and v3→v4) go to
119
- `<dataDir>/backups/task-v3/<timestamp>-<uuid>/` and
120
- `<dataDir>/backups/task-v4/<timestamp>-<uuid>/` respectively — one
121
- directory per apply run, pruned to the **5 most recent** automatically.
126
+ - Task-file backups go to `<dataDir>/backups/tasks/<timestamp>-<uuid>/`,
127
+ one directory per apply run that rewrote a file; nothing prunes them.
122
128
  - Config backups go to `<cacheDir>/config-backups/config-<ISO-ts>.json`,
123
129
  also capped at **5**.
124
130
  - A `state.db` historical-destructive migration writes a verified sibling
@@ -197,25 +203,26 @@ that wording is not a stable interface.
197
203
  (`status: "fail"`).
198
204
 
199
205
  The check that replaces grepping akm's refusal text is a **hard check**
200
- named `state-db-migrations`:
206
+ named `state-db-migrations`. Every `state.db` open applies pending migrations
207
+ (copying the file to `state.db.pre-<id>.bak` first when one drops schema), so
208
+ after an upgrade the check passes and names what health's own open applied:
201
209
 
202
210
  ```json
203
211
  {
204
212
  "name": "state-db-migrations",
205
- "status": "fail",
206
- "message": "1 pending state.db migration(s) (018-drop-dead-lane-schema); run `akm migrate apply`.",
207
- "evidence": { "path": "/data/akm/state.db", "pending": ["018-drop-dead-lane-schema"] }
213
+ "status": "pass",
214
+ "message": "Applied 11 pending state.db migration(s) on open (018-drop-dead-lane-schema … 028-improve-ledger); the pre-migration copy is /data/akm/state.db.pre-018-drop-dead-lane-schema.bak.",
215
+ "evidence": {
216
+ "path": "/data/akm/state.db",
217
+ "pending": [],
218
+ "applied": ["018-drop-dead-lane-schema", "…", "028-improve-ledger"],
219
+ "backupPath": "/data/akm/state.db.pre-018-drop-dead-lane-schema.bak"
220
+ }
208
221
  }
209
222
  ```
210
223
 
211
- It reads `evidence.pending` — a read-only preflight, never the managed open
212
- — so `akm health` can report this state even though **an ordinary command
213
- that opens `state.db` refuses to touch a pending historical-destructive
214
- migration by design**, naming `akm upgrade` and `akm migrate apply` as the
215
- only two commands allowed to apply one. Before this check existed, that
216
- refusal surfaced as a crash (config-error exit) instead of a normal `fail`
217
- row — this is what a bundler should now watch for `state-db-migrations` to
218
- report, instead of grepping error text for a fixed remedy string.
224
+ It is `fail` only when a pending migration could not be applied; `evidence.pending`
225
+ then names what is still pending. Watch this row's `status`, not error text.
219
226
 
220
227
  ## The `akm-migrate` executable
221
228
 
@@ -259,7 +266,7 @@ rather than rely on `$HOME`-derived defaults (names verified against
259
266
  | `AKM_CONFIG_DIR` | `config.json`'s directory. |
260
267
  | `AKM_DATA_DIR` | Durable, non-regenerable data: **`index.db` and `state.db` live here.** This is the directory a migration snapshot's safety copy sits beside. |
261
268
  | `AKM_CACHE_DIR` | Regenerable cache: registry downloads, config backups, task logs. Safe to discard between image builds (not between boots of the same running install). |
262
- | `AKM_STATE_DIR` | **Not** where `state.db` lives, despite the name — this is the XDG "state" directory. Holds scheduled-task invocation context, companion-plugin hook state (Claude Code / OpenCode hook logs), and, per stash, `akm improve`'s machine-local writers (`improve/distill-rejected/`, `improve/eval-cases/`, `improve/measurement/verdicts/`) and whole-run lock (`locks/`) — see [Storage locations](https://github.com/itlackey/akm/blob/main/docs/architecture/internals/storage-locations.md). Set it anyway if you schedule akm tasks inside the image, so that context is captured consistently rather than falling back to `$HOME/.local/state/akm`. |
269
+ | `AKM_STATE_DIR` | **Not** where `state.db` lives, despite the name — this is the XDG "state" directory. Holds scheduled-task invocation context, companion-plugin hook state (Claude Code / OpenCode hook logs), and, per stash, `akm improve`'s machine-local writers (`improve/measurement/verdicts/`) and whole-run lock (`locks/`) — see [Storage locations](https://github.com/itlackey/akm/blob/main/docs/architecture/internals/storage-locations.md). Set it anyway if you schedule akm tasks inside the image, so that context is captured consistently rather than falling back to `$HOME/.local/state/akm`. |
263
270
 
264
271
  Set all five to paths that persist across container restarts (a mounted
265
272
  volume), or `akm migrate apply` will see an empty `state.db` on every boot
@@ -5,6 +5,7 @@ Upgrade guides and per-release migration notes.
5
5
  - [v0.9.1 -> v0.9.2 migration guide](v0.9.1-to-v0.9.2.md) -- Task-v2/task-v3 to task source v4 conversion, the durable-v4-family workflow boundary at executable `irVersion: 5`, and release behavior changes
6
6
  - [v0.9.2 release note](release-notes/0.9.2.md) -- Self-contained terminal upgrade summary shipped for `akm help migrate 0.9.2`
7
7
  - [v0.9.16 release note](release-notes/0.9.16.md) -- Source-bound scheduler grants, local execution authority, and split unsafe overrides
8
+ - [v0.9.17 release note](release-notes/0.9.17.md) -- Tolerant readers, one config migration step, a plain scheduler list, less machinery, and the upgrade rehearsal gate
8
9
  - [v0.8 -> current v0.9 migration guide](v0.8-to-v0.9.md) -- Package upgrade with fresh current config/state and explicit task conversion
9
10
  - [v0.7 -> v0.8 migration guide](v0.7-to-v0.8.md) -- Task schema and 0.8-era changes
10
11
  - [v0.5 -> v0.6 migration guide](https://github.com/itlackey/akm/blob/main/docs/migration/v0.5-to-v0.6.md) -- Terminology cut, registry schema v3, publisher changes
@@ -0,0 +1,41 @@
1
+ Migration notes for akm v0.9.17
2
+
3
+ Upgrading no longer needs a manual step to keep working, and there is less
4
+ machinery to break.
5
+
6
+ Readers tolerate what older releases wrote. A `version: 2` or `version: 3`
7
+ task source reads and runs, converted in memory with a one-line warning. A
8
+ config key this release does not know -- retired, misspelled, or written by a
9
+ newer release -- is kept in memory and named once, never a reason to refuse
10
+ the config; ordinary writes round-trip it, and `akm migrate apply` drops it.
11
+ `akm migrate apply` has one config step (`configFile`): read config.json
12
+ through the same pipeline every load runs and write the current shape back,
13
+ under a backup.
14
+
15
+ Scheduling is one list. `scheduler.enabled` in config.json holds the
16
+ fully-qualified refs this host schedules (`bundle//tasks/x`). The
17
+ 0.9.17-alpha `{kind, ref, sourceId}` grant objects are read as their ref. A
18
+ config with no list at all -- every release before 0.9.17 -- means "keep
19
+ what is installed": the first `akm task sync` (or `setup`, `task enable`,
20
+ `task disable`, `task add`) after the upgrade takes the akm-written rows
21
+ already in the native scheduler as the host's choice, writes the list, and
22
+ says so. An explicit list, empty or not, is never second-guessed. There are
23
+ no grants, no source identities, no carry-forward and no fire-time gate.
24
+
25
+ Removed machinery: filesystem transaction journals for proposal accept/revert
26
+ (the asset is written, then the proposal row and its event are recorded in
27
+ one state.db transaction; a crash in between leaves a re-acceptable pending
28
+ proposal); the maintenance barrier, its per-process activity registry (the
29
+ source of the lock-sidecar leak) and the SQLite lock-operation mutex (a lock
30
+ file is one `O_EXCL` create); startup version reconciliation and
31
+ `--host-local`; the akm-install enumerator and `akm upgrade --version/--tag`;
32
+ the upgrade and transaction health advisories; the `akm info` compat
33
+ manifest. `akm migrate apply` removes the files those left under `$DATA`,
34
+ `$STATE` and `$CONFIG`.
35
+
36
+ Every historical shape akm has written is exercised by the upgrade rehearsal
37
+ (`tests/integration/upgrade-rehearsal/`) before each release: a real previous
38
+ release builds a home, the candidate installs over it in place, and the
39
+ rehearsal drives migrate, bundle list, search, show, task sync, health and a
40
+ scheduled task's generated cron command, then confirms the previous release
41
+ still runs against the candidate-written home.
@@ -53,14 +53,26 @@ migration contract.
53
53
  below.
54
54
 
55
55
  Everything else below can happen after the binary upgrade, at your own
56
- pace: task sources keep failing closed with an actionable hint until you
57
- migrate them (nothing silently breaks or half-runs), and pre-`irVersion`-5
58
- runs stay inspectable indefinitely.
56
+ pace: an unmigrated v2/v3 task source keeps reading and running through the
57
+ in-memory read shim, with a one-line deprecation warning, until you migrate
58
+ it (nothing silently breaks or half-runs, and only a genuinely unmigratable
59
+ shape fails closed with an actionable hint), and pre-`irVersion`-5 runs stay
60
+ inspectable indefinitely.
59
61
 
60
62
  ## Task sources
61
63
 
62
- akm 0.9.2 has shipped three task source generations. Only the newest,
63
- **task source v4**, is accepted by `src/` in this release.
64
+ akm 0.9.2 has shipped three task source generations. **Task source v4** is
65
+ the current, standing grammar; an older `version: 2` or `version: 3` file
66
+ still reads and runs through an in-memory read shim that converts it to v4
67
+ on the same bytes `akm migrate apply` would produce, with a one-line stderr
68
+ deprecation warning and no disk write. Only a v2/v3 document the
69
+ deterministic conversion itself cannot resolve fails to load. `akm migrate
70
+ apply` remains the way to rewrite the file on disk and silence the warning.
71
+ (A later release — see the [Tasks reference](../reference/tasks.md) for the
72
+ current grammar — extended the same kind of shim to a `version: 4` document
73
+ whose `schedule[]` still carries a per-entry `enabled` key, retired from
74
+ task source v4's own grammar since; the field is stripped without being
75
+ read, never re-added.)
64
76
 
65
77
  **Before — 0.9.1 task v2:**
66
78
 
@@ -77,7 +89,7 @@ redact: [REVIEW_TOKEN]
77
89
  ```
78
90
 
79
91
  **An intermediate generation — task v3** (shipped earlier in the 0.9.x
80
- line; also no longer accepted):
92
+ line; also read only through the shim now, not as a standing grammar):
81
93
 
82
94
  ```yaml
83
95
  version: 3
@@ -667,7 +679,7 @@ phase-specific code:
667
679
  | Code | Domain |
668
680
  |---|---|
669
681
  | `TASK_SOURCE_INVALID` | A task document's field- or semantic-level validation failure, or a malformed/oversized/too-deep YAML front end failure. |
670
- | `TASK_SCHEMA_VERSION_UNSUPPORTED` | A task document's `version:` is not `4` and is recognizable as a legacy generation (`3` or `2`). |
682
+ | `TASK_SCHEMA_VERSION_UNSUPPORTED` | A task document's `version:` is `3` or `2` and the in-memory read shim's deterministic conversion cannot resolve it — a human decision is needed (see [Task sources](#task-sources)); a convertible v2/v3 document reads through the shim instead of failing. |
671
683
  | `TARGET_REF_INVALID` | A value is not a canonical `commands/`, `scripts/`, `tasks/`, or `workflows/` asset ref (malformed shapes, GitHub locators, other asset families). |
672
684
  | `WORKFLOW_SOURCE_INVALID` | A workflow-source compile failure other than the one below. |
673
685
  | `COMPOSITION_INVALID` | A composition-policy rejection: a rejected `with:`, a multi-job document, a composition cycle/depth/size violation. |