Skip to content

Refuse ambiguous anonymous record struct shapes - #9089

Merged
briansrls merged 7 commits into
mainfrom
session/vivid-lynx-712
Aug 24, 2026
Merged

briansrls merged 7 commits into
mainfrom
session/vivid-lynx-712

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

Summary

  • preserve all anonymous-record struct candidates when field shape/type hints do not identify exactly one
  • emit a typed, located, histogram-countable AmbiguousAnonymousRecordLiteral diagnostic before rendering when ambiguity survives
  • retain tuple lowering for structural records with zero nominal candidates and a defensive compile_error! if the diagnostic fold is bypassed
  • add direct controls for ambiguous (alphabetical-pick mutation), uniquely hinted, and zero-candidate outcomes

Measured population

The broad corpus census contains 447 names in colliding field-name signatures, but the production-relevant population is narrower: module-visible candidates that remain compatible after inferred field-type hints. Required regen, required v2 emission, and the full floor all reached emission with zero AmbiguousAnonymousRecordLiteral diagnostics. The repair therefore closes the absorbing fallback without breaking a live production emission today.

The floor ledger is unchanged from the exact base SHA 5482863b4e8c (run 32681700364): both base and this PR report planned=10791, passed=10520, and known_red_runtime_errored=142.

Verification

  • cargo fmt --all --check
  • cargo test -p v1-compiler-tests anonymous_record_struct_resolution --no-fail-fast (3 passed; BuildBuddy invocation 3d26893f-b398-4c87-95a3-31694c49f1f4)
  • native required regeneration installed the generator-produced v1_compiler_emit_rust.rs candidate wholesale

@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review August 24, 2026 03:11
@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 6 file(s), including:

  • src/v1/00_core.dag
  • src/v1/05_emit_rust.dag
  • src/v1/stage0/src/v1_compiler_emit_rust.rs
  • src/v1/stage0/src/v1_compiler_parse.rs
  • src/v1/stage0/src/v1_std_core.rs
  • src/v1/tests/src/lib.rs

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)

@briansrls
briansrls merged commit 8ab8a8e into main Aug 24, 2026
1 check passed
@briansrls
briansrls deleted the session/vivid-lynx-712 branch August 24, 2026 18:33
gunbai-bot Bot pushed a commit that referenced this pull request Aug 24, 2026
…the note main left stale

#9089 added its own SeedGrowthJustification to the same closed roster this
branch adds to, so the import line and the roster note conflicted. The
roster FUNCTION auto-merged correctly and carries both.

RESOLVED ADDITIVELY, because this is not a choice between sides: both
imports kept, both rows in the roster, five entries total. Taking either
side would have silently unregistered the other's receipt -- and an
unregistered receipt is exactly the stop-line state the policy exists to
refuse, so a wrong resolution here fails open rather than loudly.

REPAIRED A STALENESS THAT WAS ALREADY ON MAIN: #9089 added its import and
its roster entry without naming its row in seed_growth_justification_roster_note,
so main's note listed three justifications while its roster carried four.
The note is a SECOND REPRESENTATION of the roster function (DESIGN §2/§3),
which is why it decayed silently and why no gate caught it. Repaired here
to name all five, with the standing fix recorded in the note itself:
derive the listing from seed_growth_justification_roster() rather than
re-author it.

Verified: 0 conflict markers, 0 unmerged paths, 5 roster entries (checked
with a pattern that matches `stage0_...` -- my first check used [a-z_]+
and silently dropped it, which is the same wrong-instrument error this
branch has already made twice), 5 imports, both receipt modules present,
and the expected-red roster unchanged at 93 rows with its aggregator and
annotation intact.

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

The closed roster conflicted three ways -- import, roster list, and the
prose note -- because main added bare_reference_scanner (#9102) while this
branch added reference_closure_binder. Both sides carried five entries
sharing four. Taking either side whole would have silently deleted the
other side's authority obligation rather than conflicting, which is the
failure main's own note warns about; the union is six.

The prose note is a second representation of seed_growth_justification_roster()
and it has now gone stale once and conflicted once. Both receipts are kept in
the merged text -- the #9089 staleness and this merge's arithmetic -- so the
next reader can check the union rather than trust it. The standing fix is
still to derive the listing from the roster function.

Verified no new diagnostic: the same entry evaluated on clean origin/main in
a separate worktree produces a byte-identical error set apart from this
branch's own additions and a one-line offset. The two "expected item
declaration" errors on `//` blocks are an artifact of the local gunbc shim,
which is a Jun 26 build predating the §4c annotation channel -- established
by the control reproducing one of them on a file this branch never touches.
gunbai-bot Bot pushed a commit that referenced this pull request Aug 25, 2026
…eps every row

The conflict is this PR's whole subject meeting main's latest additions to
the thing it deletes. Main's side carries a nine-row enumeration (grown again
since this branch opened); this branch's side carries none, because deleting
it is the change.

RESOLVED TO OURS, after checking that ours loses nothing main added. Every
sentence present on main's side and absent from ours is one of two things:
the enumeration itself, or a fact this branch's replacement text already
carries in its own words -- the #9089 silent-omission receipt, the
six-consecutive-unions measurement, the both-sides-of-a-merge rule, "rows are
authored beside the obligation they declare", and the one-entry-plus-one-
owning-module rule. Verified by extracting both sides and diffing them
sentence-wise with the row names stripped, rather than by reading past a
long paragraph and hoping.

The roster FUNCTION is untouched and still carries all nine rows -- the
population is unaffected by this change, which is the point: the function was
always the authority and now it is the only one.

This is the seventh union on this row and the last one anybody will resolve.
briansrls pushed a commit that referenced this pull request Aug 25, 2026
… main, eleven are real defects and one pair is a wall that never held (#9171)

* Thirteen identities DeclinedLiveTree hides: all thirteen reproduce on main, eleven are real defects and one pair is a wall that never held

Classifies the thirteen witness identities routed from royal-cat-509's run
32794539384 -- the only tree where the required floor's DeclinedLiveTree arm is
deleted, so the only tree where these have ever executed.

Re-measured on main with claim_batch (--hermetic and --wet) rather than read:
ALL THIRTEEN REPRODUCE. None is branch content of the cut; every one is a
main-side fact that the decline arm is hiding today.

Eleven real defects, four subjects:
- six doc-graph rows, one root cause: the 2026-08-24 measurement bankruptcy
  deleted docs/probes/ whole and left gunbc.doc_graph_roots naming 19 of the
  deleted files (228 declared roots, 209 admitted), 16 dangling links, 35 orphans
- two extdeps modules with no external-authority anchor
- 21 unrostered non-fold residue sites and 4 stale roster rows
- two compiler-behaviour refusals, staged by execution:
  parse_tree_to_emitted_node_no_matching_row, and infer_grounding_not_derived
- one undeclared v1 test module added by #9089 that reds the v1-test-migration
  closing contract

One wrong witness (two identities): lens_module_gate's redundancy leg refuses 42
of 58 enrolled lenses because it keys on two coarse enums; its first refusal is
v2.lens.complexity against itself. unenrolled and unjustified both measure 0.

Nothing here is enrolled as an expected red: the floor does not run these rows at
all, and asserting otherwise is the authority substitution #8865 made.

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

* Three manager rulings into the carrier: the self-refusal is the proof, exemption rows are forbidden, and the permanent-evidence deletion is a landed 4b(4) violation rather than a neutral choice

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

* Rename the carrier's Disposition to ClassificationDisposition: a second bare top-level Disposition dropped std.disposition's binding pool-wide, taking its Scaffold variant with it

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

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 <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