@bongos/core 1.24.9 → 1.24.11

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 (91) hide show
  1. package/.bongos-core.json +146 -86
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +14 -0
  4. package/clients/bongos-client/index.cjs +14 -0
  5. package/clients/bongos-client/index.d.ts +20 -1
  6. package/clients/bongos-client/index.mjs +14 -0
  7. package/docs/api/openapi.json +308 -5
  8. package/docs/api-reference.md +15 -4
  9. package/docs/architecture.md +4 -0
  10. package/docs/copy-inventory.md +109 -75
  11. package/docs/copy-registry.json +425 -89
  12. package/docs/module-api-changelog.md +4 -0
  13. package/docs/page-inventory.json +34 -4
  14. package/docs/page-readings.json +301 -244
  15. package/modules/government/decision-rules.js +1 -0
  16. package/modules/hall-ui/public/ai-studio.html +2 -2
  17. package/modules/hall-ui/public/atlas.html +2 -2
  18. package/modules/hall-ui/public/blockers.html +2 -2
  19. package/modules/hall-ui/public/board-room.html +2 -2
  20. package/modules/hall-ui/public/city.html +2 -2
  21. package/modules/hall-ui/public/collab.html +2 -2
  22. package/modules/hall-ui/public/commands.html +2 -2
  23. package/modules/hall-ui/public/copy-desk.html +2 -2
  24. package/modules/hall-ui/public/craft-mode.js +1 -1
  25. package/modules/hall-ui/public/deploy.html +2 -2
  26. package/modules/hall-ui/public/diagrams.html +2 -2
  27. package/modules/hall-ui/public/drachmae.html +2 -2
  28. package/modules/hall-ui/public/fleet.html +2 -2
  29. package/modules/hall-ui/public/gate.html +2 -2
  30. package/modules/hall-ui/public/goal-map.html +2 -2
  31. package/modules/hall-ui/public/goals.html +2 -2
  32. package/modules/hall-ui/public/government.html +2 -2
  33. package/modules/hall-ui/public/idea.html +2 -2
  34. package/modules/hall-ui/public/ideas.html +2 -2
  35. package/modules/hall-ui/public/index.html +2 -2
  36. package/modules/hall-ui/public/market-watch-rules.html +2 -2
  37. package/modules/hall-ui/public/market-watch-settings.css +217 -0
  38. package/modules/hall-ui/public/market-watch-settings.html +113 -0
  39. package/modules/hall-ui/public/market-watch-settings.js +230 -0
  40. package/modules/hall-ui/public/market-watch-settings.states.json +14 -0
  41. package/modules/hall-ui/public/modules.html +2 -2
  42. package/modules/hall-ui/public/my-agents.html +2 -2
  43. package/modules/hall-ui/public/primer.html +2 -2
  44. package/modules/hall-ui/public/profile.html +2 -2
  45. package/modules/hall-ui/public/project-settings.css +12 -0
  46. package/modules/hall-ui/public/project-settings.html +2 -2
  47. package/modules/hall-ui/public/project-settings.js +63 -1
  48. package/modules/hall-ui/public/ranks.html +2 -2
  49. package/modules/hall-ui/public/roadmap.html +2 -2
  50. package/modules/hall-ui/public/roster.html +2 -2
  51. package/modules/hall-ui/public/sessions.html +2 -2
  52. package/modules/hall-ui/public/settings.html +2 -2
  53. package/modules/hall-ui/public/shell.js +3 -0
  54. package/modules/hall-ui/public/street.html +2 -2
  55. package/modules/hall-ui/public/studio.html +2 -2
  56. package/modules/hall-ui/public/task.html +2 -2
  57. package/modules/hall-ui/public/task.js +34 -1
  58. package/modules/hall-ui/public/thinking.html +2 -2
  59. package/modules/hall-ui/public/tweak-editor.html +2 -2
  60. package/modules/hall-ui/public/watch.html +2 -2
  61. package/modules/hall-ui/public/work.html +2 -2
  62. package/modules/hall-ui/records/market-watch-settings.md +11 -0
  63. package/modules/lifecycle/migrations/lifecycle_018_pay_terms.sql +64 -0
  64. package/modules/lifecycle/pay-terms.js +171 -0
  65. package/modules/lifecycle/routes/project-settings.js +94 -0
  66. package/modules/lifecycle/routes/task-write-routes.js +35 -4
  67. package/modules/market-watch/module.json +3 -2
  68. package/modules/market-watch/routes/settings.js +128 -0
  69. package/modules/market-watch/settings.js +207 -0
  70. package/modules/provisioning/starter-bundles.js +11 -6
  71. package/modules/ui-design/kit/serve.js +1 -0
  72. package/package-lock.json +2 -2
  73. package/package.json +1 -1
  74. package/release-notes.json +12 -0
  75. package/scripts/bongos/government-walk.js +1 -0
  76. package/scripts/bongos/run-unit-tests.js +4 -0
  77. package/scripts/bongos/start.js +42 -2
  78. package/src/bongos/module-scope-map.js +1 -0
  79. package/src/bongos/serve-internal.js +2 -2
  80. package/src/module-api.js +1 -1
  81. package/tests/government_act_alone_buildings.mjs +1 -0
  82. package/tests/hall_nav.mjs +4 -2
  83. package/tests/hall_page_gate_map.mjs +4 -0
  84. package/tests/market_watch_data_db.mjs +27 -0
  85. package/tests/market_watch_module.mjs +8 -4
  86. package/tests/market_watch_settings.mjs +392 -0
  87. package/tests/nav_permission_atoms.mjs +3 -2
  88. package/tests/patch_gate_ordering.mjs +3 -0
  89. package/tests/pay_terms.mjs +254 -0
  90. package/tests/pay_terms_db.mjs +86 -0
  91. package/tests/project_settings_page.mjs +25 -6
@@ -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
- - 643 operations across 80 resource groups
8
+ - 649 operations across 81 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -771,6 +771,14 @@ function createClient(opts = {}) {
771
771
  getMarketWatchRules: (args) => request("GET", "/market-watch/rules", { hasBody: false }, args),
772
772
  // POST /market-watch/rules/proposals — rank: any-builder — POST /market-watch/rules/proposals
773
773
  postMarketWatchRulesProposals: (args) => request("POST", "/market-watch/rules/proposals", { hasBody: true }, args),
774
+ // GET /market-watch/settings — rank: metic+archon — GET /market-watch/settings
775
+ getMarketWatchSettings: (args) => request("GET", "/market-watch/settings", { hasBody: false }, args),
776
+ // PATCH /market-watch/settings — rank: metic+archon — PATCH /market-watch/settings
777
+ patchMarketWatchSettings: (args) => request("PATCH", "/market-watch/settings", { hasBody: true }, args),
778
+ // DELETE /market-watch/settings/key — rank: metic+archon — DELETE /market-watch/settings/key
779
+ deleteMarketWatchSettingsKey: (args) => request("DELETE", "/market-watch/settings/key", { hasBody: false }, args),
780
+ // PUT /market-watch/settings/key — rank: metic+archon — PUT /market-watch/settings/key
781
+ putMarketWatchSettingsKey: (args) => request("PUT", "/market-watch/settings/key", { hasBody: true }, args),
774
782
  },
775
783
  "me": {
776
784
  // GET /me — rank: any-builder — GET /me
@@ -1004,6 +1012,10 @@ function createClient(opts = {}) {
1004
1012
  // GET /page-notes/site — rank: any-builder — GET /page-notes/site
1005
1013
  getPageNotesSite: (args) => request("GET", "/page-notes/site", { hasBody: false }, args),
1006
1014
  },
1015
+ "payTerms": {
1016
+ // GET /pay-terms — rank: any-builder — GET /pay-terms
1017
+ getPayTerms: (args) => request("GET", "/pay-terms", { hasBody: false }, args),
1018
+ },
1007
1019
  "payouts": {
1008
1020
  // POST /payouts/age-records — rank: archon — POST /payouts/age-records
1009
1021
  postPayoutsAgeRecords: (args) => request("POST", "/payouts/age-records", { hasBody: true }, args),
@@ -1049,6 +1061,8 @@ function createClient(opts = {}) {
1049
1061
  "projectSettings": {
1050
1062
  // GET /project-settings — rank: metic+archon — GET /project-settings
1051
1063
  getProjectSettings: (args) => request("GET", "/project-settings", { hasBody: false }, args),
1064
+ // PATCH /project-settings/pay-terms — rank: metic+archon — PATCH /project-settings/pay-terms
1065
+ patchProjectSettingsPayTerms: (args) => request("PATCH", "/project-settings/pay-terms", { hasBody: true }, args),
1052
1066
  // PATCH /project-settings/rot-days — rank: metic+archon — PATCH /project-settings/rot-days
1053
1067
  patchProjectSettingsRotDays: (args) => request("PATCH", "/project-settings/rot-days", { hasBody: true }, args),
1054
1068
  // GET /project-settings/ship-mode — rank: any-builder — GET /project-settings/ship-mode
@@ -770,6 +770,14 @@ function createClient(opts = {}) {
770
770
  getMarketWatchRules: (args) => request("GET", "/market-watch/rules", { hasBody: false }, args),
771
771
  // POST /market-watch/rules/proposals — rank: any-builder — POST /market-watch/rules/proposals
772
772
  postMarketWatchRulesProposals: (args) => request("POST", "/market-watch/rules/proposals", { hasBody: true }, args),
773
+ // GET /market-watch/settings — rank: metic+archon — GET /market-watch/settings
774
+ getMarketWatchSettings: (args) => request("GET", "/market-watch/settings", { hasBody: false }, args),
775
+ // PATCH /market-watch/settings — rank: metic+archon — PATCH /market-watch/settings
776
+ patchMarketWatchSettings: (args) => request("PATCH", "/market-watch/settings", { hasBody: true }, args),
777
+ // DELETE /market-watch/settings/key — rank: metic+archon — DELETE /market-watch/settings/key
778
+ deleteMarketWatchSettingsKey: (args) => request("DELETE", "/market-watch/settings/key", { hasBody: false }, args),
779
+ // PUT /market-watch/settings/key — rank: metic+archon — PUT /market-watch/settings/key
780
+ putMarketWatchSettingsKey: (args) => request("PUT", "/market-watch/settings/key", { hasBody: true }, args),
773
781
  },
774
782
  "me": {
775
783
  // GET /me — rank: any-builder — GET /me
@@ -1003,6 +1011,10 @@ function createClient(opts = {}) {
1003
1011
  // GET /page-notes/site — rank: any-builder — GET /page-notes/site
1004
1012
  getPageNotesSite: (args) => request("GET", "/page-notes/site", { hasBody: false }, args),
1005
1013
  },
1014
+ "payTerms": {
1015
+ // GET /pay-terms — rank: any-builder — GET /pay-terms
1016
+ getPayTerms: (args) => request("GET", "/pay-terms", { hasBody: false }, args),
1017
+ },
1006
1018
  "payouts": {
1007
1019
  // POST /payouts/age-records — rank: archon — POST /payouts/age-records
1008
1020
  postPayoutsAgeRecords: (args) => request("POST", "/payouts/age-records", { hasBody: true }, args),
@@ -1048,6 +1060,8 @@ function createClient(opts = {}) {
1048
1060
  "projectSettings": {
1049
1061
  // GET /project-settings — rank: metic+archon — GET /project-settings
1050
1062
  getProjectSettings: (args) => request("GET", "/project-settings", { hasBody: false }, args),
1063
+ // PATCH /project-settings/pay-terms — rank: metic+archon — PATCH /project-settings/pay-terms
1064
+ patchProjectSettingsPayTerms: (args) => request("PATCH", "/project-settings/pay-terms", { hasBody: true }, args),
1051
1065
  // PATCH /project-settings/rot-days — rank: metic+archon — PATCH /project-settings/rot-days
1052
1066
  patchProjectSettingsRotDays: (args) => request("PATCH", "/project-settings/rot-days", { hasBody: true }, args),
1053
1067
  // GET /project-settings/ship-mode — rank: any-builder — GET /project-settings/ship-mode
@@ -141,6 +141,7 @@ export interface GetPageNotesIdResponse { note: unknown; images: unknown; ideas:
141
141
  export interface GetPageNotesIdeasResponse { page_path: unknown; ideas: unknown }
142
142
  export interface GetPageNotesResponse { page_id: unknown; notes: unknown }
143
143
  export interface GetPageNotesSiteResponse { notes: unknown }
144
+ export interface GetPayTermsResponse { pay_terms: unknown }
144
145
  export interface GetPayoutsApprovalsResponse { approvals: unknown }
145
146
  export interface GetPayoutsGatesBuilderIdResponse { gate: unknown }
146
147
  export interface GetPayoutsRulesResponse { rules: unknown }
@@ -243,6 +244,7 @@ export interface PatchInboxIdBodyRequest { body_md: string }
243
244
  export interface PatchInboxIdBodyResponse { ok: boolean; idea: unknown; delta: unknown; unchanged: unknown }
244
245
  export interface PatchInboxIdRequest { status?: "open" | "promoted" | "discarded" | "merged"; kind?: string; promoted_to_task_id?: number; reviewed_at?: unknown; merged_into_idea_id?: number; triage_note?: string }
245
246
  export interface PatchInboxIdResponse { idea: unknown }
247
+ export interface PatchMarketWatchSettingsRequest { enabled?: unknown; monthly_cap_usd?: unknown; cadence?: unknown }
246
248
  export interface PatchMeCoreMoveSeenRequest { id: string }
247
249
  export interface PatchMeCoreMoveSeenResponse { ok: boolean; seen: unknown }
248
250
  export interface PatchMeCrossProjectRequest { hide_stats?: boolean; account_visibility?: string; recruiter_discoverable?: boolean }
@@ -263,6 +265,8 @@ export interface PatchNotesIdRequest { kind: string }
263
265
  export interface PatchNotesIdResponse { ok: boolean; note: unknown }
264
266
  export interface PatchPageNotesIdRequest { body_md: string }
265
267
  export interface PatchPageNotesIdResponse { ok: boolean; updated_at: unknown }
268
+ export interface PatchProjectSettingsPayTermsRequest { terms: unknown }
269
+ export interface PatchProjectSettingsPayTermsResponse { ok: boolean; row: unknown }
266
270
  export interface PatchProjectSettingsRotDaysRequest { days: number }
267
271
  export interface PatchProjectSettingsRotDaysResponse { ok: boolean; rot_days: unknown; source: unknown; describe: unknown }
268
272
  export interface PatchProjectSettingsShipModeRequest { mode: string }
@@ -284,7 +288,7 @@ export interface PatchSpecialitiesIdRequest { name?: string; summary?: string; c
284
288
  export interface PatchSpecialitiesIdResponse { speciality: unknown }
285
289
  export interface PatchTaskRecommendationsIdRequest { status: "declined" | "withdrawn" }
286
290
  export interface PatchTaskRecommendationsIdResponse { ok: boolean; recommendation: unknown }
287
- export interface PatchTasksIdRequest { kind?: string; discipline?: string; requires_rank?: string; module_key?: string; goal_id?: number; parent_task_id?: StringifiableId; parallel_safe?: unknown; newcomer_friendly?: boolean; xenos_claimable?: boolean; security_sensitive?: boolean; automation_tag?: string; needs?: unknown; needs_migration?: boolean; description?: string; title?: string; priority?: unknown; value_summary?: string; status?: unknown }
291
+ export interface PatchTasksIdRequest { kind?: string; discipline?: string; requires_rank?: string; module_key?: string; goal_id?: number; parent_task_id?: StringifiableId; parallel_safe?: unknown; newcomer_friendly?: boolean; xenos_claimable?: boolean; security_sensitive?: boolean; automation_tag?: string; needs?: unknown; needs_migration?: boolean; description?: string; title?: string; priority?: unknown; value_summary?: string; status?: unknown; pay_terms?: unknown }
288
292
  export interface PostAccessRequestsInviteRequest { github_login: string; note?: string }
289
293
  export interface PostAccessRequestsInviteResponse { ok: boolean; already_invited?: boolean; github_login?: unknown; request?: unknown }
290
294
  export interface PostAccessRequestsRequest { github_login: string; display_name?: string; note?: string }
@@ -680,6 +684,7 @@ export interface PutDoneWhenCriterionIdBackendOnlyResponse { ok: boolean; criter
680
684
  export interface PutGovernmentAsksMatterIdResponse { ok: boolean; matter_id: unknown; ask: unknown }
681
685
  export interface PutGovernmentRanksRankKeyPermissionsPermissionKeyResponse { ok: boolean; rank_key: unknown; permission_key: unknown; granted: unknown }
682
686
  export interface PutGovernmentTreasuryPotsGoalIdRequest { budget_usd?: unknown }
687
+ export interface PutMarketWatchSettingsKeyRequest { key: string }
683
688
  export interface PutMingleOptInRequest { opted_in: boolean }
684
689
  export interface PutMingleOptInResponse { opted_in: unknown; updated_at: unknown }
685
690
  export interface PutMingleProjectRequest { enabled: boolean }
@@ -1395,6 +1400,14 @@ export interface BongosClient {
1395
1400
  getMarketWatchRules(args?: RequestArgs): Promise<ApiResponse>;
1396
1401
  /** POST /market-watch/rules/proposals — rank: any-builder */
1397
1402
  postMarketWatchRulesProposals(args: RequestArgs & { body: PostMarketWatchRulesProposalsRequest }): Promise<PostMarketWatchRulesProposalsResponse>;
1403
+ /** GET /market-watch/settings — rank: metic+archon */
1404
+ getMarketWatchSettings(args?: RequestArgs): Promise<ApiResponse>;
1405
+ /** PATCH /market-watch/settings — rank: metic+archon */
1406
+ patchMarketWatchSettings(args?: RequestArgs & { body?: PatchMarketWatchSettingsRequest }): Promise<ApiResponse>;
1407
+ /** DELETE /market-watch/settings/key — rank: metic+archon */
1408
+ deleteMarketWatchSettingsKey(args?: RequestArgs): Promise<ApiResponse>;
1409
+ /** PUT /market-watch/settings/key — rank: metic+archon */
1410
+ putMarketWatchSettingsKey(args: RequestArgs & { body: PutMarketWatchSettingsKeyRequest }): Promise<ApiResponse>;
1398
1411
  };
1399
1412
  "me": {
1400
1413
  /** GET /me — rank: any-builder */
@@ -1628,6 +1641,10 @@ export interface BongosClient {
1628
1641
  /** GET /page-notes/site — rank: any-builder */
1629
1642
  getPageNotesSite(args?: RequestArgs): Promise<GetPageNotesSiteResponse>;
1630
1643
  };
1644
+ "payTerms": {
1645
+ /** GET /pay-terms — rank: any-builder */
1646
+ getPayTerms(args?: RequestArgs): Promise<GetPayTermsResponse>;
1647
+ };
1631
1648
  "payouts": {
1632
1649
  /** POST /payouts/age-records — rank: archon */
1633
1650
  postPayoutsAgeRecords(args: RequestArgs & { body: PostPayoutsAgeRecordsRequest }): Promise<PostPayoutsAgeRecordsResponse>;
@@ -1673,6 +1690,8 @@ export interface BongosClient {
1673
1690
  "projectSettings": {
1674
1691
  /** GET /project-settings — rank: metic+archon */
1675
1692
  getProjectSettings(args?: RequestArgs): Promise<GetProjectSettingsResponse>;
1693
+ /** PATCH /project-settings/pay-terms — rank: metic+archon */
1694
+ patchProjectSettingsPayTerms(args: RequestArgs & { body: PatchProjectSettingsPayTermsRequest }): Promise<PatchProjectSettingsPayTermsResponse>;
1676
1695
  /** PATCH /project-settings/rot-days — rank: metic+archon */
1677
1696
  patchProjectSettingsRotDays(args: RequestArgs & { body: PatchProjectSettingsRotDaysRequest }): Promise<PatchProjectSettingsRotDaysResponse>;
1678
1697
  /** GET /project-settings/ship-mode — rank: any-builder */
@@ -767,6 +767,14 @@ export function createClient(opts = {}) {
767
767
  getMarketWatchRules: (args) => request("GET", "/market-watch/rules", { hasBody: false }, args),
768
768
  // POST /market-watch/rules/proposals — rank: any-builder — POST /market-watch/rules/proposals
769
769
  postMarketWatchRulesProposals: (args) => request("POST", "/market-watch/rules/proposals", { hasBody: true }, args),
770
+ // GET /market-watch/settings — rank: metic+archon — GET /market-watch/settings
771
+ getMarketWatchSettings: (args) => request("GET", "/market-watch/settings", { hasBody: false }, args),
772
+ // PATCH /market-watch/settings — rank: metic+archon — PATCH /market-watch/settings
773
+ patchMarketWatchSettings: (args) => request("PATCH", "/market-watch/settings", { hasBody: true }, args),
774
+ // DELETE /market-watch/settings/key — rank: metic+archon — DELETE /market-watch/settings/key
775
+ deleteMarketWatchSettingsKey: (args) => request("DELETE", "/market-watch/settings/key", { hasBody: false }, args),
776
+ // PUT /market-watch/settings/key — rank: metic+archon — PUT /market-watch/settings/key
777
+ putMarketWatchSettingsKey: (args) => request("PUT", "/market-watch/settings/key", { hasBody: true }, args),
770
778
  },
771
779
  "me": {
772
780
  // GET /me — rank: any-builder — GET /me
@@ -1000,6 +1008,10 @@ export function createClient(opts = {}) {
1000
1008
  // GET /page-notes/site — rank: any-builder — GET /page-notes/site
1001
1009
  getPageNotesSite: (args) => request("GET", "/page-notes/site", { hasBody: false }, args),
1002
1010
  },
1011
+ "payTerms": {
1012
+ // GET /pay-terms — rank: any-builder — GET /pay-terms
1013
+ getPayTerms: (args) => request("GET", "/pay-terms", { hasBody: false }, args),
1014
+ },
1003
1015
  "payouts": {
1004
1016
  // POST /payouts/age-records — rank: archon — POST /payouts/age-records
1005
1017
  postPayoutsAgeRecords: (args) => request("POST", "/payouts/age-records", { hasBody: true }, args),
@@ -1045,6 +1057,8 @@ export function createClient(opts = {}) {
1045
1057
  "projectSettings": {
1046
1058
  // GET /project-settings — rank: metic+archon — GET /project-settings
1047
1059
  getProjectSettings: (args) => request("GET", "/project-settings", { hasBody: false }, args),
1060
+ // PATCH /project-settings/pay-terms — rank: metic+archon — PATCH /project-settings/pay-terms
1061
+ patchProjectSettingsPayTerms: (args) => request("PATCH", "/project-settings/pay-terms", { hasBody: true }, args),
1048
1062
  // PATCH /project-settings/rot-days — rank: metic+archon — PATCH /project-settings/rot-days
1049
1063
  patchProjectSettingsRotDays: (args) => request("PATCH", "/project-settings/rot-days", { hasBody: true }, args),
1050
1064
  // GET /project-settings/ship-mode — rank: any-builder — GET /project-settings/ship-mode
@@ -241,6 +241,10 @@
241
241
  "name": "page-notes",
242
242
  "description": "Endpoints under `/api/bongos/page-notes`."
243
243
  },
244
+ {
245
+ "name": "pay-terms",
246
+ "description": "Endpoints under `/api/bongos/pay-terms`."
247
+ },
244
248
  {
245
249
  "name": "payouts",
246
250
  "description": "Endpoints under `/api/bongos/payouts`."
@@ -14269,6 +14273,160 @@
14269
14273
  ]
14270
14274
  }
14271
14275
  },
14276
+ "/market-watch/settings": {
14277
+ "get": {
14278
+ "operationId": "get_market_watch_settings",
14279
+ "tags": [
14280
+ "market-watch"
14281
+ ],
14282
+ "summary": "GET /market-watch/settings",
14283
+ "description": "**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.settings.manage` (all required).",
14284
+ "x-rank": "metic+archon",
14285
+ "x-source": "modules/market-watch/routes/settings.js",
14286
+ "x-permissions": [
14287
+ "project.settings.manage"
14288
+ ],
14289
+ "responses": {
14290
+ "200": {
14291
+ "description": "Success."
14292
+ },
14293
+ "400": {
14294
+ "$ref": "#/components/responses/BadRequest"
14295
+ },
14296
+ "401": {
14297
+ "$ref": "#/components/responses/Unauthorized"
14298
+ },
14299
+ "403": {
14300
+ "$ref": "#/components/responses/Forbidden"
14301
+ }
14302
+ },
14303
+ "security": [
14304
+ {
14305
+ "builderSession": []
14306
+ }
14307
+ ]
14308
+ },
14309
+ "patch": {
14310
+ "operationId": "patch_market_watch_settings",
14311
+ "tags": [
14312
+ "market-watch"
14313
+ ],
14314
+ "summary": "PATCH /market-watch/settings",
14315
+ "description": "**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.settings.manage` (all required).",
14316
+ "x-rank": "metic+archon",
14317
+ "x-source": "modules/market-watch/routes/settings.js",
14318
+ "x-permissions": [
14319
+ "project.settings.manage"
14320
+ ],
14321
+ "requestBody": {
14322
+ "required": false,
14323
+ "content": {
14324
+ "application/json": {
14325
+ "schema": {
14326
+ "$ref": "#/components/schemas/PatchMarketWatchSettingsRequest"
14327
+ }
14328
+ }
14329
+ },
14330
+ "x-validated": true
14331
+ },
14332
+ "responses": {
14333
+ "200": {
14334
+ "description": "Success."
14335
+ },
14336
+ "400": {
14337
+ "$ref": "#/components/responses/ValidationFailed"
14338
+ },
14339
+ "401": {
14340
+ "$ref": "#/components/responses/Unauthorized"
14341
+ },
14342
+ "403": {
14343
+ "$ref": "#/components/responses/Forbidden"
14344
+ }
14345
+ },
14346
+ "security": [
14347
+ {
14348
+ "builderSession": []
14349
+ }
14350
+ ]
14351
+ }
14352
+ },
14353
+ "/market-watch/settings/key": {
14354
+ "put": {
14355
+ "operationId": "put_market_watch_settings_key",
14356
+ "tags": [
14357
+ "market-watch"
14358
+ ],
14359
+ "summary": "PUT /market-watch/settings/key",
14360
+ "description": "**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.settings.manage` (all required).",
14361
+ "x-rank": "metic+archon",
14362
+ "x-source": "modules/market-watch/routes/settings.js",
14363
+ "x-permissions": [
14364
+ "project.settings.manage"
14365
+ ],
14366
+ "requestBody": {
14367
+ "required": true,
14368
+ "content": {
14369
+ "application/json": {
14370
+ "schema": {
14371
+ "$ref": "#/components/schemas/PutMarketWatchSettingsKeyRequest"
14372
+ }
14373
+ }
14374
+ },
14375
+ "x-validated": true
14376
+ },
14377
+ "responses": {
14378
+ "200": {
14379
+ "description": "Success."
14380
+ },
14381
+ "400": {
14382
+ "$ref": "#/components/responses/ValidationFailed"
14383
+ },
14384
+ "401": {
14385
+ "$ref": "#/components/responses/Unauthorized"
14386
+ },
14387
+ "403": {
14388
+ "$ref": "#/components/responses/Forbidden"
14389
+ }
14390
+ },
14391
+ "security": [
14392
+ {
14393
+ "builderSession": []
14394
+ }
14395
+ ]
14396
+ },
14397
+ "delete": {
14398
+ "operationId": "delete_market_watch_settings_key",
14399
+ "tags": [
14400
+ "market-watch"
14401
+ ],
14402
+ "summary": "DELETE /market-watch/settings/key",
14403
+ "description": "**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.settings.manage` (all required).",
14404
+ "x-rank": "metic+archon",
14405
+ "x-source": "modules/market-watch/routes/settings.js",
14406
+ "x-permissions": [
14407
+ "project.settings.manage"
14408
+ ],
14409
+ "responses": {
14410
+ "200": {
14411
+ "description": "Success."
14412
+ },
14413
+ "400": {
14414
+ "$ref": "#/components/responses/BadRequest"
14415
+ },
14416
+ "401": {
14417
+ "$ref": "#/components/responses/Unauthorized"
14418
+ },
14419
+ "403": {
14420
+ "$ref": "#/components/responses/Forbidden"
14421
+ }
14422
+ },
14423
+ "security": [
14424
+ {
14425
+ "builderSession": []
14426
+ }
14427
+ ]
14428
+ }
14429
+ },
14272
14430
  "/me": {
14273
14431
  "get": {
14274
14432
  "operationId": "get_me",
@@ -18959,6 +19117,44 @@
18959
19117
  ]
18960
19118
  }
18961
19119
  },
19120
+ "/pay-terms": {
19121
+ "get": {
19122
+ "operationId": "get_pay_terms",
19123
+ "tags": [
19124
+ "pay-terms"
19125
+ ],
19126
+ "summary": "GET /pay-terms",
19127
+ "description": "GET /pay-terms?task_ids=1,2,3 — what each task pays, in the project's words (task 1004990, ADR 0385 D3), for a list of tasks in one read: the hall task page and `bongos start` show it so a builder sees the pay BEFORE claiming. Each entry is { source: 'task' | 'project' | 'none', terms, set_by, set_at }; a task with none of its own shows the project's standing terms (set below), and a self-managed term carries its \"Bongos does not move or guarantee this money\" label. Records only — no amount here is a Bongos figure. It lives beside the standing-terms write because both serve the one pay-terms table pair. rank: any-builder — the same task metadata GET /tasks/:id serves; nothing changed.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
19128
+ "x-rank": "any-builder",
19129
+ "x-source": "modules/lifecycle/routes/project-settings.js",
19130
+ "responses": {
19131
+ "200": {
19132
+ "description": "Success.",
19133
+ "content": {
19134
+ "application/json": {
19135
+ "schema": {
19136
+ "$ref": "#/components/schemas/GetPayTermsResponse"
19137
+ }
19138
+ }
19139
+ }
19140
+ },
19141
+ "400": {
19142
+ "$ref": "#/components/responses/BadRequest"
19143
+ },
19144
+ "401": {
19145
+ "$ref": "#/components/responses/Unauthorized"
19146
+ },
19147
+ "403": {
19148
+ "$ref": "#/components/responses/Forbidden"
19149
+ }
19150
+ },
19151
+ "security": [
19152
+ {
19153
+ "builderSession": []
19154
+ }
19155
+ ]
19156
+ }
19157
+ },
18962
19158
  "/payouts/age-records": {
18963
19159
  "post": {
18964
19160
  "operationId": "post_payouts_age_records",
@@ -19896,6 +20092,58 @@
19896
20092
  ]
19897
20093
  }
19898
20094
  },
20095
+ "/project-settings/pay-terms": {
20096
+ "patch": {
20097
+ "operationId": "patch_project_settings_pay_terms",
20098
+ "tags": [
20099
+ "project-settings"
20100
+ ],
20101
+ "summary": "PATCH /project-settings/pay-terms",
20102
+ "description": "PATCH /project-settings/pay-terms — body { terms: [{ pay_type, amount?, unit?, note? }] } (task 1004990; ADR 0385 decision 3 and the owner's 2026-10-29 ruling). The project's STANDING pay terms: what a builder is shown on any task that carries none of its own. The whole list replaces the current set; [] means none. Every change is a new row naming who set it and when, and the old sets stay, so the table is the audit trail the owner asked for. Bongos fills nothing in. rank: project.settings.manage (metic+, government_010), the same atom as the other writes on this page.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.settings.manage` (all required).",
20103
+ "x-rank": "metic+archon",
20104
+ "x-source": "modules/lifecycle/routes/project-settings.js",
20105
+ "x-permissions": [
20106
+ "project.settings.manage"
20107
+ ],
20108
+ "requestBody": {
20109
+ "required": true,
20110
+ "content": {
20111
+ "application/json": {
20112
+ "schema": {
20113
+ "$ref": "#/components/schemas/PatchProjectSettingsPayTermsRequest"
20114
+ }
20115
+ }
20116
+ },
20117
+ "x-validated": true
20118
+ },
20119
+ "responses": {
20120
+ "200": {
20121
+ "description": "Success.",
20122
+ "content": {
20123
+ "application/json": {
20124
+ "schema": {
20125
+ "$ref": "#/components/schemas/PatchProjectSettingsPayTermsResponse"
20126
+ }
20127
+ }
20128
+ }
20129
+ },
20130
+ "400": {
20131
+ "$ref": "#/components/responses/ValidationFailed"
20132
+ },
20133
+ "401": {
20134
+ "$ref": "#/components/responses/Unauthorized"
20135
+ },
20136
+ "403": {
20137
+ "$ref": "#/components/responses/Forbidden"
20138
+ }
20139
+ },
20140
+ "security": [
20141
+ {
20142
+ "builderSession": []
20143
+ }
20144
+ ]
20145
+ }
20146
+ },
19899
20147
  "/project-settings/rot-days": {
19900
20148
  "patch": {
19901
20149
  "operationId": "patch_project_settings_rot_days",
@@ -27668,7 +27916,7 @@
27668
27916
  "tasks"
27669
27917
  ],
27670
27918
  "summary": "POST /tasks",
27671
- "description": "Task create/promote/edit (plan/scope mutation) is Metic+ as of ADR 0090 (owner decision 2026-06-26): a Metic who can run idea-triage may also seed + shape tasks. Was Archon-only (task task 106 / ADR 0016; three-rank model task 360 / ADR 0018). A Xenos/Thetes still cannot author — they file ideas. Setting rank and closing versions stay Archon. The every-route audit is task task 231 (V3.R06). rank: metic+archon — create work (plan/scope mutation); ADR 0090 (was ADR 0016/0018 archon).\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `task.create` (all required).",
27919
+ "description": "Task create/promote/edit (plan/scope mutation) is Metic+ as of ADR 0090 (owner decision 2026-06-26): a Metic who can run idea-triage may also seed + shape tasks. Was Archon-only (task task 106 / ADR 0016; three-rank model task 360 / ADR 0018). A Xenos/Thetes still cannot author — they file ideas. Setting rank and closing versions stay Archon. The every-route audit is task task 231 (V3.R06). NO pay_terms HERE, on purpose (task 1004990): the task's rule is that only someone who may EDIT a task sets its pay terms, and this route is gated on task.create, not task.edit — so terms are set with PATCH /tasks/:id right after create, under that route's task.edit gate. The strict validator refuses the field here rather than letting a create quietly widen who may set pay. rank: metic+archon — create work (plan/scope mutation); ADR 0090 (was ADR 0016/0018 archon).\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `task.create` (all required).",
27672
27920
  "x-rank": "metic+archon",
27673
27921
  "x-source": "modules/lifecycle/routes/task-write-routes.js",
27674
27922
  "x-permissions": [
@@ -31898,6 +32146,15 @@
31898
32146
  "notes"
31899
32147
  ]
31900
32148
  },
32149
+ "GetPayTermsResponse": {
32150
+ "type": "object",
32151
+ "properties": {
32152
+ "pay_terms": {}
32153
+ },
32154
+ "required": [
32155
+ "pay_terms"
32156
+ ]
32157
+ },
31901
32158
  "GetPayoutsApprovalsResponse": {
31902
32159
  "type": "object",
31903
32160
  "properties": {
@@ -33196,6 +33453,15 @@
33196
33453
  "idea"
33197
33454
  ]
33198
33455
  },
33456
+ "PatchMarketWatchSettingsRequest": {
33457
+ "type": "object",
33458
+ "properties": {
33459
+ "enabled": {},
33460
+ "monthly_cap_usd": {},
33461
+ "cadence": {}
33462
+ },
33463
+ "additionalProperties": false
33464
+ },
33199
33465
  "PatchMeCoreMoveSeenRequest": {
33200
33466
  "type": "object",
33201
33467
  "properties": {
@@ -33478,6 +33744,29 @@
33478
33744
  "updated_at"
33479
33745
  ]
33480
33746
  },
33747
+ "PatchProjectSettingsPayTermsRequest": {
33748
+ "type": "object",
33749
+ "properties": {
33750
+ "terms": {}
33751
+ },
33752
+ "required": [
33753
+ "terms"
33754
+ ],
33755
+ "additionalProperties": false
33756
+ },
33757
+ "PatchProjectSettingsPayTermsResponse": {
33758
+ "type": "object",
33759
+ "properties": {
33760
+ "ok": {
33761
+ "type": "boolean"
33762
+ },
33763
+ "row": {}
33764
+ },
33765
+ "required": [
33766
+ "ok",
33767
+ "row"
33768
+ ]
33769
+ },
33481
33770
  "PatchProjectSettingsRotDaysRequest": {
33482
33771
  "type": "object",
33483
33772
  "properties": {
@@ -33863,7 +34152,8 @@
33863
34152
  "minLength": 1,
33864
34153
  "maxLength": 1000
33865
34154
  },
33866
- "status": {}
34155
+ "status": {},
34156
+ "pay_terms": {}
33867
34157
  },
33868
34158
  "additionalProperties": false
33869
34159
  },
@@ -40503,6 +40793,19 @@
40503
40793
  },
40504
40794
  "additionalProperties": false
40505
40795
  },
40796
+ "PutMarketWatchSettingsKeyRequest": {
40797
+ "type": "object",
40798
+ "properties": {
40799
+ "key": {
40800
+ "type": "string",
40801
+ "maxLength": 512
40802
+ }
40803
+ },
40804
+ "required": [
40805
+ "key"
40806
+ ],
40807
+ "additionalProperties": false
40808
+ },
40506
40809
  "PutMingleOptInRequest": {
40507
40810
  "type": "object",
40508
40811
  "properties": {
@@ -40804,9 +41107,9 @@
40804
41107
  "description": "A required dependency/feature is not configured or is temporarily down."
40805
41108
  }
40806
41109
  },
40807
- "x-endpoint-count": 643,
40808
- "x-schema-count": 691,
41110
+ "x-endpoint-count": 649,
41111
+ "x-schema-count": 696,
40809
41112
  "x-undocumented-bodies": 12,
40810
- "x-response-schemas": 444,
41113
+ "x-response-schemas": 446,
40811
41114
  "x-generated-by": "scripts/bongos/gen-api-docs.js"
40812
41115
  }
@@ -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. 643 endpoints across 107 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 649 endpoints across 108 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`.
@@ -520,7 +520,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
520
520
  | POST | `/api/bongos/llm-cache/lookup` | `metic+archon` | `cache_key`, `tokens_saved_est` | POST /llm-cache/lookup — hit/miss + atomic hit_count bump. |
521
521
  | POST | `/api/bongos/llm-cache/store` | `metic+archon` | `spec`, `result_stdout`, `result_cost_usd` | POST /llm-cache/store — upsert a freshly-produced result. |
522
522
 
523
- ## `market-watch` (6)
523
+ ## `market-watch` (10)
524
524
 
525
525
  | Method | Path | Rank | Body | Description |
526
526
  |---|---|---|---|---|
@@ -530,6 +530,10 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
530
530
  | POST | `/api/bongos/market-watch/proposals/:id/vote` | `metic+archon` | — | PUT TO A VOTE. |
531
531
  | GET | `/api/bongos/market-watch/rules` | `any-builder` | — | every member reads the rules (the task); the read grants nothing. |
532
532
  | POST | `/api/bongos/market-watch/rules/proposals` | `any-builder` | `step`, `change`, `reason` | Any signed-in member may propose (the task: "every member can read the page and can propose"). |
533
+ | GET | `/api/bongos/market-watch/settings` | `metic+archon` | — | |
534
+ | PATCH | `/api/bongos/market-watch/settings` | `metic+archon` | `enabled`, `monthly_cap_usd`, `cadence` | |
535
+ | PUT | `/api/bongos/market-watch/settings/key` | `metic+archon` | `key` | |
536
+ | DELETE | `/api/bongos/market-watch/settings/key` | `metic+archon` | — | |
533
537
 
534
538
  ## `me` (55)
535
539
 
@@ -687,6 +691,12 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
687
691
  | GET | `/api/bongos/page-notes/images/:id` | `any-builder` | — | |
688
692
  | GET | `/api/bongos/page-notes/site` | `any-builder` | — | The public site's reviews (task 1004499), for the Studio's list. |
689
693
 
694
+ ## `pay-terms` (1)
695
+
696
+ | Method | Path | Rank | Body | Description |
697
+ |---|---|---|---|---|
698
+ | GET | `/api/bongos/pay-terms` | `any-builder` | — | GET /pay-terms?task_ids=1,2,3 — what each task pays, in the project's words (task 1004990, ADR 0385 D3), for a list of tasks in one read:… |
699
+
690
700
  ## `payouts` (16)
691
701
 
692
702
  | Method | Path | Rank | Body | Description |
@@ -720,11 +730,12 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
720
730
  |---|---|---|---|---|
721
731
  | GET | `/api/bongos/project/manage-link` | `archon` | — | GET /project/manage-link — the hub's page for THIS project, where its owner takes it offline or disconnects it (task 1004570). |
722
732
 
723
- ## `project-settings` (7)
733
+ ## `project-settings` (8)
724
734
 
725
735
  | Method | Path | Rank | Body | Description |
726
736
  |---|---|---|---|---|
727
737
  | GET | `/api/bongos/project-settings` | `metic+archon` | — | GET /project-settings — all five rows in ONE read. |
738
+ | PATCH | `/api/bongos/project-settings/pay-terms` | `metic+archon` | `terms` | PATCH /project-settings/pay-terms — body { terms: [{ pay_type, amount?, unit?, note? }] } (task 1004990; ADR 0385 decision 3 and the owne… |
728
739
  | PATCH | `/api/bongos/project-settings/rot-days` | `metic+archon` | `days` | PATCH /project-settings/rot-days — body { days }. |
729
740
  | GET | `/api/bongos/project-settings/ship-mode` | `any-builder` | — | GET /project-settings/ship-mode — the ship mode alone, for the CLI and the AI. |
730
741
  | PATCH | `/api/bongos/project-settings/ship-mode` | `metic+archon` | `mode` | PATCH /project-settings/ship-mode — body { mode: 'auto' \| 'manual' }. |
@@ -993,7 +1004,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
993
1004
  | GET | `/api/bongos/tasks` | `any-builder` | — | |
994
1005
  | POST | `/api/bongos/tasks` | `metic+archon` | `version_id`, `title`, `description`, `status`, `touches`, `est_minutes`, `est_cost_usd`, `manual_degree`, `priority`, `automation_tag`, `credits_reward`, `source`, `source_ref`, `value_summary`, `kind`, `discipline`, `parallel_safe`, `newcomer_friendly`, `security_sensitive`, `requires_rank`, `needs`, `auto_detect_touches`, `criterion_ids`, `module_key`, `goal_id` | Task create/promote/edit (plan/scope mutation) is Metic+ as of ADR 0090 (owner decision 2026-06-26): a Metic who can run idea-triage may … |
995
1006
  | GET | `/api/bongos/tasks/:id` | `any-builder` | — | single-task read; preserved per CRITICAL §4 (supervisor hot path). |
996
- | PATCH | `/api/bongos/tasks/:id` | `metic+archon` | `kind`, `discipline`, `requires_rank`, `module_key`, `goal_id`, `parent_task_id`, `parallel_safe`, `newcomer_friendly`, `xenos_claimable`, `security_sensitive`, `automation_tag`, `needs`, `needs_migration`, `description`, `title`, `priority`, `value_summary`, `status` | PATCH /tasks/:id — supports body.parent_task_id (V2 C2), body.kind (V2 B1), body.discipline (mig 014), body.parallel_safe (mig 028), and … |
1007
+ | PATCH | `/api/bongos/tasks/:id` | `metic+archon` | `kind`, `discipline`, `requires_rank`, `module_key`, `goal_id`, `parent_task_id`, `parallel_safe`, `newcomer_friendly`, `xenos_claimable`, `security_sensitive`, `automation_tag`, `needs`, `needs_migration`, `description`, `title`, `priority`, `value_summary`, `status`, `pay_terms` | PATCH /tasks/:id — supports body.parent_task_id (V2 C2), body.kind (V2 B1), body.discipline (mig 014), body.parallel_safe (mig 028), and … |
997
1008
  | POST | `/api/bongos/tasks/:id/abandon` | `any-builder` | — | POST /tasks/:id/abandon — terminal "retire this task" transition (task 987). |
998
1009
  | POST | `/api/bongos/tasks/:id/attest-gate` | `any-builder` | `head_sha` | POST /tasks/:id/attest-gate — body: { head_sha }. |
999
1010
  | POST | `/api/bongos/tasks/:id/confirm` | `any-builder` | `verified` | |