@bongos/core 1.24.10 → 1.24.12

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 (96) hide show
  1. package/.bongos-core.json +171 -86
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +12 -0
  4. package/clients/bongos-client/index.cjs +12 -0
  5. package/clients/bongos-client/index.d.ts +18 -1
  6. package/clients/bongos-client/index.mjs +12 -0
  7. package/docs/api/openapi.json +304 -5
  8. package/docs/api-reference.md +14 -4
  9. package/docs/architecture.md +4 -0
  10. package/docs/copy-inventory.md +154 -76
  11. package/docs/copy-registry.json +923 -125
  12. package/docs/module-api-changelog.md +4 -0
  13. package/docs/page-inventory.json +68 -4
  14. package/docs/page-readings.json +873 -819
  15. package/modules/government/decision-rules.js +1 -0
  16. package/modules/hall-ui/public/ai-studio.html +1 -1
  17. package/modules/hall-ui/public/atlas.html +1 -1
  18. package/modules/hall-ui/public/blockers.html +1 -1
  19. package/modules/hall-ui/public/board-room.html +1 -1
  20. package/modules/hall-ui/public/city.html +1 -1
  21. package/modules/hall-ui/public/collab.html +1 -1
  22. package/modules/hall-ui/public/commands.html +1 -1
  23. package/modules/hall-ui/public/copy-desk.html +1 -1
  24. package/modules/hall-ui/public/craft-mode.js +2 -2
  25. package/modules/hall-ui/public/deploy.html +1 -1
  26. package/modules/hall-ui/public/diagrams.html +1 -1
  27. package/modules/hall-ui/public/drachmae.html +1 -1
  28. package/modules/hall-ui/public/fleet.html +1 -1
  29. package/modules/hall-ui/public/gate.html +1 -1
  30. package/modules/hall-ui/public/goal-map.html +1 -1
  31. package/modules/hall-ui/public/goals.html +1 -1
  32. package/modules/hall-ui/public/government.html +1 -1
  33. package/modules/hall-ui/public/idea.html +1 -1
  34. package/modules/hall-ui/public/ideas.html +1 -1
  35. package/modules/hall-ui/public/index.html +1 -1
  36. package/modules/hall-ui/public/market-watch-item.html +83 -0
  37. package/modules/hall-ui/public/market-watch-item.js +150 -0
  38. package/modules/hall-ui/public/market-watch-item.states.json +143 -0
  39. package/modules/hall-ui/public/market-watch-lib.js +243 -0
  40. package/modules/hall-ui/public/market-watch-rules.html +1 -1
  41. package/modules/hall-ui/public/market-watch-settings.html +1 -1
  42. package/modules/hall-ui/public/market-watch.css +169 -0
  43. package/modules/hall-ui/public/market-watch.html +111 -0
  44. package/modules/hall-ui/public/market-watch.js +129 -0
  45. package/modules/hall-ui/public/market-watch.states.json +14 -0
  46. package/modules/hall-ui/public/modules.html +1 -1
  47. package/modules/hall-ui/public/my-agents.html +1 -1
  48. package/modules/hall-ui/public/primer.html +1 -1
  49. package/modules/hall-ui/public/profile.html +1 -1
  50. package/modules/hall-ui/public/project-settings.css +12 -0
  51. package/modules/hall-ui/public/project-settings.html +1 -1
  52. package/modules/hall-ui/public/project-settings.js +63 -1
  53. package/modules/hall-ui/public/ranks.html +1 -1
  54. package/modules/hall-ui/public/roadmap.html +1 -1
  55. package/modules/hall-ui/public/roster.html +1 -1
  56. package/modules/hall-ui/public/sessions.html +1 -1
  57. package/modules/hall-ui/public/settings.html +1 -1
  58. package/modules/hall-ui/public/shell.js +3 -2
  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/task.js +34 -1
  63. package/modules/hall-ui/public/thinking.html +1 -1
  64. package/modules/hall-ui/public/tweak-editor.html +1 -1
  65. package/modules/hall-ui/public/watch.html +1 -1
  66. package/modules/hall-ui/public/work.html +1 -1
  67. package/modules/hall-ui/records/market-watch.md +40 -0
  68. package/modules/lifecycle/migrations/lifecycle_018_pay_terms.sql +64 -0
  69. package/modules/lifecycle/pay-terms.js +171 -0
  70. package/modules/lifecycle/routes/project-settings.js +94 -0
  71. package/modules/lifecycle/routes/task-write-routes.js +35 -4
  72. package/modules/market-watch/db.js +10 -8
  73. package/modules/market-watch/module.json +2 -1
  74. package/modules/market-watch/pages.js +323 -0
  75. package/modules/market-watch/proposals.js +66 -4
  76. package/modules/market-watch/routes/pages.js +116 -0
  77. package/package-lock.json +2 -2
  78. package/package.json +1 -1
  79. package/release-notes.json +12 -0
  80. package/scripts/bongos/government-walk.js +1 -0
  81. package/scripts/bongos/run-unit-tests.js +4 -0
  82. package/scripts/bongos/start.js +42 -2
  83. package/src/bongos/module-scope-map.js +1 -0
  84. package/src/module-api.js +1 -1
  85. package/tests/fixtures/market-watch-seed-rows.cjs +60 -0
  86. package/tests/government_act_alone_buildings.mjs +1 -0
  87. package/tests/hall_nav.mjs +4 -1
  88. package/tests/hall_page_gate_map.mjs +4 -0
  89. package/tests/market_watch_module.mjs +2 -1
  90. package/tests/market_watch_pages.mjs +356 -0
  91. package/tests/market_watch_rules.mjs +63 -3
  92. package/tests/nav_permission_atoms.mjs +1 -1
  93. package/tests/patch_gate_ordering.mjs +3 -0
  94. package/tests/pay_terms.mjs +254 -0
  95. package/tests/pay_terms_db.mjs +86 -0
  96. 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
- - 647 operations across 80 resource groups
8
+ - 652 operations across 81 resource groups
9
9
 
10
10
  ## Use it from your project
11
11
 
@@ -763,6 +763,12 @@ function createClient(opts = {}) {
763
763
  getMarketWatchAsk: (args) => request("GET", "/market-watch/ask", { hasBody: false }, args),
764
764
  // POST /market-watch/ask/answer — rank: any-builder — POST /market-watch/ask/answer
765
765
  postMarketWatchAskAnswer: (args) => request("POST", "/market-watch/ask/answer", { hasBody: true }, args),
766
+ // GET /market-watch/home — rank: any-builder — GET /market-watch/home
767
+ getMarketWatchHome: (args) => request("GET", "/market-watch/home", { hasBody: false }, args),
768
+ // GET /market-watch/items/{id} — rank: any-builder — GET /market-watch/items/:id
769
+ getMarketWatchItemsId: (args) => request("GET", "/market-watch/items/{id}", { hasBody: false }, args),
770
+ // POST /market-watch/proposals — rank: any-builder — POST /market-watch/proposals
771
+ postMarketWatchProposals: (args) => request("POST", "/market-watch/proposals", { hasBody: true }, args),
766
772
  // POST /market-watch/proposals/{id}/decide — rank: any-builder — POST /market-watch/proposals/:id/decide
767
773
  postMarketWatchProposalsIdDecide: (args) => request("POST", "/market-watch/proposals/{id}/decide", { hasBody: true }, args),
768
774
  // POST /market-watch/proposals/{id}/vote — rank: metic+archon — POST /market-watch/proposals/:id/vote
@@ -1012,6 +1018,10 @@ function createClient(opts = {}) {
1012
1018
  // GET /page-notes/site — rank: any-builder — GET /page-notes/site
1013
1019
  getPageNotesSite: (args) => request("GET", "/page-notes/site", { hasBody: false }, args),
1014
1020
  },
1021
+ "payTerms": {
1022
+ // GET /pay-terms — rank: any-builder — GET /pay-terms
1023
+ getPayTerms: (args) => request("GET", "/pay-terms", { hasBody: false }, args),
1024
+ },
1015
1025
  "payouts": {
1016
1026
  // POST /payouts/age-records — rank: archon — POST /payouts/age-records
1017
1027
  postPayoutsAgeRecords: (args) => request("POST", "/payouts/age-records", { hasBody: true }, args),
@@ -1057,6 +1067,8 @@ function createClient(opts = {}) {
1057
1067
  "projectSettings": {
1058
1068
  // GET /project-settings — rank: metic+archon — GET /project-settings
1059
1069
  getProjectSettings: (args) => request("GET", "/project-settings", { hasBody: false }, args),
1070
+ // PATCH /project-settings/pay-terms — rank: metic+archon — PATCH /project-settings/pay-terms
1071
+ patchProjectSettingsPayTerms: (args) => request("PATCH", "/project-settings/pay-terms", { hasBody: true }, args),
1060
1072
  // PATCH /project-settings/rot-days — rank: metic+archon — PATCH /project-settings/rot-days
1061
1073
  patchProjectSettingsRotDays: (args) => request("PATCH", "/project-settings/rot-days", { hasBody: true }, args),
1062
1074
  // GET /project-settings/ship-mode — rank: any-builder — GET /project-settings/ship-mode
@@ -762,6 +762,12 @@ function createClient(opts = {}) {
762
762
  getMarketWatchAsk: (args) => request("GET", "/market-watch/ask", { hasBody: false }, args),
763
763
  // POST /market-watch/ask/answer — rank: any-builder — POST /market-watch/ask/answer
764
764
  postMarketWatchAskAnswer: (args) => request("POST", "/market-watch/ask/answer", { hasBody: true }, args),
765
+ // GET /market-watch/home — rank: any-builder — GET /market-watch/home
766
+ getMarketWatchHome: (args) => request("GET", "/market-watch/home", { hasBody: false }, args),
767
+ // GET /market-watch/items/{id} — rank: any-builder — GET /market-watch/items/:id
768
+ getMarketWatchItemsId: (args) => request("GET", "/market-watch/items/{id}", { hasBody: false }, args),
769
+ // POST /market-watch/proposals — rank: any-builder — POST /market-watch/proposals
770
+ postMarketWatchProposals: (args) => request("POST", "/market-watch/proposals", { hasBody: true }, args),
765
771
  // POST /market-watch/proposals/{id}/decide — rank: any-builder — POST /market-watch/proposals/:id/decide
766
772
  postMarketWatchProposalsIdDecide: (args) => request("POST", "/market-watch/proposals/{id}/decide", { hasBody: true }, args),
767
773
  // POST /market-watch/proposals/{id}/vote — rank: metic+archon — POST /market-watch/proposals/:id/vote
@@ -1011,6 +1017,10 @@ function createClient(opts = {}) {
1011
1017
  // GET /page-notes/site — rank: any-builder — GET /page-notes/site
1012
1018
  getPageNotesSite: (args) => request("GET", "/page-notes/site", { hasBody: false }, args),
1013
1019
  },
1020
+ "payTerms": {
1021
+ // GET /pay-terms — rank: any-builder — GET /pay-terms
1022
+ getPayTerms: (args) => request("GET", "/pay-terms", { hasBody: false }, args),
1023
+ },
1014
1024
  "payouts": {
1015
1025
  // POST /payouts/age-records — rank: archon — POST /payouts/age-records
1016
1026
  postPayoutsAgeRecords: (args) => request("POST", "/payouts/age-records", { hasBody: true }, args),
@@ -1056,6 +1066,8 @@ function createClient(opts = {}) {
1056
1066
  "projectSettings": {
1057
1067
  // GET /project-settings — rank: metic+archon — GET /project-settings
1058
1068
  getProjectSettings: (args) => request("GET", "/project-settings", { hasBody: false }, args),
1069
+ // PATCH /project-settings/pay-terms — rank: metic+archon — PATCH /project-settings/pay-terms
1070
+ patchProjectSettingsPayTerms: (args) => request("PATCH", "/project-settings/pay-terms", { hasBody: true }, args),
1059
1071
  // PATCH /project-settings/rot-days — rank: metic+archon — PATCH /project-settings/rot-days
1060
1072
  patchProjectSettingsRotDays: (args) => request("PATCH", "/project-settings/rot-days", { hasBody: true }, args),
1061
1073
  // 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 }
@@ -264,6 +265,8 @@ export interface PatchNotesIdRequest { kind: string }
264
265
  export interface PatchNotesIdResponse { ok: boolean; note: unknown }
265
266
  export interface PatchPageNotesIdRequest { body_md: string }
266
267
  export interface PatchPageNotesIdResponse { ok: boolean; updated_at: unknown }
268
+ export interface PatchProjectSettingsPayTermsRequest { terms: unknown }
269
+ export interface PatchProjectSettingsPayTermsResponse { ok: boolean; row: unknown }
267
270
  export interface PatchProjectSettingsRotDaysRequest { days: number }
268
271
  export interface PatchProjectSettingsRotDaysResponse { ok: boolean; rot_days: unknown; source: unknown; describe: unknown }
269
272
  export interface PatchProjectSettingsShipModeRequest { mode: string }
@@ -285,7 +288,7 @@ export interface PatchSpecialitiesIdRequest { name?: string; summary?: string; c
285
288
  export interface PatchSpecialitiesIdResponse { speciality: unknown }
286
289
  export interface PatchTaskRecommendationsIdRequest { status: "declined" | "withdrawn" }
287
290
  export interface PatchTaskRecommendationsIdResponse { ok: boolean; recommendation: unknown }
288
- 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 }
289
292
  export interface PostAccessRequestsInviteRequest { github_login: string; note?: string }
290
293
  export interface PostAccessRequestsInviteResponse { ok: boolean; already_invited?: boolean; github_login?: unknown; request?: unknown }
291
294
  export interface PostAccessRequestsRequest { github_login: string; display_name?: string; note?: string }
@@ -467,6 +470,8 @@ export interface PostLlmCacheStoreResponse { stored: boolean; result_cost_usd?:
467
470
  export interface PostMarketWatchAskAnswerRequest { week_of?: string; picks?: unknown[]; names?: unknown[]; nothing?: boolean; builder_id?: number }
468
471
  export interface PostMarketWatchProposalsIdDecideRequest { decision: "approve" | "decline" }
469
472
  export interface PostMarketWatchProposalsIdVoteResponse { ok: boolean; matter_id: unknown; item_id: unknown }
473
+ export interface PostMarketWatchProposalsRequest { kind: string; reason?: string; item_id?: StringifiableId; dimension?: string; value?: unknown; url?: string; log_entry_id?: StringifiableId; scout?: string; name?: string }
474
+ export interface PostMarketWatchProposalsResponse { proposal: unknown }
470
475
  export interface PostMarketWatchRulesProposalsRequest { step: string; change: Record<string, unknown>; reason: string }
471
476
  export interface PostMarketWatchRulesProposalsResponse { ok: boolean; proposal: unknown }
472
477
  export interface PostMeAnthropicLinkRequest { anthropic_email: string; anthropic_user_id: string }
@@ -1389,6 +1394,12 @@ export interface BongosClient {
1389
1394
  getMarketWatchAsk(args?: RequestArgs): Promise<GetMarketWatchAskResponse>;
1390
1395
  /** POST /market-watch/ask/answer — rank: any-builder */
1391
1396
  postMarketWatchAskAnswer(args?: RequestArgs & { body?: PostMarketWatchAskAnswerRequest }): Promise<ApiResponse>;
1397
+ /** GET /market-watch/home — rank: any-builder */
1398
+ getMarketWatchHome(args?: RequestArgs): Promise<ApiResponse>;
1399
+ /** GET /market-watch/items/{id} — rank: any-builder */
1400
+ getMarketWatchItemsId(args?: RequestArgs): Promise<ApiResponse>;
1401
+ /** POST /market-watch/proposals — rank: any-builder */
1402
+ postMarketWatchProposals(args: RequestArgs & { body: PostMarketWatchProposalsRequest }): Promise<PostMarketWatchProposalsResponse>;
1392
1403
  /** POST /market-watch/proposals/{id}/decide — rank: any-builder */
1393
1404
  postMarketWatchProposalsIdDecide(args: RequestArgs & { body: PostMarketWatchProposalsIdDecideRequest }): Promise<ApiResponse>;
1394
1405
  /** POST /market-watch/proposals/{id}/vote — rank: metic+archon */
@@ -1638,6 +1649,10 @@ export interface BongosClient {
1638
1649
  /** GET /page-notes/site — rank: any-builder */
1639
1650
  getPageNotesSite(args?: RequestArgs): Promise<GetPageNotesSiteResponse>;
1640
1651
  };
1652
+ "payTerms": {
1653
+ /** GET /pay-terms — rank: any-builder */
1654
+ getPayTerms(args?: RequestArgs): Promise<GetPayTermsResponse>;
1655
+ };
1641
1656
  "payouts": {
1642
1657
  /** POST /payouts/age-records — rank: archon */
1643
1658
  postPayoutsAgeRecords(args: RequestArgs & { body: PostPayoutsAgeRecordsRequest }): Promise<PostPayoutsAgeRecordsResponse>;
@@ -1683,6 +1698,8 @@ export interface BongosClient {
1683
1698
  "projectSettings": {
1684
1699
  /** GET /project-settings — rank: metic+archon */
1685
1700
  getProjectSettings(args?: RequestArgs): Promise<GetProjectSettingsResponse>;
1701
+ /** PATCH /project-settings/pay-terms — rank: metic+archon */
1702
+ patchProjectSettingsPayTerms(args: RequestArgs & { body: PatchProjectSettingsPayTermsRequest }): Promise<PatchProjectSettingsPayTermsResponse>;
1686
1703
  /** PATCH /project-settings/rot-days — rank: metic+archon */
1687
1704
  patchProjectSettingsRotDays(args: RequestArgs & { body: PatchProjectSettingsRotDaysRequest }): Promise<PatchProjectSettingsRotDaysResponse>;
1688
1705
  /** GET /project-settings/ship-mode — rank: any-builder */
@@ -759,6 +759,12 @@ export function createClient(opts = {}) {
759
759
  getMarketWatchAsk: (args) => request("GET", "/market-watch/ask", { hasBody: false }, args),
760
760
  // POST /market-watch/ask/answer — rank: any-builder — POST /market-watch/ask/answer
761
761
  postMarketWatchAskAnswer: (args) => request("POST", "/market-watch/ask/answer", { hasBody: true }, args),
762
+ // GET /market-watch/home — rank: any-builder — GET /market-watch/home
763
+ getMarketWatchHome: (args) => request("GET", "/market-watch/home", { hasBody: false }, args),
764
+ // GET /market-watch/items/{id} — rank: any-builder — GET /market-watch/items/:id
765
+ getMarketWatchItemsId: (args) => request("GET", "/market-watch/items/{id}", { hasBody: false }, args),
766
+ // POST /market-watch/proposals — rank: any-builder — POST /market-watch/proposals
767
+ postMarketWatchProposals: (args) => request("POST", "/market-watch/proposals", { hasBody: true }, args),
762
768
  // POST /market-watch/proposals/{id}/decide — rank: any-builder — POST /market-watch/proposals/:id/decide
763
769
  postMarketWatchProposalsIdDecide: (args) => request("POST", "/market-watch/proposals/{id}/decide", { hasBody: true }, args),
764
770
  // POST /market-watch/proposals/{id}/vote — rank: metic+archon — POST /market-watch/proposals/:id/vote
@@ -1008,6 +1014,10 @@ export function createClient(opts = {}) {
1008
1014
  // GET /page-notes/site — rank: any-builder — GET /page-notes/site
1009
1015
  getPageNotesSite: (args) => request("GET", "/page-notes/site", { hasBody: false }, args),
1010
1016
  },
1017
+ "payTerms": {
1018
+ // GET /pay-terms — rank: any-builder — GET /pay-terms
1019
+ getPayTerms: (args) => request("GET", "/pay-terms", { hasBody: false }, args),
1020
+ },
1011
1021
  "payouts": {
1012
1022
  // POST /payouts/age-records — rank: archon — POST /payouts/age-records
1013
1023
  postPayoutsAgeRecords: (args) => request("POST", "/payouts/age-records", { hasBody: true }, args),
@@ -1053,6 +1063,8 @@ export function createClient(opts = {}) {
1053
1063
  "projectSettings": {
1054
1064
  // GET /project-settings — rank: metic+archon — GET /project-settings
1055
1065
  getProjectSettings: (args) => request("GET", "/project-settings", { hasBody: false }, args),
1066
+ // PATCH /project-settings/pay-terms — rank: metic+archon — PATCH /project-settings/pay-terms
1067
+ patchProjectSettingsPayTerms: (args) => request("PATCH", "/project-settings/pay-terms", { hasBody: true }, args),
1056
1068
  // PATCH /project-settings/rot-days — rank: metic+archon — PATCH /project-settings/rot-days
1057
1069
  patchProjectSettingsRotDays: (args) => request("PATCH", "/project-settings/rot-days", { hasBody: true }, args),
1058
1070
  // 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`."
@@ -14078,6 +14082,131 @@
14078
14082
  ]
14079
14083
  }
14080
14084
  },
14085
+ "/market-watch/home": {
14086
+ "get": {
14087
+ "operationId": "get_market_watch_home",
14088
+ "tags": [
14089
+ "market-watch"
14090
+ ],
14091
+ "summary": "GET /market-watch/home",
14092
+ "description": "every member reads the desk.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14093
+ "x-rank": "any-builder",
14094
+ "x-source": "modules/market-watch/routes/pages.js",
14095
+ "responses": {
14096
+ "200": {
14097
+ "description": "Success."
14098
+ },
14099
+ "400": {
14100
+ "$ref": "#/components/responses/BadRequest"
14101
+ },
14102
+ "401": {
14103
+ "$ref": "#/components/responses/Unauthorized"
14104
+ },
14105
+ "403": {
14106
+ "$ref": "#/components/responses/Forbidden"
14107
+ }
14108
+ },
14109
+ "security": [
14110
+ {
14111
+ "builderSession": []
14112
+ }
14113
+ ]
14114
+ }
14115
+ },
14116
+ "/market-watch/items/{id}": {
14117
+ "get": {
14118
+ "operationId": "get_market_watch_items_id",
14119
+ "tags": [
14120
+ "market-watch"
14121
+ ],
14122
+ "summary": "GET /market-watch/items/:id",
14123
+ "description": "every member reads an item's case file.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14124
+ "x-rank": "any-builder",
14125
+ "x-source": "modules/market-watch/routes/pages.js",
14126
+ "parameters": [
14127
+ {
14128
+ "name": "id",
14129
+ "in": "path",
14130
+ "required": true,
14131
+ "schema": {
14132
+ "type": "string"
14133
+ },
14134
+ "description": "Path parameter `id`."
14135
+ }
14136
+ ],
14137
+ "responses": {
14138
+ "200": {
14139
+ "description": "Success."
14140
+ },
14141
+ "400": {
14142
+ "$ref": "#/components/responses/BadRequest"
14143
+ },
14144
+ "401": {
14145
+ "$ref": "#/components/responses/Unauthorized"
14146
+ },
14147
+ "403": {
14148
+ "$ref": "#/components/responses/Forbidden"
14149
+ },
14150
+ "404": {
14151
+ "$ref": "#/components/responses/NotFound"
14152
+ }
14153
+ },
14154
+ "security": [
14155
+ {
14156
+ "builderSession": []
14157
+ }
14158
+ ]
14159
+ }
14160
+ },
14161
+ "/market-watch/proposals": {
14162
+ "post": {
14163
+ "operationId": "post_market_watch_proposals",
14164
+ "tags": [
14165
+ "market-watch"
14166
+ ],
14167
+ "summary": "POST /market-watch/proposals",
14168
+ "description": "every member may propose; the government decides (task 1004941).\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
14169
+ "x-rank": "any-builder",
14170
+ "x-source": "modules/market-watch/routes/pages.js",
14171
+ "requestBody": {
14172
+ "required": true,
14173
+ "content": {
14174
+ "application/json": {
14175
+ "schema": {
14176
+ "$ref": "#/components/schemas/PostMarketWatchProposalsRequest"
14177
+ }
14178
+ }
14179
+ },
14180
+ "x-validated": true
14181
+ },
14182
+ "responses": {
14183
+ "200": {
14184
+ "description": "Success.",
14185
+ "content": {
14186
+ "application/json": {
14187
+ "schema": {
14188
+ "$ref": "#/components/schemas/PostMarketWatchProposalsResponse"
14189
+ }
14190
+ }
14191
+ }
14192
+ },
14193
+ "400": {
14194
+ "$ref": "#/components/responses/ValidationFailed"
14195
+ },
14196
+ "401": {
14197
+ "$ref": "#/components/responses/Unauthorized"
14198
+ },
14199
+ "403": {
14200
+ "$ref": "#/components/responses/Forbidden"
14201
+ }
14202
+ },
14203
+ "security": [
14204
+ {
14205
+ "builderSession": []
14206
+ }
14207
+ ]
14208
+ }
14209
+ },
14081
14210
  "/market-watch/proposals/{id}/decide": {
14082
14211
  "post": {
14083
14212
  "operationId": "post_market_watch_proposals_id_decide",
@@ -19113,6 +19242,44 @@
19113
19242
  ]
19114
19243
  }
19115
19244
  },
19245
+ "/pay-terms": {
19246
+ "get": {
19247
+ "operationId": "get_pay_terms",
19248
+ "tags": [
19249
+ "pay-terms"
19250
+ ],
19251
+ "summary": "GET /pay-terms",
19252
+ "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).",
19253
+ "x-rank": "any-builder",
19254
+ "x-source": "modules/lifecycle/routes/project-settings.js",
19255
+ "responses": {
19256
+ "200": {
19257
+ "description": "Success.",
19258
+ "content": {
19259
+ "application/json": {
19260
+ "schema": {
19261
+ "$ref": "#/components/schemas/GetPayTermsResponse"
19262
+ }
19263
+ }
19264
+ }
19265
+ },
19266
+ "400": {
19267
+ "$ref": "#/components/responses/BadRequest"
19268
+ },
19269
+ "401": {
19270
+ "$ref": "#/components/responses/Unauthorized"
19271
+ },
19272
+ "403": {
19273
+ "$ref": "#/components/responses/Forbidden"
19274
+ }
19275
+ },
19276
+ "security": [
19277
+ {
19278
+ "builderSession": []
19279
+ }
19280
+ ]
19281
+ }
19282
+ },
19116
19283
  "/payouts/age-records": {
19117
19284
  "post": {
19118
19285
  "operationId": "post_payouts_age_records",
@@ -20050,6 +20217,58 @@
20050
20217
  ]
20051
20218
  }
20052
20219
  },
20220
+ "/project-settings/pay-terms": {
20221
+ "patch": {
20222
+ "operationId": "patch_project_settings_pay_terms",
20223
+ "tags": [
20224
+ "project-settings"
20225
+ ],
20226
+ "summary": "PATCH /project-settings/pay-terms",
20227
+ "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).",
20228
+ "x-rank": "metic+archon",
20229
+ "x-source": "modules/lifecycle/routes/project-settings.js",
20230
+ "x-permissions": [
20231
+ "project.settings.manage"
20232
+ ],
20233
+ "requestBody": {
20234
+ "required": true,
20235
+ "content": {
20236
+ "application/json": {
20237
+ "schema": {
20238
+ "$ref": "#/components/schemas/PatchProjectSettingsPayTermsRequest"
20239
+ }
20240
+ }
20241
+ },
20242
+ "x-validated": true
20243
+ },
20244
+ "responses": {
20245
+ "200": {
20246
+ "description": "Success.",
20247
+ "content": {
20248
+ "application/json": {
20249
+ "schema": {
20250
+ "$ref": "#/components/schemas/PatchProjectSettingsPayTermsResponse"
20251
+ }
20252
+ }
20253
+ }
20254
+ },
20255
+ "400": {
20256
+ "$ref": "#/components/responses/ValidationFailed"
20257
+ },
20258
+ "401": {
20259
+ "$ref": "#/components/responses/Unauthorized"
20260
+ },
20261
+ "403": {
20262
+ "$ref": "#/components/responses/Forbidden"
20263
+ }
20264
+ },
20265
+ "security": [
20266
+ {
20267
+ "builderSession": []
20268
+ }
20269
+ ]
20270
+ }
20271
+ },
20053
20272
  "/project-settings/rot-days": {
20054
20273
  "patch": {
20055
20274
  "operationId": "patch_project_settings_rot_days",
@@ -27822,7 +28041,7 @@
27822
28041
  "tasks"
27823
28042
  ],
27824
28043
  "summary": "POST /tasks",
27825
- "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).",
28044
+ "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).",
27826
28045
  "x-rank": "metic+archon",
27827
28046
  "x-source": "modules/lifecycle/routes/task-write-routes.js",
27828
28047
  "x-permissions": [
@@ -32052,6 +32271,15 @@
32052
32271
  "notes"
32053
32272
  ]
32054
32273
  },
32274
+ "GetPayTermsResponse": {
32275
+ "type": "object",
32276
+ "properties": {
32277
+ "pay_terms": {}
32278
+ },
32279
+ "required": [
32280
+ "pay_terms"
32281
+ ]
32282
+ },
32055
32283
  "GetPayoutsApprovalsResponse": {
32056
32284
  "type": "object",
32057
32285
  "properties": {
@@ -33641,6 +33869,29 @@
33641
33869
  "updated_at"
33642
33870
  ]
33643
33871
  },
33872
+ "PatchProjectSettingsPayTermsRequest": {
33873
+ "type": "object",
33874
+ "properties": {
33875
+ "terms": {}
33876
+ },
33877
+ "required": [
33878
+ "terms"
33879
+ ],
33880
+ "additionalProperties": false
33881
+ },
33882
+ "PatchProjectSettingsPayTermsResponse": {
33883
+ "type": "object",
33884
+ "properties": {
33885
+ "ok": {
33886
+ "type": "boolean"
33887
+ },
33888
+ "row": {}
33889
+ },
33890
+ "required": [
33891
+ "ok",
33892
+ "row"
33893
+ ]
33894
+ },
33644
33895
  "PatchProjectSettingsRotDaysRequest": {
33645
33896
  "type": "object",
33646
33897
  "properties": {
@@ -34026,7 +34277,8 @@
34026
34277
  "minLength": 1,
34027
34278
  "maxLength": 1000
34028
34279
  },
34029
- "status": {}
34280
+ "status": {},
34281
+ "pay_terms": {}
34030
34282
  },
34031
34283
  "additionalProperties": false
34032
34284
  },
@@ -37143,6 +37395,53 @@
37143
37395
  "item_id"
37144
37396
  ]
37145
37397
  },
37398
+ "PostMarketWatchProposalsRequest": {
37399
+ "type": "object",
37400
+ "properties": {
37401
+ "kind": {
37402
+ "type": "string"
37403
+ },
37404
+ "reason": {
37405
+ "type": "string",
37406
+ "maxLength": 2000
37407
+ },
37408
+ "item_id": {
37409
+ "$ref": "#/components/schemas/StringifiableId"
37410
+ },
37411
+ "dimension": {
37412
+ "type": "string",
37413
+ "maxLength": 60
37414
+ },
37415
+ "value": {},
37416
+ "url": {
37417
+ "type": "string",
37418
+ "maxLength": 2000
37419
+ },
37420
+ "log_entry_id": {
37421
+ "$ref": "#/components/schemas/StringifiableId"
37422
+ },
37423
+ "scout": {
37424
+ "type": "string"
37425
+ },
37426
+ "name": {
37427
+ "type": "string",
37428
+ "maxLength": 2000
37429
+ }
37430
+ },
37431
+ "required": [
37432
+ "kind"
37433
+ ],
37434
+ "additionalProperties": false
37435
+ },
37436
+ "PostMarketWatchProposalsResponse": {
37437
+ "type": "object",
37438
+ "properties": {
37439
+ "proposal": {}
37440
+ },
37441
+ "required": [
37442
+ "proposal"
37443
+ ]
37444
+ },
37146
37445
  "PostMarketWatchRulesProposalsRequest": {
37147
37446
  "type": "object",
37148
37447
  "properties": {
@@ -40980,9 +41279,9 @@
40980
41279
  "description": "A required dependency/feature is not configured or is temporarily down."
40981
41280
  }
40982
41281
  },
40983
- "x-endpoint-count": 647,
40984
- "x-schema-count": 693,
41282
+ "x-endpoint-count": 652,
41283
+ "x-schema-count": 698,
40985
41284
  "x-undocumented-bodies": 12,
40986
- "x-response-schemas": 444,
41285
+ "x-response-schemas": 447,
40987
41286
  "x-generated-by": "scripts/bongos/gen-api-docs.js"
40988
41287
  }
@@ -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. 647 endpoints across 108 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 652 endpoints across 109 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,12 +520,15 @@ 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` (10)
523
+ ## `market-watch` (13)
524
524
 
525
525
  | Method | Path | Rank | Body | Description |
526
526
  |---|---|---|---|---|
527
527
  | GET | `/api/bongos/market-watch/ask` | `any-builder` | — | every member reads their own card; nobody else's (isMember in gate()). |
528
528
  | POST | `/api/bongos/market-watch/ask/answer` | `any-builder` | `week_of`, `picks`, `names`, `nothing`, `builder_id` | a member answers for themselves only (isMember in gate()). |
529
+ | GET | `/api/bongos/market-watch/home` | `any-builder` | — | every member reads the desk. |
530
+ | GET | `/api/bongos/market-watch/items/:id` | `any-builder` | — | every member reads an item's case file. |
531
+ | POST | `/api/bongos/market-watch/proposals` | `any-builder` | `kind`, `reason`, `item_id`, `dimension`, `value`, `url`, `log_entry_id`, `scout`, `name` | every member may propose; the government decides (task 1004941). |
529
532
  | POST | `/api/bongos/market-watch/proposals/:id/decide` | `any-builder` | `decision` | THE OWNER'S DECISION. |
530
533
  | POST | `/api/bongos/market-watch/proposals/:id/vote` | `metic+archon` | — | PUT TO A VOTE. |
531
534
  | GET | `/api/bongos/market-watch/rules` | `any-builder` | — | every member reads the rules (the task); the read grants nothing. |
@@ -691,6 +694,12 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
691
694
  | GET | `/api/bongos/page-notes/images/:id` | `any-builder` | — | |
692
695
  | GET | `/api/bongos/page-notes/site` | `any-builder` | — | The public site's reviews (task 1004499), for the Studio's list. |
693
696
 
697
+ ## `pay-terms` (1)
698
+
699
+ | Method | Path | Rank | Body | Description |
700
+ |---|---|---|---|---|
701
+ | 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:… |
702
+
694
703
  ## `payouts` (16)
695
704
 
696
705
  | Method | Path | Rank | Body | Description |
@@ -724,11 +733,12 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
724
733
  |---|---|---|---|---|
725
734
  | 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). |
726
735
 
727
- ## `project-settings` (7)
736
+ ## `project-settings` (8)
728
737
 
729
738
  | Method | Path | Rank | Body | Description |
730
739
  |---|---|---|---|---|
731
740
  | GET | `/api/bongos/project-settings` | `metic+archon` | — | GET /project-settings — all five rows in ONE read. |
741
+ | 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… |
732
742
  | PATCH | `/api/bongos/project-settings/rot-days` | `metic+archon` | `days` | PATCH /project-settings/rot-days — body { days }. |
733
743
  | GET | `/api/bongos/project-settings/ship-mode` | `any-builder` | — | GET /project-settings/ship-mode — the ship mode alone, for the CLI and the AI. |
734
744
  | PATCH | `/api/bongos/project-settings/ship-mode` | `metic+archon` | `mode` | PATCH /project-settings/ship-mode — body { mode: 'auto' \| 'manual' }. |
@@ -997,7 +1007,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
997
1007
  | GET | `/api/bongos/tasks` | `any-builder` | — | |
998
1008
  | 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 … |
999
1009
  | GET | `/api/bongos/tasks/:id` | `any-builder` | — | single-task read; preserved per CRITICAL §4 (supervisor hot path). |
1000
- | 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 … |
1010
+ | 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 … |
1001
1011
  | POST | `/api/bongos/tasks/:id/abandon` | `any-builder` | — | POST /tasks/:id/abandon — terminal "retire this task" transition (task 987). |
1002
1012
  | POST | `/api/bongos/tasks/:id/attest-gate` | `any-builder` | `head_sha` | POST /tasks/:id/attest-gate — body: { head_sha }. |
1003
1013
  | POST | `/api/bongos/tasks/:id/confirm` | `any-builder` | `verified` | |
@@ -252,6 +252,10 @@ store_modules(module_key PK, title, description, author_id, status CHECK IN (lis
252
252
  store_module_versions(id, module_key, version exact X.Y.Z, core_version, manifest jsonb,
253
253
  tree_sha256, tarball_sha256, tarball_bytes, artifact_path, published_by,
254
254
  published_at, UNIQUE(module_key, version)) -- immutable; a fix is a new version
255
+ lifecycle_pay_term_sets(id, task_id NULL = the project's standing terms, set_by, set_at)
256
+ lifecycle_pay_terms(id, set_id, position, pay_type, amount text, unit, note)
257
+ -- task 1004990 (module lifecycle, lifecycle_018): what a task pays, in the project's words; append-only
258
+ -- history of whole sets (newest current), records only, no default amount.
255
259
  store_module_prices(id, module_key, price_cents, price_credits, set_by, set_at)
256
260
  -- history; newest row per module is current. Cash only since core_287 (task 1004989):
257
261
  -- price_credits is historical, a credit-only newest row reads "price coming". 0 cents = free.