Skip to content

Milestone 6, slice 1: drills without an apply - #226

Merged
sindredg merged 12 commits into
mainfrom
feat/m6-slice-1-drills
Oct 28, 2026
Merged

sindredg merged 12 commits into
mainfrom
feat/m6-slice-1-drills

Conversation

@sindredg

@sindredg sindredg commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

Milestone 6, slice 1: the drills without an apply, code and expectations. The live run and its records follow in the pin pull request, as #224 did for #222.

Change

  • Dispatch revokes the token on a stop (Stopping a workflow with argo terminate has not been tried #174). argo terminate skips the exit handler, so the stop handler closes the session and revokes the token itself; the exit handler's second revoke is 200 at the tool service.
  • Dispatch refuses stale checks' verdicts (T23): an item older than an hour, or more than five minutes ahead of the step's clock, fails the job before it runs. The comparison's reader returns the whole item for it.
  • The model server's prompt batch is 512 tokens (A timed-out job's slot erase fails when the model server is in a long prompt batch #199, ADR 0052), with S.8 reading the unit's command line.
  • The router logs each new SSH connection from the mesh to the targets (T04): a second nftables table in the clamp's file, R.8, and a runbook step that loads it on the running router.
  • The mesh VPN agent pin moves to 1.104.4 (U.7 fails: the mesh VPN agent pin is 1.104.2 and upstream released 1.104.4 #225), with the runbook step that moves the running router's package.
  • Worklog 0007 with the milestone's gate and the gate for every high threat, the containment drills runbook, accepted-risk entries for T02, T39, and T23's cloud API and network comparison, and the push-protection drill's result (T13 verified).

Validation

What How Result
Dispatch and comparison suites python3.15 -I -m unittest discover -s tests in platform/dispatch, workstation 80 tests, OK
The new tests fail on main's code The same suite with origin/main's dispatch.py 3 failures: the stop's DELETE, the stale item, the future item
Independent review A read-only review of the branch, findings verified against the code 9 fix-now items, all fixed in 85072f2 and 99129d2; 8 plan-only items below
Ruff ruff check and ruff format --check, 0.17.2 clean
S.8 and R.8 fail sides The probe's expressions on a command line without --batch-size and with 2048, and on an nft table without the rule, workstation empty, 2048, 0
ShellCheck -S warning validation/platform-checks.sh, 0.11.0 clean
Terraform fmt -check -recursive, validate in infra/platform clean, valid
Page rules and links render.page_problems on each changed page the pipeline holds to the rules; the link checker 0 problems, 2,354 links, 0 broken
Push protection A made-up token with a valid checksum on a scratch branch, pushed, 17:24 UTC Refused, GH013, GitHub Personal Access Token, no branch on the remote

Not verified here: the unit, the nft rule, the pin, and the revoke on the live system; the stale and forged items; the workspace row for a session. Each is a step of the containment drills runbook and runs after the merge, from the pin pull request. A stop before registration (no DELETE) is handled in code and has no deterministic test. The pipeline caught a boundary flake in the age tests, now a minute past each edge.

Risks and follow-up

  • The dispatch image from this merge needs a pin pull request with its digest before the stop handler and the age limit run live.
  • The template change does nothing to the running router; the runbook's steps 20 and 21 do, in the live run.
  • Prompt throughput at a 512-token batch is unmeasured until the drill (ADR 0052).
  • The worklog's "Result: not yet run" lines and the runbook's status move with the live run.
  • From the review, for the live run to answer: the signal handler's worst case is the revoke's 15 s plus the session close's 15 s against the pod's 30 s grace period; if the drill shows no stopped line, the close wait shortens. The footprint tools stay outside the repository until a later slice.
  • From the review, plan only: compare.COLLECTED admits calendar-invalid times (now a failed job, not a traceback); the comparison step gets no age check on purpose, since it reads the item up to 22 minutes after the dispatch step accepted it; ADR 0030's cancel sentence carries a pointer to the worklog instead of a rewrite.

argo terminate skips the exit handler that revokes the token, so a
terminated workflow left the token alive until it expired (#174). The
dispatch step's stop handler now closes the session, which cancels the
job on the worker, and revokes the token itself. The exit handler's
second revoke is 200 at the tool service.
The collect command writes a job's checks' verdicts right before the
job is submitted. An item older than an hour, or more than five minutes
ahead of the step's clock, is one left behind or written by hand, and
the step fails the job before it runs, the way it does for a missing
item (T23). The comparison's reader returns the whole item for it.
)

The server takes a cancel only between prompt batches, and a 2048-token
batch late in a job outlasts the job program's 90 s erase wait, so a
timed-out job left its prompt in the slot. ADR 0052 picks the smaller
batch over longer waits. S.8 reads the value from the unit's command
line, and fails on a unit without it.
The targets send no logs, so a session to one from the mesh left no
record off the target. The router's nftables file gets a second table
whose forward chain logs each new SSH connection from the mesh to the
target range, with the operator device's mesh address as the source.
The log agent's system source sends the kernel line to the workspace.
R.8 reads the rule, and the mesh router runbook loads it on a running
router.
U.7 failed since upstream released 1.104.4. The runbook gets the step
that moves a running router's package.
…nd the states that move

The worklog carries the milestone's gate and the gate for every high
threat, each row with its drill or its accepted risk. T02 and T39 get
accepted-risk entries, and T23's cloud API and network comparison is
accepted until exercise 2, whose change surface is a network rule. The
worklog index gains the missing 0006 row.
A made-up GitHub token with a valid checksum, in a signed commit on a
scratch branch, was refused at the push with GH013 and the token type
named. Push protection leaves the accepted risks, and T13 is verified.
The pipeline's runner started the step a second after the fixture was
written, and an item 301 s ahead read as 300 and passed. Each boundary
case now sits ten seconds past its edge.
One helper builds the item's JSON and sends it to kubectl patch as a
file on standard input, in place of a quoted inline patch.
… request

From the review: tool_service can raise HTTPException or a decode
error, neither an OSError, and either would have skipped the exit. The
handler now catches every exception, revokes before it closes the
session so the revoke is not behind the close's wait, and a collected
time the pattern admits and the calendar does not fails the job
instead of raising. The boundary tests sit a minute past each edge.
…ects first

From the review: T04 said four different things across five pages and
now says Built with R.8 everywhere, the drill pending; T48 names the
step's own revoke; T02 and T39 point at their accepted risks; the
milestone 2 roadmap row drops the push-protection gap; ADR 0030 and
troubleshooting 12 get their one-line pointers. The forged-item drill
collects the job first, so its evidence documents exist, and the
footprint step names no path outside the repository.
@sindredg
sindredg marked this pull request as ready for review October 28, 2026 17:39
@sindredg
sindredg merged commit cb98d92 into main Oct 28, 2026
18 checks passed
@sindredg
sindredg deleted the feat/m6-slice-1-drills branch October 28, 2026 17:42
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