Skip to content

os_install_actuator_selection: match on the optional .first() (latent T? == T exposed by #13179) - #13536

Merged
gunbai-bot[bot] merged 2 commits into
mainfrom
fix/os-install-optional-eq
Oct 8, 2026
Merged

gunbai-bot[bot] merged 2 commits into
mainfrom
fix/os-install-optional-eq

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

#13179 (EqualityOptionalityMismatch) made the checker refuse T? == T. Five sites on main were never migrated and are latent: any floor subject that reaches gunbc.os_install_actuator_selection refuses them (they surfaced on #13217's floor).

  • gunbc.os_install_actuator_selection, the srv3_os_install_actuator_host_selected_because_requirements_and_policy tie-break arm: order.first() == operator_host_srv1
  • test.claim.os_install_actuator_selection: os_install_actuator_requirements_dispatch_through_kind_rows (2 sites) and srv3_actuator_host_selected_because_requirements_and_policy (2 sites)

The fix matches on the optional. It does not use == Present { value: .. }, even though the diagnostic offers that remedy first. Executed, opt == Present { value: X } evaluates false when opt is Present { value: X }. The same claim written as match opt { Present { value: X } => true _ => false } passes. Per-conjunct probes at the Present variant (claim_batch, seed evaluator): zz_a1 (kinds.first() == Present { value: BmcNetworkReach }) FAIL; zz_c1 (match on the same optional) PASS. The production predicate srv3_os_install_actuator_host_selected_because_requirements_and_policy also went false under it. So the Present remedy would have compiled clean and silently flipped a production decision. That evaluator defect is reported for separate routing; this PR does not touch it.

Receipt: executed claims at e35849b

Remote run: claim_batch at a 22 GiB cgroup bind, peak 12.9 GiB.

PASS os_install_actuator_requirements_dispatch_through_kind_rows
PASS satisfiable_selection_still_yields_the_selected_actuator_target
PASS srv3_actuator_host_failover_fixture_selects_srv2
PASS srv3_actuator_host_selected_because_requirements_and_policy
PASS srv3_actuator_selection_live_fleet_never_unsatisfiable
PASS unsatisfiable_selection_names_the_selection_not_the_inventory
PASS unsatisfiable_selection_refuses_the_nbd_proxy_serve_step
PASS unsatisfiable_selection_yields_no_actuator_target
rc=0

Mutant: the expected first kind is swapped to ActuatorToolchainGrant, and os_install_actuator_requirements_dispatch_through_kind_rows FAILs. A second mutant meant to swap the srv1/srv2 order did not change the file, because its pattern missed, so it discriminates nothing and I am not counting it.

🤖 Generated with Claude Code

… of T? == T (exposed by #13179 EqualityOptionalityMismatch)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Oct 7, 2026
…al-eq

# Conflicts:
#	dag/gunbc/os_install_actuator_selection.dag
@gunbai-bot
gunbai-bot Bot removed this pull request from the merge queue due to a manual request Oct 8, 2026
@gunbai-bot
gunbai-bot Bot added this pull request to the merge queue Oct 8, 2026
Merged via the queue into main with commit 13b9152 Oct 8, 2026
6 checks passed
@gunbai-bot
gunbai-bot Bot deleted the fix/os-install-optional-eq branch October 8, 2026 17:17
gunbai-bot Bot pushed a commit that referenced this pull request Oct 8, 2026
…reading onto the typed SystemdRunCommand

#13257 typed the enrolment-code verb (enrolment_code_issue_remote_command -> SystemdRunCommandReading,
sudo_elevate_words, Ready/Refused arms). Kept that shape whole and added only D2's facts:
- enrolment_code_issue_remote_command takes base_url and adds the APPROVAL_BROKER_BASE_URL EnvSet;
- enrolment_code_issue_remote takes host + base_url; ssh target is enrolment_code_issue_ssh_target(host);
- refuses_off_srv1 replaced by D2's enrolment_code_issue_refuses_off_broker_host (placement-derived);
- witness: main's typed the_remote_verb_words_carry_the_release_shape gains the base_url word; D2's
  placed-host claim replaces the srv1 pin claim.
fleet-converge.yml regenerated (generated_artifact_gate main_wet_one) = main + D2 host-neutral step names.

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.

0 participants