Skip to content

Scrubber paper revision, with the lights-out scenario and authority-revocation characterization#565

Merged
xmap merged 8 commits into
mainfrom
test/authority-revocation-perf
Jul 16, 2026
Merged

Scrubber paper revision, with the lights-out scenario and authority-revocation characterization#565
xmap merged 8 commits into
mainfrom
test/authority-revocation-perf

Conversation

@xmap

@xmap xmap commented Jul 16, 2026

Copy link
Copy Markdown
Owner

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 track vaxautosci-scrubber. This rule does not exist on main today, so the other draft papers are currently unprotected against an accidental git 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 main was 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_dirs flags try_conduct_procedure and reconduct_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

xmap and others added 8 commits July 7, 2026 15:04
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>
@github-actions

Copy link
Copy Markdown

Coverage report

This PR does not seem to contain any modification to coverable code.

@xmap
xmap merged commit f8cb960 into main Jul 16, 2026
16 checks passed
@xmap
xmap deleted the test/authority-revocation-perf branch July 16, 2026 12:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant