@bongos/core 1.19.726 → 1.19.727

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 (226) hide show
  1. package/.bongos-core.json +176 -491
  2. package/.devcontainer/Dockerfile +1 -1
  3. package/.devcontainer/devcontainer.json +2 -2
  4. package/.devcontainer/healthcheck.sh +1 -1
  5. package/.devcontainer/init-firewall.sh +1 -1
  6. package/.devcontainer/post-create.sh +2 -2
  7. package/.env.local.example +1 -1
  8. package/Dockerfile +1 -1
  9. package/docs/copy-inventory.md +1 -1
  10. package/docs/copy-registry.json +9 -9
  11. package/docs/module-api-changelog.md +2 -0
  12. package/docs/recipes/devbox-app-release.md +4 -4
  13. package/modules/dev-box/app/scripts/dmgbuild-settings.py +5 -5
  14. package/modules/dev-box/app/scripts/gen-brand.js +1 -1
  15. package/modules/dev-box/app/src/brand.js +1 -1
  16. package/modules/dev-box/app/test/unit.mjs +16 -16
  17. package/modules/dev-box/box-access.js +1 -1
  18. package/modules/dev-box/routes/box.js +1 -1
  19. package/modules/discord/discord-approvals.js +1 -1
  20. package/modules/grading/grader-model.js +1 -1
  21. package/modules/grading/grader-prompt.js +1 -1
  22. package/modules/grading/grader-workers/quality.js +1 -1
  23. package/modules/hall-ui/module.json +1 -1
  24. package/modules/hall-ui/public/brand-apply.js +1 -1
  25. package/modules/hall-ui/public/shell.js +1 -1
  26. package/modules/hall-ui/public/work.js +1 -1
  27. package/modules/lifecycle/conflict-resolve.js +1 -1
  28. package/modules/lifecycle/db-analytics.js +1 -1
  29. package/modules/lifecycle/routes/analytics.js +1 -1
  30. package/modules/onboarding/approval-broadcast.js +1 -1
  31. package/modules/onboarding/onboarding.js +1 -1
  32. package/modules/provisioning/tests/liveness.mjs +1 -1
  33. package/modules/public-landing/public/index.html +1 -1
  34. package/modules/public-landing/public/projects-floor.states.json +2 -2
  35. package/modules/public-landing/public/projects.probes.json +4 -4
  36. package/modules/public-landing/public/projects.states.json +2 -2
  37. package/modules/status-ui/module.json +1 -1
  38. package/modules/status-ui/public/status.js +4 -4
  39. package/modules/status-ui/public/style.css +1 -1
  40. package/modules/ui-design/kit/fixtures/cost-summary.json +1 -1
  41. package/modules/ui-design/kit/fixtures/featured-hub.json +1 -1
  42. package/modules/ui-design/kit/fixtures/featured.json +1 -1
  43. package/modules/ui-design/kit/fixtures/leaderboard.json +1 -1
  44. package/modules/ui-design/kit/fixtures/my-projects.json +1 -1
  45. package/modules/ui-design/kit/fixtures/progress.json +1 -1
  46. package/modules/ui-design/kit/fixtures/recent-shipped.json +1 -1
  47. package/package-lock.json +2 -2
  48. package/package.json +1 -1
  49. package/scripts/cron/style_guide_audit.sh +1 -1
  50. package/scripts/discord/lib.js +1 -1
  51. package/scripts/discord/post.js +1 -1
  52. package/scripts/gds/audit-authorship.sh +1 -1
  53. package/scripts/gds/audit-replay.sh +29 -2
  54. package/scripts/gds/audit-ships.js +1 -1
  55. package/scripts/gds/backfill-sessions.js +2 -2
  56. package/scripts/gds/cf-tunnel.js +4 -4
  57. package/scripts/gds/claude-materialize.js +2 -2
  58. package/scripts/gds/cli-lib.js +6 -6
  59. package/scripts/gds/cutover-codemod.js +1 -1
  60. package/scripts/gds/dev-lib.js +2 -2
  61. package/scripts/gds/diagnose-achievements.js +2 -2
  62. package/scripts/gds/fitness-checks-identity.js +6 -4
  63. package/scripts/gds/gen-diagrams.js +1 -1
  64. package/scripts/gds/leak-scan-allowlist.js +293 -0
  65. package/scripts/gds/learning-capture.js +1 -1
  66. package/scripts/gds/linkify-refs.js +2 -2
  67. package/scripts/gds/local-preview-lib.js +1 -1
  68. package/scripts/gds/mirror-lineage-check.js +1 -1
  69. package/scripts/gds/mirror-redact.js +17 -2
  70. package/scripts/gds/newcomer-floor.templates.json +1 -1
  71. package/scripts/gds/package-core.js +18 -1
  72. package/scripts/gds/paste-token.js +1 -1
  73. package/scripts/gds/provision-units.js +2 -2
  74. package/scripts/gds/publish-manifest.js +15 -0
  75. package/scripts/gds/repo-metrics.js +1 -1
  76. package/scripts/gds/sandbox-stage.js +1 -1
  77. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +1 -1
  78. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +1 -1
  79. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +1 -1
  80. package/scripts/gds/seed-bongos-tasks.js +2 -2
  81. package/scripts/gds/seed-gds-v4-tasks.js +1 -1
  82. package/scripts/gds/seed-medusa-tasks.js +10 -10
  83. package/scripts/gds/seed-module-upstreaming.js +1 -1
  84. package/scripts/gds/seed-productization-tasks.js +6 -6
  85. package/scripts/gds/seed-provisioning-tasks.js +2 -2
  86. package/scripts/gds/seed-staging.sh +19 -6
  87. package/scripts/gds/ship-deploy-target.js +1 -1
  88. package/scripts/gds/ship-flow.js +1 -1
  89. package/scripts/gds/smoke-gds.js +1 -1
  90. package/scripts/status-probe.mjs +2 -2
  91. package/src/bongos/auth-discord.js +2 -2
  92. package/src/bongos/live-channel.js +1 -1
  93. package/src/bongos/pool.js +1 -1
  94. package/src/bongos/routes/auth.js +11 -11
  95. package/src/bongos/routes/security.js +1 -1
  96. package/src/bongos/routes.js +1 -1
  97. package/src/branding.js +1 -1
  98. package/src/devbox-downloads.js +1 -1
  99. package/src/instance-config.js +2 -2
  100. package/src/module-api.js +1 -1
  101. package/src/module-loader/provenance.js +2 -2
  102. package/tests/art_stage.mjs +2 -2
  103. package/tests/auth_anthropic_identity.mjs +1 -1
  104. package/tests/auth_duplicate_cookie.mjs +1 -1
  105. package/tests/auth_error_brand.mjs +1 -1
  106. package/tests/auth_inactive_builder.mjs +1 -1
  107. package/tests/backup_cli.mjs +4 -4
  108. package/tests/bongos_box_connect.mjs +2 -2
  109. package/tests/bongos_downloads.mjs +2 -2
  110. package/tests/bongos_login.mjs +5 -5
  111. package/tests/box_connect_e2e.mjs +2 -2
  112. package/tests/box_dns_repoint.mjs +10 -10
  113. package/tests/box_host_keys.mjs +1 -1
  114. package/tests/box_onboard.mjs +9 -9
  115. package/tests/box_scope_session.mjs +1 -1
  116. package/tests/box_terminal_ssrf.mjs +7 -7
  117. package/tests/boxes.mjs +9 -9
  118. package/tests/branding.mjs +2 -2
  119. package/tests/bump_version.mjs +2 -2
  120. package/tests/cf_tunnel.mjs +40 -40
  121. package/tests/cli_token_reissue.mjs +7 -7
  122. package/tests/cloud_bongos_pack.mjs +1 -1
  123. package/tests/currency_label.mjs +8 -8
  124. package/tests/dev_lib.mjs +4 -4
  125. package/tests/devbox_dmg_backdrop.mjs +1 -1
  126. package/tests/devbox_downloads.mjs +2 -2
  127. package/tests/devbox_icons.mjs +1 -1
  128. package/tests/discord_approvals.mjs +1 -1
  129. package/tests/discord_oauth.mjs +2 -2
  130. package/tests/executed_closure.mjs +6 -1
  131. package/tests/first_admin_bootstrap.mjs +1 -1
  132. package/tests/gate_approvals.mjs +5 -5
  133. package/tests/grade_aggregates_unavailable.mjs +1 -1
  134. package/tests/hook_user_agents.mjs +2 -2
  135. package/tests/init.mjs +6 -6
  136. package/tests/instance_config.mjs +1 -1
  137. package/tests/instance_manifest.mjs +5 -5
  138. package/tests/instance_mismatch_guard.mjs +13 -13
  139. package/tests/leak_scan_allowlist.mjs +94 -0
  140. package/tests/migrate_root_resolution.mjs +4 -4
  141. package/tests/mirror_redact.mjs +28 -4
  142. package/tests/module_catalog.mjs +5 -5
  143. package/tests/module_submissions.mjs +3 -3
  144. package/tests/package_core.mjs +1 -1
  145. package/tests/parallel-load.mjs +6 -6
  146. package/tests/projects_hub.mjs +2 -2
  147. package/tests/provision.mjs +50 -50
  148. package/tests/provisioning_github_app_routes.mjs +1 -1
  149. package/tests/provisioning_onboard_mode.mjs +2 -2
  150. package/tests/publish_reconciler.mjs +4 -4
  151. package/tests/sandbox_stage.mjs +1 -1
  152. package/tests/scrubber_corpus.mjs +3 -3
  153. package/tests/search_isolation.mjs +1 -1
  154. package/tests/session_records.mjs +1 -1
  155. package/tests/ship_card.mjs +6 -6
  156. package/tests/ship_ci_deploy.mjs +1 -1
  157. package/tests/single_host_hall.mjs +9 -9
  158. package/tests/smoke_preflight.mjs +1 -1
  159. package/tests/smoke_target.mjs +1 -1
  160. package/tests/status-probe.mjs +1 -1
  161. package/tests/status_mirror_sync.mjs +1 -1
  162. package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +0 -45
  163. package/docs/design/mocks/_schemes.css +0 -604
  164. package/docs/design/mocks/component-sheet.html +0 -428
  165. package/docs/design/mocks/hall/_tokens.css +0 -370
  166. package/docs/design/mocks/hall/board/v1.html +0 -846
  167. package/docs/design/mocks/hall/board/v2.html +0 -858
  168. package/docs/design/mocks/hall/board/v3.html +0 -884
  169. package/docs/design/mocks/hall/goals/v1.html +0 -1212
  170. package/docs/design/mocks/hall/goals/v2.html +0 -1192
  171. package/docs/design/mocks/hall/goals/v3.html +0 -1205
  172. package/docs/design/mocks/hall/hall-sheet.html +0 -244
  173. package/docs/design/mocks/hall/reading/v1.html +0 -1125
  174. package/docs/design/mocks/hall/reading/v2.html +0 -1177
  175. package/docs/design/mocks/hall/reading/v3.html +0 -1150
  176. package/docs/design/mocks/hall/settings/v1.html +0 -1238
  177. package/docs/design/mocks/hall/settings/v2.html +0 -1235
  178. package/docs/design/mocks/hall/settings/v3.html +0 -1299
  179. package/docs/design/mocks/hall/task/v1.html +0 -633
  180. package/docs/design/mocks/hall/task/v2.html +0 -646
  181. package/docs/design/mocks/hall/task/v3.html +0 -647
  182. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg +0 -0
  183. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg.json +0 -13
  184. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg +0 -0
  185. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg.json +0 -13
  186. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg +0 -0
  187. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg.json +0 -13
  188. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg +0 -0
  189. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg.json +0 -13
  190. package/docs/design/mocks/hub/hub-sheet.html +0 -192
  191. package/docs/design/mocks/hub/mine.html +0 -465
  192. package/docs/design/mocks/hub/picker.html +0 -421
  193. package/docs/design/mocks/hub/planets.html +0 -356
  194. package/docs/design/mocks/hub/v1.html +0 -1209
  195. package/docs/design/mocks/hub/v2.html +0 -1257
  196. package/docs/design/mocks/hub/v3.html +0 -1496
  197. package/docs/design/mocks/hub/wizard.html +0 -421
  198. package/docs/design/mocks/landing/landing-sheet.html +0 -131
  199. package/docs/design/mocks/landing/v1.html +0 -956
  200. package/docs/design/mocks/landing/v2.html +0 -708
  201. package/docs/design/mocks/landing/v3.html +0 -911
  202. package/docs/design/mocks/landing-page-mock.html +0 -687
  203. package/docs/design/mocks/landing-palettes.html +0 -103
  204. package/docs/design/mocks/projects-hub-mock.html +0 -991
  205. package/docs/design/mocks/projects-hub-variants.html +0 -146
  206. package/docs/design/mocks/projects-page-mock.html +0 -167
  207. package/docs/design/mocks/world/blue-hud/_tokens.css +0 -246
  208. package/docs/design/mocks/world/blue-hud/hall.html +0 -595
  209. package/docs/design/mocks/world/blue-hud/landing.html +0 -424
  210. package/docs/design/mocks/world/blue-hud/status.html +0 -410
  211. package/docs/design/mocks/world/chrome-blobs/_tokens.css +0 -479
  212. package/docs/design/mocks/world/chrome-blobs/hall.html +0 -553
  213. package/docs/design/mocks/world/chrome-blobs/landing-b.html +0 -581
  214. package/docs/design/mocks/world/chrome-blobs/landing.html +0 -328
  215. package/docs/design/mocks/world/chrome-blobs/status.html +0 -416
  216. package/docs/design/mocks/world/natgeo-editorial/_tokens.css +0 -377
  217. package/docs/design/mocks/world/natgeo-editorial/hall.html +0 -649
  218. package/docs/design/mocks/world/natgeo-editorial/landing-b.html +0 -743
  219. package/docs/design/mocks/world/natgeo-editorial/landing.html +0 -475
  220. package/docs/design/mocks/world/natgeo-editorial/status.html +0 -437
  221. package/docs/design/mocks/world/organic-cards/_tokens.css +0 -462
  222. package/docs/design/mocks/world/organic-cards/hall.html +0 -625
  223. package/docs/design/mocks/world/organic-cards/landing-b.html +0 -736
  224. package/docs/design/mocks/world/organic-cards/landing.html +0 -420
  225. package/docs/design/mocks/world/organic-cards/status.html +0 -458
  226. package/docs/design/mocks/world/world-sheet.html +0 -156
@@ -1,244 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>The builders' hall in the chrome world: five archetypes, three versions each (task 1003302)</title>
7
- <style>
8
- /* This is the REVIEWER's page, not a mock. It deliberately sits outside the world and carries its own
9
- neutral palette so it never competes with what it is showing. check-mock.js is not run on it. */
10
- :root{--ink:#14151a;--soft:#585c6b;--faint:#8a8fa0;--line:#d9dce5;--bg:#f3f4f8;--card:#ffffff;--kick:#0b5fff;}
11
- :root[data-mode="dark"]{--ink:#f1f2f7;--soft:#a9aec0;--faint:#737890;--line:#2a2e3b;--bg:#0c0e14;--card:#151822;--kick:#7aa2ff;}
12
- @media (prefers-color-scheme:dark){:root:not([data-mode="light"]){--ink:#f1f2f7;--soft:#a9aec0;--faint:#737890;--line:#2a2e3b;--bg:#0c0e14;--card:#151822;--kick:#7aa2ff;}}
13
- *{box-sizing:border-box;margin:0;padding:0}
14
- body{background:var(--bg);color:var(--ink);font-family:system-ui,-apple-system,"Segoe UI",sans-serif;padding:clamp(18px,3vw,40px);-webkit-font-smoothing:antialiased;line-height:1.5}
15
- h1{font-size:clamp(22px,3vw,32px);letter-spacing:-.4px;margin-bottom:6px}
16
- .sub{color:var(--soft);max-width:100ch;font-size:14.5px;margin-bottom:8px}
17
- .sub b{color:var(--ink)}
18
- .sub code,.read code,.decide code{font-family:ui-monospace,Consolas,monospace;font-size:12.5px}
19
- .read{border-left:3px solid var(--kick);padding:10px 14px;margin:14px 0 18px;font-size:14px;max-width:110ch;background:color-mix(in srgb,var(--kick) 7%,transparent);border-radius:0 8px 8px 0}
20
- .read ol,.read ul{margin:6px 0 0 18px}
21
- .decide{border:1.5px solid var(--kick);border-radius:16px;padding:16px 18px;margin-bottom:22px;font-size:14px;max-width:120ch}
22
- .decide h2{font-size:18px;margin-bottom:6px}
23
- .decide ol,.decide ul{margin:6px 0 0 20px}
24
- .decide li{margin:4px 0}
25
- .bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:6px 0 22px;position:sticky;top:0;background:var(--bg);padding:10px 0;z-index:5;border-bottom:1px solid var(--line)}
26
- .bar span{font-size:11px;letter-spacing:.6px;text-transform:uppercase;color:var(--faint);margin-left:10px}
27
- .bar span:first-child{margin-left:0}
28
- .bar button,.bar select{cursor:pointer;font:inherit;font-weight:600;font-size:13px;padding:6px 14px;border-radius:999px;border:1.5px solid var(--line);background:var(--card);color:var(--ink)}
29
- .bar button[aria-pressed="true"]{background:var(--ink);color:var(--card);border-color:var(--ink)}
30
- .arch{background:var(--card);border:1.5px solid var(--line);border-radius:16px;padding:16px 18px 18px;margin-bottom:22px}
31
- .kick{font-size:11px;letter-spacing:.9px;text-transform:uppercase;color:var(--kick);font-weight:700}
32
- .arch h2{font-size:20px;margin:2px 0 4px;letter-spacing:-.2px}
33
- .arch>p.what{color:var(--soft);font-size:13.5px;margin-bottom:12px;max-width:110ch}
34
- .tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;align-items:start}
35
- .tiles.phones{grid-template-columns:repeat(6,1fr);margin-top:12px}
36
- @media (max-width:1100px){.tiles{grid-template-columns:1fr}.tiles.phones{grid-template-columns:1fr 1fr}}
37
- .tile{border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--bg)}
38
- .tileHead{display:flex;justify-content:space-between;align-items:baseline;gap:8px;padding:6px 10px;font-size:12px;color:var(--soft);border-bottom:1px solid var(--line)}
39
- .tileHead b{color:var(--ink);font-size:12.5px}
40
- .tileHead a{color:var(--kick);font-weight:600;text-decoration:none;white-space:nowrap}
41
- .frame{position:relative;width:100%;aspect-ratio:1440/900;overflow:hidden}
42
- .frame iframe{position:absolute;top:0;left:0;width:1440px;height:900px;border:0;transform-origin:0 0}
43
- .phone .frame{aspect-ratio:390/844}
44
- .phone .frame iframe{width:390px;height:844px}
45
- .meta{font-size:13px;color:var(--soft);padding:8px 10px 0}
46
- .meta b{color:var(--ink);font-weight:600}
47
- .meta p{margin:3px 0}
48
- footer{color:var(--faint);font-size:12.5px;margin-top:28px;max-width:110ch}
49
- footer code{font-family:ui-monospace,Consolas,monospace}
50
- </style>
51
- <script>
52
- (function(){try{var q=new URLSearchParams(location.search).get('mode');var m=(q==='light'||q==='dark')?q:'dark';document.documentElement.setAttribute('data-mode',m);}catch(e){}})();
53
- </script>
54
- </head>
55
- <body>
56
-
57
- <h1>The builders' hall in the chrome world: five archetypes, three versions each</h1>
58
-
59
- <p class="sub">The composition round for <b>task 1003302</b> (goal 1000081), after the landing was built and <code>DESIGN.md</code> recorded the world. The 27-page hall adopts the single visual world the apex already lives in, so a builder who walks from cloudbongos.com into their hall never changes worlds. <b>The sidebar information architecture, every href and every page gate stay exactly as they are</b> (pinned by <code>tests/hall_nav.mjs</code>): this round changes how the hall looks, never where things are. Five archetype pages carry the whole hall, and every other page inherits from one of them at build time. Mocks are judged <b>dark first</b>; flip to light with the toggle, because unlike the apex the hall keeps a real light mode. All fifteen link one shared token tier, <code>_tokens.css</code>, so a steer on the palette moves all fifteen at once.</p>
60
-
61
- <div class="read">
62
- <b>How to read the three.</b> Every archetype builds the same three theses, so you can pick one language for the whole hall or mix per archetype. They are three answers to one question: <b>how much container does an application surface get, and does the hall get a ground?</b>
63
- <ul>
64
- <li><b>v1 "the ledger"</b>: the world taken literally into Operate mode. No panels anywhere, the page is hairline rules and rows on the page ground, figures sit bare, the current nav item is a 2px accent hairline. Densest, and the closest reading of <code>DESIGN.md</code>'s "hairlines, not containers".</li>
65
- <li><b>v2 "the sheet"</b>: the owner's light template brought into the chrome world. Content sits on card sheets with a hairline edge and small corners, <b>no shadow anywhere</b>, mono uppercase labels over big tabular figures. Middle density. It bends the world's "no cards" rule on purpose, for an application rather than a poster.</li>
66
- <li><b>v3 "the glass hall"</b>: the owner's dark template. One rendered plate behind the whole shell in dark, the sidebar and topbar as glass over it, the sidebar collapsed to its 64px rail by default. Loosest, most atmosphere, and the most expensive per page.</li>
67
- </ul>
68
- The <b>state picker</b> flips every version to the same state at once. Every mock carries the same seven: <code>populated</code>, <code>loading</code> (skeletons in the shape of the final content), <code>empty</code>, <code>error</code>, <code>rail</code> (the sidebar at 64px), <code>drawer</code> (the mobile drawer open) and <code>focus</code> (keyboard rings on real controls). <b>open full</b> walks any version at full size. Each mock's head comment states its thesis, its composition, what light does differently, and its honest risk.
69
- </div>
70
-
71
- <div class="decide" id="decision">
72
- <h2>The decision this round asks of the owner</h2>
73
- <ol>
74
- <li><b>One version per archetype</b> (steers allowed, and a mix is allowed). The likeliest good answer is one language for all five; the likeliest good mix is the denser language for the working surfaces and the looser one for the reading room.</li>
75
- <li><b>Does the hall get containers at all?</b> v1 says no and follows the world's letter. v2 and v3 say yes. Whatever you pick here is the single biggest thing the build inherits.</li>
76
- <li><b>Does the hall get its own rendered ground?</b> Only v3 spends one. <code>DESIGN.md</code> already reserves the hall's forest plate as the hall's own; this round is where that either becomes real or is dropped.</li>
77
- <li><b>Two regions on the task page do not exist today</b>: a grade panel and a session log. The round's brief asked for them, so the task mocks show them marked <code>proposed</code>. Say whether the build should add them, or leave grades on Standing and session logs on <code>/sessions</code> where they live now.</li>
78
- <li><b>The light mode.</b> The apex went dark only, so the hall is now the only surface with a real light mode. Confirm it stays, since it doubles the build's contrast work.</li>
79
- </ol>
80
- <p style="margin-top:8px;color:var(--soft)">If no pick lands, the build takes v2 "the sheet" for all five archetypes, as the version that reads the owner's own two templates most directly and costs the least legibility on a dense 27-page surface.</p>
81
- </div>
82
-
83
- <div class="decide" id="picked" style="border-color:var(--ink)">
84
- <h2>The pick: v3 "the glass hall", all five archetypes (owner, 2026-08-30)</h2>
85
- <p style="margin-bottom:6px">Taken in session with these fifteen open. Three steers came with it, and together they change what v3 means for the build. The full record is <code>docs/design/hall-direction-v2.md</code> §6.</p>
86
- <ol>
87
- <li><b>v3's geometry is what ships:</b> the 64px rail at every width opening on hover or focus, glass topbar and sidebar, content on card panels at the full radius with tone doing the separation, the loosest air of the three, and sentence-case section headings rather than mono labels.</li>
88
- <li><b>The plate is deferred</b> ("decide after the shell lands"), so task 1003303 <b>must not wait on an asset</b>. It builds v3 with <code>--plate: none</code>, which is exactly what v3's own light mode already does and what every mock here shows, since the hall's plate was never shot. The shell has to be a complete composition with no plate at all. The three plate tokens stay in the tier as the declared seam, so adding one later is a token change and not a re-layout.</li>
89
- <li><b>Light mode stays.</b> The hall keeps its own switch and full light parity, test-enforced in both modes. It is now the only surface on the platform with a real light mode.</li>
90
- <li><b>The grade panel and the session log are approved</b> for the task page. They are net-new surface, not a re-skin, so they are filed as task 1003437 behind task 1003305 rather than riding it. The <code>proposed</code> eyebrow and the dashed edge come off the mocks when that ships.</li>
91
- </ol>
92
- <p style="margin-top:8px;color:var(--soft)">v1 and v2 stay on disk as built and verified. What they leave behind regardless: v2's stat-tile grid is the reference for any figure row the hall renders, and v1's bare-ledger treatment is the reference for the dense tables that live inside v3's panels.</p>
93
- </div>
94
-
95
- <div class="bar">
96
- <span>mode</span>
97
- <button type="button" data-mode-btn="dark" aria-pressed="true">dark</button>
98
- <button type="button" data-mode-btn="light" aria-pressed="false">light</button>
99
- <span>state</span>
100
- <select id="statePick">
101
- <option value="populated">populated</option>
102
- <option value="loading">loading</option>
103
- <option value="empty">empty</option>
104
- <option value="error">error</option>
105
- <option value="rail">rail, the 64px sidebar</option>
106
- <option value="drawer">drawer, mobile nav open</option>
107
- <option value="focus">focus rings</option>
108
- </select>
109
- <span>phones</span>
110
- <button type="button" id="phoneBtn" aria-pressed="false">show the 390 row</button>
111
- </div>
112
-
113
- <div id="sheet"></div>
114
-
115
- <footer>
116
- <p>Mocks: <code>docs/design/mocks/hall/&lt;archetype&gt;/v{1,2,3}.html</code>. Shared token tier: <code>docs/design/mocks/hall/_tokens.css</code>. World: <code>DESIGN.md</code> at the repo root. Owner templates: <code>docs/design/references/2026-08-26/hall-1-light-mono-label-dashboard.webp</code> and <code>hall-2-dark-glass-dashboard-forest.webp</code>. Decision record: <code>docs/design/hall-direction-v2.md</code>. The IA this round does not touch: <code>docs/design/vanilla-hall-ui-redesign-scope.md</code> and <code>tests/hall_nav.mjs</code>.</p>
117
- <p style="margin-top:6px">Open this sheet from a checkout that holds <code>docs/design/mocks/hall/</code>; the tiles are local iframes. If they do not paint, serve the repo instead: <code>node modules/ui-design/kit/serve.js</code>, then <code>http://127.0.0.1:3412/docs/design/mocks/hall/hall-sheet.html</code>.</p>
118
- </footer>
119
-
120
- <script>
121
- /* The sheet builds its tiles from one table so a new archetype is one row, not a copy-paste of markup. */
122
- var ARCH = [
123
- { slug: 'board', name: 'Work board and home',
124
- what: 'The densest surface in the hall, and the one this round is really judged on. Home above (the greeting, the four stat tiles, the standing and goals band, the attention inbox, your work) and the work board below (four tabs, the filter row, the task cards, the bulk toolbar).' },
125
- { slug: 'task', name: 'Task detail',
126
- what: 'One record, read end to end: the status pill, the meta line, the goal it lives in, the claim, the value, the description, the touches, the dependencies in both directions, and the lifecycle actions. Two regions are marked proposed because they do not exist today.' },
127
- { slug: 'reading', name: 'The reading room (the primer)',
128
- what: 'Long markdown with a scrollspy table of contents, an inline diagram, a reading progress bar and a soft acknowledge gate. Ranks, Economy, Diagrams, Repo Atlas and Modules all inherit from it. This is where a lowercase display face is most at risk.' },
129
- { slug: 'goals', name: 'The governance list (goals)',
130
- what: 'The list above, always grouped Active then Blocked then Achieved then Archived, with rows and cards as two views of one fact source; the detail below, with the three column band (completion, members, conflicts) and the tasks card.' },
131
- { slug: 'settings', name: 'Settings and profile',
132
- what: 'The forms archetype: every input, select, switch, secret field and status line in the hall inherits from it. Settings above with its section rail and the CLI re-issue ladder; profile below with the numbers, the achievements, the works ledger and the activity tabs.' },
133
- ];
134
- var VERS = [
135
- { v: 'v1', name: 'the ledger' },
136
- { v: 'v2', name: 'the sheet' },
137
- { v: 'v3', name: 'the glass hall' },
138
- ];
139
-
140
- var mode = document.documentElement.getAttribute('data-mode') || 'dark';
141
- var state = 'populated';
142
- var phones = false;
143
-
144
- function tile(a, v, isPhone) {
145
- var d = document.createElement('div');
146
- d.className = 'tile' + (isPhone ? ' phone' : '');
147
- var head = document.createElement('div');
148
- head.className = 'tileHead';
149
- var lab = document.createElement('b');
150
- lab.textContent = v.v + ' ' + v.name + (isPhone ? ' at 390' : '');
151
- var open = document.createElement('a');
152
- open.target = '_blank';
153
- open.rel = 'noopener';
154
- open.textContent = 'open full';
155
- head.appendChild(lab);
156
- head.appendChild(open);
157
- var frame = document.createElement('div');
158
- frame.className = 'frame';
159
- var f = document.createElement('iframe');
160
- f.loading = 'lazy';
161
- f.title = a.name + ', ' + v.v + ' ' + v.name + (isPhone ? ' at 390' : ' at 1440');
162
- frame.appendChild(f);
163
- d.appendChild(head);
164
- d.appendChild(frame);
165
- d.__set = function () {
166
- var url = a.slug + '/' + v.v + '.html?mode=' + mode + '&state=' + state;
167
- f.setAttribute('src', url);
168
- open.setAttribute('href', url);
169
- };
170
- d.__set();
171
- return d;
172
- }
173
-
174
- var mounted = [];
175
- (function build() {
176
- var host = document.getElementById('sheet');
177
- ARCH.forEach(function (a, i) {
178
- var sec = document.createElement('section');
179
- sec.className = 'arch';
180
- sec.id = a.slug;
181
- var k = document.createElement('div');
182
- k.className = 'kick';
183
- k.textContent = 'archetype ' + (i + 1) + ' of 5';
184
- var h = document.createElement('h2');
185
- h.textContent = a.name;
186
- var p = document.createElement('p');
187
- p.className = 'what';
188
- p.textContent = a.what;
189
- sec.appendChild(k);
190
- sec.appendChild(h);
191
- sec.appendChild(p);
192
- var row = document.createElement('div');
193
- row.className = 'tiles';
194
- VERS.forEach(function (v) { var t = tile(a, v, false); mounted.push(t); row.appendChild(t); });
195
- sec.appendChild(row);
196
- var prow = document.createElement('div');
197
- prow.className = 'tiles phones';
198
- prow.hidden = true;
199
- prow.setAttribute('data-phones', '1');
200
- VERS.forEach(function (v) { var t = tile(a, v, true); mounted.push(t); prow.appendChild(t); });
201
- sec.appendChild(prow);
202
- host.appendChild(sec);
203
- });
204
- })();
205
-
206
- function fit() {
207
- document.querySelectorAll('.frame').forEach(function (fr) {
208
- var f = fr.querySelector('iframe');
209
- if (!f) return;
210
- var w = fr.clientWidth;
211
- var base = fr.closest('.phone') ? 390 : 1440;
212
- f.style.transform = 'scale(' + (w / base) + ')';
213
- });
214
- }
215
- function refresh() { mounted.forEach(function (t) { t.__set(); }); }
216
-
217
- document.querySelectorAll('[data-mode-btn]').forEach(function (b) {
218
- b.addEventListener('click', function () {
219
- mode = b.getAttribute('data-mode-btn');
220
- document.documentElement.setAttribute('data-mode', mode);
221
- document.querySelectorAll('[data-mode-btn]').forEach(function (o) {
222
- o.setAttribute('aria-pressed', String(o === b));
223
- });
224
- refresh();
225
- });
226
- });
227
- document.getElementById('statePick').addEventListener('change', function (e) {
228
- state = e.target.value;
229
- refresh();
230
- });
231
- document.getElementById('phoneBtn').addEventListener('click', function () {
232
- phones = !phones;
233
- this.setAttribute('aria-pressed', String(phones));
234
- this.textContent = phones ? 'hide the 390 row' : 'show the 390 row';
235
- document.querySelectorAll('[data-phones]').forEach(function (r) { r.hidden = !phones; });
236
- fit();
237
- });
238
- window.addEventListener('resize', fit);
239
- window.addEventListener('load', fit);
240
- fit();
241
- </script>
242
-
243
- </body>
244
- </html>