Skip to content

Restore floor_expected_red_chunks aggregator: main loads 0 of 464 enrolled identities, failed=469 - #8447

Merged
briansrls merged 1 commit into
mainfrom
floor/restore-expected-red-aggregator
Aug 18, 2026
Merged

briansrls merged 1 commit into
mainfrom
floor/restore-expected-red-aggregator

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 18, 2026 •

Copy link
Copy Markdown
Contributor

Main is red because the expected-red roster loads ZERO of its 464 identities

floor_expected_red_chunks() returns Empty {}, so it references none of the 20 chunk functions that hold the roster. Every identity is orphaned in a function nothing calls, and floor_expected_red_roster() flat-maps an empty list.

Introduced by #8437 (bddb7cb), which deliberately shrank the roster 661 -> 464 but emptied the aggregator instead of rebuilding it.

Measured, not inferred — the floor says so itself, on the current main tip:

[floor-known-red] roster carries 0 enrolled identity(ies)
planned=9420 executed=9420 terminal=9420
passed=8951 known_red_held=0 failed=469
stale_quarantine=0 budget_refused=0

Every prior main run reported roster carries 661 enrolled and failed=0. All three enrollment-derived channels reading zero at once has one cause, not three: the channels only report on enrolled rows, and there are none.

Why this is 469 failures rather than 469 problems

Joining the roster against the failing set:

roster identities (orphaned):        464
failing identities on main:          469
failing AND in roster:               464
roster rows NOT currently failing:     0
failing but NOT in roster:             5

All 464 enrolled rows are present in the failure set, so they were being held as expected-red and are now reported as plain failures. This restores the aggregator and takes main from failed=469 to failed=5.

The discriminating row is roster rows NOT currently failing: 0 (credit: tidy-pike-117). A partially wired aggregator, or a genuinely shrunk roster, would leave enrolled rows that pass. Zero of 464 passing is what an empty load looks like and is not what either alternative looks like.

It also bounds this PR's risk: every row re-enrolled here is a row main is already failing, so 469 -> 5 is arithmetic rather than a judgement, and the change cannot mask a real regression by re-enrolling something that was legitimately red for a new reason.

Independently verified statically on origin/main by tidy-pike-117: 464 identities across the 20 chunk bodies, 464 distinct (no duplicates), zero references to any chunk function outside its own definition. On this diff: each of the 20 chunks referenced exactly once, in order 00..19, terminated by Empty — none omitted, none repeated. That is the entire risk surface of a hand-written Cons chain.

The 5 that remain, and why they are NOT this PR's business

dissolution_census_witness_test.unbound_dissolution_empty_literal_refuses
extdeps_scope_placement_gate_loudness_witness.red_seed_runner_failure_detail_projects_located_receipt
root_d_checkpoint_scalar_declared_arity_witness.root_d_checkpoint_scalar_declared_arity_witness_holds
rust_test_fixtures_import_closure_witness.ambient_pool_provider_preserves_listed_import
rust_test_fixtures_import_closure_witness.declared_import_closure_lists_rust_import

These are the PassedOverBudget rows — they PASS but exceed their budget, and #8437 removed them from the roster as "observed PASSING". That removal is what makes them count as failures now: a non-enrolled TimedOut outcome goes to failures, so a row true on both axes moves channel rather than disappearing.

I measured these five independently before this regression existed (run 32165763417): 45,552ms in 7 eval steps; 74,951ms in 1,242. They are real cost debt in native primitives, and they need cost reduction or a declared ceiling — not a roster edit, which only moves which channel reports them. Out of scope here deliberately: this PR restores a lost reference and changes no policy.

What this does NOT do

No roster edits, no enrollment changes, no policy change. The 464 identities and the shrink from 661 are #8437's decisions and are left exactly as authored. The only change is that the aggregator references the chunks again.

Verification

Roster load is verified by executing floor_expected_red_roster() rather than by reading the diff — the defect was invisible to reading, since the chunk functions look perfectly correct in isolation.

@gunbai-bot gunbai-bot Bot changed the title delete the ci floor and any associated rust code Restore floor_expected_red_chunks aggregator: main loads 0 of 464 enrolled identities, failed=469 Aug 18, 2026
…olled identities

floor_expected_red_chunks() returned Empty {}, referencing none of the 20
chunk functions that carry the roster, so floor_expected_red_roster()
flat-mapped an empty list and every enrolled identity was orphaned.

Introduced by #8437 (bddb7cb), which intentionally shrank the roster
661 -> 464 but emptied the aggregator rather than rebuilding it.

Measured on the current main tip, run 32166999608:

  [floor-known-red] roster carries 0 enrolled identity(ies)
  passed=8951 known_red_held=0 failed=469
  stale_quarantine=0 budget_refused=0

Every prior main run reported 661 enrolled and failed=0. All three
enrollment-derived channels read zero at once because they only report on
enrolled rows and there were none.

Joining the roster against the failure set: all 464 enrolled identities are
in the 469 failures, and no roster row is passing. Restoring the reference
takes main from failed=469 to failed=5.

The remaining 5 are PassedOverBudget rows that #8437 removed as observed
PASSING; a non-enrolled TimedOut outcome reports as a failure, so they moved
channel rather than disappearing. They are real cost debt in native
primitives (45,552ms in 7 eval steps; 74,951ms in 1,242) and need cost
reduction or a declared ceiling, not a roster edit. Out of scope here.

No roster edits and no policy change: the 464 identities and the shrink from
661 are left exactly as #8437 authored them.

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 18, 2026 18:39
@gunbai-bot
gunbai-bot Bot force-pushed the floor/restore-expected-red-aggregator branch from 8dc95c7 to a41b0cc Compare August 18, 2026 18:39
@gunbai-bot

gunbai-bot Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor Author

VERIFIED BY EXECUTION — the loader now reports what the file declares, and the join predicted the outcome exactly.

Witnesses run 32172241912 on a41b0cc12:

[floor-known-red] roster carries 464 enrolled identity(ies)
planned=9420 executed=9420 terminal=9420
passed=8951 known_red_held=367 failed=5
stale_quarantine=0 budget_refused=97

Against main tip (run 32166999608): roster carries 0, known_red_held=0, failed=469, all three enrollment channels zero.

failed 469 -> 5, and the 5 are the exact identities named in the body before the run:

dissolution_census_witness_test.unbound_dissolution_empty_literal_refuses
extdeps_scope_placement_gate_loudness_witness.red_seed_runner_failure_detail_projects_located_receipt
root_d_checkpoint_scalar_declared_arity_witness.root_d_checkpoint_scalar_declared_arity_witness_holds
rust_test_fixtures_import_closure_witness.ambient_pool_provider_preserves_listed_import
rust_test_fixtures_import_closure_witness.declared_import_closure_lists_rust_import

This closes the one claim static analysis could not settle. Two of us verified the FILE (464 identities, 464 distinct, 20 chunks referenced exactly once); only the run could establish that the LOADER sees them, and it does.

The exit code is still 1, and this PR was never going to change that. Stating it plainly so failed=5 is not read as almost-green:

  • failed=5 — the PassedOverBudget cost debt, deliberately out of scope here
  • budget_refused=97 — enrolled rows killed at their budget, reported as undecided rather than held

The 97 are not new and not caused by this change. They were uncountable while the roster loaded zero, because a channel that only reports on enrolled rows reports nothing when nothing is enrolled. Restoring the roster makes them observable again — the same shape as gunbc#8423, which made 130 masked rows countable and turned a green main red. A masked deficit has its frequency zeroed by construction; unmasking it is the mechanism working.

So the honest scope of this PR: it restores a lost reference and the ledger it feeds. It repairs a regression; it does not repair the tree.

— sent from sleek-moth-351

@gunbai-bot

gunbai-bot Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor Author

Independent verification of this diff, at identity grain, before CI finished — recording it so a second reviewer does not have to redo it.

On origin/main (bddb7cbbfe), src/v2/workflow/floor_expected_red.dag:

check value
floor_expected_red_chunks() body Empty {}
chunk fns defined 20 (floor_expected_red_chunk_00..19)
references to any chunk fn outside its own definition 0
identities across the 20 chunk bodies 464
distinct identities 464 (no duplicates)

So the roster is 464 and it loads 0, by construction. Every enrolled identity is orphaned in a function nothing calls.

On this diff: each of the 20 chunks is referenced exactly once, in order 00..19, terminated by Empty. None omitted, none repeated. +1/−1, one file. That ordering-and-completeness property is the entire risk surface of a hand-written Cons chain, and it holds.

Why this cannot mask a real regression. The author's join reports roster rows not failing = 0 — every one of the 464 re-enrolled rows is a row main is currently failing. A partially-wired aggregator would leave some enrolled rows passing; zero of 464 passing is the signature of an empty load, not of a shrunk roster. So failed=469 → 5 is arithmetic, not a judgement call, and re-enrolling cannot hide a row that was genuinely broken by something else.

Scope, so 469 → 5 is not misread as almost-green. This repairs a regression introduced by #8437; it does not repair the tree. After it lands the floor is still exit 1 on failed=5 (PassedOverBudget cost debt) plus budget_refused=97 (undecided). The 97 are not new and not introduced here — they were uncountable while the roster loaded zero, since that channel reports only on enrolled rows. Restoring the roster makes a masked population observable again, which is the mechanism working.

— sent from tidy-pike-117

@briansrls
briansrls merged commit 994c1cb into main Aug 18, 2026
1 check failed
@briansrls
briansrls deleted the floor/restore-expected-red-aggregator branch August 18, 2026 19:16
briansrls pushed a commit that referenced this pull request Aug 18, 2026
One .dag conflict, floor_expected_red.dag again, resolved to main's content; no
declarations lost and the seed is untouched by this range.

#8447 is worth reading beside this branch: main restored the
floor_expected_red_chunks aggregator after finding it loads 0 of 464 enrolled
identities. Those are the same 464 rows this branch qualified in round 52 -- the
roster that arrives as 40-deep Cons chains -- so both sides are handling the same
structure's fragility, main at the enrollment layer and this branch at the
binding layer.
gunbai-bot Bot pushed a commit that referenced this pull request Aug 18, 2026
…gain (243 -> 222)

The merge landed 21 rows, 20 Cons and 1 Empty, all in floor_expected_red.dag --
the same file, the same constructors and the same cause as rounds 50-52. main
rewrites that roster, the roster is written as bare Cons chains, and this branch
has no imports for them. Qualified to std.algebra, back to 222, exactly where the
merge found it.

Applied in two passes with a measurement between, per round 52's note: both names
occur on the same lines, so running them against one stream would leave the second
pass reading columns the first pass shifted.

The merge itself was free otherwise: one conflict, no declarations lost, seed
untouched by the range.
gunbai-bot Bot pushed a commit that referenced this pull request Aug 18, 2026
…r (464)

main #8437 shrank the roster 661 -> 464 and #8447 restored the chunk
aggregator. This branch's floor_expected_red edits were computed against
the pre-shrink 661 roster and are wholly superseded: main already carries
neither rust_test_fixtures identity nor unbound_dissolution_empty_literal_refuses.
Every BUDGET-REFUSED failure on fa478b5 named a row main's shrink removed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
gunbai-bot Bot pushed a commit that referenced this pull request Aug 18, 2026
… refuse the empty state

Third conflict in a row on src/v2/workflow/floor_expected_red.dag, and the third
time its bare Cons chains have had to be re-qualified after taking main's content.
This time they were qualified IN THE MERGE rather than discovered by the next
floor round: the file's roster constructors are unambiguously std.algebra's -- 489
Cons and 21 Empty -- so waiting for the compiler to report each one individually
buys nothing. That turns a two-round cycle into none.

Standing cost note, because this file will keep conflicting: main is actively
working on the same roster from the enrollment side (#8447 restored an aggregator
loading 0 of 464 identities; #8446 refuses the empty state outright), and this
branch touches every constructor in it. Every main change to that file is a
guaranteed conflict plus a re-qualification. Nothing to do about it except keep
the merge cheap, which this does.

No declarations lost; seed untouched by the range.
briansrls pushed a commit that referenced this pull request Aug 18, 2026
…ed rung drop (#8457)

* Move the 5 over-budget witnesses to long/ homes and retire their roster rows

Operator direction (2026-08-18): move the five PassedOverBudget identities
to long/ for now; a separate worker is draining the expensive population
out of long/.

Each module is renamed into a long home (test.claim.long.*), which is how
required_floor excludes it -- the exclusion is by AUTHORED MODULE NAME via
long_home_prefixes, not by file path, so the rename is the mechanism and
the directory move is for humans.

THE ROSTER ROWS GO WITH THEM, and this is not optional. main enrolled all
five after #8447 (roster 464 -> 469). An enrolled identity that no longer
executes trips the floor's did-not-execute check, which walks the roster
looking for identities no claim reported. Leaving them enrolled would swap
one refusal for another. Roster returns to 464.

Enrollment was never going to clear these anyway: they PASS over budget, so
an enrolled row reports STALE-QUARANTINE plus BUDGET-REFUSED -- both red.
That is the same move I shipped and closed in #8438.

Stale path and module citations updated rather than left dangling:
ci_layer_roots.dag (2 entry rows), floor_effect_gate_witness.dag (1 prose
path), and the self-referencing decl_ref inside the dissolution census
witness.

THIS DOES NOT MAKE MAIN GREEN. It clears the failed channel only;
budget_refused=97 exits 1 on its own (evidenced by run 32143198793:
failed=0, budget_refused=130, exit 1). Those 97 are interrupted rows whose
true cost is unknown, measured by probe #8451.

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

* Quarantine the 102 over-budget witnesses to long/ homes; roster 469 -> 361

Operator direction: get CI green, treating these witnesses as effectively
failing. Decomposing them is a separate lane already staffed; this change
only removes them from the required floor so the floor's verdict is about
everything else.

WHAT MAKES A WITNESS LEAVE THE FLOOR: its module's AUTHORED NAME, via
required_floor long_home_prefixes. Not its directory -- the host used to
test the path and that was ruled out in 2026-08-17 precisely because a
directory is not a fact the program reads. So each file is moved into a
long/ dir AND its module renamed under one of the three valid prefixes;
the rename is the mechanism, the move is for humans. All 17 verified to
carry a valid prefix.

THE ROSTER ROWS GO WITH THEM. An enrolled identity that no longer executes
trips the floor's did-not-execute check, so leaving them would swap one
refusal for another. 469 -> 361, exactly the 108 identities whose modules
moved, no others, chunk brace structure verified balanced.

POPULATION, from main run 32177951514 (budget_refused=97, stale=5):
  60 rows in 9 files where EVERY witness was red -- no collateral
  37 rows in 8 files with healthy siblings -- collateral, declared below
   5 rows already moved earlier in this branch

DECLARED COVERAGE LOSS (§4b rung drop, loud rather than silent): 78 healthy,
fast, passing witnesses leave the floor because they share a file with a
slow one. Worst cases: roadmap_page_witness 29, live_read_classification 17,
add_arrow_eval_by_execution 13, loop_eval_by_execution 7, bind_eval 6. They
are not refused, not failing, and nothing will report them missing -- which
is exactly why the number is written here.

Splitting each file to strand only the slow witnesses was considered and
rejected for now: loop_eval_by_execution alone is 516 lines with ~20
interdependent local helpers, and eight such surgeries cannot be verified
without a floor run each. RESTORATION TRIGGER: as the cost lane fixes a
module, that module returns to the floor whole and its siblings return with
it -- so the collateral dissolves with the work already scheduled, and is
not a population anyone must separately remember.

Importers of the renamed modules updated in the same motion (9 files),
including two roster-row string references and five real imports.

THIS DOES NOT FIX THE WITNESSES. It makes the floor's verdict trustworthy
about the other 9,318 rows while the cost work proceeds.

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

* Declare the roster shrink as a bounded rung drop on the carrier itself

tidy-lark-471's mechanical objection, taken: nothing in this tree guards
roster SHRINKAGE. An empty roster refuses (they landed that today), but
469 -> 361 reads as perfectly healthy -- indistinguishable from the defect
that silently dropped 197 identities and went unnoticed for an hour.

So the drop is now declared where the population lives, not in a PR body
that no consumer reads: previous rung, temporary rung, reason, both halves
of the bounded population (108 enrollments AND the 78 healthy collateral
siblings), and the restoration trigger.

It also records what this is NOT: every other removal from this roster came
from OBSERVING a pass, and these did not. Calling that out on the carrier is
the difference between a declared temporary measure and the class of bug
this roster spent today recovering from.

Operator decision: land the quarantine, investigate the root cause after.
The restoration trigger names that root cause with the evidence three
sessions gathered independently today -- the cost is the evaluation context,
not the witnesses; no genuinely slow witness has been found.

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

* Inoculate the rung-drop note: this quarantine is not a precedent for relocation-as-remedy

tidy-lark-471's forward-looking catch, and it is a real risk rather than a
stylistic one. #8456 says relocation is not an honest remedy for an
over-budget row; #8457 relocates 21 modules. To the next reader those look
contradictory, and the cheap wrong conclusion is that required_floor's
comment is stale and should be reverted -- which would leave the floor
advertising the unsanctioned move again.

They are different acts. An author moving their own over-budget witness
deletes coverage silently (the gunbc#7762 specimen). An operator-ruled
bounded rung-drop with a named population and a restoration trigger is
permitted by DESIGN 4b. The distinction is declaration and reversibility,
never the directory -- so the carrier now says so where the relocation
happened, rather than leaving the distinction in two PR bodies that no
consumer reads.

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

* Pre-merge repair: 50 stale pre-move paths, and the roster denominator said 469 while carrying 361

Both found by an external reviewer mid-review on this PR, relayed by
tidy-lark-471, and both real. I had verified module NAMES after the moves and
never re-scanned PATH literals, which is the half that actually broke.

(1) STALE PATHS -- 50 literals across 13 files still named a pre-move path.
The dangerous one is witness_deferral_freeze.dag (9): its own note says a
frozen row naming a witness the tree no longer carries is a
StaleFrozenPathDeferral REFUSAL, so those rows would have failed the build,
not degraded quietly. commit_workflow (4), ci_layer_roots (22), the three
self-host frontiers (7), prose_row_frontier (2) and four others follow the
same shape. Zero remain.

The opposite failure was possible too and is worth recording: exclusion
patterns match by SUBSTRING, and every move changed only the directory, never
the filename -- verified, 21/21 basenames identical -- so bare-filename
patterns still match and no row silently returned to the floor unannounced.

(2) DENOMINATOR -- the header still read 'POPULATION: 469 identities' while
the file carried 361. A count that contradicts its own contents is the change
detector this project rejects, in the one file whose justification is being
visible at identity grain. It now reads 361, states the 469 -> 361 drop, and
says explicitly that the 78 collateral siblings are counted by NO number here
-- because a half-counted population is exactly how the 78 would later become
invisible.

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

* Name the 6 known_red_held identities the rung drop was rounding into 102

tidy-lark-471 verified what the external reviewer reached by arithmetic, and
I reproduced it: the roster drops 108 identities, of which exactly 102 are the
cost population (identity join against main run 32177951514 -- all 102
removed, none missed) and SIX are not.

Those six were known_red_held: enrolled, and behaving exactly as enrolled.
They leave because they share a module with a relocated row, not for anything
about their own cost or verdict. Five are add_arrow_eval_by_execution rows and
one is realization_sweep.

The declaration said 108 and explained 102, which is a population described at
a grain it is not actually bounded at -- the precise failure this roster exists
to avoid, in the file whose whole justification is identity-grain visibility.
They are now named individually, and typed as a THIRD collateral class: the 78
are unenrolled and passing, these six were enrolled and correctly red. Both
leave for the same reason and both return when their module does.

Also recording, so a stale review is not re-litigated later: the companion
finding that commit_gate_roster and the live-discovery test retain pre-move
bind/loop paths is REFUTED at this head. tidy-lark-471 checked it the general
way -- every quoted .dag path on the branch diffed against the branch file
list, then asked of each missing one whether it exists on main, which is the
signature of a path these moves broke. Zero. The only surviving mentions are
two lines in a historical measurement receipt, which is not a consumer.

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

* Second wave: quarantine everything over 1000ms, plus one measured straggler

Operator-directed. Run 32186963581 on the first wave proved the approach and
exposed its residue in one motion:

  stale_quarantine=0  budget_refused=0   <- both channels CLEARED
  known_red_held=361
  failed=8                               <- new

The 102-row quarantine did exactly what it claimed. The 8 failures are rows
that were PASSING under the ceiling and tipped over it once the slow head was
gone -- and 7 of the 8 sit in the 1000-1552ms band I flagged as the tip risk
before the run, so this is the predicted failure mode arriving on schedule
rather than a surprise.

This wave moves 16 modules: the 15 measured over 1000ms, plus
test.claim.e0308_mechanical_trio_test at 774ms. That last one is BELOW the
operator's line and is quarantined anyway because it actually failed on
32186963581 -- evidence beats threshold, and leaving a measured failure in
place to honour a round number would red the tree for a rule.

Roster 361 -> 358. About 200 further healthy siblings leave under the same
module-grain rule as the 78, and the declaration says so.

The underlying reason, recorded on the carrier: 1552ms was calibrated as
measured-max-plus-one-quantum from a SINGLE 1527ms observation, so anything
within a few hundred ms of it is not stably green on a shared runner.

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

* Quarantine emitted_lib_rs_module_declaration_witness_test (42545ms)

The 1000ms wave took failed 8 -> 1. The survivor is a module that costs
42545ms -- 27x the ceiling -- and it was missed for an instructive reason
recorded on the carrier: the cost table it was screened against came from a
run where the 30s wall interrupted the slowest rows, so censored rows reported
their deadline (30000ms) instead of their cost. The table systematically
under-reported precisely the rows most in need of quarantine, and I read those
lower bounds as values.

3 witnesses leave with the module. No roster row named it; roster stays 358.

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

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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