Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
7b98166
deployment risk: gunbc.deployment_risk model, HostDashboardInstance.d…
Oct 3, 2026
3f8a470
deployment risk witness: cite the failure-mode row
Oct 3, 2026
0ae0948
dashboard instance: place deployment inside the macbook literal
Oct 3, 2026
cfe8304
docs/plans: deployment-risk conformance plan and shared-binding table
Oct 3, 2026
909405e
deployment_risk: defer the harm bet and interface roster to their fir…
Oct 4, 2026
c35c4c0
deployment_risk: attach the deferred-interface annotation to the reso…
Oct 4, 2026
85904b1
deployment risk D2: role-following singletons resolve the prod-role h…
Oct 4, 2026
392b28e
deployment_risk: DeploymentId identifies the Deployment, it is not th…
Oct 4, 2026
0db6141
Merge remote-tracking branch 'origin/session/merry-tern-58' into sess…
Oct 4, 2026
97a3164
D2 witnesses: 'none' is a keyword; rename locals
Oct 4, 2026
1e64948
deployment_risk: key the binding table by class so a duplicate set is…
Oct 4, 2026
521e073
Merge remote-tracking branch 'origin/session/merry-tern-58' into sess…
Oct 4, 2026
35dcd87
D2: one holder-identity comparison, prod_role_realized_by, consumed b…
Oct 4, 2026
ddff566
D2 re-rule: role singletons as one token-built subject with a converg…
Oct 4, 2026
7e9653c
Merge remote-tracking branch 'origin/main' into session/merry-tern-58
Oct 4, 2026
c4e830f
Merge origin/main; pass deployment at the four isolated_dashboard_ins…
Oct 4, 2026
5070559
Merge session/merry-tern-58 (main) into D2; approval broker address f…
Oct 4, 2026
74c62bf
serve_function control probes /instance.json, the per-instance identi…
Oct 4, 2026
f617d9d
D2: the role decides where the broker is installed; broker-side modul…
Oct 4, 2026
ee1d602
plan: D4 naming residue for srv1_gunbc_approval_broker_root
Oct 4, 2026
87c68a8
approval broker: serve-time host from /proc/sys/kernel/hostname (leaf…
Oct 4, 2026
5a4dc75
D2: the broker is GIVEN its base URL (root fix for the serve-time hos…
Oct 4, 2026
c2b57b5
fleet-converge: broker-host steps say 'on the approval broker host' (…
Oct 4, 2026
a9eded9
fleet-converge.yml regenerated (main_wet_one; byte-identical to gener…
Oct 4, 2026
02bc337
Merge origin/main (D1 #13130 squashed as 072c37b6) into D2; operator_…
Oct 4, 2026
ab8a047
emit_test: the #12912 preamble claim's DeploymentSpec literal carries…
Oct 4, 2026
776c407
role_singleton_convergence: enumerate EntryPresence arms (floor NonFo…
Oct 4, 2026
b5c62d9
D2 re-rule blockers 1-5: admitted spec token, desired-side refusals, …
Oct 4, 2026
8c7af3a
Merge origin/main into D2 (fleet-converge.yml: main's bytes + the thr…
Oct 4, 2026
2c6127d
serve_function control: one claim per instance + a roster-coverage cl…
Oct 4, 2026
e896bbf
Merge remote-tracking branch 'origin/main' into session/sharp-heron-165
Oct 4, 2026
6a7645c
D2 adoption: only the holder spec on the observed host is admitted; a…
Oct 4, 2026
78dfeea
Merge origin/main into D2 (HostIdentity now from product.host_identity)
Oct 4, 2026
d3c0384
roadmap_launch_deployment_receipt witness: import RoleSingletonsNoop …
Oct 4, 2026
b53d446
Merge remote-tracking branch 'origin/main' into session/sharp-heron-165
Oct 4, 2026
0af076d
Merge origin/main; retire every bare-provider row of the receipt witn…
Oct 4, 2026
8b04822
deployment_risk witness: the adopt arm's retirement row is compared b…
Oct 4, 2026
c698dbd
D2 adoption authority: admission mint sealed to the observing assesso…
Oct 4, 2026
2ef9541
plan: adoption window is one apply long (retire the legacy row after …
Oct 4, 2026
973b56f
D2 adoption: a LegacyAdoptionRecord (own type) written only by the ad…
Oct 4, 2026
17b8bbc
deployment_risk witness: blocking-row count through compile_diagnosti…
Oct 4, 2026
9660e3f
D2: drop automated adoption; unmarked legacy store refuses naming the…
Oct 4, 2026
bf16896
Merge origin/main into D2 (apply imports: both sides; fleet-converge.…
Oct 4, 2026
ee1d7e6
D2 effect boundary: LiveDeployApply carries a sole_constructor Admitt…
Oct 4, 2026
eba4db2
D2 round 9: production apply takes a DesiredDeployment and builds its…
Oct 4, 2026
947702b
deployment_risk witness: the control directory admits the marker obse…
Oct 5, 2026
89387bd
Merge origin/main into D2 (tailnet door + TailscaleServeMapping steps…
Oct 5, 2026
c07cf7e
D2: cross-host observation is host self-report (operator ruling 2026-…
Oct 5, 2026
8e4a0ee
role_singleton_convergence: dedup through std.list distinct_by_key (n…
Oct 5, 2026
a514620
deployment_risk witness: the spec-route probes compile only gunbc.liv…
Oct 5, 2026
3b04d32
Merge remote-tracking branch 'origin/main' into session/sharp-heron-165
Oct 5, 2026
7ec01bb
deployment_risk witness: the spec-route probe targets the unsealed pr…
Oct 5, 2026
ffdd800
role_singleton_convergence: the D2 interim reading source is local-on…
Oct 5, 2026
290395e
Merge origin/main into D2: the approval client dials the declared wri…
Oct 5, 2026
67cc529
approval origin carries the holder's host; approval_gate dials only t…
Oct 5, 2026
c4deed6
approval client witness: no-prod-role helper as a declared fn
Oct 5, 2026
df94130
approval origin: pure classify_approval_origin returns a standing, no…
Oct 5, 2026
25dc637
compile probes: one forged-routes source per witness file, each claim…
Oct 5, 2026
e542601
Merge origin/main into D2 (fleet-converge.yml: main + host-neutral st…
Oct 5, 2026
bfb2ee9
Merge origin/main into D2 (launch-deployment receipt witness: keep D2…
Oct 6, 2026
6c4106d
fleet-converge gcp-iam refused job: the script is bash_build nodes em…
Oct 6, 2026
57129b0
apply: LiveDeployApplyReported arm in live_deploy_pre_mutation_access…
Oct 6, 2026
523e714
Merge origin/main into D2 (#13437 landed; fleet-converge.yml: main + …
Oct 6, 2026
72d6a05
Merge origin/main into D2 (#13466 landed: typed exclusion of unmodele…
Oct 7, 2026
95185fd
Merge origin/main into D2 (#13536 + #13257): port D2's broker-host th…
Oct 8, 2026
777cbea
enrolment witness: the moved-srv2 arm exercises the broker-host refus…
Oct 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/fleet-converge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1543,7 +1543,7 @@ jobs:
compression-level: 0
if: always() && github.event.inputs.mode == 'workspace_checkpoint_restore'
timeout-minutes: 10
- name: Materialize approval MAC keys on srv1 (SM pinned -> sha256 prefix -> /etc/gunbc-roadmap 0640)
- name: Materialize approval MAC keys on the approval broker host (SM pinned -> sha256 prefix -> /etc/gunbc-roadmap 0640)
id: approval_keyring_converge
run: |-
# 🟡 dissolve-on: gunbc_ci_approval_keyring_converge_invoke - orch-emitted foreign-executor (GitHub Actions run:) credential runner: WIF access token by env, two PINNED secret versions (capability and submission MAC keys) fetched over curl, 0600 files under RUNNER_TEMP with a trap armed BEFORE the credentials touch disk. The pipeline steps are modeled (gunbc_ci_approval_keyring_converge_prelude) but the runner transport itself remains hand-shell; DISSOLVES WHEN the runner is authored as v2.extdeps.languages.bash_build nodes (typed, grammar-quoted words; command substitution; assignment; pipe; if/test; redirect; || true) emitted by v2.workflow.bash_emit bash_emit_stmts -- a route AVAILABLE today (#12422 retired the sibling pack runner on it), so this migration is unauthored, not blocked on a missing capability; set -euo pipefail, umask, export and trap are ordinary commands on that route, and the trap body is itself built from nodes and passed as one grammar-quoted word, so no new orchestration intent is a prerequisite
Expand Down Expand Up @@ -1572,7 +1572,7 @@ jobs:
FLEET_CONVERGE_EXPECTED_HOST: ${{ github.event.inputs.host }}
if: github.event.inputs.mode == 'approval_keyring_converge'
timeout-minutes: 5
- name: Issue a device enrolment code on srv1 and deliver it to the operator channel (receipt only in this log)
- name: Issue a device enrolment code on the approval broker host and deliver it to the operator channel (receipt only in this log)
id: approval_device_enrolment_code_issue
run: |-
ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
Expand Down Expand Up @@ -3052,7 +3052,7 @@ jobs:
env:
RELEASE_BINS_KEY: ${{ needs.build.outputs.release_bins_key }}
timeout-minutes: 5
- name: Install the approval broker dark on srv1 (additive unit + slice; does not restart gunbc-roadmap.service)
- name: Install the approval broker dark on the approval broker host (additive unit + slice; does not restart gunbc-roadmap.service)
id: approval_broker_dark_install
run: |-
ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
Expand Down
16 changes: 16 additions & 0 deletions dag/extdeps/shell.dag
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,22 @@ service shell.Stat {
nonzero => String "stat could not read the path"
}
}

operation GroupOf {
requires none
input { path: FilePath }
output {
success: Bool from "exit_success"
stdout: String from "stdout"
stderr: String from "stderr"
}
readonly
transport shell { argv: ["stat", "-c", "%G", "--", "{path}"] }
exit {
0 => Unit "the path exists and its owning group is on stdout"
nonzero => String "stat could not read the path"
}
}
}

service shell.Move {
Expand Down
14 changes: 9 additions & 5 deletions dag/gunbc/approve_ios_project.dag
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ import extdeps.apple.build_settings {
MarketingVersion, CurrentProjectVersion
}
import gunbc.auth.approval_app_attest_config { approval_app_bundle_id, approval_app_bundle_version }
import gunbc.auth.approval_broker_endpoint { approval_broker_public_host_from, approval_broker_public_port }
import gunbc.auth.approval_broker_endpoint { approval_broker_public_port, ApprovalBrokerAddressResolved, ApprovalBrokerAddressRefused }
import gunbc.auth.approval_broker_placement { approval_broker_public_host_from }
import gunbc.fleet_intent_network { fleet_intent_network }
import extdeps.apple.xcode { xcode_26_6 }
import extdeps.xcodegen.project_spec {
Expand Down Expand Up @@ -45,7 +46,7 @@ import extdeps.languages.yaml.emit { emit_yaml, EmittedYaml, YamlEmitRefused, ya
// server_host ApproveServerHost -- read by ServerConfig at launch.
// apns_environment ApproveApnsEnvironment -- read by ServerConfig at launch.
// apns_environment is xcconfig-substituted from Config/Team.xcconfig. server_host is NOT: it is the
// broker's public host (gunbc.auth.approval_broker_endpoint approval_broker_public_host_from), the
// broker's public host (gunbc.auth.approval_broker_placement approval_broker_public_host_from), the
// same composition the approval links are issued against, written into the spec as a value. It was
// an operator-typed APPROVE_SERVER_HOST, a second authority for where the broker answers.
type ApproveAppInfo {
Expand Down Expand Up @@ -194,9 +195,12 @@ fn approve_ios_project_yml_from(domain: NonEmptyStr?, port: Port?) -> ApproveIos
"gunbc.approve_ios_project: approval_broker_public_port is ", to_string(p),
" and the app's ServerConfig carries no port; project it (an ApproveServerPort Info.plist key read by gunbc.approve_ios_swift_wire ServerConfig) before publishing the broker off the default TLS listener"
], "") }
Absent => match emit_yaml(v: project_spec_yaml(p: approve_ios_project_spec(server_host: approval_broker_public_host_from(domain: domain)))) {
EmittedYaml { text: t } => ApproveIosProjectGenerated { content: concat(approve_ios_project_header, t) }
YamlEmitRefused { path: p, reason: r } => ApproveIosProjectRefused { reason: yaml_emit_refusal_text(module_path: "gunbc.approve_ios_project", path: p, reason: r) }
Absent => match approval_broker_public_host_from(domain: domain) {
ApprovalBrokerAddressRefused { detail } => ApproveIosProjectRefused { reason: join(["gunbc.approve_ios_project: ", detail as String], "") }
ApprovalBrokerAddressResolved { value: host } => match emit_yaml(v: project_spec_yaml(p: approve_ios_project_spec(server_host: host))) {
EmittedYaml { text: t } => ApproveIosProjectGenerated { content: concat(approve_ios_project_header, t) }
YamlEmitRefused { path: p, reason: r } => ApproveIosProjectRefused { reason: yaml_emit_refusal_text(module_path: "gunbc.approve_ios_project", path: p, reason: r) }
}
}
}
}
Expand Down
51 changes: 37 additions & 14 deletions dag/gunbc/auth/approval_broker_endpoint.dag
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import extdeps.tailscale.serve {
import extdeps.external_authority { ExternalAuthority, CitedFigureStanding, CitedToAuthority, TranscribedUncited }
import gunbc.fleet_tailnet { fleet_tailnet_domain, tailnet_base_url_from, tailnet_host_from }
import gunbc.serve_liveness { serve_liveness_path }
import gunbc.srv1_dashboard_bind { srv1_dashboard_host_identity }
import extdeps.shell
import v2.std.collection { Present, Absent }
import gunbc.auth.approval_device_wire { approval_device_request_path_prefix, approval_device_enrollment_path_prefix }

// ── WHERE THE APPROVAL BROKER ANSWERS ────────────────────────────────────────────────────────
Expand Down Expand Up @@ -95,12 +96,6 @@ data approval_broker_listen_port: Port = 8085
// door is the only public path" true rather than merely intended.
data approval_broker_listen_host: NonEmptyStr = "127.0.0.1"

// THE HOST THE BROKER RUNS ON, derived from the instance that owns its unit rather than spelled: a
// run that files and polls over the loopback approval client (the GCP IAM converge job) has to run
// there.
fn approval_broker_host_identity() -> NonEmptyStr {
srv1_dashboard_host_identity
}

fn approval_broker_loopback_base_url(port: Port) -> NonEmptyStr {
join(["http://", approval_broker_listen_host as String, ":", to_string(port)], "") as NonEmptyStr
Expand Down Expand Up @@ -235,15 +230,43 @@ data approval_broker_front_door_path_preservation: CitedFigureStanding = Transcr
// (gunbc.approve_ios_project) -- read one port rather than each assuming 443.
data approval_broker_public_port: Port? = none

fn approval_broker_base_url_from(domain: NonEmptyStr?) -> NonEmptyStr {
tailnet_base_url_from(host: approval_broker_host_identity(), domain: domain, port: approval_broker_public_port)
}
// THE BROKER'S PUBLIC ADDRESS ON A GIVEN HOST. Which host is a placement fact, not this module's:
// the prod role decides WHERE the broker is installed (gunbc.auth.approval_broker_placement, over
// gunbc.live_deploy.spec RoleSingletonHolding), and a broker-side reader receives the host it was
// installed on rather than resolving the role -- so the broker's closure never reaches the instance
// roster (#13132).
type ApprovalBrokerAddress
= ApprovalBrokerAddressResolved { value: NonEmptyStr }
| ApprovalBrokerAddressRefused { detail: NonEmptyStr }

fn approval_broker_base_url() -> NonEmptyStr {
approval_broker_base_url_from(domain: fleet_tailnet_domain)
fn approval_broker_base_url_on(host: NonEmptyStr, domain: NonEmptyStr?) -> NonEmptyStr {
tailnet_base_url_from(host: host, domain: domain, port: approval_broker_public_port)
}

// THE BARE HOST OF THAT SAME ADDRESS, for a client that composes scheme, host and path itself.
fn approval_broker_public_host_from(domain: NonEmptyStr?) -> NonEmptyStr {
tailnet_host_from(host: approval_broker_host_identity(), domain: domain)
fn approval_broker_public_host_on(host: NonEmptyStr, domain: NonEmptyStr?) -> NonEmptyStr {
tailnet_host_from(host: host, domain: domain)
}

// THE SERVING BROKER'S OWN ADDRESS IS GIVEN, NOT DISCOVERED. Placement already knows which host the
// broker is installed on (gunbc.auth.approval_broker_placement, from the prod-role holder token the
// spec carries), so the emitter binds the base URL into the process's environment: the broker unit's
// Environment= line (gunbc.live_deploy.emit) and the enrolment verb's env prefix
// (gunbc.auth.approval_device_enrolment_code_issue). The broker reads the value it was given -- no
// host-effect read, so its closure never reaches the instance roster (#13132) and there is one
// authority for where it runs. An unset binding, or one that is not an https URL (the emitter's
// refusal marker), refuses; it is never replaced by a host.
data approval_broker_base_url_env_name: NonEmptyStr = "GUNBC_APPROVAL_BROKER_BASE_URL"

fn approval_broker_serving_base_url_of(bound: String?) -> ApprovalBrokerAddress {
match bound {
Present { value: v } =>
if starts_with(s: v, prefix: "https://") { ApprovalBrokerAddressResolved { value: v as NonEmptyStr } }
else { ApprovalBrokerAddressRefused { detail: join(["approval broker address unresolved: ", approval_broker_base_url_env_name as String, " is bound to '", v, "', not an https URL"], "") as NonEmptyStr } }
Absent => ApprovalBrokerAddressRefused { detail: join(["approval broker address unresolved: ", approval_broker_base_url_env_name as String, " is not bound in this process"], "") as NonEmptyStr }
}
}

fn approval_broker_serving_base_url() -> ApprovalBrokerAddress {
approval_broker_serving_base_url_of(bound: shell.Env.Get(name: approval_broker_base_url_env_name).value)
}
70 changes: 70 additions & 0 deletions dag/gunbc/auth/approval_broker_placement.dag
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
module gunbc.auth.approval_broker_placement

import gunbc.live_deploy.desired { prod_role_actuated_realization }
import std.types { NonEmptyStr }
import gunbc.roadmap_dashboard_instance {
ProdRoleHolder,
ProdRoleRealization,
ProdRoleRealizedBy,
ProdRoleRealizationRefused,
ProdRoleRealizationRefusal,
prod_role_realization,
prod_role_realization_refusal_detail,
}
import gunbc.auth.approval_broker_endpoint {
ApprovalBrokerAddress,
ApprovalBrokerAddressResolved,
ApprovalBrokerAddressRefused,
approval_broker_public_host_on,
approval_broker_base_url_on,
}
import gunbc.fleet_tailnet { fleet_tailnet_domain }

// WHERE THE APPROVAL BROKER IS INSTALLED, for readers OUTSIDE the broker process: the GCP IAM
// converge job that must run beside it (gunbc.fleet_converge_workflow) and the approvals app's build
// config (gunbc.approve_ios_project). It is the host of the prod-role holder -- the same token
// (gunbc.roadmap_dashboard_instance ProdRoleHolder) from which gunbc.live_deploy.spec builds the
// broker's unit, so the job and the app name the host the unit is actually on. Under a refused
// realization there is no such host and each reader refuses through its own arm.
//
// This module is deliberately NOT imported by any broker-side module (gunbc.auth.approval_broker_endpoint,
// approval_decision_store, approval_request_submission, approval_device_enrolment_code): the broker
// receives its own host at serve time (approval_broker_serving_base_url) and never reaches the
// instance roster, which keeps the native broker's closure as #13132 narrowed it.
type ApprovalBrokerHost
= ApprovalBrokerHostResolved { host: NonEmptyStr }
| ApprovalBrokerHostRefused { cause: ProdRoleRealizationRefusal }

fn approval_broker_host_under(realization: ProdRoleRealization) -> ApprovalBrokerHost {
match realization {
ProdRoleRealizedBy { holder } => ApprovalBrokerHostResolved { host: holder.instance.host_identity }
ProdRoleRealizationRefused { cause } => ApprovalBrokerHostRefused { cause: cause }
}
}

fn approval_broker_public_host_under(realization: ProdRoleRealization, domain: NonEmptyStr?) -> ApprovalBrokerAddress {
match approval_broker_host_under(realization: realization) {
ApprovalBrokerHostResolved { host } => ApprovalBrokerAddressResolved { value: approval_broker_public_host_on(host: host, domain: domain) }
ApprovalBrokerHostRefused { cause } =>
ApprovalBrokerAddressRefused { detail: ("approval broker address unresolved: " + prod_role_realization_refusal_detail(cause: cause)) as NonEmptyStr }
}
}

// THE BASE URL THE BROKER IS GIVEN, from the holder token itself: the emitter binds it into the unit
// and the enrolment verb's environment (gunbc.auth.approval_broker_endpoint
// approval_broker_base_url_env_name), so the serving broker never resolves its own host.
fn approval_broker_base_url_of_holder(holder: ProdRoleHolder) -> NonEmptyStr {
approval_broker_base_url_on(host: holder.instance.host_identity, domain: fleet_tailnet_domain)
}

fn approval_broker_base_url_under(realization: ProdRoleRealization) -> ApprovalBrokerAddress {
match realization {
ProdRoleRealizedBy { holder } => ApprovalBrokerAddressResolved { value: approval_broker_base_url_of_holder(holder: holder) }
ProdRoleRealizationRefused { cause } =>
ApprovalBrokerAddressRefused { detail: ("approval broker address unresolved: " + prod_role_realization_refusal_detail(cause: cause)) as NonEmptyStr }
}
}

fn approval_broker_public_host_from(domain: NonEmptyStr?) -> ApprovalBrokerAddress {
approval_broker_public_host_under(realization: prod_role_actuated_realization(), domain: domain)
}
5 changes: 4 additions & 1 deletion dag/gunbc/auth/approval_broker_serve.dag
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import gunbc.clock_read { clock_now_probed_at }
import gunbc.auth.approval_request_submission {
admit_parsed_submission, SubmissionVerified, SubmissionNotAdmitted, file_and_notify, submission_outcome_http_body, read_submission_keyring, read_publisher_token, escalation_status,
parse_submission_envelope, SubmissionEnvelopeParsed, SubmissionEnvelopeUnreadable,
SubmissionFiledAndNotified, SubmissionFiledNotNotified, SubmissionFiledPublisherTokenUnavailable, SubmissionFiledLinksNotIssued,
SubmissionFiledAndNotified, SubmissionFiledNotNotified, SubmissionFiledPublisherTokenUnavailable, SubmissionFiledLinksNotIssued, SubmissionFiledBrokerAddressRefused,
SubmissionAlreadyFiled, SubmissionStoreRefused, SubmissionRefused, SubmissionFiledCapabilityKeyUnavailable,
SubmissionUnreadable, SubmissionKeyUnavailable, SubmissionNotEnrolled, SubmissionAuthorityRefused,
}
Expand Down Expand Up @@ -51,6 +51,7 @@ import gunbc.auth.approval_broker_endpoint {
approval_device_request_path_template,
approval_device_enrollment_path_template,
approval_broker_listen_host,
approval_broker_serving_base_url,
}
import gunbc.auth.approval_device_wire { approval_device_enrol_path, approval_device_redeem_path, approval_device_pending_path, approval_device_push_path }
import gunbc.auth.approval_device_routes {
Expand Down Expand Up @@ -414,6 +415,7 @@ fn approval_submit_admitted_response(request: ServeHttpRequest<RequestAccessPath
capability_keyring: read_approval_keyring(),
publisher: read_publisher_token(),
request: admitted,
broker: approval_broker_serving_base_url(),
)
}
}
Expand All @@ -422,6 +424,7 @@ fn approval_submit_admitted_response(request: ServeHttpRequest<RequestAccessPath
SubmissionFiledNotNotified { escalation_id: _, publish: _ } => 502
SubmissionFiledPublisherTokenUnavailable { escalation_id: _, detail: _ } => 503
SubmissionFiledLinksNotIssued { escalation_id: _, key_id: _ } => 503
SubmissionFiledBrokerAddressRefused { escalation_id: _, detail: _ } => 503
SubmissionAlreadyFiled { escalation_id: _ } => 409
SubmissionStoreRefused { detail: _ } => 503
SubmissionRefused { refusal: v } => match v {
Expand Down
Loading
Loading