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. SeeCHANGELOG.mdfor 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:
/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 # mixedTargets 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:
| Target | Why it is refused |
|---|---|
--wave=A,B:W | a role suffix cannot apply to a multi-label target |
--wave=A,all | a loop alias is not a set member |
--wave=A,Z | unknown label — the error lists the labels actually found |
--wave=C->A | a 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:
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 fromA 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:
| Before | Now | |
|---|---|---|
| I1 | a long Verify was backgrounded and the cell ended → NO-OP | cells export the long Bash timeout themselves; a backgrounded log reads BACKGROUNDED |
| I2 | a 1.5-min row waited 73 min for validation | validation is pipelined, per work cell |
| I3 | a report one folder too high → NO-OP | MISPLACED — <path> |
| I4 | out-of-scope writes → CHANGED: none → DONE | the snapshot covers the paths the row names; a first run that changes nothing is UNVERIFIED |
| I5 | every model "unreachable" after a green probe | a green probe clears its mark |
| I6 | a ✅-tagged work wave produced an unrunnable command | it routes through $VALIDATOR, paired with another chain |
| I7 | a Verify running the worker's own new test passed hollow | lint 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.mdfor the narrative write-up.
1 · ⚠️ BREAKING: model --set validation
model --setnow refuses an unroutable model instead of writing a partial chain. Previously--set worker=good,bogusexited 0, printed✅ Roster written, and persisted only the resolvable links. It now exits 1 and writes nothing.- Migration: scripts that called
--setand ignored the exit code will now fail loudly on a bad slug. Use--forceto write a slug the catalog has not learned — it is recorded in the roster as⚠️ unvalidated (--force).
2 · Closed-Row Audit Visibility & Fleet Sweeps
/wbAuditplan-file mode now explicitly runswb-flow lint --include-closed <plan-file>and nameswb-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/rgcells (cmd | grep -qv 'X') are flagged and forbidden in Column Rule 5 ofwbPlan_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 finalgrep, where the grep stage masks command failures.
4 · Packaging Hygiene & Security
- Release Documentation Alignment: Added
RELEASE_1.0.6.mdmatchingpackage.jsonversion 1.0.6 andfiles[]globRELEASE_*.md. - Backup File Sweep: Removed stray backup artifacts
bin/lint.js.origandtemplates/commands/_shared/sync_check.sh.orig. - Security & Verification: Documented execution boundaries in
SECURITY.mdand added regression tests for release-gate tools (verify-release-file.jsandverify-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
☐ Donerows that lack a corresponding task report link.
6 · Isolated Oracle Replay (--replay-closed)
- Added
--replay-closedtowb-flow lint. It re-runs theVerifycell 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-timeto exclude an oracle that asserts a moment rather than an invariant.
