Skip to content

Main repair: observe_key_content consumes the repaired presence chain (classify_host_file_presence was deleted in #11845) - #11942

Merged
briansrls merged 3 commits into
mainfrom
session/quick-moth-355
Sep 21, 2026
Merged

briansrls merged 3 commits into
mainfrom
session/quick-moth-355

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

Stacked on #11941 (its parse repair is what makes these errors visible); branch merges its head.

The premise corrected

classify_host_file_presence was not invented by #11902. It was a real function (#11063) that this module bound in #11679, and #11845 deleted it — its exit 1 → HostFileAbsent arm was the false-absence defect (GNU test -e is stat(path) == 0, so EACCES/ELOOP/ENOTDIR/EIO all answer 1 with empty stderr). #11845 touched only runner_host_file_converge.dag and 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 not observe_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: HostFileAbsent plans a write, so "I could not look" would walk into the write path.

The repair

observe_key_content runs the sibling's stat %F probe (runner_host_file_metadata_probe_argv) over this module's elevated leg and consumes classify_host_file_metadata, classify_host_file_path and runner_host_file_settled_standing — which already answers the Optional<RunnerHostFileStanding> shape the call site wanted, and answers none only for a path that was read, the one case the cmp -s comparison is entitled to. An indeterminate probe becomes HostFileUnobservable, never HostFileAbsent.

When the read failed, the parent listing that decides absence runs over the elevated leg (observe_key_parent_presence), the same stated §3b departure from member_observe.entry_presence that clear_staging already carries (the parent is the key directory at root:root 0700; an unelevated listing can only refuse). The argv and membership read remain member_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:

  • control (file as on Main repair: hoist the in-body annotation in microvm_controller_app_key_converge to module-item grain #11941): exactly the three — 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.
  • head: none of the three. The only blocking diagnostics left are the pre-existing emit-stage extdeps.gunbc shell-transport rows (gunbc.WitnessBin.Run stderr channels), unrelated to this module and present on both trees.

Scope

This symbol only. clear_staging still carries its own inline elevated parent listing feeding the pure classify_staging_residue (witnessed); folding it onto observe_key_parent_presence is a §2 follow-up, not this repair.

🤖 Generated with Claude Code

gunbc-ci-auto-heal and others added 2 commits September 21, 2026 04:57
…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>
@gunbai-bot gunbai-bot Bot changed the title Main repair: classify_host_file_presence does not exist Main repair: observe_key_content consumes the repaired presence chain (classify_host_file_presence was deleted in #11845) Sep 21, 2026
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review September 21, 2026 05:42
# Conflicts:
#	dag/gunbc/runner/microvm_controller_app_key_converge.dag
@gunbai-bot gunbai-bot Bot mentioned this pull request Sep 21, 2026
6 tasks
@briansrls
briansrls added this pull request to the merge queue Sep 21, 2026
Merged via the queue into main with commit 2b85a63 Sep 21, 2026
4 checks passed
@briansrls
briansrls deleted the session/quick-moth-355 branch September 21, 2026 10:54
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>
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