Commit ff9f2be
fix(hcg-policy): cover wired POST /cartridge/:name/sse (Phase E §1.5) (#165)
## Summary
Re-verifies `config/gateway-policy-boj-example.yaml` against the live
`BojRest.Router` for HCG tier-2 rollout (Phase E §1.5 prereq,
`standards#100`). The wired `POST /cartridge/:name/sse` route —
`elixir/lib/boj_rest/router.ex` line 130, called out in ADR-0013 §6 and
the STATE entry 2026-05-18 ("boj-rest SSE: POST /cartridge/:name/sse on
the same single Cowboy listener + trust-gated dispatch") — was absent
from the example policy. Silent surface drift since contract v1.0;
exactly the risk Phase A flagged.
- Adds `cartridge-sse-post` rule (regex
`^/cartridge/[A-Za-z0-9_.-]+/sse$`, POST, `authenticated`) alongside
`cartridge-invoke-post`. Same `BojRest.Router.check_trust/3` gate, same
per-cartridge `auth.method` requirement, streaming envelope around a
single dispatch.
- Updates the example-policy "Surface source" header to record the
2026-05-28 re-verification and point at the new rule.
- Ticks the §1.5 surface-coverage checkbox on
`docs/integration/hcg-tier2-rollout-runbook.md` with the re-verification
date; flags live-policy promotion as the remaining work before §3.1.
The unrelated top-level `/sse` GET rule (declared-not-yet-wired,
openapi.yaml only) is left in place — different path, different verb,
different surface.
### What this PR does NOT do
- Does **not** close `standards#100`. Phase E still has: gateway
smoke-test against this policy (§1.5 next box); live-policy promotion
(`config/gateway-policy-boj.yaml`); §1.4 `!OWNER:` block; Phase D-4
baseline (`bench/baseline.json _status` still `"scaffold-placeholder"`
upstream — gates the perf-regression CI alert); staging soak (§2.3);
production rollout (§3); §6.4 Trustfile flip.
- Does **not** change runtime behaviour (config-only).
## Test plan
- [x] Policy YAML re-parses (`python3 -c "import yaml;
yaml.safe_load(open('config/gateway-policy-boj-example.yaml'))"`); 27 →
28 routes; `global_verbs` still `[GET, POST]`.
- [x] Both `sse-get` (top-level, declared-not-yet-wired) and
`cartridge-sse-post` (per-cartridge, wired) appear as distinct rules
under the parsed `governance.routes` list.
- [x] All seven routes wired in `BojRest.Router`
(`/.well-known/boj-node-pubkey`, `/health`, `/menu`, `/cartridges`,
`/cartridge/:name`, `/cartridge/:name/invoke`, `/cartridge/:name/sse`)
now have a matching policy entry.
- [ ] Future (separate session, Phase E §2.1): stand the gateway up
against this policy, confirm `POST /cartridge/:name/sse` with
`X-Trust-Level: authenticated` proxies through and with `X-Trust-Level:
untrusted` returns 403. Out of scope for this PR; that flips the §1.5
smoke-test checkbox, not this one.
Refs hyperpolymath/standards#100
Refs hyperpolymath/standards#91
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---
_Generated by [Claude
Code](https://claude.ai/code/session_01EEtktiR4ynY2dMPC1nD7rv)_
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>1 parent 47c4517 commit ff9f2be
2 files changed
Lines changed: 25 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
26 | 34 | | |
27 | 35 | | |
28 | 36 | | |
| |||
120 | 128 | | |
121 | 129 | | |
122 | 130 | | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
123 | 147 | | |
124 | 148 | | |
125 | 149 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
81 | 81 | | |
82 | 82 | | |
83 | 83 | | |
84 | | - | |
| 84 | + | |
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
| |||
0 commit comments