| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
docs: describe host-side Workflow and Goal controls Record the new control verbs, inferable create_goal, and the fact that the session [workflow] table is now honored. Correct the published auto_start_child_limit / max_children defaults (16 / 1000, matching config.example.toml). The example header's /workflow run form is now a real host verb; keep the CLI equivalent next to it. The design note is the lane audit against Grok Build and DeepSeek Harness: what shipped here, and what was left as follow-up (journal replay resume, a named saved-workflow registry, strategist restructure). | 1 个月前 | |
feat(coordination): make delegated work durable and bounded Add a schema-versioned coordination ledger for decisions, write claims, contention receipts, context projections, and neutral fan-in evidence. Enforce shared-root path authority, descendant-only lifecycle control, synchronous persistence, replay validation, resident-file containment, and bounded retention. Carry the same launch and write contracts through ordinary agents, Fleet workers, and automatic workflows. Cover contention, restart, malformed input, cross-workspace aliases, candidate preservation, and exact evidence ownership without broadening approval or publication authority. Signed-off-by: Hunter B <hmbown@gmail.com> | 2 个月前 | |
feat(workflow): typed slot errors + settled/fail-fast/partial contracts (R9) `parallel()` and `pipeline()` turned a failed slot into `null`, and the fatal-vs-recoverable decision was a substring match on the operator-facing message. Two dishonesties fell out of that: a workflow could report success having lost every child, and the classification could be forged by prose — a subagent whose failure text said "budget exhausted" or "responseSchema" was read as a fatal kind and aborted a healthy run, while a genuine dead subagent was indistinguishable from a typo'd `throw` in a stage. The kind is now data, not prose. `TaskErrorKind` is assigned host-side where the failure actually happens and rides the task envelope as `error_kind`; the prelude copies it onto the thrown `Error.kind`, and the slot classifiers read that field alone: admission | budget | cancelled | agent | schema | driver (host) script (the script threw it) A dropped slot is no longer anonymous. Both fan-outs attach a non-enumerable `errors` array — `[{ index, kind, message }]`, ordered by index — to the resolved result. The array's own contents, length, and JSON encoding are byte-identical to before, so `results.filter(Boolean)` and every existing return value keep working; a script that wants to know why a slot is null can now ask. Modes are named and validated: `settled` (default, exactly today's behavior), `fail-fast`, `partial`. `pipeline` speaks all three via its `{ stages, mode }` overload. Behavior changes, all deliberate: * A subagent that ran and failed is kind `agent`, not the old catch-all `task`; a plain script throw is `script`, not `task`. * `mode: "partial"` now types EVERY non-cancellation failure as `{ __taskError: { index, kind, message } }`. It used to structure only schema failures and still drop a dead subagent to `null` — the exact erasure partial mode exists to prevent. * An unrecognized `mode` throws instead of silently reading as `settled`, so `mode: "failfast"` can no longer leave an author believing slots are fatal while they keep being dropped. * A run whose every task failed records as Failed, not Degraded. The slot ledger is extracted as `SlotLedger::classify` and unit-tested. Cancellation stays fatal in every mode, partial included; schema stays fatal outside partial. The dropped-slot breadcrumb now names the kind and the slot index. Tests: 74 in workflow-js/tests/vm_tests.rs (11 new), 96 in tui tools::workflow (5 new), 11353 in the full tui lib suite. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 24 天前 | |
fix(workflow): close live dogfood gaps Signed-off-by: Hunter B <hmbown@gmail.com> | 2 个月前 |