akm-cli 0.9.2-alpha.4 → 0.9.2

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 (143) hide show
  1. package/CHANGELOG.md +493 -0
  2. package/STABILITY.md +23 -5
  3. package/dist/assets/hints/cli-hints-full.md +12 -7
  4. package/dist/assets/tasks/core/extract.yml +3 -5
  5. package/dist/assets/tasks/core/improve.yml +3 -5
  6. package/dist/assets/tasks/core/index-refresh.yml +3 -5
  7. package/dist/assets/tasks/core/sync.yml +3 -5
  8. package/dist/assets/tasks/core/version-check.yml +3 -5
  9. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +3 -5
  10. package/dist/assets/tasks/improve/akm-improve-catchup.yml +6 -6
  11. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +3 -5
  12. package/dist/assets/tasks/improve/akm-improve-frequent.yml +3 -5
  13. package/dist/assets/tasks/improve/akm-improve-nightly.yml +3 -5
  14. package/dist/cli/unknown-flags.js +12 -1
  15. package/dist/cli.js +8 -1
  16. package/dist/commands/command/command-execution.js +23 -2
  17. package/dist/commands/health/improve-metrics.js +38 -0
  18. package/dist/commands/health/windows.js +8 -4
  19. package/dist/commands/health.js +8 -4
  20. package/dist/commands/lint/index.js +1 -1
  21. package/dist/commands/migrate-cli.js +130 -24
  22. package/dist/commands/proposal/validators/proposal-validators.js +7 -2
  23. package/dist/commands/tasks/explain.js +304 -0
  24. package/dist/commands/tasks/tasks-cli.js +185 -3
  25. package/dist/commands/tasks/tasks.js +265 -52
  26. package/dist/commands/workflow/plan.js +159 -0
  27. package/dist/commands/workflow-cli.js +94 -2
  28. package/dist/core/activation-policy.js +2 -12
  29. package/dist/core/adapter/adapters/akm-lint.js +7 -4
  30. package/dist/core/adapter/adapters/akm-metadata.js +26 -14
  31. package/dist/core/adapter/adapters/akm-task-adapter.js +13 -10
  32. package/dist/core/errors.js +45 -0
  33. package/dist/core/json-schema.js +15 -5
  34. package/dist/core/state/migrations.js +57 -0
  35. package/dist/core/state-db.js +16 -14
  36. package/dist/core/subprocess.js +47 -13
  37. package/dist/execution/guarded-source.js +44 -0
  38. package/dist/execution/input-contract.js +250 -0
  39. package/dist/execution/target-ref.js +63 -0
  40. package/dist/indexer/usage/usage-events.js +14 -3
  41. package/dist/integrations/agent/execution-lowering.js +12 -1
  42. package/dist/output/shapes/passthrough.js +2 -0
  43. package/dist/output/text/helpers.js +1 -1
  44. package/dist/output/text/migrate.js +12 -3
  45. package/dist/output/text/workflow-format.js +192 -10
  46. package/dist/output/text/workflow.js +2 -1
  47. package/dist/runtime.js +1 -0
  48. package/dist/scripts/akm-migrate-node.js +11838 -10118
  49. package/dist/scripts/akm-migrate.js +11828 -10117
  50. package/dist/setup/steps/tasks.js +34 -17
  51. package/dist/storage/repositories/task-history-repository.js +5 -1
  52. package/dist/storage/repositories/workflow-runs-repository.js +144 -6
  53. package/dist/tasks/backends/launchd.js +31 -84
  54. package/dist/tasks/embedded.js +13 -7
  55. package/dist/tasks/model/invocation.js +4 -0
  56. package/dist/tasks/prepare/prepare-script-target.js +9 -0
  57. package/dist/tasks/prepare/prepare-support.js +154 -0
  58. package/dist/tasks/prepare/prepare.js +117 -0
  59. package/dist/tasks/prepare/prepared-execution.js +4 -0
  60. package/dist/tasks/prepare/script-capture.js +80 -0
  61. package/dist/tasks/run/attempt-lifecycle.js +165 -0
  62. package/dist/tasks/run/load-task.js +117 -0
  63. package/dist/tasks/run/provenance.js +20 -0
  64. package/dist/tasks/run/run-command-task.js +92 -0
  65. package/dist/tasks/run/run-native-task.js +222 -0
  66. package/dist/tasks/run/run-task.js +99 -0
  67. package/dist/tasks/run/run-workflow-task.js +222 -0
  68. package/dist/tasks/run/task-history.js +134 -0
  69. package/dist/tasks/run/task-log.js +179 -0
  70. package/dist/tasks/run/task-result.js +19 -0
  71. package/dist/tasks/scheduler-binding.js +66 -2
  72. package/dist/tasks/scheduler-invocation.js +63 -3
  73. package/dist/tasks/scheduler-sync.js +77 -14
  74. package/dist/tasks/source/bounded-document.js +455 -0
  75. package/dist/tasks/source/parse-task-source.js +59 -0
  76. package/dist/tasks/source/project-v4.js +62 -0
  77. package/dist/tasks/source/task-input-diagnostics.js +36 -0
  78. package/dist/tasks/source/task-source-v4.js +626 -0
  79. package/dist/tasks/source-v3.js +10 -733
  80. package/dist/tasks/task-run-reserved-flags.js +79 -0
  81. package/dist/workflows/authoring/authoring.js +17 -8
  82. package/dist/workflows/exec/child-invocation.js +34 -0
  83. package/dist/workflows/exec/child-workflow.js +370 -0
  84. package/dist/workflows/exec/exec-unit.js +50 -170
  85. package/dist/workflows/exec/frozen-judge.js +19 -2
  86. package/dist/workflows/exec/native-executor.js +49 -27
  87. package/dist/workflows/exec/param-secrets.js +12 -0
  88. package/dist/workflows/exec/run-workflow.js +48 -59
  89. package/dist/workflows/exec/step-work.js +222 -80
  90. package/dist/workflows/exec/unit-dispatch.js +72 -0
  91. package/dist/workflows/freeze/child-output-references.js +94 -0
  92. package/dist/workflows/freeze/environment.js +174 -0
  93. package/dist/workflows/freeze/identity.js +22 -0
  94. package/dist/workflows/freeze/resolve-steps.js +78 -0
  95. package/dist/workflows/freeze/source-freeze.js +57 -0
  96. package/dist/workflows/freeze/step-values.js +68 -0
  97. package/dist/workflows/freeze/targets/child-workflow.js +206 -0
  98. package/dist/workflows/freeze/targets/command.js +81 -0
  99. package/dist/workflows/freeze/targets/script.js +57 -0
  100. package/dist/workflows/freeze/targets/shell.js +31 -0
  101. package/dist/workflows/freeze/targets/task.js +179 -0
  102. package/dist/workflows/freeze/task-bindings.js +180 -0
  103. package/dist/workflows/ir/compile.js +59 -11
  104. package/dist/workflows/ir/environment-v4.js +3 -3
  105. package/dist/workflows/ir/freeze-v4.js +41 -7
  106. package/dist/workflows/ir/params.js +58 -131
  107. package/dist/workflows/ir/plan-hash.js +3 -3
  108. package/dist/workflows/ir/schema-v4.js +246 -17
  109. package/dist/workflows/parser.js +74 -2
  110. package/dist/workflows/program/schema.js +5 -2
  111. package/dist/workflows/resource-limits.js +20 -0
  112. package/dist/workflows/runtime/plan-classifier.js +24 -7
  113. package/dist/workflows/runtime/run-outputs.js +103 -0
  114. package/dist/workflows/runtime/runs.js +114 -9
  115. package/dist/workflows/runtime/workflow-asset-loader.js +14 -6
  116. package/dist/workflows/source-files.js +5 -5
  117. package/dist/workflows/source-ir/compare.js +17 -0
  118. package/dist/workflows/source-ir/compile.js +7 -3
  119. package/dist/workflows/source-ir/github-yaml.js +64 -17
  120. package/dist/workflows/source-ir/schema.js +69 -21
  121. package/dist/workflows/source-ir/semantics.js +7 -25
  122. package/dist/workflows/source-ir/triggers.js +79 -0
  123. package/dist/workflows/source-ir/uses.js +33 -7
  124. package/docs/migration/README.md +1 -1
  125. package/docs/migration/release-notes/0.9.2.md +87 -11
  126. package/docs/migration/release-notes/README.md +3 -2
  127. package/docs/migration/v0.8-to-v0.9.md +13 -11
  128. package/docs/migration/v0.9.0-troubleshooting.md +20 -13
  129. package/docs/migration/v0.9.1-to-v0.9.2.md +598 -49
  130. package/docs/reference/README.md +1 -1
  131. package/docs/reference/cli.md +140 -46
  132. package/docs/reference/configuration.md +6 -5
  133. package/docs/reference/supported-formats.md +9 -5
  134. package/docs/reference/tasks.md +338 -75
  135. package/docs/reference/workflow-schema.md +290 -16
  136. package/docs/reference/workflows.md +57 -7
  137. package/package.json +1 -1
  138. package/schemas/akm-task.json +173 -118
  139. package/schemas/akm-workflow.json +28 -0
  140. package/dist/tasks/runner.js +0 -941
  141. package/dist/tasks/runtime-v3.js +0 -281
  142. package/dist/workflows/ir/source-freeze-v4.js +0 -506
  143. package/dist/workflows/source-ir/ordering.js +0 -38
package/CHANGELOG.md CHANGED
@@ -6,6 +6,499 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.9.2] - 2026-08-29
10
+
11
+ ### Fixed
12
+
13
+ - **A blocked workflow run became permanently unresumable after `akm
14
+ workflow abandon` (#847).** Abandon correctly moved the run to `failed`
15
+ but left its current step `blocked`; the durable-spine validator then
16
+ rejected that honest abandoned shape as corruption before `resume` could
17
+ reopen the step. Failed-run validation now accepts the three legitimate
18
+ current-step states — `pending` for an abandoned active run, `blocked` for
19
+ an abandoned blocked run, and `failed` for an execution failure — and
20
+ `resume` normalizes each back to `pending` as promised by the CLI help.
21
+
22
+ - **`akm task sync` could compute another bundle's real scheduler entries as
23
+ drift and try to remove them (#846).** Removal was scoped by a bundle
24
+ *display name* (`bundleName`/`--bundle` target) — a value derived from a
25
+ directory basename that two unrelated bundles can legitimately share (an
26
+ unconfigured bundle's name is deduped only against its own config's
27
+ bundles, never against other bundles actually installed on the machine).
28
+ A primary/unconfigured-bundle sync now additionally confirms a
29
+ name-matching installed entry's *resolved bundle path*, recovered from
30
+ that entry's own scheduler-context descriptor, before treating it as
31
+ eligible for reconcile — and refuses (rather than assumes) when that path
32
+ can't be established. **Backward compatibility:** every entry installed by
33
+ this codebase already carries a scheduler-context descriptor (the
34
+ `--scheduler-context` file used to restore the scheduled process's
35
+ environment), so existing installations resolve correctly with no user
36
+ action required. An entry whose descriptor is missing, unreadable, or
37
+ owned by a different OS user is never assumed to belong to the invoking
38
+ bundle; such an entry is simply left untouched by sync (it will not be
39
+ auto-repaired or removed) until it is reinstalled or removed by hand.
40
+
41
+ - **Scheduled tasks on Windows ran but recorded no output.** A task fired by
42
+ Task Scheduler logged `exit_code=0` with an empty log: the command really
43
+ ran, but nothing it printed was captured. Captured runs asked for their own
44
+ process group, which is what lets a timeout reap the whole descendant tree
45
+ on macOS/Linux; on Windows that same flag instead means "start with no
46
+ console", and a console host started that way (`powershell.exe`, `cmd.exe`)
47
+ allocates its own console and thereby replaces the pipes it was handed, so
48
+ its output went nowhere. Windows got no reaping benefit in exchange — the
49
+ group kill it enables is a POSIX-only call — so captured Windows runs no
50
+ longer ask for it. A run whose output capture is incomplete for any other
51
+ reason now says so in the task log instead of leaving a silent gap.
52
+ - **A scheduled shell task could fail instantly with exit code 1 on Windows.**
53
+ Two defects on the default Windows task shell (`powershell`): a
54
+ scheduler-fired run restores the PATH captured at install time, which can be
55
+ minimal, and `powershell.exe` is not on it (it lives in a `WindowsPowerShell`
56
+ subdirectory, not `System32`), so the spawn failed outright; and rebinding a
57
+ bare leading `akm` produced a quoted path, which PowerShell parses as a
58
+ string rather than a command to run. Both shells are now resolved to
59
+ absolute paths on Windows, and a rebound invocation carries PowerShell's
60
+ call operator. `cmd`-shell tasks additionally pass their hand-quoted command
61
+ line through verbatim, since `cmd /s /c` does not read a standard argv.
62
+ - **`state.db` could fail to open on macOS** with "this platform has no
63
+ descriptor-backed path." The descriptor-alias optimization used to bind a
64
+ SQLite open to its exact held inode isn't reliably available everywhere —
65
+ Windows never has one, and macOS's `/dev/fd` is a small fixed-size table
66
+ that a process holding higher file-descriptor numbers (as a bundled
67
+ standalone binary routinely does) can miss. The surrounding identity checks
68
+ (dev/ino/uid, re-verified immediately before and after every open) are the
69
+ real protection; a missing alias now falls back to the plain path on any
70
+ platform instead of throwing, matching the fallback Windows already used.
71
+ - The Windows build shipped no embedded template assets, because the
72
+ build-time asset copy anchored its rewrites on forward slashes while the
73
+ glob yields platform-native separators.
74
+
75
+ ## [0.9.2-alpha.5] - 2026-08-28
76
+
77
+ ### Breaking changes & migration
78
+
79
+ - **Durable workflow plans bump to `irVersion` 5.** A stored run frozen
80
+ before this release (`irVersion` 4 or earlier) can no longer `resume`,
81
+ `next`, `complete`, or `run` — those fail closed with `UsageError` code
82
+ `WORKFLOW_IR_VERSION_UNSUPPORTED`, naming the run and pointing at
83
+ `akm workflow abandon`. `akm workflow status`, `akm workflow list`, and
84
+ `akm workflow abandon` keep working on those runs — no data is lost, and
85
+ their step spine is untouched by abandoning. **Before upgrading**, run
86
+ `akm workflow list --active` and either let in-flight runs finish or
87
+ abandon them; after upgrading, recover a blocked run with
88
+ `akm workflow abandon <id>` followed by `akm workflow run <ref>` to start
89
+ fresh from the current authored source. There is no second executor and no
90
+ compatibility replay layer for a pre-`irVersion`-5 plan. The unit and gate
91
+ input-hash prefixes bump alongside it, from `hashVersion` 5 to
92
+ `hashVersion` 7, so that a freshly frozen plan's units are never
93
+ content-addressed the same way an old, no-longer-executable plan's were.
94
+ (`hashVersion` 6 existed only inside this release's own development and
95
+ never shipped in any version — the durable step a released install sees is
96
+ 5 → 7.) The unit preimage also gains one **conditional** field,
97
+ `taskInputs`: the *resolved* values of a task-composing step's input
98
+ bindings, present only for a unit whose frozen target carries
99
+ `inputBindings` — a binding-free unit's preimage keeps exactly the shape it
100
+ had. Hashing the resolved values, not just the frozen binding expression,
101
+ is what makes a resumed run whose upstream step output changed under a
102
+ `{from: "steps.<id>.output"}` binding fail loudly as a replay divergence
103
+ instead of silently reusing the completed unit's stale result.
104
+ See [Migrating from akm 0.9.1 to 0.9.2](docs/migration/v0.9.1-to-v0.9.2.md#workflow-cutover).
105
+ - A workflow step that passes `with:` to a `tasks/<ref>` target whose task
106
+ declares **no** `inputs:` (a `version: 4` task with no `inputs:` key at
107
+ all) is now **rejected** (`UsageError` code
108
+ `COMPOSITION_INVALID`, exit 2) instead of having the authored mapping
109
+ silently dropped at freeze — for any authored shape, including `with: {}`.
110
+ When the target's task source **does** declare `inputs:`, `with:` now
111
+ **binds** them instead: a literal value, or a `{from: "steps.<id>.output…"}`
112
+ reference resolved just before the unit dispatches (the reference grammar
113
+ also accepts `{from: "params.<name>"}`, but a composing step's own
114
+ document can never declare `params:`, so that form is not reachable in
115
+ this release). See [Task input bindings](docs/reference/tasks.md#typed-inputs-and-output)
116
+ for the full grammar. `with:` on `uses: akm/command` is unaffected — it is
117
+ still that builtin's own action-argument bag, never an input binding.
118
+ - **New rejection:** `with:` on a workflow step targeting `uses:
119
+ commands/<ref>` or `uses: scripts/<ref>` is now **rejected**
120
+ (`COMPOSITION_INVALID`, exit 2) instead of being silently discarded at
121
+ freeze — neither target is a binding surface. Remove the `with:` block from
122
+ any such step; a command/script-composing step never accepted its values
123
+ in the first place, so this closes a defect rather than a feature.
124
+ - Composing a task source v4 document from a workflow step's `uses:
125
+ tasks/<ref>`, where the task's own target is a workflow, is no longer
126
+ deferred: it now **freezes and dispatches** normally, the same as a
127
+ direct `uses: workflows/<ref>` step. The prior release's
128
+ `TASK_SOURCE_INVALID` "arrives in a later 0.9.x release" rejection for this
129
+ case is gone.
130
+ - Task-source validation errors raised through the shared `sourceError`
131
+ funnel (field- and semantic-level checks: missing/invalid fields, schedule
132
+ conflicts, and similar) now report code **`TASK_SOURCE_INVALID`** instead of
133
+ `INVALID_FLAG_VALUE`. YAML syntax, size, structure, and expansion failures
134
+ (malformed YAML, oversized source, unsupported YAML constructs, and
135
+ alias/tag/depth/node-count limits) are raised earlier, before that funnel is
136
+ reached — early in this release these still reported `INVALID_FLAG_VALUE`,
137
+ but by 0.9.2's release they report `TASK_SOURCE_INVALID` too (the terminal
138
+ diagnostics ratchet, see the Changed entry below): task-source failures no
139
+ longer split across two codes, so **scripts that were branching on both
140
+ `TASK_SOURCE_INVALID` and `INVALID_FLAG_VALUE` for a task-source error can
141
+ drop the `INVALID_FLAG_VALUE` arm**. Every such error's message prefix is
142
+ `Invalid task source at <path>[:<line>]: …` — not `Invalid task v3 source`,
143
+ since the label no longer names a specific schema generation (task source
144
+ v4 is the only version `src/` accepts by release; see the "Task v3 sources
145
+ no longer parse" entry below). The envelope's `error` message text and exit
146
+ code 2 are unchanged for every task-source error. The envelope's `hint`
147
+ field and the `detail` text `akm lint` and the akm-task adapter report for
148
+ the same failure change from `… Run \`akm <command> --help\` to see
149
+ accepted values.` to `… Fix the task source at the reported path and line,
150
+ then re-run.`
151
+ - **Task-history / JSON-output `target.kind` vocabulary changed.** A prepared
152
+ command (agent/LLM) run now reports `"command"` (formerly the confusingly
153
+ inverted `"prompt"`); the former shared `"command"` string for the native
154
+ arm splits into `"shell"` and `"script"`, now distinguishable in history;
155
+ `"workflow"` and `"unknown"` are unchanged. **Consumers branching on
156
+ `"prompt"` must handle `"command"`** — this affects `akm task run`'s and
157
+ `akm task history`'s JSON output (`result.target.kind` /
158
+ `rows[].target.kind`) and any code reading `task_history.target_kind`
159
+ directly. Rows written by earlier akm versions are read back **mapped** to
160
+ the new vocabulary (legacy `"prompt"` → `{kind:"command", engine}`, legacy
161
+ `"command"` → `{kind:"shell"}`), so `akm task history` output stays uniform
162
+ across vintages. New rows carry a `targetVocab: 2` marker inside their
163
+ `metadata_json`, which akm versions before this one reject as an unknown
164
+ metadata field — a mixed-version fleet must upgrade every `akm` that writes
165
+ task history before an older one reads it.
166
+ - **Task source v4 (`version: 4`) is the task source grammar.** By 0.9.2's
167
+ release, `version: 4` is the *only* version `src/` accepts — see the
168
+ "Task v3 sources no longer parse" entry below for the cutover, the
169
+ `TASK_SCHEMA_VERSION_UNSUPPORTED` rejection, and the migration path. What
170
+ follows describes the v4 grammar itself. Scheduling is **optional**: a
171
+ task source v4 document with no `schedule:` parses, is runnable with
172
+ `akm task run`, and is **skipped** by `akm task sync` (zero bindings, zero
173
+ failures) instead of being rejected for missing a trigger — this is now
174
+ the *only* scheduling grammar; the second syntax task v3 offered
175
+ (`akm.schedule` / a document's top-level `on:`) is retired along with v3
176
+ itself. Task source v4 removes the `akm:` options bag and the `on:`
177
+ trigger block outright;
178
+ every field they carried is a top-level key instead: `akm.description` →
179
+ `description`, `akm.when_to_use` → `when_to_use`, `akm.tags` → `tags`,
180
+ `akm.agent` → `agent`, `akm.engine` → `engine`, `akm.model` → `model`,
181
+ `akm.inference` → `inference`, `akm.outputSchema` → `output`,
182
+ `akm.tools` → `tools`, `akm.timeout` → `timeout`, `akm.redact` →
183
+ `redact`, `akm.maxSteps` → `maxSteps`, `akm.maxRetries` → `maxRetries`,
184
+ `akm.schedule` → top-level `schedule:`, and `akm.enabled` → each
185
+ `schedule:` entry's own `enabled` (v3's single document-level flag
186
+ becomes per-binding in task source v4, defaulting to `true`; the
187
+ document-level `enabled` skip that read it is gone with v3, since a v4
188
+ document has no document-level `enabled` key to read). The GitHub-action
189
+ `uses:` target (`owner/repo@ref`) is removed outright — see the "GitHub
190
+ Action locators are no longer recognized anywhere" entry below.
191
+ `with:` is legal in task source v4 only alongside
192
+ `uses: akm/command`; every other target uses the new typed `inputs:`
193
+ declarations instead of `with:`. A declared `inputs:` name may not collide
194
+ with a flag `akm task run` already declares for itself (`bundle`, `format`,
195
+ `detail`, `shape`, `output`, `scheduled`, `quiet`, `verbose`, `help`,
196
+ `no-quiet`, `no-verbose`) or with `target`, the spelling `akm task`
197
+ retired in 0.9 and still answers with a rename hint in every spelling —
198
+ such a document now fails `TASK_SOURCE_INVALID` at parse time, since the
199
+ colliding name would otherwise route a caller's value into `akm task run`'s
200
+ own flag, or into that rename hint, instead of the declared input. `akm
201
+ task run <id>` now accepts exact-name input flags for a task source v4
202
+ document's declared `inputs:` (an undeclared flag name fails
203
+ `UNKNOWN_FLAG`; a bad value or an unsatisfied `required: true` declaration
204
+ fails `INPUT_BINDING_INVALID`; both exit 2 with the usual JSON error
205
+ envelope).
206
+ Where those materialized values go depends on the task's own target: for
207
+ `uses: workflows/<ref>` they become the child run's params (the existing
208
+ `with:` → params path); for a `run:`, `scripts/<ref>`, or `commands/<ref>`
209
+ target they are validated and then **discarded** — `akm task run`'s own
210
+ flags never populate an `AKM_TASK_INPUTS` environment variable or a
211
+ `## Task inputs` prompt block. Those two surfaces are a separate delivery
212
+ path: they carry a **workflow step's** `with:` binding into a task it
213
+ composes via `uses: tasks/<ref>` (see the `with:`-binding bullet above),
214
+ not `akm task run`'s own CLI flags. `schedule[].inputs` on a `version: 4`
215
+ task source are compiled the same way `akm task run`'s flags are: `akm
216
+ task sync` builds them into the scheduler binding's own invocation tail
217
+ instead of only validating and discarding them, so a scheduled run is
218
+ subject to the identical workflow-target-only delivery rule. `akm task
219
+ add` now authors task source v4 (see the "Task v3 sources no longer
220
+ parse" entry below for the `--params` → typed `inputs:` change). A
221
+ `version: 4` task source is now a valid workflow-step target (see above).
222
+ The published [task schema](schemas/akm-task.json) now publishes only the
223
+ single `version: 4` shape — the `version: 3` arm and its `githubActionRef`
224
+ definition are removed; a `version: 2` or `version: 3` document validates
225
+ against nothing in this schema and is converted by `akm migrate apply`
226
+ instead. **Binding a task's inputs adds nothing to the hash preimage of a
227
+ step that binds none**: a unit whose frozen target carries no
228
+ `inputBindings` has exactly the preimage *shape* it had before this
229
+ feature — no `taskInputs` key at all. Its hash *value* still moves, because
230
+ every unit and gate hash in this release re-versions once (`hashVersion`
231
+ 5 → 7, see the `irVersion` 5 entry above), and no pre-`irVersion`-5 plan can
232
+ execute here to be compared against.
233
+ - **A task's `output:` is legal only with a command target.** `output:`
234
+ alongside `run:`, `uses: scripts/<ref>`, or `uses: workflows/<ref>` now
235
+ fails `TASK_SOURCE_INVALID` (exit 2) at parse instead of being accepted and
236
+ never enforced: those runtimes decide success from the process exit code or
237
+ from a child run's own status and consume no task-level response schema, so
238
+ an authored contract there was silently unenforced. `uses: commands/<ref>`
239
+ and `uses: akm/command` — the targets that forward it as the model's
240
+ response schema — are unchanged. The published
241
+ [task schema](schemas/akm-task.json) enforces the same rule, so an editor
242
+ validating against it no longer green-lights a document `akm task run`
243
+ refuses to load. Migration handles this for you: `akm migrate apply` drops
244
+ an `akm.outputSchema` that sat on one of those three targets (it was inert
245
+ in v3 as well — nothing ever read it there) and reports the drop as a
246
+ notice on that file's plan entry rather than blocking the file.
247
+ - **A `schedule:` entry must be able to satisfy the task's declared
248
+ `inputs:`.** A scheduled firing supplies no input flags, so a task
249
+ declaring a `required: true` input — which may not also carry a
250
+ `default:` — and a `schedule:` entry that names no value for it could only
251
+ ever install a binding that fails at every firing. Such a document now
252
+ fails `TASK_SOURCE_INVALID` (exit 2) at parse, naming the unsatisfied
253
+ input, instead of syncing cleanly and failing once per fire. This covers
254
+ every entry shape: the `schedule: "<cron>"` string shorthand and a list
255
+ entry with no `inputs:` key are held to the same contract as one that
256
+ authors `inputs:`. Give the entry an `inputs:` value for each named input,
257
+ or declare a `default:` on the input instead. Manual-only tasks are
258
+ unaffected — a `required: true` input with no `schedule:` is still valid
259
+ and is supplied per run with `akm task run <id> --<name> <value>`.
260
+ - **`akm workflow create --json` renames its `stashDir` envelope field to
261
+ `bundleDir`.** The success envelope now reads
262
+ `{ok, ref, path, bundleDir}`; the value (the owning bundle's directory) is
263
+ unchanged. Scripts reading `stashDir` off `akm workflow create --json`
264
+ must read `bundleDir`. This was the last `stash`-vocabulary field on a
265
+ 0.9.2 command envelope; the indexer's internal `IndexOptions.stashDir` is
266
+ not a CLI surface and is unchanged.
267
+ - **Task v3 sources no longer parse.** A task document with `version: 3`
268
+ (or `version: 2`) fails with `UsageError` code
269
+ `TASK_SCHEMA_VERSION_UNSUPPORTED` (exit 2) instead of executing — the v3
270
+ parser is gone from `src/`; it survives only vendored inside the
271
+ `akm-migrate` executable, which is how the migrator still reads what it
272
+ converts. Run `akm migrate apply --dry-run`, review every `changed` /
273
+ `skipped` / `blocked` result, then `akm migrate apply` — the command now
274
+ runs **both** generations in one pass: task-v2 → task-v3, then
275
+ task-v3 → task source v4, against the same tree. `akm task add` authors
276
+ task source v4 directly; a task's `--params` becomes typed `inputs:` with
277
+ defaults instead of a `with:` bag. A task's enabled state is now per
278
+ schedule binding (`schedule[].enabled`) rather than a document-level
279
+ `akm.enabled` flag — `akm task add --disabled` writes
280
+ `schedule: [{cron: …, enabled: false}]` instead of a document-level
281
+ `akm.enabled: false`. See
282
+ [Migrating task v3 to task source v4](docs/migration/v0.9.1-to-v0.9.2.md#migrating-task-v3-to-task-source-v4).
283
+ - **GitHub Action locators are no longer recognized anywhere.** A task's
284
+ `uses: owner/repo[/path]@rev` is now a source error at parse
285
+ (`TASK_SOURCE_INVALID`); a workflow step's `uses: owner/repo[/path]@rev`
286
+ now fails with reason `unsupported-uses-target` instead of
287
+ `remote-action-acquisition-out-of-scope`. Nothing acquired or executed a
288
+ remote action in any akm release — this deletes the *recognition* of the
289
+ shape, not a capability that ever worked. The migrator still names the
290
+ target explicitly when it blocks a file
291
+ (`github-action-target-removed`).
292
+ - **Multi-job YAML is rejected at the adapter boundary.** A GitHub-shaped
293
+ workflow document whose `jobs:` map does not contain exactly one job now
294
+ fails at the source adapter with reason `multi-job-unsupported`, surfaced
295
+ from `akm workflow run` (and `akm workflow plan`) as `UsageError` code
296
+ `COMPOSITION_INVALID` (exit 2). Previously such a document parsed and
297
+ ordered its jobs cleanly and was refused only later, in two different
298
+ places, with two different shapes (one thrown error, one `ok: false`
299
+ compile result). Split a multi-job document into separate single-job
300
+ workflows and compose them with a child-workflow step
301
+ (`uses: workflows/<ref>`). Every other workflow-source compile failure now
302
+ reports `UsageError` code `WORKFLOW_SOURCE_INVALID` rather than
303
+ `INVALID_FLAG_VALUE`.
304
+ - **The second task scheduling syntax is removed.** `akm.schedule` and a
305
+ task document's top-level `on:` are gone along with task v3 (see "Task v3
306
+ sources no longer parse" above); task source v4's optional top-level
307
+ `schedule:` is the one canonical scheduling form, and a task with no
308
+ `schedule:` is manual-only and fully composable as a workflow-step
309
+ target.
310
+
311
+ ### Changed
312
+
313
+ - **`INVALID_FLAG_VALUE` is now rare in task or workflow domain failures,
314
+ with two named exceptions.** Every task-source, workflow-source,
315
+ target-classification, and composition failure now reports a
316
+ phase-specific code — `TASK_SOURCE_INVALID`, `TARGET_REF_INVALID`,
317
+ `COMPOSITION_INVALID`, `WORKFLOW_SOURCE_INVALID`, `INPUT_BINDING_INVALID`,
318
+ `TASK_SCHEMA_VERSION_UNSUPPORTED`, or `TASK_TARGET_UNSUPPORTED` — **except**
319
+ a task's workflow-target `env:` composition rejection (a `uses:
320
+ workflows/<ref>` task that also authors `env:`) and a workflow child-ref
321
+ asset-resolution failure (`Workflow source target <ref> was not found.`),
322
+ both deliberately preserved as `INVALID_FLAG_VALUE` so an existing pinned
323
+ test's code and message stay byte-unchanged. The remaining
324
+ `INVALID_FLAG_VALUE` sites in the task/workflow domains (38 total, across
325
+ `src/tasks/**` and `src/workflows/**`) are these two preserved exceptions
326
+ plus scalar CLI-argument parsing (a cron expression, a task id, a workflow
327
+ parameter flag) and one code-allowlist membership entry — genuine
328
+ flag-value validation or a pinned exception, not a re-codable
329
+ task/workflow source or composition failure. **Scripts branching on
330
+ `code` for a task/workflow domain error should switch on the specific
331
+ code above rather than assuming `INVALID_FLAG_VALUE` — except for the two
332
+ named exceptions, which still report `INVALID_FLAG_VALUE`.** Exit codes
333
+ are unchanged (2 for every one of these).
334
+ - **A typed task-input or workflow-param flag no longer echoes the supplied
335
+ value in a validation error.** `akm task run <ref> --<input> <value>`
336
+ against a `type:`-declared input used to report
337
+ `must be <types>; received "<value>"` on a coercion failure, and a value
338
+ that failed its declared `enum:`/`minimum:`/`maximum:` constraint reported
339
+ the value in that message too — both are closed now, since a typed flag
340
+ can carry a credential and this detail lands in stderr envelopes that get
341
+ pasted into CI logs and issue reports. The declared constraint (the
342
+ allowed list or the bound) is still named, since it comes from the
343
+ author's own schema rather than the caller's data. Error and exit codes
344
+ are unchanged.
345
+
346
+ ### Added
347
+
348
+ - **Child workflows.** A workflow step can now compose another workflow —
349
+ directly (`uses: workflows/<ref>`) or through a task source v4 document
350
+ whose own target is a workflow (`uses: tasks/<ref>`) — instead of
351
+ failing to freeze. `with:` on the composing step binds the child's
352
+ declared `params:`. Composition is bounded: depth (8 levels), a
353
+ composition cycle, and aggregate embedded plan bytes (1 MiB total across
354
+ one root freeze) are all checked at **freeze**, before the parent run is
355
+ published, and fail with `UsageError` code `COMPOSITION_INVALID`. The
356
+ child workflow is compiled, validated, and frozen **completely** — its own
357
+ complete plan embedded inside the parent's — before the parent run exists,
358
+ so editing the child's source afterward cannot affect an already-frozen
359
+ parent, and the child's transitive sources join the parent's guarded
360
+ source read set. A composing step's own `env:` is rejected at freeze
361
+ (`UsageError` code `COMPOSITION_INVALID`) rather than silently dropped —
362
+ a child run carries its own frozen environment inside its own plan, so a
363
+ parent-level `env:` on the composing step has nothing to apply to.
364
+ Running a step that composes a child workflow now drives
365
+ the child to completion — see **Child workflows now execute** and
366
+ **Workflow `outputs:`** below. (Correction: an earlier development
367
+ increment of this same 0.9.2 release briefly made an unexecuted composing
368
+ step fail closed with `UsageError` code
369
+ `WORKFLOW_CHILD_EXECUTION_UNSUPPORTED`. That code never reached a release
370
+ and is gone from the shipped 0.9.2 — it is listed here only because a
371
+ 0.9.2 pre-release snapshot may otherwise be the sole place it was seen.)
372
+ See
373
+ [Workflow Schema: Child workflows](docs/reference/workflow-schema.md#child-workflows).
374
+ - **Child workflows now execute.** Running a step whose target is a child
375
+ workflow drives that child inline, in the parent's own process, with the
376
+ same engine `akm workflow run` uses — publication is idempotent, so a
377
+ retried or resumed composing step reuses the same child rather than
378
+ starting a new one. The child's final status maps onto the composing
379
+ step and the parent run: `completed` promotes the child's exported result
380
+ as the step's output and the parent continues; `failed` fails the step
381
+ and the run; `blocked` blocks the step and the run, with recovery notes
382
+ naming the exact sequence — `akm workflow resume <childRunId>`, then
383
+ `akm workflow resume <parentRunId>` and `akm workflow run <parentRunId>`.
384
+ `akm workflow status` on a run that composes children now renders a
385
+ `children:` tree; `akm workflow list` excludes child runs by default
386
+ (`--children` includes them), and a child run id always works directly
387
+ with `status`/`resume`/`abandon`/`run`. See
388
+ [Workflow Schema: Child execution](docs/reference/workflow-schema.md#child-execution)
389
+ and [Running Workflows: Child runs](https://github.com/itlackey/akm/blob/main/docs/guides/run-workflows.md#child-runs).
390
+ - **Workflow `outputs:`.** A workflow may declare a run-level export in its
391
+ Markdown frontmatter — `outputs: {<name>: {from: steps.<id>.output(.<seg>)*,
392
+ schema?}}`, up to 64 entries — resolved once, from persisted step
393
+ evidence, at run completion. An unresolvable reference, a truncated
394
+ step artifact, or a schema violation rolls the completion back
395
+ (`UsageError` code `WORKFLOW_OUTPUT_INVALID`): the run stays `active` and
396
+ its final step stays `pending` rather than completing with missing
397
+ exports. A run with no `outputs:` declaration exports `{runId, status}`
398
+ instead. This is a Markdown-frontmatter-only key — a GitHub-shaped
399
+ workflow's closed root key set has no extension surface for it, the same
400
+ reason it cannot declare `params:` either. See
401
+ [Workflow Schema: Workflow outputs](docs/reference/workflow-schema.md#workflow-outputs).
402
+ - **`akm workflow plan <ref>`** (Evolving) — compiles, resolves, and freezes
403
+ a workflow exactly as starting a run would, then stops: zero durable
404
+ writes, no published run, no event, no lease. Prints the canonical step
405
+ graph, per-step frozen target kinds, task/child expansion, input
406
+ bindings, the source read set, and freeze-time lowering notices —
407
+ secret-free by construction (no resolved reference value, request
408
+ content, script bytes, or credential is ever printed). Defaults to a
409
+ human-readable summary; `--format json` returns the full envelope. See
410
+ [CLI reference: workflow plan](docs/reference/cli.md#workflow-plan).
411
+ - **`akm task explain <ref> [input flags]`** — read-only task introspection.
412
+ Prints the task's source path and version, its declared `inputs:` (with
413
+ defaults — a secret-shaped default prints as `<redacted>`), the supplied
414
+ values with provenance (`default` | `flag` | `schedule-binding`, likewise
415
+ redacted when secret-shaped), the resolved target kind/ref, effective
416
+ execution settings with field-level provenance, and schedule bindings.
417
+ Never spawns anything, writes history, or touches the scheduler; never
418
+ prints an `env:` value, a credential, a prompt body, a `run:` string, or
419
+ `with.content`. It accepts the task's own declared input flags and nothing
420
+ else: `--scheduled` — which `explain` neither declares nor implements —
421
+ fails `UNKNOWN_FLAG` (exit 2) rather than being silently discarded, in
422
+ every spelling (`--scheduled`, `--scheduled=false`, …). See
423
+ [CLI reference: task](docs/reference/cli.md#task).
424
+ - **`AKM_TASK_INPUTS`** — the exec-context environment variable a
425
+ task-composed step's shell/script target receives: canonical JSON of its
426
+ resolved, schema-validated `inputs:` bindings. Present only when the
427
+ bindings are non-empty; subject to the same per-platform size ceiling as
428
+ `AKM_INPUTS` / `AKM_PARAMS`. See
429
+ [Context reaching the command](docs/reference/workflow-schema.md#context-reaching-the-command).
430
+ - **A v3 → task source v4 migrator**: the separate `akm-migrate` executable
431
+ (installed alongside `akm`) gains `task-v4-status` / `task-v4-apply
432
+ [--dry-run]`, a second, independent generation of the same dry-run-first,
433
+ `changed | skipped | blocked` migration planner — options bag flattened to
434
+ top-level keys. A `with:` authored on any target other than
435
+ `uses: akm/command` is `blocked` for manual review, alongside a
436
+ github-action-targeted `uses:` (blocked reason
437
+ `github-action-target-removed`) and anything else ambiguous: the migrator
438
+ translates structure, never intent, so `inputs:` is never invented on a
439
+ file's behalf — declaring it is an authoring decision left to the person
440
+ editing the migrated file. Nothing is overwritten without a backup. A
441
+ `changed` file can carry an informational **notice** for a translation that
442
+ is faithful but not one-to-one — a manual-dispatch-only trigger that v4
443
+ expresses as "no `schedule:`", and an `akm.outputSchema` dropped because v4
444
+ accepts `output:` only with a command target — so read the notices on a
445
+ dry-run plan, not just the outcomes. A v3 document that was never valid in
446
+ the first place (an empty `on:`, or a `workflow_dispatch:` carrying
447
+ `inputs:`) is `blocked` as `invalid-v3-task` rather than being converted
448
+ into runnable v4 bytes. By
449
+ 0.9.2's release this generation runs automatically as the second half of
450
+ `akm migrate status` / `akm migrate apply [--dry-run]` (see "Task v3
451
+ sources no longer parse" above) — `task-v4-status`/`task-v4-apply` remain
452
+ as the standalone, single-generation entry points the frozen migrator
453
+ always exposes. See the
454
+ [0.9.1 to 0.9.2 migration guide](docs/migration/v0.9.1-to-v0.9.2.md#migrating-task-v3-to-task-source-v4).
455
+
456
+ ### Fixed
457
+
458
+ - **A flag value for a parameter or input declaring both `array` and a
459
+ scalar type is no longer forced into an array.** `akm workflow run <ref>
460
+ --<param> <value>` (and, new in this release, `akm task run <id>
461
+ --<input> <value>`) unconditionally grouped a supplied value into an array
462
+ whenever the declaration mentioned `array` at all, so
463
+ `type: ["array", "string"]` with `--x hello` delivered `["hello"]` instead
464
+ of the permitted string, and `type: ["array", "null"]` could never produce
465
+ `null` — silently, since the altered value still satisfied the array
466
+ branch. A single, non-bracketed value now tries the union's scalar
467
+ alternatives first. An `array`-only declaration, the JSON-array shorthand
468
+ (`--x '["a","b"]'`), and grouping a repeated flag are all unchanged.
469
+ - **`akm task <subcommand> --target=<value>` now answers with the 0.9 rename
470
+ hint instead of ignoring the flag.** The retired-spelling check compared
471
+ whole argv tokens, so it caught a bare `--target` but not `--target=team`;
472
+ because `target` is exempt from the generic unknown-flag gate on `task`
473
+ subcommands precisely so that check can answer, the `=`-spelling was
474
+ rejected by nothing at all and the bundle the caller named was silently
475
+ dropped. It now fails with `UsageError` code `INVALID_FLAG_VALUE` (exit 2)
476
+ naming `--bundle`, in every spelling.
477
+ - **The embedded `akm` hint sheet no longer teaches a task format this
478
+ release rejects.** Its "Scheduled Tasks" section still told readers to
479
+ author `version: 3` with `akm.enabled` and `akm.timeout`; it now describes
480
+ task source v4 (`version: 4`, per-entry `schedule[].enabled`, top-level
481
+ `timeout`, typed `inputs:`/`output:`) and points at `akm migrate apply`.
482
+ The `stash`-terminology doc lint now scans the shipped hint assets too, so
483
+ the embedded help cannot drift out of the active-docs vocabulary again.
484
+ - **The macOS native scheduler backend no longer refuses a real
485
+ `launchctl` inventory.** Its loaded-service reader enforced a narrow,
486
+ hand-written grammar over `launchctl print`'s full output and rejected
487
+ the entire read — surfacing as `INVALID_CONFIG_FILE` from every akm
488
+ scheduler command — the moment any line fell outside it, which real
489
+ `launchctl` output on a real Mac routinely does. It now scans for akm's
490
+ own `com.akm.task.*` labels and ignores everything else, which is what
491
+ every caller actually needed. Caught by the gated native-scheduler
492
+ suite's first run against macOS.
493
+ - **The Windows-built package no longer ships without its embedded
494
+ template assets.** The build's asset-copy step matched paths against a
495
+ forward-slash pattern, but path separators on Windows are backslashes,
496
+ so the match silently failed and `dist/assets/` was never populated —
497
+ the packaged npm tarball built on Windows carried no templates at all,
498
+ and any command rendering one (for example `akm health --format html`)
499
+ crashed with `ERR_MODULE_NOT_FOUND`. Also caught by the gated
500
+ native-scheduler suite's first run, this time against Windows.
501
+
9
502
  ## [0.9.2-alpha.4] - 2026-08-26
10
503
 
11
504
  ### Added
package/STABILITY.md CHANGED
@@ -58,6 +58,7 @@ enumeration of the whole `proposal` noun group.
58
58
  | `akm curate` | Stable | |
59
59
  | `akm show` | Stable | |
60
60
  | `akm workflow status` | Stable | |
61
+ | `akm workflow plan` | Evolving | New in 0.9.2; secret-free provenance output; envelope shape may change. |
61
62
  | `akm workflow list` | Stable | |
62
63
  | `akm workflow create` | Stable | |
63
64
  | `akm workflow resume` | Stable | |
@@ -110,6 +111,7 @@ enumeration of the whole `proposal` noun group.
110
111
  | `akm task history` | Evolving | |
111
112
  | `akm task sync` | Evolving | |
112
113
  | `akm task doctor` | Evolving | |
114
+ | `akm task explain` | Evolving | New in 0.9.2; secret-shaped values in provenance output are redacted on a best-effort heuristic basis (not a guarantee). |
113
115
 
114
116
  ## Stable
115
117
 
@@ -254,11 +256,27 @@ CHANGELOG with a migration note.
254
256
  `akm improve && akm proposal drain --promote --yes`, or a `triage` block
255
257
  with `applyMode: "promote"` in your strategy.
256
258
  - **Tasks** — `akm task` subcommand surface (`add | run | sync | doctor |
257
- history`; no alias, no `list`/`remove`/`init`/`enable`/`disable`); strict
258
- version-2 YAML for scheduled tasks. Prompt tasks use named engines and task
259
- history metadata is versioned. Schema additions in patch releases; removals
260
- only at minor. Bare `akm task` is a usage error naming the subcommands
261
- (`akm task doctor` reports scheduler diagnostics).
259
+ history | explain`; no alias, no `list`/`remove`/`init`/`enable`/`disable`);
260
+ task source v4 YAML (typed `inputs:`, optional `schedule:`) is the only
261
+ accepted version task v3 and task v2 sources are converted by
262
+ `akm migrate apply`. Command tasks use named engines and task history
263
+ metadata is versioned. Schema additions in patch releases; removals only at
264
+ minor. Bare `akm task` is a usage error naming the subcommands
265
+ (`akm task doctor` reports scheduler diagnostics). `akm task explain <ref>`
266
+ (new in 0.9.2) and `akm workflow plan <ref>` are both zero-write
267
+ provenance surfaces: they show what a task or workflow would do —
268
+ resolved target, input bindings, child expansion — without starting or
269
+ publishing a run. `akm workflow plan` is secret-free **by construction**
270
+ (the excluded data never reaches the command). `akm task explain`
271
+ instead **redacts** secret-shaped input values on a best-effort
272
+ heuristic basis — a value that doesn't match the heuristic can still
273
+ print unredacted.
274
+ - **Workflow plan** — `akm workflow plan <ref>`, new in 0.9.2: zero-write
275
+ compile+freeze introspection (the canonical step graph, task/child
276
+ expansion, input bindings, and lowering notices for a workflow, without
277
+ starting or publishing a run). The envelope shape may still change; the
278
+ five long-Stable `workflow` verbs (`status`, `list`, `create`, `resume`,
279
+ `abandon`) and `run` are unaffected.
262
280
  - **Events / log** — `akm log` is the event-stream surface (0.9.0: the
263
281
  asset-scoped `akm history` surface, and `log`'s own `tail` subcommand, were
264
282
  both removed; `log` is now a leaf command — the former `list` surface).
@@ -362,16 +362,21 @@ akm task sync --rebind # Also re-pin the scheduler's akm
362
362
  akm task doctor # Scheduler binding + runtime eligibility diagnosis
363
363
  akm task history # Recent run rows (status, timing)
364
364
  akm task run <id> # Run one task immediately (works when disabled)
365
+ akm task explain <ref> # Read-only: declared inputs, target, schedule — spawns nothing
365
366
  akm search --type task # Enumerate task assets (there is no `task list`)
366
367
  ```
367
368
 
368
- Task files use strict task v3 (`version: 3`). To disable one, set
369
- `akm.enabled: false` and run `akm task sync`
370
- (the cron line stays, commented). To remove one, delete the YAML and run
371
- `akm task sync` the scheduler entry is unbound. Per-task `akm.timeout` may
372
- be `null` (disable the invocation timer) or a duration/number overriding the
373
- selected engine invocation timeout. Preview old task-v2 conversion with
374
- `akm migrate apply --dry-run`.
369
+ Task files use task source v4 (`version: 4`). There is no `akm:` options bag
370
+ or `on:` block every control (`schedule`, `timeout`, `engine`, `model`,
371
+ `redact`, `maxSteps`, `maxRetries`, ) is a top-level key now. Typed
372
+ `inputs:` declarations and a bounded `output:` schema work like a
373
+ workflow's (`output:` replaces v3's `akm.outputSchema`). To disable one
374
+ schedule entry, set that entry's `enabled: false` under `schedule:` and run
375
+ `akm task sync` (the cron line stays, commented); to remove one, delete the
376
+ YAML and run `akm task sync` — the scheduler entry is unbound. Top-level
377
+ `timeout:` may be `null` (disable the invocation timer) or a duration/number
378
+ overriding the selected engine invocation timeout. Preview old task-v2/v3
379
+ conversion with `akm migrate apply --dry-run`.
375
380
 
376
381
  ## Agent Dispatch
377
382
 
@@ -1,6 +1,4 @@
1
- version: 3
1
+ version: 4
2
2
  run: akm proposal extract --auto
3
- akm:
4
- schedule: "*/30 * * * *"
5
- enabled: true
6
- description: Opt-in all-harness session extraction every 30 min
3
+ description: Opt-in all-harness session extraction every 30 min
4
+ schedule: "*/30 * * * *"
@@ -1,6 +1,4 @@
1
- version: 3
1
+ version: 4
2
2
  run: akm improve
3
- akm:
4
- schedule: "0 2 * * *"
5
- enabled: true
6
- description: Run improve pipeline nightly
3
+ description: Run improve pipeline nightly
4
+ schedule: "0 2 * * *"
@@ -1,6 +1,4 @@
1
- version: 3
1
+ version: 4
2
2
  run: akm index
3
- akm:
4
- schedule: "0 4 * * *"
5
- enabled: true
6
- description: Nightly incremental index refresh
3
+ description: Nightly incremental index refresh
4
+ schedule: "0 4 * * *"
@@ -1,6 +1,4 @@
1
- version: 3
1
+ version: 4
2
2
  run: akm sync
3
- akm:
4
- schedule: "*/15 * * * *"
5
- enabled: true
6
- description: Sync stash changes to git remote every 15 min
3
+ description: Sync stash changes to git remote every 15 min
4
+ schedule: "*/15 * * * *"
@@ -1,6 +1,4 @@
1
- version: 3
1
+ version: 4
2
2
  run: akm upgrade --check
3
- akm:
4
- schedule: "0 9 * * 1"
5
- enabled: true
6
- description: Weekly check for new akm releases
3
+ description: Weekly check for new akm releases
4
+ schedule: "0 9 * * 1"
@@ -1,6 +1,4 @@
1
- version: 3
1
+ version: 4
2
2
  run: akm improve --strategy graph-refresh --skip-if-locked
3
- akm:
4
- schedule: "10 3 * * 0"
5
- enabled: true
6
- description: Full-corpus graph rebuild (weekly Sunday 3:10am)
3
+ description: Full-corpus graph rebuild (weekly Sunday 3:10am)
4
+ schedule: "10 3 * * 0"