akm-cli 0.9.16 → 0.9.17-alpha.10

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 (403) hide show
  1. package/CHANGELOG.md +2101 -0
  2. package/STABILITY.md +11 -10
  3. package/dist/akm +124 -193
  4. package/dist/akm-migrate +38 -19
  5. package/dist/assets/hints/cli-hints-full.md +6 -7
  6. package/dist/assets/improve-strategies/catchup.json +0 -3
  7. package/dist/assets/improve-strategies/consolidate.json +0 -1
  8. package/dist/assets/improve-strategies/default.json +1 -2
  9. package/dist/assets/improve-strategies/proactive-maintenance.json +1 -2
  10. package/dist/assets/improve-strategies/quick.json +1 -2
  11. package/dist/assets/improve-strategies/reflect-distill.json +1 -2
  12. package/dist/assets/improve-strategies/thorough.json +0 -3
  13. package/dist/assets/prompts/consolidate-pair.md +20 -0
  14. package/dist/assets/prompts/consolidate-system.md +4 -11
  15. package/dist/assets/prompts/retrieval-relevance-judge.md +6 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +20 -20
  17. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -2
  18. package/dist/assets/templates/html/health.html +3 -5
  19. package/dist/cli/retired-commands.js +1 -1
  20. package/dist/cli/shared.js +6 -2
  21. package/dist/cli/unknown-flags.js +24 -1
  22. package/dist/cli.js +68 -10
  23. package/dist/commands/agent/agent-dispatch.js +1 -1
  24. package/dist/commands/command/command-execution.js +24 -62
  25. package/dist/commands/feedback-cli.js +0 -1
  26. package/dist/commands/health/accept-rate.js +6 -0
  27. package/dist/commands/health/archive-usage.js +92 -0
  28. package/dist/commands/health/checks.js +83 -74
  29. package/dist/commands/health/config-skew.js +38 -0
  30. package/dist/commands/health/data-dir-usage.js +25 -13
  31. package/dist/commands/health/egress.js +54 -0
  32. package/dist/commands/health/html-report.js +1 -42
  33. package/dist/commands/health/improve-metrics.js +136 -591
  34. package/dist/commands/health/md-report.js +1 -6
  35. package/dist/commands/health/plugin-staleness.js +53 -3
  36. package/dist/commands/health/renderers.js +12 -4
  37. package/dist/commands/health/report-view-model.js +14 -120
  38. package/dist/commands/health/types-improve.js +4 -19
  39. package/dist/commands/health/windows.js +64 -74
  40. package/dist/commands/health.js +145 -143
  41. package/dist/commands/improve/consolidate/chunking.js +26 -117
  42. package/dist/commands/improve/consolidate/continuity-check.js +137 -0
  43. package/dist/commands/improve/consolidate/pair-pass.js +791 -0
  44. package/dist/commands/improve/consolidate/sanitize.js +54 -149
  45. package/dist/commands/improve/consolidate.js +589 -1127
  46. package/dist/commands/improve/content-hash.js +16 -24
  47. package/dist/commands/improve/distill/content-repair.js +18 -100
  48. package/dist/commands/improve/distill-guards.js +20 -81
  49. package/dist/commands/improve/distill-promotion-policy.js +23 -243
  50. package/dist/commands/improve/distill.js +608 -1041
  51. package/dist/commands/improve/eligibility.js +126 -390
  52. package/dist/commands/improve/execution.js +8 -10
  53. package/dist/commands/improve/extract-prompt.js +1 -2
  54. package/dist/commands/improve/extract.js +487 -1046
  55. package/dist/commands/improve/feedback-valence.js +0 -25
  56. package/dist/commands/improve/improve-cli.js +75 -169
  57. package/dist/commands/improve/improve-result-file.js +10 -66
  58. package/dist/commands/improve/improve-strategies.js +52 -4
  59. package/dist/commands/improve/improve-usage-report.js +18 -64
  60. package/dist/commands/improve/improve.js +480 -1074
  61. package/dist/commands/improve/ledger.js +119 -0
  62. package/dist/commands/improve/locks.js +2 -8
  63. package/dist/commands/improve/loop-stages.js +415 -1073
  64. package/dist/commands/improve/memory/derived-ref.js +12 -77
  65. package/dist/commands/improve/memory/memory-belief.js +16 -118
  66. package/dist/commands/improve/memory/memory-improve.js +266 -14
  67. package/dist/commands/improve/outcome-loop.js +28 -156
  68. package/dist/commands/improve/planner.js +5 -15
  69. package/dist/commands/improve/preparation.js +779 -2319
  70. package/dist/commands/improve/proactive-maintenance.js +34 -101
  71. package/dist/commands/improve/reflect-noise.js +104 -280
  72. package/dist/commands/improve/reflect.js +642 -1353
  73. package/dist/commands/improve/retrieval-gate.js +127 -0
  74. package/dist/commands/improve/retrieval-scope.js +92 -0
  75. package/dist/commands/improve/salience.js +41 -240
  76. package/dist/commands/improve/session-asset.js +19 -100
  77. package/dist/commands/improve/stage.js +322 -0
  78. package/dist/commands/lint/base-linter.js +37 -15
  79. package/dist/commands/proposal/drain.js +261 -578
  80. package/dist/commands/proposal/proposal-cli.js +19 -20
  81. package/dist/commands/proposal/proposal-types.js +31 -24
  82. package/dist/commands/proposal/proposal.js +38 -8
  83. package/dist/commands/proposal/propose.js +134 -160
  84. package/dist/commands/proposal/repository.js +1097 -1394
  85. package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
  86. package/dist/commands/proposal/validators/proposal-validators.js +1 -1
  87. package/dist/commands/proposal/validators/proposals.js +22 -89
  88. package/dist/commands/read/curate.js +105 -462
  89. package/dist/commands/read/knowledge.js +3 -2
  90. package/dist/commands/read/search-cli.js +16 -33
  91. package/dist/commands/read/search.js +17 -23
  92. package/dist/commands/read/show.js +57 -108
  93. package/dist/commands/sources/bundle-cli.js +25 -2
  94. package/dist/commands/sources/bundle-config-ops.js +4 -0
  95. package/dist/commands/sources/dangerous-env-audit.js +1 -2
  96. package/dist/commands/sources/info.js +127 -29
  97. package/dist/commands/sources/installed-stashes.js +197 -746
  98. package/dist/commands/sources/schema-repair.js +98 -129
  99. package/dist/commands/sources/source-add.js +62 -12
  100. package/dist/commands/sources/source-manage.js +9 -2
  101. package/dist/commands/sources/stash-cli.js +24 -4
  102. package/dist/commands/tasks/explain.js +10 -13
  103. package/dist/commands/tasks/tasks-cli.js +12 -13
  104. package/dist/commands/tasks/tasks.js +350 -936
  105. package/dist/commands/tasks/validate.js +26 -24
  106. package/dist/commands/workflow/plan.js +22 -29
  107. package/dist/commands/workflow-cli.js +4 -4
  108. package/dist/core/adapter/adapters/akm-adapter.js +2 -1
  109. package/dist/core/adapter/adapters/akm-lint.js +2 -3
  110. package/dist/core/adapter/adapters/akm-metadata.js +42 -12
  111. package/dist/core/adapter/adapters/akm-task-adapter.js +29 -8
  112. package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
  113. package/dist/core/adapter/execution-source.js +17 -29
  114. package/dist/core/asset/asset-placement.js +4 -13
  115. package/dist/core/asset/frontmatter.js +106 -1
  116. package/dist/core/asset/resolve-ref.js +1 -1
  117. package/dist/core/bundle-id.js +42 -5
  118. package/dist/core/bundle-rename.js +285 -0
  119. package/dist/core/config/config-io.js +1 -2
  120. package/dist/core/config/config-schema.js +9 -34
  121. package/dist/core/config/config-walker.js +1 -1
  122. package/dist/core/config/config.js +184 -111
  123. package/dist/core/config/engine-semantics.js +0 -2
  124. package/dist/core/config/legacy-source-shape-shim.js +38 -9
  125. package/dist/core/config/schema/embedding.js +20 -5
  126. package/dist/core/config/schema/engines.js +5 -0
  127. package/dist/core/config/schema/execution.js +1 -1
  128. package/dist/core/config/schema/experimental.js +1 -1
  129. package/dist/core/config/schema/improve-processes.js +54 -125
  130. package/dist/core/config/schema/improve.js +4 -42
  131. package/dist/core/config/schema/index-config.js +9 -48
  132. package/dist/core/config/schema/scheduler.js +12 -12
  133. package/dist/core/config/schema/search.js +6 -22
  134. package/dist/core/env-secret-ref.js +0 -1
  135. package/dist/core/errors.js +8 -9
  136. package/dist/core/file-change.js +13 -5
  137. package/dist/core/file-lock.js +76 -173
  138. package/dist/core/improve-result.js +35 -7
  139. package/dist/core/improve-types.js +0 -1
  140. package/dist/core/logs-db.js +2 -2
  141. package/dist/core/loopback.js +7 -12
  142. package/dist/core/non-task-input.js +20 -0
  143. package/dist/core/parse.js +13 -16
  144. package/dist/core/paths.js +0 -24
  145. package/dist/core/redaction.js +109 -2
  146. package/dist/core/run-lock.js +2 -5
  147. package/dist/core/spawn-env.js +1 -1
  148. package/dist/core/state/migrations.js +123 -61
  149. package/dist/core/state-db-scope.js +2 -4
  150. package/dist/core/state-db.js +126 -692
  151. package/dist/core/time.js +0 -20
  152. package/dist/core/type-presentation.js +1 -9
  153. package/dist/core/write-source.js +294 -1005
  154. package/dist/execution/input-contract.js +1 -1
  155. package/dist/execution/resolved-request.js +135 -689
  156. package/dist/execution/source.js +63 -257
  157. package/dist/execution/target-ref.js +1 -1
  158. package/dist/indexer/bundle-identity-guard.js +2 -2
  159. package/dist/indexer/db/llm-cache.js +2 -2
  160. package/dist/indexer/ensure-index.js +77 -73
  161. package/dist/indexer/index-rebuild-lock.js +3 -11
  162. package/dist/indexer/index-writer-lock.js +8 -17
  163. package/dist/indexer/index-written-assets.js +141 -154
  164. package/dist/indexer/indexer.js +400 -1124
  165. package/dist/indexer/links/declared-links.js +90 -0
  166. package/dist/indexer/materialize-embeddings.js +60 -397
  167. package/dist/indexer/passes/memory-inference.js +96 -90
  168. package/dist/indexer/passes/metadata.js +132 -219
  169. package/dist/indexer/read-preflight.js +0 -7
  170. package/dist/indexer/scan/doc-to-entry.js +2 -3
  171. package/dist/indexer/scan/drain-dir.js +1 -1
  172. package/dist/indexer/search/db-search.js +190 -590
  173. package/dist/indexer/search/fts-query.js +30 -41
  174. package/dist/indexer/search/ranking.js +28 -154
  175. package/dist/indexer/search/search-attribution.js +12 -32
  176. package/dist/indexer/search/search-fields.js +11 -15
  177. package/dist/indexer/search/search-hit-enrichers.js +54 -85
  178. package/dist/indexer/search/search-source.js +1 -4
  179. package/dist/indexer/usage/usage-events.js +36 -7
  180. package/dist/indexer/walk/walker.js +3 -4
  181. package/dist/integrations/agent/engine-fallback.js +23 -40
  182. package/dist/integrations/agent/engine-resolution.js +93 -183
  183. package/dist/integrations/agent/execution.js +507 -0
  184. package/dist/integrations/agent/model-map.js +28 -156
  185. package/dist/integrations/agent/request-lowering.js +66 -141
  186. package/dist/integrations/agent/runner-dispatch.js +143 -321
  187. package/dist/integrations/agent/runner.js +54 -14
  188. package/dist/integrations/lockfile.js +53 -101
  189. package/dist/llm/client.js +18 -6
  190. package/dist/llm/embedders/deterministic.js +2 -3
  191. package/dist/llm/embedders/profile.js +71 -0
  192. package/dist/llm/embedders/remote.js +11 -17
  193. package/dist/llm/feature-gate.js +0 -8
  194. package/dist/llm/index-passes.js +3 -5
  195. package/dist/llm/memory-infer.js +1 -2
  196. package/dist/llm/structured-call.js +5 -24
  197. package/dist/output/generic-render.js +23 -11
  198. package/dist/output/html-render.js +13 -10
  199. package/dist/output/render-registry.js +3 -32
  200. package/dist/output/shapes/helpers.js +25 -38
  201. package/dist/output/shapes/passthrough.js +1 -9
  202. package/dist/{indexer/graph/graph-types.js → output/text/bundle-rename.js} +4 -1
  203. package/dist/output/text/command-format.js +69 -31
  204. package/dist/output/text/helpers.js +1 -1
  205. package/dist/output/text/migrate.js +5 -14
  206. package/dist/output/text/proposal-format.js +48 -3
  207. package/dist/output/text/show-format.js +13 -17
  208. package/dist/output/text/workflow-format.js +0 -32
  209. package/dist/output/text.js +2 -0
  210. package/dist/registry/factory.js +4 -19
  211. package/dist/registry/network.js +66 -220
  212. package/dist/registry/providers/index.js +0 -2
  213. package/dist/registry/providers/skills-sh.js +3 -14
  214. package/dist/registry/providers/static-index.js +24 -26
  215. package/dist/registry/resolve.js +55 -131
  216. package/dist/scripts/akm-migrate-node.js +42948 -92369
  217. package/dist/scripts/akm-migrate.js +42935 -92354
  218. package/dist/setup/registry-stash-loader.js +4 -13
  219. package/dist/setup/semantic-assets.js +3 -44
  220. package/dist/setup/setup.js +1 -1
  221. package/dist/setup/steps/connection.js +5 -6
  222. package/dist/setup/steps/platforms.js +2 -2
  223. package/dist/setup/steps/tasks.js +25 -15
  224. package/dist/sources/provider-factory.js +17 -18
  225. package/dist/sources/providers/filesystem.js +2 -3
  226. package/dist/sources/providers/git-install.js +7 -1
  227. package/dist/sources/providers/git-provider.js +0 -3
  228. package/dist/sources/providers/git-stash.js +83 -21
  229. package/dist/sources/providers/npm.js +2 -4
  230. package/dist/sources/providers/provider-utils.js +5 -10
  231. package/dist/sources/providers/website.js +0 -2
  232. package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
  233. package/dist/sources/website-url.js +2 -2
  234. package/dist/storage/database.js +9 -35
  235. package/dist/storage/repositories/improve-ledger-repository.js +209 -0
  236. package/dist/storage/repositories/index-connection.js +39 -72
  237. package/dist/storage/repositories/index-entries-repository.js +131 -129
  238. package/dist/storage/repositories/index-entry-mapper.js +1 -2
  239. package/dist/storage/repositories/index-entry-schema.js +101 -268
  240. package/dist/storage/repositories/index-fts-repository.js +86 -256
  241. package/dist/storage/repositories/index-links-repository.js +143 -0
  242. package/dist/storage/repositories/index-llm-cache-repository.js +7 -9
  243. package/dist/storage/repositories/index-meta-repository.js +6 -4
  244. package/dist/storage/repositories/index-schema.js +257 -325
  245. package/dist/storage/repositories/index-utility-repository.js +8 -29
  246. package/dist/storage/repositories/index-vec-repository.js +133 -414
  247. package/dist/storage/repositories/outcome-repository.js +2 -1
  248. package/dist/storage/repositories/proposals-repository.js +104 -1
  249. package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
  250. package/dist/storage/repositories/salience-repository.js +1 -19
  251. package/dist/storage/repositories/task-history-repository.js +26 -4
  252. package/dist/storage/repositories/workflow-runs-repository.js +53 -244
  253. package/dist/storage/sqlite-migrations.js +136 -0
  254. package/dist/storage/sqlite-pragmas.js +11 -9
  255. package/dist/storage/sqlite-transaction.js +170 -0
  256. package/dist/storage/state-db-integrity.js +130 -0
  257. package/dist/tasks/activation-config.js +134 -62
  258. package/dist/tasks/backends/cron.js +191 -302
  259. package/dist/tasks/backends/exec-utils.js +2 -5
  260. package/dist/tasks/backends/launchd.js +141 -748
  261. package/dist/tasks/backends/schtasks.js +119 -623
  262. package/dist/tasks/prepare/prepare-support.js +5 -15
  263. package/dist/tasks/prepare/prepare.js +0 -2
  264. package/dist/tasks/resolve-akm-bin.js +20 -79
  265. package/dist/tasks/run/attempt-lifecycle.js +0 -1
  266. package/dist/tasks/run/load-task.js +1 -1
  267. package/dist/tasks/scheduler-binding.js +20 -238
  268. package/dist/tasks/scheduler-invocation.js +136 -244
  269. package/dist/tasks/scheduler-lock.js +53 -0
  270. package/dist/tasks/scheduler-sync.js +368 -679
  271. package/dist/tasks/source/parse-task-source.js +55 -9
  272. package/dist/tasks/source/task-source-v3-frozen.js +3 -4
  273. package/dist/tasks/source/task-to-v4.js +464 -88
  274. package/dist/workflows/authoring/authoring.js +3 -12
  275. package/dist/workflows/compile.js +211 -0
  276. package/dist/workflows/concurrency-policy.js +13 -74
  277. package/dist/workflows/exec/child-invocation.js +3 -17
  278. package/dist/workflows/exec/child-workflow.js +32 -141
  279. package/dist/workflows/exec/dispatch-redaction.js +13 -53
  280. package/dist/workflows/exec/environment.js +98 -0
  281. package/dist/workflows/exec/exec-unit.js +33 -140
  282. package/dist/workflows/exec/frozen-judge.js +7 -59
  283. package/dist/workflows/exec/native-executor.js +82 -341
  284. package/dist/workflows/exec/param-secrets.js +29 -47
  285. package/dist/workflows/exec/run-workflow.js +154 -387
  286. package/dist/workflows/exec/scheduler.js +9 -36
  287. package/dist/workflows/exec/step-work.js +127 -430
  288. package/dist/workflows/exec/unit-dispatch.js +11 -63
  289. package/dist/workflows/exec/unit-writer.js +8 -52
  290. package/dist/workflows/exec/worktree.js +39 -273
  291. package/dist/workflows/freeze/child-output-references.js +4 -15
  292. package/dist/workflows/freeze/environment.js +99 -92
  293. package/dist/workflows/freeze/freeze.js +172 -0
  294. package/dist/workflows/freeze/step-values.js +19 -21
  295. package/dist/workflows/freeze/targets/child-workflow.js +23 -92
  296. package/dist/workflows/freeze/targets/command.js +10 -33
  297. package/dist/workflows/freeze/targets/script.js +5 -12
  298. package/dist/workflows/freeze/targets/shell.js +3 -6
  299. package/dist/workflows/freeze/targets/task.js +25 -80
  300. package/dist/workflows/freeze/task-bindings.js +20 -67
  301. package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
  302. package/dist/workflows/ir/params.js +6 -51
  303. package/dist/workflows/ir/plan-hash.js +2 -34
  304. package/dist/workflows/parser.js +140 -43
  305. package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
  306. package/dist/workflows/renderer.js +36 -69
  307. package/dist/workflows/resource-limits.js +12 -120
  308. package/dist/workflows/runtime/agent-identity.js +8 -40
  309. package/dist/workflows/runtime/run-outputs.js +3 -6
  310. package/dist/workflows/runtime/run-plan.js +316 -0
  311. package/dist/workflows/runtime/runs.js +48 -200
  312. package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
  313. package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
  314. package/dist/workflows/validate-summary.js +2 -7
  315. package/docs/integration/bundling-akm.md +49 -42
  316. package/docs/migration/README.md +1 -0
  317. package/docs/migration/release-notes/0.9.17.md +43 -0
  318. package/docs/migration/v0.9.1-to-v0.9.2.md +23 -7
  319. package/docs/reference/cli.md +232 -135
  320. package/docs/reference/configuration.md +71 -57
  321. package/docs/reference/data-and-telemetry.md +20 -21
  322. package/docs/reference/tasks.md +105 -39
  323. package/docs/reference/workflow-schema.md +14 -18
  324. package/docs/reference/workflows.md +6 -9
  325. package/package.json +1 -1
  326. package/schemas/akm-config.json +115 -738
  327. package/schemas/akm-workflow.json +1 -0
  328. package/dist/assets/improve-strategies/graph-refresh.json +0 -15
  329. package/dist/assets/prompts/contradiction-judge.md +0 -33
  330. package/dist/assets/prompts/graph-extract-system.md +0 -1
  331. package/dist/assets/prompts/graph-extract-user-prompt.md +0 -35
  332. package/dist/assets/prompts/metadata-enhance-system.md +0 -1
  333. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +0 -4
  334. package/dist/commands/health/advisories.js +0 -150
  335. package/dist/commands/health/metrics.js +0 -329
  336. package/dist/commands/health/surfaces.js +0 -102
  337. package/dist/commands/improve/anti-collapse.js +0 -83
  338. package/dist/commands/improve/collapse-detector.js +0 -432
  339. package/dist/commands/improve/consolidate/eligibility.js +0 -48
  340. package/dist/commands/improve/consolidate/merge.js +0 -149
  341. package/dist/commands/improve/distill/promote-memory.js +0 -291
  342. package/dist/commands/improve/distill/quality-gate.js +0 -337
  343. package/dist/commands/improve/eval-cases.js +0 -52
  344. package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
  345. package/dist/commands/improve/proposal-envelope.js +0 -31
  346. package/dist/commands/improve/run-context.js +0 -123
  347. package/dist/commands/improve/shared.js +0 -31
  348. package/dist/commands/improve/source-identity.js +0 -28
  349. package/dist/commands/improve/triage.js +0 -96
  350. package/dist/commands/proposal/drain-policies.js +0 -151
  351. package/dist/commands/sources/update-transaction.js +0 -220
  352. package/dist/core/action-contributors.js +0 -28
  353. package/dist/core/config/config-version-shim.js +0 -101
  354. package/dist/core/fs-txn.js +0 -405
  355. package/dist/core/lexical-score.js +0 -25
  356. package/dist/core/maintenance-barrier.js +0 -167
  357. package/dist/execution/executable-identity.js +0 -105
  358. package/dist/execution/guarded-source.js +0 -427
  359. package/dist/indexer/db/graph-db.js +0 -444
  360. package/dist/indexer/graph/graph-boost.js +0 -427
  361. package/dist/indexer/graph/graph-dedup.js +0 -95
  362. package/dist/indexer/graph/graph-extraction.js +0 -1108
  363. package/dist/indexer/search/name-match.js +0 -35
  364. package/dist/indexer/search/ranking-contributors.js +0 -515
  365. package/dist/indexer/search/ranking-types.js +0 -4
  366. package/dist/indexer/walk/project-context.js +0 -192
  367. package/dist/integrations/agent/execution-cascade.js +0 -566
  368. package/dist/integrations/agent/execution-definitions.js +0 -202
  369. package/dist/integrations/agent/execution-lowering.js +0 -841
  370. package/dist/integrations/agent/execution-preparation.js +0 -98
  371. package/dist/integrations/agent/inline-execution.js +0 -74
  372. package/dist/llm/graph-extract.js +0 -728
  373. package/dist/llm/metadata-enhance.js +0 -96
  374. package/dist/registry/create-provider-registry.js +0 -29
  375. package/dist/registry/pinned-request-helper.js +0 -247
  376. package/dist/registry/pinned-transport.js +0 -717
  377. package/dist/sources/providers/index.js +0 -14
  378. package/dist/storage/engines/sqlite-migrations.js +0 -271
  379. package/dist/storage/repositories/canaries-repository.js +0 -107
  380. package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
  381. package/dist/storage/repositories/registry-cache.js +0 -113
  382. package/dist/tasks/scheduler-sync-preview.js +0 -52
  383. package/dist/tasks/source/task-to-v3.js +0 -507
  384. package/dist/workflows/freeze/resolve-steps.js +0 -86
  385. package/dist/workflows/freeze/source-freeze.js +0 -64
  386. package/dist/workflows/ir/compile.js +0 -321
  387. package/dist/workflows/ir/environment-v4.js +0 -330
  388. package/dist/workflows/ir/freeze-v4.js +0 -153
  389. package/dist/workflows/ir/schema-v4.js +0 -745
  390. package/dist/workflows/ir/schema.js +0 -354
  391. package/dist/workflows/program/schema.js +0 -77
  392. package/dist/workflows/runtime/checkin.js +0 -57
  393. package/dist/workflows/runtime/plan-classifier.js +0 -196
  394. package/dist/workflows/runtime/unit-checkin.js +0 -45
  395. package/dist/workflows/runtime/unit-phases.js +0 -20
  396. package/dist/workflows/schema.js +0 -4
  397. package/dist/workflows/source-ir/compile.js +0 -200
  398. package/dist/workflows/source-ir/program.js +0 -50
  399. package/dist/workflows/source-ir/result.js +0 -26
  400. package/dist/workflows/source-ir/schema.js +0 -786
  401. package/dist/workflows/source-ir/triggers.js +0 -79
  402. package/dist/workflows/source-ir/uses.js +0 -40
  403. 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,43 @@
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, except task sources. A
7
+ `version: 2` or `version: 3` task source fails on its own with
8
+ `TASK_SCHEMA_VERSION_UNSUPPORTED`, naming `akm migrate apply`, which converts
9
+ it to `version: 4` once; the other tasks keep running. A config key this
10
+ release does not know -- retired, misspelled, or written by a newer release --
11
+ is kept in memory and named once, never a reason to refuse the config;
12
+ ordinary writes round-trip it, and `akm migrate apply` drops it.
13
+ `akm migrate apply` has one config step (`configFile`): read config.json
14
+ through the same pipeline every load runs and write the current shape back,
15
+ under a backup.
16
+
17
+ Scheduling is one list. `scheduler.enabled` in config.json holds the
18
+ fully-qualified refs this host schedules (`bundle//tasks/x`). The
19
+ 0.9.17-alpha `{kind, ref, sourceId}` grant objects are read as their ref. A
20
+ config with no list at all -- every release before 0.9.17 -- means "keep
21
+ what is installed": the first `akm task sync` (or `setup`, `task enable`,
22
+ `task disable`, `task add`) after the upgrade takes the akm-written rows
23
+ already in the native scheduler as the host's choice, writes the list, and
24
+ says so. An explicit list, empty or not, is never second-guessed. There are
25
+ no grants, no source identities, no carry-forward and no fire-time gate.
26
+
27
+ Removed machinery: filesystem transaction journals for proposal accept/revert
28
+ (the asset is written, then the proposal row and its event are recorded in
29
+ one state.db transaction; a crash in between leaves a re-acceptable pending
30
+ proposal); the maintenance barrier, its per-process activity registry (the
31
+ source of the lock-sidecar leak) and the SQLite lock-operation mutex (a lock
32
+ file is one `O_EXCL` create); startup version reconciliation and
33
+ `--host-local`; the akm-install enumerator and `akm upgrade --version/--tag`;
34
+ the upgrade and transaction health advisories; the `akm info` compat
35
+ manifest. `akm migrate apply` removes the files those left under `$DATA`,
36
+ `$STATE` and `$CONFIG`.
37
+
38
+ Every historical shape akm has written is exercised by the upgrade rehearsal
39
+ (`tests/integration/upgrade-rehearsal/`) before each release: a real previous
40
+ release builds a home, the candidate installs over it in place, and the
41
+ rehearsal drives migrate, bundle list, search, show, task sync, health and a
42
+ scheduled task's generated cron command, then confirms the previous release
43
+ still runs against the candidate-written home.
@@ -53,14 +53,30 @@ 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. (0.9.17-alpha.7 removed that shim: a v2/v3 task
61
+ source now fails on its own, naming `akm migrate apply`, which `akm upgrade`
62
+ runs after an install.)
59
63
 
60
64
  ## Task sources
61
65
 
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.
66
+ akm 0.9.2 has shipped three task source generations. **Task source v4** is
67
+ the current, standing grammar; an older `version: 2` or `version: 3` file
68
+ still reads and runs through an in-memory read shim that converts it to v4
69
+ on the same bytes `akm migrate apply` would produce, with a one-line stderr
70
+ deprecation warning and no disk write. Only a v2/v3 document the
71
+ deterministic conversion itself cannot resolve fails to load. `akm migrate
72
+ apply` remains the way to rewrite the file on disk and silence the warning.
73
+ (A later release — see the [Tasks reference](../reference/tasks.md) for the
74
+ current grammar — extended the same kind of shim to a `version: 4` document
75
+ whose `schedule[]` still carries a per-entry `enabled` key, retired from
76
+ task source v4's own grammar since; the field is stripped without being
77
+ read, never re-added. 0.9.17-alpha.7 removed both shims: akm now reads only
78
+ task source v4, and each older file fails on its own, naming
79
+ `akm migrate apply`.)
64
80
 
65
81
  **Before — 0.9.1 task v2:**
66
82
 
@@ -77,7 +93,7 @@ redact: [REVIEW_TOKEN]
77
93
  ```
78
94
 
79
95
  **An intermediate generation — task v3** (shipped earlier in the 0.9.x
80
- line; also no longer accepted):
96
+ line; also read only through the shim now, not as a standing grammar):
81
97
 
82
98
  ```yaml
83
99
  version: 3
@@ -667,7 +683,7 @@ phase-specific code:
667
683
  | Code | Domain |
668
684
  |---|---|
669
685
  | `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`). |
686
+ | `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. From 0.9.17-alpha.7, every v2/v3 document fails this way, naming `akm migrate apply`. |
671
687
  | `TARGET_REF_INVALID` | A value is not a canonical `commands/`, `scripts/`, `tasks/`, or `workflows/` asset ref (malformed shapes, GitHub locators, other asset families). |
672
688
  | `WORKFLOW_SOURCE_INVALID` | A workflow-source compile failure other than the one below. |
673
689
  | `COMPOSITION_INVALID` | A composition-policy rejection: a rejected `with:`, a multi-job document, a composition cycle/depth/size violation. |