Skip to content

What's New in wb-flow 1.0.7 ​

✅ Released 2026-10-02 — npm install -g wb-flow@1.0.7. The previous release is 1.0.6. See CHANGELOG.md for the full entry.

1 · Run several waves as one command ​

--wave= used to take a single label, so a plan with six waves meant six invocations. It now also takes sets and ranges:

bash
/wbWork $P --wave=A,B -y       # a set
/wbWork $P --wave=C->D -y      # a range (C..D is accepted too)
/wbWork $P --wave=A,C->E -y    # mixed

Targets expand against the matrix's own label order, not the alphabet, so a plan whose labels skip letters does not gain waves it never had. Sets are deduped and normalised into matrix order before anything is generated, and a multi-label target produces one driver plus one member script per wave — the driver halting on the first red member, so a half-failed wave still cannot feed the next one.


2 · The silent narrowing this replaces ​

The parser shipped one row before anything consumed it, and in that window generation still read the chain head. --wave=A,B printed 🌊 Wave A and dropped the second wave's cells with no warning — four cells, measured on a real plan.

If you pin a build from that window, check what actually ran: a set that looked green may only have been its first wave.


3 · Malformed targets now fail loudly ​

Four shapes exit non-zero with a named reason instead of being quietly narrowed or re-sorted:

TargetWhy it is refused
--wave=A,B:Wa role suffix cannot apply to a multi-label target
--wave=A,alla loop alias is not a set member
--wave=A,Zunknown label — the error lists the labels actually found
--wave=C->Aa reversed range is an error, not a request to sort

4 · One rule to read before using it ​

A set containing a wave that edits bin/wave.js or bin/wave_generator.js may not be run as one driver (wbWork_template.md §10.7). The driver it would run under is the artifact being edited, so the run would grade itself with machinery it is halfway through replacing — run those waves one at a time. The plan that built this feature hit exactly that case and was executed one wave per pass.


5 · A pause line that was never printed ​

A serial risk pushed a record keyed prev→cur while the run-book looked those records up by wave label, so the record was unreachable by construction: the closing paragraph claimed a ⏸ pause line it had not emitted. The run-book and the set block are now one segmentation (waveSegments(waves, risks)) rendered twice, rather than two computations free to drift apart.

test/wave_gates.js: 270 → 317 passing.


6 · Role variables per chat, and a model never validates its own work ​

$PLANNER, $VALIDATOR, $WORKER and $MECHANICAL now belong to the chat that set them:

bash
wb-flow session set 'WORKER=gemini-3.1-pro-high,openai/gpt-5.6-terra; VALIDATOR=default;'
wb-flow session          # show the effective chains and where each comes from

A role name means that role's chain. Validator and Planner cells no longer silently run in-session. The model that executed a row is never in its validator chain. If nothing is left, the cell is skipped with NO VALIDATOR LEFT.


7 · Wave gates that stop lying ​

A real pilot run (wb-latex, 2026-10-02) hit seven orchestration defects. Each is fixed, and each has a regression case that --selftest proves red on the old code:

BeforeNow
I1a long Verify was backgrounded and the cell ended → NO-OPcells export the long Bash timeout themselves; a backgrounded log reads BACKGROUNDED
I2a 1.5-min row waited 73 min for validationvalidation is pipelined, per work cell
I3a report one folder too high → NO-OPMISPLACED — <path>
I4out-of-scope writes → CHANGED: none → DONEthe snapshot covers the paths the row names; a first run that changes nothing is UNVERIFIED
I5every model "unreachable" after a green probea green probe clears its mark
I6a ✅-tagged work wave produced an unrunnable commandit routes through $VALIDATOR, paired with another chain
I7a Verify running the worker's own new test passed hollowlint V10 flags it

Details: Wave gating · Plan trust model · Model fallback chains.

Known limitations: duplicate CHANGED: paths when snapshot roots overlap · read-only rows read UNVERIFIED on their first run (trust the validator) · cross-scope coverage is as wide as the paths a row names · apply §10.7 by hand when a run-book suggests a set that spans generator-editing waves.


Previously: 1.0.6 ​

Released 2026-09-18. See RELEASE_1.0.6.md for the narrative write-up.

1 · ⚠️ BREAKING: model --set validation ​

  • model --set now refuses an unroutable model instead of writing a partial chain. Previously --set worker=good,bogus exited 0, printed ✅ Roster written, and persisted only the resolvable links. It now exits 1 and writes nothing.
  • Migration: scripts that called --set and ignored the exit code will now fail loudly on a bad slug. Use --force to write a slug the catalog has not learned — it is recorded in the roster as ⚠️ unvalidated (--force).

2 · Closed-Row Audit Visibility & Fleet Sweeps ​

  • /wbAudit plan-file mode now explicitly runs wb-flow lint --include-closed <plan-file> and names wb-flow lint --all --include-closed <scope> as the historical fleet sweep.
  • Closed vacuous-oracle debt is now fully observable without changing routine prevention defaults.

3 · Vacuous Oracle Linting (V7 & V8) ​

  • V7 Detection & Rule: Quiet and invert grep/rg cells (cmd | grep -qv 'X') are flagged and forbidden in Column Rule 5 of wbPlan_template.md. Re-spelled as ! ( cmd | grep -q 'X' ) except for provably single-line inputs.
  • V8 Detection: Catches allowlisted exit-code-bearing commands (node test/*.js, npm test, bin/lint.js) piped into a final grep, where the grep stage masks command failures.

4 · Packaging Hygiene & Security ​

  • Release Documentation Alignment: Added RELEASE_1.0.6.md matching package.json version 1.0.6 and files[] glob RELEASE_*.md.
  • Backup File Sweep: Removed stray backup artifacts bin/lint.js.orig and templates/commands/_shared/sync_check.sh.orig.
  • Security & Verification: Documented execution boundaries in SECURITY.md and added regression tests for release-gate tools (verify-release-file.js and verify-wrappers.js).

5 · Three New lint Steps (9, 10, 11) ​

Expanding the plan-file verifier from 8 to 11 structural checks that reject previously-passing plans:

  • step-9 (Verify-clause soundness): Rejects the V1–V9 vacuous-Verify forms, unrunnable oracles, absence assertions that mask true failures, and open-oracle checks that time out.
  • step-10 (Plan Budget Estimate consistency): Rejects plans where the Budget Estimate section is missing or mathematically inconsistent with the task table.
  • step-11 (Done row task reports): Rejects checked ☐ Done rows that lack a corresponding task report link.

6 · Isolated Oracle Replay (--replay-closed) ​

  • Added --replay-closed to wb-flow lint. It re-runs the Verify cell of every closed task row in a child shell, so a later change that silently breaks an earlier row's oracle is reported rather than missed. Opt-in, because a full replay re-executes every closed oracle and can take several minutes; mark a row's Verify # point-in-time to exclude an oracle that asserts a moment rather than an invariant.