Conversation
…ry identifier collapsed A census found 92 mentions of `v1_compiled` across 41 files and could not tell a package name from a library name, because the concept was a bare String everywhere it appeared. That is why two sites authored the same fact independently while each looked locally reasonable. So the artifact is modeled once with FIVE SEPARATELY TYPED projections -- CargoPackageName, RustLibraryIdentifier, BinaryTargetName, EmittedArtifactSlug, SourceVisibleImportAlias -- and the confusion becomes unrepresentable rather than discouraged: a package name can no longer be passed where a library name is expected. The library identifier is the load-bearing projection and the only one authored Rust depends on, because every `use <name>::..` resolves that and nothing else. Its independent .dag authoring is COLLAPSED: tools.self_host_curated_seed_linked_harness renders it from the single authority instead of spelling it. Reading that site also corrected what it was. Its literal was a PACKAGE name, and the reason it equalled the library identifier is that Cargo derives a package's default library name from the package name while the probe's shims resolve the library -- so the package name was a MEANS of fixing the identifier, not an independent choice beside it. Authoring it as its own literal made a derived fact look chosen, which is how it drifted out of reach of the emitter's home for the same fact. The model states the direction. BYTES ARE PRESERVED AND THE ORACLE SAYS SO. Two constructions of one string are only honestly compared by pinning the string, so the witness carries the pre-collapse bytes as a controlled literal: the_collapsed_manifest_header_renders_the_same_bytes_holds. The transitional guard sits over the STRUCTURALLY DERIVED population rather than over textual mentions. It lives with gunbc.rust_item_host_observation, which already scans authored Rust over a git-derived population and already carries the tooling namespace row. It is the PREFIX that is guarded, so a shim added tomorrow is covered with nobody enrolling it; it reads modeled rows, so prose naming the identifier can neither redden nor green it; it compares the LIBRARY identifier, and the_route_package_name_is_not_the_library_identifier_holds is the discriminator that proves so rather than a comment claiming it; and an absent row would make the fold return empty, so an_absent_tooling_namespace_row_is_refused_holds exists because that is exactly the state a naive equality would have called green. DISSOLUTION: the guard dies when authored Rust no longer spells the physical library name -- when the artifact owner lands a generated stable alias through Cargo, a shared adapter or a generated prelude. That precondition is now an EXECUTING claim rather than a note someone must remember: the_import_alias_still_equals_the_physical_library_holds passes today, and its INVERSION is the mechanical signal that the cheap rename has become available. Not done here, by ruling: no rename of the physical library, and no generation of the 20 witness_main.rs shims -- full shim generation is not justified by the naming problem alone. Verified by execution: 4/4 in the new witness and 32/32 in the observation witness, exit 0 both. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6fc3cf77a7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| data emitted_closure_rust_library: RustLibraryIdentifier = RustLibraryIdentifier { | ||
| identifier: "v1_compiled" as NonEmptyStr | ||
| } |
There was a problem hiding this comment.
Drive the actual emitter from the canonical identifier
When this new authority is changed for a rename, only the curated harness manifest changes: emit_rust_selected still selects the literal v1_compiled in src/v1/05_emit_rust.dag:3553, and probe_manifest still renders that literal in src/v1/stage0/src/emitted_closure_compile_host.rs:619. The resulting crates and generated self-references therefore disagree with the purported canonical value, so the advertised one-authority rename breaks emission/native probes unless those independent literals are also edited. Wire these producers to the same projection, or avoid presenting this value as the canonical library identifier.
Useful? React with 👍 / 👎.
| fn g_tooling_namespace_prefix() -> String { | ||
| fold_list( | ||
| xs: rust_source_namespace_rows, | ||
| empty: "", | ||
| cons: fn(acc, row) { | ||
| if row.repo_prefix == rust_source_prefix_tooling { row.namespace_prefix } else { acc } | ||
| } |
There was a problem hiding this comment.
Inspect shim sources in the drift guard
When a shim under dag/gunbc/instruments/ changes an authored use v1_compiled::... to another resolvable crate name, this guard remains green because it folds only rust_source_namespace_rows; it never enumerates or examines the Rust files represented by the tooling prefix. In particular, the harness already declares the v1-compiler dependency, so a mistaken import can compile against the seed rather than the emitted closure without this claimed transitional guard noticing. Derive and validate the actual shim-source population, or generate those imports from the modeled alias.
Useful? React with 👍 / 👎.
briansrls
left a comment
There was a problem hiding this comment.
Exact-head source review: 6fc3cf77a7cd5829d77a960bf22be1d3178d6e37 — HOLD. The role split and byte-preserving harness change are useful, but two claimed construction/guard properties are not yet delivered.
-
The producer still has an independent name decision. In this exact snapshot,
src/v1/05_emit_rust.dagstill selectslet crate_name = if has_pipeline { "v1_compiler" } else { "v1_compiled" }. This PR introducesgunbc.emitted_closure_artifact.emitted_closure_rust_libraryand changes the curated harness, but does not change that emitter consumer. Consequently changing the new authority does not change both producers. Please wire the relevant emitted-library producer to the shared role-specific authority, preserving the separate retained-host case and output bytes. If this is intentionally only a harness extraction, narrow the claim and leave full consolidation explicitly open; do not report a single production authority yet. -
The transitional guard checks configuration, not the actual consumer population.
g_tooling_namespace_prefixreads the tooling row ofrust_source_namespace_rows, and the new claims compare that configured prefix with the library name. None receives observed Rust references. Changing awitness_main.rsimport while leaving the namespace row unchanged leaves these new claims unchanged. The existing Rust observation system may have other defenses, but this PR has not demonstrated the claimed auto-enrolling anti-drift property through them.
Please consume the existing observed Rust-reference/namespace machinery and prove the complete join, rather than introducing another text scanner. Minimal discriminators: change one real/supplied shim import with the namespace mapping unchanged and require red; add a shim under the derived scope and require enrollment; remove the expected observation and require an explicit gap. Keep prose and package names outside the library-import comparison. The current nonempty-row check is not a substitute for those observations.
No physical rename or whole-shim generation is requested. Keep the fix bounded to the producer home plus the actual observation consumer. Reviewed source; I did not execute the reported 4/4 and 32/32 suites.
…import text
Two review gaps, both real and both fixed rather than argued down.
GAP 1: THE PRODUCER STILL DECIDED INDEPENDENTLY. One home for the emitted closure's library
identifier was true of the harness and false of the emitter: v1.compiler.emit_rust still carried
`if has_pipeline { "v1_compiler" } else { "v1_compiled" }` as literals, so the fact had two
producers and this change had consolidated only one. The emitted-closure branch now reads
gunbc.emitted_closure_artifact emitted_closure_rust_library_text, so the consolidation reaches
both production consumers.
`v1_compiler` STAYS A LITERAL THERE, DELIBERATELY: it names a different artifact -- the seed host
crate, not the emitted closure -- and folding it into the emitted-closure model would be the
package-versus-library conflation that model exists to make unrepresentable. It wants its own
home if it ever gains a second producer; it has none today.
Connecting a producer risks moving the value it produces, so that risk is pinned rather than
reasoned about: connecting_the_emitter_did_not_move_the_library_name_holds carries the string the
emitter rendered before the connection as a controlled literal.
GAP 2: THE GUARD COMPARED POLICY, NOT OBSERVED IMPORTS.
the_tooling_rust_namespace_derives_from_the_library_identifier_holds reads the CONFIGURED tooling
entry in rust_source_namespace_rows and compares that namespace with the authority, so changing a
real `use` line while leaving namespace policy untouched does not move it. That is narrower than
the claim that actual shim drift is enrolled and made unlandable.
The join derives the SCANNED TOKEN from the authority instead of writing it, and
observe_rust_references reads supplied file CONTENT: an import naming the authority is observed
under it, and an import naming anything else is visibly unobserved -- a distinction a policy
comparison cannot produce. The positive fixture's import is BUILT from the authority, so a rename
moves fixture and token together; only the negative fixture carries a foreign crate literal,
which is its purpose.
WHAT THIS DOES NOT CLAIM: it joins SUPPLIED observations to the authority and shows a drifted
import is detectable by this machinery. It does not scan the 16 live witness_main.rs shims every
run. Stating the weaker true thing is the point; claiming the stronger one earned the hold.
Verified on this base: emit_rust's closure compiles 0 blocking errors, 117 files, exit 0 -- cited
by EXIT CODE, because an earlier verification of this same step rendered an empty section when
the refusal text matched none of the filter's patterns, which is the silence this repository's
own rules forbid reading as success. Artifact witness 5/5 including the new pin; observation
witness 34/34 including both join rows, exit 0.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both HOLD gaps fixed — exact head
|
| check | result |
|---|---|
emit_rust closure compile |
0 blocking, 117 files, exit 0 |
emitted_closure_artifact_witness_test |
5/5 incl. the new pin |
rust_item_host_observation_witness_test |
34/34, exit 0, incl. both join rows |
The compile is cited by exit code. An earlier verification of this same step rendered an empty
section because the refusal text (gunbc compile: closure-load: …) matched none of my filter's
patterns — a run reporting nothing about a step it never completed. That is the shape this repository's
rules forbid reading as success, and I had just written a receipt about it on
green_reported_over_a_population_the_instrument_does_not_own before doing it to myself with a grep.
One count correction carried from the earlier body
The shim population is 16 witness_main.rs files plus 4 unrelated .rs files that mention the
crate name for other reasons — not "20 shims". The heterogeneity is a second reason a per-file roster
would have been wrong rather than merely brittle.
Ready for exact-head re-review.
🤖 Generated with Claude Code
briansrls
left a comment
There was a problem hiding this comment.
Exact-head re-review: aa5baae — HOLD. The specific 05_emit_rust producer gap is repaired; the observed-population guard gap is not.
Confirmed fixed: emit_rust_selected now reads emitted_closure_rust_library_text() in its emitted-closure branch, and the curated harness reads the same authority. The distinct retained-host name stays separate. I am not requesting a physical rename or a new semantic naming design.
Remaining blocker, dag/test/claim/rust_item_host_observation_witness_test.dag, g_obs_rows_for and the two new claims (approximately lines 788–846): both calls supply hard-coded/planted source content. No new production consumer acquires the actual shim population and adjudicates its observed imports against the authority. Editing an actual shim leaves both supplied fixtures, both scanned token inputs, and the namespace-policy check unchanged. Thus these new claims demonstrate the scanner's token-selection behavior, not a gate on real shim drift.
The foreign-import claim specifically expects count(...) == 0 and PASSES when no authority token is observed. Absence is the observation; no admission consumer converts a missing expected import into a refusal. Further, g_obs_rows_for maps RustReferenceHostRefused to [] and discards unattributed/unscannable, so the negative claim also cannot distinguish a successful scan with no match from an unavailable/refused observation.
Close the same original gap: feed an existing production-derived expected consumer population and the existing Rust observation result into an admission consumer. Missing expected observations and unscannable/refused acquisition must remain explicit failures; changing a required actual/supplied consumer's import with the namespace policy unchanged must make THAT consumer refuse. Include an automatically enrolled new consumer and a missing-observation control. Enumerate expected consumers independently of successful token matches, or the renamed consumer simply disappears from the denominator.
Do not add another scanner or a whole-shim generator. Also do not cite connecting_the_emitter_did_not_move_the_library_name_holds as execution through emit_rust_selected: it pins the authority's value, not emitter output. Source inspection establishes the connection, while the existing harness header pin establishes its own bytes.
Management owns this bounded remaining repair after the lane handoff; the seven-native-verdict lane need not resume the harvest. Reviewed the full successor diff and the exact-head test implementation. No tests, planted mutation, emitted build, or native run were executed in this review. This is a commit-bound source-review comment, not a formal GitHub REQUEST_CHANGES event.
* Meaning splits from storage, and the new module imports the nature it uses The contract/persistence split lands first because the engine imports std.judgment_contract for DemandIdentity and demand_identity_canonical, so the lower authority has to exist before the engine group can qualify on its own. judgment_contract declares JudgmentContract.demand_nature: DemandNature and did not import it. std.materialization_ladder is that type's single authority and does not import this module, so the edge is acyclic and the repair is to consume it rather than restate it. The defect survived the originating lane because that lane never compiled this module as its own entry closure; compiled as one at the integration base it is a hard diagnostic. All five encoding and decoding bodies -- length_prefixed_encode, length_prefixed_decode, demand_identity_canonical, demand_identity_decode, string_from_code_points -- are byte-identical to the versions they moved from, so the canonical identity format is preserved by construction rather than by inspection. Nat crossings, checked at the boundary rather than by spelling: count and length are builtin methods typed through v1.compiler.infer_method's registry from the algebra templates, every one of which declares return_type std.nat.Nat, so the v2.std.algebra.length wrapper returning Int is not on this path. Eight sites cross into to_string, into a comparison against a parse_int result, and into take and skip which declare Int. The front end accepts all eight at the integration base, so no widening is authored: a cast nobody needs would lose the nonnegativity the contract carries. Compiled at base 4039815 -- judgment_contract exit=0, 0 blocking errors; materialization_provider exit=0, 0 blocking errors. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * The generic engine lands on the contract it imports, without its native claim demand_engine imports std.judgment_contract for DemandIdentity and demand_identity_canonical, so it follows the contract split rather than leading it. Carried with its direct claims only. native_demand_schedule_test is held back deliberately. Compiled as its own entry closure at the integration base it refuses on twelve names it expects from v2.compiler.compile -- NativeDemandPlan, NativeDemandValue, the four native_demand_* identity and plan functions, the three NativeCost arms, native_demand_cost_class and the two observation functions. Those names arrive with the production consumer, so the claim belongs to that group; landing it here would have put a red in the tree with no authority able to green it. The Nat question is answered differently here than in the contract group and the difference is the evidence. All five sites call length as a FREE function -- length(xs: e.entries) -- which resolves to v2.std.algebra length returning Int, not the builtin method whose algebra template declares std.nat.Nat. So the refinement does not reach this module's arithmetic, established from the call form and the declarer rather than from the name. Compiled at base 4039815: demand_engine exit=0, demand_engine_test exit=0, 0 blocking errors each. Direct claims executed, 15 requested and 15 reported, exit=0, no absent results. The negative paths are inside that population rather than beside it: a refused prerequisite blocks its dependent, a fresh effect is never attached, a cycle is reported as a cycle, a missing edge is reported, and no seat leaves a demand ready. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * The clock gets an emitted body, and its signature stops admitting what it denied Three authorities, one capability. v1.compiler.infer_method declares the observed_monotonic_nanos signature, extdeps.languages.rust.emit bridges it into the emitted registry, and v1.compiler.runtime_rust carries the body as its own rt_realization_measurement fragment rather than lines inside an unrelated block. The signature repair is a seed defect independent of the demand program. The row read `params: []` while every call site passed a label and the interpreter accepted it, so the interpreter admitted an argument its own signature denied and no emitted body could have been written against the declaration. The label is never identity material and is never hashed; it exists so pure-call memoization cannot collapse two readings around one subject into one, which would report every measured span as zero. trace_mark beside it already declared its label, so this row now matches the shape its neighbour had. Why the body had to exist: a modeled operation, an interpreter implementation and an emitted-runtime realization are three capabilities, and the builtin was registered for the interpreter only. A fold reading the clock therefore typechecked, ran under `gunbc run`, and panicked in the emitted binary -- which is where the native route actually executes. std.primitive_identity rosters five derived surfaces and a runtime body surface is not among them, which is how a registry row with no body passed every rostered check. Excluded from this group deliberately: the 05_emit_rust.dag hunk in the originating commit is entirely the emitted_closure_crate_name and seed_host_crate_name consolidation, with nothing clock-related in it. That naming work is handled through #12358 and is not replayed here. Compiled at base 4039815, each as its own entry closure: 04_method exit=0, runtime_rust exit=0, rust/emit exit=0, 0 blocking errors each. The emitted realization is NOT yet qualified by this commit. The built binary renders runtime text from the stage0 mirror, not from this .dag, so the specimen that proves the emitted clock executes requires the regenerated mirror and a rebuilt binary. That is the next step, and it is a precondition of the production consumer rather than of this carry. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Install the regenerated mirrors for the three clock authorities Regenerated rather than carried: the originating lane's mirror commit is a generated projection, and installing its bytes would have shipped a mirror produced by a different authority set than the one integrated here. The affected output population is DERIVED and it is three, not the four the assessment listed as candidates. required-regen planned 161, executed 161 and adjudicated 161, and reported drift in exactly extdeps_languages_rust_emit.rs, v1_compiler_infer_method.rs and v1_compiler_runtime_rust.rs -- one per carried authority. v1_compiler_emit_rust.rs is absent from that set because the 05_emit_rust.dag naming hunk was excluded, which is the difference between a candidate list and a roster. Each mirror carries its authority's change and nothing else: the emitted runtime registry gains the observed_monotonic_nanos bridge row, the builtin signature's empty params becomes the declared label, and the runtime source gains rt_realization_measurement. declared_divergent=1 [main.rs] is pre-existing and is not from this change. This makes the emitted realization exist in a binary for the first time; that binary's specimen is the next step and no claim about the emitted clock is made by this commit. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * The fallback stops discarding the missing-row cause, and the fatal stays put Carried from the originating lane because #12355 was CLOSED WITHOUT MERGE, so this is neither a dependency already in the tree nor a delivered fix to preserve. It is independent of demand scheduling and lands as its own change rather than inside the production-consumer group. A missing grammar row is not a shape error and this arm reported it as one. The row match produces a precise translate_grammar_relation_row_not_found when the target's grammar renders no row for a relation; the fallback discarded it and then refused from translate_type_expression_project, so a target missing a row for a MODULE MEMBER surfaced as translate_arrow_body_not_a_type_expression -- a cause about the node's shape rather than the target's coverage. DESIGN section 5 requires a failure arm to refuse with a located typed cause, not substitute a different one, and the substitution mis-located real work. THE FATAL IS DELIBERATELY UNCHANGED. translate_arrow_body_not_a_type_expression is the discriminating red of a rostered class at rung 1, closure_emit_renders_an_arrow_without_its_body, asserted BY NAME in v2.test.emit.closure_emit_arrow_body_refusal and pinned by //gunbc/instruments:v2-native-cli. Promoting the row cause to fatal would have retired that evidence while looking like a diagnostic improvement. The row cause is therefore appended FIRST and the shape cause LAST, because diagnostics_fatal selects the last diagnostic -- so the fatal is byte-for-byte the cause it was, and the only change is that the row cause is carried as context instead of dropped. Merged rather than applied: main moved this file +167/-20 since the originating merge base and the conflict was positional. Main's side added translate_module_not_a_type_expression_diagnostic and translate_first_module_body_optional, which translate_type_expression_tree now CALLS, so both sides are load-bearing and both are kept. Nothing of main's was dropped to make room for the carried comment. Compiled at base 4039815 as its own entry closure: exit=0, 0 blocking errors. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * The route switches: the engine schedules and the rendered main stops doing it The production cut. 00_compile.dag carries the demand consumer and its observation folds, 05_emit_rust.dag switches the rendered main onto native_demand_schedule_universe, and native_demand_schedule_test joins its authority at last. WHERE THE CUT ACTUALLY IS, because the file sizes read the other way round. 00_compile.dag is +1047/-0 and nothing was deleted from it, which looks exactly like a handler landing beside the implementation it was supposed to displace. It is not: the route lives in the emitter's rendered-main TEXT, where native_demand_schedule_universe is called from two string literals, and 05_emit_rust.dag is +86/-97 -- a net deletion, the displaced scheduler and its observation leaving the rendered main. A reader checking only the consumer module would conclude the opposite, so the arithmetic is stated here. Carried from three emitter commits and NOT a fourth. The naming consolidation in 1de2805 is excluded, so `let crate_name = if has_pipeline { "v1_compiler" } else { "v1_compiled" }` stands byte-for-byte as main has it and nothing of #12358's subject is replayed. Main's own changes to 00_compile are preserved rather than overwritten: the gunbc.native_frontier_ratchet import, and main's move of list_append and list_snoc_item from v2.std.algebra to std.algebra. Compiled at base 4039815, each as its own entry closure: 00_compile exit=0, native_demand_schedule_test exit=0, 05_emit_rust exit=0, 0 blocking errors each. Claims executed, 14 requested and 14 reported, exit=0, no absent results. The negative paths are inside that population: a reversed elapsed reading is invalid rather than zero, an invalid or unclassified reading makes the observation INCOMPLETE rather than silently totalling, a blocked demand contributes no transition, a kind outside the contracts is counted rather than dropped, and rendering the receipt moves no total. What this commit does NOT establish: the emitted route. 05_emit_rust.dag changed, so v1_compiler_emit_rust.rs is now stale and the binary still renders the old main. Regenerating that mirror and requalifying against the production consumer is the next step. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Install the regenerated emitter mirror so the binary renders the switched main One mirror, derived rather than listed. required-regen planned 161, executed 161 and adjudicated 161, and reported drift in exactly v1_compiler_emit_rust.rs -- the single authority the production cut changed. The three mirrors installed for the clock group came back clean, which is the evidence that they installed correctly rather than merely that nothing complained. The mirror now renders native_demand_schedule_universe, so a binary built from this tree emits a main that schedules through the engine. Before this commit the switched route existed only in .dag and every built binary still rendered the displaced scheduler. declared_divergent=1 [main.rs] is pre-existing and not from this change. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * A dead clock passed every check, so progress becomes its own refused fact THE HOLE, stated as measured rather than as a worry. elapsed_observation admits finish == start as ElapsedObserved { nanos: 0 }, so a realization whose body returns a constant zero leaves every transition CLASSIFIED and VALIDLY OBSERVED: unclassified is 0, invalid_elapsed is 0, classified equals the transition count, and native_demand_observation_complete answers TRUE over totals that are entirely zero. The emitted-body membership phase cannot see it either -- that check establishes a bridge HAS a body, never that the body measures anything. Two different predicates, one shared blind spot. Three of the four distinctions already held and are unchanged: a reversed reading is ElapsedObservationInvalid rather than zero, invalid_elapsed is counted SEPARATELY from unclassified, and both already break completeness. The missing one was progress. native_demand_observation_progressed asks progress AT THE RUN, not per transition. One fast transition may honestly observe a zero span on a coarse clock, so a per-transition rule would refuse real work; a run that executed transitions and accumulated no span at all is a clock that is not running. An empty run is vacuously progressed, so the predicate reports no defect where there was no work. DELIBERATELY NOT FOLDED INTO completeness. Completeness answers whether every admitted transition reached a cost class; progress answers whether the realization underneath produced a measurement. Fusing them would make one counter answer two questions and would silently change what every existing consumer of `complete` asserts. The rendered main CONSUMES it fail-closed: a run whose clock never advanced refuses with a located cause naming the transition count, rather than reporting its zeros as an observation. Reporting them would be a fabricated measurement presented as a reading, which DESIGN section 5 forbids outright. So the predicate has a production consumer and is not a declaration only witnesses read. THE READINGS IN THE CLAIMS ARE SUPPLIED, NOT CLOCKED. The subject is the observation fold, so reading the real clock would assert something about the host's timer instead -- and could not author the constant-zero case at all, since a working clock refuses to produce it. Supplying them is also what bounds the control: there is no timer to wait on, so a broken clock cannot hang its own test. Compiled at base 4039815: 00_compile exit=0, native_demand_schedule_test exit=0, 05_emit_rust exit=0, 0 blocking errors each. Claims executed, 18 requested and 18 reported, exit=0, no absent results. The four added controls discriminate in both directions: the dead-clock case would fail if progress were always true (it asserts complete AND not progressed over the same run), and the positive control would fail if progress were always false. NOT established by this commit: the refusal in a binary. 05_emit_rust.dag changed, so v1_compiler_emit_rust.rs is stale again and every built binary still renders a main without the refusal. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Install the regenerated mirror so the dead-clock refusal exists in a binary One mirror again, derived not listed: required-regen planned 161, executed 161, adjudicated 161, drift in exactly v1_compiler_emit_rust.rs -- the single authority the progress control changed. The four previously installed mirrors came back clean. The mirror now carries native_demand_observation_progressed, so a binary built from this tree renders a main that refuses a run whose clock never advanced. Before this commit the refusal existed only in .dag and every built binary would have reported the zeros. declared_divergent=1 [main.rs] is pre-existing and not from this change. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * judgment_contract imports the skip it uses, which the required floor refused REQUIRED-FLOOR REFUSAL cause=UnimportedBareProvider on dag/std/judgment_contract.dag#skip, provider src/v2/std/algebra.dag: the file declares imports, so its bare channel is off and `skip` is never pulled for it. Same class as the DemandNature repair in 3e0a494 and it hid for the same reason: my entry-closure compile passed, because `skip` RESOLVES. The unimported-bare-provider gate is a separate wall from resolution, and only the required floor runs it -- so compiling the module as its own closure could not have caught this, and did not. Only `skip` is flagged of the six bare names the carried decoder uses, and the distinction is checked rather than assumed: skip is declared as fn skip<T> in v2.std.algebra with no builtin registry row, so it is a genuine provider reference. take and fold resolve as algebra METHOD TEMPLATES, count and length through the builtin registry, and join is a free primitive. Importing those would be the concat mistake from earlier in this lane, where naming a free primitive in an import broke resolve across every consumer. The import names the same function that already resolved: fn skip<T>(xs: FreeMonoid<T>, n: Int) against `cs |> skip(n: hash_at + 1)`, where the pipe supplies xs and n is an Int. Verified: judgment_contract compiles exit=0 with 0 blocking errors, and the 48 contract claims re-run 48 requested / 48 reported / 48 PASS, exit=0 -- so the import is a hygiene repair and not a behaviour change. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Address both review findings: the scheduler's cost is a row, and a failed module counts once P1 -- THE SCHEDULER'S OWN WORK WAS UNATTRIBUTED, AND THAT IS A CORRECTNESS DEFECT. `schedule_plan_started` opened, covered only native_demand_tested_tree_input, and CLOSED BEFORE native_demand_schedule_universe ran -- so plan construction, ready-queue selection, binding lookup, settlement, readiness recomputation and row collection all fell into the parent residual. The partition's tolerance arm is a fixed 50ms, so a large enough selected universe makes an otherwise VALID adjudication exit NativeDriverCostRemainderExceedsTolerance: a fail-closed refusal fired by correct input, which is the wrong direction of wrong. The repair uses the mechanism already built for it. std.compiler_entry gains ExclusiveDemandScheduling, and because the driver's match over that key is exhaustive WITH NO WILDCARD, adding the row FORCED the driver to say what measures it -- which is the reason that match was written without a wildcard. demand_scheduling_nanos = span(whole scheduling call) - (engine's prepare nanos + engine's eval nanos) TWO THINGS DELIBERATE HERE. Adding the span to ExclusivePrepare was the one-line edit and it would DOUBLE-COUNT: the engine already reports its own prepare nanos and the driver already adds them, so that would trip the OVER-attribution arm instead of the tolerance one. And the subtraction SATURATES -- these are unsigned, the engine's attributed sum can exceed the enclosing wall span when the two clocks disagree at the margin, and a plain subtraction would wrap to an enormous positive and report it as scheduler cost. P2 -- A MODULE THAT FAILED AT RESOLVE WAS COUNTED TWICE. Its resolve transition carries the decided rows as its VALUE and is a real preparation refusal; the dependent infer demand is then admitted and settles DemandRefused WITHOUT a value -- it never executed, so there is nothing it refused -- and the blanket arm counted it again. prepare_refused reported 2 for one failing module where the module-level count before the engine was 1. NativePreparationStanding gains PreparationUnrun for that case, with its own prepare_unrun total exported and serialized beside prepare_refused. It gets a counter rather than folding into NotApplicable because "admitted and never executed" is worth reading: a population where it is large is one mostly blocked behind earlier failures, and nothing else in the receipt would show that. THE LIMIT, STATED RATHER THAN IMPLIED. This reads the settled state and not a cause, so a demand that genuinely refused on its OWN execution without producing rows also lands in Unrun. The engine already distinguishes DemandRefused from DemandBlocked { cause } (v2.std.demand_engine), and settling such a dependent as Blocked is the sharper repair -- that belongs to the engine's settlement, not to this rollup, and until it lands the number is visible here rather than hidden inside the refusal count. THE ROW KEY'S OWN CONSEQUENCE, HANDLED. std.compiler_entry's header records that its roster is a hand-authored list whose hole is caught by a witness, and that the witness only catches it while every key carries a DISTINCT NON-ZERO fixture value. Adding a variant therefore broke nine matches in test.claim.native_driver_cost_partition_witness (correctly -- they are over the key TYPE), and the new row gets a distinct non-zero in the sum fixture with the asserted sum and the reconciling parent both moved by the same delta, so the residual under test is unchanged. It also gets the discriminating probe that file keeps per added row: every other row well inside the parent, the total pushed past it through this one, so the probe fails exactly when this row is dropped from the fold. Green: 14/14 in the partition witness, including the new probe. gunbc rebuilt clean; 00_compile and 05_emit_rust compile with no blocking errors. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Index the engine's adjacency, and measure the locality claim instead of asserting it THE COST SHAPE IS NO LONGER AN UNVERIFIED NOTE. It is two numbers from a control, and they say half the law holds and half does not. WHAT THE LAW CLAIMS: "a completion re-evaluates its DIRECT dependents" -- settling a demand with one dependent among N unrelated ones costs one derivation, not N. The module's own header admitted the check could not see the other half, in its own words: the counter "counts DERIVATIONS, not entries visited", and "locating the dependents is a scan of the relation list". So a whole-population scan and a targeted update reached identical states AND identical counts, and the existing claim passed either way. WHAT IS FIXED: relations are now indexed by direction. demand_engine_relate -- the single site a relation enters -- maintains dependents_of and prerequisites_of, and the two readers consult the index instead of filtering the whole relation population. After this, no reader walks the relation list at all; `.relations` survives only as the authority it always was, plus a length in one fuel bound. These are NOT a second authority. Nothing writes the index that does not write the list in the same call, no reader asks the index a question the list would answer differently, and there is no second writer to drift from. What it removes is a scan, not a fact. WHAT IS NOT FIXED, MEASURED AND ENROLLED: settle still walks the entire entry population TWICE -- once to update the settled entry, once to recompute its dependents' readiness. The new control settles a one-dependent demand in a 5-demand graph and in a 45-demand graph and reports: derivations identical the relation scan is gone entries_walked 10 vs 90 the population walk is not The claim asserts what the engine does TODAY, so it is green by execution and inverts the moment the store becomes keyed. Writing it as the desired property would have landed a red and specified the same thing. WHAT REMAINS IS MECHANICAL AND NAMED. With a persistent LIST, updating one entry is inherently a walk, so locality requires entries keyed by identity plus a separate order list for the whole-population passes the law does NOT claim are local -- seal, reevaluate and the ready-queue build. Nine internal sites and one external length(). AND THE CONSEQUENCE FOR LANDING, STATED PLAINLY: until that control inverts, the production cut is not landable. Its central claim is that a completion costs its out-degree and not the graph, and at the entries grain the implementation does not hold that. The fallback of splitting the cut and landing only the engine/contract/clock foundations is now a live option, since the defect is quantified rather than suspected. I stopped short of the store swap deliberately. It is nine sites in a load-bearing module at the end of a long session, and rushing exactly this kind of edit is what silently deleted a Node-typed argument earlier today. The measurement is committed so the next pass starts from a number. Green: 16/16 demand engine claims including the new control; 22/22 native demand schedule; 14/14 cost partition. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Keyed entry store: a completion now costs its out-degree, measured THE LOCALITY CLAIM HOLDS AT THE ENTRIES GRAIN. The control that was enrolled as the defect now asserts the property and passes: settling a demand with ONE dependent costs the same in a 5-demand graph and in a 45-demand graph, on both counters. before derivations 1 vs 1 entries_walked 10 vs 90 after derivations 1 vs 1 entries_walked 2 vs 2 WHAT CHANGED. `entries` is keyed by identity and `entry_order` carries the insertion order separately, so settlement is a lookup and an insert instead of a rewrite of the population. demand_engine_settle now touches the settled entry and, through the keyed reverse-adjacency index, exactly its direct dependents -- which is the entire content of the law it claims. THE WHOLE-POPULATION PASSES THAT REMAIN ARE THE ONES THE LAW DOES NOT CLAIM ARE LOCAL: seal validates every demand once, reevaluate recomputes every readiness. Both now route through one named helper, demand_engine_entries_mapped, so a THIRD such pass cannot appear inside a function that is supposed to be local without a reader seeing the name. A GENERIC EROSION THIS HIT, AND IT IS THE SAME ONE AS THE FIELD-PROJECTION LANE'S. map_lookup answers Optional<V> over the map's own value generic, and a value destructured straight out of it does not carry DemandEntry<V> through a FIELD READ -- eight errors, all "no field 'identity' on type 'V'". Naming a typed parameter restores it, so every entry rewrite goes through demand_entry_with_state, demand_entry_produced or demand_entry_attached rather than reading fields off a lookup result inline. STILL OUTSTANDING IN THIS FILE, and it is the other half of the cost gate: demand_engine_next rebuilds the ready queue by filtering AND sorting the whole population on every admission, and demand_engine_in_flight filters it again. Keyed entries do not touch that. The next pass maintains the ready set incrementally in canonical order so admitting an already-ready demand is a head read, with its own counter -- because counting only readiness derivations is what hid the entry scans in the first place. Green: 16/16 demand engine claims. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * The keyed store's invariants, and the locality claim held at the grain it proves THREE INVARIANTS MADE EXECUTABLE, because splitting a store from its order buys locality and owes agreement. Two representations of one population can disagree, and a keyed store with a stale order list would answer settlement correctly while every whole-population pass -- seal, reevaluate, receipts -- silently skipped or double-counted a demand. the order resolves entirely in the keyed store no pass reads a dropped key the order names each demand once seal cannot derive one demand twice settlement leaves the order unchanged a completion changes STATE, not membership The third is the value-level shadow of settlement being local: the population a demand belongs to is not a function of what settled. THE FIFTH INVARIANT IS ABSENT AND ITS ABSENCE IS DECLARED. "No operational function traverses entry_order" is a property of the SOURCE, not of any value a claim can read -- the traversals live in demand_engine_entries_mapped and demand_engine_all_entries, and nothing in .dag can see that a third has not appeared elsewhere. Calling the shadow structural would be rung inflation (DESIGN section 4b(1)), so it is recorded as diligence at the same grain as std.compiler_entry's hand-authored row roster, with the same next-rung trigger: a lens over this module's own call graph. AND A PRECISION CORRECTION TO MY OWN CLAIM, which I had overstated. What the counter establishes is that settlement visits the settled entry and its direct dependents and NOTHING ELSE -- the semantic full-population scan is gone. It does NOT establish constant-time operations: a keyed persistent map may carry population-dependent internal cost such as tree depth, and an ordered ready set may carry logarithmic insertion. "Costs its out-degree, not the graph" is sound as a statement about GRAPH WORK; "O(out-degree) wall time" claims more than this evidence supports, and the carrier's header now says so rather than leaving the stronger reading available. Green: 19/19 demand engine claims. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * The ready order and in-flight count are maintained, not rederived per admission THE OTHER HALF OF THE COST GATE. demand_engine_next answered one question -- which identity is canonically first -- by filtering every entry and SORTING the survivors, on every admission, and demand_engine_in_flight filtered the population again beside it. Neither cost a readiness derivation, so both were invisible to the only counter the engine had: exactly the way the entry scans hid. demand_engine_ready_queue returns the maintained order demand_engine_in_flight returns the maintained count demand_engine_next reads the head MAINTENANCE IS LOCAL, AT THE ONE SITE STATE CHANGES. Settlement syncs the settled identity's membership from its new state and then its DIRECT dependents' -- the fold is over the out-degree, so the unrelated population is not consulted here either. The order is keyed on the demand identity and never on arrival, because two runs of one closure must admit in one order and an order depending on which prerequisite settled last would make the completion receipt unreproducible. Seal and reevaluate rebuild both facts from the states they just decided, through one named republish function so a local function cannot reach for a full rebuild by accident. A FINDING ABOUT THE SCAN THAT WAS THERE: demand_engine_in_flight filtered every entry for DemandRunning, and NOTHING IN THIS CORPUS SETS THAT STATE. No producer transitions a demand to running, so that walk computed a constant zero on every admission. It is still derived from state rather than hardcoded -- returning 0 with a comment would be correct today and a fail-open the moment a producer appears, admitting past the seat count because the count was a literal -- so the delta is taken where state changes and tracks a producer that does not exist yet. A COUNTER I WROTE AND DELETED. I first added ready_inspected to make the admission claim observable, then found demand_engine_next returns an admission and not an engine, so no caller could ever read it: a field nothing writes, which is the dangling declaration DESIGN section 3c forbids. The admission cost claim is structural instead -- one inspection of a maintained head, by construction -- and what the counter was a proxy for is asserted directly and is the sharper property: THE MAINTAINED ORDER EQUALS WHAT A FULL REBUILD WOULD PRODUCE, across a seal and three settlements including a refusal, in a 45-demand graph. Drift there would admit a stale identity or skip a ready one while every count looked fine. FIVE STRUCTURAL REDS BESIDE IT: in-flight standing is population-independent and zero; the canonical head survives an unrelated completion; a settled demand leaves the order; a refused prerequisite never admits its dependent; a duplicated dependency cannot duplicate a ready identity. Green: 25/25 demand engine claims. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * DemandRunning is a declared frontier, and the in-flight delta gets a control that can fail THE REVIEW IS RIGHT AND THE CATCH IS SHARP: DemandRunning is a variant NOTHING IN THIS CORPUS PRODUCES, which is the same unconsumed declaration (DESIGN section 3c) as the inspection counter deleted from this module one commit ago. It got a quiet pass because it sits inside a coproduct rather than standing alone as a field. AND MY CONTROL WAS WORSE THAN USELESS THERE. "The in-flight count is population-independent and zero" cannot fail if the running path breaks, because no producer reaches that path -- so it looked like a guard over the in-flight delta while guarding nothing. A check that cannot go red is a decoration (DESIGN section 4b), and this one was positioned to be cited as coverage. THE FRONTIER IS NOW DECLARED WITH ITS PRODUCER AND TRIGGER, not merely noted. The seat vocabulary is real and consumed -- demand_lease_admits asks the caller's offer whether an admitted demand obtains a lease -- but admission does not RECORD that a demand went in flight, because demand_engine_next answers a DemandAdmission and not an engine, so nothing it wrote could reach a caller. The producer is therefore the admission path returning the engine it changed, which is the SAME structural gap that made the inspection counter unreadable: one missing return, two dangling declarations. Trigger: multi-seat realization -- with one seat the driver executes immediately after admission and no demand is ever observably in flight. AND THE DELTA NOW HAS A ROW THAT DISCRIMINATES. DemandRunning cannot be reached by RUNNING the engine, but it can be SUPPLIED -- demand_engine_settle takes any state, which is the boundary this claim sits at (DESIGN section 3's witness rule). Entering running raises the count, entering it twice does not double-count, and leaving it for a settled state lowers it again. PROVEN DISCRIMINATING BY MUTATION, because a passing claim establishes nothing until it can fail: with demand_in_flight_delta stubbed to return 0, the population row still PASSES and only the new row goes RED. That is the exact split the review predicted. A third row beside it: a running demand is not in the ready order, so a seat held is not also a seat offered. Green: 27/27 demand engine claims. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Gate item 4: engine, schedule and partition controls green at this head demand engine 27/27 native schedule 22/22 cost partition 14/14 TWO MERGE CONSEQUENCES FIXED, neither caused by this lane's changes and both found only by running the sets at THIS head rather than trusting the earlier greens. Main tightened the unimported-bare-provider rule, so dag/test/claim/native_driver_cost_partition_- witness now needs `import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }` -- it declares imports, so its bare channel is off and the pair no longer resolves through the census. The file had passed 14/14 before the merge on exactly the same content. And fixing the import made its DEBT ROW stale, which the rule then refused in the other direction: the roster carried (file, SubstrateInputsOnly) as ActiveDebt, and a pair the file no longer needs must be retired rather than left owed. Its standing moves ActiveDebt -> Retired { cause: ImportsFixed }, which is the one transition that roster admits, and the cause is true: the imports were fixed in this change. Worth recording that the rule caught BOTH directions. A missing import refused at the file, and a discharged debt left in place refused as RosterStale -- so neither the fix nor its bookkeeping could be half-done silently. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Drop the translate fallback, reach the mirror fixed point, census the moved authorities THE TRANSLATE FALLBACK IS REMOVED, and the deciding fact is one I did not have when I argued to keep it: this exact repair already had its own PR, #12355. It was HELD because none of its tests observed the preserved diagnostic chain; its author then tried to construct a discriminating red, found the double-failure arm UNREACHABLE on that base, and recommended closing rather than landing unwitnessed defensive code. #12355 closed unmerged. So it was never a 36-line judgment call. The qualitative test is whether the changed arm has a reachable consumer and a mutation-sensitive control, and it demonstrably has neither -- which is the same standard this session has been applying to everything else: a check that cannot go red is a decoration. I argued to retain code I WROTE on a size argument, which is the bias worth recording beside the revert. It is a v2 module, so no seed mirror had to be re-derived and no "translate-removed-but-mirror-stale" head was possible. Restore it only when current main supplies a concrete double-failure specimen whose complete diagnostic chain changes when the repair is removed. THE MIRROR FIXED POINT IS REACHED AND VERIFIED, not assumed. Pass one drifted exactly one mirror -- v1_compiler_emit_rust.rs, from the P1 redo -- which was installed and rebuilt. Pass two reports first_generation_equal=true and exits 0, and both mirrors were hashed before it ran and verified byte-identical after. That is the boundary stated as "the second pass writes zero bytes", checked rather than inferred from an exit code. THE MOVED-AUTHORITY CENSUS, because line counts show the DIRECTION of an extraction and not semantic uniqueness. "materialization_provider shrank and judgment_contract is absent on main" establishes that declarations moved; it does not establish that each now has one home. Measured: 31 authorities declared in judgment_contract each has EXACTLY ONE declaration corpus-wide (dag, src/v1, src/v2) NONE is also declared in materialization_provider the provider CONSUMES them through import std.judgment_contract So the survivorship row reads: moved authorities have one declaration each; the persistence provider consumes them and no longer defines them. And the conclusion is narrowed to what the evidence supports -- no supersession or duplicate authority was found in the retained demand-engine groups; generated mirrors are re-derived; the unrelated translate fallback was removed -- rather than the broader "nothing is duplicated" that asked line totals to prove semantic uniqueness. Green at the fixed-point head: 27/27 demand engine, 22/22 native schedule, 14/14 cost partition. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Cover the new row key in the Rust test targets, which no --bin build compiles THE GENERATED LANE FAILED ON A TEST TARGET I NEVER COMPILED. Adding ExclusiveDemandScheduling to the row key left two non-exhaustive matches in src/v1/tests/src/native_driver_cost_refusal_test.rs: error[E0004]: non-exhaustive patterns: NativeDriverExclusiveRowKey::ExclusiveDemandScheduling not covered I HAVE A NOTE ABOUT EXACTLY THIS AND STILL DID NOT RUN THE COMMAND. `cargo build --bin gunbc` does not compile src/v1/tests, so every local build I ran was blind to it. CLAUDE.md names the command that is not: `cargo clippy --all-targets -- -D warnings` is "the only command that compiles the integration-test and example targets, so a red there is invisible to every other step". The pre-push hook runs cargo fmt, not clippy, so nothing local objected either. WHAT THE EXHAUSTIVE MATCH DID RIGHT. This is the same construction that forced the driver to measure the row: a match over the key TYPE with no wildcard refuses to compile until its author decides what the new row means there. It caught the test targets too -- it just caught them in CI because that is the only place they were built. The row key's own header in std.compiler_entry says a wildcard would answer zero for a span nobody wired up; the same reasoning is why these two fixtures had to say 0 explicitly rather than inherit it. Verified with the CI command this time, not a --bin build: cargo clippy --all-targets -D warnings finishes clean. ALSO CONFIRMED FROM THAT RUN: floor PASSED at 43m9s, so the monotone-roster merge was the right repair, and the regen phases report first_generation_equal=true and fixed_point_equal=true in CI -- the mirror fixed point I verified locally by hashing holds on the runner as well. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Count the population through entry_order, not the keyed store The emitted closure refused to compile where the interpreter had accepted the same source: error[E0308]: length(run.engine.clone().entries.clone()) expected Rc<im::Vector<_>>, found Rc<im::HashMap<Rc<DemandIdentity>, Rc<DemandEntry<..>>>> `entries` is keyed by identity now and `entry_order` is the population's enumeration, so three sites counting the store as a list were wrong: native_demand_run_demand_count in 00_compile, and two assertions in the engine's own claim file. All three typechecked in .dag -- FreeMonoid is loose enough interpreted -- and only the emit route caught them, which is the rostered class accepted_source_emits_uncompilable_target. Worth recording that the interpreted claims could NOT have caught this: 27/27 passed over the same source. emit-build is a non-required detector lane and its own log says a red there is a real finding, most likely the author's. It was. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Install the regenerated mirrors for the merged emitter authorities The merge took main's side for two GENERATED mirrors so the tree would build, and the regen then re-derived both from the merged .dag. This commits that re-derivation: without it the branch carries main's mirrors against this lane's emitter source, which is exactly the drift the generated lane refuses. Caught by reading git status before claiming the push was complete -- the candidates had been installed into the worktree and rebuilt against, but never committed, so the head pushed a moment ago carried main's mirrors. Verified after: regen pass two reports first_generation_equal=true and rewrites no mirror, with every hash checked. 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>
Five names for one emitted artifact, separately typed, with the library identifier collapsed
A census found 92 mentions of
v1_compiledacross 41 files and could not tell a package name froma library name, because the concept was a bare
Stringeverywhere it appeared. That is how two sitescame to author the same fact independently while each looked locally reasonable.
gunbc.emitted_closure_artifactmodels the artifact once with five separately typed projections —CargoPackageName,RustLibraryIdentifier,BinaryTargetName,EmittedArtifactSlug,SourceVisibleImportAlias. A package name can no longer be passed where a library name is expected,so the confusion is unrepresentable rather than discouraged.
The collapse, and what reading the site corrected
The library identifier is the load-bearing projection and the only one authored Rust depends on —
every
use <name>::…resolves that and nothing else.tools.self_host_curated_seed_linked_harnessnow renders it from the single authority instead of spelling it.
Reading that site also corrected what its literal was. It is a package name, and it equalled the
library identifier because Cargo derives a package's default library name from the package name while
the probe's shims resolve the library — so the package name was a means of fixing the identifier,
not an independent choice beside it. Authoring it as its own literal made a derived fact look chosen,
which is precisely how it drifted out of reach of the emitter's home for the same fact. The model now
states that direction.
Bytes are preserved and an oracle says so, not an argument:
the_collapsed_manifest_header_renders_the_same_bytes_holdspins the pre-collapse bytes as acontrolled literal, because two constructions of one string are only honestly compared by pinning the
string.
The transitional guard, over a derived population
Placed with
gunbc.rust_item_host_observation, which already scans authored Rust over a git-derivedpopulation and already carries the tooling namespace row.
tomorrow is covered with nobody enrolling it
nor green it
the_route_package_name_is_not_the_library_identifier_holdsproves theguard compares the library rather than asserting it in a comment
"", soan_absent_tooling_namespace_row_is_refused_holdsexists because that is exactly the state a naiveequality would have called green
The rename precondition is mechanical, not a note
the_import_alias_still_equals_the_physical_library_holdspasses today. Its inversion is thesignal that the cheap rename has become available — a better trigger than someone remembering.
Deliberately not here: no rename of the physical library, and no generation of the shims. Full
shim generation is not justified by the naming problem alone; the terminal migration is a generated
stable alias (Cargo, a shared adapter, or a generated prelude), owned elsewhere.
Verified on this base, not on the branch it came from
emitted_closure_artifact_witness_test: 4/4 PASS, including the byte pinrust_item_host_observation_witness_test: 32/32 PASS, including all three guard claims againstmain's own
rust_source_namespace_rowsThe premise was re-checked here rather than assumed: main deleted the harness's hand-shim machinery
while this was in flight ("HAND SHIMS ARE GONE, AND THE FIELDS THAT CARRIED THEM WITH THEM"), so the
fork could have been collapsed already. It was not —
cssl_v1_compiled_cargo_package_headerstillspells
name = "v1_compiled"independently. The conflict resolution keeps main's removal of thestd.dissolutionimport and adds only the authority import.One count correction from an earlier draft: the shim population is 16
witness_main.rsfiles, plus4 unrelated
.rsfiles that mention the crate name for other reasons — not "20 shims". Theheterogeneity is a second reason a per-file roster would have been wrong rather than merely brittle.
Branched fresh from current main with one logical patch; carries no other work from its origin lane.
🤖 Generated with Claude Code