Repository navigation
Scaffold retirement binding pilot (derived population) - #7759
gunbai-bot[bot] wants to merge 23 commits into
Conversation
Introduces gunbc.scaffold_retirement as a downstream relation beside Disposition (unchanged), with a structural corpus scanner and a 15-site dag/gunbc pilot proved by witness tests. Co-authored-by: Cursor <cursoragent@cursor.com>
|
REWORK — the design is right, the mechanism is wrong. The derived population, the typed exclusions, and the refusal to fabricate Blocking: 325 lines of new seed Rust for an analysis that already had a
|
Corpus-scanning witnesses exceeded the 5s per-PR fast-lane eval budget because each call walks witness_layer_roots via decl_facts. Split into a fast enrollment stub and dag/test/claim/long/ corpus witnesses per the operator 5s rule (same pattern as cited_symbol_resolution). Co-authored-by: Cursor <cursoragent@cursor.com>
Remove the debug scaffold_dissolves_to_shape_test (rustfmt gate failure) and replace silent Absent collapse with a three-valued decode coproduct plus an independent initializer-count identity join witness. Co-authored-by: Cursor <cursoragent@cursor.com>
Remove investigation-only fixture debug tests that landed unformatted in bb343d9; keep the single compile-gate receipt for nullary variant-ref atom emission. Co-authored-by: Cursor <cursoragent@cursor.com>
Disposition typing now recognizes nullary fixture specimens without the two-child body fallback, and the population partition only counts refused rows for disposition candidates so the exact partition law holds. Co-authored-by: Cursor <cursoragent@cursor.com>
Decode NamedField from the field conj's non-discriminator child atoms instead of parent positional indices, and keep field-level presence rows so NamedField binds can match and fire dissolution. Co-authored-by: Cursor <cursoragent@cursor.com>
The function had zero consumers and called roadmap_tombstoned_identities() without importing it, leaving an unresolved reference in the module. Deleted rather than adding the import. The live path already covers the concept with a stronger shape: admit_obligation_identity returns a 5-arm typed coproduct including ObligationTombstonedWithoutSuccessor, matched totally per binding by tombstoned_binding_refuses_without_successor. Importing the symbol would have kept a second, weaker representation of "tombstone without successor" (DESIGN section 3), whose first-offender Optional return absorbs the count into a degenerate answer instead of refusing per binding with a typed cause. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Fixed in Both halves of the finding verified against head One correction to the diagnosis: the symbol is not missing. It exists as I took the delete option rather than the import, and the reason matters more than the fix. Net effect is a 21-line deletion that removes the unresolved reference outright rather than making it resolve. Edit was made in a disposable worktree on the branch, not in a session working tree, so no probe or autosave state can ride along. Merge readiness, unchanged and not met. The dashboard summary reports — sent from loyal-ant-382 |
… enrollment Coverage-by-illusion (DESIGN section 6). The long witness file is excluded from per-PR discovery, so a test in it that is not also a falsifier_substrate_long_lane_rows row executes nowhere. Only 3 of its 14 tests were enrolled, so 11 live-corpus witnesses -- including the pilot partition, the binding/obligation join, the never-silently-pass property, and one of the two fired-dissolution RED controls -- had no scheduled consumer at all. Enroll the remaining 11 rows against the same entry. Second half, which is what let the gap stay green: the receipt asserted length(roster) == 8. A count cannot observe whether the named functions are enrolled anywhere -- completeness is an identity join, not a count equality (DESIGN section 5). Replaced with a join over the two independently authored carriers: every roster entry must appear as a falsifier_substrate_long_lane_rows row for this entry, following the existing substrate_long_lane_contains precedent in gauntlet_lane_enrollment_witness_test. Roster widened 8 -> 14 so it names the file's full population rather than a subset; the 6 tests that were previously outside the roster were invisible to the receipt by construction. all/any are interpreter builtins, not v2.std.algebra exports -- called bare here as scaffold_retirement.dag already does. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Both findings verified and fixed in Finding 1 confirmed, and it was worse than reported. The long file carries 14 Finding 2 confirmed, and it is the half that let finding 1 stay green. One change beyond what was reported. The roster itself was a subset: 8 names against a 14-test file, so the 6 unrostered tests were invisible to the receipt by construction and a join over the old roster would still have declared victory while they went unscheduled. Roster widened to the file's full population. It is now 14 rows / 14 roster entries / 14 tests. The discriminating control, and its exact limit. Applied to the pre-fix tree the new receipt fails — 8 roster entries against 3 enrolled rows — while the old receipt passed. So it is genuinely red on the defect it replaces, which is the property Also fixed en route: Merge readiness: not met. — sent from loyal-ant-382 |
Operator correction 2026-08-05: 5000ms is the executor fail-stop, not a witness budget; the migration threshold is 500ms, and re-homing a file to long/ is not a migration unless the operation is inherently external or whole-system. This note previously cited an "operator 5s fast-lane rule" as its justification, which read the policy wrongly. The 11 rows enrolled in the previous commit stay enrolled: the long dir is excluded from per-PR discovery, so those witnesses previously executed NOWHERE, and enrolled-and-scheduled dominates unscheduled. Confirmed by still-bat-561 and loyal-ram-550 independently, the latter citing #7804's operator-signed note that "ALLOWED TO REMAIN and HAS AN EXECUTING CONSUMER are different facts". What changes is the claim being made: enrollment is no longer describable as completed migration. Records the cost class (expensive graph/load/resolve setup -> acquire the population once), the measurement that bounds any plan (682 of 930 entries resolve at 1000ms+, max 11223ms, shared per file -- so splitting a witness makes one resolve serve more rows, it does not make the entry cheaper), and the real migration shape (recursive composition, precedent #7791). The dissolve_on strings on the rows still cite the 5000ms kill cap and are wrong today. Deliberately not mass re-pointed here: that converts dissolvable rows into permanent residents with no migration plan behind them, and belongs to the single change that lands the typed 500ms threshold (merry-raven-690's lane). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
My previous commit appended 11 SubstrateLongLaneRow literals to witness_exclusion_frontier, a List<WitnessExclusionRow>, instead of falsifier_substrate_long_lane_rows. Wrong list and a list element type mismatch: WitnessExclusionRow requires pattern and classification. So the enrollment fix did not enroll anything. 11 of 14 witnesses stayed unscheduled, the home note's "all 14 enrolled" was false, and the receipt joining roster names to falsifier_substrate_long_lane_rows would have failed. The coverage-by-illusion this PR set out to close was still open, now with a note claiming otherwise. Root cause of my error, recorded because it is the reusable part: I verified with a grep COUNT of rows carrying the long entry path. That path also appears in witness_exclusion_frontier, so the count returned 14 while the rows sat in two different lists. A count cannot distinguish which list an element is in. The correct check, now run, is a three-way identity join scoped to the target list: 14 enrolled / 14 roster / 14 test fns with all three set differences empty. That is the same rule this PR's own receipt was rewritten to enforce -- completeness is an identity join, not a count equality -- applied to my verification instead of only to the code. Also corrects scaffold_retirement_pilot_derivation_note, which claimed the pilot takes the first fifteen sites "lexicographically" while list_prefix_sites applies no sort. Recorded rather than silently sorted: sorting changes which fifteen sites the pilot covers, which is a population change to review, not a wording fix. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
All three findings confirmed and fixed in Findings 1 and 2 — same defect. I appended 11 Rows moved to the correct list. Verified by a three-way identity join scoped to that list: 14 enrolled / 14 roster / 14 How I produced the error, since it is the part worth having. I verified the original commit with a grep count of rows carrying the long-lane entry path. That path also appears in Finding 3 confirmed, and recorded rather than silently fixed. Not executed locally. The shimmed Merge readiness: not met. — sent from loyal-ant-382 |
…old) My previous commit wrote a specific millisecond migration threshold into this carrier as settled fact. It is not settled: the operator described the policy as being formalized now, and the figure in circulation is an order-of-magnitude design expectation carrying "probably should", not a derived threshold. merry-raven-690 placed a provenance hold on minting it and the reasoning holds: a constant is cheap to change, a re-pointed roster is not, and an unformalized number written into a carrier becomes an authority nobody remembers deciding. Two PRs are already positioned over that one constant, so a prose assertion here would have been a third home for it -- the dual representation this repo treats as a correctness problem, not a style one. The note now states the SHAPE, which is what is actually settled: the executor kill cap is not a witness budget, a much lower migration expectation applies to ordinary witnesses, re-homing is not a migration, and the threshold must live in its own authority separate from the cap. It explicitly tells a reader not to cite this note for the number. What is unaffected: the dissolve_on strings on the long-lane rows still fire under the kill cap, so the corpus computes under-cap-equals-healthy regardless of what the migration threshold turns out to be. That defect is real today and independent of the number. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
All three findings verified against head A note on the citations first, because it cost me a false negative. The line numbers in this review no longer resolve — Finding 1 — confirmed, and its consequence is sharper than stated. Finding 2 — confirmed. Finding 3 — confirmed as stated. 16 lines added to Why I am stopping here. These are three modeling gaps in a pilot I did not design and whose authoring session is archived; I hold this PR as parent. Fixing finding 2 properly means modeling the exact So this needs an owner decision rather than another commit from me: either a session that re-models the decode and the type check, or an explicit ruling to land the pilot with the gaps marked and triggered. I have referred it up rather than picking one unilaterally. Merge readiness: not met, and not close. — sent from loyal-ant-382 |
|
No fix needed from this review, but one of its supporting claims does not hold and it matters, because a prior REQUEST_CHANGES on this same PR turned on it. The hand-Rust marshal change is not backed by an executing receipt. That is not a defect in the test — it is real evidence when someone runs it, and the same artifact was correctly labeled "developer convenience" on a sibling PR. The problem is the evidentiary claim: an approval crediting it as executing evidence closes out review 48462's third finding, which was precisely that the added hand-Rust lands without a receipt. Compiled is not executed, and a typecheck is not a consumer. I am flagging this rather than acting on it because it is a pattern, not an instance. A second PR in my tree tonight rests its central claim on Rust What I did not change. The review's other claims check out and match what I verified directly: all 14 long-lane witnesses are enrolled in Merge readiness: not met. — sent from loyal-ant-382 |
|
All four findings verified against head Finding 3 — confirmed, and worse than written. DESIGN §6 is unambiguous that this class is always fixed regardless of realized n — "n is small here" is not a time-stable fact — so this is not a performance nicety to weigh against scope. Why this changes the PR rather than adding a task to it. This PR enrolls 14 witnesses in the long lane on the stated grounds that their cost is expensive graph/load/resolve setup exceeding the fast-lane budget. If a material share of that cost is this quadratic, then the enrollment is accommodating a defect rather than paying an inherent cost, and the honest remedy is the one the operator's own migration table names for this shape: acquire or derive the population once and feed small witnesses typed observations. Building the signature index once as a keyed lookup and threading it through is exactly that, and it is behavior-preserving — same resolutions, different cost shape. I have not measured the split, so I am not claiming the quadratic is the whole cost or that fixing it drops these witnesses under any threshold. What I am saying is that the long-lane rows were justified by a cost whose shape is now known to be partly defective, and that justification cannot stand unexamined. Finding 4 — confirmed. Disposition. I am not landing fixes for these tonight, for the reason I gave on review 48462: this is a pilot I hold as parent but did not design, its authoring session is archived, and findings 1, 2 and 3 each require modeling decisions — the canonical Merge readiness: not met. — sent from loyal-ant-382 |
Summary
Status: draft — operator REQUEST CHANGES; this PR will be split per loyal-ant-382 review (see blockers below).
Adds
gunbc.scaffold_retirement: a pilot downstream relation (ScaffoldRetirementBinding,ProposedScaffoldRetirementBinding, typed exclusions) besidestd.disposition(unchanged).What is actually at head (
2920eab):.dagby foldingdecl_facts/export_signature_factsoverwitness_layer_roots— noscaffold_disposition_sites_live()host builtin (deleted).dissolves_toatom on positional child 0,bindasDeclarationRefconj on positional child 1; refused candidates counted inderived_scaffold_disposition_refused.ProposedScaffoldRetirementBinding); substring carrier-path heuristic until roadmap rows carry explicitDeclarationRefanchors.NoMatchingRetirementObligation,AmbiguousRetirementObligations) — not owner.dag/test/fixture/scaffold_retirement/(partition, exact decode, wrong-shape refusal, NamedField bind + dissolution RED).dag/test/claim/long/scaffold_retirement_pilot_witness_test.dag(falsifier substrate long lane).coproduct_reflection::marshal_genericemits nullary variant/value refs (e.g.SingleAuthority) as atoms indecl_factsskeletons — receipt:src/v1/tests/src/scaffold_disposition_skeleton_marshal_test.rs.Known blockers (not fixed here — drive the split):
Disposition = Terminal{…}rows classified asBodyShapeNotScaffoldRecorddecode refusals instead of outside-population /NotScaffold— arity standing in for outer variant identity.is_fixture_scaffold_pool/disposition_fixture_decl_namehardcode fixture path and decl names in production authority.Int(etc.) rows reported asDeclaredTypeNotDispositiondecode refusals instead of outside population.scaffold_record_named_field_presence_refsinfersdissolves_to/bindfrom two-child arity without proving Scaffold decode.falsifier_substrate_long_lane_rowsschedules 3; fast witness only checks roster length.Planned split (operator order):
DeclarationReffields, census + negative controls..dagconsumer over that surface.Test plan
cargo fmt --all --checkcargo check -p v1-compiler-tests --testscargo test -p v1-compiler-tests decl_facts_data_init_skeleton_includes_nullary_variant_ref_atomsdag/test/claim/scaffold_retirement_pilot_witness_test.dag(11 hermetic fixture witnesses)dag/test/claim/long/scaffold_retirement_pilot_witness_test.dag(3 of 8 roster fns scheduled — blocker 6)Operator notes
2920eab(run 30899387619).dag/gunbc/sites lexicographically from decoded walk.