Repository navigation
fix(story): honest refusals, projected sub records, run-scoped error results - #11825
Merged
Merged
Conversation
…results
Story execution (rf2-lgzco.18):
- :rf.assert/sub-equals projects the value through the sub's own
registration classification (core's project-sub-value) before the
args-path redaction, so a whole-output-sensitive sub never lands raw in
:expected / :actual / :payload / :reason. Compare raw, record projected.
- A DOM-family atom on a host with no DOM records :cannot-run instead of
nothing, so a terminal or check atom under a runner that claims :dom is
no longer a false :pass; the in-script step is marked :recorded? so the
refusal counts once.
- A check whose atom the runner refused reads :cannot-run: check-record
aggregates the refusals whose :unit is one of its atoms.
- Check atoms count toward :required-runner, so {:runner :auto} escalates
for them while a fixed runner refuses them per unit (spec/017
§Requirement inference gains the ruling sentence). The sidebar runner
chip folds received check atoms the same way.
- An :error result reads the run's epoch baseline from the frame when the
thrown ctx lost it, so identical re-runs carry identical evidence and
an equal :run-hash; the play chain's rejection keeps its plan and
runner.
Story UI workspace (rf2-lgzco.19):
- Controls read argtypes from the compiled plan's [:world :argtypes], so
an :extends-inherited or :compose-d argtype builds its widget.
- The Tests pane summary counts refused units no record carries, and the
chrome test widget renders a ⊘ cannot-run chip.
- Each step-through scrubber tick takes its own record rather than the
next one in order.
mike-thompson-day8
marked this pull request as ready for review
October 30, 2026 01:29
mike-thompson-day8
added a commit
that referenced
this pull request
Oct 30, 2026
Merge: b791981 at 2026-10-30T01:32:36Z. Completeness: The eight requested changes are present and their reported regression tests are meaningful. Full production and test patches, both complete source beads and owning assertion contracts read. Two assertion-association cases remain actionable and have separate new open beads. Correctness: Focused JVM probe on the exact merged archive, exit 0, confirms a partially redacted failed sub assertion yields an empty passing check and an identical earlier checkpoint paints a later failing tick green. Whole-sensitive/public and no-checkpoint controls go the other way. Other reported gates accepted. Implementation quality: The shared projector, plan merge, refusal counting and run baseline reuse existing mechanisms. Payload matching is too weak for projected values and repeated executions; the new beads request targeted association fixes without expanding the API. Findings: rf2-4v944, rf2-840y5. Source forward pointers: rf2-lgzco.18, rf2-lgzco.19.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes the eight findings of the correctness review of two Story slices: story execution (rf2-lgzco.18, five findings) and the story UI workspace (rf2-lgzco.19, three findings). Every one was reproduced at trunk before it was fixed.
Story execution (rf2-lgzco.18)
:rf.assert/sub-equalswrote a registration-classified sub's raw output into:expected,:actual,:payloadand:reason.evaluate-sub-equalsnow passes the value through core'sre-frame.classification/project-sub-value(raw value, sub-vec, frame) and then through the existing args-pathredact-at. The comparison still uses the raw value, the record carries the projected one, and the:rf/redactedsentinel rule is unchanged. No core change.tools/story/spec/004-Assertions.md§Privacy rule 1 drops the "tracked separately" propagation sentence.:domon a host with no DOM, recorded nothing, so the run read:pass.exec-assert-dom-atom!now records the skip as a:cannot-runrecord, the same shapeexec-assert-browser-atom!records. The in-script step result is marked:recorded?, so the refusal is counted once.:pass.check-recordnow aggregates its group together with every:unmetrefusal whose:unitis one of the check's atoms, which attributes the refusal to the check (017 §:cannot-run).record-matches-atom?moved tore-frame.story.assertionsso the scrubber (below) can share it.:required-runner, so{:runner :auto}escalates for them. A fixed runner never chooses its runner from that slot, so it refuses such an atom:cannot-run, attributed to the check, as before.tools/story/spec/017-Testing-Story.md§Requirement inference gains the ruling sentence. The sidebar runner chip (sidebar-signals/resolved-body→::check-atoms) follows the same rule. The Tests pane "required" badge reads the result's:required-runner, so it follows automatically. This changes:plan-hashfor every variant whose checks carry a token. No golden in the tree pins one.:errorresult from a throw inside the phase chain carried the frame's whole epoch ring, so its evidence and:run-hashdrifted across identical re-runs. The phase 0 baseline is now read back from the frame when the thrown ctx has lost it. The decorator refusal also stamps the baseline before it throws. The play chain's rejection path now threads its ctx's:plan,:runner-selectionand:epoch-baseline.Story UI workspace (rf2-lgzco.19)
:extendsor received through:composewas dropped.resolve-argtypesnow reads the compiled plan's merged[:world :argtypes], memoized beside the view-args schema inre-frame.story.view-args(compiled-argtypes). If the plan cannot compile it falls back to the variant's own body.ui/docs.cljc(the same defect, owned by rf2-lgzco.20) is untouched.:cannot-runslot. Finding 2's record fixes the reviewer's scenario on its own. The newtest-mode.pure/pane-summarycovers the rest: it counts each refused unit that no record carries, once per distinct:unit. The reviewer's(count (:cannot-run result))would have counted a refused atom twice, once for its record and once for its refusal row, and an in-script step up to three times. The widget renders⊘ Nwhen the count is positive, and the spec/009 selector row says so.record-matches-atom?and taken first-unconsumed, instead of the next record in order. An[:assert …]checkpoint's record no longer colours the next dispatched assertion's tick.Quality gates
Each exit code below is the runner's own, captured to a file.
clojure -M:testin tools/story: exit 0. Run insidescripts/test-jvm-tools.shon the rebased tree: 1161 tests / 3097 assertions.scripts/test-jvm-tools.shon the rebased tree: exit 0.npm run test:cljs: exit 0 before the rebase (6812 tests / 19900 assertions). Inside the spine on the rebased tree: 0 failures (6815 / 19958). The new CLJS tests are confirmed compiled into the build.scripts/test-fast-pr.shon the rebased tree: exit 0,PASS fast PR spine, gate root this worktree. It ran the docs tier, pinned clj-kondo (0 errors) and the node tier.scripts/check_doc_slugs.py: exit 0. A broken anchor planted in the new 004 sentence went red (exit 1,BROKEN ANCHOR) and was restored.Tests
Every new JVM test failed against the pre-fix
tools/story/srcand passes now. Delta against the trunk baseline (1151 tests / 3058 assertions): +10 tests / +39 assertions (1161 / 3097), exactly as predicted from the diff. One existing test pinned the old no-DOM behaviour:substrate_boundary_cljs_test's settled terminal atom expected zero records. It now expects the atom's own no-DOM:cannot-run, and the timeout case asserts the settle'sflush-timeoutreason, so the test still tells an honoured settle failure from a dropped one.Plants, restored and verified by blob hash against
HEAD:project-sub-value, the rawPARTNER-KEY-SECRETappears in:expected,:actualand:payload. The public-sub control is green in both runs.runner_events.cljc, the no-DOM terminal run reads:passagain under{:runner :dom}and{:runner :auto}.Part of rf2-lgzco.18 and rf2-lgzco.19.