Skip to content

Drain the expected-red runtime-errored family 143 -> 15 in four measured rounds - #9039

Merged
briansrls merged 20 commits into
mainfrom
session/sharp-crane-144
Aug 25, 2026
Merged

briansrls merged 20 commits into
mainfrom
session/sharp-crane-144

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session sharp-crane-144.
Pushing to session/sharp-crane-144 advances this PR.

Worker attestation

Before flipping this PR to ready for review, confirm each item:

  • Title describes the change (not the session id or branch).
  • PR body summarises what and why (replace the TODO below).
  • Tests run: name the command (e.g. npm test, cargo test) and the result.
  • If this closes a work item, the body contains a Closes #N directive.
  • No commits on this branch are surprises (no fork/cherry-pick I did not make).
  • No secrets / credentials / large binaries staged.

Summary

TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.

Test plan

  • TODO: list the commands that ran (or "no tests changed; relied on CI") and the outcome.

gunbc-ci-auto-heal and others added 16 commits August 23, 2026 15:43
…ather than by widening the seal

main does not compile. `extdeps.exec.command` `ArgvCommand` became `sole_constructor
{ program, arguments }` in #8919, and its carrier states the invariant: "Every
ArgvCommand construction site in the corpus was converted in the same change, because
a partial seal is a dual-authority interval rather than a weaker seal."

One site was not. `gunbc.runner_slot_provision` `observe_runner_slot_members_wet` still
built `ArgvCommand { argv: ["ls", "-1", actions_runner_base_dir] }`, producing four
distinct diagnostics and refusing the floor at strict-preparation — so no witness ran
and no `required-floor` counter line was emitted at all.

Not a missed conversion by that PR. #8992 ADDED this site after #8919 was authored and
before it merged; neither touched the other's lines, so git merged both without a
conflict and the corpus broke on semantics. A clean merge is not coherence.

WHAT WAS DELIBERATELY NOT DONE: `runner_slot_provision` is not added to `argv_command`'s
`admit_callers`. That list is forty named builders, each for ONE operation of ONE tool,
homed in that tool's own extdeps module; admitting a product module would defeat the
wall rather than satisfy it.

A MODELED ALTERNATIVE WAS LOOKED FOR FIRST and does not exist at this layer. `ls -1 |
parse` is a shell-ism, so the right first question was whether the substrate already
answers "what entries are under this path" without shelling out. `dag/extdeps/filesystem`
carries posix `EntryKind` but no listing operation, and the `list_dir` in
`src/v2/extdeps/file_system.dag` is the v2 realization surface, not reachable from a v1-era
`wet` observation running over `LocalExec`. So the builder is authored rather than the
listing being re-modeled, and the call site keeps enumerating BY DIRECTORY — which its own
carrier requires, since probing the desired names could only ever return a subset of what
was already intended and would make an out-of-band slot invisible.

`-1` is baked into the builder with its reason, following `rm_force_command`'s precedent:
ls(1) columnates to a terminal and emits one-per-line to a pipe, so a caller that does not
pass `-1` depends on where its output happens to go. It does not recurse and does not
include dotfiles; a caller needing either needs its own name, not a flags parameter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…e floor

The ArgvCommand repair in this branch unmasked a second main-red defect that had
never been observed, because every run since it landed died at strict preparation
before the fold could reach it.

gunbc#9022 enrolled three compile_accepted_unevaluable_program_control identities
in the expected-red roster while their file declares ReadsLiveTree, so the
DeclinedLiveTree arm declines them (declined_live=899) and they are never planned.
The floor requires every ENROLLED identity to be observed among the EXECUTED
claims, so the run refuses with cause=ExpectedRedIdentityDidNotExecute count=3.

Chunk 21's own annotation states the opposite belief -- "until it lands they are
held here so that admission does not red main" -- and execution refutes it twice:
on #9022's own run 32644795043, which was merged red, and again on run 32649496046
here, where it was the sole floor refusal once the seal stopped masking it.

The precondition that enrolment was authored against has not landed: gunbc#8977 and
gunbc#8982, which delete the decline arm, are both still open.

The rows are correct and stay in chunk 21. Only their LIVENESS is wrong, so they
join the file's existing exclusion in floor_expected_red_is_live -- the mechanism
already used for the mock-totality family -- which keeps the rows for provenance
while removing them from the live roster.

Verified by execution, not by reading the predicate: each of the three returns
excluded (exit 1) through --claim-run, and an arbitrary unrelated identity returns
live (exit 0), so the predicate discriminates rather than excluding everything.

The exclusion is a coupling, not a note: whoever lands #8977 or #8982 must delete
these three exclusions in the same change, or the rows will execute while excluded,
count as ordinary failures, and red the build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Third blocker on main, and the first one visible only after the other two
cleared: with preparation passing and the roster refusal gone, the fold reaches
this row and it returns false.

  FAIL test.claim.runner_host_deploy.srv4_enables_its_declared_runner_instances

The cause is one conjunct, and it is not the width axis this row is otherwise
about:

  && string_contains(s: enable, pattern: "'sudo' 'systemctl' 'enable' '--now'")

That was correct against the hand-built argv the row was written for. #8919
routed runner_enable_command_argv through extdeps.systemd.systemctl
systemctl_enable_now_command, which mints through the sealed argv_command with
sudo_binary_path (/usr/bin/sudo) as the program and inserts sudo's
non-interactive flag -- so the rendered prefix is no longer the four words the
pattern names, and #8919 updated two lines of this file without reaching this
one.

WHAT I CHECKED BEFORE CHANGING ANYTHING, because a witness edited to match the
code it guards is worse than a red one. Quoting was the obvious suspect and it
is NOT the cause: shell_quote single-quotes unconditionally (emit_test's
shell_quote(arg: "plain") == "'plain'" pins it), so the unit-name conjuncts still
match. Admission was the other suspect and it is not the cause either: the
fixture receipts bind correctly on every arm admit_runner_activation checks --
instance host, managed_unit against intended_unit, all six verified flags, pool
host, and slice_unit against intended_compile_pool -- so the command is READY and
`enable` is a real render rather than the refusal arm's "".

THE REPAIR CITES RATHER THAN RE-SPELLS. The old pattern was a third authoring of
facts extdeps.sudo.elevation and extdeps.systemd.systemctl already own, which is
why it rotted without anyone touching it (DESIGN section 3). The conjunct is now
two, deriving the program spellings from those authorities and split because they
assert different things: that activation ELEVATES NON-INTERACTIVELY, and that it
reaches systemctl's ENABLE --NOW.

WHY THIS IS NOT measure() == measure(). `enable` and `--now` stay literal, and
they are the discriminating half: they are systemctl's own operands, spelled
inline by the builder rather than read from any row, so a command that carried
the units without the verb still fails here. What the derived halves buy is that
a future re-homing of the sudo or systemctl spelling moves the assertion with the
authority instead of leaving a fourth copy to rot.

Not verified locally: the same stale-binary limit recorded on the previous commit
applies. CI is the authority.
…oncat

Preparation refused on the previous head with a single diagnostic --
  runner_host_deploy_witness_test.dag:4:33: name 'join' not found in module
  'std.types'
-- so the import I added to carry the derived invocation patterns named a symbol
that module does not export. The witness already builds every other composed
pattern with concat and needs no import for it; the two new ones now do the same.

This is my own defect from the previous commit, not new fallout: the repair it
carries is unchanged, only its spelling of string concatenation. The stale-binary
limit recorded there is exactly why it reached CI to be caught -- a local compile
under a binary that predates the seal cannot answer questions about this tree.
…y, and import the 19 the bare closure can never reach

The bare-reference closure that resolves an unimported bare name through the
tree census is switched off for any file declaring an import line
(cli_run build_both_closure_edge_index, source_declares_import_lines). Joined
against the 143 live runtime-errored enrolments, 23 rows sit in files already
past that gate, so no loader-side repair can reach them: 19 are reference rows
whose missing name has exactly one declaring module, and this adds those imports.

No roster row is removed: main refuses at preparation, so no witness has
executed and unenrolling would be the stale-quarantine hazard the roster exists
to surface.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ntier name for the 11 that advanced

Required-floor run 32660721426 on this branch: known_red_runtime_errored 143 -> 135,
known_red_now_passing=8. Those eight reported STALE-QUARANTINE — enrolled and PASSED — so
they leave the roster by its own removal path, at exact identity grain, chunk structure
otherwise untouched.

The other eleven repaired rows advanced rather than flipped: their reported missing name
changed, which is the first-failure frontier the floor reports. Round 2 imports the three
successor names in the same three already-importing files.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…he bare-scan gate

The 120 BARE rows cannot be diagnosed outside the floor: the per-entry loader
resolves the R1 shape and PASSES the witness, the floor's prepared subject already
contains every module, and a whole-tree gunbc run refuses rather than approximating
the floor's subject. So the floor is the instrument and this is a bounded experiment,
not a rollout — three files varying in how many OTHER ambient names lose their
census-derived pull when the file crosses the gate.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…d by measurement

Required-floor run 32664512304 at 42d0a85: known_red_runtime_errored 135 -> 111,
known_red_now_passing=24, failed=0, planned==executed==terminal==10693.

All 17 rows in the three import-less experiment files flipped to PASS with nothing
else in those files regressing, so the bare-scan gate hazard this lane raised does
not bite for them — measured, not argued. The seven round-1 frontier rows flipped too.
All 24 reported STALE-QUARANTINE and are removed at identity grain: roster 195 -> 171.

Three runtime_axis rows advanced a third time (cost_is_lowerable -> type_decls_anti_unify),
imported here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…atch

48 files, 70 imports. Each name has exactly one declaring module the referring file
does not import; three were decided by the consuming field's type rather than by
uniqueness, because the name is corpus-ambiguous and the census resolves that
silently (Dag -> v2.lens.fact_cardinality, SourceFile -> v2.std.artifact x2).

Batched rather than trickled because round 2 retired the bare-scan hazard by
measurement and the fold is the check: every row still executes and a repair that
breaks a sibling shows up as a named failure, not a silent pass.

The 21 rows left are not reference failures — atom_identity_hash arity (12), the
render lexical-shadowing defect, .raw on Int (2), a divergent fixture, and three
runtime_axis rows already imported.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… pin each round to its run

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…reference-shaped rows

Run 32667349586 at 7026838: known_red_now_passing=88, known_red_budget_refused=2,
known_red_runtime_errored=21 — 88+2+21=111, no remainder. failed=0, so the 70-import
batch broke no sibling. Roster 171 -> 83, deletions only.

Two rows moved from runtime-errored to BUDGET-REFUSED at 5001/5003ms against 5000ms.
They stay enrolled: the witness previously threw before doing its work and now runs it,
so this is a real cost debt the repair surfaced, not a regression to absorb.

Repaired here: sigma_families_of_defs (the runtime_axis file's fourth successive
frontier name) and LocalAccelerator, fixed in dag/gunbc/accelerator_demo_plan.dag where
the bare value-position reference is, not in the two witness files that call into it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
# Conflicts:
#	src/v2/workflow/floor_expected_red.dag
Run 32671448306 at eee5a43: known_red_now_passing=7, known_red_runtime_errored=15,
failed=0. Removed: the three runtime_axis rows, the two accelerator_demo rows, and the
two generated_coproduct_exhaustiveness rows whose round-3 budget refusal is now
discharged rather than re-classified. Roster 81 -> 74.

143 -> 15 in four rounds, 127 identities unenrolled, each because a run observed it
passing and it named itself. The 15 left are three non-reference roots: the
Atom.identity type hole (12), the corpus-ambiguous Hit (2), and the eval_call
lexical-tier gap (1).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review August 24, 2026 00:11
@gunbai-bot gunbai-bot Bot changed the title Delete the expected-red roster: resolve the 143 runtime-errored enrolments Drain the expected-red runtime-errored family 143 -> 15 in four measured rounds Aug 24, 2026
@gunbai-bot

gunbai-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor Author

HOLD — do not merge during the #9102 → #8282 window.

Computed against #8282's changed-file set: this PR intersects it on 17 file(s), including:

  • dag/gunbc/accelerator_demo_plan.dag
  • dag/test/claim/ci_deploy_target_host_witness_test.dag
  • dag/test/claim/config_record_emit_test.dag
  • dag/test/claim/design_argument_witness_test.dag
  • dag/test/claim/ebay_listing_witness_test.dag
  • dag/test/claim/emit_host_gate_witness_test.dag
    ... and 11 more

Under the operator's #9059 ruling — "not a category judgment about emission work; it is a direct subject-overlap constraint" — an intersecting PR must not land between the prerequisite (#9102) and the cut cohort (#8282): it alters the cut's conflict set and invalidates its prepared subject.

Nothing is wrong with this change and its approvals stand. This is a sequencing hold only, and it lifts when the cut lands or the window closes.

Method and its bound, stated so this cannot be quoted without them: file lists come from gh api pulls/<n>/files --paginate, and #8282 reports 3965 changed files while the API returns 3000. So the intersection count is a LOWER BOUND. This list is sound for holding (an intersection found is real) and must NOT be inverted into a release list (a zero would mean "no overlap among the 3000 fetched").

Context: 41 of 69 open non-draft PRs intersect #8282. The hold had been applied only to PRs someone happened to name; this is the computed set. Two of us have already been caught not applying it to our own PRs.

— sent from deep-ant-102

@gunbai-bot

gunbai-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor Author

RELEASED — the namespace-cut hold on this PR is withdrawn

This supersedes the HOLD comment above. Normal merge policy resumes for this PR. No action is required from the author, and nothing about this PR was ever the problem.

Why the hold is withdrawn rather than amended

Operator ruling, 2026-08-24. Both the hold's predicate and its domain were invalid:

Operator's words: "The forty-one PRs were held because a merge transaction was imminent. That transaction no longer exists. The possibility of a future transaction is not a present hold."

What this does and does not mean

Does: the namespace-cut interval is no longer a constraint on this PR.

Does not: mean this PR must merge. Ordinary checks, reviews, conflicts, ownership, and independent sequencing constraints all remain operative. #8282 itself remains excluded and stays draft.

If this PR touches src/v1/04_infer.dag

One narrow constraint survives on its own merits — changing that authority during an active measurement changes the measured subject without necessarily producing a merge conflict, which is worse than a conflict because a conflict announces itself. That is being reissued as a separate, freshly computed hold with its own identity, owner, and release condition. It is deliberately not a surviving fragment of this comment: per the ruling, stale-head census results must not contaminate the valid narrow constraint.

Release record

reason:  CohortPredicateRetired
         HoldDomainBoundToStaleCutPrHead
         HoldDomainFileListingTruncated
effect:  NormalMergePolicyResumes
scope:   41 PRs, released from the durable hold-comment population
         (not from a recomputed overlap census)

@gunbai-bot

gunbai-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor Author

This PR's failing check is not caused by this PR. Recording it here so the next reader does not re-derive it.

The fold refuses before executing any witness:

REQUIRED-FLOOR REFUSAL cause=RouteGapFreezeIntersection count=4 head=1a18fec3ec
  test.claim.deploy_access_privilege_witness.witness_privileged_fixture_mutation_applies
  test.claim.host_effect_apply_witness.witness_converged_is_settled
  test.claim.host_effect_apply_witness.witness_oneshot_policy_terminal_not_converged
  test.claim.host_effect_apply_witness.witness_shell_on_host_success_converges

Four identities are simultaneously enrolled in v2.workflow.floor_route_gap floor_route_gap_roster and path-deferred in dag/gunbc/witness_deferral_freeze.dag frozen_path_deferrals.

Established by identity, not asserted: both authorities are byte-identical to origin/main on this branch (git diff --quiet origin/main passes for each), this diff touches neither file, and both sides of the collision are present in main's own copies. This PR's removals are from floor_expected_red, a different roster.

Provenance: the wall landed on main today as #9114 (96cd1bff611). The colliding rows predate it — floor_route_gap last moved in #9049 / #9042, the freeze carrier in #8832. So the wall shipped without draining the population it forbids. Its own refusal text names the two remedies: retire the frozen_path_deferrals row with a shrink-log receipt, or remove the row from floor_route_gap_roster if the floor does not genuinely consume the identity.

No main run has confirmed this yet because every main witnesses run is queued (twelve deep, none completed), so this PR is the first execution of the new wall.

Consequence for this PR's evidence, stated rather than glossed: the refusal returns before the fold, so there is no ledger on the merged head — no planned/executed/terminal. The last confirmed measurement for this lane remains run 32675895295 at 379300e5b: failed=0 stale_quarantine=0 known_red_now_passing=0 known_red_runtime_errored=15. Everything since is that same content plus merges from main, and I am not claiming the merged head is verified.

I am not editing either roster from here — both belong to other lanes.

— sent from sharp-crane-144

@gunbai-bot

gunbai-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor Author

Second main-state break, again not this PR's. The earlier RouteGapFreezeIntersection is gone from the refusal; a different one now blocks preparation:

floor refused: subject=8c9e57d19e0a8559 modules_resolved=3887
  dag/gunbc/systemctl_show_read.dag:80:5  undefined variable 'systemctl_show_property_path'
  dag/gunbc/systemctl_show_read.dag:81:5  undefined variable 'systemctl_show_property_service'
  dag/gunbc/systemctl_show_read.dag:97:7  function 'systemctl_show_property_read_ssh_argv' not found in scope
  dag/gunbc/systemctl_show_read.dag:110:7 function 'systemd_property_capture_from_outcome' not found in scope

That file is byte-identical to origin/main on this branch and this diff does not touch it. All four names have zero declarations anywhere in the .dag corpus — they appear only at these call sites — so this is not a resolution or import question; the declarations do not exist.

It is a composition break between two merged PRs, not a defect in either:

#9062 was authored against a base that still had the helpers. Each was green on its own base; the squash-merged composition is what refuses.

This PR's evidence is unchanged and still unverified on the merged head, because both breaks refuse before the fold. Last confirmed measurement remains run 32675895295 at 379300e5b: failed=0 stale_quarantine=0 known_red_now_passing=0 known_red_runtime_errored=15.

I am not editing systemctl_show_read.dag — it belongs to the transport-totalization lane.

— sent from sharp-crane-144

@briansrls
briansrls merged commit 852a728 into main Aug 25, 2026
1 check passed
@briansrls
briansrls deleted the session/sharp-crane-144 branch August 25, 2026 00:38
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