Skip to content

Declare the dependency gunbc.code_change_workflow and its witness already had (13 effect-summary-incomplete floor errors) - #11940

Merged
briansrls merged 1 commit into
mainfrom
session/smart-boar-749
Sep 21, 2026
Merged

briansrls merged 1 commit into
mainfrom
session/smart-boar-749

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

The defect

The floor refusal on PR #11907 (run 35555630169, job 106198684855) carried 13 effect summary incomplete errors over test.claim.code_change_workflow_witness_test calling gunbc.code_change_workflow.decide_code_change_transition and .classify_github_pr_terminal_anchor — each saying the callee's identity is established but names no registry row.

The chain, re-derived (DESIGN §6b)

The 13 are the symptom link. The same run carries, upstream, two errors nobody had joined to them:

dag/gunbc/code_change_workflow.dag:17:12: unresolved type 'ProcessNodeId'
dag/test/claim/code_change_workflow_witness_test.dag:307:32: unresolved type 'NotReady'
  • ProcessNodeId is declared by gunbc.process_algebra; NotReady by gunbc.pr_digests.
  • Neither module declared a dependency on either. Both carried no import header at all, so they resolved through the loader's bare-reference channel (bare_reference_pull_paths_for_source), which is applied only to import-free sources. That channel did not pull gunbc.process_algebra for this reference, so the type never resolved. Why it did not is not established here: I probed the obvious hypothesis — that an alias-shaped type X = NonEmptyStr where brand(...) reference is not "pullable" — against test.claim.extdeps_version_base, an import-free module whose only edge to extdeps.version is the same alias shape, and it compiles clean. So that hypothesis is falsified and the discriminator is unidentified. It is a separate question about the loader's bare channel, not a premise of this repair.
  • With its type unresolved, gunbc.code_change_workflow is not compile-clean, so it drops out of the compiled closure into the name census only ([census] … indexed modules outside the compile-clean closure enter the name census only (not compiled)).
  • The name census still establishes the callee identity; the item registry is built only over realized modules, so it has no row. unjoinable_callee_edges (v1.compiler.infer_service) then reports ResolvedCalleeRegistryRowAbsent — once per calling witness, 13 times.

The repair

At the earliest unjustified boundary: both modules now declare the dependencies they always had. Nothing is silenced, no module is excluded from the closure, and no witness stops calling either function.

Evidence — discriminating pair

Same invocation both sides, over a subject that reaches the witness module:

gunbc compile --output-dir <tmp> --source-root dag --source-root src/v2 \
  --entry dag/test/claim/code_change_workflow_witness_test.dag
blocking errors effect-summary-incomplete over this witness
control (main) 22 13
head 7 0

The 22 on main are 13 effect-summary + the 2 unresolved types above + 7 pre-existing in dag/gunbc/runner/microvm_controller_app_key_converge.dag; head keeps only those 7, which this change does not touch (see below). gunbc run --function all_code_change_workflow_witnesses evaluates to true on head, so the witnesses still discriminate (the run then refuses only because the fold returns Bool rather than ProcessExit).

modules_excluded=1, as asked

Not a silent drop. The floor's exclusion roster is floor_prepared_subject_exclusions() — four rows, all designed non-members: test/probe/ (must-not-resolve probes, consumed by class through gunbc.compile_diagnostic_census), test/fixture/meta_exec_confinement_scan/, test/manual/ownership_movable_test.dag, and the wet case4_expansion_carrier_splices receipt. Exactly one module in #11907's index matched one of those rows. The count is subject-relative (PR #11932's floor reports modules_excluded=0 over its own 1960-module subject), and this PR adds no module and removes none, so it cannot change which rows match.

Floor evidence: not obtainable on current main

The brief asked for the pair on the floor itself. My run (35561659566) could not produce one, and the reason is upstream of this change:

required-ci: parse FAIL …/dag/gunbc/runner/microvm_controller_app_key_converge.dag:677:3:
  source annotation sits inside a declaration body …            (x7)
required-ci: floor refused: REQUIRED-FLOOR REFUSAL cause=ArmSetConsumerPlanningUnavailable
  no parse-phase declaration index was lent to the floor …

The parse phase refused on that main-side file, so no declaration index was lent, so the floor refused at planning and never prepared a subject. The floor did seed the right modules first — [floor-phase] phase=touched-entry-compile-subject seeds=2 modules=["gunbc.code_change_workflow", "test.claim.code_change_workflow_witness_test"] — so the subject would have reached the witness. The entry-compile pair above is the same compiler over a closure that does reach it. (PR #11935's run at an adjacent main reports parse OK 6522 file(s); I have not identified what differs, and I am not claiming the parse failure is universal — only that it is the reason my run has no subject, and that the file it names is unchanged by this PR.)

Flagged, out of scope

dag/gunbc/runner/microvm_controller_app_key_converge.dag (landed 2026-09-21 in #11902) carries 7 blocking source annotation sits inside a declaration body errors. They do not appear in run 35555630169 — that subject did not reach the module — but any closure that does reach it refuses. Not touched here; scope for this PR was the effect-summary class only.

🤖 Generated with Claude Code

…eady had

The floor refusal on PR #11907 (run 35555630169) carried 13 `effect summary
incomplete` errors over `test.claim.code_change_workflow_witness_test`
calling `gunbc.code_change_workflow.decide_code_change_transition` and
`.classify_github_pr_terminal_anchor`, each saying the callee's identity is
established but names no registry row.

Re-derived the slice rather than the symptom. The same run carries, upstream
of those 13, two errors nobody had joined to them:

  dag/gunbc/code_change_workflow.dag:17:12: unresolved type 'ProcessNodeId'
  dag/test/claim/code_change_workflow_witness_test.dag:307:32: unresolved type 'NotReady'

`ProcessNodeId` is declared by `gunbc.process_algebra`, `NotReady` by
`gunbc.pr_digests`, and neither module declared a dependency on either. Both
modules carried NO import header at all, so they resolved through the
loader's bare-reference channel, which pulls a provider module only for a
name the census finds pullable. The alias-shaped `ProcessNodeId` is not, so
`gunbc.process_algebra` was never pulled, the type never resolved, and
`gunbc.code_change_workflow` fell out of the compile-clean closure into the
NAME CENSUS ONLY. That is the whole chain: name census establishes the callee
identity, the item registry (built only over compiled modules) has no row for
it, and the effect join contributes nothing -- 13 times, once per calling
witness.

The repair is at the boundary that was unjustified: both modules now declare
the dependencies they always had. Nothing is silenced, nothing is excluded,
no witness stops calling either function.

Evidence, one entry compile per side over a subject that reaches the witness
(`gunbc compile --source-root dag --source-root src/v2 --entry
dag/test/claim/code_change_workflow_witness_test.dag`):

  control (main):  22 blocking -- 13 effect-summary, 2 unresolved type, 7 in
                   dag/gunbc/runner/microvm_controller_app_key_converge.dag
  head:             7 blocking -- only the microvm_controller_app_key_converge
                   annotation errors, which this change does not touch

and `gunbc run --function all_code_change_workflow_witnesses` evaluates to
`true` on head (the run then refuses only because the fold returns Bool
rather than ProcessExit).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@briansrls
briansrls added this pull request to the merge queue Sep 21, 2026
Merged via the queue into main with commit 4b3d384 Sep 21, 2026
4 checks passed
@briansrls
briansrls deleted the session/smart-boar-749 branch September 21, 2026 10:17
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