Skip to content

Unblock orphaned gunbc#10600 (branch session/warm-ant-80-provenance): floor FloorDiscoveryRefused on a test-marked decl in dag/test/manual/emission_provenance_specimen_red.dag, plus stage0-mirrors lib.rs drift, plus three symbol citations - #10819

Closed
gunbai-bot[bot] wants to merge 88 commits into
mainfrom
session/warm-ant-80-provenance

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session zesty-swift-227.
Pushing to session/warm-ant-80-provenance 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.

Brian Searls and others added 30 commits September 5, 2026 16:50
Ledger-Repair-Judged: docs/design-failure-modes.md
Ledger-Rows-Repaired: docs/design-failure-modes.md a_live_authority_name_carries_a_superseded_claim
Ledger-Repair-Judged: docs/design-rung-drops.md
Initial six model controls passed in remote invocation cd04ed16-ffb1-475d-a852-a4e4117e813d. Expanded coverage controls are running; later transaction/address type additions are not yet validated. Production capture, serialization and fixture-deletion execution remain unwired.
Ledger-Repair-Judged: docs/design-failure-modes.md
Ledger-Rows-Repaired: docs/design-failure-modes.md a_live_authority_name_carries_a_superseded_claim
Ledger-Repair-Judged: docs/design-rung-drops.md
…ive helper

The DAG compiler reports 'no field decl_name on type Empty' when using
map(origin => origin.decl_name) on a FreeMonoid<DeclarationRef> bound
from a match-arm destructure. Work around by using explicit type-annotated
recursive helper functions that match Empty/Cons directly rather than
relying on the higher-order map method.

Add imports for FreeMonoid, Cons, Empty (from std.algebra), DeclarationRef
(from std.decl_ref), and String (from std.types).
Names both specimens:
- gunbc#10600: observed |> map(origin => origin.decl_name) on
  FreeMonoid<DeclarationRef> from match-arm destructure, element type
  arrives as Empty
- gunbc#10625: rows |> any(row => row.label) on FreeMonoid<ApplicationRow>
  from match-arm destructure, same mechanism

Files the row in dag/gunbc/recurring_failure_mode/match_bound_element_type_mask.dag
and registers it in the roster.
Specimen: gunbc#10600's emission_provenance_test compares observed origin
identities by joining decl_name fields into a string and comparing to a
literal, rather than asserting each field (module_path, decl_name, field)
individually. Also correct match_bound_element_type_mask row with precise
locations and remove 'fixed' claim for unmerged #10625.
…onsumer gap

§4b(3) stale bound: updated v1_claim_scoped_witness_batch_deleted_note
in ci_layer_roots.dag from 'five entries' to 'nine (ten after #10600)',
reflecting the actual population under src/v1/tests/claim.

§6 consumer gap: added note to emission_provenance_extent_test.dag
naming the missing consumer capability (emitter path constructing
EmissionContribution from real output text) as deferred to the emitter
lane.
Resolve roster.dag conflict: keep all 162 main rows + 2 new rows
(match_bound_element_type_mask, string_comparison_type_identity)
appended last. The PR's original deletions of 4 roster rows are
restored by taking main's version.
gunbc-ci-auto-heal and others added 26 commits September 7, 2026 18:16
…r lambdas

The floor refused emission_module_loss_is_separate_from_declaration_loss for the same match-bound field access that match_bound_element_type_mask files. Bind rows at function scope and walk Cons instead of parking or deleting the claim.

Co-authored-by: Cursor <cursoragent@cursor.com>
std.emission_provenance landed with no producer: git grep EmissionContribution
over dag and src returned only the type's own module and hand-built fixtures.
This is the named later change DESIGN.md section 3c admits that deferral for.

The site is v2.compiler.emit_module, not src/v1/05_emit_rust.dag. The required
floor resolves modules from --source-root dag and --source-root src/v2 only, so
a floor-required control over the v1 emitter is unreachable by construction --
evidence that executes on no required lane. emit_module is the reachable real
emitter path and it already has production consumers (emit_family under
src/v2/test/claim/execution/native_selected_witness_bundle_production.dag).

emit_module_text and emit_family_text are now DERIVED from the contribution
tree via emission_contribution_source rather than concatenating strings beside
it, so the bytes and their provenance have one authority (section 3) and this
is a real production consumer rather than a second test-only reader. All three
arms are constructed by the emitter, none a stand-in:

  EmissionAuthoredFragment   the separator, whose bytes are the literal
                             declared at emit_module_decl_separator
  EmissionSourceComposition  the module fold, plus one per declaration
  EmissionUnobservedFragment v2.compiler.emit returns Medium<String>: the fold
                             observes the bytes but emit reports no
                             contribution structure for them, so those origins
                             genuinely are not observed at this seam

The unobserved arm records missing ORIGINS, never a missing emission -- a
rejected declaration still refuses, so this is not a section 5 absorbing
fallback. Its next-rung trigger is v2.compiler.emit itself returning an
EmissionContribution; when that lands the arm flips to Authored/Composition and
the arm census becomes the regression control rather than retiring (4b(4)).

The instrument for the emission change is
v2.test.emit.emit_module_contribution: it rebuilds the prior repeated-append
concatenation directly over emit() inside the control and asserts byte equality
against the production path over 0, 1, 2 and 3 declarations, with a separator
placement specimen proving that equality can go red.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018KYhBKKpP3tA1UWT7U23da
The .dag parser refused a data value that began on the line after its =, which
cascaded into every following annotation reading as subjectless and refused the
whole floor with ChangedWitnessObservationFailed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018KYhBKKpP3tA1UWT7U23da
…ting a fact this lane removed

review 62147, both findings.

emit_family_contribution was a hand-copy of the module fold differing only in
how an element becomes a contribution, so that difference is now a parameter:
emit_contribution_composition is the single accumulation, and a fix to the
seed, the append order or the composition wrap cannot land on one and miss the
other (DESIGN.md S2/S6).

The stall row subject still read 'no emitter path constructs these values from
real output text' and 'No production consumer constructs these values from real
emitted output', which this lane falsifies. The stall itself stands -- its
second leg, the specimen_red map compiling under dag/test/claim, is untouched
and is now what the grounding names -- but a declared subject may not assert a
fact that is no longer true.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018KYhBKKpP3tA1UWT7U23da
review 62152. The trigger still named the emitter-path control as part of the
capability it waits on while the subject and grounding said that leg was
discharged -- a grain mismatch inside one row, and DESIGN.md S4b(3) makes the
trigger the whole check. It now names only the remaining capability, the
specimen_red map compiling under dag/test/claim, and records the discharged leg
rather than continuing to require it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018KYhBKKpP3tA1UWT7U23da
…on left to heal

Both sides appended one row at the same list tail, in two authored
cons-chain rosters. Kept BOTH rows in each -- an append-carrier conflict
has no side to pick, and picking one deletes a subject rather than
resolving a disagreement.

  guarantee_stall        eval_steps_outside_the_reading_coproduct_stall (main)
                       + emission_provenance_missing_consumer          (ours)
  recurring_failure_mode capability_arrives_outside_the_converged_path  (main)
                       + match_bound_element_type_mask                 (ours)

Verified by identity join against BOTH parents, not by count: rows lost
from main = 0, rows lost from ours = 0 (53+54 -> 55, 168+168 -> 169).

docs/design-failure-modes.md is a generated projection and refused with
GeneratedArtifactConcurrentDivergence. Took the base side verbatim per
the path's declared repair route and did NOT stage the worktree bytes,
which were the ours side. Not regenerated locally: heal derives it from
the merged authorities and the generated-artifact gate must then agree
on that exact head.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WgiDD3VoavwLrcu832nJ2V
Executing the control refused at resolve: the n<=0 branch returned Empty while
the other branches returned list literals, which the resolver reads as
Coproduct(FreeMonoid) vs Container(List, InferredTree). Same for the empty
golden, which is a String rather than a monoid unit here.

Found by running the witness, which is the point: this is exactly the class a
typecheck-and-grep pass reports as finished.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018KYhBKKpP3tA1UWT7U23da
Ledger-Repair-Judged: docs/design-failure-modes.md
Ledger-Rows-Repaired: docs/design-failure-modes.md match_bound_element_type_mask
Ledger-Repair-Judged: docs/design-rung-drops.md
…gger

Keep the capability sentence; name the landing change beside it via climbs_when_awaiting so the frontier has an owner without putting a node URI in the capability field.

Co-authored-by: Cursor <cursoragent@cursor.com>
Keep ferret's stall subject: the emitter path now constructs all three arms. Drop climbs_when_awaiting for adhoc-29d4969b-2f7 — that landing is this merge.

Co-authored-by: Cursor <cursoragent@cursor.com>
The unmarked fn is discovery-visible without being an enrolled claim; TestMarkedDecl is the refusal a test marker would hit. The recursive builder fold is what emit_module_contribution consumes; the generic EmissionAppendOperation fold remains unbuilt language capability, not a stand-in we shipped.

Co-authored-by: Cursor <cursoragent@cursor.com>
…tall

The shipped fold remains terminal for emit_module_contribution. The unbuilt contract climbs when append on Coproduct(FreeMonoid) is well-typed, sufficient for the operation-only fold to typecheck and execute — not when a PR merges or the builder fold stays green.

Co-authored-by: Cursor <cursoragent@cursor.com>
The previous generic-operations wording was capability-grained but interpretive. This trigger names a condition a reader can check, retired by that capability and observed execution, not by a PR merge or the shipped builder fold staying green.

Co-authored-by: Cursor <cursoragent@cursor.com>
…pairs

The Coproduct(FreeMonoid) refusal at c86bba3 was match_bound_element_type_mask
(Cons walk at function scope), not append; monomorphic apply helpers instantiate R
at the public boundary. Ported onto the three-arm EmissionContribution type.

Co-authored-by: Cursor <cursoragent@cursor.com>
…eturn

The trigger named a language capability that is not the blocker. The residual
that still stalls is emit returning Medium<String> rather than EmissionContribution.

Co-authored-by: Cursor <cursoragent@cursor.com>
The single helper refuses: join sees Primitive()/Primitive(R) and the empty
list is not a collection. compose<R> still applies through unresolved R;
the three monomorphic helpers stay until that public-site gap climbs.

Co-authored-by: Cursor <cursoragent@cursor.com>
At 04ebf8e the census was the one specimen that went red:
  TypeError: fold_list expects a list, got Null
emission_contribution_fold's algebra is now fn(EmissionContribution) ->
EmissionAppendOperation<R> and supplies no materialized children, so the old
two-argument read lambda received nothing to fold. The other four specimens
stayed green, which is the useful half of the signal: byte identity, separator
placement, read materialization and origin location all survive the fold port
unchanged.

The census now increments through composed append operations, with one
monomorphic emc_apply_count giving the boundary call a declared type -- the
same shape std.emission_provenance uses for its own boundaries.

Verified at 04ebf8e: green, and still discriminating -- deleting the
authored separator fragment from emit_module_decl_contribution takes it red.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018KYhBKKpP3tA1UWT7U23da
The specimen_red trigger must not retire resolution/correspondence types that
still have only fixture readers. Own row; existing emission_provenance_test
claims do not fire it.

Co-authored-by: Cursor <cursoragent@cursor.com>
emission_members_by_address and EmissionModuleAddressAmbiguous have no
reader outside the defining module, not even a test. State that in the
subject rather than leaving it to grep.

Co-authored-by: Cursor <cursoragent@cursor.com>
Keep both roster tails. Generated docs/design-failure-modes.md is the
merge-base projection; heal derives the merged authorities.

Co-authored-by: Cursor <cursoragent@cursor.com>
The merge left the base projection so heal could derive it. The ledger
now includes match_bound_element_type_mask and restores the two main
rows the base file had dropped.

Co-authored-by: Cursor <cursoragent@cursor.com>
emit_module consumes the contribution fold. Resolution/correspondence
types had only same-diff fixtures; a stall does not admit that debt.

Co-authored-by: Cursor <cursoragent@cursor.com>
Correspondence half already removed. Generated failure-modes.md is the
merge-base projection pending one regen against the merged authorities.

Co-authored-by: Cursor <cursoragent@cursor.com>
Identity join: 172 rows here, 171 on main, comm -23 empty, only
match_bound_element_type_mask added.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

Closing: this is the dashboard auto-open on session/warm-ant-80-provenance after #10600 squash-merged as 38b42d363e4. Its content is already in main; is-ancestor reports NO only because a squash does not carry the original commits into main's history, so GitHub still renders a 13-file / +849 diff against the pre-merge merge-base eae2bc8e4cb.

Leaving it open was not neutral. It had a live CI run (34177863595, cancelled with this close) against a runner pool currently saturated at 14 concurrent runs, where a real merge candidate is queued behind it. The dashboard notice on this PR states that CI gates are skipped while in draft — that is true of the dashboard's own scheduled reviews and false of GitHub Actions, which ran anyway.

Nothing here needs re-review, and flipping it ready would have re-reviewed already-landed work. No follow-up is being invented on this vehicle; the auto-title wording is leftover stall text, not new implementation.

— sent from bright-ram-778

@gunbai-bot gunbai-bot Bot closed this Sep 8, 2026
@gunbai-bot
gunbai-bot Bot deleted the session/warm-ant-80-provenance branch September 8, 2026 01:50
@briansrls
briansrls restored the session/warm-ant-80-provenance branch September 8, 2026 01:53
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.

0 participants