Skip to content

Commit d7a9f0e

Browse files
committed
docs(governance): admin surface + multi-agent + sample goal matrix
1 parent 58c2489 commit d7a9f0e

1 file changed

Lines changed: 100 additions & 0 deletions

File tree

docs/src/content/docs/reference/governance.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,106 @@ Response:
335335

336336
Maps `agent_id` → `AiRequest.agentId`, each `context` entry onto `AiRequest.metadata()`. External gateways pointed at MS's ASGI app work against Atmosphere without payload translation.
337337

338+
### `GET /api/admin/governance/health`
339+
340+
Operator snapshot aggregating kill-switch state, dry-run counters, SLO
341+
status, and per-policy hash fingerprints. Admin dashboards use this as a
342+
single-fetch status endpoint.
343+
344+
### `GET /api/admin/governance/agt-verify`
345+
346+
Compliance export shaped for Microsoft's `agt verify` CLI — cross-framework
347+
findings (OWASP Agentic Top 10 + EU AI Act + HIPAA + SOC2) with per-row
348+
evidence pointers and a per-framework coverage summary. Round-trips into
349+
tooling that already consumes MS's Agent Compliance package format.
350+
351+
### `POST /api/admin/governance/reload`
352+
353+
Hot-reload a policy wrapped in `SwappablePolicy`. Body: `{swapName, yaml}`;
354+
response reports outgoing + incoming delegate identity.
355+
356+
### `POST /api/admin/governance/kill-switch/{arm,disarm}`
357+
358+
Operator break-glass. Armed state halts every admission decision in
359+
sub-millisecond time. Live verification on the startup-team sample
360+
shows the same prompt that admits at 0.11ms deny at 0.09ms while armed
361+
— no redeploy, no restart.
362+
363+
```bash
364+
curl -X POST http://localhost:8080/api/admin/governance/kill-switch/arm \
365+
-H 'Content-Type: application/json' \
366+
-d '{"reason":"incident-42","operator":"oncall"}'
367+
```
368+
369+
---
370+
371+
## Multi-agent governance
372+
373+
Single-endpoint scope is half the story — cross-agent dispatch needs the
374+
same enforcement. Atmosphere's `FleetInterceptor` SPI (in
375+
`atmosphere-coordinator`) gates every outbound `AgentCall` before it
376+
leaves the coordinator.
377+
378+
### `FleetInterceptor` SPI
379+
380+
```java
381+
public interface FleetInterceptor {
382+
Decision before(AgentCall call);
383+
sealed interface Decision {
384+
record Proceed() implements Decision {}
385+
record Rewrite(AgentCall modifiedCall) implements Decision {}
386+
record Deny(String reason) implements Decision {}
387+
}
388+
}
389+
```
390+
391+
Install via `AgentFleet.withInterceptor(interceptor)`. Denies synthesize
392+
a failed `AgentResult` without consuming the transport hop.
393+
394+
### `GovernanceFleetInterceptor`
395+
396+
Ready-made bridge that runs the full `GovernancePolicy` chain on every
397+
dispatch. A coordinator mistakenly dispatching "write Python" to its
398+
research agent gets denied at the fleet boundary, not just at the
399+
user-facing entry.
400+
401+
```java
402+
var governed = fleet.withInterceptor(new GovernanceFleetInterceptor(policies));
403+
var research = governed.agent("research").call("web_search", args);
404+
```
405+
406+
### Commitment records on cross-agent dispatch
407+
408+
When `JournalingAgentFleet.signer()` is installed and
409+
`CommitmentRecordsFlag.isEnabled()` is true (default off per v4 Phase B1),
410+
every dispatch emits a W3C Verifiable-Credential-subtype record signed
411+
with Ed25519. The admin **Commitments** tab renders verified records with
412+
a ✓ badge. Unique pairing with durable sessions: the signed audit trail
413+
survives pause-and-resume across the `CheckpointStore` — demonstrated in
414+
the [checkpoint-agent sample](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-checkpoint-agent).
415+
416+
Enable for a sample deployment:
417+
418+
```java
419+
@Bean CommitmentSigner signer() { return Ed25519CommitmentSigner.generate(); }
420+
@PostConstruct void enable() { CommitmentRecordsFlag.override(Boolean.TRUE); }
421+
```
422+
423+
---
424+
425+
## Samples applied to the 4 goals
426+
427+
| Sample | Goal 1 MS YAML | Goal 2 Scope | Goal 3 Commitments | Goal 4 OWASP |
428+
|---|:-:|:-:|:-:|:-:|
429+
| [spring-boot-ms-governance-chat](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-ms-governance-chat) | ✅ | ✅ | — | ✅ |
430+
| [spring-boot-ai-classroom](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-ai-classroom) | ✅ | ✅ | — | — |
431+
| [spring-boot-multi-agent-startup-team](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-multi-agent-startup-team) | ✅ | ✅ | ✅ | ✅ |
432+
| [spring-boot-checkpoint-agent](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-checkpoint-agent) | — | — | ✅ | — |
433+
| [spring-boot-mcp-server](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-mcp-server) | — | ✅ | — | ✅ |
434+
435+
Each sample's e2e test boots the real Spring Boot context and asserts
436+
admission decisions at runtime — no mocking at the governance seam.
437+
338438
---
339439

340440
## Audit trail

0 commit comments

Comments
 (0)