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

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 (346) hide show
  1. package/CHANGELOG.md +760 -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/lint/base-linter.js +19 -5
  53. package/dist/commands/proposal/drain.js +251 -644
  54. package/dist/commands/proposal/proposal-cli.js +3 -18
  55. package/dist/commands/proposal/proposal-types.js +20 -41
  56. package/dist/commands/proposal/proposal.js +1 -2
  57. package/dist/commands/proposal/propose.js +134 -160
  58. package/dist/commands/proposal/repository.js +502 -1487
  59. package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
  60. package/dist/commands/proposal/validators/proposal-validators.js +1 -1
  61. package/dist/commands/proposal/validators/proposals.js +13 -89
  62. package/dist/commands/read/curate.js +63 -413
  63. package/dist/commands/read/search-cli.js +16 -33
  64. package/dist/commands/read/search.js +17 -23
  65. package/dist/commands/read/show.js +2 -13
  66. package/dist/commands/sources/bundle-cli.js +25 -2
  67. package/dist/commands/sources/bundle-config-ops.js +4 -0
  68. package/dist/commands/sources/dangerous-env-audit.js +1 -2
  69. package/dist/commands/sources/info.js +2 -11
  70. package/dist/commands/sources/installed-stashes.js +197 -746
  71. package/dist/commands/sources/schema-repair.js +98 -129
  72. package/dist/commands/sources/source-add.js +62 -12
  73. package/dist/commands/sources/source-manage.js +9 -2
  74. package/dist/commands/sources/stash-cli.js +1 -1
  75. package/dist/commands/tasks/explain.js +10 -13
  76. package/dist/commands/tasks/tasks-cli.js +9 -8
  77. package/dist/commands/tasks/tasks.js +326 -930
  78. package/dist/commands/tasks/validate.js +42 -21
  79. package/dist/commands/workflow/plan.js +22 -29
  80. package/dist/commands/workflow-cli.js +4 -4
  81. package/dist/core/adapter/adapters/akm-adapter.js +0 -1
  82. package/dist/core/adapter/adapters/akm-lint.js +2 -3
  83. package/dist/core/adapter/adapters/akm-metadata.js +11 -12
  84. package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
  85. package/dist/core/adapter/execution-source.js +17 -29
  86. package/dist/core/asset/asset-placement.js +4 -13
  87. package/dist/core/asset/resolve-ref.js +1 -1
  88. package/dist/core/bundle-id.js +42 -5
  89. package/dist/core/bundle-rename.js +291 -0
  90. package/dist/core/config/config-io.js +1 -2
  91. package/dist/core/config/config-schema.js +1 -33
  92. package/dist/core/config/config-walker.js +1 -1
  93. package/dist/core/config/config.js +163 -68
  94. package/dist/core/config/legacy-source-shape-shim.js +38 -9
  95. package/dist/core/config/schema/embedding.js +20 -5
  96. package/dist/core/config/schema/engines.js +5 -0
  97. package/dist/core/config/schema/execution.js +1 -1
  98. package/dist/core/config/schema/experimental.js +1 -1
  99. package/dist/core/config/schema/improve-processes.js +21 -95
  100. package/dist/core/config/schema/improve.js +4 -42
  101. package/dist/core/config/schema/scheduler.js +12 -12
  102. package/dist/core/config/schema/search.js +6 -22
  103. package/dist/core/env-secret-ref.js +0 -1
  104. package/dist/core/errors.js +8 -9
  105. package/dist/core/file-lock.js +76 -173
  106. package/dist/core/logs-db.js +2 -2
  107. package/dist/core/paths.js +0 -27
  108. package/dist/core/redaction.js +109 -2
  109. package/dist/core/run-lock.js +2 -5
  110. package/dist/core/spawn-env.js +1 -1
  111. package/dist/core/state/migrations.js +108 -61
  112. package/dist/core/state-db-scope.js +2 -4
  113. package/dist/core/state-db.js +126 -692
  114. package/dist/core/type-presentation.js +1 -9
  115. package/dist/core/write-source.js +293 -1012
  116. package/dist/execution/input-contract.js +1 -1
  117. package/dist/execution/resolved-request.js +135 -689
  118. package/dist/execution/source.js +63 -257
  119. package/dist/execution/target-ref.js +1 -1
  120. package/dist/indexer/bundle-identity-guard.js +2 -2
  121. package/dist/indexer/db/graph-db.js +106 -46
  122. package/dist/indexer/ensure-index.js +44 -85
  123. package/dist/indexer/graph/graph-extraction.js +340 -562
  124. package/dist/indexer/graph/graph-related.js +130 -0
  125. package/dist/indexer/index-rebuild-lock.js +3 -11
  126. package/dist/indexer/index-writer-lock.js +8 -17
  127. package/dist/indexer/index-written-assets.js +139 -151
  128. package/dist/indexer/indexer.js +524 -846
  129. package/dist/indexer/materialize-embeddings.js +60 -397
  130. package/dist/indexer/passes/memory-inference.js +81 -90
  131. package/dist/indexer/passes/metadata.js +132 -200
  132. package/dist/indexer/read-preflight.js +0 -7
  133. package/dist/indexer/scan/doc-to-entry.js +1 -3
  134. package/dist/indexer/scan/drain-dir.js +1 -1
  135. package/dist/indexer/search/db-search.js +181 -590
  136. package/dist/indexer/search/fts-query.js +30 -41
  137. package/dist/indexer/search/ranking.js +28 -154
  138. package/dist/indexer/search/search-attribution.js +12 -32
  139. package/dist/indexer/search/search-fields.js +11 -15
  140. package/dist/indexer/search/search-hit-enrichers.js +54 -85
  141. package/dist/indexer/search/search-source.js +1 -4
  142. package/dist/indexer/usage/usage-events.js +2 -7
  143. package/dist/integrations/agent/engine-fallback.js +23 -40
  144. package/dist/integrations/agent/engine-resolution.js +93 -183
  145. package/dist/integrations/agent/execution.js +507 -0
  146. package/dist/integrations/agent/model-map.js +28 -156
  147. package/dist/integrations/agent/request-lowering.js +66 -141
  148. package/dist/integrations/agent/runner-dispatch.js +143 -321
  149. package/dist/integrations/agent/runner.js +54 -14
  150. package/dist/integrations/lockfile.js +53 -101
  151. package/dist/llm/embedders/deterministic.js +2 -3
  152. package/dist/llm/embedders/profile.js +71 -0
  153. package/dist/llm/embedders/remote.js +10 -15
  154. package/dist/llm/graph-extract.js +3 -12
  155. package/dist/llm/index-passes.js +3 -5
  156. package/dist/llm/memory-infer.js +1 -2
  157. package/dist/llm/metadata-enhance.js +1 -2
  158. package/dist/llm/structured-call.js +5 -24
  159. package/dist/output/generic-render.js +23 -11
  160. package/dist/output/html-render.js +13 -10
  161. package/dist/output/render-registry.js +3 -32
  162. package/dist/output/shapes/helpers.js +2 -34
  163. package/dist/output/shapes/passthrough.js +1 -9
  164. package/dist/{indexer/search/ranking-types.js → output/text/bundle-rename.js} +4 -1
  165. package/dist/output/text/command-format.js +60 -23
  166. package/dist/output/text/helpers.js +1 -1
  167. package/dist/output/text/migrate.js +5 -14
  168. package/dist/output/text/proposal-format.js +1 -2
  169. package/dist/output/text/workflow-format.js +0 -32
  170. package/dist/output/text.js +2 -0
  171. package/dist/registry/factory.js +4 -19
  172. package/dist/registry/network.js +66 -220
  173. package/dist/registry/providers/index.js +0 -2
  174. package/dist/registry/providers/skills-sh.js +3 -14
  175. package/dist/registry/providers/static-index.js +24 -26
  176. package/dist/registry/resolve.js +55 -131
  177. package/dist/scripts/akm-migrate-node.js +43940 -93320
  178. package/dist/scripts/akm-migrate.js +43700 -93078
  179. package/dist/setup/registry-stash-loader.js +4 -13
  180. package/dist/setup/semantic-assets.js +3 -44
  181. package/dist/setup/setup.js +1 -1
  182. package/dist/setup/steps/tasks.js +25 -15
  183. package/dist/sources/provider-factory.js +17 -18
  184. package/dist/sources/providers/filesystem.js +2 -3
  185. package/dist/sources/providers/git-install.js +7 -1
  186. package/dist/sources/providers/git-provider.js +0 -3
  187. package/dist/sources/providers/git-stash.js +0 -17
  188. package/dist/sources/providers/npm.js +2 -4
  189. package/dist/sources/providers/provider-utils.js +5 -10
  190. package/dist/sources/providers/website.js +0 -2
  191. package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
  192. package/dist/sources/website-url.js +2 -2
  193. package/dist/storage/database.js +9 -35
  194. package/dist/storage/repositories/improve-ledger-repository.js +168 -0
  195. package/dist/storage/repositories/index-connection.js +34 -70
  196. package/dist/storage/repositories/index-entries-repository.js +69 -111
  197. package/dist/storage/repositories/index-entry-mapper.js +1 -2
  198. package/dist/storage/repositories/index-entry-schema.js +83 -269
  199. package/dist/storage/repositories/index-fts-repository.js +86 -256
  200. package/dist/storage/repositories/index-llm-cache-repository.js +17 -0
  201. package/dist/storage/repositories/index-meta-repository.js +6 -4
  202. package/dist/storage/repositories/index-schema.js +192 -220
  203. package/dist/storage/repositories/index-utility-repository.js +8 -29
  204. package/dist/storage/repositories/index-vec-repository.js +133 -414
  205. package/dist/storage/repositories/outcome-repository.js +2 -1
  206. package/dist/storage/repositories/proposals-repository.js +35 -0
  207. package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
  208. package/dist/storage/repositories/task-history-repository.js +26 -4
  209. package/dist/storage/repositories/workflow-runs-repository.js +53 -244
  210. package/dist/storage/sqlite-migrations.js +136 -0
  211. package/dist/storage/sqlite-pragmas.js +11 -9
  212. package/dist/storage/sqlite-transaction.js +170 -0
  213. package/dist/storage/state-db-integrity.js +34 -27
  214. package/dist/tasks/activation-config.js +134 -62
  215. package/dist/tasks/backends/cron.js +129 -277
  216. package/dist/tasks/backends/exec-utils.js +2 -5
  217. package/dist/tasks/backends/launchd.js +125 -745
  218. package/dist/tasks/backends/schtasks.js +101 -620
  219. package/dist/tasks/prepare/prepare-support.js +5 -15
  220. package/dist/tasks/prepare/prepare.js +0 -2
  221. package/dist/tasks/resolve-akm-bin.js +20 -79
  222. package/dist/tasks/run/attempt-lifecycle.js +0 -1
  223. package/dist/tasks/scheduler-binding.js +18 -238
  224. package/dist/tasks/scheduler-invocation.js +52 -52
  225. package/dist/tasks/scheduler-lock.js +53 -0
  226. package/dist/tasks/scheduler-sync.js +361 -751
  227. package/dist/tasks/source/parse-task-source.js +160 -10
  228. package/dist/tasks/source/task-source-v3-frozen.js +3 -4
  229. package/dist/tasks/source/task-to-v4.js +2 -2
  230. package/dist/workflows/authoring/authoring.js +3 -12
  231. package/dist/workflows/compile.js +211 -0
  232. package/dist/workflows/concurrency-policy.js +13 -74
  233. package/dist/workflows/exec/child-invocation.js +3 -17
  234. package/dist/workflows/exec/child-workflow.js +32 -141
  235. package/dist/workflows/exec/dispatch-redaction.js +13 -53
  236. package/dist/workflows/exec/environment.js +98 -0
  237. package/dist/workflows/exec/exec-unit.js +33 -140
  238. package/dist/workflows/exec/frozen-judge.js +7 -59
  239. package/dist/workflows/exec/native-executor.js +82 -341
  240. package/dist/workflows/exec/param-secrets.js +29 -47
  241. package/dist/workflows/exec/run-workflow.js +154 -387
  242. package/dist/workflows/exec/scheduler.js +9 -36
  243. package/dist/workflows/exec/step-work.js +127 -430
  244. package/dist/workflows/exec/unit-dispatch.js +11 -63
  245. package/dist/workflows/exec/unit-writer.js +8 -52
  246. package/dist/workflows/exec/worktree.js +39 -273
  247. package/dist/workflows/freeze/child-output-references.js +4 -15
  248. package/dist/workflows/freeze/environment.js +99 -92
  249. package/dist/workflows/freeze/freeze.js +172 -0
  250. package/dist/workflows/freeze/step-values.js +19 -21
  251. package/dist/workflows/freeze/targets/child-workflow.js +23 -92
  252. package/dist/workflows/freeze/targets/command.js +10 -33
  253. package/dist/workflows/freeze/targets/script.js +5 -12
  254. package/dist/workflows/freeze/targets/shell.js +3 -6
  255. package/dist/workflows/freeze/targets/task.js +25 -80
  256. package/dist/workflows/freeze/task-bindings.js +20 -67
  257. package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
  258. package/dist/workflows/ir/params.js +6 -51
  259. package/dist/workflows/ir/plan-hash.js +2 -34
  260. package/dist/workflows/parser.js +140 -43
  261. package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
  262. package/dist/workflows/renderer.js +36 -69
  263. package/dist/workflows/resource-limits.js +12 -120
  264. package/dist/workflows/runtime/agent-identity.js +8 -40
  265. package/dist/workflows/runtime/run-outputs.js +3 -6
  266. package/dist/workflows/runtime/run-plan.js +316 -0
  267. package/dist/workflows/runtime/runs.js +48 -200
  268. package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
  269. package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
  270. package/dist/workflows/validate-summary.js +2 -7
  271. package/docs/integration/bundling-akm.md +49 -42
  272. package/docs/migration/README.md +1 -0
  273. package/docs/migration/release-notes/0.9.17.md +41 -0
  274. package/docs/migration/v0.9.1-to-v0.9.2.md +19 -7
  275. package/docs/reference/cli.md +182 -125
  276. package/docs/reference/configuration.md +49 -56
  277. package/docs/reference/data-and-telemetry.md +19 -20
  278. package/docs/reference/tasks.md +86 -38
  279. package/docs/reference/workflow-schema.md +14 -18
  280. package/docs/reference/workflows.md +6 -9
  281. package/package.json +1 -1
  282. package/schemas/akm-config.json +87 -406
  283. package/dist/commands/health/advisories.js +0 -150
  284. package/dist/commands/health/metrics.js +0 -329
  285. package/dist/commands/health/surfaces.js +0 -102
  286. package/dist/commands/improve/anti-collapse.js +0 -83
  287. package/dist/commands/improve/collapse-detector.js +0 -432
  288. package/dist/commands/improve/consolidate/eligibility.js +0 -48
  289. package/dist/commands/improve/consolidate/merge.js +0 -146
  290. package/dist/commands/improve/distill/promote-memory.js +0 -329
  291. package/dist/commands/improve/distill/quality-gate.js +0 -500
  292. package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
  293. package/dist/commands/improve/proposal-envelope.js +0 -31
  294. package/dist/commands/improve/run-context.js +0 -123
  295. package/dist/commands/improve/shared.js +0 -21
  296. package/dist/commands/improve/source-identity.js +0 -28
  297. package/dist/commands/improve/triage.js +0 -96
  298. package/dist/commands/proposal/drain-policies.js +0 -151
  299. package/dist/commands/sources/update-transaction.js +0 -220
  300. package/dist/core/action-contributors.js +0 -28
  301. package/dist/core/config/config-version-shim.js +0 -101
  302. package/dist/core/config/retired-experimental-keys-shim.js +0 -62
  303. package/dist/core/fs-txn.js +0 -405
  304. package/dist/core/lexical-score.js +0 -25
  305. package/dist/core/maintenance-barrier.js +0 -167
  306. package/dist/execution/executable-identity.js +0 -105
  307. package/dist/execution/guarded-source.js +0 -441
  308. package/dist/indexer/graph/graph-boost.js +0 -427
  309. package/dist/indexer/graph/graph-dedup.js +0 -95
  310. package/dist/indexer/search/name-match.js +0 -35
  311. package/dist/indexer/search/ranking-contributors.js +0 -515
  312. package/dist/indexer/walk/project-context.js +0 -192
  313. package/dist/integrations/agent/execution-cascade.js +0 -566
  314. package/dist/integrations/agent/execution-definitions.js +0 -202
  315. package/dist/integrations/agent/execution-lowering.js +0 -841
  316. package/dist/integrations/agent/execution-preparation.js +0 -98
  317. package/dist/integrations/agent/inline-execution.js +0 -74
  318. package/dist/registry/create-provider-registry.js +0 -29
  319. package/dist/registry/pinned-request-helper.js +0 -247
  320. package/dist/registry/pinned-transport.js +0 -717
  321. package/dist/sources/providers/index.js +0 -14
  322. package/dist/storage/engines/sqlite-migrations.js +0 -271
  323. package/dist/storage/repositories/canaries-repository.js +0 -107
  324. package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
  325. package/dist/storage/repositories/registry-cache.js +0 -113
  326. package/dist/tasks/scheduler-sync-preview.js +0 -52
  327. package/dist/workflows/freeze/resolve-steps.js +0 -86
  328. package/dist/workflows/freeze/source-freeze.js +0 -64
  329. package/dist/workflows/ir/compile.js +0 -321
  330. package/dist/workflows/ir/environment-v4.js +0 -330
  331. package/dist/workflows/ir/freeze-v4.js +0 -153
  332. package/dist/workflows/ir/schema-v4.js +0 -745
  333. package/dist/workflows/ir/schema.js +0 -354
  334. package/dist/workflows/program/schema.js +0 -78
  335. package/dist/workflows/runtime/checkin.js +0 -57
  336. package/dist/workflows/runtime/plan-classifier.js +0 -196
  337. package/dist/workflows/runtime/unit-checkin.js +0 -45
  338. package/dist/workflows/runtime/unit-phases.js +0 -20
  339. package/dist/workflows/schema.js +0 -4
  340. package/dist/workflows/source-ir/compile.js +0 -200
  341. package/dist/workflows/source-ir/program.js +0 -50
  342. package/dist/workflows/source-ir/result.js +0 -26
  343. package/dist/workflows/source-ir/schema.js +0 -786
  344. package/dist/workflows/source-ir/triggers.js +0 -79
  345. package/dist/workflows/source-ir/uses.js +0 -40
  346. 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. |