@bongos/core 1.21.177 → 1.21.179

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/.bongos-core.json +147 -152
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +0 -6
  4. package/clients/bongos-client/index.cjs +0 -6
  5. package/clients/bongos-client/index.d.ts +0 -6
  6. package/clients/bongos-client/index.mjs +0 -6
  7. package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +3 -2
  8. package/docs/api/openapi.json +1 -87
  9. package/docs/api-reference.md +1 -8
  10. package/docs/canonical-permissions.md +3 -3
  11. package/docs/copy-inventory.md +50 -64
  12. package/docs/copy-registry.json +109 -236
  13. package/docs/file-map.md +3 -3
  14. package/docs/module-api-changelog.md +4 -0
  15. package/docs/modules-contract.md +2 -2
  16. package/docs/page-inventory.json +4 -7
  17. package/docs/page-readings.json +1520 -1569
  18. package/modules/government/catalog.js +10 -7
  19. package/modules/government/decision-board.js +0 -1
  20. package/modules/government/decision-rules.js +0 -1
  21. package/modules/government/docket.js +0 -1
  22. package/modules/government/protected-surfaces.js +1 -1
  23. package/modules/government/protected-surfaces.json +2 -3
  24. package/modules/hall-ui/public/atlas.html +1 -1
  25. package/modules/hall-ui/public/blockers.html +1 -1
  26. package/modules/hall-ui/public/board-room.html +1 -1
  27. package/modules/hall-ui/public/city.html +1 -1
  28. package/modules/hall-ui/public/collab.html +1 -1
  29. package/modules/hall-ui/public/commands.html +1 -1
  30. package/modules/hall-ui/public/copy-desk.html +1 -1
  31. package/modules/hall-ui/public/deploy.html +1 -1
  32. package/modules/hall-ui/public/diagrams.html +1 -1
  33. package/modules/hall-ui/public/drachmae.html +1 -1
  34. package/modules/hall-ui/public/fleet.html +1 -1
  35. package/modules/hall-ui/public/gate.css +4 -26
  36. package/modules/hall-ui/public/gate.html +12 -27
  37. package/modules/hall-ui/public/gate.js +26 -176
  38. package/modules/hall-ui/public/gate.states.json +4 -22
  39. package/modules/hall-ui/public/goal-map.html +1 -1
  40. package/modules/hall-ui/public/goals.html +1 -1
  41. package/modules/hall-ui/public/government.html +1 -1
  42. package/modules/hall-ui/public/idea.html +1 -1
  43. package/modules/hall-ui/public/ideas.html +1 -1
  44. package/modules/hall-ui/public/index.html +1 -1
  45. package/modules/hall-ui/public/modules.html +1 -1
  46. package/modules/hall-ui/public/my-agents.html +1 -1
  47. package/modules/hall-ui/public/primer.html +1 -1
  48. package/modules/hall-ui/public/profile.html +1 -1
  49. package/modules/hall-ui/public/project-settings.html +1 -1
  50. package/modules/hall-ui/public/ranks.html +1 -1
  51. package/modules/hall-ui/public/roadmap.html +1 -1
  52. package/modules/hall-ui/public/roster.html +1 -1
  53. package/modules/hall-ui/public/sessions.html +1 -1
  54. package/modules/hall-ui/public/settings.html +1 -1
  55. package/modules/hall-ui/public/shell.js +1 -1
  56. package/modules/hall-ui/public/street-card.js +5 -9
  57. package/modules/hall-ui/public/street-desk.js +2 -2
  58. package/modules/hall-ui/public/street-inside.js +1 -1
  59. package/modules/hall-ui/public/street.html +1 -1
  60. package/modules/hall-ui/public/studio.html +1 -1
  61. package/modules/hall-ui/public/task.html +1 -1
  62. package/modules/hall-ui/public/thinking.html +1 -1
  63. package/modules/hall-ui/public/tweak-editor.html +1 -1
  64. package/modules/hall-ui/public/watch.html +1 -1
  65. package/modules/hall-ui/public/work.html +1 -1
  66. package/modules/hall-ui/public/work.js +67 -14
  67. package/modules/lifecycle/matter-acts.js +0 -6
  68. package/modules/lifecycle/module.json +0 -1
  69. package/package-lock.json +2 -2
  70. package/package.json +1 -1
  71. package/release-notes.json +28 -0
  72. package/scripts/bongos/adopt-preflight.js +3 -3
  73. package/scripts/bongos/audit-authorship.sh +1 -3
  74. package/scripts/bongos/bump-version.js +46 -9
  75. package/scripts/bongos/doc-cli-guard.js +2 -0
  76. package/scripts/bongos/doc-control-claims.js +2 -2
  77. package/scripts/bongos/government-walk.js +3 -9
  78. package/scripts/bongos/hard-floor.js +52 -0
  79. package/scripts/bongos/publish-manifest.js +3 -3
  80. package/scripts/bongos/run-unit-tests.js +17 -5
  81. package/scripts/gds/hard-floor.js +6 -0
  82. package/src/bongos/module-scope-map.js +2 -2
  83. package/src/bongos/permission-path-check.js +1 -1
  84. package/src/bongos/route-rank-check.js +1 -8
  85. package/src/bongos/routes.js +1 -2
  86. package/src/module-api.js +1 -1
  87. package/src/modules.js +1 -1
  88. package/tests/acclaim_feed_evidence_db.mjs +42 -23
  89. package/tests/adr_0089_scope.mjs +7 -5
  90. package/tests/bump_version.mjs +52 -18
  91. package/tests/copy_desk_flags_db.mjs +22 -14
  92. package/tests/gating_review_retired.mjs +1 -1
  93. package/tests/goal_sort_staleness.mjs +1 -1
  94. package/tests/government_act_alone_buildings.mjs +1 -3
  95. package/tests/government_board_membership_db.mjs +35 -22
  96. package/tests/government_protected_surfaces.mjs +29 -13
  97. package/tests/governor_docket.mjs +0 -2
  98. package/tests/governor_matter_acts.mjs +6 -8
  99. package/tests/hall_city.mjs +1 -1
  100. package/tests/hall_matter_card.mjs +2 -2
  101. package/tests/hall_oversight_world.mjs +16 -12
  102. package/tests/hall_street_desk.mjs +4 -3
  103. package/tests/hall_street_inside.mjs +1 -1
  104. package/tests/helpers.mjs +34 -0
  105. package/tests/howto_state.mjs +33 -56
  106. package/tests/howto_state_db.mjs +68 -0
  107. package/tests/idea_credit_streams_db.mjs +11 -3
  108. package/tests/integration_parked_ratchet.mjs +7 -1
  109. package/tests/nav_permission_atoms.mjs +1 -1
  110. package/tests/page_notes_db.mjs +12 -8
  111. package/tests/page_tweak_no_rearm.mjs +50 -0
  112. package/tests/publish_manifest.mjs +64 -0
  113. package/tests/search_isolation.mjs +5 -103
  114. package/tests/search_isolation_db.mjs +140 -0
  115. package/tests/session_earnings_mirror_db.mjs +2 -0
  116. package/tests/work_board_live_refresh.mjs +236 -0
  117. package/tests/workflow_exec_paths.mjs +9 -11
  118. package/modules/lifecycle/routes/gate-approvals.js +0 -299
  119. package/scripts/bongos/ci-grade.js +0 -82
  120. package/scripts/bongos/gate-review.js +0 -330
  121. package/scripts/gds/ci-grade.js +0 -7
  122. package/scripts/gds/gate-review.js +0 -7
  123. package/tests/gate_approvals.mjs +0 -611
  124. package/tests/gate_review.mjs +0 -152
@@ -5,7 +5,7 @@ A **generated**, zero-dependency typed client for the Bongos API — produced fr
5
5
  by hand; it regenerates when the spec changes, so it can never drift from the routes.
6
6
 
7
7
  - API version: **v1** (served at `/api/bongos/v1`)
8
- - 580 operations across 77 resource groups
8
+ - 578 operations across 76 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -408,12 +408,6 @@ function createClient(opts = {}) {
408
408
  // POST /founding/start — rank: any-builder — POST /founding/start
409
409
  postFoundingStart: (args) => request("POST", "/founding/start", { hasBody: true }, args),
410
410
  },
411
- "gateApprovals": {
412
- // GET /gate-approvals — rank: metic+archon — GET /gate-approvals
413
- getGateApprovals: (args) => request("GET", "/gate-approvals", { hasBody: false }, args),
414
- // POST /gate-approvals/{pr}/approve — rank: archon — POST /gate-approvals/:pr/approve
415
- postGateApprovalsPrApprove: (args) => request("POST", "/gate-approvals/{pr}/approve", { hasBody: true }, args),
416
- },
417
411
  "github": {
418
412
  // GET /github/orgs — rank: any-builder — GET /github/orgs
419
413
  getGithubOrgs: (args) => request("GET", "/github/orgs", { hasBody: false }, args),
@@ -407,12 +407,6 @@ function createClient(opts = {}) {
407
407
  // POST /founding/start — rank: any-builder — POST /founding/start
408
408
  postFoundingStart: (args) => request("POST", "/founding/start", { hasBody: true }, args),
409
409
  },
410
- "gateApprovals": {
411
- // GET /gate-approvals — rank: metic+archon — GET /gate-approvals
412
- getGateApprovals: (args) => request("GET", "/gate-approvals", { hasBody: false }, args),
413
- // POST /gate-approvals/{pr}/approve — rank: archon — POST /gate-approvals/:pr/approve
414
- postGateApprovalsPrApprove: (args) => request("POST", "/gate-approvals/{pr}/approve", { hasBody: true }, args),
415
- },
416
410
  "github": {
417
411
  // GET /github/orgs — rank: any-builder — GET /github/orgs
418
412
  getGithubOrgs: (args) => request("GET", "/github/orgs", { hasBody: false }, args),
@@ -963,12 +963,6 @@ export interface BongosClient {
963
963
  /** POST /founding/start — rank: any-builder */
964
964
  postFoundingStart(args?: RequestArgs): Promise<ApiResponse>;
965
965
  };
966
- "gateApprovals": {
967
- /** GET /gate-approvals — rank: metic+archon */
968
- getGateApprovals(args?: RequestArgs): Promise<ApiResponse>;
969
- /** POST /gate-approvals/{pr}/approve — rank: archon */
970
- postGateApprovalsPrApprove(args?: RequestArgs): Promise<ApiResponse>;
971
- };
972
966
  "github": {
973
967
  /** GET /github/orgs — rank: any-builder */
974
968
  getGithubOrgs(args?: RequestArgs): Promise<ApiResponse>;
@@ -404,12 +404,6 @@ export function createClient(opts = {}) {
404
404
  // POST /founding/start — rank: any-builder — POST /founding/start
405
405
  postFoundingStart: (args) => request("POST", "/founding/start", { hasBody: true }, args),
406
406
  },
407
- "gateApprovals": {
408
- // GET /gate-approvals — rank: metic+archon — GET /gate-approvals
409
- getGateApprovals: (args) => request("GET", "/gate-approvals", { hasBody: false }, args),
410
- // POST /gate-approvals/{pr}/approve — rank: archon — POST /gate-approvals/:pr/approve
411
- postGateApprovalsPrApprove: (args) => request("POST", "/gate-approvals/{pr}/approve", { hasBody: true }, args),
412
- },
413
407
  "github": {
414
408
  // GET /github/orgs — rank: any-builder — GET /github/orgs
415
409
  getGithubOrgs: (args) => request("GET", "/github/orgs", { hasBody: false }, args),
@@ -2,7 +2,8 @@
2
2
 
3
3
  **Date:** 2026-06-07
4
4
  **Context:** GDS-V3, task [#679](https://example.com/builders#/task/679) (cut prod deploy over to CI). Completes the [#597](https://example.com/builders#/task/597) / [ADR 0031](0031-cloud-dev-environments-for-builders.md) §6 goal — *no builder box holds the production droplet SSH key*. Extends [ADR 0031](0031-cloud-dev-environments-for-builders.md) §6; re-applies [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) to CI.
5
- **Status:** Accepted — **armed in production 2026-06-13** (interim, grader-off variant — task [#859](https://example.com/builders#/task/859); `config/deploy.json` `mode: ci`; see the *Arming record* below + session log [`<redacted>.md`](../session-logs/<redacted>.md)).
6
5
  **Amended 2026-09-30:** the CI grade-gate (precondition 1) is permanently retired, not deferred — see the *Amendment* at the end (task 1004456, blocker 1000103).
6
+ **Status:** Accepted — **armed in production 2026-06-13** (interim, grader-off variant — task [#859](https://example.com/builders#/task/859); `config/deploy.json` `mode: ci`; see the *Arming record* below + session log [`<redacted>.md`](../session-logs/<redacted>.md)).
7
+ **Amended 2026-09-30:** the CI grade-gate (precondition 1) is permanently retired, not deferred — see the *Amendment* at the end (task 1004456, blocker 1000103).
7
8
 
8
9
  ## Problem
9
10
 
@@ -35,7 +36,7 @@ With no human in the merge loop, **the CI checks *are* the authority**. The thre
35
36
 
36
37
  1. **[`CODEOWNERS`](../../CODEOWNERS)** — a PR touching any gate surface (`.github/`, `config/deploy.json`, `ship.js`, the grader, `auth.js`/`route-rank-check.js`) **or any code that executes on the droplet at deploy** (`migrations/`, `scripts/migrate.sh`, `package.json`/`package-lock.json`, `scripts/deploy/` — `~/deploy.sh` runs migrations + `npm ci` from the merged tree, so a malicious migration or poisoned lockfile would otherwise auto-merge and run on prod) requires Archon review *even under auto-merge*, when branch protection has "Require review from Code Owners" on. Ordinary PRs (game, art, docs) carry no code owner and auto-merge freely — that's the point.
37
38
 
38
- 2. **The grader must RE-RUN in CI** — CODEOWNERS only catches *committed* changes to `ship.js`. A builder could run a **locally-edited, uncommitted** `ship.js` that skips the grade and opens an auto-merge PR anyway. An earlier draft of this ADR proposed a CI check that *reads the server-recorded grade* — but that is **theater**: `POST /tasks/:id/grade` records the grader scores *from the request body* (the server does not recompute them), so a tampered local ship.js can POST a fake passing grade. The only tamper-proof gate runs the grader **in CI, against the PR diff**, where the builder cannot touch it — [`.github/workflows/grade-gate.yml`](../../.github/workflows/grade-gate.yml) + [`scripts/gds/ci-grade.js`](../../scripts/gds/ci-grade.js) ([#855](https://example.com/builders#/task/855)), which reuse the exact production grading path (`ship.js runSubagentGrader` → the adversarial worker panel) and **fail closed**. It is **skip-safe** (green-but-not-gating) until the operator wires a grader auth secret AND marks it a required check — the same inert-until-armed pattern as `deploy-prod.yml`. This was written as a **hard precondition** of arming `ci` mode. *(Superseded 2026-09-30: the CI grade-gate is permanently retired — see the Amendment below.)*
39
+ 2. **The grader must RE-RUN in CI** — CODEOWNERS only catches *committed* changes to `ship.js`. A builder could run a **locally-edited, uncommitted** `ship.js` that skips the grade and opens an auto-merge PR anyway. An earlier draft of this ADR proposed a CI check that *reads the server-recorded grade* — but that is **theater**: `POST /tasks/:id/grade` records the grader scores *from the request body* (the server does not recompute them), so a tampered local ship.js can POST a fake passing grade. The only tamper-proof gate runs the grader **in CI, against the PR diff**, where the builder cannot touch it — [`.github/workflows/grade-gate.yml`](../../.github/workflows/grade-gate.yml) + `scripts/gds/ci-grade.js` (deleted by task 1004859) ([#855](https://example.com/builders#/task/855)), which reuse the exact production grading path (`ship.js runSubagentGrader` → the adversarial worker panel) and **fail closed**. It is **skip-safe** (green-but-not-gating) until the operator wires a grader auth secret AND marks it a required check — the same inert-until-armed pattern as `deploy-prod.yml`. This was written as a **hard precondition** of arming `ci` mode. *(Superseded 2026-09-30: the CI grade-gate is permanently retired — see the Amendment below.)*
39
40
 
40
41
  ### Why not just hand builders the droplet key
41
42
 
@@ -133,10 +133,6 @@
133
133
  "name": "founding",
134
134
  "description": "Endpoints under `/api/bongos/founding`."
135
135
  },
136
- {
137
- "name": "gate-approvals",
138
- "description": "Endpoints under `/api/bongos/gate-approvals`."
139
- },
140
136
  {
141
137
  "name": "github",
142
138
  "description": "Endpoints under `/api/bongos/github`."
@@ -6435,88 +6431,6 @@
6435
6431
  ]
6436
6432
  }
6437
6433
  },
6438
- "/gate-approvals": {
6439
- "get": {
6440
- "operationId": "get_gate_approvals",
6441
- "tags": [
6442
- "gate-approvals"
6443
- ],
6444
- "summary": "GET /gate-approvals",
6445
- "description": "GET /gate-approvals — open PRs awaiting owner approval (gate-review red), with the verdict + per-file reasons + changed files + diff link. rank: metic+archon. BV1.R105 left this on requireRank because `gate_approval.decide` was declared over the /approve WRITE only and no atom named the read. ADR 0157 extends the catalog with exactly that atom — `gate_approval.read`, floor metic — so the mapping is now one the catalog makes. The split is load-bearing, not cosmetic: `page.view.government` opens /gate to Metic, and without a Metic-readable data endpoint that page would render nothing but a 403. Approving a held PR stays archon (`.decide`, system).\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `gate_approval.read` (all required).",
6446
- "x-rank": "metic+archon",
6447
- "x-source": "modules/lifecycle/routes/gate-approvals.js",
6448
- "x-permissions": [
6449
- "gate_approval.read"
6450
- ],
6451
- "responses": {
6452
- "200": {
6453
- "description": "Success."
6454
- },
6455
- "400": {
6456
- "$ref": "#/components/responses/BadRequest"
6457
- },
6458
- "401": {
6459
- "$ref": "#/components/responses/Unauthorized"
6460
- },
6461
- "403": {
6462
- "$ref": "#/components/responses/Forbidden"
6463
- }
6464
- },
6465
- "security": [
6466
- {
6467
- "builderSession": []
6468
- }
6469
- ]
6470
- }
6471
- },
6472
- "/gate-approvals/{pr}/approve": {
6473
- "post": {
6474
- "operationId": "post_gate_approvals_pr_approve",
6475
- "tags": [
6476
- "gate-approvals"
6477
- ],
6478
- "summary": "POST /gate-approvals/:pr/approve",
6479
- "description": "POST /gate-approvals/:pr/approve — record owner approval for a stuck gate PR and re-run the gate-review check so it clears. rank: archon (clears the hard floor — pinned in route-rank-check.EXPECTED_RANKS for downgrade protection).\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `gate_approval.decide` (all required).",
6480
- "x-rank": "archon",
6481
- "x-source": "modules/lifecycle/routes/gate-approvals.js",
6482
- "x-permissions": [
6483
- "gate_approval.decide"
6484
- ],
6485
- "parameters": [
6486
- {
6487
- "name": "pr",
6488
- "in": "path",
6489
- "required": true,
6490
- "schema": {
6491
- "type": "string"
6492
- },
6493
- "description": "Path parameter `pr`."
6494
- }
6495
- ],
6496
- "responses": {
6497
- "200": {
6498
- "description": "Success."
6499
- },
6500
- "400": {
6501
- "$ref": "#/components/responses/BadRequest"
6502
- },
6503
- "401": {
6504
- "$ref": "#/components/responses/Unauthorized"
6505
- },
6506
- "403": {
6507
- "$ref": "#/components/responses/Forbidden"
6508
- },
6509
- "404": {
6510
- "$ref": "#/components/responses/NotFound"
6511
- }
6512
- },
6513
- "security": [
6514
- {
6515
- "builderSession": []
6516
- }
6517
- ]
6518
- }
6519
- },
6520
6434
  "/github/orgs": {
6521
6435
  "get": {
6522
6436
  "operationId": "get_github_orgs",
@@ -37066,7 +36980,7 @@
37066
36980
  "description": "A required dependency/feature is not configured or is temporarily down."
37067
36981
  }
37068
36982
  },
37069
- "x-endpoint-count": 580,
36983
+ "x-endpoint-count": 578,
37070
36984
  "x-schema-count": 622,
37071
36985
  "x-undocumented-bodies": 12,
37072
36986
  "x-response-schemas": 404,
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Bongos API reference
4
4
 
5
- > **Generated from the live route files** — the route file is authoritative. 580 endpoints across 99 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 578 endpoints across 98 route files.
6
6
  > Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
7
7
 
8
8
  Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
@@ -281,13 +281,6 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
281
281
  | POST | `/api/bongos/founding/stages/:stage/close` | `any-builder` | — | |
282
282
  | POST | `/api/bongos/founding/start` | `any-builder` | — | |
283
283
 
284
- ## `gate-approvals` (2)
285
-
286
- | Method | Path | Rank | Body | Description |
287
- |---|---|---|---|---|
288
- | GET | `/api/bongos/gate-approvals` | `metic+archon` | — | GET /gate-approvals — open PRs awaiting owner approval (gate-review red), with the verdict + per-file reasons + changed files + diff link. |
289
- | POST | `/api/bongos/gate-approvals/:pr/approve` | `archon` | — | POST /gate-approvals/:pr/approve — record owner approval for a stuck gate PR and re-run the gate-review check so it clears. |
290
-
291
284
  ## `github` (6)
292
285
 
293
286
  | Method | Path | Rank | Body | Description |
@@ -141,7 +141,7 @@ or missing ranks fail closed.
141
141
  - **identity** — `PATCH /api/bongos/builders/:id/status` (offboard/(de)activate), `GET|PATCH /api/bongos/access-requests[/:id]`
142
142
  (who is admitted), `POST /api/gds/auth/revoke[-all]` (whose sessions are valid).
143
143
  - **the four escalation keys**, which look operational but are not: `POST /api/bongos/tasks/:id/confirm`
144
- (grader-bypass), `POST /api/bongos/gate-approvals/:pr/approve` (CI deploy-gate override), protected-module
144
+ (grader-bypass), `POST /api/bongos/gate-approvals/:pr/approve` (CI deploy-gate override — the route was removed by task 1004859 because the CI check it overrode never ran; its key `gate_approval.decide` stays in the catalog, retired), protected-module
145
145
  **goal scope** ([ADR 0086](adr/0086-goal-scoped-work-hierarchy.md)), and `government.manage` (the
146
146
  ranks/permissions tab). Delegating any one of them lets a Metic reach Archon in four steps — create a
147
147
  protected-scope goal in the permission core, claim a task there (protected paths already floor at
@@ -235,8 +235,8 @@ or missing ranks fail closed.
235
235
  `GET /override-requests` + `POST .../:id/decide`; `POST /claims/:id/release-on-behalf`;
236
236
  `POST /done-when/:id/unsatisfy`; `POST /goals/reorder`; `POST /versions`;
237
237
  `POST /tasks/newcomer-restock`; `POST /tasks/peer-votes/tally`; `GET /discord/channels/plan` +
238
- `POST .../reconcile`; `GET /autonomy/precheck`. Plus `GET /gate-approvals`, whose read was split out as
239
- `gate_approval.read` so the Gate page is usable at Metic while **approving** stays Archon.
238
+ `POST .../reconcile`; `GET /autonomy/precheck`. `GET /gate-approvals` (key `gate_approval.read`) was removed with its approve
239
+ route by task 1004859; the key stays in the catalog, retired.
240
240
 
241
241
  > **Note the one confidentiality widening:** `/security/docs` (the engagement-report store with
242
242
  > attacker-usable exploit detail) is now Metic-readable, because it shares `security.report.adjudicate`