Repository navigation
Main repair: observe_key_content consumes the repaired presence chain (classify_host_file_presence was deleted in #11845) - #11942
Merged
Merged
Conversation
…ey_converge to module-item grain
The block inside `clear_staging` is source annotation at declaration-body grain, which
the parser refuses ("source annotation sits inside a declaration body. Only module-item
grain is modeled") -- 7 blocking errors on main since #11902 landed today. The required
gate's floor job binds no adjudicator, so a closure that reaches this module refuses the
floor while the lane concludes success; PR #11829 closes that and is gated on repairs
like this one.
The prose is unchanged and stays attached to the declaration it describes, now above
`fn clear_staging` beside the annotation already there. No semantic edit.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ence chain, not the deleted classify_host_file_presence gunbc.microvm_controller_app_key_converge imported and called classify_host_file_presence from gunbc.runner_host_file_converge. The function was real (#11063) and this consumer bound it in #11679; #11845 deleted it because its exit-1 arm minted HostFileAbsent for every stat failure (GNU `test -e` is stat(path) == 0), and touched only the sibling module, so this consumer went dangling. Restoring the name would restore the false-absence arm on the one file the module keeps root:root 0400. observe_key_content now runs the sibling's stat `%F` probe over this module's elevated leg and consumes classify_host_file_metadata, classify_host_file_path and runner_host_file_settled_standing; the parent listing that decides absence when the read failed runs elevated (the same stated departure from member_observe's entry_presence that clear_staging already carries, because the parent is root:root 0700), with the argv and membership read still member_observe's. Evidence: per-entry compile of the module (primary-precedence pool) on #11941's head with the old file reports exactly the three errors (name not found in module at the import, function not found in scope at the call, effect summary incomplete); with this file it reports none, both runs resolving the same 1563-source closure. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
# Conflicts: # dag/gunbc/runner/microvm_controller_app_key_converge.dag
briansrls
added this pull request to the merge queue
Sep 21, 2026
gunbai-bot Bot
pushed a commit
that referenced
this pull request
Sep 21, 2026
Third merge of main into this branch, and the first whose conflicts were not all mechanical. fleet_converge_workflow_modes: both sides edited the roster. This branch replaced MicrovmControllerAppKeyConverge with HostCredentialCustodyConverge; main's #11751 added MicrovmNetworkObserve. Kept both -- main's roster with the rename applied -- rather than taking either side, which would have dropped the other's mode. Checked after regeneration: the emitted workflow carries host_credential_custody_converge and microvm_network_observe and no microvm_controller_app_key. microvm_controller_app_key_converge.dag: modify/delete again, and this time main's edit was #11942, a real repair -- observe_key_content was calling classify_host_file_presence, which #11845 deleted, and the repair rebuilds presence from the sibling's chain so that "I could not look" can no longer walk into the write path. The delete is still correct, and the repair is not lost by taking it: this branch's replacement already reads presence from an elevated parent listing and treats a listing that did not succeed as unobservable rather than absent. Same semantics, reached independently, and verified in the replacement rather than assumed from the port note. Noted rather than fixed, because it is not this PR's subject: after #11942, main's observe_key_parent_presence consumes runner_host_file_converge's repaired chain while this module re-spells the listing branch inline. Both are correct and fail-closed, and both use member_observe's argv and membership read, so the shared primitives are shared -- but they are two spellings of one decision and should converge on the sibling's chain in a follow-up. Measured: compiling the workflow closure reports 11 blocking errors at this head and 11 at origin/main, all in unrelated modules. The resolution introduces none. Generated projections regenerated, not hand-merged; a second gate run wrote nothing. 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.
Stacked on #11941 (its parse repair is what makes these errors visible); branch merges its head.
The premise corrected
classify_host_file_presencewas not invented by #11902. It was a real function (#11063) that this module bound in #11679, and #11845 deleted it — itsexit 1 → HostFileAbsentarm was the false-absence defect (GNUtest -eisstat(path) == 0, so EACCES/ELOOP/ENOTDIR/EIO all answer 1 with empty stderr). #11845 touched onlyrunner_host_file_converge.dagand did not enumerate this consumer (DESIGN §3: a root outside the gate needs its consumers named before deletion). #11902 kept the call, and repaired the staging probe with the same rule but notobserve_key_content.So the earliest unjustified boundary (§6b) is the dangling consumer, and restoring the name would restore the deleted arm on the one file this module keeps
root:root 0400:HostFileAbsentplans a write, so "I could not look" would walk into the write path.The repair
observe_key_contentruns the sibling'sstat %Fprobe (runner_host_file_metadata_probe_argv) over this module's elevated leg and consumesclassify_host_file_metadata,classify_host_file_pathandrunner_host_file_settled_standing— which already answers theOptional<RunnerHostFileStanding>shape the call site wanted, and answersnoneonly for a path that was read, the one case thecmp -scomparison is entitled to. An indeterminate probe becomesHostFileUnobservable, neverHostFileAbsent.When the read failed, the parent listing that decides absence runs over the elevated leg (
observe_key_parent_presence), the same stated §3b departure frommember_observe.entry_presencethatclear_stagingalready carries (the parent is the key directory atroot:root 0700; an unelevated listing can only refuse). The argv and membership read remainmember_observe's.Evidence — discriminating pair, name resolution reached in both
gunbc compile --source-root dag --source-root src/v2 --dependency-pool-index primary-precedence --entry dag/gunbc/runner/microvm_controller_app_key_converge.dag --target rust, both on #11941's head, same 1563-source reference-derived closure resolved:name 'classify_host_file_presence' not found in module 'gunbc.runner_host_file_converge'(import, :58),function 'classify_host_file_presence' not found in scope(call, :651),effect summary incomplete: call to 'classify_host_file_presence' in …observe_key_content.extdeps.gunbcshell-transport rows (gunbc.WitnessBin.Runstderr channels), unrelated to this module and present on both trees.Scope
This symbol only.
clear_stagingstill carries its own inline elevated parent listing feeding the pureclassify_staging_residue(witnessed); folding it ontoobserve_key_parent_presenceis a §2 follow-up, not this repair.🤖 Generated with Claude Code