Scrubber paper revision, with the lights-out scenario and authority-revocation characterization#565
Merged
Merged
Conversation
Back the paper's Figure 1 with a demonstrated robot-loaded run rather than a single alignment: a sample-changing robot loads two samples in turn under one Campaign, each mounted, recentered (converging per-sample alignment), scanned, and dismounted; the beam drops during the second sample's scan and the supervisor holds and resumes it. - New integration scenario test_2bm_robot_lights_out_two_sample.py: robot as a Manipulator Positioner Asset (ROBOT-1 posture, NOT a new SampleChanger Family), Subject custody (mount/dismount) per sample, two Runs under one Campaign, hold/resume on sample B. Green against real Kernel + Postgres. - Regenerate build_lights_out_data.py + data/README for the two-sample run. - Rewrite figures/render_f1.py: add a Sample-custody lane and a Robot lane (grouped with run/safety and science lanes), per-run state lines, per-sample verdict bands. The robot hardware and its EPICS control are deployed; CORA's orchestration of it is modeled here, played through the real event store. First CORA modeling of robot mount/dismount with Subject custody; if 32-id/19-BM model the same lifecycle later, that is the rule-of-three trigger to revisit SampleChanger graduation.
Apply co-author review comments, holding to a modeled-and-demonstrated-only rule (no speculative capabilities in the paper): - Held band (C2): note the hold is itself an auditable interval where a consumable can run out or an in-situ apparatus must be parked; add a §7 aside on eliciting hold policies at design time. - Beam-loss scope (C3): scope the beam-loss instant as modeled rather than deployed (2-BM controls do not detect it today), while crediting the real supervisor hold/resume the run demonstrates; soften abstract and §1 to match. - Run-lane state line (C4): add a continuous solid/dashed run-state line to Figure 1 and the interactive demo, mirroring the beam-permit lane so state is legible at every cursor position; update caption. - Substrate (C5): add a multi-owner attribution + cross-actor latency paragraph to §5 and a portable event-vocabulary table anchored to the concrete CORA events (RunStarted/RunHeld/... ) so the names are greppable. C1 (per-sample robot loop) not applied: the robot, SampleTop_Z leg, and FOV-fit branch are not modeled in the demonstrated run, so §3 stands. # Conflicts: # papers/2026-vaxautosci-scrubber/figures/f1_scrubber.pdf # papers/2026-vaxautosci-scrubber/figures/f1_scrubber.png # papers/2026-vaxautosci-scrubber/figures/render_f1.py
Update the paper narrative to match the demonstrated robot-loaded campaign: - Section 3 walkthrough + Figure 1 caption + lane description: two samples loaded by the robot in turn under one campaign, a sample-custody lane and a robot mount/dismount lane, per-sample recentering to each sample's own center, with the beam-loss hold/resume on the second sample. - Section 7: add an honest deployed-vs-modeled scope for the robot framing (hardware + EPICS control deployed and has run; CORA orchestration modeled; the FOV/lens/recenter decision layer out of scope), mirroring the beam-loss scoping. - Trim banked redundancies (the triply-stated conjunction sentence in the intro; a substrate sentence that overlapped the new event-vocabulary table) and reduce Figure 1 height to reclaim space.
Compress the swim-lane row gaps and reduce the figure height so the robot-loaded two-sample figure fits without the earlier page growth: the paper returns to 7 body pages (references on page 8, excluded from the VIS limit). Refresh the published docs/papers PDF to the current build.
Pre-submission manuscripts stay off the remote: each draft paper is its own nested local git repo (unpushed), and the parent repo ignores papers/*/ with a negation for the published vaxautosci-scrubber paper. Add another negation to publish a future paper.
The actor-symmetry paper reports authz-decision latency, event-replay
throughput, and kill-switch propagation, and its evaluation cited this test by
name, but the test did not exist and the numbers had no backing. This adds it.
It measures three quantities against the real kernel and a real PostgreSQL
event store (testcontainer): the pure Policy evaluate() latency (batch-sampled),
in-memory fold throughput over a 100-event Run stream, and end-to-end kill-switch
propagation as one PolicyGrantRevoked holds all K of a revoked principal's
in-flight runs, swept over K in {1,2,5,10,20,50}. It asserts every run lands in
Held (K/K) and, when CORA_PERF_OUT is set, writes the JSON the paper's figure and
table are generated from, so the evaluation is reproducible from source.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The sections had grown padding that restated the substrate rather than argued from it. This cuts them back to the claims the run actually supports, and rebuilds the PDF from the trimmed source so the tracked artifact matches. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.
What this is
Despite the branch name, six of the seven commits are vaxautosci-scrubber paper work. The name records where the branch started, not what it carries.
Code delta
Purely additive: 5 files, 1071 insertions, zero deletions.
.gitignore(+6) keeps draft paper directories local-only while continuing to trackvaxautosci-scrubber. This rule does not exist on main today, so the other draft papers are currently unprotected against an accidentalgit add -A. This is the part of the PR worth reviewing most carefully.tests/integration/scenarios/test_2bm_robot_lights_out_two_sample.py(+759) models the robot-loaded two-sample campaign behind the scrubber paper's Figure 1.tests/integration/test_authority_revocation_perf_against_postgres.py(+275) characterizes the kill-switch: one revocation delivered to the holder places every one of a principal's in-flight runs into a held state, across a sweep of concurrency levels.docs/javascripts/scrubber-demo.js,docs/stylesheets/extra.css(+31) support the docs demo.Plus the scrubber paper prose, figures, data, and its rebuilt PDF.
Verification
Current
mainwas merged into the branch before pushing, because both new tests were authored against a tree that predated the Budget BC and "mergeable plus green CI" would not have caught a semantic clash. Against the merged tree both new tests pass, and the wider suite is green.Two local failures were excluded as environmental, not code:
test_no_empty_feature_dirsflagstry_conduct_procedureandreconduct_procedure, which are empty rename leftovers from the 2026-07-02 conduct-gear rename kept alive on disk by stale__pycache__. Git tracks no file in either, so they cannot exist on a fresh checkout. CI here is the real check.🤖 Generated with Claude Code