Skip to content

extdeps.container.oci.manifest uses three media_types symbols it never imported - #9485

Merged
briansrls merged 3 commits into
session/merry-lynx-302-wave-classifierfrom
session/merry-lynx-302
Aug 27, 2026
Merged

briansrls merged 3 commits into
session/merry-lynx-302-wave-classifierfrom
session/merry-lynx-302

Conversation

@briansrls

@briansrls briansrls commented Aug 27, 2026 •

Copy link
Copy Markdown
Contributor

What

extdeps.container.oci.manifest reads three declarations that live in
extdeps.container.oci.media_types — oci_image_schema_version,
media_type_oci_image_manifest_v1, media_type_oci_image_config_v1 — and never
imported that module. One import line added; nothing else changed.

Executed evidence (the discriminating pair)

Same locally-built gunbc (target/release/gunbc, this branch), same argv as the
required emit-compile phase uses (tools.emission_entry_instrument
measure_entry_emission):

gunbc compile --source-root dag --source-root src/v2 \
  --entry dag/extdeps/container/oci/manifest.dag \
  --output-dir <tmp> --target rust --dependency-pool-index primary-precedence
  • WITHOUT the import (control, main's state): 5 blocking error(s), 138 advisory
    — undefined variable 'oci_image_schema_version' ×2 (36:25, 38:68),
    'media_type_oci_image_manifest_v1' ×2 (40:28, 42:60),
    'media_type_oci_image_config_v1' ×1 (49:29).
  • WITH the import: 0 blocking error(s), 143 advisory — 24 files emitted.

The control flips, so the green is load-bearing rather than a harness artifact.
The advisory count moves 138→143 because the five sites now resolve and get
judged; no advisory is silenced.

Why nothing refused

This is a live specimen of the DESIGN row "A BLOCKING EMIT-STAGE DIAGNOSTIC CAN
SIT ON MAIN INDEFINITELY WITH NO REQUIRED PHASE THAT FAILS"
— escape mode one:
no required phase emits over a closure that reaches this module.
gunbc.ci_layer_roots required_emit_compile_entries does not roster it, and
gunbc run cannot see it either — the whole-tree run context is one flat
namespace, so the three bare names resolve there whether or not the import
exists. Measured: gunbc run --entry dag/extdeps/container/oci/manifest.dag
reaches evaluation unchanged with and without the import.

This PR repairs the specimen. It does not close the class — that row retires
on the phase, not on any specimen, and this change adds no roster entry and no
ratchet.

…r imported

`accept_image_manifest` reads `oci_image_schema_version`,
`media_type_oci_image_manifest_v1` and `media_type_oci_image_config_v1`, all
declared in `extdeps.container.oci.media_types`, with no import of that module —
five BLOCKING name-resolution diagnostics standing on main. Adds the one import.

This is a live specimen of the DESIGN row declaring the blocking-diagnostic
population uncounted and unbounded: no required phase emits over a closure
reaching this module, so nothing refused.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TrqmnrTJvHxHxJuJFBED8k
@gunbai-bot gunbai-bot Bot changed the title Five BLOCKING diagnostics sit on main in extdeps/container/oci/manifest.dag: it uses three symbols from media_types.dag without importing that module -- a one-line fix, and a live specimen of the DESIGN row declaring this population uncounted and unbounded extdeps.container.oci.manifest uses three media_types symbols it never imported Aug 27, 2026
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review August 27, 2026 17:40
@gunbai-bot
gunbai-bot Bot changed the base branch from main to session/merry-lynx-302-wave-classifier August 27, 2026 18:06
@gunbai-bot

gunbai-bot Bot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Rebased onto #9495 per the ruling relayed from swift-badger-524, so this PR stays the one-line import repair and the classifier change gets its own reviewer.

Why it was blocked and what changed:

One consequence to flag rather than leave to be found: witnesses.yml triggers on base=main, so while this PR is stacked it gets no CI run. It re-targets main once #9495 merges, and that is when it gets its own green.

— sent from merry-lynx-302

@briansrls
briansrls merged commit 23e7d3f into session/merry-lynx-302-wave-classifier Aug 27, 2026
@briansrls
briansrls deleted the session/merry-lynx-302 branch August 27, 2026 21:13
briansrls added a commit that referenced this pull request Aug 27, 2026
…ut of NewPoolCoincidenceResolution (#9495)

* `0 -> 1` was two states: split AuthoredReferenceResolution out of NewPoolCoincidenceResolution

The wave-admission wall (#9365) classified every binding whose candidate set went
from empty to one member as `NewPoolCoincidenceResolution`, refusing unless an
operator admission names it. `binding_disposition` compares candidate SETS only,
and its own header says that arm means "a name that began denoting something
WITHOUT ANYONE AUTHORING A REFERENCE — resolution arriving from a pool".

That is one of two states sharing the symbol, and they have opposite owners and
opposite repairs:

  - the TARGET grew a name this module was already reaching for — the coincidence
    the containment rule exists to remove, cause in another module;
  - this module's own author wrote the import that resolves a name it was already
    spelling — the exact repair the wall was built to want.

The wall was refusing the second while naming it the first. Found by gunbc#9485,
a one-line import repair (5 blocking diagnostics -> 0) that the wall would not let
merge, and it could not be admitted either: `NAMESPACE_TRANSITION_ADMISSIONS` is a
`const &[TransitionAdmission]` over a `DeltaSubject` carrying `String` fields, so a
row naming an actual module is E0015 — that half is escalated separately and is
not repaired here.

The discriminator is the module's own source, and it was already in hand: the
membership arm one function over consults `membership_supported`, which admitted
the membership edge of the very change whose bindings were refused.
`locally_authored_claim_added` answers it from the two `ModuleDeclarationRecord`s
alone — deliberately index-free, because consulting either index reintroduces the
conflation (a blanket import whose target grew the leaf would read as authorship).
False is the fail-closed answer: it leaves the delta on the refusing arm.

The new disposition auto-admits, amending the 2026-08-26 operator partition on
`gunbc.compiler_frontend_program_interlock` per the 2026-08-27 ruling relayed
through swift-badger-524. The `.dag` coproduct is the authority and the host enum
is one realization; the vocabulary-join tests (host <-> ruling, both directions)
gate the pair and pass.

EXECUTED EVIDENCE. The test file asserted `NewPoolCoincidenceResolution` over a
head that authored `import probe.home { widget }` — it planted the repair and
named it the coincidence, which is why the conflation survived review. That
fixture is re-derived as the authored arm, and a real coincidence is authored for
the other: consumer source byte-identical across sides, reaching the target
through a blanket import, target grows the name. Both arms mutation-checked:
forcing `locally_authored_claim_added` true reds the coincidence arm alone,
forcing it false reds the authored arm alone. 20/20 green restored.

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

* Scope the blanket-import arm to the leaf: an unrelated new blanket import was laundering a pool coincidence

Review 56882 on this PR, before it merged. `locally_authored_claim_added`'s
member-list and self-declaration arms name the leaf in the source and were scoped
to it; the blanket-import arm names no leaf at all, and the first revision admitted
authorship whenever ANY blanket target was new. So an unrelated new blanket import
elsewhere in the same module auto-admitted a genuine pool coincidence beside it —
a fail-open widening, in the one direction this function must never move, and
directly opposite the docstring's own "false is the fail-closed answer".

THE ARM IS NOW A CONJUNCTION AND THE ORDER OF ITS HALVES IS THE POINT: the claim
must be NEW IN THIS MODULE'S SOURCE **and** the head target must actually supply
the leaf. Asking the second alone is exactly the conflation this function exists to
discriminate — an unchanged blanket import whose target grew the leaf would read as
authorship. Gating it behind the first makes the index consultation safe rather
than forbidden: a claim the author did not write cannot reach the surface check,
whatever the target did. So the docstring's index-free claim is corrected rather
than restated; it was true of the leaf-named arms and never of this one. A target
absent from the index answers false.

EXECUTED EVIDENCE, both directions of the scoping:

  - an_unrelated_new_blanket_import_does_not_launder_a_pool_coincidence — the
    reviewer's scenario. `probe.home` grows `widget` with its blanket import
    UNCHANGED; the author adds a blanket `probe.other`, which does not supply
    `widget`. Must stay NewPoolCoincidenceResolution and must stay refused.
    Restoring the leaf-blind arm reds this test ALONE.
  - a_new_blanket_import_that_does_supply_the_leaf_is_an_authored_reference_resolution
    — so the scoping is not a narrowing to nothing: when the NEW blanket target is
    the one supplying the leaf, it auto-admits like any other authored reference.

22/22 green, fmt clean.

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

* extdeps.container.oci.manifest uses three media_types symbols it never imported (#9485)

`accept_image_manifest` reads `oci_image_schema_version`,
`media_type_oci_image_manifest_v1` and `media_type_oci_image_config_v1`, all
declared in `extdeps.container.oci.media_types`, with no import of that module —
five BLOCKING name-resolution diagnostics standing on main. Adds the one import.

This is a live specimen of the DESIGN row declaring the blocking-diagnostic
population uncounted and unbounded: no required phase emits over a closure
reaching this module, so nothing refused.


Claude-Session: https://claude.ai/code/session_01TrqmnrTJvHxHxJuJFBED8k

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

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