Repository navigation
Declare the dependency gunbc.code_change_workflow and its witness already had (13 effect-summary-incomplete floor errors) - #11940
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The defect
The floor refusal on PR #11907 (run 35555630169, job 106198684855) carried 13
effect summary incompleteerrors overtest.claim.code_change_workflow_witness_testcallinggunbc.code_change_workflow.decide_code_change_transitionand.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:
ProcessNodeIdis declared bygunbc.process_algebra;NotReadybygunbc.pr_digests.bare_reference_pull_paths_for_source), which is applied only to import-free sources. That channel did not pullgunbc.process_algebrafor this reference, so the type never resolved. Why it did not is not established here: I probed the obvious hypothesis — that an alias-shapedtype X = NonEmptyStr where brand(...)reference is not "pullable" — againsttest.claim.extdeps_version_base, an import-free module whose only edge toextdeps.versionis 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.gunbc.code_change_workflowis 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)).unjoinable_callee_edges(v1.compiler.infer_service) then reportsResolvedCalleeRegistryRowAbsent— 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:
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_witnessesevaluates totrueon head, so the witnesses still discriminate (the run then refuses only because the fold returnsBoolrather thanProcessExit).modules_excluded=1, as askedNot 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 throughgunbc.compile_diagnostic_census),test/fixture/meta_exec_confinement_scan/,test/manual/ownership_movable_test.dag, and the wetcase4_expansion_carrier_splicesreceipt. Exactly one module in #11907's index matched one of those rows. The count is subject-relative (PR #11932's floor reportsmodules_excluded=0over 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:
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 reportsparse 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 blockingsource annotation sits inside a declaration bodyerrors. 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