Follow-up to #1548 (PR #1587) — the cascade-skip matrix refactor leaves a set of cells covered only by TRACKED_GAPS markers. Each entry below is one (skip_reason, peer_shape, phase_topology) cell with a one-line note on what the fixture would prove. Cells were left out of the initial refactor because their behavior is either redundant with another covered cell or because the runner path is partially-defined and would need a contract decision before assertion.
Cells to fill
missing_tool (4)
(missing_tool, peer_passes, same_phase) — non-substituting passing peer in same phase as missing-tool trigger; same-phase consumer should still cascade (no rescue without peer_substitutes_for). Fixture: 1 phase, [trigger=__test_setup (not advertised), peer=__test_assert (advertised, passes), consumer=__test_assert]. Asserts: trigger missing_tool, peer passes, consumer prerequisite_failed.
(missing_tool, peer_passes, downstream_phase) — same as above but consumer in phase 2. Fixture: 2 phases, phase 1 = [trigger, peer], phase 2 = [consumer]. Asserts cross-phase cascade still fires.
(missing_tool, peer_fails, same_phase) — peer fails for real in same phase as missing-tool trigger. Same-phase consumer cascades — but with which detail? Open question: does the real-failure-wins-the-diagnostic rule apply when the failure happens AFTER the missing_tool trigger? Fixture would pin the answer.
(missing_tool, peer_substitute_missing, same_phase) — mutual peer_substitutes_for declarations where both miss, with the consumer in the SAME phase as the substitute pair. Currently only the cross-phase variant is exercised. Fixture would prove same-phase substitution-chain detail string.
not_applicable (7)
(not_applicable, peer_substitute_declared, same_phase) — peer_substitutes_for against a not_applicable trigger, same phase. Open question: substitute-rescue is keyed on hard-missing skip reasons; does it apply to not_applicable? Fixture would pin behavior.
(not_applicable, peer_substitute_declared, downstream_phase) — same as above with consumer in next phase.
(not_applicable, peer_substitute_missing, same_phase) — mutual peer_substitutes_for both not_applicable, same-phase consumer. Open question on substitution chain string format.
(not_applicable, peer_substitute_missing, downstream_phase) — same with cross-phase consumer.
(not_applicable, sole_stateful, same_phase) — sole stateful step exemption, same-phase consumer (rather than the downstream variant already covered at line 639). Fixture would prove the exemption applies regardless of consumer position.
(not_applicable, peer_passes, same_phase) — not_applicable trigger with substitute-passing peer (no peer_substitutes_for), same-phase consumer. Currently downstream-only. Fixture would prove same-phase consumer also runs cleanly.
(not_applicable, peer_fails, same_phase) — not_applicable trigger with failing peer, same-phase consumer. Mirror of cross-phase case at line 667.
Definition of done
- Each cell becomes a
MATRIX_ROW in test/lib/storyboard-cascade-skip-on-skip.test.js OR moves to IMPOSSIBLE_CELLS with rationale.
TRACKED_GAPS no longer references tracked_in_issue_<this-number>.
MATRIX_REPORT=1 node --test test/lib/storyboard-cascade-skip-on-skip.test.js shows tracked count reduced (or zero, if all are filled).
Why deferred from #1587
PR #1587 was a structural refactor (prose → matrix); adding new behavioral cells expanded scope. Cells flagged here either need a contract call (substitute-rescue applicability for not_applicable, real-failure-wins ordering for missing_tool peers) or are functional mirrors of cross-phase rows where the SDK has no documented same/downstream-phase asymmetry. Both deserve their own scrutiny rather than being fixture-typed during a refactor.
Follow-up to #1548 (PR #1587) — the cascade-skip matrix refactor leaves a set of cells covered only by
TRACKED_GAPSmarkers. Each entry below is one(skip_reason, peer_shape, phase_topology)cell with a one-line note on what the fixture would prove. Cells were left out of the initial refactor because their behavior is either redundant with another covered cell or because the runner path is partially-defined and would need a contract decision before assertion.Cells to fill
missing_tool(4)(missing_tool, peer_passes, same_phase)— non-substituting passing peer in same phase as missing-tool trigger; same-phase consumer should still cascade (no rescue withoutpeer_substitutes_for). Fixture: 1 phase,[trigger=__test_setup (not advertised), peer=__test_assert (advertised, passes), consumer=__test_assert]. Asserts: triggermissing_tool, peer passes, consumerprerequisite_failed.(missing_tool, peer_passes, downstream_phase)— same as above but consumer in phase 2. Fixture: 2 phases, phase 1 =[trigger, peer], phase 2 =[consumer]. Asserts cross-phase cascade still fires.(missing_tool, peer_fails, same_phase)— peer fails for real in same phase as missing-tool trigger. Same-phase consumer cascades — but with which detail? Open question: does the real-failure-wins-the-diagnostic rule apply when the failure happens AFTER the missing_tool trigger? Fixture would pin the answer.(missing_tool, peer_substitute_missing, same_phase)— mutualpeer_substitutes_fordeclarations where both miss, with the consumer in the SAME phase as the substitute pair. Currently only the cross-phase variant is exercised. Fixture would prove same-phase substitution-chain detail string.not_applicable(7)(not_applicable, peer_substitute_declared, same_phase)—peer_substitutes_foragainst anot_applicabletrigger, same phase. Open question: substitute-rescue is keyed on hard-missing skip reasons; does it apply tonot_applicable? Fixture would pin behavior.(not_applicable, peer_substitute_declared, downstream_phase)— same as above with consumer in next phase.(not_applicable, peer_substitute_missing, same_phase)— mutualpeer_substitutes_forbothnot_applicable, same-phase consumer. Open question on substitution chain string format.(not_applicable, peer_substitute_missing, downstream_phase)— same with cross-phase consumer.(not_applicable, sole_stateful, same_phase)— sole stateful step exemption, same-phase consumer (rather than the downstream variant already covered at line 639). Fixture would prove the exemption applies regardless of consumer position.(not_applicable, peer_passes, same_phase)— not_applicable trigger with substitute-passing peer (nopeer_substitutes_for), same-phase consumer. Currently downstream-only. Fixture would prove same-phase consumer also runs cleanly.(not_applicable, peer_fails, same_phase)— not_applicable trigger with failing peer, same-phase consumer. Mirror of cross-phase case at line 667.Definition of done
MATRIX_ROWintest/lib/storyboard-cascade-skip-on-skip.test.jsOR moves toIMPOSSIBLE_CELLSwith rationale.TRACKED_GAPSno longer referencestracked_in_issue_<this-number>.MATRIX_REPORT=1 node --test test/lib/storyboard-cascade-skip-on-skip.test.jsshowstrackedcount reduced (or zero, if all are filled).Why deferred from #1587
PR #1587 was a structural refactor (prose → matrix); adding new behavioral cells expanded scope. Cells flagged here either need a contract call (substitute-rescue applicability for
not_applicable, real-failure-wins ordering formissing_toolpeers) or are functional mirrors of cross-phase rows where the SDK has no documented same/downstream-phase asymmetry. Both deserve their own scrutiny rather than being fixture-typed during a refactor.