@bongos/core 1.24.8 → 1.24.10

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 (88) hide show
  1. package/.bongos-core.json +131 -86
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +8 -0
  4. package/clients/bongos-client/index.cjs +8 -0
  5. package/clients/bongos-client/index.d.ts +11 -1
  6. package/clients/bongos-client/index.mjs +8 -0
  7. package/docs/adr/0385-money-lives-with-a-processor-credits-stay-a-project-meter.md +1 -1
  8. package/docs/api/openapi.json +185 -6
  9. package/docs/api-reference.md +7 -3
  10. package/docs/architecture.md +2 -2
  11. package/docs/copy-inventory.md +58 -28
  12. package/docs/copy-registry.json +333 -33
  13. package/docs/module-api-changelog.md +4 -0
  14. package/docs/modules-contract.md +3 -3
  15. package/docs/page-inventory.json +34 -4
  16. package/docs/page-readings.json +294 -237
  17. package/migrations/core_287_module_prices_cash_only.sql +24 -0
  18. package/modules/hall-ui/public/ai-studio.html +2 -2
  19. package/modules/hall-ui/public/atlas.html +2 -2
  20. package/modules/hall-ui/public/blockers.html +2 -2
  21. package/modules/hall-ui/public/board-room.html +2 -2
  22. package/modules/hall-ui/public/city.html +2 -2
  23. package/modules/hall-ui/public/collab.html +2 -2
  24. package/modules/hall-ui/public/commands.html +2 -2
  25. package/modules/hall-ui/public/copy-desk.html +2 -2
  26. package/modules/hall-ui/public/craft-mode.js +1 -1
  27. package/modules/hall-ui/public/deploy.html +2 -2
  28. package/modules/hall-ui/public/diagrams.html +2 -2
  29. package/modules/hall-ui/public/drachmae.html +2 -2
  30. package/modules/hall-ui/public/fleet.html +2 -2
  31. package/modules/hall-ui/public/gate.html +2 -2
  32. package/modules/hall-ui/public/goal-map.html +2 -2
  33. package/modules/hall-ui/public/goals.html +2 -2
  34. package/modules/hall-ui/public/government.html +2 -2
  35. package/modules/hall-ui/public/idea.html +2 -2
  36. package/modules/hall-ui/public/ideas.html +2 -2
  37. package/modules/hall-ui/public/index.html +2 -2
  38. package/modules/hall-ui/public/market-watch-rules.html +2 -2
  39. package/modules/hall-ui/public/market-watch-settings.css +217 -0
  40. package/modules/hall-ui/public/market-watch-settings.html +113 -0
  41. package/modules/hall-ui/public/market-watch-settings.js +230 -0
  42. package/modules/hall-ui/public/market-watch-settings.states.json +14 -0
  43. package/modules/hall-ui/public/modules.html +2 -2
  44. package/modules/hall-ui/public/modules.js +5 -0
  45. package/modules/hall-ui/public/my-agents.html +2 -2
  46. package/modules/hall-ui/public/primer.html +2 -2
  47. package/modules/hall-ui/public/profile.html +2 -2
  48. package/modules/hall-ui/public/project-settings.html +2 -2
  49. package/modules/hall-ui/public/ranks.html +2 -2
  50. package/modules/hall-ui/public/roadmap.html +2 -2
  51. package/modules/hall-ui/public/roster.html +2 -2
  52. package/modules/hall-ui/public/sessions.html +2 -2
  53. package/modules/hall-ui/public/settings.html +2 -2
  54. package/modules/hall-ui/public/shell.js +3 -0
  55. package/modules/hall-ui/public/street.html +2 -2
  56. package/modules/hall-ui/public/studio.html +2 -2
  57. package/modules/hall-ui/public/task.html +2 -2
  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/market-watch/module.json +3 -2
  64. package/modules/market-watch/routes/settings.js +128 -0
  65. package/modules/market-watch/settings.js +207 -0
  66. package/modules/provisioning/starter-bundles.js +11 -6
  67. package/modules/ui-design/kit/serve.js +1 -0
  68. package/package-lock.json +2 -2
  69. package/package.json +1 -1
  70. package/release-notes.json +12 -0
  71. package/scripts/bongos/module-store-cli.js +21 -21
  72. package/scripts/bongos/module.js +8 -8
  73. package/src/bongos/module-listing.js +47 -20
  74. package/src/bongos/module-scope-map.js +1 -0
  75. package/src/bongos/module-store.js +20 -12
  76. package/src/bongos/routes/modules.js +31 -21
  77. package/src/bongos/serve-internal.js +2 -2
  78. package/src/module-api.js +1 -1
  79. package/tests/hall_nav.mjs +4 -2
  80. package/tests/hall_page_gate_map.mjs +4 -0
  81. package/tests/market_watch_data_db.mjs +27 -0
  82. package/tests/market_watch_module.mjs +8 -4
  83. package/tests/market_watch_settings.mjs +392 -0
  84. package/tests/module_store_cli.mjs +14 -3
  85. package/tests/module_store_listing.mjs +65 -14
  86. package/tests/module_store_price.mjs +97 -26
  87. package/tests/module_store_registry_migration.mjs +11 -0
  88. package/tests/nav_permission_atoms.mjs +3 -2
@@ -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
+ - 647 operations across 80 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
@@ -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
@@ -243,6 +243,7 @@ export interface PatchInboxIdBodyRequest { body_md: string }
243
243
  export interface PatchInboxIdBodyResponse { ok: boolean; idea: unknown; delta: unknown; unchanged: unknown }
244
244
  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
245
  export interface PatchInboxIdResponse { idea: unknown }
246
+ export interface PatchMarketWatchSettingsRequest { enabled?: unknown; monthly_cap_usd?: unknown; cadence?: unknown }
246
247
  export interface PatchMeCoreMoveSeenRequest { id: string }
247
248
  export interface PatchMeCoreMoveSeenResponse { ok: boolean; seen: unknown }
248
249
  export interface PatchMeCrossProjectRequest { hide_stats?: boolean; account_visibility?: string; recruiter_discoverable?: boolean }
@@ -623,7 +624,7 @@ export interface PostStoreModulesKeyAcquiredRequest { version: string }
623
624
  export interface PostStoreModulesKeyAcquiredResponse { ok: boolean; entitlement: unknown }
624
625
  export interface PostStoreModulesKeyDelistRequest { reason?: string }
625
626
  export interface PostStoreModulesKeyDelistResponse { ok: boolean; module_key: unknown; status: unknown; delisted_at: unknown }
626
- export interface PostStoreModulesKeyPriceRequest { cents?: unknown; credits?: unknown }
627
+ export interface PostStoreModulesKeyPriceRequest { cents?: number }
627
628
  export interface PostStoreModulesKeyPriceResponse { ok: boolean; module_key: unknown; previous: unknown; price: unknown }
628
629
  export interface PostStoreModulesKeyVersionsResponse { ok: boolean; created_module: unknown; version: unknown; channel: unknown; category: unknown }
629
630
  export interface PostStoreModulesKeyVersionsVersionErrorCountRequest { day: string; count: number }
@@ -680,6 +681,7 @@ export interface PutDoneWhenCriterionIdBackendOnlyResponse { ok: boolean; criter
680
681
  export interface PutGovernmentAsksMatterIdResponse { ok: boolean; matter_id: unknown; ask: unknown }
681
682
  export interface PutGovernmentRanksRankKeyPermissionsPermissionKeyResponse { ok: boolean; rank_key: unknown; permission_key: unknown; granted: unknown }
682
683
  export interface PutGovernmentTreasuryPotsGoalIdRequest { budget_usd?: unknown }
684
+ export interface PutMarketWatchSettingsKeyRequest { key: string }
683
685
  export interface PutMingleOptInRequest { opted_in: boolean }
684
686
  export interface PutMingleOptInResponse { opted_in: unknown; updated_at: unknown }
685
687
  export interface PutMingleProjectRequest { enabled: boolean }
@@ -1395,6 +1397,14 @@ export interface BongosClient {
1395
1397
  getMarketWatchRules(args?: RequestArgs): Promise<ApiResponse>;
1396
1398
  /** POST /market-watch/rules/proposals — rank: any-builder */
1397
1399
  postMarketWatchRulesProposals(args: RequestArgs & { body: PostMarketWatchRulesProposalsRequest }): Promise<PostMarketWatchRulesProposalsResponse>;
1400
+ /** GET /market-watch/settings — rank: metic+archon */
1401
+ getMarketWatchSettings(args?: RequestArgs): Promise<ApiResponse>;
1402
+ /** PATCH /market-watch/settings — rank: metic+archon */
1403
+ patchMarketWatchSettings(args?: RequestArgs & { body?: PatchMarketWatchSettingsRequest }): Promise<ApiResponse>;
1404
+ /** DELETE /market-watch/settings/key — rank: metic+archon */
1405
+ deleteMarketWatchSettingsKey(args?: RequestArgs): Promise<ApiResponse>;
1406
+ /** PUT /market-watch/settings/key — rank: metic+archon */
1407
+ putMarketWatchSettingsKey(args: RequestArgs & { body: PutMarketWatchSettingsKeyRequest }): Promise<ApiResponse>;
1398
1408
  };
1399
1409
  "me": {
1400
1410
  /** GET /me — 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
@@ -69,7 +69,7 @@ The owner answered the questions left open by the payments build plan ([task 100
69
69
  - **Decision 2, "a project may change or replace it", is narrowed.** For now a project may change and tune the Bongos Standard Credit System's settings. It may not switch credits off, and there is no plug-in formula.
70
70
  - **The credit reward stays required by default.** [ADR 0096](0096-require-reward-before-workable.md)'s rule stays on for every new project, not only for projects that pick the standard system.
71
71
  - **Decision 3: a project's pay policy lives in the database.** It is changed on the project's settings page, and every change is kept in an audit trail (who, when, what). It does not live in the branding pack. [Task 1004990](https://cloudbongos.com/builders#/task/1004990) builds to this.
72
- - **Modules already priced in credits are not hidden.** Each author is asked to set a cash price, and the listing stays up meanwhile. [Task 1004989](https://cloudbongos.com/builders#/task/1004989) builds to this. One question is still open. Decision 2 says credits are not spendable as money, so whether an interim listing may still be bought *with credits* (rather than only shown) needs the owner's word before that task ships.
72
+ - **Modules already priced in credits are not hidden.** Each author is asked to set a cash price, and the listing stays up meanwhile. The owner answered the follow-up question on 2026-10-29: an interim credit-priced module stays **visible with a "price coming" note, and it can NOT be bought with credits**. Credits are never spent like money. [Task 1004989](https://cloudbongos.com/builders#/task/1004989) built this: new prices are cash only (the database refuses a credit price on a new row), and old credit prices show as "price coming".
73
73
  - **"Verro" is Verro Labs**, the planned holding company of Cloud Bongos LLC and related entities, as now named in the EU labour row above.
74
74
  - **ADR 0054's "credits are equity" framing is formally superseded**, as recorded in ADR 0054 itself ([task 1004967](https://cloudbongos.com/builders#/task/1004967)).
75
75
 
@@ -14269,6 +14269,160 @@
14269
14269
  ]
14270
14270
  }
14271
14271
  },
14272
+ "/market-watch/settings": {
14273
+ "get": {
14274
+ "operationId": "get_market_watch_settings",
14275
+ "tags": [
14276
+ "market-watch"
14277
+ ],
14278
+ "summary": "GET /market-watch/settings",
14279
+ "description": "**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.settings.manage` (all required).",
14280
+ "x-rank": "metic+archon",
14281
+ "x-source": "modules/market-watch/routes/settings.js",
14282
+ "x-permissions": [
14283
+ "project.settings.manage"
14284
+ ],
14285
+ "responses": {
14286
+ "200": {
14287
+ "description": "Success."
14288
+ },
14289
+ "400": {
14290
+ "$ref": "#/components/responses/BadRequest"
14291
+ },
14292
+ "401": {
14293
+ "$ref": "#/components/responses/Unauthorized"
14294
+ },
14295
+ "403": {
14296
+ "$ref": "#/components/responses/Forbidden"
14297
+ }
14298
+ },
14299
+ "security": [
14300
+ {
14301
+ "builderSession": []
14302
+ }
14303
+ ]
14304
+ },
14305
+ "patch": {
14306
+ "operationId": "patch_market_watch_settings",
14307
+ "tags": [
14308
+ "market-watch"
14309
+ ],
14310
+ "summary": "PATCH /market-watch/settings",
14311
+ "description": "**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.settings.manage` (all required).",
14312
+ "x-rank": "metic+archon",
14313
+ "x-source": "modules/market-watch/routes/settings.js",
14314
+ "x-permissions": [
14315
+ "project.settings.manage"
14316
+ ],
14317
+ "requestBody": {
14318
+ "required": false,
14319
+ "content": {
14320
+ "application/json": {
14321
+ "schema": {
14322
+ "$ref": "#/components/schemas/PatchMarketWatchSettingsRequest"
14323
+ }
14324
+ }
14325
+ },
14326
+ "x-validated": true
14327
+ },
14328
+ "responses": {
14329
+ "200": {
14330
+ "description": "Success."
14331
+ },
14332
+ "400": {
14333
+ "$ref": "#/components/responses/ValidationFailed"
14334
+ },
14335
+ "401": {
14336
+ "$ref": "#/components/responses/Unauthorized"
14337
+ },
14338
+ "403": {
14339
+ "$ref": "#/components/responses/Forbidden"
14340
+ }
14341
+ },
14342
+ "security": [
14343
+ {
14344
+ "builderSession": []
14345
+ }
14346
+ ]
14347
+ }
14348
+ },
14349
+ "/market-watch/settings/key": {
14350
+ "put": {
14351
+ "operationId": "put_market_watch_settings_key",
14352
+ "tags": [
14353
+ "market-watch"
14354
+ ],
14355
+ "summary": "PUT /market-watch/settings/key",
14356
+ "description": "**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.settings.manage` (all required).",
14357
+ "x-rank": "metic+archon",
14358
+ "x-source": "modules/market-watch/routes/settings.js",
14359
+ "x-permissions": [
14360
+ "project.settings.manage"
14361
+ ],
14362
+ "requestBody": {
14363
+ "required": true,
14364
+ "content": {
14365
+ "application/json": {
14366
+ "schema": {
14367
+ "$ref": "#/components/schemas/PutMarketWatchSettingsKeyRequest"
14368
+ }
14369
+ }
14370
+ },
14371
+ "x-validated": true
14372
+ },
14373
+ "responses": {
14374
+ "200": {
14375
+ "description": "Success."
14376
+ },
14377
+ "400": {
14378
+ "$ref": "#/components/responses/ValidationFailed"
14379
+ },
14380
+ "401": {
14381
+ "$ref": "#/components/responses/Unauthorized"
14382
+ },
14383
+ "403": {
14384
+ "$ref": "#/components/responses/Forbidden"
14385
+ }
14386
+ },
14387
+ "security": [
14388
+ {
14389
+ "builderSession": []
14390
+ }
14391
+ ]
14392
+ },
14393
+ "delete": {
14394
+ "operationId": "delete_market_watch_settings_key",
14395
+ "tags": [
14396
+ "market-watch"
14397
+ ],
14398
+ "summary": "DELETE /market-watch/settings/key",
14399
+ "description": "**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.settings.manage` (all required).",
14400
+ "x-rank": "metic+archon",
14401
+ "x-source": "modules/market-watch/routes/settings.js",
14402
+ "x-permissions": [
14403
+ "project.settings.manage"
14404
+ ],
14405
+ "responses": {
14406
+ "200": {
14407
+ "description": "Success."
14408
+ },
14409
+ "400": {
14410
+ "$ref": "#/components/responses/BadRequest"
14411
+ },
14412
+ "401": {
14413
+ "$ref": "#/components/responses/Unauthorized"
14414
+ },
14415
+ "403": {
14416
+ "$ref": "#/components/responses/Forbidden"
14417
+ }
14418
+ },
14419
+ "security": [
14420
+ {
14421
+ "builderSession": []
14422
+ }
14423
+ ]
14424
+ }
14425
+ },
14272
14426
  "/me": {
14273
14427
  "get": {
14274
14428
  "operationId": "get_me",
@@ -26132,7 +26286,7 @@
26132
26286
  "store"
26133
26287
  ],
26134
26288
  "summary": "GET /store/modules",
26135
- "description": "The store catalog under the quality floor (task 1003807, ADR 0343 D2/D5): each listed module's newest version, if it passed the Security gate and scores at or above the floor, or under \"new\" if it has no real-world data yet. Below the bar is not listed at all. The floor is fixed in module-listing.js and returned here. `?sort=<part>` orders the listed modules by the part a buyer cares about (task 1003800, sortByPart); the parts it accepts come back as sort_parts. Without it the listed modules are ranked quality first, price breaking ties (task 1003808, rankListed); `?max_cents=` / `?max_credits=` leave out modules that cost more. rank: any-builder — a read of public store metadata, like /store/modules/latest: no entitlement taken, nothing changed.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
26289
+ "description": "The store catalog under the quality floor (task 1003807, ADR 0343 D2/D5): each listed module's newest version, if it passed the Security gate and scores at or above the floor, or under \"new\" if it has no real-world data yet. Below the bar is not listed at all. The floor is fixed in module-listing.js and returned here. `?sort=<part>` orders the listed modules by the part a buyer cares about (task 1003800, sortByPart); the parts it accepts come back as sort_parts. Without it the listed modules are ranked quality first, price breaking ties (task 1003808, rankListed); `?max_cents=` leaves out modules that cost more. rank: any-builder — a read of public store metadata, like /store/modules/latest: no entitlement taken, nothing changed.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
26136
26290
  "x-rank": "any-builder",
26137
26291
  "x-source": "src/bongos/routes/modules.js",
26138
26292
  "responses": {
@@ -26483,7 +26637,7 @@
26483
26637
  "store"
26484
26638
  ],
26485
26639
  "summary": "POST /store/modules/:key/price",
26486
- "description": "POST /api/bongos/store/modules/:key/price — the module's author sets its price (task 1004894, criterion wa5-module-economy). Body: { cents?, credits? }, each a whole number of 0 or more, or null for \"not offered in that currency\"; at least one is given, and 0 in either is free. Appends a row to the price history; the newest is what the catalog shows and what acquire charges. A paid price may be set before buying exists (owner, 2026-10-26): the catalog marks it not yet buyable. Price never moves the score (ADR 0343 D6). The audit middleware records who changed it and to what. rank: metic+archon — the same gate as publishing (module.submit), plus the author check inside setPrice: only the person who published the module prices it.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `module.submit` (all required).",
26640
+ "description": "POST /api/bongos/store/modules/:key/price — the module's author sets its price (task 1004894, criterion wa5-module-economy). Body: { cents }, a whole number of 0 or more; 0 is free. A credit price is refused (task 1004989, ADR 0385 decision 2: credits never price or buy a module). Appends a row to the price history; the newest is what the catalog shows and what acquire charges. A paid price may be set before buying exists (owner, 2026-10-26): the catalog marks it not yet buyable. Price never moves the score (ADR 0343 D6). The audit middleware records who changed it and to what. rank: metic+archon — the same gate as publishing (module.submit), plus the author check inside setPrice: only the person who published the module prices it.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `module.submit` (all required).",
26487
26641
  "x-rank": "metic+archon",
26488
26642
  "x-source": "src/bongos/routes/modules.js",
26489
26643
  "x-permissions": [
@@ -33196,6 +33350,15 @@
33196
33350
  "idea"
33197
33351
  ]
33198
33352
  },
33353
+ "PatchMarketWatchSettingsRequest": {
33354
+ "type": "object",
33355
+ "properties": {
33356
+ "enabled": {},
33357
+ "monthly_cap_usd": {},
33358
+ "cadence": {}
33359
+ },
33360
+ "additionalProperties": false
33361
+ },
33199
33362
  "PatchMeCoreMoveSeenRequest": {
33200
33363
  "type": "object",
33201
33364
  "properties": {
@@ -39520,8 +39683,11 @@
39520
39683
  "PostStoreModulesKeyPriceRequest": {
39521
39684
  "type": "object",
39522
39685
  "properties": {
39523
- "cents": {},
39524
- "credits": {}
39686
+ "cents": {
39687
+ "type": "integer",
39688
+ "minimum": 0,
39689
+ "maximum": 100000000
39690
+ }
39525
39691
  },
39526
39692
  "additionalProperties": false
39527
39693
  },
@@ -40500,6 +40666,19 @@
40500
40666
  },
40501
40667
  "additionalProperties": false
40502
40668
  },
40669
+ "PutMarketWatchSettingsKeyRequest": {
40670
+ "type": "object",
40671
+ "properties": {
40672
+ "key": {
40673
+ "type": "string",
40674
+ "maxLength": 512
40675
+ }
40676
+ },
40677
+ "required": [
40678
+ "key"
40679
+ ],
40680
+ "additionalProperties": false
40681
+ },
40503
40682
  "PutMingleOptInRequest": {
40504
40683
  "type": "object",
40505
40684
  "properties": {
@@ -40801,8 +40980,8 @@
40801
40980
  "description": "A required dependency/feature is not configured or is temporarily down."
40802
40981
  }
40803
40982
  },
40804
- "x-endpoint-count": 643,
40805
- "x-schema-count": 691,
40983
+ "x-endpoint-count": 647,
40984
+ "x-schema-count": 693,
40806
40985
  "x-undocumented-bodies": 12,
40807
40986
  "x-response-schemas": 444,
40808
40987
  "x-generated-by": "scripts/bongos/gen-api-docs.js"
@@ -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. 647 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
 
@@ -953,7 +957,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
953
957
  | POST | `/api/bongos/store/modules/:key/delist` | `metic+archon` | `reason` | POST /api/bongos/store/modules/:key/delist — a Metic+ person takes a module out of the store (task 1003797, ADR 0338 D2). |
954
958
  | GET | `/api/bongos/store/modules/:key/entitlement` | `any-builder` | — | |
955
959
  | GET | `/api/bongos/store/modules/:key/listing` | `any-builder` | — | GET /api/bongos/store/modules/:key/listing — whether one module is in the catalog and why (task 1003810): the reason in a sentence, what … |
956
- | POST | `/api/bongos/store/modules/:key/price` | `metic+archon` | `cents`, `credits` | POST /api/bongos/store/modules/:key/price — the module's author sets its price (task 1004894, criterion wa5-module-economy). |
960
+ | POST | `/api/bongos/store/modules/:key/price` | `metic+archon` | `cents` | POST /api/bongos/store/modules/:key/price — the module's author sets its price (task 1004894, criterion wa5-module-economy). |
957
961
  | POST | `/api/bongos/store/modules/:key/versions` | `metic+archon` | _undocumented_ | POST /api/bongos/store/modules/:key/versions — publish one module version to the store (task 1004271, ADR 0338 D1). |
958
962
  | GET | `/api/bongos/store/modules/:key/versions/:version/channel` | `any-builder` | — | GET /api/bongos/store/modules/:key/versions/:version/channel — where a version stands on the promotion gate (task 1003804, ADR 0344 D3): … |
959
963
  | POST | `/api/bongos/store/modules/:key/versions/:version/error-count` | `any-builder` | `day`, `count` | |
@@ -253,8 +253,8 @@ store_module_versions(id, module_key, version exact X.Y.Z, core_version, manifes
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
255
  store_module_prices(id, module_key, price_cents, price_credits, set_by, set_at)
256
- -- history; newest row per module is current. 0 = free, NULL = not offered
257
- -- in that currency, at least one must be set.
256
+ -- history; newest row per module is current. Cash only since core_287 (task 1004989):
257
+ -- price_credits is historical, a credit-only newest row reads "price coming". 0 cents = free.
258
258
  ```
259
259
 
260
260
  Passkey foundation (migration `core_277`, task 1004750, [ADR 0382](adr/0382-a-hardware-card-is-a-passkey-step-up-an-archon-switches-on-per-builder.md) D1/D6 — storage only; the ceremonies and routes are their own tasks; code in `src/bongos/passkeys.js`):