Night Shift / Agent fleet
Agent fleet
Six specialists, six authority boundaries. An agent cannot see a tool it has no authority for, the broker refuses the call, and the service refuses it again.
Qualification and identity
A revision with no qualification record is treated as unqualified, never as probably fine
| Agent | Revision | Qualification | Traffic | Runtime | Identity | Latest drill | Tools |
|---|---|---|---|---|---|---|---|
| incident-commander | rev-1 | ACTIVE | 100% | Cloud Run (not managed Agent Runtime) | ns-commander@project-2ac1d1fb-7da1-46b4-90e.iam.gserviceaccount.comProvisioned Google service account. The gateway mints this agent's outbound OIDC token as it. | PASS1.0.0 | 5 allowed32 denied |
| signal-investigator | rev-1 | ACTIVE | 100% | Cloud Run (not managed Agent Runtime) | ns-signal@project-2ac1d1fb-7da1-46b4-90e.iam.gserviceaccount.comProvisioned Google service account. The gateway mints this agent's outbound OIDC token as it. | PASS1.0.0 | 6 allowed31 denied |
| impact-analyst | rev-1 | ACTIVE | 100% | Cloud Run (not managed Agent Runtime) | ns-impact@project-2ac1d1fb-7da1-46b4-90e.iam.gserviceaccount.comProvisioned Google service account. The gateway mints this agent's outbound OIDC token as it. | PASS1.0.0 | 6 allowed31 denied |
| capacity-broker | rev-1 | ACTIVE | 100% | Cloud Run (not managed Agent Runtime) | ns-capacity@project-2ac1d1fb-7da1-46b4-90e.iam.gserviceaccount.comProvisioned Google service account. The gateway mints this agent's outbound OIDC token as it. | PASS1.0.0 | 9 allowed28 denied |
| dispatch-agent | rev-1 | ACTIVE | 100% | Cloud Run (not managed Agent Runtime) | ns-dispatch@project-2ac1d1fb-7da1-46b4-90e.iam.gserviceaccount.comProvisioned Google service account. The gateway mints this agent's outbound OIDC token as it. | PASS1.0.0 | 10 allowed27 denied |
| custody-agent | rev-1 | ACTIVE | 100% | Cloud Run (not managed Agent Runtime) | ns-custody@project-2ac1d1fb-7da1-46b4-90e.iam.gserviceaccount.comProvisioned Google service account. The gateway mints this agent's outbound OIDC token as it. | PASS1.0.0 | 14 allowed23 denied |
What “identity” means here
Each agent has its own provisioned Google service account, and the gateway mints that agent’s outbound OIDC token as it. The permission matrix below is enforced twice in our own code: the tool broker checks it on every call, and each domain service checks it again before it acts. All 24 authorization denials recorded in the drill corpus are ours, because the corpus runs in-process where there is no network hop for Cloud Run to refuse.
One denial is Google’s. evidence/iam-denial.json records ns-dispatch taking an HTTP 403 from the Cloud Run edge on the Inventory service while ns-impact gets 200 on the same route. A broken endpoint would have refused both. That single platform denial is reported on its own and is never pooled into the corpus counts.
Agents are not registered as managed Agent Registry or Agent Runtime resources on this deployment. That is recorded on the specific claims it affects rather than glossed over. See LIMITATIONS.md.
Permission matrix
Read the gaps: the Dispatch Agent has no inventory column at all, which is what makes the poisoned-vendor drill a real denial rather than a prompt
| Agent | telemetry | inventory | capacity | facilities | custody |
|---|---|---|---|---|---|
| incident-commander | summary | — | — | — | — |
| signal-investigator | read, equipment_read | — | — | — | — |
| impact-analyst | summary | scoped_read | — | — | — |
| capacity-broker | backup_read | placement_view | read, write | — | — |
| dispatch-agent | equipment_read | — | — | read, write | — |
| custody-agent | destination_read | incident_read | read | — | read, write |
| incident-ingestor | read | write | — | — | — |
| responder-app | destination_read | incident_read | — | — | read, write |
| drill-controller | — | — | — | — | — |
Operational skills
Content-addressed procedural playbooks. The hash is the revision, so editing one changes its reference rather than rewriting history.
| Skill | Revision | Governance |
|---|---|---|
| freezer-failure-response | sha256:7a784028e4d9203d | content-addressed |
| impact-assessment | sha256:54401c2ee0955d59 | content-addressed |
| backup-capacity-placement | sha256:41f1ade4bae64c30 | content-addressed |
| after-hours-dispatch | sha256:c3977cbe3a6c413c | content-addressed |
| specimen-transfer-procedure | sha256:bdffc0636bfade5b | content-addressed |
| incident-recovery-and-closeout | sha256:9467a4ae40a17a5c | content-addressed |
Tool registry
Unregistered tools are unreachable by default
| Tool | Service | Domain | |
|---|---|---|---|
| apply_containment_hold | inventory | inventory.write | mutating |
| commit_ready_transfers | custody | custody.write | mutating |
| commit_transfer | custody | custody.write | mutating |
| create_work_order | facilities | facilities.write | mutating |
| dispatch_responder | facilities | facilities.write | mutating |
| flag_custody_exception | custody | custody.write | mutating |
| get_backup_freezer_state | telemetry | telemetry.backup_read | |
| get_capacity | capacity | capacity.read | |
| get_container_summary | inventory | inventory.scoped_read | |
| get_custody_state | custody | custody.read | |
| get_destination_temperature | telemetry | telemetry.destination_read | |
| get_dispatch_state | facilities | facilities.read | |
| get_equipment_history | telemetry | telemetry.equipment_read | |
| get_freezer_state | telemetry | telemetry.read | |
| get_hold_state | inventory | inventory.scoped_read | |
| get_incident | incident_control | incident.read | |
| get_incident_container_ids | inventory | inventory.incident_read | |
| get_incident_telemetry_summary | telemetry | telemetry.summary | |
| get_incident_timeline | incident_control | incident.read | |
| get_placement_requirements | inventory | inventory.placement_view | |
| get_recent_door_events | telemetry | telemetry.read | |
| get_reservation | capacity | capacity.read | |
| get_responder_roster | facilities | facilities.read | |
| get_study_notes | inventory | inventory.write | |
| get_temperature_window | telemetry | telemetry.read | |
| get_work_order | facilities | facilities.read | |
| list_impacted_containers | inventory | inventory.scoped_read | |
| list_qualified_destinations | capacity | capacity.read | |
| reconcile_incident | custody | custody.read | |
| record_destination_scan | custody | custody.write | mutating |
| record_pickup | custody | custody.write | mutating |
| record_repair_status | facilities | facilities.write | mutating |
| release_reservation | capacity | capacity.write | mutating |
| request_incident_close | incident_control | incident.transition | mutating |
| request_incident_transition | incident_control | incident.transition | mutating |
| reserve_capacity | capacity | capacity.write | mutating |
| send_vendor_message | facilities | facilities.write | mutating |