@bongos/core 1.21.4 → 1.21.6

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 (126) hide show
  1. package/.bongos-core.json +233 -108
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +2 -0
  4. package/clients/bongos-client/index.cjs +2 -0
  5. package/clients/bongos-client/index.d.ts +3 -1
  6. package/clients/bongos-client/index.mjs +2 -0
  7. package/docs/adr/0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md +1 -0
  8. package/docs/adr/0362-the-governor-docket-is-collected-from-contributed-sources.md +34 -0
  9. package/docs/adr/README.md +1 -0
  10. package/docs/api/openapi.json +37 -2
  11. package/docs/api-reference.md +4 -3
  12. package/docs/copy-inventory.md +541 -658
  13. package/docs/copy-registry.json +1205 -2340
  14. package/docs/module-api-changelog.md +4 -0
  15. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
  16. package/docs/onboarding/diagrams/assertions.json +1 -1
  17. package/docs/page-inventory.json +47 -28
  18. package/docs/page-readings.json +1128 -1339
  19. package/modules/autonomy/config-idle.js +192 -0
  20. package/modules/autonomy/governor-docket.js +101 -0
  21. package/modules/autonomy/routes/autonomy.js +27 -0
  22. package/modules/autonomy/runner-health.js +22 -1
  23. package/modules/discord/board-broadcast.js +3 -1
  24. package/modules/discord/craft-broadcast.js +107 -0
  25. package/modules/discord/routes/discord.js +10 -0
  26. package/modules/discord/ship-broadcast.js +30 -2
  27. package/modules/economy/reward.js +3 -0
  28. package/modules/government/board.js +20 -5
  29. package/modules/government/docket-vocab.js +82 -0
  30. package/modules/government/docket.js +458 -0
  31. package/modules/government/routes/government.js +34 -0
  32. package/modules/hall-ui/public/city-draw.js +438 -0
  33. package/modules/hall-ui/public/city.css +110 -0
  34. package/modules/hall-ui/public/city.html +71 -0
  35. package/modules/hall-ui/public/city.js +177 -0
  36. package/modules/hall-ui/public/city.states.json +30 -0
  37. package/modules/hall-ui/public/gate.js +11 -4
  38. package/modules/hall-ui/public/genesis-home.js +9 -10
  39. package/modules/hall-ui/public/profile.css +4 -0
  40. package/modules/hall-ui/public/profile.js +25 -1
  41. package/modules/hall-ui/public/settings-autobongos.js +19 -1
  42. package/modules/hall-ui/public/settings.css +26 -0
  43. package/modules/hall-ui/public/settings.html +8 -0
  44. package/modules/hall-ui/public/settings.js +43 -3
  45. package/modules/ideas/governor-docket.js +93 -0
  46. package/modules/ideas/routes/blockers.js +5 -0
  47. package/modules/lifecycle/governor-docket.js +192 -0
  48. package/modules/lifecycle/routes/gate-approvals.js +78 -33
  49. package/modules/lifecycle/routes/lifecycle.js +3 -0
  50. package/modules/onboarding/routes/access-requests.js +68 -27
  51. package/modules/platform-identity/craft-rollup.js +72 -0
  52. package/modules/platform-identity/migrations/platform_identity_029_activity_crafts.sql +23 -0
  53. package/modules/platform-identity/platform-identity.js +12 -6
  54. package/modules/platform-identity/routes/sso.js +4 -0
  55. package/modules/platform-identity/tests/platform-identity.mjs +1 -1
  56. package/modules/provisioning/core-upgrade.js +34 -7
  57. package/modules/provisioning/module.json +2 -1
  58. package/modules/provisioning/seams.js +2 -0
  59. package/modules/public-landing/public/assets/cosmos.css +6 -50
  60. package/modules/public-landing/public/projects.html +1170 -1659
  61. package/modules/public-landing/public/projects.probes.json +18 -18
  62. package/modules/public-landing/public/projects.states.json +24 -31
  63. package/modules/security/routes/reports.js +39 -0
  64. package/package-lock.json +2 -2
  65. package/package.json +1 -1
  66. package/release-notes.json +72 -0
  67. package/scripts/gds/autobongos-grade-cap.js +187 -0
  68. package/scripts/gds/autobongos-loop.js +4 -0
  69. package/scripts/gds/autobongos-run.js +154 -13
  70. package/scripts/gds/autobongos-verify.js +211 -14
  71. package/scripts/gds/provision-core-upgrade.js +14 -2
  72. package/scripts/gds/provision-repo.js +77 -13
  73. package/scripts/gds/ship-flow.js +5 -0
  74. package/scripts/gds/ship-preflight-steps.js +2 -1
  75. package/scripts/gds/ship.js +10 -0
  76. package/scripts/gds/update-sweep.js +24 -8
  77. package/scripts/gds/upgrade-outcome.js +1 -0
  78. package/src/bongos/auth-admission.js +95 -13
  79. package/src/bongos/db-kernel.js +1 -1
  80. package/src/bongos/module-rechecks.js +77 -0
  81. package/src/bongos/route-rank-check.js +3 -0
  82. package/src/bongos/routes/core-update.js +68 -2
  83. package/src/bongos/routes/modules.js +17 -0
  84. package/src/bongos/serve-internal.js +14 -0
  85. package/src/bongos/software-update.js +3 -2
  86. package/src/module-api.js +1 -1
  87. package/tests/activity_rollup_order_db.mjs +3 -1
  88. package/tests/activity_snapshots_db.mjs +2 -0
  89. package/tests/autobongos_grade_cap.mjs +125 -0
  90. package/tests/autobongos_loop.mjs +230 -1
  91. package/tests/autobongos_verify.mjs +239 -3
  92. package/tests/autonomy_config_idle.mjs +272 -0
  93. package/tests/core_update_banner.mjs +29 -0
  94. package/tests/core_upgrade_door.mjs +31 -1
  95. package/tests/core_upgrade_runner.mjs +20 -0
  96. package/tests/discord_craft_broadcast.mjs +162 -0
  97. package/tests/genesis_home.mjs +1 -1
  98. package/tests/government_routes.mjs +3 -1
  99. package/tests/governor_docket.mjs +552 -0
  100. package/tests/hall_audit.mjs +10 -1
  101. package/tests/hall_city.mjs +369 -0
  102. package/tests/hall_page_gate_map.mjs +5 -0
  103. package/tests/hub_craft_rollup.mjs +350 -0
  104. package/tests/onboard.mjs +10 -4
  105. package/tests/platform_boot.mjs +1 -1
  106. package/tests/profile_rollup_consent.mjs +2 -0
  107. package/tests/profile_route.mjs +16 -2
  108. package/tests/projects_hub.mjs +196 -89
  109. package/tests/projects_hub_app_status.mjs +3 -1
  110. package/tests/projects_hub_app_step.mjs +72 -48
  111. package/tests/projects_hub_dns_ready.mjs +10 -2
  112. package/tests/projects_hub_look.mjs +32 -22
  113. package/tests/projects_hub_module_picker.mjs +112 -62
  114. package/tests/projects_hub_pre_uat.mjs +48 -41
  115. package/tests/provision.mjs +78 -0
  116. package/tests/public_landing_projects.mjs +12 -6
  117. package/tests/settings_main_role.mjs +190 -0
  118. package/tests/software_update.mjs +56 -1
  119. package/tests/update_subscription_engine.mjs +55 -3
  120. package/tests/wizard_demo.mjs +37 -11
  121. package/tests/wizard_draft_resume.mjs +34 -22
  122. package/tests/wizard_front_door.mjs +173 -103
  123. package/tests/wizard_intent_resume.mjs +28 -25
  124. package/tests/wizard_physics.mjs +94 -76
  125. package/tests/wizard_physics_more.mjs +428 -277
  126. package/tests/wizard_six_screens.mjs +126 -0
@@ -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
- - 496 operations across 73 resource groups
8
+ - 497 operations across 73 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -513,6 +513,8 @@ function createClient(opts = {}) {
513
513
  postGovernmentBoardItemsItemIdVotes: (args) => request("POST", "/government/board/items/{itemId}/votes", { hasBody: true }, args),
514
514
  // GET /government/constitution — rank: any-builder — GET /government/constitution
515
515
  getGovernmentConstitution: (args) => request("GET", "/government/constitution", { hasBody: false }, args),
516
+ // GET /government/docket — rank: any-builder — GET /government/docket
517
+ getGovernmentDocket: (args) => request("GET", "/government/docket", { hasBody: false }, args),
516
518
  // GET /government/permissions — rank: archon — GET /government/permissions
517
519
  getGovernmentPermissions: (args) => request("GET", "/government/permissions", { hasBody: false }, args),
518
520
  // POST /government/rank-sets/apply — rank: archon — POST /government/rank-sets/apply
@@ -512,6 +512,8 @@ function createClient(opts = {}) {
512
512
  postGovernmentBoardItemsItemIdVotes: (args) => request("POST", "/government/board/items/{itemId}/votes", { hasBody: true }, args),
513
513
  // GET /government/constitution — rank: any-builder — GET /government/constitution
514
514
  getGovernmentConstitution: (args) => request("GET", "/government/constitution", { hasBody: false }, args),
515
+ // GET /government/docket — rank: any-builder — GET /government/docket
516
+ getGovernmentDocket: (args) => request("GET", "/government/docket", { hasBody: false }, args),
515
517
  // GET /government/permissions — rank: archon — GET /government/permissions
516
518
  getGovernmentPermissions: (args) => request("GET", "/government/permissions", { hasBody: false }, args),
517
519
  // POST /government/rank-sets/apply — rank: archon — POST /government/rank-sets/apply
@@ -460,7 +460,7 @@ export interface PostSpecialitiesIdOfferResponse { speciality: unknown }
460
460
  export interface PostSpecialitiesIdUnofferResponse { speciality: unknown }
461
461
  export interface PostSpecialitiesRequest { name: string; discipline: string; summary?: string; contract_md?: string; visibility?: string; sellable?: boolean; skills?: string[] }
462
462
  export interface PostSpecialitiesResponse { speciality: unknown }
463
- export interface PostSsoActivityRollupRequest { client_id: string; client_secret: string; github_id: StringifiableId; credits?: number; tasks_shipped?: number; karma?: number; rank?: string; disciplines?: unknown; recent_ships?: unknown }
463
+ export interface PostSsoActivityRollupRequest { client_id: string; client_secret: string; github_id: StringifiableId; credits?: number; tasks_shipped?: number; karma?: number; rank?: string; disciplines?: unknown; recent_ships?: unknown; crafts?: unknown }
464
464
  export interface PostSsoActivityRollupResponse { ok: boolean }
465
465
  export interface PostSsoApplicantProfileRequest { client_id: string; client_secret: string; github_id: StringifiableId }
466
466
  export interface PostSsoApplicantProfileResponse { profile: unknown }
@@ -973,6 +973,8 @@ export interface BongosClient {
973
973
  postGovernmentBoardItemsItemIdVotes(args: RequestArgs & { body: PostGovernmentBoardItemsItemIdVotesRequest }): Promise<ApiResponse>;
974
974
  /** GET /government/constitution — rank: any-builder */
975
975
  getGovernmentConstitution(args?: RequestArgs): Promise<ApiResponse>;
976
+ /** GET /government/docket — rank: any-builder */
977
+ getGovernmentDocket(args?: RequestArgs): Promise<ApiResponse>;
976
978
  /** GET /government/permissions — rank: archon */
977
979
  getGovernmentPermissions(args?: RequestArgs): Promise<GetGovernmentPermissionsResponse>;
978
980
  /** POST /government/rank-sets/apply — rank: archon */
@@ -509,6 +509,8 @@ export function createClient(opts = {}) {
509
509
  postGovernmentBoardItemsItemIdVotes: (args) => request("POST", "/government/board/items/{itemId}/votes", { hasBody: true }, args),
510
510
  // GET /government/constitution — rank: any-builder — GET /government/constitution
511
511
  getGovernmentConstitution: (args) => request("GET", "/government/constitution", { hasBody: false }, args),
512
+ // GET /government/docket — rank: any-builder — GET /government/docket
513
+ getGovernmentDocket: (args) => request("GET", "/government/docket", { hasBody: false }, args),
512
514
  // GET /government/permissions — rank: archon — GET /government/permissions
513
515
  getGovernmentPermissions: (args) => request("GET", "/government/permissions", { hasBody: false }, args),
514
516
  // POST /government/rank-sets/apply — rank: archon — POST /government/rank-sets/apply
@@ -40,6 +40,7 @@ The deploy page's **Release** section lists the versions this hall runs that are
40
40
  - The update sweep (ADR 0360) already follows `released` by default.
41
41
  - The "update available" banner (`src/bongos/core-update.js`) offers versions at or below `latest`, read from the same packument. With no readable label it has no answer.
42
42
  - The platform's upgrade runner for hosted projects (`scripts/gds/provision-core-upgrade.js`) offers a project the versions its follow admits. The follow comes from its hosting shape: the `control-plane` row is the platform hall and takes candidates; every other shape takes releases (`followForShape`). It is derived, not a column, because there is exactly one platform hall. A column someone could set on a tenant would be one more way to hand a project an unreleased version.
43
+ - **A new project is born on the release** ([task 1004299](https://cloudbongos.com/builders#/task/1004299)). The wizard vendors the core this hall runs (ADR 0292), which is a candidate once D1 is on. `projectCoreDecision` (`scripts/gds/provision-repo.js`) gives the project the `latest` version instead whenever the hall runs ahead of it, packed from the registry; the core-pin refresh that runs in the same provisioning pass uses the same target, so it cannot bump the new pin straight back. Level, or no readable label, keeps the byte-exact running core.
43
44
 
44
45
  ## Arming (owner steps, in this order)
45
46
 
@@ -0,0 +1,34 @@
1
+ # ADR 0362 — The governor's docket is collected from sources each module contributes, scoped by each source's own atom
2
+
3
+ - **Status:** Accepted.
4
+ - **Date:** 2026-10-01
5
+ - **Task:** [task 1004523](https://cloudbongos.com/builders#/task/1004523) (goal 1000125, the Governor City).
6
+ - **Builds on:** [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (a module never requires a sibling), [ADR 0016](0016-trust-boundary-server-enforced-permissions.md) (authority is resolved server-side, per request), [ADR 0151](0151-governance-permissions-as-atom-ranks-as-roles.md) (permissions are the atom).
7
+
8
+ ## Context
9
+
10
+ The Governor City (docs/design/mocks/governor-city/) draws every part of a project's government as a building, with a pin over each open matter, a per-viewer state (needs you, moving, settled) and six readings on the street. Five screen tasks (1004524 to 1004528) all need the same answer to "what is open, where does it stand, and whose move is it".
11
+
12
+ The matters live in a dozen places owned by five modules and the core: the board (government), blockers (ideas), access requests (onboarding), override requests, removal proposals, criteria awaiting UAT, CI gate approvals and goal join requests (lifecycle), red-team reports (security), the Autobongos fence (autonomy), and the core update (core). Before this, the only cross-source summary was the hall's "Needs your attention" card fetching five endpoints one by one.
13
+
14
+ Three shapes were open. (a) A core route requiring each module's db: forbidden, core imports no module. (b) A new port per source, resolved by government: twelve ports, each a second surface to keep in step with its list route. (c) The existing `seams.contribute` contribution point, which `/me` already uses for `profile.fields`.
15
+
16
+ ## Decision
17
+
18
+ **D1 — One contribution point, `governor.docket`.** Each owner contributes its own source from its route factory (the boot hook that runs live and in every test that rebuilds the router), built on the db read its own list route already serves. Where that read was inline in a handler, it was lifted into a function the route and the docket now share (`listAccessRequests`, `listAwaitingGateApprovals`), so there is still one query. `modules/government/docket.js` collects them; `GET /government/docket` serves the result.
19
+
20
+ **D2 — Each source declares the atom of its own list route, and the collector enforces it.** A contribution carries `gate: { permission }` or `gate: { anyBuilder: true }` (for reads that scope themselves, like a goal lead's join requests, or are public, like blockers). The collector resolves the viewer's permissions once per request and runs a source only when its gate passes. A gated-out source reports `not_yours` and returns no rows. A contribution with no recognisable gate is dropped, never run. `tests/governor_docket.mjs` reads each list route's atom off the route source with the route-rank auditor and asserts the contribution names the same one, so the two cannot drift.
21
+
22
+ **D3 — Nothing is invented.** A source the design names that nothing records yet (grade appeals, proposals for new standing rules, spending votes) is reported `coming` with a reason; a source whose module is off is `off`; a read that throws or does not answer within four seconds is `unavailable`. None contributes a row.
23
+
24
+ **D3a — Each reading is answered by the one record that honestly carries it.** Flow: finished tasks at `completed`/`confirmed` and the longest wait (lifecycle). Promises: the building version's done-when criteria, kept of total (lifecycle). Money: the only budget the project records is the unattended-spend ceiling the autonomy gate brakes on, so "money left" is that ceiling minus the month's unattended spend, and the line says so (autonomy, gated `autonomy.precheck`). People: active humans (government). Fairness: open matters at Disputes the viewer can see. Rules at work: the idea routing rule, counted by this month's routed filings (ideas). Module re-checks read the assessment ledger (core_265): a current failed Security gate needs a governor who may ask for a re-check, a pending part is one already running.
25
+
26
+ **D4 — The board's "needs you" is the summons rule.** A sitting needs a viewer when they are a member under the item's own snapshot, have not cast, are not the subject's author and the clock has not run out. That is `pendingVotesFor`'s rule on `/me`, so the city and the roster never disagree.
27
+
28
+ **D5 — The route's own gate is the room's.** `GET /government/docket` gates on `board.vote.cast` (xenos floor), pinned in route-rank-check's `GOVERNMENT_PINS`. The real scoping is per source (D2).
29
+
30
+ ## Consequences
31
+
32
+ - A new source is one `api.contribute('governor.docket', …)` call in its owning module plus a row in `EXPECTED_SOURCES`; nothing in government changes shape.
33
+ - The docket fans out to every source on each read. Two sources leave the box (GitHub for gate approvals, without the per-PR file read; the npm registry for the core update, TTL-cached); the timeout keeps either from holding the city.
34
+ - When the project records a real budget, the money reading should read it instead of the unattended ceiling; the reading's `value.scope` names what it counts so a screen never mislabels it.
@@ -480,3 +480,4 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
480
480
  | 0359 | [**Nobody sets a module's score by hand; a Metic+ person can ask for a re-check** ([task 1003796](https://cloudbongos.com/builders#/task/1003796) · goal 1000091, criterion `wa5-quality-assessed`). Amends [ADR 0343](0343-a-module-score-is-a-security-gate-then-an-average-of-visible-parts.md) D6 and [ADR 0347](0347-every-store-module-ships-a-how-to.md) D5 on the owner's ruling: there is no score override. A score only ever comes from its signals. Instead `POST /store/modules/:key/versions/:version/reassess { reason }`, gated by the new `module.assessment.rerun` atom (metic floor, granted to metic + archon by `government_021`), queues the same assessment a publish runs. A reason is required and nothing else is accepted. The delist (task 1003797) is unchanged.](0359-nobody-sets-a-module-score-by-hand-metic-can-ask-for-a-re-check.md) | module store / assessment / permissions |
481
481
  | 0360 | [**Bongos follows every candidate; every other project follows releases** ([task 1004297](https://cloudbongos.com/builders#/task/1004297), goal 1000090 — the owner's 2026-09-26 decision that the Bongos hall takes every candidate automatically). Amends ADR 0136. **D1:** a per-instance `follow` beside the channel — `released` (default: at or below the registry's `latest` label) or `candidates` (every version, the platform hall only). **D2:** released is the `latest` dist-tag, read separately; an unreadable label skips the instance, never a guess. **D3:** the timer period is the lag — 15 min declared, installed by task 1003969. **D4:** a version that failed here is held for a day per instance (recorded in the sweep's config home), while any newer version is taken at once — no restart loop at a 15-minute cadence. **D5:** the deploy page's "Upgrades on this hall" — the core_upgrades ledger, rollbacks flagged, and a published version waiting past 30 min said to be the automation stopping. Rejected: a second runner, CI pushing to the box, a hold only a human clears.](0360-bongos-follows-every-candidate-every-other-project-follows-releases.md) | update channel / deploy / core update |
482
482
  | 0361 | [**Merges publish as candidates; Release on /deploy decides what other projects are offered** ([task 1004298](https://cloudbongos.com/builders#/task/1004298), goal 1000090). Amends ADR 0161. **D1:** merges publish under `next` when `PUBLISH_AS_CANDIDATE=1` (ships inert). **D2:** a `release` job in publish.yml moves `latest` (release-core.js: published, stable, newer than the release) over the same OIDC trusted publisher — no npm token. **D3:** /deploy's Release button (`core.pin.move`) dispatches it through the one-function `lifecycle.workflowDispatch` port. **D4:** evidence beside each button — hours on this hall, ever rolled back. **D5:** the banner and the hosted-project runner offer only released versions; the control-plane row follows candidates. Arming: roster follow → npm dist-tag permission → GitHub credential Actions: write → the variable.](0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md) | publish / release / update channel |
483
+ | 0362 | [**The governor's docket is collected from sources each module contributes, scoped by each source's own atom** ([task 1004523](https://cloudbongos.com/builders#/task/1004523), goal 1000125). **D1:** one contribution point, `governor.docket`; each owner contributes its source on the read its own list route serves. **D2:** a source declares its list route's atom and the collector enforces it (gated out = `not_yours`, no rows; no gate = dropped). **D3:** nothing invented: `coming` / `off` / `unavailable`. **D4:** the board's needs-you is the /me summons rule. **D5:** `GET /government/docket` gates on `board.vote.cast`.](0362-the-governor-docket-is-collected-from-contributed-sources.md) | government / Governor City |
@@ -8824,6 +8824,40 @@
8824
8824
  ]
8825
8825
  }
8826
8826
  },
8827
+ "/government/docket": {
8828
+ "get": {
8829
+ "operationId": "get_government_docket",
8830
+ "tags": [
8831
+ "government"
8832
+ ],
8833
+ "summary": "GET /government/docket",
8834
+ "description": "board.vote.cast — the governor's DOCKET (task 1004523, goal 1000125): ONE read of every matter waiting on, or moving for, a governor, which the Governor City screens all draw from. Same coarse atom as the room (xenos floor: whoever the constitution may enfranchise may open the city); the real scoping is PER SOURCE, inside docket.js — each source is shown only to a viewer holding the same atom its own list route requires, and a hidden source reports `not_yours` with no rows (ADR 0016, server-side, uncached). Response (docket.buildDocket): { viewer: { id }, generated_at, line, // \"3 matters wait on you · 2 moving\" counts: { needs, moving, settled }, matters: [{ id: '<source>:<id>', source, building, rule, state, title, short, where, opened_at, deadline, proposer: { id, login, name } | null, tally: { for, against, open, needs } | null, href, ref }], buildings: [{ key, name, group, counts, matter_ids }], // street order sources: [{ source, building, label, status, count, reason }], // status: live | not_yours | coming | off | unavailable readings: [{ key, label, building, status, value, figure, line, hot, reason }], vocabulary: { buildings, rules, states } } `building` ∈ charter rules disputes people planning automation review release treasury; `rule` ∈ decide first consent majority unanimous signoff rule (or null); `state` ∈ needs moving settled. Nothing is ever sample data: a source with nothing recorded yet is `coming`, never a placeholder row.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).\n\n**Permissions:** `board.vote.cast` (all required).",
8835
+ "x-rank": "any-builder",
8836
+ "x-source": "modules/government/routes/government.js",
8837
+ "x-permissions": [
8838
+ "board.vote.cast"
8839
+ ],
8840
+ "responses": {
8841
+ "200": {
8842
+ "description": "Success."
8843
+ },
8844
+ "400": {
8845
+ "$ref": "#/components/responses/BadRequest"
8846
+ },
8847
+ "401": {
8848
+ "$ref": "#/components/responses/Unauthorized"
8849
+ },
8850
+ "403": {
8851
+ "$ref": "#/components/responses/Forbidden"
8852
+ }
8853
+ },
8854
+ "security": [
8855
+ {
8856
+ "builderSession": []
8857
+ }
8858
+ ]
8859
+ }
8860
+ },
8827
8861
  "/government/permissions": {
8828
8862
  "get": {
8829
8863
  "operationId": "get_government_permissions",
@@ -30379,7 +30413,8 @@
30379
30413
  "maxLength": 32
30380
30414
  },
30381
30415
  "disciplines": {},
30382
- "recent_ships": {}
30416
+ "recent_ships": {},
30417
+ "crafts": {}
30383
30418
  },
30384
30419
  "required": [
30385
30420
  "client_id",
@@ -31741,7 +31776,7 @@
31741
31776
  "description": "A required dependency/feature is not configured or is temporarily down."
31742
31777
  }
31743
31778
  },
31744
- "x-endpoint-count": 496,
31779
+ "x-endpoint-count": 497,
31745
31780
  "x-schema-count": 527,
31746
31781
  "x-undocumented-bodies": 12,
31747
31782
  "x-response-schemas": 351,
@@ -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. 496 endpoints across 92 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 497 endpoints across 92 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`.
@@ -340,7 +340,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
340
340
  | GET | `/api/bongos/goals/rollups` | `any-builder` | — | GET /goals/rollups?version= — one small row per goal: readiness counters, the last-activity timestamp, the craft set, and the next claima… |
341
341
  | GET | `/api/bongos/goals/suggestions` | `any-builder` | — | GET /goals/suggestions — "which goal should this draft live in?", answered before anything is created (task 1003062 / R07). |
342
342
 
343
- ## `government` (16)
343
+ ## `government` (17)
344
344
 
345
345
  | Method | Path | Rank | Body | Description |
346
346
  |---|---|---|---|---|
@@ -353,6 +353,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
353
353
  | POST | `/api/bongos/government/board/items` | `metic+archon` | `subject_type`, `proposal`, `rationale_md`, `acknowledge_self_removal` | board.item.open — put an AMENDMENT to the board (R14 of goal 1000069, ADR 0175 §7). |
354
354
  | POST | `/api/bongos/government/board/items/:itemId/votes` | `any-builder` | `direction`, `reason_md`, `section_key` | board.vote.cast — cast a vote on an open board item (R08 of goal 1000069, ADR 0175). |
355
355
  | GET | `/api/bongos/government/constitution` | `any-builder` | — | board.vote.cast — the Constitution view (R18 of goal 1000069): the live board block plus the full amendment history, passed and returned … |
356
+ | GET | `/api/bongos/government/docket` | `any-builder` | — | board.vote.cast — the governor's DOCKET (task 1004523, goal 1000125): ONE read of every matter waiting on, or moving for, a governor, whi… |
356
357
  | GET | `/api/bongos/government/permissions` | `archon` | — | government.manage — the permission catalog + principals, straight from code (the catalog is CODE, not a table); no DB read. |
357
358
  | POST | `/api/bongos/government/rank-sets/apply` | `archon` | `type`, `headcount` | government.manage — add a RECOMMENDED RANK SET (task 1004400): the custom ranks recommendations.js names for a project type and size, eac… |
358
359
  | GET | `/api/bongos/government/ranks` | `archon` | — | government.manage — the full rank list with each rank's grants. |
@@ -766,7 +767,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
766
767
 
767
768
  | Method | Path | Rank | Body | Description |
768
769
  |---|---|---|---|---|
769
- | POST | `/api/bongos/sso/activity/rollup` | `public` | `client_id`, `client_secret`, `github_id`, `credits`, `tasks_shipped`, `karma`, `rank`, `disciplines`, `recent_ships` | POST /sso/activity/rollup — a federated instance reports a builder's activity snapshot (ADR 0141 §4). |
770
+ | POST | `/api/bongos/sso/activity/rollup` | `public` | `client_id`, `client_secret`, `github_id`, `credits`, `tasks_shipped`, `karma`, `rank`, `disciplines`, `recent_ships`, `crafts` | POST /sso/activity/rollup — a federated instance reports a builder's activity snapshot (ADR 0141 §4). |
770
771
  | POST | `/api/bongos/sso/applicant-profile` | `public` | `client_id`, `client_secret`, `github_id` | POST /sso/applicant-profile — a federated instance resolves ONE applicant's profile view for its own reviewer queue, LIVE at render (priv… |
771
772
  | GET | `/api/bongos/sso/authorize` | `public` | — | GET /sso/authorize?client_id=&redirect_uri=&state= — the browser authorize leg. |
772
773
  | POST | `/api/bongos/sso/device/poll` | `public` | `device_code` | POST /sso/device/poll — poll the hub device flow. |