Skip to content

Managed-host cut 2: host-generic unit hold over ManagedHost.unit_hold - #13131

Merged
gunbai-bot[bot] merged 10 commits into
mainfrom
session/snappy-heron-23
Oct 4, 2026
Merged

gunbai-bot[bot] merged 10 commits into
mainfrom
session/snappy-heron-23

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Cut 2 of the managed-host untangle (docs/plans/managed-host-untangle.md). Work item adhoc-fb595477-42d, parent warm-crane-577.

What changed

gunbc.machine_intake_mtcollins1_maintenance_hold is replaced by gunbc.managed_host_unit_hold (dag/gunbc/host/managed_host_unit_hold.dag). The name follows the vocabulary the corpus already uses: "unit hold" for the slot and its proof (UnitHoldProof, unit_hold_acquire, unit_hold_store_root); "maintenance" is one kind of holder.

  • Admission. AdmittedUnitHoldSubject is sole_constructor, minted only by admit_unit_hold_subject from a ManagedHost row's unit_hold. A label with no row is UnitHoldHostNotManaged; a row with ResetNoUnitHold is UnitHoldHostNotRequired. No arm derives a key from a label.
  • Effects consume only the admitted value. unit_hold_acquire takes the subject (store root fixed inside). UnitHoldProof carries the subject it was acquired for; unit_hold_proof_refusal compares the proof's host with the host about to be written.
  • Operator maintenance has its own admission. AdmittedMaintenanceHold (sole_constructor) = hold subject + the reason variable declared by gunbc.host_maintenance_hold_reason (new, same shape as gunbc.host_reset_boot_selection). GUNBC_MTCOLLINS1_MAINTENANCE_REASON is unchanged and lives there as mtcollins1's row.
  • Unit values enter through the row. managed_hosts() now authors ResetUnitHoldRequired { key: operator_host_mtcollins1, store_host: operator_host_srv1 } directly; gunbc.managed_host no longer imports the hold module.
  • Deleted, no aliases: mtcollins1_unit_hold_key, mtcollins1_unit_hold_store_host, mtcollins1_maintenance_reason_env, mtcollins1_boot_acquire_unit_hold, mtcollins1_kvm_observer_acquire_unit_hold, mtcollins1_kvm_observer_release_unit_hold, mtcollins1_maintenance_hold_take, mtcollins1_maintenance_hold_release, and the unused unit_hold_proof_key.

Consumers cut over: gunbc.host_reset_return_run (reads the hold through admit_unit_hold_subject), gunbc.runner_host_grants (store root provisioned on unit_hold_store_hosts()), gunbc.fleet_converge_workflow, gunbc.auth.privileged_effect_census, gunbc.durable_exclusive_hold_file_store (admit list), and the unit procedure modules mtcollins1_actuate, mtcollins1_media_attach, mtcollins1_boot_run, mtcollins1_kvm_observer_observe (one import line plus the call sites; prose-only edits in mtcollins1_boot_admission, _boot_authorization, _boot_dry_realization).

Current head 1bf61eb6576 — what changed since 8732e2b99e2 and what was run

Sealed hold/executor pairing (side chat at 8732e2b99e2). maintenance_hold_take_admitted and maintenance_hold_release_admitted no longer take an executor: each mints it from its own hold.subject, so no function accepts a hold for A beside an executor for B. The two functions that do take a UnitHoldStoreExecutor (maintenance_hold_release_on_store_host, kvm_observer_release_on_store_host) read slot and label from the executor's own subject and are admit_callers-sealed to their one in-module caller. Checked as asked: unit_hold_acquire already derived the executor from its own subject and passed only that on; the KVM release passed only the executor but its inner function was unsealed, now sealed. Mismatch RED: managed_host_unit_hold_forged_probe_witness a_hold_cannot_be_operated_with_another_subjects_executor requires ConstructorCallAdmissionRefused at maintenance_hold_take_admitted, maintenance_hold_release_admitted (each called with hold A and executor B), maintenance_hold_release_on_store_host and kvm_observer_release_on_store_host. The pinned refusal is the caller admission; the census reports no separate blocking row for the surplus executor: argument, so none is claimed.

Executed store-host controls (dag/test/claim/host/managed_host_unit_hold_store_host_witness_test.dag, new). The production maintenance_hold_take / maintenance_hold_release entries for mtcollins1 run against a modeled machine (hostname, environment, modeled store) and the claims assert the route: observed on srv2, take and release each refuse with the hostname read as the ONLY dispatch (no shell.Env, no Filesystem) and the store unchanged; observed on srv1, each reaches the store (hostname first, reason read, store written; a take after the release succeeds); plus a control that a second take over the held store is refused as already held. No mutation arm (gate removed) was run against this file.

Merge with main / cut 4c (#13139). Conflict in the fixture's admit list (both sets kept). Cut 4c moved the boot-federation claims to its own witness and deleted their module, so the mtcollins1_boot_federation_witness_test.dag this PR had split out is deleted; decision 6 below is superseded.

CI floor refusal at c88b4813456, fixed. NonFoldResidueRosterDiverged: moving the store effect into unit_hold_acquire_on_store_host carried a wildcard arm with it. The wildcard is replaced by the explicit outcome arms and the ::unit_hold_acquire residue row is deleted (one row remains, ::start_time_text).

Evidence at exactly 1bf61eb6576:

  • Hermetic, claim_batch --claim-run --hermetic on a BuildBuddy runner with a bound memory cgroup, checkout asserted at the pin (route: gunbc#12550 comment 5889444969): store-host route witness 5/5, modeled_filesystem_witness_test 4/4, mtcollins1_boot_acceptance_matrix_test 28/28. This replaces the "unmeasured" standing of the last two in section 1 below, and the matrix now passes with the extra hostname read. The same three were also 5/4/28 at 0056a10b392, 7de5e50d58a and c88b4813456.
  • gunbc run --claim-run, binary /cargo-target/snappy-heron-23/release/gunbc version 1bf61eb6576, all green: managed_host_unit_hold_witness 17/17, managed_host_unit_hold_forged_probe_witness 4/4, mtcollins1_unit_hold_forged_probe_witness_test 5/5, managed_host_witness 3/3, managed_host_forged_probe_witness 3/3, host_reset_return_witness 53/53, mtcollins1_boot_run_witness_test 35/35, mtcollins1_kvm_observer_observe_witness_test 11/11, unit_hold_store_provision_witness 2/2, authorization_pattern_selection_witness 23/23, fleet_converge_plan_witness 87/87, non_fold_residue_frontier_test 5/5.
  • Generated fleet-converge.yml equal to the committed file at 1bf61eb6576.
  • Not run by me at this head: the other files of the 41-file roster (last run at ec9e79d4661), cut 4c's federation witness, and sol_hold_stdin_wet (not run, see below). Exact-head CI is the required run on this head.

Changes after the first review round (written at 8732e2b99e2; item 1's "Not executed" note is superseded by the section above)

1. Store effects require a process observed on the store host (side-chat REQUEST_CHANGES at 80a3270eeac). unit_hold_store_root is a local directory, so maintenance_hold_take/release run on srv2 for mtcollins1 would have acted on srv2's store while srv1's stayed free.

  • New sole_constructor carrier UnitHoldStoreExecutor, minted only by unit_hold_store_executor(subject), which itself reads os.Hostname.ReadShort and requires it to equal the hostname gunbc.hostname_allocation allocates to subject.store_host. These are the same two authorities gunbc.host_reset_return_run observer_self_corroboration already reads to establish which machine a run is on; no second authority and no caller-supplied executor parameter. Unreadable hostname or unallocated store host refuse.
  • Consumers: the operator's take and release (the carrier is a parameter of the function that reads the reason and touches the store, so a process off the store host refuses before either); unit_hold_acquire (gate inside the one mint, with the store effect moved to unit_hold_acquire_on_store_host, sealed to it); the KVM probe's always-release.
  • The same hole existed in the other paths, found by checking as asked: boot and KVM acquire relied only on the dispatch's host input (mtcollins1_boot_host_admission, an environment value); the reset run compared the observer label with the store host and acquired the hold before its own hostname corroboration ran, so a mislabelled runner took a hold in the wrong store (it still refused before any controller write); the KVM always-release read and released the local store unchecked. All now pass through the gate.
  • Controls, in managed_host_unit_hold_witness: w_a_process_observed_off_the_store_host_is_refused_and_one_on_it_is_admitted (real mtcollins1 subject; supplied reading srv2 refuses naming it, srv1 admits, unreadable/empty refuse); w_a_store_host_with_no_allocated_hostname_refuses_the_executor; w_the_executor_carrier_is_minted_only_from_this_process_own_hostname (the real read; read-only). The forged-carrier witness now also requires SoleConstructorViolation at UnitHoldStoreExecutor and ConstructorCallAdmissionRefused at unit_hold_acquire_on_store_host.
  • Not executed: "on srv1 the operator take/release reaches the store effect" is shown by the supplied-reading fold and by the carrier's type, not by running them against a store. I deliberately put no live take/release of a real host in a witness, because run on srv1 it could take or release a real hold. The acquire path on the store host is exercised by mtcollins1_boot_acceptance_matrix_test, whose dry realization already answers hostname -s as srv1; that file runs only in Hermetic mode and its route assertions now see one more read, so it needs the Hermetic measurement below at this head.

2. unit_hold_store_hosts_of (review 75039): the copied, scanned accumulator is replaced by prepend-and-reverse plus std.list distinct_by_key; a claim covers three rows naming one store host.

Evidence for this round. At b2a75609d8e (binary /cargo-target/snappy-heron-23/release/gunbc, version b2a75609d8e), gunbc run --claim-run, all green: managed_host_unit_hold_witness 17/17, managed_host_unit_hold_forged_probe_witness 3/3, mtcollins1_unit_hold_forged_probe_witness_test 5/5, managed_host_witness 3/3, managed_host_forged_probe_witness 3/3, host_reset_return_witness 53/53, mtcollins1_boot_run_witness_test 35/35, mtcollins1_kvm_observer_observe_witness_test 11/11, unit_hold_store_provision_witness 2/2, authorization_pattern_selection_witness 23/23, fleet_converge_plan_witness 87/87, non_fold_residue_frontier_test 5/5. Generated fleet-converge.yml equal to committed at b2a75609d8e. The head 8732e2b99e2 is that commit merged with main; main changed gunbc.fleet_converge_workflow and the generated workflow in that merge, and I have not re-run anything at 8732e2b99e2 — its workflow drift and witnesses are for exact-head CI. Sections below this one describe the first round at 80a3270eeac and are otherwise unchanged.

Landing precondition

Before this merges, the srv1 hold store (/var/lib/gunbc/unit-holds) must hold no live slot whose owner starts with mtcollins1-boot: or mtcollins1-kvm-observer:. This PR changes those two owner tags (decision 1 below; kept per warm-crane-577). A hold written under an old tag decodes as unrecognised after this lands: it still excludes every new acquirer, but it can no longer be recovered as a dead holder or released from the operator entry, so it would have to be cleared by hand. Reading, relayed by warm-crane-577 (2026-10-03): eager-gull-22 read srv1 /var/lib/gunbc/unit-holds; the latest event is mtcollins1.36 = free|mtcollins1-boot:37102391062, i.e. the slot is free (last released by a boot run), so no hold is live under an old tag. eager-gull-22 will take no hold and start no mtcollins1 boot until this PR lands. That reading is theirs, not mine: this PR does not check the store and I have not touched the host. It is a point-in-time reading, so a boot or probe dispatched from another branch before the merge would reopen the question. operator-maintenance: and host-reset-return: holds are unaffected.

Operator commands after this lands

Run on the store host (srv1), in the operator's own session, from the repository root. The host is an argument and has no default.

Take a maintenance hold on Mt. Collins unit 1:

GUNBC_MTCOLLINS1_MAINTENANCE_REASON="<why the unit is held>" \
  gunbc run --source-root dag --source-root src/v2 \
  --entry dag/gunbc/host/managed_host_unit_hold.dag \
  --function maintenance_hold_take --arg host=mtcollins1

Release it:

gunbc run --source-root dag --source-root src/v2 \
  --entry dag/gunbc/host/managed_host_unit_hold.dag \
  --function maintenance_hold_release --arg host=mtcollins1

These replace --entry dag/gunbc/machine_intake/mtcollins1_maintenance_hold.dag --function mtcollins1_maintenance_hold_take / mtcollins1_maintenance_hold_release, which no longer exist. The refusal arms of both entries were executed by w_the_operator_entries_refuse_an_unnamed_or_unmanaged_host; the commands above were not run against a real store in this session (no hardware or host was touched), so the admitted take/release path is exercised only up to the store call by the witnesses.

Decisions a reviewer should check

  1. Durable owner tags changed. mtcollins1-boot: → boot-run:, mtcollins1-kvm-observer: → kvm-observer: (and the always-release ref). A generic module stamping another unit's name on a hold is the thing this cut removes. Consequence: a hold stranded under an old tag by a run that died decodes as unrecognised and refuses until cleared by hand. operator-maintenance: and host-reset-return: are unchanged, so an operator hold in place survives. If this should wait for cut 7, say so and I will restore the two tags.
  2. Operator entries take the host as an argument: gunbc run … --entry dag/gunbc/host/managed_host_unit_hold.dag --function maintenance_hold_take --arg host=mtcollins1 (same for maintenance_hold_release). An empty or unknown host refuses before the store is touched.
  3. No inspect entry. The brief says take/release/inspect; no inspect entry existed at merge-base and none is added (it would have no consumer).
  4. Workflow authority. The boot job's runner label and concurrency group are now read off the mtcollins1 row via unit_hold_admission_for; if the row is not admitted, fleet_converge_yml_after_reset_assignment refuses to emit. Generated .github/workflows/fleet-converge.yml is byte-identical (check below). No mode, job, input, step id or env var changed.
  5. admit_callers lists in the generic module still name the mtcollins1 boot and KVM callers. Those are the seals' current callers and move with cuts 4d/5.
  6. The old witness file also held the boot-federation claims; they stay unit-named in mtcollins1_boot_federation_witness_test.dag (cut 4c's subject), and the hold claims moved to dag/test/claim/host/managed_host_unit_hold_witness_test.dag.

Terminal receipt

Binary for every run: /cargo-target/snappy-heron-23/release/gunbc, built locally from this branch; gunbc --version printed the sha named with each result. Command: gunbc run --claim-run --source-root dag --source-root src/v2 --entry <file>.

1. Consumer roster and witnesses

Roster by the plan's census method (reverse import edges over dag/ and src/v2/), recomputed at 80a3270eeac. P production, W witness.

Full roster of every deleted or changed root
## gunbc.managed_host_unit_hold (dag/gunbc/host/managed_host_unit_hold.dag)
  P gunbc.fleet_converge_workflow  [dag/gunbc/fleet/fleet_converge_workflow.dag]
  P gunbc.host_reset_return_run  [dag/gunbc/host/host_reset_return_run.dag]
  P gunbc.machine_intake_mtcollins1_actuate  [dag/gunbc/machine_intake/mtcollins1_actuate.dag]
  P gunbc.machine_intake_mtcollins1_boot_run  [dag/gunbc/machine_intake/mtcollins1_boot_run.dag]
  P gunbc.machine_intake_mtcollins1_kvm_observer_observe  [dag/gunbc/machine_intake/mtcollins1_kvm_observer_observe.dag]
  P gunbc.machine_intake_mtcollins1_media_attach  [dag/gunbc/machine_intake/mtcollins1_media_attach.dag]
  P gunbc.runner_host_grants  [dag/gunbc/runner/runner_host_grants.dag]
  W test.claim.machine_intake.mtcollins1_boot_acceptance_matrix_test  [dag/test/claim/machine_intake/mtcollins1_boot_acceptance_matrix_test.dag]
  W test.claim.managed_host_unit_hold_witness  [dag/test/claim/host/managed_host_unit_hold_witness_test.dag]
  W test.claim.modeled_filesystem_witness_test  [dag/test/claim/modeled_filesystem_witness_test.dag]
  W test.claim.unit_hold_store_provision_witness  [dag/test/claim/runner/unit_hold_store_provision_witness_test.dag]
  W test.probe.unit_hold_proof_forged_probe  [dag/test/probe/unit_hold_proof_forged_probe.dag]
## gunbc.host_maintenance_hold_reason (dag/gunbc/host/host_maintenance_hold_reason.dag)
  P gunbc.managed_host_unit_hold  [dag/gunbc/host/managed_host_unit_hold.dag]
## gunbc.managed_host (dag/gunbc/host/managed_host.dag)
  P gunbc.host_maintenance_hold_reason  [dag/gunbc/host/host_maintenance_hold_reason.dag]
  P gunbc.host_reset_boot_selection  [dag/gunbc/host/host_reset_boot_selection.dag]
  P gunbc.host_reset_subject_roster  [dag/gunbc/host/host_reset_subject_roster.dag]
  P gunbc.managed_host_unit_hold  [dag/gunbc/host/managed_host_unit_hold.dag]
  W test.claim.managed_host_unit_hold_witness  [dag/test/claim/host/managed_host_unit_hold_witness_test.dag]
  W test.claim.managed_host_witness  [dag/test/claim/host/managed_host_witness_test.dag]
## gunbc.fleet_converge_workflow (dag/gunbc/fleet/fleet_converge_workflow.dag)
  P gunbc.generated_artifact_emit  [dag/gunbc/generated_artifact_emit.dag]
  W test.claim.approval_device_enrolment_code_witness_test  [dag/test/claim/approval_device_enrolment_code_witness_test.dag]
  W test.claim.fleet.fleet_converge_checkout_pin_witness_test  [dag/test/claim/fleet/fleet_converge_checkout_pin_witness_test.dag]
  W test.claim.fleet_converge_plan_witness  [dag/test/claim/fleet/fleet_converge_plan_witness_test.dag]
  W test.claim.gcp_iam_converge_witness_test  [dag/test/claim/gcp_iam_converge_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_boot_run_witness_test  [dag/test/claim/machine_intake/mtcollins1_boot_run_witness_test.dag]
  W test.claim.namecheap_workflow_witness_test  [dag/test/claim/namecheap_workflow_witness_test.dag]
  W test.claim.organization_runner_roster_read_witness  [dag/test/claim/fleet/organization_runner_roster_read_witness_test.dag]
  W test.claim.toolchain_home_standing_witness  [dag/test/claim/toolchain_home_standing_witness_test.dag]
  W test.claim.witness_floor_workflow_consolidation_witness_test  [dag/test/claim/witness_floor_workflow_consolidation_witness_test.dag]
  W test.claim.workflow_capability_closure_witness  [dag/test/claim/workflow_capability_closure_witness_test.dag]
  W test.claim.workflow_dispatch_input_witness  [dag/test/claim/workflow_dispatch_input_witness_test.dag]
## gunbc.host_reset_return_run (dag/gunbc/host/host_reset_return_run.dag)
  P gunbc.ci_spec  [dag/gunbc/ci/ci_spec.dag]
  P gunbc.fleet_converge_workflow  [dag/gunbc/fleet/fleet_converge_workflow.dag]
  P gunbc.machine_intake_mtcollins1_boot_run  [dag/gunbc/machine_intake/mtcollins1_boot_run.dag]
  W test.claim.workflow_dispatch_input_witness  [dag/test/claim/workflow_dispatch_input_witness_test.dag]
## gunbc.machine_intake_mtcollins1_actuate (dag/gunbc/machine_intake/mtcollins1_actuate.dag)
  P gunbc.host_reset_boot_selection  [dag/gunbc/host/host_reset_boot_selection.dag]
  P gunbc.machine_intake_mtcollins1_boot_authorization  [dag/gunbc/machine_intake/mtcollins1_boot_authorization.dag]
  P gunbc.machine_intake_mtcollins1_boot_run  [dag/gunbc/machine_intake/mtcollins1_boot_run.dag]
  W test.claim.machine_intake.mtcollins1_boot_diagnostic_bundle_witness_test  [dag/test/claim/machine_intake/mtcollins1_boot_diagnostic_bundle_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_boot_run_witness_test  [dag/test/claim/machine_intake/mtcollins1_boot_run_witness_test.dag]
  W test.probe.unit_hold_proof_forged_probe  [dag/test/probe/unit_hold_proof_forged_probe.dag]
## gunbc.machine_intake_mtcollins1_boot_run (dag/gunbc/machine_intake/mtcollins1_boot_run.dag)
  P gunbc.ci_spec  [dag/gunbc/ci/ci_spec.dag]
  P gunbc.fleet_converge_workflow  [dag/gunbc/fleet/fleet_converge_workflow.dag]
  P gunbc.machine_intake_mtcollins1_boot_dry_realization  [dag/gunbc/machine_intake/mtcollins1_boot_dry_realization.dag]
  P gunbc.machine_intake_mtcollins1_sol_notice  [dag/gunbc/machine_intake/mtcollins1_sol_notice.dag]
  W test.claim.machine_intake.host_capture_sol_crlf_witness_test  [dag/test/claim/machine_intake/host_capture_sol_crlf_witness_test.dag]
  W test.claim.machine_intake.host_capture_sol_nul_fill_witness_test  [dag/test/claim/machine_intake/host_capture_sol_nul_fill_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_boot_acceptance_matrix_test  [dag/test/claim/machine_intake/mtcollins1_boot_acceptance_matrix_test.dag]
  W test.claim.machine_intake.mtcollins1_boot_diagnostic_bundle_witness_test  [dag/test/claim/machine_intake/mtcollins1_boot_diagnostic_bundle_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_boot_run_witness_test  [dag/test/claim/machine_intake/mtcollins1_boot_run_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_kvm_observer_protocol_wet_witness  [dag/test/claim/machine_intake/mtcollins1_kvm_observer_protocol_wet_witness_test.dag]
  W test.claim.machine_intake.sol_hold_stdin_wet_witness  [dag/test/claim/machine_intake/sol_hold_stdin_wet_witness_test.dag]
  W test.probe.unit_hold_proof_forged_probe  [dag/test/probe/unit_hold_proof_forged_probe.dag]
## gunbc.machine_intake_mtcollins1_kvm_observer_observe (dag/gunbc/machine_intake/mtcollins1_kvm_observer_observe.dag)
  P gunbc.fleet_converge_workflow  [dag/gunbc/fleet/fleet_converge_workflow.dag]
  W test.claim.machine_intake.mtcollins1_kvm_observer_observe_witness_test  [dag/test/claim/machine_intake/mtcollins1_kvm_observer_observe_witness_test.dag]
## gunbc.machine_intake_mtcollins1_media_attach (dag/gunbc/machine_intake/mtcollins1_media_attach.dag)
  P gunbc.machine_intake_mtcollins1_boot_run  [dag/gunbc/machine_intake/mtcollins1_boot_run.dag]
  W test.claim.machine_intake.megarac_media_convergence_witness_test  [dag/test/claim/machine_intake/megarac_media_convergence_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_boot_run_witness_test  [dag/test/claim/machine_intake/mtcollins1_boot_run_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_stale_power_off_witness_test  [dag/test/claim/machine_intake/mtcollins1_stale_power_off_witness_test.dag]
  W test.probe.unit_hold_proof_forged_probe  [dag/test/probe/unit_hold_proof_forged_probe.dag]
## gunbc.runner_host_grants (dag/gunbc/runner/runner_host_grants.dag)
  P gunbc.fleet_converge_plan  [dag/gunbc/fleet/fleet_converge_plan.dag]
  P gunbc.generated_artifact_emit  [dag/gunbc/generated_artifact_emit.dag]
  P gunbc.host_credential_custody_converge  [dag/gunbc/fleet/host_credential_custody_converge.dag]
  P gunbc.runner_host_file_converge  [dag/gunbc/runner/runner_host_file_converge.dag]
  P gunbc.runner_microvm_network_apply  [dag/gunbc/runner/runner_microvm_network_apply.dag]
  P gunbc.runner_microvm_network_observe  [dag/gunbc/runner/runner_microvm_network_observe.dag]
  W test.claim.executor_privileged_operation_witness  [dag/test/claim/executor_privileged_operation_witness_test.dag]
  W test.claim.runner.runner_microvm_slot_reserve_witness_test  [dag/test/claim/runner/runner_microvm_slot_reserve_witness_test.dag]
  W test.claim.runner_microvm_host_ready_witness  [dag/test/claim/runner/runner_microvm_host_ready_witness_test.dag]
  W test.claim.runner_service_activation  [dag/test/claim/runner/runner_service_activation_witness_test.dag]
## gunbc.auth.privileged_effect_census (dag/gunbc/auth/privileged_effect_census.dag)
  P gunbc.census_closure_frontier  [dag/gunbc/census_closure_frontier.dag]
  W test.claim.authorization_pattern_selection_witness  [dag/test/claim/authorization_pattern_selection_witness_test.dag]
  W test.claim.gcp_iam_converge_witness_test  [dag/test/claim/gcp_iam_converge_witness_test.dag]
  W test.claim.live_deploy.approval_broker_helper_grant  [dag/test/claim/live_deploy/approval_broker_helper_grant_test.dag]
## gunbc.durable_exclusive_hold_file_store (dag/gunbc/durable_exclusive_hold_file_store.dag)
  P gunbc.fabric_control_plane  [dag/gunbc/fabric/fabric_control_plane.dag]
  P gunbc.fabric_required_build_cell  [dag/gunbc/fabric/fabric_required_build_cell.dag]
  P gunbc.managed_host_unit_hold  [dag/gunbc/host/managed_host_unit_hold.dag]
  W test.claim.durable_exclusive_hold_file_store_wet_witness  [dag/test/claim/durable_exclusive_hold_file_store_wet_witness_test.dag]
  W test.claim.durable_exclusive_hold_witness  [dag/test/claim/durable_exclusive_hold_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_boot_acceptance_matrix_test  [dag/test/claim/machine_intake/mtcollins1_boot_acceptance_matrix_test.dag]
  W test.claim.managed_host_unit_hold_witness  [dag/test/claim/host/managed_host_unit_hold_witness_test.dag]
  W test.claim.modeled_filesystem_witness_test  [dag/test/claim/modeled_filesystem_witness_test.dag]
  W test.claim.runner.runner_microvm_slot_reserve_witness_test  [dag/test/claim/runner/runner_microvm_slot_reserve_witness_test.dag]
  W test.probe.file_hold_plan_forged_probe  [dag/test/probe/file_hold_plan_forged_probe.dag]
  P tools.fabric_control_plane_live_probe  [dag/gunbc/instruments/fabric_control_plane_live_probe.dag]
## gunbc.machine_intake_mtcollins1_boot_admission (dag/gunbc/machine_intake/mtcollins1_boot_admission.dag)
  P gunbc.machine_intake_mtcollins1_boot_run  [dag/gunbc/machine_intake/mtcollins1_boot_run.dag]
  P gunbc.machine_intake_mtcollins1_kvm_observer_observe  [dag/gunbc/machine_intake/mtcollins1_kvm_observer_observe.dag]
  W test.claim.machine_intake.mtcollins1_boot_run_witness_test  [dag/test/claim/machine_intake/mtcollins1_boot_run_witness_test.dag]
## gunbc.machine_intake_mtcollins1_boot_authorization (dag/gunbc/machine_intake/mtcollins1_boot_authorization.dag)
  P gunbc.machine_intake_mtcollins1_boot_run  [dag/gunbc/machine_intake/mtcollins1_boot_run.dag]
  P gunbc.machine_intake_mtcollins1_census_medium_readback  [dag/gunbc/machine_intake/mtcollins1_census_medium_readback.dag]
  P gunbc.machine_intake_mtcollins1_census_member_readback  [dag/gunbc/machine_intake/mtcollins1_census_member_readback.dag]
  P gunbc.machine_intake_mtcollins1_media_attach  [dag/gunbc/machine_intake/mtcollins1_media_attach.dag]
  W test.claim.machine_intake.host_capture_sol_crlf_witness_test  [dag/test/claim/machine_intake/host_capture_sol_crlf_witness_test.dag]
  W test.claim.machine_intake.host_capture_sol_nul_fill_witness_test  [dag/test/claim/machine_intake/host_capture_sol_nul_fill_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_boot_acceptance_matrix_test  [dag/test/claim/machine_intake/mtcollins1_boot_acceptance_matrix_test.dag]
  W test.claim.machine_intake.mtcollins1_boot_authorization_witness_test  [dag/test/claim/machine_intake/mtcollins1_boot_authorization_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_boot_run_witness_test  [dag/test/claim/machine_intake/mtcollins1_boot_run_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_census_medium_readback_witness_test  [dag/test/claim/machine_intake/mtcollins1_census_medium_readback_witness_test.dag]
  W test.claim.machine_intake.mtcollins1_census_member_readback_witness_test  [dag/test/claim/machine_intake/mtcollins1_census_member_readback_witness_test.dag]
  W test.claim.machine_intake.sol_hold_stdin_wet_witness  [dag/test/claim/machine_intake/sol_hold_stdin_wet_witness_test.dag]
  W test.probe.unit_hold_proof_forged_probe  [dag/test/probe/unit_hold_proof_forged_probe.dag]
## gunbc.machine_intake_mtcollins1_boot_dry_realization (dag/gunbc/machine_intake/mtcollins1_boot_dry_realization.dag)
  W test.claim.machine_intake.mtcollins1_boot_acceptance_matrix_test  [dag/test/claim/machine_intake/mtcollins1_boot_acceptance_matrix_test.dag]
## gunbc.non_fold_residue (dag/gunbc/non_fold_residue.dag)
  W test.claim.non_fold_residue_frontier  [dag/test/claim/non_fold_residue_frontier_test.dag]
## test.probe.unit_hold_proof_forged_probe (dag/test/probe/unit_hold_proof_forged_probe.dag)

Three witnesses reach the change without an import edge and were added by name: mtcollins1_unit_hold_forged_probe_witness_test (reads the probe file), managed_host_unit_hold_forged_probe_witness_test and managed_host_forged_probe_witness_test (inline probe source), plus file_hold_plan_refusal_probe_witness_test.

Full run, 41 files, at ec9e79d4661 (binary sha ec9e79d4661):

witness file PASS FAIL exit
approval_device_enrolment_code_witness_test 6 1 rc=1
authorization_pattern_selection_witness_test 23 0 rc=0
durable_exclusive_hold_file_store_wet_witness_test 10 0 rc=0
durable_exclusive_hold_witness_test 22 0 rc=0
executor_privileged_operation_witness_test 14 0 rc=0
file_hold_plan_refusal_probe_witness_test 6 0 rc=0
fleet_fleet_converge_checkout_pin_witness_test 7 0 rc=0
fleet_fleet_converge_plan_witness_test 87 0 rc=0
fleet_organization_runner_roster_read_witness_test 42 0 rc=0
gcp_iam_converge_witness_test 21 0 rc=0
host_managed_host_forged_probe_witness_test 3 0 rc=0
host_managed_host_unit_hold_forged_probe_witness_test 3 0 rc=0
host_managed_host_unit_hold_witness_test 14 0 rc=0
host_managed_host_witness_test 3 0 rc=0
live_deploy_approval_broker_helper_grant_test 18 1 rc=1
machine_intake_host_capture_sol_crlf_witness_test 1 1 rc=1
machine_intake_host_capture_sol_nul_fill_witness_test 3 3 rc=1
machine_intake_megarac_media_convergence_witness_test 87 0 rc=0
machine_intake_mtcollins1_boot_acceptance_matrix_test 0 28 rc=1
machine_intake_mtcollins1_boot_authorization_witness_test 1 0 rc=0
machine_intake_mtcollins1_boot_diagnostic_bundle_witness_test 65 1 rc=1
machine_intake_mtcollins1_boot_federation_witness_test 3 0 rc=0
machine_intake_mtcollins1_boot_run_witness_test 35 0 rc=0
machine_intake_mtcollins1_census_medium_readback_witness_test 13 0 rc=0
machine_intake_mtcollins1_census_member_readback_witness_test 17 0 rc=0
machine_intake_mtcollins1_kvm_observer_observe_witness_test 11 0 rc=0
machine_intake_mtcollins1_kvm_observer_protocol_wet_witness_test 7 7 rc=1
machine_intake_mtcollins1_stale_power_off_witness_test 13 0 rc=0
machine_intake_mtcollins1_unit_hold_forged_probe_witness_test 5 0 rc=0
machine_intake_sol_hold_stdin_wet_witness_test 30 0 no exit status
modeled_filesystem_witness_test 0 4 rc=1
namecheap_workflow_witness_test 4 0 rc=0
non_fold_residue_frontier_test 5 0 rc=0
runner_runner_microvm_host_ready_witness_test 18 0 rc=0
runner_runner_microvm_slot_reserve_witness_test 10 0 rc=0
runner_runner_service_activation_witness_test 16 0 rc=0
runner_unit_hold_store_provision_witness_test 2 0 rc=0
toolchain_home_standing_witness_test 10 0 rc=0
witness_floor_workflow_consolidation_witness_test 21 1 rc=1
workflow_capability_closure_witness_test 8 0 rc=0
workflow_dispatch_input_witness_test 36 1 rc=1
  • 30 files fully green.
  • sol_hold_stdin_wet_witness_test is not run and not claimed. Two attempts each printed 30 claims and then the session container restarted with no exit status. Per the triage lane (mtcollins1 boot witnesses: re-derive four reds against the current contract; guard sol_hold's pid-1 stand-ins #13153) those restarts were the witness itself SIGKILLing pid 1 of the session container, so it must not be run in a session; it stays unmeasured for this PR until mtcollins1 boot witnesses: re-derive four reds against the current contract; guard sol_hold's pid-1 stand-ins #13153 lands.
  • 10 files have reds under this instrument, and the red set is identical at merge-base a5a9957b66b (tree checked out separately, same binary): same FAIL names and same PASS names, file by file. What that comparison does and does not show (corrected 2026-10-03 after mtcollins1 boot witnesses: re-derive four reds against the current contract; guard sol_hold's pid-1 stand-ins #13153's triage): gunbc run --claim-run executes in Wet mode and prints only FAIL <name>, with no cause. A claim whose realization is Hermetic-only therefore REFUSES under it and is printed as FAIL, on any tree. For such a claim "red at head, red at base" compares two mode refusals and says nothing about this change.
    • mtcollins1_boot_acceptance_matrix_test (28/28 FAIL on both trees) is exactly that case: its dry realization is Hermetic-only, and the triage lane reports all 28 pass on main under claim_batch (Hermetic). My earlier wording ("identical at merge-base, not introduced by this cut") was not supported for this file and is withdrawn. It is unmeasured for this PR by my runs. This PR edits one of its claims (a_second_run_for_a_held_unit_writes_nothing_to_the_controller: slot key and expected holder tag boot-run:4141@), so it needs a Hermetic measurement at this head; that needs a memory cgroup and is not run bare in a session. Hermetic result, from CI: required run 37151981302, floor job, head 80a3270eeac (a pull_request run, so the evaluated tree is that head merged with main). The floor log carries [changed-witness] identity=test.claim.machine_intake.mtcollins1_boot_acceptance_matrix_test.a_second_run_for_a_held_unit_writes_nothing_to_the_controller standing=planned-and-passed disposition=planned_as_changed_witness outcome=passed. So the one claim this PR edits is measured green in Hermetic mode. For the rest of the file the evidence is weaker and I state it as such: the floor's plan names 37 identities of this module through body reach, and the run reports planned=695 executed=695 claims_failed=0 … verdict=FloorClean with known_red_held=5; the log has no per-claim outcome line for the other matrix claims and does not name the five held identities, and the run publishes no terminal-ledger artifact, so I am not asserting "28/28 passed at this head" from it.
      The same floor run reports all 24 changed witnesses of this PR planned-and-passed: managed_host_unit_hold_witness 14, managed_host_unit_hold_forged_probe_witness 3, mtcollins1_boot_federation_witness_test 3, unit_hold_store_provision_witness 2, authorization_pattern_selection_witness 1, and the matrix claim above.
    • modeled_filesystem_witness_test (4/4 FAIL on both trees) has the same signature (every claim fails, including ones unrelated to the hold) and uses the same modeled-world harness. I cannot tell a mode refusal from a claim failure in its log, so I treat it as unmeasured too. This PR changes one import line in it. The CI floor run above mentions it only as a body-reach seed (two_contenders_for_one_unit_get_one_hold) with no outcome line, so it is still unmeasured in Hermetic mode at this head; that needs claim_batch on a fleet host.
    • Discriminator checked in source: of the ten red files, only these two call evaluate_in_witness_frame (the modeled-world harness); the other eight do not.
    • The other eight files fail a strict subset of their claims (1 of 7, 1 of 19, 1 of 2, 3 of 6, 1 of 66, 7 of 14, 1 of 22, 1 of 37), while sibling claims in the same file pass under the same instrument. That is not the all-refuse signature, but the log carries no cause, so I am not asserting they are claim failures and not mode or environment refusals. (One has a visible environment cause: mtcollins1_kvm_observer_protocol_wet logs mktemp: failed to create directory via template 'target/gunbc_kvmrel.XXXXXX'.) What the comparison does support for these eight: their passing claims pass on both trees, and no claim that passes at base fails at head.
  • Failing names per file: approval_device_enrolment_code 1, approval_broker_helper_grant 1, host_capture_sol_crlf 1, host_capture_sol_nul_fill 3, mtcollins1_boot_acceptance_matrix 28/28, mtcollins1_boot_diagnostic_bundle 1, mtcollins1_kvm_observer_protocol_wet 7, modeled_filesystem 4/4, witness_floor_workflow_consolidation 1, workflow_dispatch_input 1.

Re-run after merging main, at 80a3270eeac (binary sha 80a3270eeac), the eight files closest to the change, all green: managed_host_unit_hold_witness 14/14, managed_host_unit_hold_forged_probe_witness 3/3, managed_host_witness 3/3, unit_hold_store_provision_witness 2/2, authorization_pattern_selection_witness 23/23, non_fold_residue_frontier_test 5/5, fleet_converge_plan_witness 87/87, mtcollins1_boot_run_witness_test 35/35. The other files were not re-run after the merge.

Generated workflow. A scratch driver (not committed) compared artifact_generate(FleetConvergeYamlArtifact) with the committed file: equal at 3dddd7bd6a9 and again at 80a3270eeac. The same driver goes red under RED A below, so it can fail.

2. Same-path REDs

  • RED A — the row's hold decision removed (unit_hold: ResetNoUnitHold in managed_hosts(), tree 3dddd7bd6a9): managed_host_unit_hold_witness fails w_the_managed_row_is_admitted_to_its_hold_with_its_own_key_and_store (and the two fixture claims that derive from the real row); unit_hold_store_provision_witness fails both claims; workflow generation returns REFUSED gunbc.fleet_converge_workflow: the mtcollins1 boot job runs on its unit hold's store host, and managed host 'mtcollins1' declares no unit hold (ResetNoUnitHold) … No workflow yaml was emitted. Restored: all green.
  • RED B — the reason-variable row removed (maintenance_hold_reason_env returns none, tree ec9e79d4661): exactly one claim fails, w_the_managed_row_is_admitted_to_its_hold_with_its_own_key_and_store; the other 13 pass. Restored: 14/14.
  • Not a managed host / row removed: w_a_host_that_is_not_a_managed_host_is_refused_by_name runs the same fold against label mtjade1 and against the real label with an empty roster; w_the_operator_entries_refuse_an_unnamed_or_unmanaged_host runs the entries themselves.
  • No hold / no reason variable on a fixture row: w_a_managed_host_with_no_unit_hold_is_refused_and_has_no_store, w_a_held_host_with_no_reason_variable_is_refused_for_maintenance (both admitted to managed_host_fixture).
  • Forged carriers: managed_host_unit_hold_forged_probe_witness requires SoleConstructorViolation at AdmittedUnitHoldSubject, AdmittedMaintenanceHold, UnitHoldProof, and ConstructorCallAdmissionRefused at unit_hold_acquire, boot_run_acquire_unit_hold, kvm_observer_acquire_unit_hold, kvm_observer_release_unit_hold, with a class-scoped clean control.

3. Corpus sweep at 80a3270eeac

git grep over dag src docs .github artifacts for the old module name and each deleted symbol listed above: the only hits are in docs/plans/managed-host-untangle.md (the dated plan; residue, not edited by cuts). Separately, dag/test/claim/durable_exclusive_hold_witness_test.dag uses the string "mtcollins1-boot:4242" as an opaque owner in the std fold's witness; it never reaches this module's decoder (residue).

Entry-path strings: gunbc.non_fold_residue — the two rows for the moved file now read dag/gunbc/host/managed_host_unit_hold.dag::start_time_text / ::unit_hold_acquire, re-sorted into place (non_fold_residue_frontier_test 5/5). gunbc.ci_spec and v2.workflow.floor_unimported_bare_provider_debt_roster carry no row for the moved file or the renamed witness (grepped).

4. No aliases

Nothing re-exports or wraps a deleted root; no mtcollins1_* function calls into the generic one as a one-liner. The old module file is gone (renamed, with the unit-fixed declarations deleted).

🤖 Generated with Claude Code

gunbc-ci-auto-heal and others added 3 commits October 3, 2026 17:27
gunbc.machine_intake_mtcollins1_maintenance_hold becomes gunbc.managed_host_unit_hold.
The take/release procedure and every hold-owning acquire are keyed by an
AdmittedUnitHoldSubject minted from a ManagedHost row's unit_hold decision; a host
that is not managed, or whose row says ResetNoUnitHold, is a typed refusal. The
mtcollins1_unit_hold_key / mtcollins1_unit_hold_store_host roots are deleted and
their values enter as the mtcollins1 row's own values.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review October 3, 2026 20:33

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed exact head 80a3270eeac79de148ac5feb8e441d747982cba5. The root replacement is largely sound: the old unit-specific module and symbols are deleted without aliases; hold policy comes from ManagedHost.unit_hold; AdmittedUnitHoldSubject, AdmittedMaintenanceHold, and UnitHoldProof are construction-confined; boot, reset-return, and KVM consume admitted subjects/proofs; workflow runner/concurrency placement derives from the row and refuses emission when the host has no hold admission; and the owner-tag recut correctly removes the unit name from the generic holder vocabulary.

One safety-critical gap remains.

The by-hand take/release entries ignore the admitted store_host

maintenance_hold_take(host) and maintenance_hold_release(host) correctly resolve the managed host and produce an AdmittedMaintenanceHold whose subject carries store_host. But the admitted implementations then call file_hold_acquire, observe_file_hold, and release against the process-local constant /var/lib/gunbc/unit-holds; they never establish that the command is actually executing on hold.subject.store_host and they do not route the effect there.

Therefore this command can succeed from another machine:

... managed_host_unit_hold.dag --function maintenance_hold_take --arg host=mtcollins1

It would create a decoy hold in that machine's local /var/lib/gunbc/unit-holds, while the boot on srv1 reads srv1's store and proceeds. The prose instruction “run on srv1” is not the physical-safety interlock. This also contradicts the module's own invariant that every holder operates on the subject's store host and the reason store_host is carried in the admitted subject at all.

Required repair: before either operator entry touches the store, structurally establish that the executing host is subject.store_host, or realize the store effect through an admitted host-operation route targeting subject.store_host. A caller-supplied executor label is not sufficient unless it is joined to a trusted executor observation.

Required controls:

  • mtcollins1 admitted with store host srv1, execution observed on srv2 -> refusal before reason lookup or filesystem mutation;
  • the same entry observed on srv1 -> reaches the store path;
  • release has the same gate.

The durable tag migration itself is acceptable. The free-slot reading closes the currently stranded-holder risk, but because old binaries would write tags the new decoder intentionally rejects, re-check immediately before queueing that the slot is free and that no pre-merge mtcollins1 boot/KVM-observer run is queued or active.

I accept the acceptance-matrix limitation as stated: the holder-tag edit is mechanically consistent (mtcollins1-boot: -> boot-run:), but it is not execution evidence while that witness is 0/28 on main and must remain classified as unverified until the triage lane restores it. That is not a second blocker for this cut.

Exact-head required CI is still in progress. After the store-host gate and its controls land, rerun the directly affected hold/boot/KVM/workflow witnesses and exact-head CI.

gunbc-ci-auto-heal and others added 2 commits October 3, 2026 21:26
…d of a copied, scanned accumulator (review 75039)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…e host

The hold store is a local directory, so take/release/acquire run off the store host
acted on another machine's store. UnitHoldStoreExecutor (sole_constructor) is minted
only when this process's own os.Hostname.ReadShort equals the hostname
gunbc.hostname_allocation allocates to the subject's store_host; unit_hold_acquire,
the KVM probe's always-release and the operator's take/release all consume it, and
the operator entries refuse before the reason lookup.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Oct 3, 2026

Copy link
Copy Markdown
Contributor Author

Hermetic measurement (claim_batch, BuildBuddy, one dispatch, per request from eager-gull-22 for warm-crane-577):

arm sha mtcollins1_boot_acceptance_matrix_test modeled_filesystem_witness_test
head 80a3270 28/28 PASS 4/4 PASS
merge-base 535493b 28/28 PASS 4/4 PASS

No FAIL, no refusal, rc=0 in both arms; every declared test fn ran. The 4/4 and 28/28 FAIL seen under gunbc run --claim-run are the Wet-refusal artifact: that route evaluates Wet, and a frame carrying a modeled operation realization refuses there with 'admitted only under Hermetic execution' (diagnosed on #13153).

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed exact head 8732e2b99e2ab1179ae7aa9222685a898caa5583. The original off-store-host defect is materially closed across the acquire and KVM-release paths: UnitHoldStoreExecutor is construction-confined, its only mint reads this process's own os.Hostname.ReadShort and joins it to gunbc.hostname_allocation, and unit_hold_acquire / the KVM always-release refuse before touching the local store when that join is absent. This also correctly closes the same latent hole in boot, KVM, and reset because those routes converge on unit_hold_acquire. The quadratic store-host dedup is also gone in favor of std.list distinct_by_key.

One construction gap remains in the operator path.

maintenance_hold_*_admitted can cross-wire the maintenance policy of one host to the store subject of another

Both helpers take two independent sealed values:

maintenance_hold_take_admitted(
  hold: AdmittedMaintenanceHold,
  executor: UnitHoldStoreExecutor,
)

and likewise for release.

The entrypoint passes matching values, but the helper itself has no caller admission and does not prove that hold.subject equals executor.subject. It reads the reason variable and label from hold, but performs the filesystem effect using executor.subject.key.

Because both carriers are obtainable through public admissions, another caller can legitimately obtain:

  • an AdmittedMaintenanceHold for managed host A; and
  • a UnitHoldStoreExecutor for managed host B whose store is on the current machine;

then call the admitted helper with both. The result can take/release B's slot under A's maintenance policy and reason while printing A's label. With more than one held host on the same store host, the hostname gate does not distinguish them.

The relation itself needs to be construction-confined. Simplest repair: do not expose a helper taking the two carriers independently. Have the effect take one carrier that contains the admitted maintenance hold plus the executor minted specifically for hold.subject, or keep the helper admitted only to the entrypoint that derives unit_hold_store_executor(subject: hold.subject). A direct mismatch compiler/control RED should show that A's maintenance admission cannot operate B's slot.

The supplied off-host/on-host decision controls and forged UnitHoldStoreExecutor literal RED are useful but do not discriminate this valid-carrier cross-wire.

I accept the stated limit that the on-srv1 operator take/release path is not executed against the real store: for this cut, a non-destructive fold/type proof is preferable to a witness that could acquire or release a real maintenance interlock. Once the carrier relation above is sealed, that is not a blocker.

The old-tag landing precondition still needs the point-in-time store-free check immediately before queueing, because a pre-merge boot/KVM run can recreate an old-tag hold. Exact-head required CI is currently in progress.

… store host

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Oct 3, 2026

Copy link
Copy Markdown
Contributor Author

Hermetic re-measure at the new head (claim_batch, BuildBuddy, one dispatch, per request from eager-gull-22):

arm sha mtcollins1_boot_acceptance_matrix_test modeled_filesystem_witness_test
head 8732e2b 28/28 PASS 4/4 PASS

rc=0, no FAIL or refusal; every declared test fn ran. The dry realization's added hostname read moves no claim. The merge-base arm (535493b, 28/28 + 4/4 PASS) is in the earlier comment.

gunbc-ci-auto-heal and others added 3 commits October 3, 2026 22:26
…ct; no helper takes both

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
# Conflicts:
#	dag/gunbc/host/managed_host.dag
#	dag/test/claim/machine_intake/mtcollins1_maintenance_hold_witness_test.dag
…retire the residue row the wildcard held

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed exact head 1bf61eb6576e6dad2fb83bd59dd8c26bbc5091a8. Approved.

The remaining hold/executor cross-wire is closed structurally:

  • maintenance_hold_take_admitted and maintenance_hold_release_admitted take only AdmittedMaintenanceHold, are caller-admitted to their public operator entries, and derive UnitHoldStoreExecutor from that hold's own subject.
  • maintenance_hold_release_on_store_host derives both the slot key and rendered label from executor.subject and admits only maintenance_hold_release_admitted.
  • kvm_observer_release_on_store_host likewise consumes only its executor and admits only the public KVM release route.
  • unit_hold_acquire already had the corresponding one-subject shape. No remaining function accepts independently obtained maintenance-policy and executor carriers.

The compiler RED is appropriately keyed to the actual enforcement wall: outside attempts to pair hold A with executor B or call either executor-taking release helper are ConstructorCallAdmissionRefused at the four named callees. The sole-constructor controls for the underlying carriers remain beside it.

The new Hermetic route witness closes the previous execution-evidence limitation without touching the live store. It runs the production take/release entries against a modeled hostname, environment and filesystem. On srv2, hostname is the only dispatch and both reason/store effects remain absent; on srv1, take writes a real modeled slot, release frees it, and a subsequent take succeeds. The held-store control proves release starts from an actually held slot.

The main merge is reconciled correctly: cut 4c owns the federation claims, so deleting this branch's duplicate federation witness removes a second authority rather than coverage. The explicit match arms repair the NonFoldResidue drift, and std.list distinct_by_key remains the single linear dedup route.

Exact-head evidence is sufficient: the new route witness is 5/5, modeled filesystem 4/4, the Hermetic boot matrix 28/28, the twelve directly affected hold/boot/KVM/reset/workflow/compiler witnesses are green, generated fleet-converge.yml is byte-identical, and exact-head required witnesses CI succeeded.

Landing precondition remains operational rather than semantic: immediately before queueing, re-read the srv1 slot and ensure no pre-merge boot or KVM observer has created a live mtcollins1-boot: or mtcollins1-kvm-observer: owner, because those intentionally become unrecognized after the durable tag recut. No code blocker remains.

@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Oct 4, 2026
Merged via the queue into main with commit e624825 Oct 4, 2026
4 checks passed
@gunbai-bot
gunbai-bot Bot deleted the session/snappy-heron-23 branch October 4, 2026 03:41
@briansrls
briansrls restored the session/snappy-heron-23 branch October 4, 2026 03:46
gunbai-bot Bot pushed a commit that referenced this pull request Oct 4, 2026
…l lift of the process-holder identity from gunbc.managed_host_unit_hold, re-apply the hold retention argument, union the recovery admit list, take main's roster retirement cause

Co-Authored-By: Claude Opus 5.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