Repository navigation
Auth pattern decision procedure: which authorization pattern, when (WIF / ntfy approval / manual) — selection, census, conformance row - #11734
Conversation
… selection, census, conformance row gunbc.auth.authorization_pattern_selection models "which authorization pattern performs this privileged effect" as a §3d realization selection over std.decision: the effect's characteristics (frequency, reversibility, provider surface, workload-identity binding, minted reach, billing) are the bound context parameters; custody, surface fit, identity binding and the two derived obligations (witness, unattended) are hard constraints that exclude candidates before Pareto; survivors are ranked on human actions per effect, credential scope and receipt. Three patterns are ever selected -- workload identity federation with a scoped grant, per-effect operator approval through the ntfy loop, a named human-only step -- and an operator token relayed by chat or between sessions is excluded every time by the custody constraint. gunbc.auth.privileged_effect_census classifies every privileged-effect site in dag/ by EXECUTING that selection: the three-valued §3b verdict is derived, the author states only a divergence reason. Unreasoned divergences join a ranked follow-up roster at identity grain in both directions. The conformance-leasing row is extended (not a new row) with the gunbc.auth homes and pasted-credential tells; DESIGN.md regenerated through gunbc.instruments.generated_artifact_gate main_wet_one (one bullet moved). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ccess_apply and fleet_multi_principal_probe join the follow-up roster (review 68577) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
review 68577 ( — sent from nimble-otter-774 |
…refuses a // inside a declaration body Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… census's consumer; a second route to the same predicates was inert (review 68634) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
review 68634 ( — sent from nimble-otter-774 |
…ide (review 68656); constraint evidence says what a gate does rather than what it excluded Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
review 68656 ( — sent from nimble-otter-774 |
….spark.bootstrap_provision (review 68671) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
review 68671 (citation): agreed, fixed in 2f34b3d — — sent from nimble-otter-774 |
…floor: CITED-DECLARATION-ABSENT) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…dissolution), never bare prose; the fired-trigger check is a fold and a witness (review 68720) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
review 68720 ( — sent from nimble-otter-774 |
|
review 68744: the non-blocking remark (name the input-derivation of a row's characteristics in the census's next-rung trigger) is right and is a prose edit to the roster preamble; I'm folding it into PR 2a, which edits the census anyway when it retires the first follow-ups, rather than spending another CI/review cycle here. Tally met on this head; asking the operator to land. — sent from nimble-otter-774 |
…this head Review 69227: the rows' boundary and red-control text cited gunbc.auth.privileged_effect_census, gunbc.auth.authorization_pattern_selection and gunbc.cloudflare.r2_bucket_ensure, which resolve only once #11734 and #11721 merge, and the plan page asserted them as landed. Each citation now names the PR it lands with, and the page separates what executed from what is approved and unmerged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Which authorization pattern, and when — one decision procedure under
gunbc.authTrigger (operator, 2026-09-19). The R2 origin work (#11713, #11721) minted Cloudflare tokens and created Secret Manager containers under an operator GCP access token pasted into chat three times and relayed between sessions by message. The same day the ntfy approval loop executed on hardware (fleet-converge run 35447067113: request → phone tap → capability redeemed → BMC credential minted) and workload identity federation had been fetching credentials for dispatched runs (boot run 35249658152). Three patterns existed; nothing told an author which to use.
What lands here (PR 1 of a sequence — model, census, conformance row; no call-site migration).
gunbc.auth.authorization_pattern_selection— the decision procedure as a §3d realization selection. It consumesstd.decision select_realization(no second decision algebra): the privileged effect is the subject, its characteristics are the bound context parameters, the laws are hard constraints that exclude candidates before Pareto, and the survivors are ranked on three funded axes (human actions per effect, credential scoped to the resource, receipt in the substrate). Output isPatternSelected { pattern, receipt },ManualStepRequired { step, receipt }(the (c) arm: a typed refusal naming thestd.human_interventionrow), or std.decision's refusal arms carried through.gunbc.auth.privileged_effect_census— every privileged-effect site indag/(module + symbol, verified against each file'smoduleline), each with its effect characteristics and what it realizes today. The three-valued verdict is derived, not authored: the fold runs the selection over each row and compares; the author may state a divergence reason, never the verdict. The unreasoned divergences are joined at identity grain against a rankedfollow_up_sitesroster in both directions (a new silent divergence is red; a paid one whose row was not retired is red). A stated reason is a typedDivergenceReason { statement, dissolution }overstd.dissolution: bound triggers name the declaration whose retirement fires them (checked by the floor's citation gate), unbound ones name the capability that would; the witness asserts no reasoned divergence's trigger has fired.conformance-leasingingunbc.design_argument conformance_domainsextended (not a new row: "who may do this and how was it granted" is one question) with thegunbc.authselection, federation, grant, request, capability, redemption, token-source and census homes, and four pasted-credential tells. This regenerates DESIGN.md — load-bearing. Regen procedure followed:./target/release/gunbc run --source-root dag --source-root src/v2 --entry dag/gunbc/instruments/docs_projection_gate.dag --function regen, run on a clean tree first (byte-identical) and again after the row edit; only the files this change owns moved.test.claim.authorization_pattern_selection_witness— fixtures at the interface for each arm, plus the inhabitance claims that run the real census through the real fold.The procedure
(d)
OperatorOwnSession— the operator's own interactive gcloud or own token file — is in the field and is always dominated (one human action like (b), project-wide credential unlike (b), no receipt unlike (b)); its exclusion is computed by the fold, not by a rule someone could delete, so a site still on it classifies as diverges rather than unclassifiable.What replaces pasting an operator token. A dispatched run: (a) — it already has an identity (
WIF_ACCESS_TOKEN), and needs cells, not a token. A one-off control-plane effect in a session (accessor-cell grants, container creation, irreversible mints): (b) — file the request, tap, and the effect executes under the authority adapter's identity. Until the adapter for GCP IAM / Cloudflare effects lands (first executing consumer: #11484), the interim is the grant administrator's own session on the grant administrator's own workstation, marked diverges-with-reason in the census — and relaying that token through chat or a message into another session'sGUNBC_GCP_ACCESS_TOKEN_FILEis the refused pattern. The substrate cannot see how a file was filled, so the conformance tell is the reviewer's.Census (derived by executing the selection over the roster; the consumer is
test.claim.authorization_pattern_selection_witness—every_census_site_is_decidableandunreasoned_divergences_join_the_follow_up_roster_exactly; the table below was read off the same fold through the interpreter)gunbc.auth.patternscredential_chaingunbc.auth.heal_publisher_federationheal_publisher_wif_poolgunbc.runner.runner_jit_performdispatch_jit_mintgunbc.tools.bmc_health_reader_convergebmc_health_reader_convergegunbc.tools.bmc_onboardbmc_converge_credential_selectedgunbc.cloudflare.r2_permission_group_observeobserve_account_permission_groups_standinggunbc.cloudflare.r2_token_mintcloudflare_account_token_bootstrap_interventiongunbc.cloudflare.r2_token_mint_runr2_mint_bootstrapgunbc.cloudflare.r2_mint_secret_accessr2_mint_bootstrap_read_access_converge(+3 cells; #11721 adds threer2_bucket_admin_*_access_convergecells of the same class)gunbc.auth.fleet_secret_accessor_rosterfleet_accessor_grants_converge_with_supplied_tokengunbc.spark.secret_access_ensurespark_secret_access_convergegunbc.fleet.org_actions_convergeorg_admin_app_key_access_converge_with_supplied_tokengunbc.auth.heal_publisher_provisionheal_publisher_federation_provision_with_supplied_tokengunbc.fleet.printer_credential_migration_runrungunbc.auth.approval_mac_key_provisionprovision_approval_mac_keysgunbc.assimilate.bmc_bootstrap_provisionbmc_bootstrap_provision_srv3ensure_access_token_eager_bootstrap_fork_dissolve_on)gunbc.gcp_estate_read_instrumentgcloud_read_argvgunbc.auth.credentialsgcp_secret_credentialgunbc.bmc_fan_convergebmc_fan_rungunbc.srv3_bmc_credential_resolvematerialize_bmc_login_passwordgunbc.tools.bmc_onboardsrv3_converge_credential(+srv4, probe)gunbc.fleet.printer_delivery_wet_runruntools.fabric_m0_origin_object_probeprobe_token_sourcegunbc.spark.managed_access_applyspark_managed_access_apply_wetgunbc.fleet_multi_principal_probefleet_multi_principal_probe_with_attemptKernels parameterized by a token source (
gunbc.auth.gcp_secret_access secret_access_ensure_for,gunbc.auth.secret_ref_credential,gunbc.auth.secret_rotation,gunbc.secret_provision_actuator,gunbc.fleet_printer_access) choose nothing and are not rows. Completeness of the roster is not claimed: the population was enumerated by grep on 2026-09-19 and a discovery join that refuses an unrostered site is the named next rung (same triggergunbc.host_convergence_censusnames).Two things the fold corrected in my first cut (kept as receipts)
NoAdmissiblePattern. That was a §4d over-prohibition — retry safety isstd.effects' concern, consent is reversibility's — so idempotency is not a characteristic here.SelectionNeedsPolicy). They now read as obligation met relative to the effect.Follow-ups (operator-widened scope: migrate in rank order, sequenced PRs)
r2_token_mint_runrun / run_object_write / Converge R2 entitlement + bucket existence for every allocated origin purpose #11721's bucket-admin profile) — dispatched fleet run stays (a); one-off mints route through (b). Requires the approval loop's executing authority adapter for Cloudflare/GCP effects (first consumer approval loop D: converge materialization, loopback bind, mtcollins1_boot mode #11484). Coordinated with sharp-ant-20 (messaged; I do not edit its branch).follow_up_sitesabove, in roster order — mostly one seam each:GcloudPrintToken/read_supplied_access_tokenspelled in the entry →resolve_access_token.Not done here / honest limits
heal_publisher_federationis cited by its pool declaration because the module is declarations, not an entry.gunbc.authare not inrequired_gate_prefixes; this one follows its siblings.Do not self-merge — operator to land.
🤖 Generated with Claude Code