Skip to content

0.35.0 — depends_on becomes batches

Choose a tag to compare

@Ink01101011 Ink01101011 released this 19 Sep 04:57
· 181 commits to main since this release
b33ecf1

Two read-only MCP tools take the served surface 12 → 14.

tool input answers
work_plan any {id, depends_on, priority?} graph level-synchronous Kahn batches
shiftwork_plan a checkpoint path the same over its plan.units, honouring the done/dropped satisfied rule

Batch k holds every node whose dependencies all appear in batches < k; inside a batch, priority descending then insertion order. Three refusals, worded identically on both sides: duplicate node id <id>, node <id> depends on <dep>, which no node declares, the graph has a cycle: <a> -> <b> -> <a>.

Nothing existing changes shape. Both tools are read-only. Cursor advance is still v1-linear, and clock_in / clock_out are byte-untouched — verified by grepping every added and removed diff line on both shiftwork modules for clock_/cursor/_advance: zero matches. Upgrading changes no behaviour you already depend on.

Why

Measured over this repo's own checkpoints: 215 units collapse to 119 batches — 96 serial steps (44.7%) were false serialization. Re-measured a day later at 21 graphs / 228 units / 126 batches, with 18 of the 19 original rows reproducing exactly.

The gate

A new conformance suite: 163 cases, 0 failures, 0 rulings — nothing here is supposed to differ between the runtimes, and nothing does.

86 of the 163 are per-side literals rather than cross-runtime comparisons, because a differential harness is structurally blind to a regression that lands in both implementations. That blind spot was demonstrated, not assumed — applying one symmetric mutation to both runtimes at once reddens 52 literals, exactly 26 per side, and not one differential case. A contrasting one-sided mutation reddens 35 including 13 differentials, and not one widths/ case, since reordering changes membership order but not batch sizes.

No new dependency

ex-flow was evaluated and rejected. runtime-ts still declares exactly one runtime dependency, @modelcontextprotocol/sdk@1.30.0.

Gates at this tag

run.mjs --all 8321 cases / 0 failures · --suite workplan 163 / 0 · ruff check runtime-py tools all checks passed · pytest 2909 passed (4 known worktree-only rig failures) · npm test 1065 tests / 1018 pass / 0 fail.

Known debt, recorded rather than hidden

  • Layer 1 purity is asserted by no test in either runtime. The property holds today by inspection (workplan.py imports only typing.Any; workplan.ts imports nothing) and is written into docs/architecture.md as debt that explicitly nothing checks.
  • docs/mcp.md's tool table has two stale and two missing rows that cancel out at 14-vs-14, so no count-based gate can see it. Nothing compares roster names.

Full changelog: v0.34.3...v0.35.0