Repository navigation
Managed-host cut 4c: operation-keyed boot federation standing - #13139
Conversation
…s gunbc.auth.mtcollins1_boot_federation ManagedHostBootFederation (sole_constructor) is minted only by admit_boot_federation over a bound ManagedHost; mtcollins1 binds the live names unchanged (ruling b), any other host is BootFederationUnprovisioned and the workflow emission, census and IAM targets refuse/exclude it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…le-item grain (§4c) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
briansrls
left a comment
There was a problem hiding this comment.
Reviewed exact current head 09ee33adfd182c150c6a745684b48e522b72e734. The cut is sound.
ManagedHostBootFederation is correctly operation-keyed by its type and module. Retaining an operation field would create a second, authorable copy of the fact already carried by the type, with no consumer that legitimately branches on it. A future non-boot operation should receive its own standing rather than an enum tag beside this one.
The carrier is construction-confined and can be minted only from a real ManagedHost whose access/security join is ManagedHostBound and whose host has a boot-federation policy row. The admitted value retains the host, exact live IAM names, claim pins, and the secret grants derived from that row's secured credential reference. HostNotManaged, HostUnbound, and NoPolicy remain typed non-provisioned states rather than defaults.
The consumer migration has one authority: IAM convergence, federation provisioning, the privileged-effect census, and workflow emission all project from the admitted boot-federation population. In particular, removing the mtcollins1 policy row makes workflow emission refuse and removes the IAM target; it does not silently retain a second static route. The old mtcollins1-specific modules are deleted with no aliases.
Keeping the live pool/provider/service-account identifiers byte-identical is correct under the earlier ruling. The generated workflow comparison and the field-by-field IAM comparison support that the source recut changes ownership, not deployed identity or behavior.
The forged-literal compiler probe closes direct construction of ManagedHostBootFederation, and the host-not-managed/no-policy controls exercise the real admission path. The later head commit moves the display-name note to module-item grain and changes no semantics.
Exact-head required CI is still pending. This approval is semantic; land only after the required workflow is green and the branch is reconciled with current main.
Managed-host cut 4c (docs/plans/managed-host-untangle.md, ruling (b)).
gunbc.auth.mtcollins1_boot_federationand_provisionare deleted. The replacement is one operation-keyed authority.Shape (follows #13055)
gunbc.auth.managed_host_boot_federation:ManagedHostBootFederationis sole_constructor with fields{host, names, claim_pins, secret_grants}. Its only mint isadmit_boot_federation(host: ManagedHost).managed_host_bindingto be Bound and a row in the binding tableboot_federation_names.github-mtcollins1-boot, provider-oidc, SAmtcollins1-boot@…, environment, cell title prefix and cell description.BootFederationUnprovisioned {HostNotManaged | HostUnbound | NoPolicy}.secureBmcSecured.reference.secret(same value asmtcollins1_bmc_gunbc_secret_ref), so the unit observation enters as the ManagedHost row's value.ManagedHost.gunbc.auth.managed_host_boot_federation_provision:boot_dedicated_federation(f)takes only the admitted value.managed_host_boot_federation_provision_with_supplied_tokenprovisions every provisioned pair and refuses when there are none.heal, private, provisioned_boot_federations()…, namecheap, in the same order.Unbindablewhen unprovisioned. The site moves to the new provision entry.boot_federation_for(operator_host_mtcollins1). An unprovisioned standing refuses emission (FleetConvergeYamlGenerationRefused), on the same pattern asfleet_converge_job_needs.operationfield was dropped deliberately. The type and module name the operation (boot), so a one-arm operation enum would be a value no consumer branches on (§3c). A second operation is a second standing.managed_host_fixtureadmit_callersgains one decl, the new same-path RED.Terminal receipt
Binary
/tmp/vs611/gunbc, built from a5a9957 (cargo build --release --bin gunbc), sha2565175b040f18cb846928a2a99c92184819c5a940bfc64404ebabe043ba0806b31. Commit b991e91 contains only.dagfiles, so one binary serves head and base. Runs were made at b991e91 and at merge-base a5a9957, before the merge of main (ba69ed6, which auto-merged with no conflict in touched lines).Byte identity.
fleet-converge.yml(expected_fleet_converge_yml) iscmp-identical between head and base, at 323271 bytes. It also equals the committed.github/workflows/fleet-converge.ymlmodulo its 2-line header. The diff is empty.gcp_iam_converge_targetsrow for poolgithub-mtcollins1-bootfield by field (label, pool, display name, provider, mapping, condition, principal set, SA, SA id/display/member,secret_grantslist) against the deleted module'smtcollins1_boot_dedicated_federation(), re-hosted verbatim under a scratch name. Result: IDENTICAL. The censusmtcollins1_boot_effectmember is also identical. Target order is unchanged:github-heal-publisher, github-heal-publisher-private, github-mtcollins1-boot, github-namecheap-dns.(1) Consumer roster (plan census method, recomputed at head):
gunbc.auth.mtcollins1_boot_federation(base)gunbc.auth.mtcollins1_boot_federation_provision(base)gunbc.auth.managed_host_boot_federation…_provisionfleet_secret_accessor_rosternever imported the root, so it is not a consumer.gunbc run --claim-runresults, head vs base (pass/fail):Every red matches base claim for claim. They are pre-existing:
the_helper_argv_is_pinned_word_for_wordthe_delivered_receipt_comes_from_the_published_message_and_its_line_never_carries_the_codew_the_required_workflow_carries_both_lanesthe_mtcollins1_boot_prelude_carries_the_shared_total_boundMode check (per the #13153 triage).
gunbc run --claim-runexecutes Wet. Each of the four reds above is a plainFAIL <claim>, meaning the claim returned false, and every sibling claim in the same module PASSes under the same run. None of them prints a refusal, and nothing is a Wet refusal of a Hermetic-only realization (a mode refusal would refuse every claim in its module). So the head-vs-base comparison compares claim values.mtcollins1_boot_acceptance_matrixdoes not import any deleted or changed root, so it is not in this cut's consumer roster and was not run.sol_hold_stdin_wetwas not run. Running it in a session SIGKILLs pid 1 (the 'container restarts'), so it stays unrun until #13153 lands, and nothing is claimed about it.(2) Same-path REDs.
boot_federation_nameswas disabled (if false && …). Results:REFUSED gunbc.fleet_converge_workflow: the mtcollins1_boot mode's host has no admitted boot federation …, with no yaml emitted.heal, private, namecheap.w_a_bound_host_with_no_boot_policy_is_unprovisioned: a fixture row is renamed, it binds, and admission refuses it withNoPolicy.w_a_host_that_is_not_managed_is_unprovisioned: srv1 →HostNotManaged.SoleConstructorViolationatManagedHostBootFederation, with a class-scoped clean control.(3) Corpus sweep (
git grepacross dag, src, docs, .github, artifacts) for the deleted modules and symbols:fleet_converge_mtcollins1_boot_*: workflow-local, mode-named (cut 7). Left as is."gunbc.auth.mtcollins1_boot_federation: the one version …": a live provisioned IAM condition string (ruling b). It is kept byte-identical, and the witness asserts it.recurring_failure_mode/rest_response_nested_from_key_ignored: a dated receipt.docs/plans/managed-host-untangle.md: the plan.gunbc.non_fold_residue,gunbc.ci_specorv2.workflow.floor_unimported_bare_provider_debt_rosterentry named the deleted files, so none were changed.(4) No aliases. No module re-exports or wraps the deleted names, and no
mtcollins1_*function calls into the generic one.Cut 1 (#13121) files: the only edit is one comment line in
mtcollins1_boot_run_witness_test(535).🤖 Generated with Claude Code