@ai-dossier/sched 0.32.0 → 0.34.0

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 (45) hide show
  1. package/README.md +70 -15
  2. package/dist/batch-dispatch.d.ts +10 -1
  3. package/dist/batch-dispatch.d.ts.map +1 -1
  4. package/dist/batch-dispatch.js +570 -30
  5. package/dist/batch-dispatch.js.map +1 -1
  6. package/dist/dispatch.d.ts +54 -10
  7. package/dist/dispatch.d.ts.map +1 -1
  8. package/dist/dispatch.js +122 -16
  9. package/dist/dispatch.js.map +1 -1
  10. package/dist/engine.d.ts +3 -2
  11. package/dist/engine.d.ts.map +1 -1
  12. package/dist/engine.js +3 -2
  13. package/dist/engine.js.map +1 -1
  14. package/dist/enqueue.d.ts +12 -0
  15. package/dist/enqueue.d.ts.map +1 -1
  16. package/dist/enqueue.js +25 -2
  17. package/dist/enqueue.js.map +1 -1
  18. package/dist/groundtruth.d.ts +27 -15
  19. package/dist/groundtruth.d.ts.map +1 -1
  20. package/dist/groundtruth.js +43 -21
  21. package/dist/groundtruth.js.map +1 -1
  22. package/dist/index.d.ts +4 -4
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +9 -4
  25. package/dist/index.js.map +1 -1
  26. package/dist/persist.d.ts.map +1 -1
  27. package/dist/persist.js +59 -0
  28. package/dist/persist.js.map +1 -1
  29. package/dist/recovery.d.ts +2 -0
  30. package/dist/recovery.d.ts.map +1 -1
  31. package/dist/recovery.js +4 -1
  32. package/dist/recovery.js.map +1 -1
  33. package/dist/state.d.ts +9 -1
  34. package/dist/state.d.ts.map +1 -1
  35. package/dist/state.js +36 -0
  36. package/dist/state.js.map +1 -1
  37. package/dist/status.d.ts +6 -0
  38. package/dist/status.d.ts.map +1 -1
  39. package/dist/status.js +7 -1
  40. package/dist/status.js.map +1 -1
  41. package/dist/types.d.ts +101 -11
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/types.js +11 -2
  44. package/dist/types.js.map +1 -1
  45. package/package.json +1 -1
package/README.md CHANGED
@@ -89,8 +89,8 @@ where every mechanical supervision decision is code, not remembered prose:
89
89
 
90
90
  (`strong` sets only `model`, so its command falls back to the default claude template.)
91
91
  What an engine is ACTUALLY running is always visible in two places, added in #680: the
92
- `Dispatch: …` line in `sched status` (and its `--json` `dispatch` field), and the
93
- `▶ sched dispatch: …` banner `sched start` prints once at startup — both show
92
+ `Dispatch (default): …` line in `sched status` (and its `--json` `dispatch` field), and the
93
+ `▶ sched dispatch (default): …` banner `sched start` prints once at startup — both show
94
94
  `tier=agent/model` resolved exactly as spawns resolve. Note the inverse trap: running
95
95
  the batch FROM opencode/GLM does not make it run ON opencode/GLM — without a
96
96
  `dispatch.tiers` override every tier dispatches the default claude template regardless
@@ -140,7 +140,7 @@ where every mechanical supervision decision is code, not remembered prose:
140
140
  completing a freshly-spawned agent on
141
141
  its first reconcile tick; a legacy slot with no `spawned_at` degrades to the old,
142
142
  unfenced check. Batch members get the same fence on their own completion signal
143
- (`isMemberComplete`, `phase=review status=done mode=slot`).
143
+ (`isMemberComplete`, `phase=review status=done` on the member-trail vocabulary — `mode=slot` or `batch=<id>`, #677).
144
144
  3. **Reconciliation tick (AC3)** — every tick detects externally-advanced state (someone
145
145
  finished the work outside sched → complete, kill the leftover agent, reclaim the
146
146
  slot), orphaned pids after a restart (dead pid on a running slot → exit rail →
@@ -283,6 +283,30 @@ Config schema moves to 1.8.0 (#565): a new top-level `default_batch_priority` ke
283
283
  invalid value degrades the whole config file to built-in defaults, same contract as every
284
284
  other field.
285
285
 
286
+ Config schema moves to 1.9.0 (#707): `dispatch.dispatch_profiles` names complete
287
+ dispatch configurations for batch runs. A profile has the same `command`, `tier_models`,
288
+ `prompt`, and optional per-tier `tiers` overrides as `dispatch`; the batch records the
289
+ profile name at enqueue time, and every member, tail, report, and recovery agent resolves
290
+ through that profile. For example:
291
+
292
+ ```json
293
+ {
294
+ "dispatch": {
295
+ "dispatch_profiles": {
296
+ "claude": { "command": ["claude", "-p", "--model", "{model}"], "tier_models": { "mechanical": "haiku", "mid": "sonnet", "strong": "opus" } },
297
+ "glm": { "command": ["opencode", "run", "-m", "{model}", "--"], "tier_models": { "mechanical": "glm-flash", "mid": "glm", "strong": "glm-strong" } }
298
+ }
299
+ }
300
+ }
301
+ ```
302
+
303
+ Use `sched enqueue --mode slot --batch <id> --dispatch glm` to select a profile
304
+ explicitly. Without `--dispatch`, a new batch detects Claude Code from `CLAUDECODE` or a
305
+ configured agent binary in its parent process chain. Detection is convenience only: if
306
+ profiles exist and detection is inconclusive, enqueue fails and names the available
307
+ profiles rather than silently choosing the default. `--dispatch` is intentionally rejected
308
+ for full-cycle entries; no profiles means legacy dispatch behavior remains unchanged.
309
+
286
310
  Two engine-safety policies were explicit product decisions on #464:
287
311
 
288
312
  - **Pid identity is hybrid-verified (decision 1, option C).** Every spawn records the
@@ -685,18 +709,28 @@ failure rails: executing → dissolving (a member self-reports blocked)
685
709
  package-manager-detected install/build (`@ai-dossier/worktree-pool`'s command
686
710
  resolution — respects the repo's `.worktree-pool.json` `project_subdir`/
687
711
  `warm_commands` even in repos that never use the pool for anything else).
688
- - **Members run serially, one fresh `slot-cycle` agent at a time**, in the shared
689
- worktree. A member's completion signal is `phase=review status=done mode=slot` on its
690
- OWN issue (`slot-cycle` posts no phase of its own past `review` — ship is batch-owned);
691
- its commit range on the batch branch is recomputed (`git log`) after every member and
692
- kept on `BatchEntry.ranges` for eviction. An incremental gate (`ai-dossier cap run
712
+ This shared tree is the batch's INTEGRATION branch: members branch off it, and
713
+ the tail work (aggregate suite, review, ship) runs in it (#677).
714
+ - **Members run `member-cycle` serially, one fresh agent at a time — each in its OWN
715
+ worktree** on its OWN branch `batch/<id>-m<n>-<issue>` (#677, RFC-0001 §J.3), cut off
716
+ the integration branch, warmed, and pushed before the agent spawns; the agent never
717
+ creates either. When the member's incremental gate passes, the scheduler LANDS the
718
+ member's branch onto the integration branch (`git merge --ff-only` + push) and tears
719
+ the member worktree down (pool-return or remove) before the next member prep. A
720
+ member's completion signal is `phase=review status=done` carrying the member-trail
721
+ vocabulary — `mode=slot` or `batch=<id>` — on its OWN issue (the member workflow
722
+ posts no phase of its own past `review` — ship is batch-owned); its commit range on
723
+ the integration branch is recomputed (`git log`) after every landing and kept on
724
+ `BatchEntry.ranges` for eviction. An incremental gate (`ai-dossier cap run
693
725
  typecheck.run` / `test.focused`, when the repo has a manifest) runs after each member
694
- before advancing — a second, independent check that the member's self-reported "done"
695
- is real. Four-way outcome policy (#583, split further by #594): a `task-failed` whose
726
+ IN ITS MEMBER WORKTREE before landing — a second, independent check that the
727
+ member's self-reported "done" is real (`resume --batch` rechecks run there too).
728
+ Four-way outcome policy (#583, split further by #594): a `task-failed` whose
696
729
  `output_tail` carries recognizable evidence that the capability EARNED it — failing-test
697
730
  output for a `test.*` capability, compiler/build errors for the others
698
- (`hasEarnedFailureEvidence`) — evicts the member (same rail as a self-reported block);
699
- a `task-failed` with an empty or framing-only capture proves nothing and joins
731
+ (`hasEarnedFailureEvidence`) — evicts the member (same rail as a self-reported block;
732
+ its commits never landed, so there is nothing to revert); a `task-failed` with an
733
+ empty or framing-only capture proves nothing and joins
700
734
  `automation-broken`/`capability-unavailable` — the gate itself couldn't reach a verdict
701
735
  — on the block-the-batch path instead of silently proceeding (`gate-inconclusive:<cap>`,
702
736
  `member_gates`/`blocked_reason` on `BatchEntry`, surfaced in `sched status`; the journal
@@ -803,7 +837,26 @@ recorded under the old behavior, so those values are exact, not a guess. Cleared
803
837
  with the slot on release (`CLEARED_SLOT_FIELDS`), so the next unit assigned there
804
838
  journals its first milestone fresh.
805
839
 
840
+ Schema 1.18.0 (#677): `BatchEntry` gains `member_branch` and `member_worktree` (the
841
+ CURRENT member's own branch `batch/<id>-m<n>-<issue>` off the integration branch and
842
+ the worktree holding it — the `{worktree}`/`{integration_branch}` inputs the member
843
+ prompt carries, and where the incremental gate runs pre-landing) and
844
+ `member_pool_claimed` (teardown reads it to decide pool-return vs remove, mirroring
845
+ `pool_claimed` at member granularity). 1.17.0 states migrate on load, backfilling
846
+ `null`/`null`/`false` — pre-#677 members ran in the shared batch worktree, so those
847
+ values are exact, not a guess. Persisted (not re-derived) so a takeover redispatch or
848
+ a `sched resume --batch` recheck after an engine restart lands in the SAME
849
+ worktree/branch.
850
+
806
851
  New journal events: `batch-setup-done`, `batch-setup-failed`, `member-advanced`,
852
+ `member-worktree-reused` (#677 — an on-disk member worktree reused by a takeover
853
+ redispatch or a crash-window re-prep; a spawn-time event, never per-tick),
854
+ `member-landed` (#677 — the member's verified branch fast-forward-landed onto the
855
+ integration branch), `landing-failed` (#677 — the mechanical landing failed; BLOCKS
856
+ the batch for an operator, like `batch-blocked`), `member-worktree-torn-down` (#677 —
857
+ the member's own worktree/branch cleaned up after it resolved) and
858
+ `stale-member-worktree` (#677 — persisted member context that does not belong to the
859
+ current member was discarded for a fresh prep),
807
860
  `batch-warmup-done`, `batch-warmup-failed` (#561 — the cold-path warm step only; a pool
808
861
  claim emits neither). `gate-inconclusive` (#583 — the incremental gate came back
809
862
  `automation-broken`/`capability-unavailable` rather than a definite `ok`/`task-failed`;
@@ -818,7 +871,8 @@ once per member and names the member the batch is advancing FROM) and
818
871
  stops advancing never does so silently). Member/tail/report/fix-agent spawn, progress,
819
872
  completion and park events reuse the existing unit-generic names (`assigned`/`spawned`/`unit-failed`/
820
873
  `external-advance`/`pr-parked`/`merge-accepted`/`report-dispatched`/`teardown-done`/
821
- `teardown-failed`) with `unit = batch:<id>`.
874
+ `teardown-failed`) with `unit = batch:<id>`; the member `spawned` event also carries
875
+ `worktree` (#677) naming the member worktree the prompt was built with.
822
876
 
823
877
  ## API surface
824
878
 
@@ -953,10 +1007,11 @@ import {
953
1007
  type CapOutcome, // ok | task-failed | automation-broken | capability-unavailable
954
1008
  type CapabilityGateResult, // {outcome: CapOutcome, outputTail?, reason?} — runCapability's return shape (#583)
955
1009
  resumeBlockedGate, // #583: sched resume --batch <id> — re-run the gate that blocked a batch
956
- buildMemberPrompt, buildBatchTailPrompt, buildBatchReportPrompt, // #523 prompt builders
1010
+ buildMemberPrompt, buildBatchTailPrompt, buildBatchReportPrompt, // #523 prompt builders (#677: member carries {issue}/{batch}/{worktree}/{integration_branch})
1011
+ memberBranchFor, // #677: the member branch name, `batch/<id>-m<n>-<issue>` — one definition, every recovery surface derives from it
957
1012
  DEFAULT_MEMBER_PROMPT_TEMPLATE, DEFAULT_BATCH_TAIL_PROMPT_TEMPLATE,
958
1013
  DEFAULT_BATCH_REPORT_PROMPT_TEMPLATE,
959
- isMemberComplete, isMemberBlocked, // member milestone predicates (mode=slot gated)
1014
+ isMemberComplete, isMemberBlocked, // member milestone predicates (member-trail gated: mode=slot or batch=<id>, #677)
960
1015
  isBatchTailParked, // batch-ship awaiting-merge + pr= — the batch park signal
961
1016
  isBatchPhaseDone, // <phase> done on the anchor (batch-review/batch-report)
962
1017
  batchOfUnit, // batch:<id> → <id>; null for issue units or malformed ids
@@ -94,7 +94,7 @@ export interface BatchDispatchDeps {
94
94
  * Runs one `ai-dossier cap run <capabilityId>` in a batch worktree. Two call
95
95
  * sites, different degrade contracts:
96
96
  * - the per-member incremental gate (#523 AC2, revised #583): without this
97
- * hook, the gate is skipped entirely (the member's own `slot-cycle` run
97
+ * hook, the gate is skipped entirely (the member's own member-cycle run
98
98
  * already attempted this fast path before ever posting `review done`, so
99
99
  * a repo with no manifest loses nothing but the engine's independent
100
100
  * re-check). With the hook: `ok` advances, `task-failed` evicts,
@@ -140,6 +140,15 @@ export interface MemberFailure {
140
140
  detail: string;
141
141
  extraKv?: Record<string, string>;
142
142
  }
143
+ /**
144
+ * The current member's own branch: `batch/<id>-m<n>-<issue>` (#677) — member
145
+ * index and issue both in the name, and deterministic from persisted state,
146
+ * so a takeover redispatch, a `sched resume --batch` recheck, and teardown
147
+ * all re-derive the same string without a lookup table. Distinct from the
148
+ * integration branch (`batch/<id>-<date>`): the member commits here, the
149
+ * scheduler lands it there.
150
+ */
151
+ export declare function memberBranchFor(batchId: string, memberIndex: number, issue: number): string;
143
152
  /**
144
153
  * Evict the current member and either dissolve, or continue the batch via
145
154
  * `advanceMemberOrValidate` — the shared tail of both member-failure rails
@@ -1 +1 @@
1
- {"version":3,"file":"batch-dispatch.d.ts","sourceRoot":"","sources":["../src/batch-dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch-dispatch.d.ts","sourceRoot":"","sources":["../src/batch-dispatch.ts"],"names":[],"mappings":"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"}