@bongos/core 1.17.1 → 1.17.3

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 (233) hide show
  1. package/.bongos-core.json +521 -281
  2. package/.claude/skills/blocker-review/SKILL.md +1 -1
  3. package/.claude/skills/builder-claim/SKILL.md +2 -0
  4. package/.claude/skills/builder-exit/SKILL.md +2 -2
  5. package/.claude/skills/builder-redteam/SKILL.md +3 -3
  6. package/.claude/skills/builder-setup/SKILL.md +2 -2
  7. package/.claude/skills/builder-start/SKILL.md +1 -1
  8. package/.claude/skills/dev/SKILL.md +1 -1
  9. package/.claude/skills/idea-triage/SKILL.md +2 -2
  10. package/.claude/skills/ideate/SKILL.md +1 -1
  11. package/.claude/skills/merge-mode/SKILL.md +1 -1
  12. package/.claude/skills/new-project/SKILL.md +3 -0
  13. package/.claude/skills/paint/SKILL.md +1 -1
  14. package/GOVERNANCE.md +1 -1
  15. package/README.md +1 -1
  16. package/clients/bongos-client/README.md +1 -1
  17. package/clients/bongos-client/bongos-client.global.js +2 -0
  18. package/clients/bongos-client/index.cjs +2 -0
  19. package/clients/bongos-client/index.d.ts +4 -2
  20. package/clients/bongos-client/index.mjs +2 -0
  21. package/docs/adr/0001-stack-choice-single-vps.md +1 -1
  22. package/docs/adr/0008-google-chat-oauth-user-auth.md +1 -1
  23. package/docs/adr/0019-red-team-bounty-payout-table.md +3 -3
  24. package/docs/adr/0020-security-model-public-stub.md +1 -1
  25. package/docs/adr/0023-kind-multipliers-and-idea-bonus.md +1 -1
  26. package/docs/adr/0024-cloneable-repo-local-first-memory.md +1 -1
  27. package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +4 -4
  28. package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +3 -3
  29. package/docs/adr/0030-builders-hall-live-updates.md +1 -1
  30. package/docs/adr/0031-cloud-dev-environments-for-builders.md +4 -4
  31. package/docs/adr/0032-discord-mirror-of-gds.md +2 -2
  32. package/docs/adr/0034-thetes-graduated-newcomer-rank.md +1 -1
  33. package/docs/adr/0044-mediterranean-palette-replacement.md +1 -1
  34. package/docs/adr/0044-per-box-live-game-preview.md +1 -1
  35. package/docs/adr/0054-session-token-reward-cost-plus.md +10 -10
  36. package/docs/adr/0057-container-cost-ledger.md +3 -3
  37. package/docs/adr/0062-medusa-instance-model-decoupling.md +4 -4
  38. package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +2 -2
  39. package/docs/adr/0085-remove-default-per-builder-spend-cap.md +1 -1
  40. package/docs/adr/0086-goal-scoped-work-hierarchy.md +1 -1
  41. package/docs/adr/0096-require-reward-before-workable.md +9 -9
  42. package/docs/adr/0097-retroactive-reward-backfill.md +3 -3
  43. package/docs/adr/0100-two-repo-instance-model.md +1 -1
  44. package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +3 -3
  45. package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +3 -3
  46. package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +1 -1
  47. package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +6 -6
  48. package/docs/adr/0136-update-channel-subscription-policy.md +51 -0
  49. package/docs/adr/0137-upstream-publish-policy-manual-owner-gated.md +40 -0
  50. package/docs/adr/0138-bundled-module-deps-declared-per-module.md +45 -0
  51. package/docs/adr/README.md +9 -6
  52. package/docs/api/openapi.json +65 -26
  53. package/docs/api-reference.md +3 -2
  54. package/docs/architecture.md +2 -2
  55. package/docs/branding-contract.md +5 -4
  56. package/docs/canonical-permissions.md +1 -1
  57. package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
  58. package/docs/file-map.md +18 -17
  59. package/docs/handoff-template.md +2 -2
  60. package/docs/modules-contract.md +6 -1
  61. package/docs/onboarding/diagrams/README.md +7 -7
  62. package/docs/onboarding/drachmae-and-karma.md +18 -18
  63. package/docs/onboarding/primer.md +9 -9
  64. package/docs/recipes/audit-replay.md +2 -2
  65. package/docs/recipes/builder-box-lifecycle.md +2 -2
  66. package/docs/recipes/claude-design-loop.md +1 -1
  67. package/docs/recipes/ops-gotchas.md +1 -1
  68. package/docs/recipes/private-npm-distribution.md +17 -0
  69. package/docs/recipes/staging-environment.md +1 -1
  70. package/docs/recipes/upgrading-the-core.md +55 -0
  71. package/docs/research/cursor-competitive-analysis.md +1 -1
  72. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +1 -1
  73. package/modules/discord/module.json +2 -1
  74. package/modules/economy/achievements.js +9 -1
  75. package/modules/economy/credits.js +10 -1
  76. package/modules/hall-ui/public/builders.js +137 -620
  77. package/modules/hall-ui/public/goal-inbox.js +232 -0
  78. package/modules/hall-ui/public/goals-page.js +4 -1
  79. package/modules/hall-ui/public/goals.html +8 -0
  80. package/modules/hall-ui/public/hall-kit.js +474 -0
  81. package/modules/hall-ui/public/hall-widgets.js +14 -5
  82. package/modules/hall-ui/public/index.html +3 -0
  83. package/modules/hall-ui/public/instances-panel.js +24 -3
  84. package/modules/hall-ui/public/new-project-wizard.js +7 -5
  85. package/modules/hall-ui/public/style.css +168 -0
  86. package/modules/hall-ui/public/work.css +194 -0
  87. package/modules/hall-ui/public/work.html +46 -374
  88. package/modules/hall-ui/public/work.js +137 -102
  89. package/modules/lifecycle/criterion-suggest.js +80 -0
  90. package/modules/lifecycle/db.js +42 -5
  91. package/modules/lifecycle/routes/goals.js +26 -0
  92. package/modules/lifecycle/routes/tasks.js +21 -0
  93. package/modules/provisioning/CLAUDE.md +15 -0
  94. package/modules/provisioning/migrations/provisioning_001_tables.sql +160 -0
  95. package/modules/provisioning/migrations/provisioning_002_standalone_shape.sql +11 -0
  96. package/modules/provisioning/migrations/provisioning_003_github_app_manifest.sql +95 -0
  97. package/modules/provisioning/module.json +17 -0
  98. package/modules/provisioning/onboard-plan.js +37 -0
  99. package/modules/provisioning/provisioning.js +539 -0
  100. package/modules/provisioning/rate-limit.js +35 -0
  101. package/modules/provisioning/routes/provisioning.js +607 -0
  102. package/modules/provisioning/tests/provisioning.mjs +232 -0
  103. package/modules/provisioning/ui/.gitkeep +0 -0
  104. package/modules/security/secret-scrub.js +10 -0
  105. package/package-lock.json +2 -2
  106. package/package.json +7 -2
  107. package/scripts/discord/README.md +1 -1
  108. package/scripts/gds/claim.js +98 -48
  109. package/scripts/gds/claude-materialize.js +30 -9
  110. package/scripts/gds/cutover-codemod.js +241 -0
  111. package/scripts/gds/fitness.js +54 -0
  112. package/scripts/gds/init.js +59 -3
  113. package/scripts/gds/lint-infra-exec.js +70 -0
  114. package/scripts/gds/lint-workflow-exec.js +63 -0
  115. package/scripts/gds/mirror-lineage-check.js +14 -5
  116. package/scripts/gds/mirror-redact.js +8 -0
  117. package/scripts/gds/onboard.js +4 -0
  118. package/scripts/gds/package-core.js +18 -3
  119. package/scripts/gds/publish-manifest.js +60 -2
  120. package/scripts/gds/run-routine.js +51 -13
  121. package/scripts/gds/run-unit-tests.js +4 -0
  122. package/scripts/gds/update-channel.js +186 -0
  123. package/scripts/gds/upgrade.js +116 -9
  124. package/scripts/hall-preview/README.md +103 -0
  125. package/scripts/hall-preview/fixtures/access-requests.json +1 -0
  126. package/scripts/hall-preview/fixtures/achievements.json +76 -0
  127. package/scripts/hall-preview/fixtures/analytics__builder.json +251 -0
  128. package/scripts/hall-preview/fixtures/audit-log.json +1 -0
  129. package/scripts/hall-preview/fixtures/boxes__cost-ledger.json +1 -0
  130. package/scripts/hall-preview/fixtures/builders__active-claims.json +1 -0
  131. package/scripts/hall-preview/fixtures/builders__directory.json +81 -0
  132. package/scripts/hall-preview/fixtures/builders__roster.json +1 -0
  133. package/scripts/hall-preview/fixtures/goals.json +502 -0
  134. package/scripts/hall-preview/fixtures/goals__25.json +96 -0
  135. package/scripts/hall-preview/fixtures/goals__26.json +67 -0
  136. package/scripts/hall-preview/fixtures/goals__3.json +103 -0
  137. package/scripts/hall-preview/fixtures/goals__35.json +49 -0
  138. package/scripts/hall-preview/fixtures/goals__conflicts.json +154 -0
  139. package/scripts/hall-preview/fixtures/goals__detail.json +96 -0
  140. package/scripts/hall-preview/fixtures/goals__inbox.json +5 -0
  141. package/scripts/hall-preview/fixtures/goals__requests.json +3 -0
  142. package/scripts/hall-preview/fixtures/grades__by-builder.json +1 -0
  143. package/scripts/hall-preview/fixtures/inbox.json +330 -0
  144. package/scripts/hall-preview/fixtures/instance.json +124 -0
  145. package/scripts/hall-preview/fixtures/leaderboard.json +184 -0
  146. package/scripts/hall-preview/fixtures/me.json +476 -0
  147. package/scripts/hall-preview/fixtures/me__recent-ships.json +304 -0
  148. package/scripts/hall-preview/fixtures/override-requests.json +1 -0
  149. package/scripts/hall-preview/fixtures/provisioning__fleet.json +1 -0
  150. package/scripts/hall-preview/fixtures/provisioning__fleet__cost-ledger.json +1 -0
  151. package/scripts/hall-preview/fixtures/provisioning__instances.json +1 -0
  152. package/scripts/hall-preview/fixtures/public__analytics__ecosystem.json +516 -0
  153. package/scripts/hall-preview/fixtures/public__bounty-table.json +37 -0
  154. package/scripts/hall-preview/fixtures/public__cost-summary.json +742 -0
  155. package/scripts/hall-preview/fixtures/public__estimation-drift.json +41 -0
  156. package/scripts/hall-preview/fixtures/public__grades.json +50 -0
  157. package/scripts/hall-preview/fixtures/public__progress.json +124 -0
  158. package/scripts/hall-preview/fixtures/public__recent-shipped.json +426 -0
  159. package/scripts/hall-preview/fixtures/public__repo-health.json +160 -0
  160. package/scripts/hall-preview/fixtures/public__repo-info.json +5 -0
  161. package/scripts/hall-preview/fixtures/security__docs.json +1 -0
  162. package/scripts/hall-preview/fixtures/security__reports.json +1 -0
  163. package/scripts/hall-preview/fixtures/sessions__search.json +1 -0
  164. package/scripts/hall-preview/fixtures/tasks.json +2420 -0
  165. package/scripts/hall-preview/fixtures/tasks__claimable.json +2555 -0
  166. package/scripts/hall-preview/fixtures/tasks__detail.json +111 -0
  167. package/scripts/hall-preview/fixtures/tasks__peer-votes__feed.json +330 -0
  168. package/scripts/hall-preview/fixtures/versions.json +89 -0
  169. package/scripts/hall-preview/refresh-fixtures.js +77 -0
  170. package/scripts/hall-preview/server.js +178 -0
  171. package/scripts/migrate.sh +29 -4
  172. package/src/bongos/auth.js +14 -1
  173. package/src/bongos/optimizer.js +37 -2
  174. package/src/bongos/serve-internal.js +10 -1
  175. package/src/branding.js +1 -0
  176. package/src/module-api.js +12 -1
  177. package/src/module-loader/loader.js +36 -4
  178. package/src/module-loader/manifest-schema.js +16 -1
  179. package/tests/branding.mjs +11 -0
  180. package/tests/claim_error_surface.mjs +107 -0
  181. package/tests/claude_materialize.mjs +20 -0
  182. package/tests/consumer_layout_boot.mjs +302 -0
  183. package/tests/criterion_suggest.mjs +106 -0
  184. package/tests/cutover_codemod.mjs +184 -0
  185. package/tests/device_flow_start.mjs +25 -2
  186. package/tests/hook_core_resolve.mjs +125 -0
  187. package/tests/infra_exec_paths.mjs +104 -0
  188. package/tests/init.mjs +47 -0
  189. package/tests/migrate_root_resolution.mjs +97 -0
  190. package/tests/mirror_lineage_proof.mjs +14 -0
  191. package/tests/module_loader.mjs +42 -0
  192. package/tests/module_manifest.mjs +19 -0
  193. package/tests/onboard.mjs +13 -0
  194. package/tests/package_core.mjs +8 -0
  195. package/tests/provisioning_github_app_routes.mjs +15 -0
  196. package/tests/publish_manifest.mjs +52 -1
  197. package/tests/run_routine.mjs +26 -1
  198. package/tests/run_routine_two_root.mjs +77 -0
  199. package/tests/scrubber_corpus.mjs +17 -0
  200. package/tests/update_channel.mjs +186 -0
  201. package/tests/upgrade.mjs +131 -0
  202. package/tests/workflow_exec_paths.mjs +98 -0
  203. package/docs/design/container-exterior-tiles.md +0 -49
  204. package/docs/design/container-exterior.md +0 -81
  205. package/docs/design/container-interior.md +0 -77
  206. package/docs/design/world-map-scroll.md +0 -41
  207. package/docs/recipes/claude-gemini-bongos-doors.md +0 -155
  208. package/docs/recipes/cloudbongos-staging-gate.md +0 -139
  209. package/docs/recipes/cloudbongos-standup.md +0 -111
  210. package/docs/recipes/parallel-load-results-2026-05-30.md +0 -63
  211. package/docs/recipes/parallel-load-test.md +0 -32
  212. package/docs/recipes/pixel-art-pipeline.md +0 -411
  213. package/docs/recipes/staging-data.md +0 -50
  214. package/migrations/instance/018_pms_v3_planning_seed.sql +0 -131
  215. package/migrations/instance/080_gds_v4_planning_seed.sql +0 -75
  216. package/migrations/instance/110_medusa_planning_seed.sql +0 -70
  217. package/migrations/instance/120_bongos_v1_planning_seed.sql +0 -69
  218. package/migrations/instance/144_bongos_v1_module_system_criterion.sql +0 -26
  219. package/migrations/instance/159_bongos_v1_goal_hierarchy_criterion.sql +0 -29
  220. package/migrations/instance/172_v2_world_planning_seed.sql +0 -163
  221. package/migrations/instance/173_bongos_v1_c7_core_modularized.sql +0 -33
  222. package/migrations/instance/182_gdsv4_bongos_consolidation.sql +0 -132
  223. package/migrations/instance/183_gdsv4_carryover_themed_goals.sql +0 -116
  224. package/migrations/instance/186_bongos_v1_governance_planning_seed.sql +0 -69
  225. package/scripts/gds/art-stage.js +0 -152
  226. package/server.js +0 -212
  227. package/tests/art_key.mjs +0 -121
  228. package/tests/day_cycle.mjs +0 -197
  229. package/tests/snapshot_picker.mjs +0 -233
  230. package/tests/sprite_facing.mjs +0 -35
  231. package/tests/terrain_picker.mjs +0 -298
  232. package/tests/turn_in_place.mjs +0 -280
  233. package/tests/walkability.mjs +0 -188
@@ -0,0 +1,111 @@
1
+ {
2
+ "task": {
3
+ "id": "2166",
4
+ "version_id": "BONGOS-V1",
5
+ "title": "hall-kit.js: shared hall UI primitives (pager, ledger, filter bar, tabs, rail, empty/skeleton)",
6
+ "description": "**What:** New `modules/hall-ui/public/hall-kit.js` — a dependency-free IIFE exposing `window.OTBKit`, the shared component kit the page redesigns (tasks hallux-t04..t11) adopt. Hard cap ~500 lines. No page adopts in this task.\n\n**Primitives (six, no more):**\n1. **Pager** — canonize the best implementation (`work.js:105-184`: makePager/paginate/renderPagerBar/wirePager — clamping, localStorage persistence, hide-below-min, poll-safe page retention) + `pagerBarHtml(prefix)` emitting the standard `#<prefix>-{pager,range,page,prev,next,per-page}` markup. localStorage key stays a caller parameter so existing per-page keys survive migration.\n2. **Ledger** — `makeLedger({mount, columns, rowHtml, emptyMsg, pager})` stamping `table.ledger` + pager bar; exposes `render(rows)`. Low-level pager stays exported for incremental adoption.\n3. **Filter bar** — `makeFilterBar({mount, primary, overflow, search, onChange})`: primary controls inline, the rest behind a \"More filters\" disclosure with active-count badge; URL-query sync helper.\n4. **Tabs** — hash-synced tab strip (promote the `setup__tab` idiom); toggles `hidden` on panels exactly like the index hash views (window stays the only scroller).\n5. **Section rail** — `makeSectionRail(items, mount, {mode})` with two modes: scrollspy (Standing idiom) and panel-switch (Settings idiom) — one implementation replacing the two divergent copies.\n6. **Empty/skeleton + collapsible** — `emptyState(msg, {action})`, `skeletonRows(n, cols)` (CSS-only shimmer via color-mix of --ink/--bg), `collapsibleCard` (generalize the Work backlog details idiom).\n\n**Style:** string-template + innerHTML, factories return {el, render(data)} — the idiom pages already use. No state manager, no render loop. Guard the global assignment eval-safe (no eval-time DOM) like dom-utils.js.\n\n**CSS:** kit styles land as ONE new bannered section in `modules/hall-ui/public/style.css` (reuse existing .ledger/.pager/.filters classes; add only disclosure, skeleton shimmer, rail generalization). While in there: normalize section banners into a stable order + add a table-of-contents comment. **NEVER move or rename lines 12-107 (the 13 color + 2 font theme vars + dark-mode flip — the instance-pack API).** Do NOT touch dom-utils.js (Node-required by tests/module_contributions.mjs).\n\n**Acceptance:** kit file loads standalone with zero console errors on any page when included; grep-diff proves style.css token block byte-identical; no page behavior changes (nothing adopts yet).\n\n**Verify:** hall preview harness (scripts/hall-preview, task hallux-t02) + Playwright — screenshots {light,dark}x{1280w,390w}, seam assertions (window is the only scroller; #/idea/N overlay + #/task/N navigation intact; module widgets mount and vanish with modules off). Run `node scripts/gds/fitness.js` + `node --check` on edited JS before ship.",
7
+ "status": "shipped",
8
+ "touches": [
9
+ "modules/hall-ui/public/hall-kit.js",
10
+ "modules/hall-ui/public/style.css",
11
+ "scripts/gds/CLAUDE.md"
12
+ ],
13
+ "est_minutes": 240,
14
+ "est_cost_usd": null,
15
+ "manual_degree": null,
16
+ "priority": 2,
17
+ "automation_tag": null,
18
+ "credits_reward": 80,
19
+ "source": "hall-ux-redesign",
20
+ "source_ref": "hallux-t1",
21
+ "promoted_at": null,
22
+ "shipped_at": "2026-07-10T18:28:51.046Z",
23
+ "shipped_by": "95",
24
+ "value_summary": "The builders' hall now has one shared component kit — tables, pagers, filters, tabs, and rails that used to be rebuilt slightly differently on every page now come from a single source, so every page redesign that follows lands faster and behaves the same way.",
25
+ "created_at": "2026-07-10T18:16:55.661Z",
26
+ "updated_at": "2026-07-10T18:28:51.046Z",
27
+ "kind": "infra",
28
+ "parent_task_id": null,
29
+ "actual_minutes": 10,
30
+ "scoping_confidence": null,
31
+ "discipline": "engineer",
32
+ "parallel_safe": null,
33
+ "newcomer_friendly": false,
34
+ "requires_rank": "xenos",
35
+ "needs_migration": false,
36
+ "security_sensitive": false,
37
+ "sandbox_review": null,
38
+ "goal_id": "25",
39
+ "module_key": null,
40
+ "reward_gate_exempt": false,
41
+ "credits_awarded": 80,
42
+ "est_minutes_calibrated": 20,
43
+ "dependencies": [],
44
+ "dependents": [
45
+ {
46
+ "id": "2171",
47
+ "title": "Goals page: converge onto the kit (pagers, filter bar, invite disclosure)",
48
+ "status": "ready",
49
+ "version_id": "BONGOS-V1",
50
+ "kind": "refactor",
51
+ "priority": 2
52
+ },
53
+ {
54
+ "id": "2169",
55
+ "title": "Home redesign: attention inbox, Projects card, linked stat tiles, zone budgets",
56
+ "status": "backlog",
57
+ "version_id": "BONGOS-V1",
58
+ "kind": "refactor",
59
+ "priority": 2
60
+ },
61
+ {
62
+ "id": "2176",
63
+ "title": "Secondary-page sweep: inline styles to per-page CSS + kit empty states",
64
+ "status": "ready",
65
+ "version_id": "BONGOS-V1",
66
+ "kind": "refactor",
67
+ "priority": 2
68
+ },
69
+ {
70
+ "id": "2172",
71
+ "title": "Settings regroup: 6 groups, standard panel anatomy, stable anchors",
72
+ "status": "ready",
73
+ "version_id": "BONGOS-V1",
74
+ "kind": "blocker-resolution",
75
+ "priority": 2
76
+ },
77
+ {
78
+ "id": "2175",
79
+ "title": "Sidebar IA regroup by audience + Economy in Docs + task page breadcrumb",
80
+ "status": "backlog",
81
+ "version_id": "BONGOS-V1",
82
+ "kind": "feature",
83
+ "priority": 2
84
+ },
85
+ {
86
+ "id": "2174",
87
+ "title": "Standing consolidation: 4 rail sections, Achievements folded in, bounties to Economy",
88
+ "status": "backlog",
89
+ "version_id": "BONGOS-V1",
90
+ "kind": "feature",
91
+ "priority": 2
92
+ },
93
+ {
94
+ "id": "2173",
95
+ "title": "Watch redesign: attention row + People/Operations/Security tabs (Archon)",
96
+ "status": "ready",
97
+ "version_id": "BONGOS-V1",
98
+ "kind": "blocker-resolution",
99
+ "priority": 2
100
+ },
101
+ {
102
+ "id": "2170",
103
+ "title": "Work board redesign: tabs, filter diet, denser cards",
104
+ "status": "ready",
105
+ "version_id": "BONGOS-V1",
106
+ "kind": "refactor",
107
+ "priority": 2
108
+ }
109
+ ]
110
+ }
111
+ }
@@ -0,0 +1,330 @@
1
+ {
2
+ "tasks": [
3
+ {
4
+ "id": "2160",
5
+ "title": "R89-prereq (rehearsal F2): consumer package.json must carry the full host dep closure (+ decide core-module deps like discord.js)",
6
+ "value_summary": "R89 cutover prerequisite (F2): decided to keep the shared platform package lean — a module that needs an extra library (Discord) now declares it itself, and a new project automatically picks up the libraries for the features it turns on. (Landed via the shared R89 branch merged under task 2159.)",
7
+ "version_id": "BONGOS-V1",
8
+ "status": "shipped",
9
+ "shipped_at": "2026-07-10T18:09:25.806Z",
10
+ "shipped_by": "1",
11
+ "github_login": "lars589",
12
+ "display_name": "lars589",
13
+ "net_votes": 0,
14
+ "my_vote": null
15
+ },
16
+ {
17
+ "id": "2161",
18
+ "title": "R89-prereq (rehearsal F3): server.js game entrypoint — widen core exports + rewrite its core requires + set consumer start=server.js",
19
+ "value_summary": "R89 cutover prerequisite (F3): the shared platform package now exposes the pieces a game instance's entrypoint needs, and the cutover tool rewrites that entrypoint to use them — so the game server still boots after the split. (Landed via the shared R89 branch merged under task 2159.)",
20
+ "version_id": "BONGOS-V1",
21
+ "status": "shipped",
22
+ "shipped_at": "2026-07-10T18:09:07.800Z",
23
+ "shipped_by": "1",
24
+ "github_login": "lars589",
25
+ "display_name": "lars589",
26
+ "net_votes": 0,
27
+ "my_vote": null
28
+ },
29
+ {
30
+ "id": "2159",
31
+ "title": "R89-prereq (rehearsal F1): cutover codemod to rewrite host-module doorway requires to @bongos/core/module-api",
32
+ "value_summary": "R89 cutover prerequisite (F1): a cutover-time tool that rewrites the game and art modules' internal code links to the shared @bongos/core package, so splitting Amazonprimea onto the packaged core won't break the boot.",
33
+ "version_id": "BONGOS-V1",
34
+ "status": "shipped",
35
+ "shipped_at": "2026-07-10T18:08:15.894Z",
36
+ "shipped_by": "1",
37
+ "github_login": "lars589",
38
+ "display_name": "lars589",
39
+ "net_votes": 0,
40
+ "my_vote": null
41
+ },
42
+ {
43
+ "id": "2158",
44
+ "title": "Upstream auto-publish policy for @bongos/core patch releases (subscription supply side)",
45
+ "value_summary": "Decided how new core releases reach subscribers: the owner publishes them deliberately (not auto-published on every change) — keeps release control and avoids storing a standing publish password in the build system.",
46
+ "version_id": "BONGOS-V1",
47
+ "status": "shipped",
48
+ "shipped_at": "2026-07-10T15:57:10.884Z",
49
+ "shipped_by": "1",
50
+ "github_login": "lars589",
51
+ "display_name": "lars589",
52
+ "net_votes": 0,
53
+ "my_vote": null
54
+ },
55
+ {
56
+ "id": "2144",
57
+ "title": "R89-prereq: rehearse the full cutover on a throwaway clone of amazonprimea (staging)",
58
+ "value_summary": "Rehearsed the big platform split on a throwaway copy of the project before we do it for real — it boots and runs end to end (game + platform) on the pinned Cloud Bongos core. Caught 3 must-fix issues that only appear when converting the live project (not the fresh-start demos), so the real switch won't surprise us.",
59
+ "version_id": "BONGOS-V1",
60
+ "status": "shipped",
61
+ "shipped_at": "2026-07-10T15:42:26.095Z",
62
+ "shipped_by": "1",
63
+ "github_login": "lars589",
64
+ "display_name": "lars589",
65
+ "net_votes": 0,
66
+ "my_vote": null
67
+ },
68
+ {
69
+ "id": "2150",
70
+ "title": "Update subscription: scheduled patch-only auto-upgrade routine for consumer instances",
71
+ "value_summary": "Projects can now subscribe to automatic platform updates: opt in and an instance quietly takes the latest safe bug-fix releases on a schedule — and if an update ever fails a health check it rolls itself back with no downtime. Off by default and fully opt-in, with a per-project setting for how far updates may jump (bug-fixes only, by default).",
72
+ "version_id": "BONGOS-V1",
73
+ "status": "shipped",
74
+ "shipped_at": "2026-07-10T12:05:51.655Z",
75
+ "shipped_by": "1",
76
+ "github_login": "lars589",
77
+ "display_name": "lars589",
78
+ "net_votes": 0,
79
+ "my_vote": null
80
+ },
81
+ {
82
+ "id": "2157",
83
+ "title": "Live rollback drill: prove bongos upgrade auto-rollback end-to-end on demo.cloudbongos.com",
84
+ "value_summary": "Proved on the live demo site that a failed platform update safely undoes itself: we deliberately broke an update and the system automatically rolled back to the working version with zero downtime — confirming the safety net works before we let updates run unattended.",
85
+ "version_id": "BONGOS-V1",
86
+ "status": "shipped",
87
+ "shipped_at": "2026-07-10T11:39:56.167Z",
88
+ "shipped_by": "1",
89
+ "github_login": "lars589",
90
+ "display_name": "lars589",
91
+ "net_votes": 0,
92
+ "my_vote": null
93
+ },
94
+ {
95
+ "id": "2155",
96
+ "title": "Neutralize world-narrative prose in shipped core docs (primer pitch + reclassify OTB game-design specs) — task 1728 clean-split part B",
97
+ "value_summary": "",
98
+ "version_id": "BONGOS-V1",
99
+ "status": "shipped",
100
+ "shipped_at": "2026-07-10T11:10:10.507Z",
101
+ "shipped_by": "1",
102
+ "github_login": "lars589",
103
+ "display_name": "lars589",
104
+ "net_votes": 0,
105
+ "my_vote": null
106
+ },
107
+ {
108
+ "id": "2149",
109
+ "title": "Add auto-rollback to `bongos upgrade` (revert pin + reinstall + restart on failed health check)",
110
+ "value_summary": "The one-command platform update now protects itself: if an update fails partway or the site comes back unhealthy, it automatically undoes the change and restores the previous working version, so a bad update can't leave a site stuck on a broken version.",
111
+ "version_id": "BONGOS-V1",
112
+ "status": "shipped",
113
+ "shipped_at": "2026-07-10T11:08:24.267Z",
114
+ "shipped_by": "1",
115
+ "github_login": "lars589",
116
+ "display_name": "lars589",
117
+ "net_votes": 0,
118
+ "my_vote": null
119
+ },
120
+ {
121
+ "id": "2148",
122
+ "title": "Prove `bongos upgrade` end-to-end on demo.cloudbongos.com via a canary core release (1.17.1 → 1.17.2)",
123
+ "value_summary": "Proved our one-command platform-update system works end-to-end: staged a new version and pushed it live to the demo site with a single command, confirming the running code was actually replaced, the site stayed healthy, and the update was logged.",
124
+ "version_id": "BONGOS-V1",
125
+ "status": "shipped",
126
+ "shipped_at": "2026-07-10T10:45:38.752Z",
127
+ "shipped_by": "1",
128
+ "github_login": "lars589",
129
+ "display_name": "lars589",
130
+ "net_votes": 0,
131
+ "my_vote": null
132
+ },
133
+ {
134
+ "id": "2153",
135
+ "title": "Finish @bongos/core neutralization: drop project-specific recipes + brand-leaking docs (task 1728 clean-split prereq)",
136
+ "value_summary": "New projects built on Cloud Bongos no longer inherit Off the Boats' internal recipes or brand text in the shared platform core.",
137
+ "version_id": "BONGOS-V1",
138
+ "status": "shipped",
139
+ "shipped_at": "2026-07-10T10:13:44.904Z",
140
+ "shipped_by": "1",
141
+ "github_login": "lars589",
142
+ "display_name": "lars589",
143
+ "net_votes": 0,
144
+ "my_vote": null
145
+ },
146
+ {
147
+ "id": "2136",
148
+ "title": "R89-prereq [topology-routing 1/4]: rewrite .github/workflows/*.yml scripts/gds/* invocations to the pinned @bongos/core",
149
+ "value_summary": "The CI checks and merge gates that guard every pull request will keep working after the platform-core split: their commands now resolve the platform code in both the current and future layouts, and a pull request still cannot weaken its own gate.",
150
+ "version_id": "BONGOS-V1",
151
+ "status": "shipped",
152
+ "shipped_at": "2026-07-10T09:58:48.440Z",
153
+ "shipped_by": "1",
154
+ "github_login": "lars589",
155
+ "display_name": "lars589",
156
+ "net_votes": 0,
157
+ "my_vote": null
158
+ },
159
+ {
160
+ "id": "2137",
161
+ "title": "R89-prereq [topology-routing 2/4]: rewrite infra/*.service ExecStart paths to the pinned @bongos/core (11 units)",
162
+ "value_summary": "The background fleet services (dev-box lifecycle, provisioning, nightly search indexing) will keep launching after the platform-core split: their start commands now find the code whether it lives in the old single-repo layout or the new packaged one.",
163
+ "version_id": "BONGOS-V1",
164
+ "status": "shipped",
165
+ "shipped_at": "2026-07-10T09:37:54.653Z",
166
+ "shipped_by": "1",
167
+ "github_login": "lars589",
168
+ "display_name": "lars589",
169
+ "net_votes": 0,
170
+ "my_vote": null
171
+ },
172
+ {
173
+ "id": "2138",
174
+ "title": "R89-prereq [topology-routing 3/4]: materialize .claude/scheduled-tasks (20 routines) + make run-routine.js two-root aware",
175
+ "value_summary": "Kept the automated nightly routines (overnight builder, security review, idea triage, and the housekeeping checkers) working after the platform-core split: the routine dispatcher now finds and runs them whether the code lives in the old single-repo layout or the new packaged one.",
176
+ "version_id": "BONGOS-V1",
177
+ "status": "shipped",
178
+ "shipped_at": "2026-07-10T09:28:34.285Z",
179
+ "shipped_by": "1",
180
+ "github_login": "lars589",
181
+ "display_name": "lars589",
182
+ "net_votes": 0,
183
+ "my_vote": null
184
+ },
185
+ {
186
+ "id": "2139",
187
+ "title": "R89-prereq [topology-routing 4/4]: fix .claude/hooks require()/spawn of scripts/gds & src/bongos to resolve the pinned core (promotes idea 498)",
188
+ "value_summary": "Made the per-session automation resilient to the upcoming platform split: the session hooks now locate the shared platform code whether it lives in the project or in the installed package, so an instance that moves onto the packaged core won't have its sessions start erroring. No visible change today.",
189
+ "version_id": "BONGOS-V1",
190
+ "status": "shipped",
191
+ "shipped_at": "2026-07-10T08:39:54.293Z",
192
+ "shipped_by": "1",
193
+ "github_login": "lars589",
194
+ "display_name": "lars589",
195
+ "net_votes": 0,
196
+ "my_vote": null
197
+ },
198
+ {
199
+ "id": "2152",
200
+ "title": "Fix mirror-lineage C9 check miscounting migrations/instance/ as core (unit-gate red)",
201
+ "value_summary": "Unblocked the automated merge pipeline: an internal safety check was raising a false alarm (mistaking this instance's private setup data for a mismatch) that had stopped code from landing. Fixed the check so merges flow again — nothing about what ships changed.",
202
+ "version_id": "BONGOS-V1",
203
+ "status": "shipped",
204
+ "shipped_at": "2026-07-10T08:35:34.050Z",
205
+ "shipped_by": "1",
206
+ "github_login": "lars589",
207
+ "display_name": "lars589",
208
+ "net_votes": 0,
209
+ "my_vote": null
210
+ },
211
+ {
212
+ "id": "2129",
213
+ "title": "fix(onboarding): surface the manual Enable-Device-Flow step on the GitHub App Manifest path + deep-link it from the device_flow_disabled CLI error",
214
+ "value_summary": "New project owners now get clear guidance to enable GitHub Device Flow for terminal sign-in, and the terminal error links straight to the fix.",
215
+ "version_id": "BONGOS-V1",
216
+ "status": "shipped",
217
+ "shipped_at": "2026-07-09T22:26:49.623Z",
218
+ "shipped_by": "1",
219
+ "github_login": "lars589",
220
+ "display_name": "lars589",
221
+ "net_votes": 0,
222
+ "my_vote": null
223
+ },
224
+ {
225
+ "id": "2101",
226
+ "title": "Brand the provisioning control-plane origin as cloudbongos.com (not amazonprimea.com)",
227
+ "value_summary": "New-customer sign-up can now carry a Cloud Bongos web address instead of the game's domain on the GitHub connection step — shipped and tested; it activates once that address is pointed at the server.",
228
+ "version_id": "BONGOS-V1",
229
+ "status": "shipped",
230
+ "shipped_at": "2026-07-09T22:21:30.598Z",
231
+ "shipped_by": "1",
232
+ "github_login": "lars589",
233
+ "display_name": "lars589",
234
+ "net_votes": 0,
235
+ "my_vote": null
236
+ },
237
+ {
238
+ "id": "2130",
239
+ "title": "fix(security): package-core no-leak gate false-positives on OLDPWD/PWD shell vars (pwd matches the password pattern)",
240
+ "value_summary": "Fixed a bug that could intermittently block publishing a new platform release depending on the operator's working folder. Publishing is now reliable.",
241
+ "version_id": "BONGOS-V1",
242
+ "status": "shipped",
243
+ "shipped_at": "2026-07-09T22:18:53.664Z",
244
+ "shipped_by": "1",
245
+ "github_login": "lars589",
246
+ "display_name": "lars589",
247
+ "net_votes": 0,
248
+ "my_vote": null
249
+ },
250
+ {
251
+ "id": "2142",
252
+ "title": "R89-prereq: real-consumer-layout CI proof — install the .tgz, boot platform-server, run fitness+generators, assert two-root module load",
253
+ "value_summary": "New CI check installs Cloud Bongos the way a real downstream project would — a packaged dependency with its own content on top — and proves it boots and finds all its parts.",
254
+ "version_id": "BONGOS-V1",
255
+ "status": "shipped",
256
+ "shipped_at": "2026-07-09T22:09:40.184Z",
257
+ "shipped_by": "1",
258
+ "github_login": "lars589",
259
+ "display_name": "lars589",
260
+ "net_votes": 0,
261
+ "my_vote": null
262
+ },
263
+ {
264
+ "id": "2147",
265
+ "title": "Exclude host-module tests from @bongos/core; split tests/ in the R89 runbook",
266
+ "value_summary": "Kept the game's own tests out of the shareable core package, so it installs cleanly for other projects.",
267
+ "version_id": "BONGOS-V1",
268
+ "status": "shipped",
269
+ "shipped_at": "2026-07-09T21:34:57.270Z",
270
+ "shipped_by": "1",
271
+ "github_login": "lars589",
272
+ "display_name": "lars589",
273
+ "net_votes": 0,
274
+ "my_vote": null
275
+ },
276
+ {
277
+ "id": "2145",
278
+ "title": "R89-prereq: author the cutover rollback runbook (pg_dump + pin-revert + service restart)",
279
+ "value_summary": "Wrote the rollback plan so a failed split of Off the Boats onto the shared core can be reverted to the working monolith in minutes.",
280
+ "version_id": "BONGOS-V1",
281
+ "status": "shipped",
282
+ "shipped_at": "2026-07-09T21:05:08.417Z",
283
+ "shipped_by": "1",
284
+ "github_login": "lars589",
285
+ "display_name": "lars589",
286
+ "net_votes": 0,
287
+ "my_vote": null
288
+ },
289
+ {
290
+ "id": "2146",
291
+ "title": "Fix gate minimap: click blanks the grid + freezes all controls (0-size minimap → divide-by-zero → NaN pan)",
292
+ "value_summary": "On the Cloud Bongos landing, clicking the bottom-right overview map now recenters the view instead of blanking the grid and freezing the controls.",
293
+ "version_id": "BONGOS-V1",
294
+ "status": "shipped",
295
+ "shipped_at": "2026-07-09T21:03:23.172Z",
296
+ "shipped_by": "1",
297
+ "github_login": "lars589",
298
+ "display_name": "lars589",
299
+ "net_votes": 0,
300
+ "my_vote": null
301
+ },
302
+ {
303
+ "id": "2143",
304
+ "title": "R89-prereq: author the de-couple runbook + isPublishable partition output for amazonprimea",
305
+ "value_summary": "Wrote the step-by-step runbook for splitting Off the Boats onto the shared Cloud Bongos core, with the exact list of which files move to the package vs. stay with the project.",
306
+ "version_id": "BONGOS-V1",
307
+ "status": "shipped",
308
+ "shipped_at": "2026-07-09T21:01:10.751Z",
309
+ "shipped_by": "1",
310
+ "github_login": "lars589",
311
+ "display_name": "lars589",
312
+ "net_votes": 0,
313
+ "my_vote": null
314
+ },
315
+ {
316
+ "id": "2135",
317
+ "title": "R89-prereq: core files must resolve instance modules via resolveInstanceRoot() — fix provision.js + audit siblings",
318
+ "value_summary": "Fixed a post-split crash risk: the shared core no longer references project-only code, and a new automated guard keeps it from creeping back.",
319
+ "version_id": "BONGOS-V1",
320
+ "status": "shipped",
321
+ "shipped_at": "2026-07-09T20:18:44.131Z",
322
+ "shipped_by": "1",
323
+ "github_login": "lars589",
324
+ "display_name": "lars589",
325
+ "net_votes": 0,
326
+ "my_vote": null
327
+ }
328
+ ],
329
+ "can_vote": true
330
+ }
@@ -0,0 +1,89 @@
1
+ {
2
+ "versions": [
3
+ {
4
+ "id": "V1",
5
+ "name": "Game V1 — foundation and polish",
6
+ "track": "product",
7
+ "status": "shipped",
8
+ "scope_doc_path": "limitations/current-version.md",
9
+ "started_at": "2026-05-08T04:00:00.000Z",
10
+ "shipped_at": "2026-05-12T19:58:36.805Z",
11
+ "done_when": "Foundation is durable: regression gates for tiles, sprites, and style-guide drift are live; the world has variant + windowed ground; the player walks; dev ergonomics let new tiles + worlds be added at low manual effort. Commerce shifts to V3."
12
+ },
13
+ {
14
+ "id": "PMS-V1",
15
+ "name": "PMS V1 — project management system, parallel internal track",
16
+ "track": "internal",
17
+ "status": "shipped",
18
+ "scope_doc_path": "limitations/pms-v1-shipped.md",
19
+ "started_at": "2026-05-09T04:00:00.000Z",
20
+ "shipped_at": "2026-05-09T23:43:54.308Z",
21
+ "done_when": "Builders auth via GitHub. Slash commands claim/ship tasks atomically. Backlog migrated. Public status page live."
22
+ },
23
+ {
24
+ "id": "PMS-V2",
25
+ "name": "PMS V2 — themed /builders UI + gamification",
26
+ "track": "internal",
27
+ "status": "shipped",
28
+ "scope_doc_path": "limitations/pms-v2.md",
29
+ "started_at": "2026-05-09T23:26:50.100Z",
30
+ "shipped_at": "2026-05-12T19:52:13.366Z",
31
+ "done_when": "When this is finished, the citizens building Amazonprimea will keep their works on a themed ledger of their own — naming sessions, claiming tasks in batches, earning laurels for milestones, and seeing each version's scope painted in plain words."
32
+ },
33
+ {
34
+ "id": "GDS-V3",
35
+ "name": "PMS V3 — multi-builder readiness + per-builder credentials",
36
+ "track": "internal",
37
+ "status": "shipped",
38
+ "scope_doc_path": "limitations/pms-v3.md",
39
+ "started_at": "2026-05-10T09:30:43.200Z",
40
+ "shipped_at": "2026-06-17T20:49:19.292Z",
41
+ "done_when": "Delivers multi-builder readiness: clone-and-ship onboarding under two hours, three server-enforced ranks, per-builder credentials/cost/authorship, an Opus grader gating quality, parallel-safe claims and merges, a propose-and-ratify cadence, and production-grade security with red-team bounties."
42
+ },
43
+ {
44
+ "id": "V2",
45
+ "name": "Game V2 — visible other players",
46
+ "track": "product",
47
+ "status": "planning",
48
+ "scope_doc_path": "limitations/v2.md",
49
+ "started_at": "2026-05-11T22:41:31.784Z",
50
+ "shipped_at": null,
51
+ "done_when": "Other players are visible in a real, walkable world: a player walks the Olympia Sanctuary in-game at reference-art fidelity, with file-based multi-layer maps feeding both client render and server collision, correct depth-sorting on tall structures, at least two connected maps with server-authoritative warps, and the Olympia art set passing the rubric on the locked palette."
52
+ },
53
+ {
54
+ "id": "V3",
55
+ "name": "Game V3 — first entirely functional game (purchase loop)",
56
+ "track": "product",
57
+ "status": "planning",
58
+ "scope_doc_path": "limitations/v3.md",
59
+ "started_at": "2026-05-11T22:41:31.784Z",
60
+ "shipped_at": null,
61
+ "done_when": "Delivers the real purchase loop: Stripe sign-in, a vendor that sells real Off the Boats goods from a catalogue, order handoff to Hermeslines for fulfilment, and in-world order confirmation.\n\nAlso (folded in from the world-building plan): a lightweight in-house map editor lets a builder author maps that round-trip into the game (depends on the V2 world engine shipping first)."
62
+ },
63
+ {
64
+ "id": "GDS-V4",
65
+ "name": "GDS V4 — recall, resumable pipeline, honest measurement",
66
+ "track": "internal",
67
+ "status": "frozen",
68
+ "scope_doc_path": null,
69
+ "started_at": "2026-05-30T19:36:07.632Z",
70
+ "shipped_at": null,
71
+ "done_when": "When this is finished, a builder's session answers \"have we done this before?\" in one call instead of an afternoon — project knowledge (markdown and database prose alike) is searchable in one rank-scoped query and pushed into sessions at claim time; a failed ship is one command from resume instead of a consumed claim; the recurring tool-error classes (wrong-tree writes, HTML 404s, phantom smoke servers) are engineered away; the BFG's measurements reflect real friction so the improvement is provable against the 2026-06-12 baseline; and the city watches itself on one pane of glass. And the build system itself becomes Medusa — a standalone, configurable, self-hostable, AGPL-licensed, non-profit, AI-first platform decoupled from any one project, with Amazonprimea running as its first instance."
72
+ },
73
+ {
74
+ "id": "BONGOS-V1",
75
+ "name": "Cloud Bongos — platform (V1)",
76
+ "track": "internal",
77
+ "status": "building",
78
+ "scope_doc_path": "limitations/bongos-v1.md",
79
+ "started_at": "2026-06-20T13:43:55.145Z",
80
+ "shipped_at": null,
81
+ "done_when": "Bongos App V1 ships the Cloud Bongos desktop feedback tool: a Zoom-style floating toolbar that captures narrated voice + ~1/sec snapshots and freehand markup over any on-screen target, synthesizes them into one cheap, model-agnostic prompt, and hands it to Claude Desktop and Claude Code. The Dev Box desktop app is absorbed as a module of the bongos app. This is the inaugural version of the bongos line, the successor the GDS migrates into after GDS-V4. Visual element-select is deferred to V2."
82
+ }
83
+ ],
84
+ "page": {
85
+ "limit": 50,
86
+ "offset": 0,
87
+ "total": 8
88
+ }
89
+ }
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env node
2
+ // scripts/hall-preview/refresh-fixtures.js — snapshot real API responses into
3
+ // the preview harness's fixtures/ (task 2167). Run with a valid GDS CLI session
4
+ // (~/.config/otb/gds-session.json) whenever the fixtures drift from the live
5
+ // API shapes: node scripts/hall-preview/refresh-fixtures.js
6
+ //
7
+ // Read-only: GETs only. Endpoints that 403/404 for the caller's rank are
8
+ // skipped (the existing fixture, if any, is kept). Box/terminal endpoints are
9
+ // deliberately NOT snapshotted (they carry host/connection details).
10
+ 'use strict';
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const { cliClient } = require('../gds/cli-lib');
15
+
16
+ const FIXTURES = path.join(__dirname, 'fixtures');
17
+
18
+ // [api path (no /api prefix, no query), fixture name, optional trim fn]
19
+ const trimList = (key, n) => (d) => (Array.isArray(d?.[key]) ? { ...d, [key]: d[key].slice(0, n) } : d);
20
+ const SNAPSHOTS = [
21
+ ['me', 'me'],
22
+ ['me/recent-ships?limit=30', 'me__recent-ships'],
23
+ ['achievements', 'achievements'],
24
+ ['versions', 'versions'],
25
+ ['leaderboard', 'leaderboard'],
26
+ ['inbox', 'inbox', trimList('ideas', 25)],
27
+ ['goals', 'goals'],
28
+ ['goals/inbox', 'goals__inbox'],
29
+ // goal details: a handful of REAL ids (exact-match fixtures) + goal 25
30
+ // doubling as the generic goals__detail fallback for any other id. Without
31
+ // the exact ones, every /goals/:id answers as goal 25 and membership-driven
32
+ // widgets render one goal N times.
33
+ ['goals/25', 'goals__detail'],
34
+ ['goals/25', 'goals__25'],
35
+ ['goals/3', 'goals__3'],
36
+ ['goals/35', 'goals__35'],
37
+ ['goals/26', 'goals__26'],
38
+ ['goals/25/conflicts', 'goals__conflicts'],
39
+ ['goals/25/requests', 'goals__requests'],
40
+ ['tasks/claimable', 'tasks__claimable'],
41
+ ['tasks?status=ready', 'tasks', trimList('tasks', 60)],
42
+ ['tasks/2166', 'tasks__detail'],
43
+ ['tasks/peer-votes/feed?limit=25', 'tasks__peer-votes__feed'],
44
+ ['analytics/builder/95?days=90', 'analytics__builder'],
45
+ ['builders/directory', 'builders__directory'],
46
+ ['instance', 'instance'],
47
+ ['override-requests?status=open', 'override-requests'],
48
+ ['audit-log?limit=25', 'audit-log'],
49
+ ['builders/roster', 'builders__roster'],
50
+ ['public/analytics/ecosystem?days=90', 'public__analytics__ecosystem'],
51
+ ['public/estimation-drift', 'public__estimation-drift'],
52
+ ['public/grades?days=7', 'public__grades'],
53
+ ['public/repo-health?days=30', 'public__repo-health'],
54
+ ['public/bounty-table', 'public__bounty-table'],
55
+ ['public/cost-summary', 'public__cost-summary'],
56
+ ['public/progress', 'public__progress'],
57
+ ['public/recent-shipped', 'public__recent-shipped'],
58
+ ['public/repo-info', 'public__repo-info'],
59
+ ];
60
+
61
+ (async () => {
62
+ const api = await cliClient();
63
+ fs.mkdirSync(FIXTURES, { recursive: true });
64
+ let wrote = 0;
65
+ for (const [apiPath, name, trim] of SNAPSHOTS) {
66
+ const res = await api.request('GET', `/${apiPath}`, {});
67
+ if (!res.ok) {
68
+ console.log(` skip ${apiPath} → ${res.status} (kept existing fixture if present)`);
69
+ continue;
70
+ }
71
+ const data = trim ? trim(res.data) : res.data;
72
+ fs.writeFileSync(path.join(FIXTURES, `${name}.json`), `${JSON.stringify(data, null, 2)}\n`);
73
+ wrote += 1;
74
+ console.log(` wrote ${name}.json (${apiPath})`);
75
+ }
76
+ console.log(`refresh-fixtures: ${wrote}/${SNAPSHOTS.length} snapshots written to ${FIXTURES}`);
77
+ })().catch((e) => { console.error(e.message || e); process.exit(1); });