Skip to content

Repoint the last ArtifactIdentity consumer at its new name - #8185

Merged
briansrls merged 1 commit into
mainfrom
fix/self-host-artifact-identity-rename
Aug 12, 2026
Merged

briansrls merged 1 commit into
mainfrom
fix/self-host-artifact-identity-rename

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

Main is red on whole-tree compile-clean. This is merge skew between two green PRs, not a defect in either.

#8177 renamed the self-host coproduct to GeneratedArtifactIdentity to end its collision with std.cache_interface's record. #8176 merged an hour earlier and added a consumer importing the old name, so neither PR could see the other:

dag/gunbc/self_host_artifact_materialization.dag:32:3: error: name 'ArtifactIdentity' not found in module 'v2.compiler.self_host.generation' (imported by 'gunbc.self_host_artifact_materialization')

Renamed at the import, at the artifact_identity_of return type, and in the note that names the chain. It is the only stale consumer left in the tree.

Executed, not assumed: all 10 claims in self_host_generation_identity_witness_test and all 10 in self_host_artifact_materialization_witness_test pass.

Found while investigating a red on #8165, which is blocked behind it.

#8177 renamed the self-host coproduct to GeneratedArtifactIdentity to end
its collision with std.cache_interface's record. #8176 merged an hour
earlier and added a consumer importing the old name, so neither PR could
see the other and main went red on whole-tree compile-clean:

  dag/gunbc/self_host_artifact_materialization.dag:32:3: error: name
  'ArtifactIdentity' not found in module 'v2.compiler.self_host.generation'

Rename at the import, the return type, and the note that names the chain.
Both witness families over the affected module pass by execution.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@briansrls
briansrls merged commit 68f5e1a into main Aug 12, 2026
5 checks passed
@briansrls
briansrls deleted the fix/self-host-artifact-identity-rename branch August 12, 2026 15:53
gunbai-bot Bot pushed a commit that referenced this pull request Aug 12, 2026
build and ci both refused with `expected expression, found EqEq`. The three roster-identity claims
wrapped their comparison so that `== ContentHashEqual` began a line, and the .dag grammar does not
continue an expression across that break. A line-leading `&&` does continue — the existing
classify_normalize_diagnostics relies on it — so the shape is specific to the equality operator
rather than to operators generally.

Also merges origin/main, which had moved four commits ahead (#8180, #8164, #8185, #8189).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DBBegUkJygQyr1zMHiv2eK
briansrls pushed a commit that referenced this pull request Aug 12, 2026
* Prepare the frontend world once for the whole census instead of per member

The census rebuilt the world fifteen times. classify_source called dag_lex_rules() and
dag_grammar() itself, so every member revalidated the grammar and recomputed the FIRST/nullable
analysis for a grammar that does not vary between members.

The seam already existed and this reuses it rather than inventing one: 02_parse's
prepared_grammar_carrier_note records that prepare_grammar exists so a K-module walk validates
once instead of K times, with parse_module_prepared as the per-module half. take_frontend_census
prepares once, classifies every rostered member through that one world, and reconciles the
population before anything may read it as a census.

THREE STATES, NOT ONE LIST. FrontendCensusReceipt is CensusTaken | CensusRefusedAtWorld |
CensusRefusedAtReconciliation. A refused world is a fact about the world, not about any member —
reporting it as fifteen ParseRefused stages would say fifteen members failed to parse when none
was ever examined. CensusTaken is reachable only through the exact-reconciliation arm, so an
unreconciled population cannot present as a census.

classify_source keeps preparing LAZILY and now returns an Outcome. The laziness is a budget fact:
a lex refusal is decided before any grammar is consulted, which is the only reason the LEX claim
executes in the fast lane at all. The Outcome is because preparation can refuse and no
FrontendStage honestly represents that.

Roster identity is a structural hash fold over the paths in order, parameterized by the rows so
discrimination is testable — an identity function that can only see the live roster is
unfalsifiable. It does NOT cover labels: the only Symbol-to-text surface is symbol_lexeme, whose
.dag body is a self-recursive host-intercepted stub, and grounding a provenance claim on that
would be worse than the gap. Recorded as a known limit with the one case it cannot separate.

NOT DELIVERED: the census still does not execute as a required gate. This removes a fifteen-times
multiplier from a cost that may still exceed the budget alone, and I have not measured the result
— there is no claim_batch binary in this container, so any figure would be invented. The
enrollment decision is deferred to a measurement, not to an opinion.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DBBegUkJygQyr1zMHiv2eK

* Bind the hash comparisons to a let: a line-leading == is a parse error

build and ci both refused with `expected expression, found EqEq`. The three roster-identity claims
wrapped their comparison so that `== ContentHashEqual` began a line, and the .dag grammar does not
continue an expression across that break. A line-leading `&&` does continue — the existing
classify_normalize_diagnostics relies on it — so the shape is specific to the equality operator
rather than to operators generally.

Also merges origin/main, which had moved four commits ahead (#8180, #8164, #8185, #8189).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DBBegUkJygQyr1zMHiv2eK

* Route the six probes through an Outcome-matching renderer, per review 51409

REQUEST_CHANGES was correct and the finding is exact: classify_source now returns
Outcome<FrontendStage>, and the six p_* wall-attribution probes still fed that straight into
frontend_stage_label, which takes a bare FrontendStage. The witness was updated; the probes were
not. Same six probes, same omission, second increment running — I changed a callee's type and
did not check its callers.

render_classified matches both arms. A refused world renders WORLD_PREPARATION_REFUSED rather
than any stage word, because no stage was reached and borrowing one would be the conflation the
receipt's three states exist to prevent, repeated at the presentation boundary.

I then swept every symbol this PR added, renamed or retyped for surviving references. Two stale
prose mentions of observe_roster now name take_frontend_census. The remaining mentions of
count_stage and classify_normalize_reasons are deliberate — they are the notes recording why
those were removed, and they should outlive the code.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DBBegUkJygQyr1zMHiv2eK

---------

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