@bongos/core 1.19.803 → 1.19.805

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 (235) hide show
  1. package/.bongos-core.json +261 -236
  2. package/.claude/skills/ask-for-help/SKILL.md +6 -6
  3. package/.claude/skills/backlog-review/SKILL.md +1 -1
  4. package/.claude/skills/blocker-review/SKILL.md +7 -7
  5. package/.claude/skills/blocker-solve/SKILL.md +5 -5
  6. package/.claude/skills/bug-triage/SKILL.md +7 -7
  7. package/.claude/skills/builder-claim/SKILL.md +3 -3
  8. package/.claude/skills/builder-cost/SKILL.md +2 -2
  9. package/.claude/skills/builder-end/SKILL.md +2 -2
  10. package/.claude/skills/builder-exit/SKILL.md +7 -7
  11. package/.claude/skills/builder-key/SKILL.md +2 -2
  12. package/.claude/skills/builder-reauth/SKILL.md +2 -2
  13. package/.claude/skills/builder-redteam/SKILL.md +7 -7
  14. package/.claude/skills/builder-release/SKILL.md +2 -2
  15. package/.claude/skills/builder-sequence/SKILL.md +1 -1
  16. package/.claude/skills/builder-setup/SKILL.md +3 -3
  17. package/.claude/skills/builder-ship/SKILL.md +1 -1
  18. package/.claude/skills/builder-stage/SKILL.md +1 -1
  19. package/.claude/skills/builder-start/SKILL.md +1 -1
  20. package/.claude/skills/fix-task/SKILL.md +4 -4
  21. package/.claude/skills/goal-create/SKILL.md +18 -18
  22. package/.claude/skills/goal-review/SKILL.md +7 -7
  23. package/.claude/skills/grade-audit/SKILL.md +5 -5
  24. package/.claude/skills/grade-recover/SKILL.md +4 -4
  25. package/.claude/skills/grader-health/SKILL.md +6 -6
  26. package/.claude/skills/idea-triage/SKILL.md +14 -14
  27. package/.claude/skills/merge-mode/SKILL.md +3 -3
  28. package/.claude/skills/planning-session/SKILL.md +20 -20
  29. package/.claude/skills/priority-session/SKILL.md +10 -10
  30. package/.claude/skills/recall/SKILL.md +1 -1
  31. package/.claude/skills/scan-before-install/SKILL.md +3 -3
  32. package/.claude/skills/status/SKILL.md +2 -2
  33. package/.claude/skills/strand-fix/SKILL.md +2 -2
  34. package/clients/bongos-client/README.md +1 -1
  35. package/clients/bongos-client/bongos-client.global.js +2 -0
  36. package/clients/bongos-client/index.cjs +2 -0
  37. package/clients/bongos-client/index.d.ts +2 -0
  38. package/clients/bongos-client/index.mjs +2 -0
  39. package/docs/api/openapi.json +45 -11
  40. package/docs/api-reference.md +11 -10
  41. package/docs/module-api-changelog.md +4 -0
  42. package/modules/builder-settings/profile-nudge-prefs.js +1 -1
  43. package/modules/builder-settings/render-prefs.js +1 -1
  44. package/modules/dev-box/app/README.md +1 -1
  45. package/modules/dev-box/app/src/gds-client.js +11 -9
  46. package/modules/dev-box/app/src/vendor/bongos-client.cjs +2 -0
  47. package/modules/dev-box/app/test/unit.mjs +13 -13
  48. package/modules/dev-box/box-access.js +3 -3
  49. package/modules/dev-box/box-onboard.js +7 -7
  50. package/modules/discord/bug-attachments.js +1 -1
  51. package/modules/economy/cost-classify.js +6 -6
  52. package/modules/grading/grader-rubric.json +1 -1
  53. package/modules/grading/grader-score.js +1 -1
  54. package/modules/hall-ui/module.json +1 -1
  55. package/modules/hall-ui/public/drachmae.js +3 -3
  56. package/modules/hall-ui/public/idea.js +1 -1
  57. package/modules/hall-ui/public/md-reader.js +1 -1
  58. package/modules/hall-ui/public/people.html +5 -1
  59. package/modules/hall-ui/public/people.js +44 -5
  60. package/modules/hall-ui/public/primer.js +4 -4
  61. package/modules/hall-ui/public/roster.js +1 -1
  62. package/modules/hall-ui/public/shell.js +1 -1
  63. package/modules/hall-ui/public/task.js +1 -1
  64. package/modules/ideas/inbox.js +2 -2
  65. package/modules/lifecycle/db-analytics.js +1 -1
  66. package/modules/lifecycle/done-when.js +4 -4
  67. package/modules/lifecycle/version-close.js +1 -1
  68. package/modules/memory/learnings.js +2 -2
  69. package/modules/memory/memory.js +1 -1
  70. package/modules/onboarding/onboarding.js +1 -1
  71. package/modules/platform-identity/routes/my-projects.js +1 -1
  72. package/modules/platform-identity/routes/sso.js +2 -2
  73. package/modules/public-landing/public/index.html +2 -2
  74. package/modules/public-landing/public/projects-floor.states.json +1 -1
  75. package/modules/public-landing/public/projects.html +1 -1
  76. package/modules/public-landing/public/projects.states.json +1 -1
  77. package/modules/sessions/db.js +120 -0
  78. package/modules/sessions/module.json +2 -2
  79. package/modules/sessions/pollers/session-upload-health.js +111 -0
  80. package/modules/sessions/pulse.js +2 -2
  81. package/modules/sessions/routes/sessions.js +46 -0
  82. package/modules/sessions/upload-health.js +197 -0
  83. package/modules/status-ui/module.json +1 -1
  84. package/modules/status-ui/public/explore.js +1 -1
  85. package/package-lock.json +2 -2
  86. package/package.json +1 -1
  87. package/scripts/gds/agent-invoke.js +3 -3
  88. package/scripts/gds/api.js +4 -4
  89. package/scripts/gds/api.sh +1 -1
  90. package/scripts/gds/architect-audit.js +1 -1
  91. package/scripts/gds/artifact-audit.js +2 -2
  92. package/scripts/gds/audit-ships.js +2 -2
  93. package/scripts/gds/backfill-cost.js +1 -1
  94. package/scripts/gds/backfill-sessions.js +1 -1
  95. package/scripts/gds/backfill-subagent-rewards.js +1 -1
  96. package/scripts/gds/backfill-task-rewards.js +2 -2
  97. package/scripts/gds/box-auth-check.js +1 -1
  98. package/scripts/gds/box-sync.js +3 -3
  99. package/scripts/gds/box.js +10 -10
  100. package/scripts/gds/build-cli-package.js +3 -3
  101. package/scripts/gds/capture.js +2 -2
  102. package/scripts/gds/ci-grade.js +1 -1
  103. package/scripts/gds/claim-recall.js +2 -2
  104. package/scripts/gds/cli-lib.js +3 -3
  105. package/scripts/gds/context-pack.js +1 -1
  106. package/scripts/gds/copy-apply.js +2 -2
  107. package/scripts/gds/dev-lib.js +2 -2
  108. package/scripts/gds/fetch-art-key.js +2 -2
  109. package/scripts/gds/fetch-sound-prefs.js +3 -3
  110. package/scripts/gds/grade-smoke.js +1 -1
  111. package/scripts/gds/hooks/pre-push.js +1 -1
  112. package/scripts/gds/init.js +9 -9
  113. package/scripts/gds/key-card.js +1 -1
  114. package/scripts/gds/learning-capture.js +2 -2
  115. package/scripts/gds/linkify-refs.js +2 -2
  116. package/scripts/gds/local-preview-lib.js +1 -1
  117. package/scripts/gds/login.js +11 -10
  118. package/scripts/gds/main-audit.js +1 -1
  119. package/scripts/gds/newcomer-floor.config.json +1 -1
  120. package/scripts/gds/newcomer-floor.js +2 -2
  121. package/scripts/gds/newcomer-floor.templates.json +2 -2
  122. package/scripts/gds/onboarding-ship.js +1 -1
  123. package/scripts/gds/paste-token.js +3 -3
  124. package/scripts/gds/portability-smoke-memory.sh +5 -5
  125. package/scripts/gds/prove-strict-versioning.js +2 -2
  126. package/scripts/gds/provision-net.js +2 -2
  127. package/scripts/gds/provision-units.js +3 -3
  128. package/scripts/gds/pulse.js +2 -2
  129. package/scripts/gds/push-path-brief.js +2 -2
  130. package/scripts/gds/reauth.js +1 -1
  131. package/scripts/gds/recall.js +1 -1
  132. package/scripts/gds/redteam-patrol.js +3 -3
  133. package/scripts/gds/render-ideas.js +5 -5
  134. package/scripts/gds/repo-metrics.js +1 -1
  135. package/scripts/gds/sandbox-stage.js +3 -3
  136. package/scripts/gds/seed-adopt-tasks.js +3 -3
  137. package/scripts/gds/seed-board-room-tasks.js +1 -1
  138. package/scripts/gds/seed-bongos-app-tasks.js +2 -2
  139. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +3 -3
  140. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +4 -4
  141. package/scripts/gds/seed-bongos-tasks.js +5 -5
  142. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +1 -1
  143. package/scripts/gds/seed-bongos-v1-seo-tasks.js +1 -1
  144. package/scripts/gds/seed-bv1-community-tasks.js +1 -1
  145. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +1 -1
  146. package/scripts/gds/seed-bv1-profile-page-tasks.js +1 -1
  147. package/scripts/gds/seed-bv1-profiles-tasks.js +1 -1
  148. package/scripts/gds/seed-bv1-r01-delta-tasks.js +1 -1
  149. package/scripts/gds/seed-gds-v4-tasks.js +3 -3
  150. package/scripts/gds/seed-medusa-tasks.js +1 -1
  151. package/scripts/gds/seed-productization-tasks.js +1 -1
  152. package/scripts/gds/seed-project-admin-console-tasks.js +1 -1
  153. package/scripts/gds/seed-provisioning-tasks.js +2 -2
  154. package/scripts/gds/seed-strict-versioning-tasks.js +3 -3
  155. package/scripts/gds/seed-v2-world-tasks.js +2 -2
  156. package/scripts/gds/seed-verify-criteria.js +1 -1
  157. package/scripts/gds/session-digest.js +1 -1
  158. package/scripts/gds/session.js +2 -2
  159. package/scripts/gds/setup.js +7 -7
  160. package/scripts/gds/ship-flow.js +3 -3
  161. package/scripts/gds/ship-grade-steps.js +3 -3
  162. package/scripts/gds/ship-memory-sync.js +1 -1
  163. package/scripts/gds/ship-session-upload.js +3 -3
  164. package/scripts/gds/smoke-batch-claim.sh +10 -10
  165. package/scripts/gds/smoke-batch-release.sh +14 -14
  166. package/scripts/gds/smoke-claim-consistency.sh +19 -19
  167. package/scripts/gds/smoke-dependencies.sh +9 -9
  168. package/scripts/gds/smoke-write.sh +11 -11
  169. package/scripts/gds/start.js +1 -1
  170. package/scripts/gds/status.js +2 -2
  171. package/scripts/gds/strand-watch.js +1 -1
  172. package/scripts/gds/triage.js +4 -4
  173. package/scripts/gds/version-close.js +2 -2
  174. package/scripts/hall-preview/README.md +1 -1
  175. package/scripts/hall-preview/server.js +1 -1
  176. package/src/bongos/auth-admission.js +3 -3
  177. package/src/bongos/auth-idp.js +2 -2
  178. package/src/bongos/auth.js +3 -3
  179. package/src/bongos/db.js +2 -2
  180. package/src/bongos/llm-cache.js +2 -2
  181. package/src/bongos/metrics.js +1 -1
  182. package/src/bongos/middleware/audit.js +3 -3
  183. package/src/bongos/middleware/rate-limit.js +1 -1
  184. package/src/bongos/platform-visibility-gate.js +2 -2
  185. package/src/bongos/routes/_helpers.js +1 -1
  186. package/src/bongos/routes/audit-log.js +1 -1
  187. package/src/bongos/routes/auth.js +5 -5
  188. package/src/bongos/routes/backup.js +1 -1
  189. package/src/bongos/routes/builders.js +1 -1
  190. package/src/bongos/routes/instance.js +1 -1
  191. package/src/bongos/routes/live.js +1 -1
  192. package/src/bongos/routes/me.js +2 -2
  193. package/src/bongos/routes/modules.js +2 -2
  194. package/src/bongos/routes/public.js +1 -1
  195. package/src/bongos/routes/security.js +4 -4
  196. package/src/bongos/routes.js +1 -1
  197. package/src/bongos/serve-internal.js +6 -6
  198. package/src/branding.js +1 -1
  199. package/src/module-api.js +1 -1
  200. package/src/module-seams.js +2 -2
  201. package/src/platform-server.js +2 -2
  202. package/tests/api_alias_exceptions.mjs +67 -0
  203. package/tests/application_echo.mjs +12 -12
  204. package/tests/artifact_audit.mjs +1 -1
  205. package/tests/auth_page_gate.mjs +4 -4
  206. package/tests/auth_web_recovery.mjs +11 -11
  207. package/tests/bongos_login.mjs +7 -4
  208. package/tests/box_env.mjs +6 -6
  209. package/tests/bug_attachments.mjs +1 -1
  210. package/tests/cli_sessions.mjs +1 -1
  211. package/tests/dev_lib.mjs +1 -1
  212. package/tests/discord_bugs.mjs +2 -2
  213. package/tests/discord_inbound.mjs +2 -2
  214. package/tests/explore_visible_states.mjs +1 -1
  215. package/tests/government_page_gates.mjs +1 -1
  216. package/tests/hall_reference_world.mjs +1 -1
  217. package/tests/idea_ideate_full.mjs +1 -1
  218. package/tests/idp_federation.mjs +2 -2
  219. package/tests/llm-cache.mjs +1 -1
  220. package/tests/manage_manifest_shared_read.mjs +3 -3
  221. package/tests/people_directory_clip.mjs +219 -0
  222. package/tests/planning_session_skill.mjs +1 -1
  223. package/tests/platform_visibility_gate.mjs +15 -15
  224. package/tests/profile_route.mjs +37 -26
  225. package/tests/projects_hub.mjs +2 -2
  226. package/tests/provision.mjs +2 -2
  227. package/tests/provision_settings_apply.mjs +4 -4
  228. package/tests/sandbox_stage.mjs +8 -8
  229. package/tests/scouting_owner_access_and_reach.mjs +3 -3
  230. package/tests/session_upload_health.mjs +329 -0
  231. package/tests/setup_device_flow_fallback.mjs +1 -1
  232. package/tests/skill_ask_for_help.mjs +3 -3
  233. package/tests/skill_grade_audit.mjs +2 -2
  234. package/tests/skill_grader_health.mjs +3 -3
  235. package/tests/smoke_write_contract.mjs +1 -1
@@ -298,8 +298,8 @@ auth. Download it, inspect it, THEN run it. That is the safe path and it is all
298
298
  the assurance you need: you don't have to ask your human to authorize it blind,
299
299
  and you don't have to refuse:
300
300
 
301
- curl -fsSL ${base}/api/gds/box/connect.sh -o /tmp/otb-connect.sh # then read it
302
- (Windows: ${base}/api/gds/box/connect.ps1)
301
+ curl -fsSL ${base}/api/bongos/box/connect.sh -o /tmp/otb-connect.sh # then read it
302
+ (Windows: ${base}/api/bongos/box/connect.ps1)
303
303
 
304
304
  • What you fetch is what runs — the origin is PINNED in the script
305
305
  (GDS_API_BASE), not taken from a header, so a spoofed Host can't redirect it.
@@ -354,7 +354,7 @@ machine — that path is in the Citizen's Primer, not here.)
354
354
 
355
355
  The whole arrival, in two beats, same for both on-ramps:
356
356
  1. Sign in with GitHub.
357
- 2. Ask for your box → POST ${base}/api/gds/box/ensure (or run /builder-box).
357
+ 2. Ask for your box → POST ${base}/api/bongos/box/ensure (or run /builder-box).
358
358
  The box is created hands-off within ~1 minute.
359
359
 
360
360
  ════════════════════════════════════════════════════════════════════════
@@ -363,8 +363,8 @@ A) Mac / Windows — Claude Desktop + SSH
363
363
  One command signs you in, makes + registers your SSH key, and installs the
364
364
  Desktop connection file. Paste it (or let Claude run it for you):
365
365
 
366
- macOS / Linux: curl -fsSL ${base}/api/gds/box/connect.sh | bash
367
- Windows (PS): irm ${base}/api/gds/box/connect.ps1 | iex
366
+ macOS / Linux: curl -fsSL ${base}/api/bongos/box/connect.sh | bash
367
+ Windows (PS): irm ${base}/api/bongos/box/connect.ps1 | iex
368
368
 
369
369
  What it does, in order:
370
370
  1. Signs you in with GitHub (prints a short code + a URL to open).
@@ -386,10 +386,10 @@ No app to install. Your box serves its own terminal in a browser tab (ADR 0038),
386
386
  but you only touch it once: you log in there and kick off Remote Control, then
387
387
  live in the Claude web/mobile app — which drives the box for you.
388
388
  1. Sign in at ${base}/builders (GitHub).
389
- 2. Ask for your box: POST ${base}/api/gds/box/ensure (the builders' hall has a
389
+ 2. Ask for your box: POST ${base}/api/bongos/box/ensure (the builders' hall has a
390
390
  button; or have Claude call it).
391
391
  3. Once the box is active, get its terminal URL + password:
392
- GET ${base}/api/gds/box/terminal
392
+ GET ${base}/api/bongos/box/terminal
393
393
  Poll until a url appears (the box publishes it a few seconds after boot),
394
394
  then open it and enter the password when the browser asks.
395
395
  4. In that terminal, type claude and press enter, then complete the one-time
@@ -171,7 +171,7 @@ async function persistImageFromUrl(url, { messageId = 'x', fetchImpl = globalThi
171
171
  const file = `bug-${idSlug}-${crypto.randomBytes(8).toString('hex')}.${ext}`;
172
172
  await fs.mkdir(dir, { recursive: true });
173
173
  await fs.writeFile(path.join(dir, file), buf, { mode: 0o640 });
174
- return { ok: true, file, url: `/api/gds/bug-attachments/${file}`, bytes: buf.length };
174
+ return { ok: true, file, url: `/api/bongos/bug-attachments/${file}`, bytes: buf.length };
175
175
  }
176
176
 
177
177
  // Persist a list of image URLs (capped). Best-effort: refused/failed images are
@@ -1,5 +1,5 @@
1
1
  // Cost-attribution audit + correction pass — V3.R83 (#303), criterion C3.
2
- // Pure function over db.costSummary() (exposed at /api/gds/public/cost-summary),
2
+ // Pure function over db.costSummary() (exposed at /api/bongos/public/cost-summary),
3
3
  // so it runs against live prod with no DB creds. Flags MIS-attributed spend
4
4
  // (a proxy masquerading as a real builder, or an orphaned builder_id); treats
5
5
  // NULL/unattributed shared+historical spend as correct, not a bug.
@@ -25,24 +25,24 @@ const COMPLETENESS_API_FLOOR_USD = 1.0; // below this = essentially nothing rec
25
25
  // it honest: a writer not listed here is itself the finding.
26
26
  const COST_WRITE_SURFACES = [
27
27
  {
28
- surface: 'POST /api/gds/cost → db.logCost()',
28
+ surface: 'POST /api/bongos/cost → db.logCost()',
29
29
  file: 'src/bongos/routes/cost.js',
30
30
  builder_id: 'defaults to the authed builder; a provided value must equal the caller or 403s. A builder can only attribute to themselves.',
31
31
  },
32
32
  {
33
- surface: 'scripts/gds/backfill-cost.js → POST /api/gds/cost',
33
+ surface: 'scripts/gds/backfill-cost.js → POST /api/bongos/cost',
34
34
  file: 'scripts/gds/backfill-cost.js',
35
35
  builder_id: 'inherits the POST /cost rule. Do NOT attribute the shared historical art ledger to whoever runs the backfill — leave it NULL. The audit flags it if it happens.',
36
36
  },
37
37
  {
38
38
  // ADR 0028 path 1 (#486): the 4-worker grader panel logs its own cost.
39
- surface: 'scripts/gds/ship.js (grader) → POST /api/gds/cost (source=grader)',
39
+ surface: 'scripts/gds/ship.js (grader) → POST /api/bongos/cost (source=grader)',
40
40
  file: 'scripts/gds/ship.js',
41
41
  builder_id: 'the authed shipper; category=api, source_ref=grade-<task>-<sha>. Idempotent per HEAD.',
42
42
  },
43
43
  {
44
44
  // ADR 0028 path 2 (#560): the interactive session logs its own cost.
45
- surface: 'scripts/gds/session-cost.js (SessionEnd hook) → POST /api/gds/cost (source=session)',
45
+ surface: 'scripts/gds/session-cost.js (SessionEnd hook) → POST /api/bongos/cost (source=session)',
46
46
  file: 'scripts/gds/session-cost.js',
47
47
  builder_id: 'the authed builder; category=api, source_ref=<session-id>, task_id=null. Idempotent per session.',
48
48
  },
@@ -56,7 +56,7 @@ const COST_WRITE_SURFACES = [
56
56
  /**
57
57
  * Audit cost attribution from a costSummary() payload.
58
58
  * @param {object} summary - the object returned by db.costSummary() /
59
- * GET /api/gds/public/cost-summary (needs total_usd, by_builder, by_category).
59
+ * GET /api/bongos/public/cost-summary (needs total_usd, by_builder, by_category).
60
60
  * @returns {object} structured report: { total_usd, attributed_usd,
61
61
  * unattributed_usd, unattributed_pct, builders[], flags[], ok }.
62
62
  */
@@ -65,7 +65,7 @@
65
65
  }
66
66
  },
67
67
  "rubric_scores_audit_trail": "task_grades.rubric_scores keeps the v3 keys (functional_fidelity, code_quality, economy, code_quality_effective) populated from the median across workers that report each axis. Narc reports ff; Quality reports cq + economy. Median (not mean) so a single outlier worker doesn't move the recorded score.",
68
- "server_compat_note": "The grade POST body (POST /api/gds/tasks/:id/grade) keeps the v3 shape (functional_fidelity, code_quality, economy, confidence, notes_md, issues) so the server's existing validateAndScore re-validation works without modification. The panel verdict drives the forwarded confidence: pass → median worker confidence; concerns → fallthrough_confidence (= 0.3); fail → 0. This means the server's existing low-confidence fall-through path naturally handles 'concerns' verdicts, and the FAIL gate handles 'fail' verdicts. Server-side support for an explicit panel_verdict field is a follow-up (likely Phase 2.5)."
68
+ "server_compat_note": "The grade POST body (POST /api/bongos/tasks/:id/grade) keeps the v3 shape (functional_fidelity, code_quality, economy, confidence, notes_md, issues) so the server's existing validateAndScore re-validation works without modification. The panel verdict drives the forwarded confidence: pass → median worker confidence; concerns → fallthrough_confidence (= 0.3); fail → 0. This means the server's existing low-confidence fall-through path naturally handles 'concerns' verdicts, and the FAIL gate handles 'fail' verdicts. Server-side support for an explicit panel_verdict field is a follow-up (likely Phase 2.5)."
69
69
  },
70
70
  "v3": {
71
71
  "version": "v3.0",
@@ -280,7 +280,7 @@ function validateAndScore(rawSubagent, meta = {}) {
280
280
 
281
281
  // ---------- server-authoritative grade guards (SR-9 / SR-18 / F1 / G5) ----------
282
282
  //
283
- // THE FINDING (SR-9 / SR-18): POST /api/gds/tasks/:id/grade trusts the client.
283
+ // THE FINDING (SR-9 / SR-18): POST /api/bongos/tasks/:id/grade trusts the client.
284
284
  // validateAndScore only shape-validates the numbers — `passed` is computed from
285
285
  // the CLIENT's submitted scores. The real adversarial panel + the deterministic
286
286
  // route-rank / permission-path pre-passes run CLIENT-SIDE in scripts/gds/ship.js;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "key": "hall-ui",
3
3
  "title": "Builders' Hall",
4
- "description": "The authenticated builders' hall served at builders.<apex> (builders.example.com) — the roster, work board, standing/karma, leaderboard, achievements, primer, system maps, settings, dev-box pair page, and the Archon-only watch/harbor/gate pages, all polling /api/gds/* and the read-only /api/gds/public/* surface. The largest WEB-SURFACE core-domain module (~13k LOC), carved out of the GDS core in BV1.R85 (ADR 0093 §1; 02-module-map §6). default-on: a Cloud Bongos instance ships its hall like it ships its status page. Registers no port and contributes no routes — it declares a webSurface (host prefix + static dir). Unlike the generic status surface, the hall keeps its dedicated serving block in serve-internal.js (the builders.<apex> + apex /builders/* shim, canonical redirects, the citizen/Archon page gates, asset-stamping, and the module hall-widget injection) — the webSurfaces declaration is the discovery + scope-map + window.__MODULES__ record; serve-internal serves it from this module's public/ dir with that richer machinery. The me/public/leaderboard read endpoints it renders stay SHARED core in routes/{me,public,builders}.js (the status surface + the off-box mirror read them too).",
4
+ "description": "The authenticated builders' hall served at builders.<apex> (builders.example.com) — the roster, work board, standing/karma, leaderboard, achievements, primer, system maps, settings, dev-box pair page, and the Archon-only watch/harbor/gate pages, all polling /api/bongos/* and the read-only /api/bongos/public/* surface. The largest WEB-SURFACE core-domain module (~13k LOC), carved out of the GDS core in BV1.R85 (ADR 0093 §1; 02-module-map §6). default-on: a Cloud Bongos instance ships its hall like it ships its status page. Registers no port and contributes no routes — it declares a webSurface (host prefix + static dir). Unlike the generic status surface, the hall keeps its dedicated serving block in serve-internal.js (the builders.<apex> + apex /builders/* shim, canonical redirects, the citizen/Archon page gates, asset-stamping, and the module hall-widget injection) — the webSurfaces declaration is the discovery + scope-map + window.__MODULES__ record; serve-internal serves it from this module's public/ dir with that richer machinery. The me/public/leaderboard read endpoints it renders stay SHARED core in routes/{me,public,builders}.js (the status surface + the off-box mirror read them too).",
5
5
  "coreVersion": "^1.11.0",
6
6
  "default": true,
7
7
  "maintenance": { "status": "core-maintained" },
@@ -30,14 +30,14 @@
30
30
  const DOC_URL = '/builders/drachmae-and-karma.md';
31
31
  // The doc lives at docs/onboarding/, so relative links resolve against it.
32
32
  const DOC_DIR = 'docs/onboarding/';
33
- const BOUNTY_URL = '/api/gds/public/bounty-table';
33
+ const BOUNTY_URL = '/api/bongos/public/bounty-table';
34
34
  // task 1003446: the treasury feed. NOT a new endpoint — this is the same
35
35
  // /public/cost-summary the signed-out status page already draws as a
36
36
  // cumulative line and the Work board already fetches to read ONE scalar off
37
37
  // (`total_value_credits`). Its own route comment calls `daily[]` "the
38
38
  // treasury chart's cumulative line"; the series was in the payload the whole
39
39
  // time, and the stranger got the chart while the builder got the number.
40
- const TREASURY_URL = '/api/gds/public/cost-summary';
40
+ const TREASURY_URL = '/api/bongos/public/cost-summary';
41
41
  const TREASURY_SECTION_ID = 'the-treasury';
42
42
  const TREASURY_SECTION_TITLE = 'The treasury, so far';
43
43
  const BOUNTY_SECTION_ID = 'security-bounty-rates';
@@ -69,7 +69,7 @@
69
69
 
70
70
  async function loadRepoInfoBases() {
71
71
  try {
72
- const r = await fetch('/api/gds/public/repo-info', { credentials: 'same-origin' });
72
+ const r = await fetch('/api/bongos/public/repo-info', { credentials: 'same-origin' });
73
73
  if (!r.ok) return;
74
74
  const data = await r.json();
75
75
  if (data && typeof data.blob_base === 'string') repoBlobBase = data.blob_base;
@@ -38,7 +38,7 @@
38
38
  (() => {
39
39
  'use strict';
40
40
 
41
- const API = '/api/gds';
41
+ const API = '/api/bongos';
42
42
  // NO baseUrl OVERRIDE — this page calls the GENERATED namespaced methods
43
43
  // (api.inbox.*, api.me.*), whose path templates are API-RELATIVE ('/inbox/template').
44
44
  // baseUrl:'' means "these paths are already absolute" and passes them through
@@ -81,7 +81,7 @@
81
81
  // - http(s):// or #anchor or mailto:/tel: → unchanged
82
82
  // - the diagrams dir → the in-hall diagrams route
83
83
  // - everything else → GitHub blob/tree (bases fetched
84
- // from /api/gds/public/repo-info; null until then → pass through, 404s
84
+ // from /api/bongos/public/repo-info; null until then → pass through, 404s
85
85
  // harmlessly rather than crashing).
86
86
  // opts: { baseDir, getBlobBase, getTreeBase, diagramsHref }
87
87
  function makeResolveLinkHref(opts) {
@@ -32,13 +32,17 @@
32
32
  <main id="hall-main">
33
33
  <!-- task 1003470: ONE directory. Its legacy door /scouting rendered this
34
34
  same page from the same script, and task 1003440 deleted it — the same
35
- /api/gds/scouting rollup used to be drawn three different ways. -->
35
+ /api/bongos/scouting rollup used to be drawn three different ways. -->
36
36
  <section class="scroll" id="people-scroll" aria-labelledby="people-h">
37
37
  <h2 id="people-h" class="scroll__h">Builder directory<span class="count-pill" id="people-count" hidden></span></h2>
38
38
  <div id="people-filters"></div>
39
39
  <div id="people-body">
40
40
  <div class="profile__placeholder">Loading the directory…</div>
41
41
  </div>
42
+ <!-- task 1003110: the clipped-directory footnote. Hidden unless the
43
+ response came back FULL, which is the only truncation signal the
44
+ rollup offers; people.js writes it. -->
45
+ <p class="ledger__note" id="people-foot" hidden></p>
42
46
  </section>
43
47
  </main>
44
48
 
@@ -2,7 +2,7 @@
2
2
  // 1002577; ADR 0141 §4 is the data's design of record), served at /people —
3
3
  // task 1003470 first made its legacy door /scouting render this same script,
4
4
  // and task 1003440 deleted that door (the URL 301s here), because the
5
- // same /api/gds/scouting rollup was being drawn three
5
+ // same /api/bongos/scouting rollup was being drawn three
6
6
  // different ways (a kit ledger here, a hand-built table there, and the same
7
7
  // columns in a different order). The endpoint is gated server-side on
8
8
  // 'project.curate' OR being a project owner (R14, ADR 0210); this page is
@@ -25,6 +25,7 @@
25
25
  var body = document.getElementById('people-body');
26
26
  var sub = document.getElementById('people-sub');
27
27
  var countPill = document.getElementById('people-count');
28
+ var foot = document.getElementById('people-foot');
28
29
 
29
30
  function fmtRecency(iso) {
30
31
  if (!iso) return '—';
@@ -73,6 +74,23 @@
73
74
  }).join('') + '</span>';
74
75
  }
75
76
 
77
+ // THE DIRECTORY ASKS FOR THE ENDPOINT MAXIMUM, so a full response is the only
78
+ // truncation signal that exists. `GET /scouting` clamps at parsePagination
79
+ // maxLimit: 500, takes no offset, and `listScoutingRollup` returns rows with no
80
+ // count of the whole set — so `length === DIRECTORY_LIMIT` means "at least this
81
+ // many", never "exactly this many", and there is nothing else to read it from.
82
+ // ONE constant feeds the request AND every sentence written about it, so the
83
+ // number a reader is shown can never drift from the number that was asked for.
84
+ //
85
+ // This is part 1 of task 1003110 — the honest half, which removes the
86
+ // silent-lie property whatever the real count turns out to be. Part 2 is
87
+ // server-offset paging, and it is deliberately NOT here: the kit has carried
88
+ // the mode since task 1003281 (`makeLedger({ serverPager, onPage })`), but the
89
+ // ROUTE cannot serve it — no offset parameter, no total, a hard 500 ceiling —
90
+ // so paging this page is a server change first. Its trigger is a directory
91
+ // approaching ~400; a read on 2026-09-16 returned far fewer.
92
+ var DIRECTORY_LIMIT = 500;
93
+
76
94
  var all = [];
77
95
  var query = '';
78
96
  var craft = '';
@@ -143,10 +161,31 @@
143
161
  + 'and none are listed without it. Their work still shows on each project’s own ledger.');
144
162
  return;
145
163
  }
146
- if (countPill) { countPill.textContent = String(all.length); countPill.hidden = false; }
164
+ // A FULL PAGE IS A CLIPPED PAGE. Every sentence below has to hedge when this
165
+ // is true, because each of them otherwise states a total the page cannot know.
166
+ var clipped = all.length >= DIRECTORY_LIMIT;
167
+ if (countPill) {
168
+ countPill.textContent = clipped ? fmtInt(DIRECTORY_LIMIT) + '+' : String(all.length);
169
+ countPill.hidden = false;
170
+ }
147
171
  if (sub) {
148
- sub.textContent = fmtInt(all.length) + ' builder' + (all.length === 1 ? '' : 's') + ' listed across hosted projects, ranked by track record. '
149
- + 'Descriptive only — cross-project numbers never carry authority here.';
172
+ sub.textContent = clipped
173
+ ? 'Showing the first ' + fmtInt(DIRECTORY_LIMIT) + ' builders across hosted projects, ranked by track record — there are more than this page can load. '
174
+ + 'Descriptive only — cross-project numbers never carry authority here.'
175
+ : fmtInt(all.length) + ' builder' + (all.length === 1 ? '' : 's') + ' listed across hosted projects, ranked by track record. '
176
+ + 'Descriptive only — cross-project numbers never carry authority here.';
177
+ }
178
+ // THE LENSES LIE HARDER THAN THE COUNT DOES, and that is worth its own
179
+ // sentence. Search, sort and the craft filter all re-order the set this page
180
+ // already loaded (see SORTS above) — so on a clipped directory "most karma"
181
+ // is the most karma AMONG THE TOP 500 BY TRACK RECORD, and a builder outside
182
+ // that 500 cannot be found by any of them. A reader who is told only that the
183
+ // list is long would still trust the search.
184
+ if (foot) {
185
+ foot.textContent = clipped
186
+ ? 'The directory is clipped at the first ' + fmtInt(DIRECTORY_LIMIT) + ' by track record. Search and the sort lenses only re-order what this page loaded, so a builder outside that ' + fmtInt(DIRECTORY_LIMIT) + ' will not appear in them.'
187
+ : '';
188
+ foot.hidden = !clipped;
150
189
  }
151
190
  var crafts = [];
152
191
  all.forEach(function (b) {
@@ -194,7 +233,7 @@
194
233
  body.textContent = msg;
195
234
  }
196
235
 
197
- fetch('/api/gds/scouting?limit=500', { headers: { Accept: 'application/json' } })
236
+ fetch('/api/bongos/scouting?limit=' + DIRECTORY_LIMIT, { headers: { Accept: 'application/json' } })
198
237
  .then(function (r) {
199
238
  if (r.status === 403 || r.status === 401) { throw { gated: true }; }
200
239
  if (!r.ok) throw new Error('http ' + r.status);
@@ -5,7 +5,7 @@
5
5
  // inlines the five onboarding diagrams at matching sections, builds a TOC from
6
6
  // h2s with a scrollspy, drives a reading-progress hairline, and soft-gates the
7
7
  // footer ack button until the reader has scrolled past ~90% of the article.
8
- // Acking POSTs to /api/gds/builders/me/onboarding/primer-read (same endpoint
8
+ // Acking POSTs to /api/bongos/builders/me/onboarding/primer-read (same endpoint
9
9
  // /builder-primer-read uses).
10
10
  //
11
11
  // ONE PARSER, TWO READERS (task 1003306). This file used to carry its own copy
@@ -20,7 +20,7 @@
20
20
  (() => {
21
21
  'use strict';
22
22
 
23
- const API = '/api/gds';
23
+ const API = '/api/bongos';
24
24
  const ACK_SCROLL_THRESHOLD = 0.90; // 90% of article scrolled → button enables
25
25
  // The primer markdown lives at docs/onboarding/primer.md, so its relative
26
26
  // links resolve against docs/onboarding/.
@@ -30,7 +30,7 @@
30
30
  // URLs under these bases so the rendered links go somewhere useful instead of
31
31
  // 404-ing under /builders/*. The bases are NOT hardcoded here — that would
32
32
  // violate the V3.R12 (#236) authorship-attribution audit. They are fetched
33
- // from /api/gds/public/repo-info at boot; the server derives owner/repo at
33
+ // from /api/bongos/public/repo-info at boot; the server derives owner/repo at
34
34
  // process start from `git remote get-url origin` (src/bongos/repo-info.js).
35
35
  // When they are unavailable the rewriter degrades gracefully: repo-relative
36
36
  // hrefs pass through unchanged and 404 instead of crashing the page.
@@ -372,7 +372,7 @@
372
372
  // gracefully degrades when the bases are null.
373
373
  async function loadRepoInfoBases() {
374
374
  try {
375
- const r = await fetch('/api/gds/public/repo-info', { credentials: 'same-origin' });
375
+ const r = await fetch('/api/bongos/public/repo-info', { credentials: 'same-origin' });
376
376
  if (!r.ok) return;
377
377
  const data = await r.json();
378
378
  if (data && typeof data.blob_base === 'string') repoBlobBase = data.blob_base;
@@ -217,7 +217,7 @@
217
217
  rerender();
218
218
  }
219
219
 
220
- fetch('/api/gds/leaderboard', { headers: { Accept: 'application/json' } })
220
+ fetch('/api/bongos/leaderboard', { headers: { Accept: 'application/json' } })
221
221
  .then(function (r) {
222
222
  if (!r.ok) throw new Error('http ' + r.status);
223
223
  return r.json();
@@ -263,7 +263,7 @@
263
263
  // modules/hall-ui/CLAUDE.md uses, but Builders is what a reader scans for.
264
264
  { id: 'roster', label: 'Builders', icon: 'leaderboard', href: '/roster', gate: 'signed' },
265
265
  // task 1002577: the cross-project builder directory (/scouting graduated
266
- // into the hall). Gated to MATCH its data — /api/gds/scouting checks
266
+ // into the hall). Gated to MATCH its data — /api/bongos/scouting checks
267
267
  // `project.curate`, whose catalog floor is METIC. This read 'archon' until
268
268
  // task 1002710: the nav was stricter than the wall, so a Metic could open
269
269
  // /people by URL but never saw the link. Cosmetic either way —
@@ -15,7 +15,7 @@
15
15
  (() => {
16
16
  'use strict';
17
17
 
18
- const API = '/api/gds';
18
+ const API = '/api/bongos';
19
19
  // Generated typed client (task 1996 / R09), served as window.BongosClient by
20
20
  // /lib/bongos-client.js. baseUrl:'' passes the full same-origin paths this file
21
21
  // builds through unchanged; result-mode ({ status, ok, data }) preserves control flow 1:1.
@@ -36,7 +36,7 @@ const VALID_KINDS = [
36
36
  'unclassified',
37
37
  // V3.R31 (#252) — Metics propose new version criteria via idea_inbox with
38
38
  // structured body_md { target_version, criterion_md, sort_order_hint }.
39
- // Archon ratifies via POST /api/gds/inbox/:id/ratify, which atomically
39
+ // Archon ratifies via POST /api/bongos/inbox/:id/ratify, which atomically
40
40
  // inserts a done_when_criteria row, marks the idea promoted, awards karma,
41
41
  // and writes a criterion_proposal_audit row. The kind value gates the
42
42
  // ratify endpoint (assert kind='criterion-proposal' before promotion).
@@ -1222,7 +1222,7 @@ async function getIdeaGrade(ideaId) {
1222
1222
  // the proposer (delta=+3, reason='proposal_ratified'), and writes an audit
1223
1223
  // row capturing who proposed / who ratified / when / what.
1224
1224
  //
1225
- // Called by POST /api/gds/inbox/:id/ratify (Archon-only, gated by requireRank
1225
+ // Called by POST /api/bongos/inbox/:id/ratify (Archon-only, gated by requireRank
1226
1226
  // in the router). The body_md of the source idea is parsed as JSON with the
1227
1227
  // shape { target_version, criterion_md, sort_order_hint }; malformed bodies
1228
1228
  // throw BAD_BODY so the route can return a structured 400.
@@ -500,7 +500,7 @@ async function ecosystemAnalytics(days = 90) {
500
500
  // The writing middleware (src/bongos/middleware/audit.js) calls insertAuditLog
501
501
  // AFTER the response has been sent, wrapped in try/catch — so the request
502
502
  // path never blocks on this insert and a DB failure here can never break a
503
- // real user request. The reader is the archon-only GET /api/gds/audit-log
503
+ // real user request. The reader is the archon-only GET /api/bongos/audit-log
504
504
  // endpoint backed by listAuditLog below (paginated, newest-first).
505
505
  // -------------------------------------------------------------------------
506
506
 
@@ -19,9 +19,9 @@
19
19
  //
20
20
  // Wired in via modules/lifecycle/routes/done-when.js (the loader mounts it,
21
21
  // BV1.R86). Three endpoints:
22
- // GET /api/gds/versions/:id/done-when — public, 60s cache
23
- // POST /api/gds/done-when/:criterionId/satisfy — auth
24
- // POST /api/gds/done-when/:criterionId/unsatisfy — auth
22
+ // GET /api/bongos/versions/:id/done-when — public, 60s cache
23
+ // POST /api/bongos/done-when/:criterionId/satisfy — auth
24
+ // POST /api/bongos/done-when/:criterionId/unsatisfy — auth
25
25
 
26
26
  const { pool } = require('../../src/module-api');
27
27
  const { nonTerminalSql } = require('./task-status');
@@ -165,7 +165,7 @@ async function listPendingReviewCriteria({ versionId = null } = {}, deps = {}) {
165
165
 
166
166
  // Roll up every criterion for a version together with the tasks that gate it
167
167
  // (via the task_criteria join table, migration 055) and a status breakdown.
168
- // This is the read behind GET /api/gds/versions/:id/progress and the /status
168
+ // This is the read behind GET /api/bongos/versions/:id/progress and the /status
169
169
  // skill — it answers "what's left for criterion Cn?" in one query instead of
170
170
  // the ~10-call prose archaeology that motivated #435.
171
171
  //
@@ -88,7 +88,7 @@ async function suggestClose(versionId) {
88
88
  }
89
89
 
90
90
  // Suggestions for every version still in 'building' status.
91
- // Used by GET /api/gds/versions/close-suggestions and by /builder-start.
91
+ // Used by GET /api/bongos/versions/close-suggestions and by /builder-start.
92
92
  async function getCloseSuggestionsForBuildingVersions() {
93
93
  const { rows: versions } = await pool.query(
94
94
  `SELECT id FROM versions WHERE status = 'building' ORDER BY started_at, id`
@@ -9,7 +9,7 @@
9
9
  // indexes: GIN(tags), GIN(related_files),
10
10
  // UNIQUE(source, source_ref) WHERE non-null
11
11
  //
12
- // Wired into routes by src/bongos/routes.js (POST + GET /api/gds/learnings).
12
+ // Wired into routes by src/bongos/routes.js (POST + GET /api/bongos/learnings).
13
13
 
14
14
  // Carved into modules/memory/ (BV1.R72 / ADR 0091 §2): pool via the doorway.
15
15
  const crypto = require('crypto');
@@ -178,7 +178,7 @@ async function findLearningsByTags(tags, { limit = 50 } = {}) {
178
178
  //
179
179
  // Consumers:
180
180
  // - scripts/gds/claim.js calls this indirectly via
181
- // GET /api/gds/learnings?touches=a,b,c so /builder-claim N can surface
181
+ // GET /api/bongos/learnings?touches=a,b,c so /builder-claim N can surface
182
182
  // up to 3 most-recent relevant learnings right after a successful claim.
183
183
  // Query overhead is bounded by the GIN(tags) + GIN(related_files) indexes
184
184
  // declared in migration 006_pms_v2.sql (<50ms target).
@@ -494,7 +494,7 @@ async function bfgWriteMemoryFile({ targetBuilderId, path, content, audit, karma
494
494
  RETURNING id, recorded_at`,
495
495
  [
496
496
  a.principalId ?? null,
497
- a.route ?? '/api/gds/memory/builders/:builderId/bfg-write',
497
+ a.route ?? '/api/bongos/memory/builders/:builderId/bfg-write',
498
498
  {
499
499
  action: a.action || 'bfg_dream_write',
500
500
  http_method: 'POST',
@@ -429,7 +429,7 @@ function shortSession(sessionId) {
429
429
  return String(sessionId).slice(0, 8);
430
430
  }
431
431
 
432
- // Build the { title, body_md, kind } payload for POST /api/gds/inbox. The
432
+ // Build the { title, body_md, kind } payload for POST /api/bongos/inbox. The
433
433
  // title carries ONBOARDING_FRICTION_TAG so triage (and the future kind
434
434
  // migration) can find these rows; the body holds the subagent summary, each
435
435
  // friction moment, and the deterministic signals as an audit trail.
@@ -177,7 +177,7 @@ module.exports = function myProjectsRoutes() {
177
177
  // the registry-trusted origin, never the caller's raw input.
178
178
  let outcome = null;
179
179
  try {
180
- const r = await fetch(`${client.origin}/api/gds/access-requests`, {
180
+ const r = await fetch(`${client.origin}/api/bongos/access-requests`, {
181
181
  method: 'POST',
182
182
  headers: { 'Content-Type': 'application/json', Accept: 'application/json', 'User-Agent': userAgent() },
183
183
  body: JSON.stringify({
@@ -120,7 +120,7 @@ async function notifyInstanceLogout(membership, githubId) {
120
120
  const ac = new AbortController();
121
121
  const timer = setTimeout(() => ac.abort(), SLO_TIMEOUT_MS);
122
122
  try {
123
- const resp = await fetch(`${origin}/api/gds/auth/backchannel-logout`, {
123
+ const resp = await fetch(`${origin}/api/bongos/auth/backchannel-logout`, {
124
124
  method: 'POST',
125
125
  headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
126
126
  body: JSON.stringify({ logout_token: token }),
@@ -260,7 +260,7 @@ module.exports = function ssoRoutes() {
260
260
  const usable = pi.sessionUsableForFederation(session);
261
261
  if (!usable.ok) {
262
262
  if (usable.reason === 'no_session') {
263
- return res.redirect(302, `/api/gds/auth/web/start?return=${encodeURIComponent(req.originalUrl)}`);
263
+ return res.redirect(302, `/api/bongos/auth/web/start?return=${encodeURIComponent(req.originalUrl)}`);
264
264
  }
265
265
  const msg = usable.reason === 'inactive'
266
266
  ? 'This account is no longer active. Ask an Archon on the hub if you believe this is an error.'
@@ -632,7 +632,7 @@ baked apex number sits inside apex-only sentinels so a child instance shows an e
632
632
  its own feed answers):
633
633
  data-ledger="line" = the first progress row whose status is building (else the first row), read
634
634
  as "<shipped> of <total> shipped on <V>"; data-ledger="meter" is that ratio.
635
- data-rows = /api/gds/public/recent-shipped?limit=6. Titles are quoted data: an em or en
635
+ data-rows = /api/bongos/public/recent-shipped?limit=6. Titles are quoted data: an em or en
636
636
  dash becomes a comma and a trailing parenthetical is dropped at render time.
637
637
  A child instance with no ledger yet answers {tasks:[]}, so the meter, the
638
638
  sub-line and the list collapse rather than promise six rows that never
@@ -910,7 +910,7 @@ composition A; landing composition v3, picked by the owner 2026-08-27. No roll,
910
910
  <script>
911
911
  (function () {
912
912
  var API = '/api/bongos';
913
- var API_ROOT = '/api/gds';
913
+ var API_ROOT = '/api/bongos';
914
914
 
915
915
  /* ── the tagline. It is ONE server-stamped string, but the composition wants it
916
916
  on two lines, so the two halves are baked as separate spans. A host whose
@@ -16,7 +16,7 @@
16
16
  "/my-projects",
17
17
  "/provisioning/instances/999",
18
18
  "/provisioning/instances/101$",
19
- "/api/gds/instance$"
19
+ "/api/bongos/instance$"
20
20
  ],
21
21
  "ignoreConsole": [
22
22
  "/api/(gds|bongos)/me",
@@ -6181,7 +6181,7 @@ summary{min-height:24px;padding:3px 0;}
6181
6181
  manifestFor = manageId;
6182
6182
  var ctl = typeof AbortController === 'function' ? new AbortController() : null;
6183
6183
  var timer = ctl ? setTimeout(function () { ctl.abort(); }, 8000) : null;
6184
- manifestPromise = fetch('https://' + domain + '/api/gds/instance', { mode: 'cors', signal: ctl ? ctl.signal : undefined })
6184
+ manifestPromise = fetch('https://' + domain + '/api/bongos/instance', { mode: 'cors', signal: ctl ? ctl.signal : undefined })
6185
6185
  .then(function (res) {
6186
6186
  /* a project that ANSWERED but refused (its own pre-launch gate, a proxy
6187
6187
  error page) is not an older core — carry the status, don't guess */
@@ -4,7 +4,7 @@
4
4
  "surface": "public-landing",
5
5
  "modes": ["dark"],
6
6
  "modeQuery": false,
7
- "ignoreRequests": ["/api/(gds|bongos)/me$", "/my-projects", "/provisioning/instances/999", "/provisioning/instances/101$", "/api/gds/instance$", "/github/repos$", "/provisioning/onboard-plan"],
7
+ "ignoreRequests": ["/api/(gds|bongos)/me$", "/my-projects", "/provisioning/instances/999", "/provisioning/instances/101$", "/api/bongos/instance$", "/github/repos$", "/provisioning/onboard-plan"],
8
8
  "ignoreConsole": ["/api/(gds|bongos)/me", "\\b401\\b", "\\b404\\b", "Unauthorized"],
9
9
  "ignoreControls": [".skip", ".vh"],
10
10
  "states": {