@bongos/core 1.21.176 → 1.21.178

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 (214) hide show
  1. package/.bongos-core.json +186 -496
  2. package/.claude/skills/planning-session/SKILL.md +2 -2
  3. package/clients/bongos-client/README.md +1 -1
  4. package/clients/bongos-client/bongos-client.global.js +0 -6
  5. package/clients/bongos-client/index.cjs +0 -6
  6. package/clients/bongos-client/index.d.ts +0 -6
  7. package/clients/bongos-client/index.mjs +0 -6
  8. package/config/scheduled-routines.json +3 -8
  9. package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +3 -2
  10. package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +1 -1
  11. package/docs/adr/0093-tranche-2-core-carve-sequence.md +1 -1
  12. package/docs/api/openapi.json +1 -87
  13. package/docs/api-reference.md +1 -8
  14. package/docs/canonical-permissions.md +4 -4
  15. package/docs/copy-inventory.md +25 -39
  16. package/docs/copy-registry.json +73 -200
  17. package/docs/file-map.md +6 -11
  18. package/docs/handoff-template.md +1 -1
  19. package/docs/module-api-changelog.md +4 -0
  20. package/docs/modules-contract.md +2 -2
  21. package/docs/onboarding/diagrams/README.md +3 -7
  22. package/docs/onboarding/diagrams/assertions.json +3 -3
  23. package/docs/page-inventory.json +4 -7
  24. package/docs/page-readings.json +1520 -1569
  25. package/docs/recipes/ops-gotchas.md +3 -1
  26. package/modules/autonomy/db.js +9 -0
  27. package/modules/autonomy/module.json +2 -2
  28. package/modules/autonomy/pollers/daily-checks.js +262 -0
  29. package/modules/autonomy/pollers/routine-timers.js +7 -5
  30. package/modules/autonomy/rank-roles.js +64 -0
  31. package/modules/autonomy/server-schedule.js +37 -0
  32. package/modules/government/catalog.js +10 -7
  33. package/modules/government/decision-board.js +0 -1
  34. package/modules/government/decision-rules.js +0 -1
  35. package/modules/government/docket.js +0 -1
  36. package/modules/government/protected-surfaces.js +1 -1
  37. package/modules/government/protected-surfaces.json +2 -3
  38. package/modules/hall-ui/public/atlas.html +1 -1
  39. package/modules/hall-ui/public/blockers.html +1 -1
  40. package/modules/hall-ui/public/board-room.html +1 -1
  41. package/modules/hall-ui/public/city.html +1 -1
  42. package/modules/hall-ui/public/collab.html +1 -1
  43. package/modules/hall-ui/public/commands.html +1 -1
  44. package/modules/hall-ui/public/copy-desk.html +1 -1
  45. package/modules/hall-ui/public/deploy.html +1 -1
  46. package/modules/hall-ui/public/diagrams.html +1 -1
  47. package/modules/hall-ui/public/drachmae.html +1 -1
  48. package/modules/hall-ui/public/fleet.html +1 -1
  49. package/modules/hall-ui/public/gate.css +4 -26
  50. package/modules/hall-ui/public/gate.html +12 -27
  51. package/modules/hall-ui/public/gate.js +26 -176
  52. package/modules/hall-ui/public/gate.states.json +4 -22
  53. package/modules/hall-ui/public/goal-map.html +1 -1
  54. package/modules/hall-ui/public/goals.html +1 -1
  55. package/modules/hall-ui/public/government.html +1 -1
  56. package/modules/hall-ui/public/idea.html +1 -1
  57. package/modules/hall-ui/public/ideas.html +1 -1
  58. package/modules/hall-ui/public/index.html +1 -1
  59. package/modules/hall-ui/public/modules.html +1 -1
  60. package/modules/hall-ui/public/my-agents.html +1 -1
  61. package/modules/hall-ui/public/primer.html +1 -1
  62. package/modules/hall-ui/public/profile.html +1 -1
  63. package/modules/hall-ui/public/project-settings.html +1 -1
  64. package/modules/hall-ui/public/ranks.html +1 -1
  65. package/modules/hall-ui/public/roadmap.html +1 -1
  66. package/modules/hall-ui/public/roster.html +1 -1
  67. package/modules/hall-ui/public/sessions.html +1 -1
  68. package/modules/hall-ui/public/settings.html +1 -1
  69. package/modules/hall-ui/public/shell.js +1 -1
  70. package/modules/hall-ui/public/street-card.js +5 -9
  71. package/modules/hall-ui/public/street-desk.js +2 -2
  72. package/modules/hall-ui/public/street-inside.js +1 -1
  73. package/modules/hall-ui/public/street.html +1 -1
  74. package/modules/hall-ui/public/studio.html +1 -1
  75. package/modules/hall-ui/public/task.html +1 -1
  76. package/modules/hall-ui/public/thinking.html +1 -1
  77. package/modules/hall-ui/public/tweak-editor.html +1 -1
  78. package/modules/hall-ui/public/watch.html +1 -1
  79. package/modules/hall-ui/public/work.html +1 -1
  80. package/modules/lifecycle/matter-acts.js +0 -6
  81. package/modules/lifecycle/module.json +0 -1
  82. package/package-lock.json +2 -2
  83. package/package.json +1 -1
  84. package/release-notes.json +36 -0
  85. package/scripts/bongos/adopt-preflight.js +3 -3
  86. package/scripts/bongos/api-alias-caller-scan.js +2 -2
  87. package/scripts/bongos/audit-authorship.sh +1 -8
  88. package/scripts/bongos/audit-rank-roles.js +15 -56
  89. package/scripts/bongos/bump-version.js +46 -9
  90. package/scripts/bongos/codemod-rename-scripts-gds.js +0 -1
  91. package/scripts/bongos/diagram-facts.js +1 -1
  92. package/scripts/bongos/do-api.js +1 -1
  93. package/scripts/bongos/doc-cli-guard.js +2 -0
  94. package/scripts/bongos/doc-control-claims.js +2 -2
  95. package/scripts/bongos/fitness-checks-identity.js +4 -15
  96. package/scripts/bongos/gen-diagrams.js +3 -3
  97. package/scripts/bongos/government-walk.js +3 -9
  98. package/scripts/bongos/hard-floor.js +52 -0
  99. package/scripts/bongos/publish-manifest.js +3 -3
  100. package/scripts/bongos/pulse.js +5 -3
  101. package/scripts/bongos/routine-schedule.js +38 -3
  102. package/scripts/bongos/run-unit-tests.js +17 -5
  103. package/scripts/bongos/ship-regen.js +2 -3
  104. package/scripts/gds/{goal-names.js → hard-floor.js} +3 -4
  105. package/scripts/security/dep-audit.js +50 -124
  106. package/src/bongos/module-scope-map.js +2 -2
  107. package/src/bongos/permission-path-check.js +1 -1
  108. package/src/bongos/route-rank-check.js +1 -8
  109. package/src/bongos/routes.js +1 -2
  110. package/src/module-api.js +1 -1
  111. package/src/modules.js +1 -1
  112. package/tests/acclaim_feed_evidence_db.mjs +42 -23
  113. package/tests/adr_0089_scope.mjs +7 -5
  114. package/tests/autonomy_daily_checks.mjs +201 -0
  115. package/tests/bump_version.mjs +52 -18
  116. package/tests/claude_materialize.mjs +12 -12
  117. package/tests/copy_desk_flags_db.mjs +22 -14
  118. package/tests/effective_visibility_predicate.mjs +0 -18
  119. package/tests/gating_review_retired.mjs +1 -1
  120. package/tests/government_act_alone_buildings.mjs +1 -3
  121. package/tests/government_board_membership_db.mjs +35 -22
  122. package/tests/government_protected_surfaces.mjs +29 -13
  123. package/tests/governor_docket.mjs +0 -2
  124. package/tests/governor_matter_acts.mjs +6 -8
  125. package/tests/hall_city.mjs +1 -1
  126. package/tests/hall_matter_card.mjs +2 -2
  127. package/tests/hall_oversight_world.mjs +16 -12
  128. package/tests/hall_street_desk.mjs +4 -3
  129. package/tests/hall_street_inside.mjs +1 -1
  130. package/tests/helpers.mjs +34 -0
  131. package/tests/howto_state.mjs +33 -56
  132. package/tests/howto_state_db.mjs +68 -0
  133. package/tests/idea_credit_streams_db.mjs +11 -3
  134. package/tests/integration_parked_ratchet.mjs +7 -1
  135. package/tests/nav_permission_atoms.mjs +1 -1
  136. package/tests/page_notes_db.mjs +12 -8
  137. package/tests/page_tweak_no_rearm.mjs +50 -0
  138. package/tests/publish_manifest.mjs +64 -0
  139. package/tests/routine_capture_kind.mjs +18 -7
  140. package/tests/routine_schedule.mjs +42 -0
  141. package/tests/search_isolation.mjs +5 -103
  142. package/tests/search_isolation_db.mjs +140 -0
  143. package/tests/session_earnings_mirror_db.mjs +2 -0
  144. package/tests/workflow_exec_paths.mjs +9 -11
  145. package/modules/lifecycle/routes/gate-approvals.js +0 -299
  146. package/scripts/bongos/artifact-staleness.js +0 -267
  147. package/scripts/bongos/ci-grade.js +0 -82
  148. package/scripts/bongos/classify-discipline.js +0 -153
  149. package/scripts/bongos/codemod-rename-src-gds.js +0 -145
  150. package/scripts/bongos/coreB-carve-proof.sh +0 -725
  151. package/scripts/bongos/gate-review.js +0 -330
  152. package/scripts/bongos/goal-names.js +0 -102
  153. package/scripts/bongos/rename-goals.js +0 -109
  154. package/scripts/bongos/seed-adopt-tasks.js +0 -75
  155. package/scripts/bongos/seed-api-contract-goal-tasks.js +0 -141
  156. package/scripts/bongos/seed-board-room-tasks.js +0 -196
  157. package/scripts/bongos/seed-bongos-app-tasks.js +0 -294
  158. package/scripts/bongos/seed-bongos-coreB-tranche1-tasks.js +0 -81
  159. package/scripts/bongos/seed-bongos-coreB-tranche2-tasks.js +0 -100
  160. package/scripts/bongos/seed-bongos-goal-hierarchy-tasks.js +0 -307
  161. package/scripts/bongos/seed-bongos-module-system-tasks.js +0 -346
  162. package/scripts/bongos/seed-bongos-tasks.js +0 -214
  163. package/scripts/bongos/seed-bongos-v1-seo-tasks.js +0 -104
  164. package/scripts/bongos/seed-bv1-community-tasks.js +0 -131
  165. package/scripts/bongos/seed-bv1-privacy-invites-tasks.js +0 -133
  166. package/scripts/bongos/seed-bv1-profile-page-tasks.js +0 -161
  167. package/scripts/bongos/seed-bv1-r01-delta-tasks.js +0 -154
  168. package/scripts/bongos/seed-bv2-tweak-mode-tasks.js +0 -277
  169. package/scripts/bongos/seed-gds-v4-tasks.js +0 -624
  170. package/scripts/bongos/seed-governance-tasks.js +0 -340
  171. package/scripts/bongos/seed-medusa-tasks.js +0 -440
  172. package/scripts/bongos/seed-module-upstreaming.js +0 -219
  173. package/scripts/bongos/seed-productization-tasks.js +0 -235
  174. package/scripts/bongos/seed-project-admin-console-tasks.js +0 -88
  175. package/scripts/bongos/seed-provisioning-tasks.js +0 -83
  176. package/scripts/bongos/seed-strict-versioning-tasks.js +0 -275
  177. package/scripts/bongos/seed-v2-world-tasks.js +0 -283
  178. package/scripts/gds/artifact-staleness.js +0 -7
  179. package/scripts/gds/ci-grade.js +0 -7
  180. package/scripts/gds/classify-discipline.js +0 -7
  181. package/scripts/gds/codemod-rename-src-gds.js +0 -7
  182. package/scripts/gds/coreB-carve-proof.sh +0 -8
  183. package/scripts/gds/gate-review.js +0 -7
  184. package/scripts/gds/rename-goals.js +0 -7
  185. package/scripts/gds/seed-adopt-tasks.js +0 -7
  186. package/scripts/gds/seed-api-contract-goal-tasks.js +0 -7
  187. package/scripts/gds/seed-board-room-tasks.js +0 -6
  188. package/scripts/gds/seed-bongos-app-tasks.js +0 -7
  189. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +0 -7
  190. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +0 -7
  191. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +0 -7
  192. package/scripts/gds/seed-bongos-module-system-tasks.js +0 -7
  193. package/scripts/gds/seed-bongos-tasks.js +0 -7
  194. package/scripts/gds/seed-bongos-v1-seo-tasks.js +0 -6
  195. package/scripts/gds/seed-bv1-community-tasks.js +0 -6
  196. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +0 -6
  197. package/scripts/gds/seed-bv1-profile-page-tasks.js +0 -6
  198. package/scripts/gds/seed-bv1-r01-delta-tasks.js +0 -6
  199. package/scripts/gds/seed-bv2-tweak-mode-tasks.js +0 -6
  200. package/scripts/gds/seed-gds-v4-tasks.js +0 -7
  201. package/scripts/gds/seed-governance-tasks.js +0 -7
  202. package/scripts/gds/seed-medusa-tasks.js +0 -7
  203. package/scripts/gds/seed-module-upstreaming.js +0 -7
  204. package/scripts/gds/seed-productization-tasks.js +0 -7
  205. package/scripts/gds/seed-project-admin-console-tasks.js +0 -6
  206. package/scripts/gds/seed-provisioning-tasks.js +0 -7
  207. package/scripts/gds/seed-strict-versioning-tasks.js +0 -7
  208. package/scripts/gds/seed-v2-world-tasks.js +0 -7
  209. package/scripts/migrate_cost_ledger.sh +0 -178
  210. package/tests/artifact_staleness.mjs +0 -207
  211. package/tests/gate_approvals.mjs +0 -611
  212. package/tests/gate_review.mjs +0 -152
  213. package/tests/goal_names.mjs +0 -120
  214. package/tests/newcomer_generator.mjs +0 -48
@@ -179,7 +179,7 @@
179
179
 
180
180
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
181
181
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
182
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
182
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
183
183
  <script src="/builders/palette.js" defer></script>
184
184
  <script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
185
185
  <script src="/builders/hall-kit.js"></script>
@@ -78,7 +78,7 @@
78
78
 
79
79
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
80
80
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
81
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
81
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
82
82
  <script src="/builders/palette.js" defer></script>
83
83
  <script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
84
84
  <script src="/builders/hall-kit.js"></script>
@@ -96,7 +96,7 @@
96
96
  time so the chrome exists before the deferred page scripts execute. -->
97
97
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
98
98
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
99
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
99
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
100
100
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
101
101
  <script src="/builders/palette.js" defer></script>
102
102
  <script src="/builders/diagram-viewer.js?v=2026-06-14-diagviewer-1" defer></script>
@@ -96,7 +96,7 @@
96
96
 
97
97
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
98
98
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
99
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
99
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
100
100
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
101
101
  <script src="/builders/palette.js" defer></script>
102
102
  <script src="/builders/md-reader.js?v=2026-09-02-mdreader-2"></script>
@@ -57,7 +57,7 @@
57
57
 
58
58
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
59
59
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
60
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
60
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
61
61
  <script src="/builders/palette.js" defer></script>
62
62
  <script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
63
63
  <script src="/builders/hall-kit.js"></script>
@@ -1,30 +1,8 @@
1
- /* gate.css — Page-local styles for the Gate (task 1003469 rebuild).
2
- One panel of oversight rows, one held pull request per row, over the shell's
3
- glass summary strip; everything structural is oversight.css. What is the
4
- gate's own: the hold reasons (a hard floor reads in the danger ink), and the
5
- changed-file run. The ?v= cache-bust is stamped from this file's content hash
6
- at boot (src/asset-version.js). */
1
+ /* gate.css — Page-local styles for the Autobongos panel, still served at /gate
2
+ (task 1004859 removed the held-PR list that used to share this page). The ?v=
3
+ cache-bust is stamped from this file's content hash at boot (src/asset-version.js). */
7
4
 
8
- /* A hold reason: the path in the machine's face, the reason beside it. A hard
9
- floor is the danger ink on the path and a name on the line, never a flag glyph. */
10
- .gate-reason .ov-key { max-width: 40%; }
11
- .gate-reason--floor .ov-key { color: var(--danger); }
12
- .gate-reason__floor { font-family: var(--label-face); font-size: 10.5px; letter-spacing: var(--label-space); text-transform: var(--label-case); color: var(--danger); white-space: nowrap; }
13
-
14
- /* The changed files: one chip per path, wrapping, the overflow named as a count. */
15
- .gate-files { display: flex; flex-wrap: wrap; gap: 6px 8px; margin: 12px 0 0; }
16
- .gate-files .fact-chip { text-transform: none; letter-spacing: normal; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
17
- .gate-files__more { align-self: center; font-size: 12px; color: var(--ink-faint); }
18
-
19
- /* On a phone the path takes the line with its floor label at the right, and the
20
- reason drops under it in full width. */
21
- @media (max-width: 640px) {
22
- .gate-reason .ov-key { max-width: none; }
23
- .gate-reason > span:nth-of-type(2) { flex: 1 1 100%; order: 3; }
24
- .gate-reason__floor { margin-left: auto; }
25
- }
26
-
27
- /* The Autobongos runner panel (task 1004509): a status line with the switch,
5
+ /* The runner panel (task 1004509): a status line with the switch,
28
6
  a checklist only while something is missing, goals as chips, and the
29
7
  machine facts folded under Details. */
30
8
  .rn-head { display: flex; align-items: center; gap: 12px; }
@@ -3,17 +3,16 @@
3
3
  <head>
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>Gate — {{worldName}}</title>
7
- <meta name="description" content="Archon approvals — pull requests touching protected build surfaces, held until an owner approves. Approve a held change with one click.">
6
+ <title>Autobongos — {{worldName}}</title>
7
+ <meta name="description" content="The Autobongos runner: switch unattended building on or off, choose the goals it may work, and pause any builder's runner.">
8
8
  <link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
11
  <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
12
12
  <link rel="stylesheet" href="/builders/oversight.css">
13
- <link rel="stylesheet" href="/builders/hall-ask.css">
14
13
  <link rel="stylesheet" href="/builders/gate.css">
15
14
  </head>
16
- <body data-page="gate" data-page-title="Gate">
15
+ <body data-page="gate" data-page-title="Autobongos">
17
16
 
18
17
  <div class="app">
19
18
  <aside class="app-sidebar" id="app-sidebar" aria-label="Primary"></aside>
@@ -24,7 +23,7 @@
24
23
  <!-- The page's one h1, for screen readers: no page shows its head (task
25
24
  1004836), so its sub-line went in task 1004829. -->
26
25
  <div class="page-head page-head--board">
27
- <h1 class="page-head__h">Gate</h1>
26
+ <h1 class="page-head__h">Autobongos</h1>
28
27
  </div>
29
28
 
30
29
  <main id="hall-main">
@@ -37,17 +36,12 @@
37
36
  </section>
38
37
 
39
38
  <section id="gate-body" hidden>
40
- <!-- The glass summary strip (the shell's .stat-row), then ONE panel of
41
- oversight rows, one held pull request each — the bordered crate
42
- with a verdict band along its top is gone (task 1003469). -->
43
- <div class="stat-row ov-summary" id="gate-summary" aria-label="Held changes summary"></div>
44
-
45
- <!-- The Autobongos fence (task 1003908, ADR 0307 §6). It lives on THIS
46
- page because the Gate is already the owner's protected-surface
47
- surface, and because the switch and the held PRs answer the same
48
- question from two ends: what is allowed to reach main unattended.
49
- Archon-only — the panel stays hidden for a Metic, and the routes
50
- behind it are system:true/archon server-side regardless. -->
39
+ <!-- The Autobongos fence (task 1003908, ADR 0307 §6): what is allowed to
40
+ reach main unattended. This page held the held-PR list too until task
41
+ 1004859 removed it; the URL stays /gate so bookmarks keep working.
42
+ Archon-only — a Metic gets the note below instead, and the routes
43
+ behind the panel are system:true/archon server-side regardless. -->
44
+ <p class="scroll__lede" id="gate-archon-only" hidden></p>
51
45
  <section class="scroll" id="fence-panel" aria-labelledby="fence-h" hidden>
52
46
  <h2 class="scroll__h" id="fence-h">Autobongos runner</h2>
53
47
  <!-- One panel (task 1004509): a checklist while anything the runner
@@ -58,13 +52,6 @@
58
52
  work, whether you paused it, and whether it is checking in. -->
59
53
  <div id="fence-builders"></div>
60
54
  </section>
61
-
62
- <section class="scroll" aria-labelledby="gate-list-h">
63
- <h2 class="scroll__h" id="gate-list-h">Held pull requests</h2>
64
- <p class="scroll__lede">Each one touched a protected surface and stopped at the gate check.</p>
65
- <div id="gate-list"><span class="kit-skel"></span></div>
66
- <p class="ov-foot" id="gate-checking" hidden></p>
67
- </section>
68
55
  </section>
69
56
  </main>
70
57
 
@@ -77,13 +64,11 @@
77
64
 
78
65
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
79
66
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
80
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
67
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
81
68
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
82
69
  <script src="/builders/palette.js" defer></script>
83
70
  <script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
84
71
  <script src="/builders/hall-kit.js"></script>
85
- <!-- the shared ask card a held PR is drawn with (task 1004829) -->
86
- <script src="/builders/hall-ask.js"></script>
87
- <script src="/builders/gate.js?v=2026-10-01-runner-checklist"></script>
72
+ <script src="/builders/gate.js?v=2026-10-25-autobongos"></script>
88
73
  </body>
89
74
  </html>
@@ -1,18 +1,15 @@
1
- // public-builders/gate.js — The Gate (/builders/gate).
1
+ // public-builders/gate.js — Autobongos, the owner's runner panel (/builders/gate).
2
2
  //
3
- // The approval view for gate-surface PRs (task 1179, ADR 0058 amendment).
4
- // A pull request that touches the build's protected machinery is held by the
5
- // gate-review CI check until the owner approves. This page lists every such PR
6
- // as one oversight row (task 1003469) with WHY it was stopped (the same
7
- // classifier the CI runs). Approving records the owner's seal (a server-set
8
- // gate-owner-approved status) and re-runs the check so the PR merges. It is the
9
- // page's one real decision, so a held PR is the hall's ask card (task 1004829) —
10
- // drawn only for a viewer the approve route would let through.
3
+ // The page is still served at /gate so bookmarks keep working, but it no longer
4
+ // holds pull requests: task 1004859 removed the held-PR list (and GET/POST
5
+ // /gate-approvals behind it), because the gate-review CI check it waited on never
6
+ // ran. The owner chose to keep the page for what else it held — the Autobongos
7
+ // fence: the switch, the allowed goals, the priority, each builder's runner.
11
8
  //
12
- // Like The Watch, this reads /api/bongos/me to show a Sealed notice for
13
- // non-Archons — DEFENCE IN DEPTH only. GET /gate-approvals + POST
14
- // /gate-approvals/:pr/approve are ALSO archon-gated server-side (ADR 0016), and
15
- // the page itself is gated by server.js requireGovernmentPage. On 401 → web sign-in.
9
+ // Like The Watch, this reads /api/bongos/me to show a Sealed notice for a viewer
10
+ // the panel is not for — DEFENCE IN DEPTH only. Every route behind the panel is
11
+ // gated server-side (ADR 0016), and the page itself is gated by
12
+ // requireGovernmentPage. On 401 → web sign-in.
16
13
 
17
14
  (() => {
18
15
  'use strict';
@@ -22,7 +19,7 @@
22
19
  // /lib/bongos-client.js. baseUrl:'' passes the full `${API}${path}` URLs below
23
20
  // through unchanged; result-mode ({ status, ok, data }) preserves control flow 1:1.
24
21
  const api = window.BongosClient.createClient({ baseUrl: '', credentials: 'same-origin', throwOnError: false });
25
- const { escapeHtml, fmtInt } = window.OTB;
22
+ const { escapeHtml } = window.OTB;
26
23
  const { emptyStateHtml } = window.OTBKit;
27
24
  const rankLabel = (rank) => window.OTB.rankLabel(rank, { empty: '' });
28
25
  const toast = (msg) => window.OTB.toast(msg);
@@ -60,157 +57,6 @@
60
57
  return `${path} → ${status}`;
61
58
  }
62
59
 
63
- // ---- formatters ----------------------------------------------------------
64
-
65
- const shortSha = (s) => (typeof s === 'string' ? s.slice(0, 7) : '');
66
- const VERDICT_LABEL = { escalate: 'Hard floor', needs_trust: 'Needs trust', pass: 'Clear' };
67
- const verdictLabel = (v) => VERDICT_LABEL[v] || (v || 'held');
68
- // How many files a row shows before it names the rest as a count.
69
- const FILES_SHOWN = 12;
70
-
71
- // ---- actions -------------------------------------------------------------
72
-
73
- // The card IS the confirmation (task 1004829): its question names the PR and
74
- // its answer's result line says what approving does, so the old modal that
75
- // repeated both is gone. A failed press gives the chip back.
76
- async function approve(pr, btn) {
77
- if (btn) btn.disabled = true;
78
- try {
79
- const r = await sendJson('POST', `/gate-approvals/${pr.number}/approve`, {});
80
- toast(r.message || 'Approval recorded.');
81
- load();
82
- } catch (err) {
83
- if (err && err.kind === '401') return;
84
- if (btn) btn.disabled = false;
85
- toast(`Could not approve: ${err.message || err}`);
86
- }
87
- }
88
-
89
- // ---- render --------------------------------------------------------------
90
-
91
- // One held PR, one oversight row (oversight.css .ov-row). This is the page
92
- // that shows the most facts in the hall — title, verdict, trust, task, PR,
93
- // author, sha, diff, every hold reason and the changed files — and every one
94
- // of them survives the rebuild: the verdict is a state pill instead of a band,
95
- // the reasons are hairline detail lines, the files are chips.
96
- function renderRow(pr, mayApprove) {
97
- const floor = pr.verdict !== 'needs_trust';
98
- const reasons = (pr.reasons || []).map((r) =>
99
- `<li class="gate-reason${r.hard_floor ? ' gate-reason--floor' : ''}">` +
100
- `<span class="ov-key">${escapeHtml(r.path)}</span>` +
101
- `<span>${escapeHtml(r.reason)}</span>` +
102
- (r.hard_floor ? '<span class="gate-reason__floor">hard floor</span>' : '') +
103
- '</li>').join('')
104
- || '<li><span>Held by the gate check.</span></li>';
105
-
106
- const files = pr.files || [];
107
- const chips = files.slice(0, FILES_SHOWN).map((f) =>
108
- `<span class="fact-chip" title="${escapeHtml(f.path)}">${escapeHtml(f.path)}</span>`).join('');
109
- const more = files.length > FILES_SHOWN ? `<span class="gate-files__more">+${files.length - FILES_SHOWN} more</span>` : '';
110
- const filesHtml = files.length
111
- ? `<div class="gate-files" aria-label="Changed files"><span class="ov-fact">${fmtInt(files.length)} file${files.length === 1 ? '' : 's'}</span>${chips}${more}</div>`
112
- : '';
113
-
114
- const facts = [
115
- `<span class="fact-pill fact-pill--${floor ? 'danger' : 'warn'}">${escapeHtml(verdictLabel(pr.verdict))}</span>`,
116
- pr.author_trusted ? '<span class="fact-pill fact-pill--info">author trusted</span>' : '',
117
- pr.task ? `<span class="ov-fact"><a href="/#/task/${encodeURIComponent(pr.task)}">task ${escapeHtml(String(pr.task))}</a></span>` : '',
118
- `<span class="ov-fact">by <b>${escapeHtml(pr.author || 'unknown')}</b></span>`,
119
- `<span class="ov-mono">${escapeHtml(shortSha(pr.head_sha))}</span>`,
120
- `<span class="ov-fact"><a href="${escapeHtml(pr.url)}/files" target="_blank" rel="noopener">view diff</a></span>`,
121
- ].filter(Boolean).join('');
122
-
123
- const title = `<a class="ov-row__title" href="${escapeHtml(pr.url)}" target="_blank" rel="noopener">${escapeHtml(pr.title || `PR #${pr.number}`)}<span class="ov-mono">#${escapeHtml(String(pr.number))}</span></a>`;
124
- const detail = `<div class="ov-row__facts">${facts}</div>
125
- <ul class="ov-lines">${reasons}</ul>
126
- ${filesHtml}`;
127
-
128
- // The decision, as the ask card — only where the server said this viewer's
129
- // approval would be let through (`viewer_may_approve`: the approve route's
130
- // permission AND the release building's act-alone rule). Everyone else reads
131
- // the same facts as a plain row.
132
- if (mayApprove && !pr.already_approved && window.OTBAsk) {
133
- const holder = document.createElement('ul');
134
- holder.innerHTML = window.OTBAsk.html({
135
- q: `Let PR #${pr.number} through?`,
136
- saidHtml: title + detail,
137
- row: true,
138
- opts: [{
139
- label: 'Approve',
140
- result: `Clears the hold on ${shortSha(pr.head_sha)}; it merges once the check passes`,
141
- rec: true,
142
- attrs: { 'data-act': 'approve' },
143
- }],
144
- });
145
- const card = holder.firstElementChild;
146
- const btn = card.querySelector('[data-act=approve]');
147
- if (btn) btn.addEventListener('click', () => approve(pr, btn));
148
- return card;
149
- }
150
-
151
- const action = pr.already_approved
152
- ? '<span class="ov-fact ov-ok">Approved. Re-check pending.</span>'
153
- : '<span class="ov-fact">Waiting for approval</span>';
154
-
155
- const el = document.createElement('li');
156
- el.className = 'ov-row';
157
- el.innerHTML =
158
- `<div class="ov-row__main">
159
- ${title}
160
- ${detail}
161
- </div>
162
- <div class="ov-row__right">${action}</div>`;
163
- return el;
164
- }
165
-
166
- // The glass strip above the panel: the shell's .stat-row, each tile a figure
167
- // with the one clause that makes it a fact rather than a number.
168
- function renderSummary(awaiting) {
169
- const floors = awaiting.filter((p) => p.verdict === 'escalate').length;
170
- const trust = awaiting.filter((p) => p.verdict === 'needs_trust').length;
171
- const tiles = [
172
- ['Held', fmtInt(awaiting.length), 'at the gate check'],
173
- ['Hard floor', fmtInt(floors), 'only an owner may clear'],
174
- ['Needs trust', fmtInt(trust), 'an author not yet trusted'],
175
- ];
176
- document.getElementById('gate-summary').innerHTML = tiles.map(([label, num, sub]) =>
177
- `<div class="stat-tile"><span class="stat-tile__label">${escapeHtml(label)}</span><span class="stat-tile__num">${num}</span><span class="stat-tile__sub">${escapeHtml(sub)}</span></div>`).join('');
178
- }
179
-
180
- async function load() {
181
- const list = document.getElementById('gate-list');
182
- const checkingEl = document.getElementById('gate-checking');
183
- let resp;
184
- try {
185
- resp = await fetchJson('/gate-approvals');
186
- } catch (err) {
187
- if (err && err.kind === '401') return;
188
- if (err && err.kind === '403') { showSealed(); return; }
189
- list.innerHTML = emptyStateHtml('Could not load held pull requests just now.');
190
- return;
191
- }
192
-
193
- const awaiting = resp.awaiting || [];
194
- renderSummary(awaiting);
195
-
196
- if (awaiting.length === 0) {
197
- list.innerHTML = emptyStateHtml('Nothing is held.');
198
- } else {
199
- list.innerHTML = '';
200
- const rows = document.createElement('ul');
201
- rows.className = 'ov-rows';
202
- for (const pr of awaiting) rows.appendChild(renderRow(pr, resp.viewer_may_approve === true));
203
- list.appendChild(rows);
204
- }
205
-
206
- if (resp.checking > 0) {
207
- checkingEl.hidden = false;
208
- checkingEl.textContent = `${resp.checking} more PR${resp.checking === 1 ? ' is' : 's are'} still being checked.`;
209
- } else {
210
- checkingEl.hidden = true;
211
- }
212
- }
213
-
214
60
  function showSealed() {
215
61
  document.getElementById('gate-sealed').hidden = false;
216
62
  document.getElementById('gate-body').hidden = true;
@@ -219,12 +65,18 @@
219
65
  if (body) body.textContent = `Available from the ${rankLabel('metic')} rank up.`;
220
66
  }
221
67
 
68
+ // A Metic is admitted to the page (page.view.government) but the runner controls
69
+ // are the Archon's (autonomy.fence.manage). Say so rather than draw an empty page.
70
+ function showArchonOnly() {
71
+ const note = document.getElementById('gate-archon-only');
72
+ note.hidden = false;
73
+ note.textContent = `The Autobongos controls are for the ${rankLabel('archon')}.`;
74
+ }
75
+
222
76
  // ---- the Autobongos fence (task 1003908, ADR 0307 §6) --------------------
223
77
  //
224
- // The kill switch and the goal allowlist for the unattended runner. On this page
225
- // because the Gate is already where the owner decides what reaches main without
226
- // a person in the loop; the held-PR list and this panel are the same question
227
- // from two ends.
78
+ // The kill switch and the goal allowlist for the unattended runner — what may
79
+ // reach main without a person in the loop.
228
80
  //
229
81
  // ARCHON ONLY, and the panel simply is not rendered for anyone else. That is
230
82
  // cosmetic: POST /autonomy/fence and the two allowlist routes carry
@@ -585,19 +437,17 @@
585
437
  me = null;
586
438
  }
587
439
  const rank = (me && (me.builder || me).rank || '').toLowerCase();
588
- // ADR 0157: the Gate page sits at the `page.view.government` floor (metic). The
440
+ // ADR 0157: this page sits at the `page.view.government` floor (metic). The
589
441
  // server's requireGovernmentPage is the wall — this only decides whether to render the
590
442
  // body or the sealed notice, so it must agree or a Metic sees "sealed" on a page
591
443
  // they were just admitted to.
592
444
  if (rank !== 'metic' && rank !== 'archon') { showSealed(); return; }
593
445
 
594
446
  document.getElementById('gate-body').hidden = false;
595
- if (rank === 'archon') {
596
- document.getElementById('fence-panel').hidden = false;
597
- // Independent reads, so one round trip rather than three.
598
- await Promise.all([loadRunners(), loadFence(), loadBuilderRunners()]);
599
- }
600
- await load();
447
+ if (rank !== 'archon') { showArchonOnly(); return; }
448
+ document.getElementById('fence-panel').hidden = false;
449
+ // Independent reads, so one round trip rather than three.
450
+ await Promise.all([loadRunners(), loadFence(), loadBuilderRunners()]);
601
451
  }
602
452
 
603
453
  init();
@@ -1,5 +1,5 @@
1
1
  {
2
- "_": "Gate — the access-request queue behind requireGovernmentPage. Its confirm modal once had a second user, and the two had guessed two different z-indexes for it. Written with the re-skin (task 1003307) so this page is MEASURED at three widths in both modes rather than looked at once.",
2
+ "_": "Autobongos — the owner's runner panel behind requireGovernmentPage, still served at /gate (task 1004859 removed the held-PR list). Measured at three widths in both modes rather than looked at once.",
3
3
  "page": "/builders/gate",
4
4
  "surface": "hall-ui",
5
5
  "stub": {
@@ -13,9 +13,9 @@
13
13
  "/api/(gds|bongos)/goals",
14
14
  "/api/(gds|bongos)/inbox/",
15
15
  "/api/(gds|bongos)/versions",
16
- "/api/(gds|bongos)/gate-approvals",
17
16
  "/api/(gds|bongos)/builders",
18
- "/api/(gds|bongos)/access-requests"
17
+ "/api/(gds|bongos)/access-requests",
18
+ "/api/(gds|bongos)/autonomy/"
19
19
  ],
20
20
  "ignoreConsole": [
21
21
  "/api/(gds|bongos)/",
@@ -46,23 +46,6 @@
46
46
  },
47
47
  "out": {
48
48
  "auth": false
49
- },
50
- "approve": {
51
- "auth": true,
52
- "actions": [
53
- [
54
- "wait",
55
- 700
56
- ],
57
- [
58
- "clickIfVisible",
59
- "[data-act=approve]"
60
- ],
61
- [
62
- "wait",
63
- 250
64
- ]
65
- ]
66
49
  }
67
50
  },
68
51
  "reducedMotion": {
@@ -73,6 +56,5 @@
73
56
  600
74
57
  ]
75
58
  ]
76
- },
77
- "_states": "task 1003469: `approve` opens the confirm modal on the first held PR. clickIfVisible, because the kit's own stub carries no /gate-approvals fixture and renders the empty list — the modal is measured against the harness."
59
+ }
78
60
  }
@@ -139,7 +139,7 @@
139
139
 
140
140
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
141
141
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
142
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
142
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
143
143
  <script src="/builders/palette.js" defer></script>
144
144
 
145
145
  <script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
@@ -236,7 +236,7 @@
236
236
 
237
237
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
238
238
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
239
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
239
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
240
240
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
241
241
  <script src="/builders/palette.js" defer></script>
242
242
  <script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
@@ -134,7 +134,7 @@
134
134
 
135
135
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
136
136
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
137
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
137
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
138
138
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
139
139
  <script src="/builders/palette.js" defer></script>
140
140
  <script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
@@ -52,7 +52,7 @@
52
52
 
53
53
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
54
54
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
55
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
55
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
56
56
  <script src="/builders/palette.js" defer></script>
57
57
  <script src="/builders/dom-utils.js?v=2026-06-23-contrib" defer></script>
58
58
  <!-- task-detail.js still owns the #/idea/N and #/blocker/N overlay, so a ref
@@ -227,7 +227,7 @@
227
227
 
228
228
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
229
229
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
230
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
230
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
231
231
  <script src="/builders/palette.js" defer></script>
232
232
  <script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
233
233
  <!-- task 1004727: the ONE karma vote control every task/idea list renders -->
@@ -119,7 +119,7 @@
119
119
  <script src="/builders/welcome-boot.js?v=2026-10-23-city1" defer></script>
120
120
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab" defer></script>
121
121
  <script src="/builders/craft-mode.js?v=2026-10-09-living3" defer></script>
122
- <script src="/builders/shell.js?v=2026-10-25-logo1" defer></script>
122
+ <script src="/builders/shell.js?v=2026-10-25-autobongos" defer></script>
123
123
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
124
124
  <script src="/builders/palette.js" defer></script>
125
125
  <!-- task 2166: the shared component kit (window.OTBKit) — pager/ledger/rail.
@@ -127,7 +127,7 @@
127
127
 
128
128
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
129
129
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
130
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
130
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
131
131
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
132
132
  <script src="/builders/palette.js" defer></script>
133
133
  <script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
@@ -61,7 +61,7 @@
61
61
 
62
62
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
63
63
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
64
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
64
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
65
65
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
66
66
  <script src="/builders/palette.js" defer></script>
67
67
  <script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
@@ -112,7 +112,7 @@
112
112
 
113
113
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
114
114
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
115
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
115
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
116
116
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
117
117
  <script src="/builders/palette.js" defer></script>
118
118
  <!-- the shared markdown reader (window.OTBMdReader) — primer.js renders through
@@ -207,7 +207,7 @@
207
207
  chrome exists before the page script runs. -->
208
208
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
209
209
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
210
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
210
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
211
211
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
212
212
  <script src="/builders/palette.js" defer></script>
213
213
  <!-- shared frontend toolkit (window.OTB) — loaded before profile.js, which pulls from it. -->
@@ -71,7 +71,7 @@
71
71
 
72
72
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
73
73
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
74
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
74
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
75
75
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
76
76
  <script src="/builders/palette.js" defer></script>
77
77
  <script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
@@ -73,7 +73,7 @@
73
73
  chrome exists before the page script runs. -->
74
74
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
75
75
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
76
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
76
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
77
77
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
78
78
  <script src="/builders/palette.js" defer></script>
79
79
  <!-- shared frontend toolkit (window.OTB) — loaded before ranks.js, which pulls from it. -->
@@ -43,7 +43,7 @@
43
43
 
44
44
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
45
45
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
46
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
46
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
47
47
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
48
48
  <script src="/builders/palette.js" defer></script>
49
49
  <script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
@@ -55,7 +55,7 @@
55
55
  chrome exists before the page script runs. -->
56
56
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
57
57
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
58
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
58
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
59
59
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
60
60
  <script src="/builders/palette.js" defer></script>
61
61
  <!-- shared frontend toolkit (window.OTB — rank labels, number formats) + the
@@ -111,7 +111,7 @@
111
111
  chrome exists before the page script runs. -->
112
112
  <script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
113
113
  <script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
114
- <script src="/builders/shell.js?v=2026-10-25-logo1"></script>
114
+ <script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
115
115
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
116
116
  <script src="/builders/palette.js" defer></script>
117
117
  <!-- shared frontend toolkit (window.OTB) — loaded BEFORE sessions.js so it can pull from it. -->