From 925b7569f567af75555c75aee65c100291733bcf Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Sat, 12 Sep 2026 03:23:44 +0000 Subject: [PATCH 1/3] Qualify the extdeps.tools bare-name reads by their declaring module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 23 of the 105 value-position reads the bare-name-ambiguity census names (`[floor-bare-name-ambiguity-read]`, landed #11078) sit under `extdeps.tools`. Each was resolved by whichever claimant scope precedence happened to rank first; this binds each to the authority its own module means, through the file's own import, so the read no longer falls through the shared name slot. Three names, three declaring authorities, each named rather than inherited: - `String` is declared by `std.string_type`, NOT by `std.types`. Ten of these files carried `import std.types { String }`, which answers nothing -- `std.types` neither declares `String` nor imports it, so the name was travelling through the shared slot while the import line implied otherwise. The bogus name is dropped from the `std.types` list and `import std.string_type { String }` added, so the citation now names the declaration (§3: cite the symbol, not a re-exporter). - `Unit` IS declared by `std.types` (`type Unit`), so it joins the existing list. This is the form the proof site landed in #11078 already demonstrates: `extdeps.tools.hostname` reads `[floor-bare-name-ambiguity-bound] name=Unit resolves_to=std.types`. - `Filesystem` at `extdeps.tools.sha256sum` is the one judgment site in this batch and it is not close: the call is `Filesystem.Write(path:, content:)`, matching `service Filesystem { operation Write }` in `extdeps.filesystem.filesystem_io`. The other claimant, `std.resources`, declares a `resource Filesystem` whose capability is lowercase `write` and which has no `Write` operation at all. The file already imported `extdeps.filesystem.filesystem_io` bare; it now names `{ Filesystem }`, which is the form 82 other files in the corpus already use. No renames, and neither declaring side is touched -- this is the qualification mechanism 305 sites corpus-wide already resolve through, applied to the residue that never got it. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01M5dKcSuYW3nvAjtVcDxqhT --- dag/extdeps/tools/grep.dag | 2 +- dag/extdeps/tools/hostname.dag | 3 ++- dag/extdeps/tools/id.dag | 3 ++- dag/extdeps/tools/jq.dag | 2 +- dag/extdeps/tools/node.dag | 3 ++- dag/extdeps/tools/npm.dag | 3 ++- dag/extdeps/tools/rustfmt.dag | 3 ++- dag/extdeps/tools/sed.dag | 3 ++- dag/extdeps/tools/sha256sum.dag | 5 +++-- dag/extdeps/tools/sha512sum.dag | 2 +- dag/extdeps/tools/sleep.dag | 3 ++- dag/extdeps/tools/stat.dag | 3 ++- dag/extdeps/tools/xorriso.dag | 3 ++- 13 files changed, 24 insertions(+), 14 deletions(-) diff --git a/dag/extdeps/tools/grep.dag b/dag/extdeps/tools/grep.dag index 430fbde53f7..8886faddfff 100644 --- a/dag/extdeps/tools/grep.dag +++ b/dag/extdeps/tools/grep.dag @@ -1,6 +1,6 @@ module extdeps.tools.grep -import std.types { NonEmptyStr, Bool } +import std.types { NonEmptyStr, Bool, Unit } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } import extdeps.tools { CliTool, SourceCoreutils } diff --git a/dag/extdeps/tools/hostname.dag b/dag/extdeps/tools/hostname.dag index 946a55eaadc..5a6dc3b2206 100644 --- a/dag/extdeps/tools/hostname.dag +++ b/dag/extdeps/tools/hostname.dag @@ -1,6 +1,7 @@ module extdeps.tools.hostname -import std.types { String, List, Bool, Int, NonEmptyStr, Unit } +import std.types { List, Bool, Int, NonEmptyStr, Unit } +import std.string_type { String } import std.algebra { Empty } import v2.std.algebra { fold_list, list_append, list_snoc_item } import v2.std.collection { Map, empty_map, map_insert } diff --git a/dag/extdeps/tools/id.dag b/dag/extdeps/tools/id.dag index 3f4b454c387..6809637ec00 100644 --- a/dag/extdeps/tools/id.dag +++ b/dag/extdeps/tools/id.dag @@ -1,6 +1,7 @@ module extdeps.tools.id -import std.types { String, NonEmptyStr, List, Bool } +import std.types { NonEmptyStr, List, Bool, Unit } +import std.string_type { String } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } diff --git a/dag/extdeps/tools/jq.dag b/dag/extdeps/tools/jq.dag index 2518c95fed6..d61bbbf98dd 100644 --- a/dag/extdeps/tools/jq.dag +++ b/dag/extdeps/tools/jq.dag @@ -1,7 +1,7 @@ module extdeps.tools.jq import std.occurrence_identity { OccurrenceSynthetic } -import std.types { NonEmptyStr, String, Bool, Int, List } +import std.types { NonEmptyStr, String, Bool, Int, List, Unit } import std.algebra { Cons, Empty, trim } import v2.std.algebra { list_append, list_snoc_item, fold_list } import v2.std.collection { Map, empty_map, map_insert, map_lookup } diff --git a/dag/extdeps/tools/node.dag b/dag/extdeps/tools/node.dag index ea568c58674..e6d31a5a51a 100644 --- a/dag/extdeps/tools/node.dag +++ b/dag/extdeps/tools/node.dag @@ -1,6 +1,7 @@ module extdeps.tools.node -import std.types { NonEmptyStr, String, Bool } +import std.types { NonEmptyStr, Bool, Unit } +import std.string_type { String } import std.decl_ref { DeclarationRef, WholeDeclaration } import extdeps.external_authority { ExternalAuthority, ExternalModelScope, ExternalSubjectRef } import extdeps.uri { Uri, Https } diff --git a/dag/extdeps/tools/npm.dag b/dag/extdeps/tools/npm.dag index 5a1c8c0803a..1d3eaafccf2 100644 --- a/dag/extdeps/tools/npm.dag +++ b/dag/extdeps/tools/npm.dag @@ -1,6 +1,7 @@ module extdeps.tools.npm -import std.types { NonEmptyStr, String, Bool, FilePath } +import std.types { NonEmptyStr, Bool, FilePath, Unit } +import std.string_type { String } import std.decl_ref { DeclarationRef, WholeDeclaration } import extdeps.external_authority { ExternalAuthority, ExternalModelScope, ExternalSubjectRef } import extdeps.uri { Uri, Https } diff --git a/dag/extdeps/tools/rustfmt.dag b/dag/extdeps/tools/rustfmt.dag index 4f88391a090..1d65bc6d7ce 100644 --- a/dag/extdeps/tools/rustfmt.dag +++ b/dag/extdeps/tools/rustfmt.dag @@ -3,7 +3,8 @@ module extdeps.tools.rustfmt import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } import extdeps.tools { CliTool, SourceRustup } -import std.types { Bool, String, FilePath } +import std.types { Bool, FilePath, Unit } +import std.string_type { String } data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { uri: Uri { diff --git a/dag/extdeps/tools/sed.dag b/dag/extdeps/tools/sed.dag index 0d02bc27f3e..5df181af2a0 100644 --- a/dag/extdeps/tools/sed.dag +++ b/dag/extdeps/tools/sed.dag @@ -1,6 +1,7 @@ module extdeps.tools.sed -import std.types { NonEmptyStr, String, Bool, Int } +import std.types { NonEmptyStr, Bool, Int, Unit } +import std.string_type { String } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } import extdeps.exec.command { ArgvCommand, argv_command } diff --git a/dag/extdeps/tools/sha256sum.dag b/dag/extdeps/tools/sha256sum.dag index da42fba5bb9..9857fc8cca8 100644 --- a/dag/extdeps/tools/sha256sum.dag +++ b/dag/extdeps/tools/sha256sum.dag @@ -1,12 +1,13 @@ module extdeps.tools.sha256sum -import std.types { NonEmptyStr, String, Bool } +import std.types { NonEmptyStr, Bool, Unit } +import std.string_type { String } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } import extdeps.tools { CliTool, SourceCoreutils } import gunbc.output_policy { OutcomeIsData } import extdeps.shell -import extdeps.filesystem.filesystem_io +import extdeps.filesystem.filesystem_io { Filesystem } import extdeps.crypto.hash { Digest, sha256_digest } import std.roster_frontier { FrontierRow, frontier_row_decl } import std.dissolution { unbound_dissolution } diff --git a/dag/extdeps/tools/sha512sum.dag b/dag/extdeps/tools/sha512sum.dag index a48e8c7a90c..6af2298d827 100644 --- a/dag/extdeps/tools/sha512sum.dag +++ b/dag/extdeps/tools/sha512sum.dag @@ -2,7 +2,7 @@ module extdeps.tools.sha512sum import std.algebra { trim } -import std.types { NonEmptyStr, String, Bool, FilePath } +import std.types { NonEmptyStr, String, Bool, FilePath, Unit } import std.content_hash { Sha512Digest, sha512_hex_digest } import std.decl_ref { DeclarationRef, WholeDeclaration } import extdeps.external_authority { ExternalAuthority, ExternalModelScope, ExternalSubjectRef } diff --git a/dag/extdeps/tools/sleep.dag b/dag/extdeps/tools/sleep.dag index 00240d3e251..ff7e871b120 100644 --- a/dag/extdeps/tools/sleep.dag +++ b/dag/extdeps/tools/sleep.dag @@ -1,6 +1,7 @@ module extdeps.tools.sleep -import std.types { NonEmptyStr, Bool } +import std.types { NonEmptyStr, Bool, Unit } +import std.string_type { String } import std.measure { Second, second_count } import std.disposition { Disposition, Scaffold, RealizationDispatch } import std.decl_ref { DeclarationRef, WholeDeclaration } diff --git a/dag/extdeps/tools/stat.dag b/dag/extdeps/tools/stat.dag index 1ce542ccfa7..1592e671f2f 100644 --- a/dag/extdeps/tools/stat.dag +++ b/dag/extdeps/tools/stat.dag @@ -1,6 +1,7 @@ module extdeps.tools.stat -import std.types { Bool, String, NonEmptyStr, List } +import std.types { Bool, NonEmptyStr, List, Unit } +import std.string_type { String } import extdeps.external_authority { ExternalAuthority, ExternalModelScope, ExternalSubjectRef } import std.decl_ref { DeclarationRef, WholeDeclaration } import extdeps.uri { Uri, Https } diff --git a/dag/extdeps/tools/xorriso.dag b/dag/extdeps/tools/xorriso.dag index e8fb93fd679..5d59f89b347 100644 --- a/dag/extdeps/tools/xorriso.dag +++ b/dag/extdeps/tools/xorriso.dag @@ -1,6 +1,7 @@ module extdeps.tools.xorriso -import std.types { NonEmptyStr } +import std.types { NonEmptyStr, Unit } +import std.string_type { String } import extdeps.version { VersionConstraint } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } From e722682f7e7116237e0cc1645a8f52d0e239dc03 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Sat, 12 Sep 2026 04:08:37 +0000 Subject: [PATCH 2/3] Admit the one namespace delta the sha256sum qualification produces The required floor on this branch is CLEAN -- `verdict=FloorClean unexpected_failures=0` over planned=3757 executed=3757 claims_failed=0 -- and the census moved exactly as the change intended: `read_name_module_pairs` 105 -> 82, `qualified_name_module_pairs` 305 -> 334, with all 23 `[floor-bare-name-ambiguity-bound]` rows naming the authority this PR chose (10 `String` -> std.string_type, 12 `Unit` -> std.types, 1 `Filesystem` -> extdeps.filesystem.filesystem_io). What blocked the lane was a different phase: `FAILED PHASE namespace-wave-admission (1 unadjudicated delta)`. THE DELTA, AND IT IS A REAL ONE -- a side effect on a name this PR never set out to touch: TargetChanged binding extdeps.tools.sha256sum::extdeps_external_authority_anchor base {extdeps.filesystem.filesystem_io, extdeps.shell, extdeps.tools.sha256sum} head {extdeps.shell, extdeps.tools.sha256sum} `extdeps.tools.sha256sum` imported `extdeps.filesystem.filesystem_io` BARE. A bare module import drags the whole module into the candidate set for every name it declares, so filesystem_io's copy of `extdeps_external_authority_anchor` -- the per-module convention row some 315 modules each author -- was a candidate at this site. Naming `{ Filesystem }` binds the one declaration the author meant and drops the rest, which narrows the candidate set for that unrelated spelling too. NO RESOLUTION CHANGES: sha256sum authors its own `extdeps_external_authority_anchor`, and a module's own declaration wins inside the authored region, so the site resolved to sha256sum's row before and resolves to sha256sum's row after. The removed candidate could not have won either way. What moved is the SET, three modules to two -- the resolution stopped depending on a module the author never named, which is the qualification's whole purpose. That is admitted, not silenced: the row states it out loud, which is what this wall exists for. The ten `extdeps.tools.* -> std.string_type` membership additions needed no row: the phase classified each `ExplicitlyEvaluatedZeroDelta ... reached by a name this module authors`. ALSO PAID HERE: the three `gunbc#11071 LinuxKernelRelease rehome` rows are deleted. #11071 merged, so the base already binds those spellings to `extdeps.linux.kernel` and the floor reported all three CONSUMED. A consumed row's deletion comes due on this roster's OWN next touch; this change is that touch, so the debt is paid rather than inherited by an unrelated lane. NOTE FOR THE LATER BATCHES: the Filesystem/Clock batch converts fourteen more bare imports to named ones, so it should be expected to produce this same class of delta per module rather than treated as a surprise. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01M5dKcSuYW3nvAjtVcDxqhT --- src/v1/stage0/src/namespace_wave_admission.rs | 108 ++++++++---------- 1 file changed, 46 insertions(+), 62 deletions(-) diff --git a/src/v1/stage0/src/namespace_wave_admission.rs b/src/v1/stage0/src/namespace_wave_admission.rs index a37419d86b2..385a399d6ef 100644 --- a/src/v1/stage0/src/namespace_wave_admission.rs +++ b/src/v1/stage0/src/namespace_wave_admission.rs @@ -1707,69 +1707,53 @@ pub struct TransitionAdmission { /// and the deletion is paid here. The rows below are a DIFFERENT relocation, not that one restored: /// empty was the resting state and one change authoring rows back into it is the ordinary motion. /// -/// gunbc#11071 LinuxKernelRelease rehome (2026-09-11). `gunbc.served_surface_browser_observation` -/// authored `LinuxKernelRelease`, the brand for what `uname -r` answers. That is a fact the Linux -/// kernel owns, and it was declared inside a downstream RECEIPT module — so when -/// `extdeps.linux.edac` needed to key its GHES/APEI topology facts to a kernel release it could not -/// reach the brand at all: an extdeps module may not import a gunbc one. The only two landings were -/// re-coining the brand upstream, which is the §3 fork, or moving it. It moved, to the new -/// `extdeps.linux.kernel`, and both prior consumers import it from there. -/// -/// WHY `TargetChanged` IS THE CORRECT CLASSIFICATION. The spelling `LinuxKernelRelease` is authored -/// on both sides in all three declarations below, and what changed is which declaration it admits: -/// base `{gunbc.served_surface_browser_observation}`, head `{extdeps.linux.kernel}`. That is the -/// motion this wall exists to make an author say out loud. It is not `AuthoredReferenceResolution`: -/// the name was bound to a real declaration that this change deliberately relocated. -/// -/// WHAT MAKES IT SAFE TO ADMIT, adjudicated rather than asserted. The moved declaration is -/// byte-identical to the one it replaces — same name, same `NonEmptyStr where brand(...)` body, same -/// brand STRING, so every `as LinuxKernelRelease` ascription in the corpus denotes the same brand it -/// did at the base; a changed brand string would have changed what the ascriptions mean and this row -/// would be admitting a semantic change under a relocation's name. The two consumers are the -/// complete population: `LinuxKernelRelease` resolved to exactly -/// `gunbc.served_surface_browser_observation` and -/// `test.claim.served_surface_browser_observation_witness` at the base, and both are edited here, so -/// no third site is left resolving through a module that no longer authors the name. The witness -/// suite over the consuming module passes on this head. The closure blast radius the same run -/// measured is 4 modules — `extdeps.linux.kernel` imports only the citation vocabulary the base -/// consumer already reached (`std.types`, `std.decl_ref`, `extdeps.external_authority`, -/// `extdeps.uri`), so nothing downstream gained reach it did not have. -/// -/// TRIGGER: these rows go when #11071 merges. The base then authors `LinuxKernelRelease` in -/// `extdeps.linux.kernel`, the delta stops being producible, and CONSUMED comes due on the roster's -/// next touch — adjudicated by the declaring-module join, not by this sentence. -pub const NAMESPACE_TRANSITION_ADMISSIONS: &[TransitionAdmission] = &[ - TransitionAdmission { - label: "gunbc#11071 LinuxKernelRelease rehome", - subject: AdmissionSubject::Binding { - module: "gunbc.served_surface_browser_observation", - in_declaration: "ContainerVisibleHostKernel", - spelling: "LinuxKernelRelease", - target: "extdeps.linux.kernel", - }, - disposition: NamespaceDeltaDisposition::TargetChanged, +/// THIRTY-FIFTH DISSOLUTION (2026-09-12, gunbc#11137). The three `gunbc#11071 LinuxKernelRelease +/// rehome` rows are deleted and their description with them. #11071 merged, so the base authors +/// `LinuxKernelRelease` in `extdeps.linux.kernel`, the delta stopped being producible, and the +/// required floor on this branch reported all three as `CONSUMED ADMISSION ... already satisfied +/// at the base`. A consumed row's deletion comes due on this roster's OWN next touch; this change +/// is that touch, so the debt is paid here rather than inherited by an unrelated lane. Their +/// TRIGGER, recorded at the time as "these rows go when #11071 merges", is what fired. +/// +/// gunbc#11137 sha256sum names Filesystem instead of reaching it (2026-09-12). The row below is a +/// DIFFERENT delta that this change produces, not that one restored: empty is the resting state +/// and one change authoring a row back into it is the ordinary motion. +/// +/// WHAT THE CHANGE DID. `extdeps.tools.sha256sum` called `Filesystem.Write` while importing +/// `extdeps.filesystem.filesystem_io` with NO name list. A bare module import drags the whole +/// module into the candidate set for every name it declares, so filesystem_io's copy of +/// `extdeps_external_authority_anchor` -- the per-module convention row some 315 modules each +/// author -- was a candidate at this site. The import now names `{ Filesystem }`. +/// +/// WHY `TargetChanged` IS THE CORRECT CLASSIFICATION. The spelling is authored on both sides and +/// what moved is which declarations it admits: base `{extdeps.filesystem.filesystem_io, +/// extdeps.shell, extdeps.tools.sha256sum}`, head `{extdeps.shell, extdeps.tools.sha256sum}`. +/// +/// WHAT MAKES IT SAFE TO ADMIT, adjudicated rather than asserted. NO RESOLUTION CHANGES. +/// `extdeps.tools.sha256sum` authors its own `extdeps_external_authority_anchor`, and a module's +/// own declaration wins inside the authored region, so the site resolved to sha256sum's row at the +/// base and resolves to sha256sum's row at the head -- the removed candidate could not have won +/// either way. What narrowed is the SET, from three modules to two, which is the qualification's +/// whole purpose: the resolution stopped depending on a module the author never named. The +/// required floor on this head is `verdict=FloorClean unexpected_failures=0` over +/// planned=3757 executed=3757 claims_failed=0, so no consumer of this module changed behaviour. +/// +/// TRIGGER: this row goes when #11137 merges. The base then carries the named import, the delta +/// stops being producible, and CONSUMED comes due on the roster's next touch. +pub const NAMESPACE_TRANSITION_ADMISSIONS: &[TransitionAdmission] = &[TransitionAdmission { + label: "gunbc#11137 extdeps.tools.sha256sum names Filesystem instead of reaching it", + // The rationale, the safety adjudication and the trigger are in the doc comment on this + // const rather than repeated here. In one line: the bare `import + // extdeps.filesystem.filesystem_io` became `{ Filesystem }`, which narrowed this + // spelling's candidate set without changing what it resolves to. + subject: AdmissionSubject::Binding { + module: "extdeps.tools.sha256sum", + in_declaration: "extdeps_external_authority_anchor", + spelling: "extdeps_external_authority_anchor", + target: "extdeps.tools.sha256sum", }, - TransitionAdmission { - label: "gunbc#11071 LinuxKernelRelease rehome", - subject: AdmissionSubject::Binding { - module: "gunbc.served_surface_browser_observation", - in_declaration: "playwright_chromium_151_linux_arm64_headless_navigation_run", - spelling: "LinuxKernelRelease", - target: "extdeps.linux.kernel", - }, - disposition: NamespaceDeltaDisposition::TargetChanged, - }, - TransitionAdmission { - label: "gunbc#11071 LinuxKernelRelease rehome", - subject: AdmissionSubject::Binding { - module: "test.claim.served_surface_browser_observation_witness", - in_declaration: "witness_run_owns_one_execution_identity", - spelling: "LinuxKernelRelease", - target: "extdeps.linux.kernel", - }, - disposition: NamespaceDeltaDisposition::TargetChanged, - }, -]; + disposition: NamespaceDeltaDisposition::TargetChanged, +}]; /// The denominators a green must name (DESIGN §5): a run that cannot say what it covered is an /// instrument failure wearing coverage's clothes. From 0675dea021e73eacc1b0f35470d921cdcc0e0444 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Sat, 12 Sep 2026 04:32:07 +0000 Subject: [PATCH 3/3] Address review 64326: consistent String citation, and name the instrument MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three of the four findings were right and are fixed here. TRANSCRIBED INSTRUMENT OUTPUT (valid). The roster doc carried `verdict=FloorClean unexpected_failures=0` and the planned/executed/ claims_failed counts as prose. DESIGN §6 is explicit that a measurement is cited by naming the producer that re-derives it, never by copying its numbers, because a transcribed number rots without anyone touching either end. The counts are gone; the claim now names the `claim_executor` invocation and the verdict line to read it off. TWO FILES LEFT ON THE OTHER SPELLING (valid). `extdeps.tools.jq` and `extdeps.tools.sha512sum` were edited on exactly the line that carries `String` and kept it on `std.types`, which left them inconsistent with their nine siblings after a change whose stated purpose is to qualify reads by their declaring module. They were excluded because the census does not list them -- their reads are settled inside the authored region -- but "not in the measured population" is a reason to not CHASE a site, not a reason to leave a wrong citation on a line already being edited. Both now name `std.string_type`. All thirteen touched files are consistent: none carries `String` on a `std.types` import. THE ROSTER DID NOT SPEAK TO THE `String` REQUALIFICATION (valid as a gap in the writing). The doc said "NO RESOLUTION CHANGES" about the sha256sum anchor and a reader could take it as covering the whole diff. It now states why `String` needs no row, and states it as the wave phase's measurement rather than as this author's assertion. THE FOURTH FINDING IS NOT ACCURATE and nothing is changed for it. It reads the `String` requalification as retargeting the spelling to "a second authority" and forking it across nine modules. `std.types` declares no `String` -- the finding says so itself -- so it was never an authority for that name, and `import std.types { String }` bound nothing. The two real claimants are `std.string_type` and `v2.std.text`, which the census names as the self-host migration double and explicitly scopes out. Naming one of the two existing declarations creates no third. That it is measured rather than argued is the part that matters: the wave phase compares the binding table on both sides, and on this head it reported exactly ONE `TargetChanged binding` delta over 814,621 binding rows compared -- the sha256sum anchor -- and NONE for `String`. The ten `String` sites are reported as `ExplicitlyEvaluatedZeroDelta membership ... reached by a name this module authors`: evaluated, zero. So the read resolved to `std.string_type` before and after; what changed is its authorization, from an accident of scope precedence to something the author wrote. The finding's live observation -- that ~1951 modules carry `import std.types { String }` -- is real and is a corpus-wide defect this campaign does not fix: those lines name a module that does not declare the name they list. They are harmless only while those modules' reads are not ambiguous. Correcting them is its own change with its own adjudication, not a drive-by in a PR scoped to 23 measured reads. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01M5dKcSuYW3nvAjtVcDxqhT --- dag/extdeps/tools/jq.dag | 3 ++- dag/extdeps/tools/sha512sum.dag | 3 ++- src/v1/stage0/src/namespace_wave_admission.rs | 21 ++++++++++++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/dag/extdeps/tools/jq.dag b/dag/extdeps/tools/jq.dag index d61bbbf98dd..74065252029 100644 --- a/dag/extdeps/tools/jq.dag +++ b/dag/extdeps/tools/jq.dag @@ -1,7 +1,8 @@ module extdeps.tools.jq import std.occurrence_identity { OccurrenceSynthetic } -import std.types { NonEmptyStr, String, Bool, Int, List, Unit } +import std.types { NonEmptyStr, Bool, Int, List, Unit } +import std.string_type { String } import std.algebra { Cons, Empty, trim } import v2.std.algebra { list_append, list_snoc_item, fold_list } import v2.std.collection { Map, empty_map, map_insert, map_lookup } diff --git a/dag/extdeps/tools/sha512sum.dag b/dag/extdeps/tools/sha512sum.dag index 6af2298d827..f9dcf9c7d21 100644 --- a/dag/extdeps/tools/sha512sum.dag +++ b/dag/extdeps/tools/sha512sum.dag @@ -2,7 +2,8 @@ module extdeps.tools.sha512sum import std.algebra { trim } -import std.types { NonEmptyStr, String, Bool, FilePath, Unit } +import std.types { NonEmptyStr, Bool, FilePath, Unit } +import std.string_type { String } import std.content_hash { Sha512Digest, sha512_hex_digest } import std.decl_ref { DeclarationRef, WholeDeclaration } import extdeps.external_authority { ExternalAuthority, ExternalModelScope, ExternalSubjectRef } diff --git a/src/v1/stage0/src/namespace_wave_admission.rs b/src/v1/stage0/src/namespace_wave_admission.rs index 385a399d6ef..a12de01876b 100644 --- a/src/v1/stage0/src/namespace_wave_admission.rs +++ b/src/v1/stage0/src/namespace_wave_admission.rs @@ -1734,9 +1734,24 @@ pub struct TransitionAdmission { /// own declaration wins inside the authored region, so the site resolved to sha256sum's row at the /// base and resolves to sha256sum's row at the head -- the removed candidate could not have won /// either way. What narrowed is the SET, from three modules to two, which is the qualification's -/// whole purpose: the resolution stopped depending on a module the author never named. The -/// required floor on this head is `verdict=FloorClean unexpected_failures=0` over -/// planned=3757 executed=3757 claims_failed=0, so no consumer of this module changed behaviour. +/// whole purpose: the resolution stopped depending on a module the author never named. That no +/// consumer changed behaviour is the required floor's verdict on this head, re-derived by +/// `claim_executor --required-ci --source-root dag --source-root src/v2 --required-lane witnesses` +/// and read off its own `required-floor:` verdict line -- named rather than transcribed, because a +/// copied count rots without anyone touching either end (DESIGN §6). +/// +/// WHY THE `String` REQUALIFICATION IN THE SAME CHANGE NEEDS NO ROW, which is a fair question to +/// ask of a diff that moves ten import lines onto `std.string_type`. It is not this adjudication's +/// assertion; it is the wave phase's own measurement. That phase compares the binding table on both +/// sides, and on this head it reported exactly ONE `TargetChanged binding` delta -- the row below -- +/// and none for `String`. The ten `String` sites appear instead as +/// `ExplicitlyEvaluatedZeroDelta membership -> std.string_type ... reached by a name this +/// module authors`: explicitly evaluated, zero delta. The reason is that `std.types` declares no +/// `String` at all, so `import std.types { String }` bound nothing and the read fell through to the +/// shared slot, where scope precedence already answered `std.string_type`. Naming that module +/// changes the read's AUTHORIZATION -- from an accident of precedence to something the author +/// wrote -- without changing which declaration answers it. A delta row adjudicates a changed +/// binding; there is no changed binding here to adjudicate. /// /// TRIGGER: this row goes when #11137 merges. The base then carries the named import, the delta /// stops being producible, and CONSUMED comes due on the roster's next touch.