@bongos/core 1.19.725 → 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 (229) hide show
  1. package/.bongos-core.json +179 -494
  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 +4 -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/gate-review.js +14 -6
  64. package/scripts/gds/gen-diagrams.js +1 -1
  65. package/scripts/gds/leak-scan-allowlist.js +293 -0
  66. package/scripts/gds/learning-capture.js +1 -1
  67. package/scripts/gds/linkify-refs.js +2 -2
  68. package/scripts/gds/local-preview-lib.js +1 -1
  69. package/scripts/gds/mirror-lineage-check.js +1 -1
  70. package/scripts/gds/mirror-redact.js +17 -2
  71. package/scripts/gds/newcomer-floor.templates.json +1 -1
  72. package/scripts/gds/package-core.js +18 -1
  73. package/scripts/gds/paste-token.js +1 -1
  74. package/scripts/gds/provision-units.js +2 -2
  75. package/scripts/gds/publish-manifest.js +15 -0
  76. package/scripts/gds/repo-metrics.js +1 -1
  77. package/scripts/gds/sandbox-stage.js +1 -1
  78. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +1 -1
  79. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +1 -1
  80. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +1 -1
  81. package/scripts/gds/seed-bongos-tasks.js +2 -2
  82. package/scripts/gds/seed-gds-v4-tasks.js +1 -1
  83. package/scripts/gds/seed-medusa-tasks.js +10 -10
  84. package/scripts/gds/seed-module-upstreaming.js +1 -1
  85. package/scripts/gds/seed-productization-tasks.js +6 -6
  86. package/scripts/gds/seed-provisioning-tasks.js +2 -2
  87. package/scripts/gds/seed-staging.sh +19 -6
  88. package/scripts/gds/ship-deploy-target.js +1 -1
  89. package/scripts/gds/ship-flow.js +1 -1
  90. package/scripts/gds/smoke-gds.js +1 -1
  91. package/scripts/status-probe.mjs +2 -2
  92. package/src/bongos/auth-discord.js +2 -2
  93. package/src/bongos/live-channel.js +1 -1
  94. package/src/bongos/permission-path-check.js +80 -3
  95. package/src/bongos/pool.js +1 -1
  96. package/src/bongos/routes/auth.js +11 -11
  97. package/src/bongos/routes/security.js +1 -1
  98. package/src/bongos/routes.js +1 -1
  99. package/src/branding.js +1 -1
  100. package/src/devbox-downloads.js +1 -1
  101. package/src/instance-config.js +2 -2
  102. package/src/module-api.js +1 -1
  103. package/src/module-loader/provenance.js +2 -2
  104. package/tests/art_stage.mjs +2 -2
  105. package/tests/auth_anthropic_identity.mjs +1 -1
  106. package/tests/auth_duplicate_cookie.mjs +1 -1
  107. package/tests/auth_error_brand.mjs +1 -1
  108. package/tests/auth_inactive_builder.mjs +1 -1
  109. package/tests/backup_cli.mjs +4 -4
  110. package/tests/bongos_box_connect.mjs +2 -2
  111. package/tests/bongos_downloads.mjs +2 -2
  112. package/tests/bongos_login.mjs +5 -5
  113. package/tests/box_connect_e2e.mjs +2 -2
  114. package/tests/box_dns_repoint.mjs +10 -10
  115. package/tests/box_host_keys.mjs +1 -1
  116. package/tests/box_onboard.mjs +9 -9
  117. package/tests/box_scope_session.mjs +1 -1
  118. package/tests/box_terminal_ssrf.mjs +7 -7
  119. package/tests/boxes.mjs +9 -9
  120. package/tests/branding.mjs +2 -2
  121. package/tests/bump_version.mjs +2 -2
  122. package/tests/cf_tunnel.mjs +40 -40
  123. package/tests/cli_token_reissue.mjs +7 -7
  124. package/tests/cloud_bongos_pack.mjs +1 -1
  125. package/tests/currency_label.mjs +8 -8
  126. package/tests/dev_lib.mjs +4 -4
  127. package/tests/devbox_dmg_backdrop.mjs +1 -1
  128. package/tests/devbox_downloads.mjs +2 -2
  129. package/tests/devbox_icons.mjs +1 -1
  130. package/tests/discord_approvals.mjs +1 -1
  131. package/tests/discord_oauth.mjs +2 -2
  132. package/tests/executed_closure.mjs +6 -1
  133. package/tests/first_admin_bootstrap.mjs +1 -1
  134. package/tests/gate_approvals.mjs +5 -5
  135. package/tests/government_protected_surfaces.mjs +137 -0
  136. package/tests/grade_aggregates_unavailable.mjs +1 -1
  137. package/tests/hook_user_agents.mjs +2 -2
  138. package/tests/init.mjs +6 -6
  139. package/tests/instance_config.mjs +1 -1
  140. package/tests/instance_manifest.mjs +5 -5
  141. package/tests/instance_mismatch_guard.mjs +13 -13
  142. package/tests/leak_scan_allowlist.mjs +94 -0
  143. package/tests/migrate_root_resolution.mjs +4 -4
  144. package/tests/mirror_redact.mjs +28 -4
  145. package/tests/module_catalog.mjs +5 -5
  146. package/tests/module_submissions.mjs +3 -3
  147. package/tests/package_core.mjs +1 -1
  148. package/tests/parallel-load.mjs +6 -6
  149. package/tests/projects_hub.mjs +2 -2
  150. package/tests/provision.mjs +50 -50
  151. package/tests/provisioning_github_app_routes.mjs +1 -1
  152. package/tests/provisioning_onboard_mode.mjs +2 -2
  153. package/tests/publish_reconciler.mjs +4 -4
  154. package/tests/sandbox_stage.mjs +1 -1
  155. package/tests/scrubber_corpus.mjs +3 -3
  156. package/tests/search_isolation.mjs +1 -1
  157. package/tests/session_records.mjs +1 -1
  158. package/tests/ship_card.mjs +6 -6
  159. package/tests/ship_ci_deploy.mjs +1 -1
  160. package/tests/single_host_hall.mjs +9 -9
  161. package/tests/smoke_preflight.mjs +1 -1
  162. package/tests/smoke_target.mjs +1 -1
  163. package/tests/status-probe.mjs +1 -1
  164. package/tests/status_mirror_sync.mjs +1 -1
  165. package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +0 -45
  166. package/docs/design/mocks/_schemes.css +0 -604
  167. package/docs/design/mocks/component-sheet.html +0 -428
  168. package/docs/design/mocks/hall/_tokens.css +0 -370
  169. package/docs/design/mocks/hall/board/v1.html +0 -846
  170. package/docs/design/mocks/hall/board/v2.html +0 -858
  171. package/docs/design/mocks/hall/board/v3.html +0 -884
  172. package/docs/design/mocks/hall/goals/v1.html +0 -1212
  173. package/docs/design/mocks/hall/goals/v2.html +0 -1192
  174. package/docs/design/mocks/hall/goals/v3.html +0 -1205
  175. package/docs/design/mocks/hall/hall-sheet.html +0 -244
  176. package/docs/design/mocks/hall/reading/v1.html +0 -1125
  177. package/docs/design/mocks/hall/reading/v2.html +0 -1177
  178. package/docs/design/mocks/hall/reading/v3.html +0 -1150
  179. package/docs/design/mocks/hall/settings/v1.html +0 -1238
  180. package/docs/design/mocks/hall/settings/v2.html +0 -1235
  181. package/docs/design/mocks/hall/settings/v3.html +0 -1299
  182. package/docs/design/mocks/hall/task/v1.html +0 -633
  183. package/docs/design/mocks/hall/task/v2.html +0 -646
  184. package/docs/design/mocks/hall/task/v3.html +0 -647
  185. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg +0 -0
  186. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg.json +0 -13
  187. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg +0 -0
  188. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg.json +0 -13
  189. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg +0 -0
  190. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg.json +0 -13
  191. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg +0 -0
  192. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg.json +0 -13
  193. package/docs/design/mocks/hub/hub-sheet.html +0 -192
  194. package/docs/design/mocks/hub/mine.html +0 -465
  195. package/docs/design/mocks/hub/picker.html +0 -421
  196. package/docs/design/mocks/hub/planets.html +0 -356
  197. package/docs/design/mocks/hub/v1.html +0 -1209
  198. package/docs/design/mocks/hub/v2.html +0 -1257
  199. package/docs/design/mocks/hub/v3.html +0 -1496
  200. package/docs/design/mocks/hub/wizard.html +0 -421
  201. package/docs/design/mocks/landing/landing-sheet.html +0 -131
  202. package/docs/design/mocks/landing/v1.html +0 -956
  203. package/docs/design/mocks/landing/v2.html +0 -708
  204. package/docs/design/mocks/landing/v3.html +0 -911
  205. package/docs/design/mocks/landing-page-mock.html +0 -687
  206. package/docs/design/mocks/landing-palettes.html +0 -103
  207. package/docs/design/mocks/projects-hub-mock.html +0 -991
  208. package/docs/design/mocks/projects-hub-variants.html +0 -146
  209. package/docs/design/mocks/projects-page-mock.html +0 -167
  210. package/docs/design/mocks/world/blue-hud/_tokens.css +0 -246
  211. package/docs/design/mocks/world/blue-hud/hall.html +0 -595
  212. package/docs/design/mocks/world/blue-hud/landing.html +0 -424
  213. package/docs/design/mocks/world/blue-hud/status.html +0 -410
  214. package/docs/design/mocks/world/chrome-blobs/_tokens.css +0 -479
  215. package/docs/design/mocks/world/chrome-blobs/hall.html +0 -553
  216. package/docs/design/mocks/world/chrome-blobs/landing-b.html +0 -581
  217. package/docs/design/mocks/world/chrome-blobs/landing.html +0 -328
  218. package/docs/design/mocks/world/chrome-blobs/status.html +0 -416
  219. package/docs/design/mocks/world/natgeo-editorial/_tokens.css +0 -377
  220. package/docs/design/mocks/world/natgeo-editorial/hall.html +0 -649
  221. package/docs/design/mocks/world/natgeo-editorial/landing-b.html +0 -743
  222. package/docs/design/mocks/world/natgeo-editorial/landing.html +0 -475
  223. package/docs/design/mocks/world/natgeo-editorial/status.html +0 -437
  224. package/docs/design/mocks/world/organic-cards/_tokens.css +0 -462
  225. package/docs/design/mocks/world/organic-cards/hall.html +0 -625
  226. package/docs/design/mocks/world/organic-cards/landing-b.html +0 -736
  227. package/docs/design/mocks/world/organic-cards/landing.html +0 -420
  228. package/docs/design/mocks/world/organic-cards/status.html +0 -458
  229. package/docs/design/mocks/world/world-sheet.html +0 -156
@@ -1,646 +0,0 @@
1
- <!doctype html>
2
- <html lang="en" data-mode="dark" data-theme="dark">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <title>Task detail, the hall in the world, v2 "the sheet" (task 1003302)</title>
7
- <link rel="icon" href="data:,">
8
- <link rel="preconnect" href="https://fonts.googleapis.com">
9
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400&family=Manrope:wght@300;400;500;600&display=swap">
11
- <link rel="stylesheet" href="../_tokens.css">
12
- <style>
13
- body{
14
- /* the composition tokens for THIS version live here, on body, never on :root. v2 is the owner's light
15
- reference brought into the chrome world: content sits on bg-card SHEETS with a rule-soft hairline
16
- edge and radius-sm corners, on the bg ground. No shadow: a sheet is separated by tone and a
17
- hairline, never by lift. */
18
- --shell-pad:22px;
19
- --gutter:26px;
20
- --content-w:1180px;
21
- --sheet-pad:22px;
22
- --sheet-gap:14px;
23
- --side-w:336px;
24
- --drawer-w:284px;
25
- --nav-h:36px;
26
- margin:0;
27
- background:var(--bg);
28
- color:var(--ink);
29
- font-family:var(--font-body);
30
- font-size:16px;
31
- line-height:1.5;
32
- -webkit-font-smoothing:antialiased;
33
- }
34
- *{box-sizing:border-box;}
35
-
36
- /* ── the skip link ── */
37
- .skip{position:fixed;left:14px;top:-80px;z-index:200;display:inline-flex;align-items:center;min-height:38px;padding:0 18px;border-radius:var(--radius-pill);background:var(--bg-card);border:1px solid var(--rule);color:var(--ink);font-size:14px;text-decoration:none;transition:top 200ms cubic-bezier(.2,.7,.3,1);}
38
- .skip:focus{top:10px;}
39
-
40
- /* ── focus: one two tone ring, everywhere ── */
41
- a:focus-visible,button:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--focus);outline-offset:3px;box-shadow:0 0 0 8px var(--bg);border-radius:4px;}
42
- #main:focus,#main:focus-visible{outline:none;}
43
- body[data-state="focus"] .is-focus{outline:2px solid var(--focus);outline-offset:3px;box-shadow:0 0 0 8px var(--bg);border-radius:4px;}
44
-
45
- /* ══ the shell ══ */
46
- .app-scrim{display:none;position:fixed;inset:0;z-index:var(--z-scrim);background:rgba(0,0,0,.55);}
47
-
48
- .app-sidebar{position:fixed;left:0;top:0;bottom:0;width:var(--sidebar-w);z-index:var(--z-sidebar);display:flex;flex-direction:column;background:var(--bg-frame);border-right:1px solid var(--rule-soft);overflow:hidden;transition:transform 260ms cubic-bezier(.2,.7,.3,1);}
49
- .app-sidebar__brand{flex:none;height:var(--topbar-h);display:flex;align-items:center;padding:0 14px;}
50
- .brand-mark{display:flex;align-items:center;gap:10px;min-height:38px;min-width:40px;padding:0 8px;text-decoration:none;color:var(--ink);}
51
- .brand-mark__dot{width:9px;height:9px;border-radius:999px;border:1px solid var(--ink);flex:none;}
52
- .brand-mark__name{font-weight:500;font-size:15px;letter-spacing:-.015em;white-space:nowrap;}
53
- .app-sidebar__nav{flex:1;min-height:0;overflow-y:auto;padding:6px 12px 14px;}
54
- .nav-group{padding:0 0 14px;}
55
- .nav-group__head{display:flex;align-items:center;justify-content:space-between;width:100%;min-height:28px;padding:6px 8px;margin-bottom:2px;background:none;border:0;cursor:pointer;color:var(--ink-faint);font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;}
56
- .nav-group__chevron{width:10px;height:6px;stroke:currentColor;fill:none;stroke-width:1.4;flex:none;}
57
- .nav-item{display:flex;align-items:center;gap:11px;min-height:var(--nav-h);padding:0 12px;border-radius:var(--radius-sm);border-left:2px solid transparent;color:var(--ink-soft);text-decoration:none;font-size:14.5px;text-transform:lowercase;}
58
- .nav-item__label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
59
- .nav-icon{width:16px;height:16px;flex:none;stroke:currentColor;fill:none;stroke-width:1.35;stroke-linecap:round;stroke-linejoin:round;}
60
- .nav-item:hover{color:var(--ink);background:var(--bg-card);}
61
- .nav-item--active{color:var(--ink);background:var(--bg-card);border-left-color:var(--accent);border-radius:0 var(--radius-sm) var(--radius-sm) 0;}
62
- /* hall-1's pinned identity card at the sidebar's foot */
63
- .app-sidebar__foot{flex:none;padding:10px 12px 14px;}
64
- .identity{display:flex;align-items:center;gap:5px;padding:7px;background:var(--bg-card);border:1px solid var(--rule-soft);border-radius:var(--radius-sm);}
65
- .shell-user{flex:1;min-width:0;display:flex;align-items:center;gap:9px;min-height:40px;text-decoration:none;color:var(--ink);}
66
- .shell-user__avatar{width:25px;height:25px;border-radius:999px;flex:none;background:var(--bg-deep);border:1px solid var(--rule);}
67
- .shell-user__meta{display:grid;min-width:0;}
68
- .shell-user__name{font-size:13px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
69
- .shell-user__rank{font-family:var(--label-face);font-size:10.5px;letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);}
70
- .shell-home,.shell-signout{display:inline-flex;align-items:center;justify-content:center;width:27px;height:28px;flex:none;color:var(--ink-faint);text-decoration:none;}
71
- .shell-home:hover,.shell-signout:hover{color:var(--ink);}
72
- .shell-home svg,.shell-signout svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.35;stroke-linecap:round;stroke-linejoin:round;}
73
-
74
- .app-topbar{position:fixed;top:0;left:var(--sidebar-w);right:0;height:var(--topbar-h);z-index:var(--z-topbar);display:flex;align-items:center;gap:14px;padding:0 var(--shell-pad);background:var(--bg);border-bottom:1px solid var(--rule-soft);}
75
- .topbar-menu{display:none;align-items:center;justify-content:center;width:36px;height:36px;margin-left:-6px;background:none;border:0;color:var(--ink);cursor:pointer;}
76
- .topbar-menu svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round;}
77
- .topbar-title{margin:0;font-family:var(--font-display);font-weight:300;font-size:21px;letter-spacing:-.03em;text-transform:lowercase;color:var(--ink);}
78
- .topbar-side{margin-left:auto;display:flex;align-items:center;gap:10px;}
79
- .topbar-note{font-family:var(--font-mono);font-size:12px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
80
- .topbar-jump{display:inline-flex;align-items:center;gap:9px;min-height:34px;padding:0 12px;background:var(--bg-card);border:1px solid var(--rule-soft);border-radius:var(--radius-pill);color:var(--ink-soft);cursor:pointer;font-family:var(--font-body);font-size:13.5px;text-transform:lowercase;}
81
- .topbar-jump:hover{border-color:var(--rule);color:var(--ink);}
82
- .topbar-jump__kbd{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-faint);border:1px solid var(--rule-soft);border-radius:4px;padding:1px 5px;}
83
- .topbar-jump__ic{display:none;width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round;}
84
- .zoom-toggle,.theme-toggle{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;background:none;border:0;color:var(--ink-faint);cursor:pointer;}
85
- .zoom-toggle:hover,.theme-toggle:hover{color:var(--ink);}
86
- .zoom-toggle svg,.theme-toggle svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.35;stroke-linecap:round;stroke-linejoin:round;}
87
-
88
- .app-content{margin-left:var(--sidebar-w);padding:var(--topbar-h) 0 0;min-height:100vh;}
89
- .wrap{max-width:var(--content-w);margin:0 auto;padding:20px var(--gutter) 76px;}
90
-
91
- /* ══ the sheet: tone and a hairline, never lift ══ */
92
- .sheet{background:var(--bg-card);border:1px solid var(--rule-soft);border-radius:var(--radius-sm);padding:var(--sheet-pad);}
93
- .sheet + .sheet{margin-top:var(--sheet-gap);}
94
-
95
- /* ══ the page ══ */
96
- .crumb{display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;padding:0 2px 12px;}
97
- .backlink{display:inline-flex;align-items:center;gap:7px;min-height:24px;padding:3px 0;color:var(--ink-soft);text-decoration:none;font-size:13.5px;text-transform:lowercase;}
98
- .backlink:hover{color:var(--ink);text-decoration:underline;}
99
- .backlink .ic{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round;}
100
- .crumbsub{margin:0;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);font-variant-numeric:tabular-nums;}
101
- .sE,.sX,.sL{display:none;}
102
-
103
- .kind{display:flex;align-items:center;gap:12px;margin:0 0 12px;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);}
104
- .pill{display:inline-flex;align-items:center;min-height:24px;padding:0 11px;border-radius:var(--radius-pill);border:1px solid var(--rule);font-family:var(--font-body);font-size:12.5px;font-weight:500;letter-spacing:0;text-transform:lowercase;color:var(--ink-soft);background:none;}
105
- .pill--ok{color:var(--ok);border-color:color-mix(in srgb, var(--ok) 42%, transparent);background:var(--ok-weak);}
106
- .pill--warn{color:var(--warn);border-color:color-mix(in srgb, var(--warn) 42%, transparent);background:var(--warn-weak);}
107
- .pill--danger{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 42%, transparent);background:var(--danger-weak);}
108
- .pill--info{color:var(--info);border-color:color-mix(in srgb, var(--info) 42%, transparent);background:var(--info-weak);}
109
- .pill--none{color:var(--ink-faint);}
110
- .pill--sm{min-height:22px;padding:0 9px;font-size:11.5px;}
111
-
112
- h1.recTitle{margin:0 0 14px;font-family:var(--font-display);font-weight:300;font-size:clamp(24px,2.6vw,34px);line-height:1.15;letter-spacing:-.03em;color:var(--ink);max-width:28ch;}
113
- .tid{font-family:var(--font-mono);font-size:.6em;letter-spacing:0;color:var(--ink-faint);font-variant-numeric:tabular-nums;margin-right:.45em;vertical-align:.12em;}
114
- .meta{margin:0 0 6px;font-size:14px;color:var(--ink-soft);font-variant-numeric:tabular-nums;}
115
- .meta b{font-weight:500;color:var(--ink);}
116
- .note{margin:0 0 6px;font-size:14px;color:var(--ink-soft);font-variant-numeric:tabular-nums;}
117
- .goalline{margin:14px 0 0;display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:14.5px;color:var(--ink-soft);}
118
- .goalline a{color:var(--ink);text-decoration:none;border-bottom:1px solid var(--rule);display:inline-block;padding:3px 0;min-height:24px;line-height:18px;}
119
- .goalline a:hover{border-bottom-color:var(--ink);}
120
- .chip{display:inline-flex;align-items:center;gap:7px;min-height:24px;padding:0 10px;border:1px solid var(--rule-soft);border-radius:var(--radius-pill);font-size:12.5px;color:var(--ink-soft);background:var(--bg-frame);}
121
- .chip i{font-style:normal;font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;color:var(--ink-faint);text-transform:lowercase;}
122
-
123
- /* the stat tile grid: hall-1's rhythm exactly. Mono label, big tabular figure, one quiet clause */
124
- .tiles{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sheet-gap);margin:var(--sheet-gap) 0 0;}
125
- .tile{background:var(--bg-card);border:1px solid var(--rule-soft);border-radius:var(--radius-sm);padding:18px var(--sheet-pad) 20px;}
126
- .tileL{display:block;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);margin-bottom:12px;}
127
- .tileV{display:block;font-family:var(--font-display);font-weight:300;font-size:clamp(28px,3vw,42px);line-height:1;letter-spacing:-.035em;color:var(--ink);font-variant-numeric:tabular-nums;margin-bottom:12px;}
128
- .tileV u{text-decoration:none;font-size:.4em;letter-spacing:0;color:var(--ink-faint);margin-left:.3em;font-family:var(--font-mono);}
129
- .tileS{display:inline-flex;align-items:center;min-height:22px;padding:0 9px;border:1px solid var(--rule-soft);border-radius:var(--radius-pill);font-size:11.5px;color:var(--ink-faint);background:var(--bg-frame);}
130
-
131
- /* the two column body: the record on the left, the facts rail on the right */
132
- .cols{display:grid;grid-template-columns:minmax(0,1fr) var(--side-w);gap:var(--sheet-gap);margin-top:var(--sheet-gap);align-items:start;}
133
- .side{position:sticky;top:calc(var(--topbar-h) + 20px);}
134
-
135
- .secH{display:flex;align-items:baseline;gap:12px;margin:0 0 12px;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);}
136
- .secH em{font-style:normal;font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;text-transform:lowercase;color:var(--ink-faint);border:1px solid var(--rule-soft);border-radius:var(--radius-pill);padding:2px 8px;}
137
- .body{font-size:15.5px;line-height:1.55;color:var(--ink-soft);max-width:68ch;margin:0;}
138
- .body b{font-weight:500;color:var(--ink);}
139
- .desc{font-size:15.5px;line-height:1.6;color:var(--ink-soft);max-width:68ch;white-space:pre-wrap;margin:0;}
140
-
141
- .fileList{list-style:none;margin:0;padding:0;}
142
- .fileList li{border-top:1px solid var(--rule-soft);padding:11px 0;font-family:var(--font-mono);font-size:13px;color:var(--ink-soft);overflow-wrap:anywhere;}
143
- .fileList li:first-child{border-top:0;padding-top:0;}
144
-
145
- .depList{list-style:none;margin:0;padding:0;}
146
- .depList li{display:flex;align-items:center;gap:14px;flex-wrap:wrap;border-top:1px solid var(--rule-soft);padding:12px 0;}
147
- .depList li:first-child{border-top:0;padding-top:0;}
148
- .dep{display:inline-flex;align-items:baseline;gap:11px;min-height:24px;padding:2px 0;color:var(--ink);text-decoration:none;font-size:15px;flex:1;min-width:0;}
149
- .dep:hover{text-decoration:underline;}
150
- .dep b{font-family:var(--font-mono);font-size:12.5px;font-weight:400;color:var(--ink-faint);font-variant-numeric:tabular-nums;flex:none;}
151
-
152
- .ledger{display:grid;}
153
- .lrow{display:grid;grid-template-columns:118px minmax(0,1fr);gap:16px;border-top:1px solid var(--rule-soft);padding:10px 0;align-items:baseline;}
154
- .lrow:first-child{border-top:0;padding-top:0;}
155
- .lk{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);}
156
- .lv{font-size:14.5px;color:var(--ink);font-variant-numeric:tabular-nums;overflow-wrap:anywhere;}
157
- .lv.soft{color:var(--ink-soft);}
158
-
159
- .actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
160
- .btn{display:inline-flex;align-items:center;justify-content:center;min-height:42px;padding:0 20px;border:1px solid var(--rule);border-radius:var(--radius-pill);background:none;color:var(--ink);font-family:var(--font-body);font-size:14.5px;text-transform:lowercase;text-decoration:none;cursor:pointer;}
161
- .btn:hover{border-color:var(--ink-faint);}
162
- .btn--primary{background:var(--accent);border-color:var(--accent);color:var(--accent-on);font-weight:500;}
163
- .btn--primary:hover{background:var(--accent-lift);border-color:var(--accent-lift);}
164
- .actNote{margin:0 0 14px;font-size:14px;color:var(--ink-soft);}
165
-
166
- /* the proposed regions: a dashed edge and a mono eyebrow, so what is net new reads instantly */
167
- .proposed{border-style:dashed;}
168
- .axes{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sheet-gap);}
169
- .axis{background:var(--bg-frame);border:1px solid var(--rule-soft);border-radius:var(--radius-sm);padding:14px 16px 16px;}
170
- .axisN{display:block;font-family:var(--font-mono);font-size:12px;color:var(--ink-soft);margin-bottom:10px;}
171
- .scoreRow{display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;margin:18px 0 0;}
172
- .scoreV{font-family:var(--font-display);font-weight:300;font-size:clamp(30px,3.4vw,44px);line-height:1;letter-spacing:-.035em;color:var(--ink);font-variant-numeric:tabular-nums;}
173
- .scoreV u{text-decoration:none;font-size:.36em;color:var(--ink-faint);font-family:var(--font-mono);margin-left:.3em;}
174
-
175
- /* ══ the states ══ */
176
- .onlyLoading,.onlyEmpty,.onlyError{display:none;}
177
- body[data-state="loading"] .rec,body[data-state="empty"] .rec,body[data-state="error"] .rec{display:none;}
178
- body[data-state="loading"] .onlyLoading{display:block;}
179
- body[data-state="empty"] .onlyEmpty{display:block;}
180
- body[data-state="error"] .onlyError{display:block;}
181
- body[data-state="loading"] .sP,body[data-state="empty"] .sP,body[data-state="error"] .sP{display:none;}
182
- body[data-state="loading"] .sL{display:inline;}
183
- body[data-state="empty"] .sE{display:inline;}
184
- body[data-state="error"] .sX{display:inline;}
185
-
186
- /* the skeleton tone has to survive BOTH modes: --bg-deep collapses to pure black in dark,
187
- which made the whole loading state invisible on the black ground. */
188
- .sk{background:color-mix(in srgb, var(--ink) 10%, var(--bg-card));border-radius:4px;}
189
- .skEyebrow{width:150px;height:14px;margin-bottom:16px;}
190
- .skTitle{width:min(100%,620px);height:30px;margin-bottom:10px;}
191
- .skTitle2{width:min(74%,460px);height:30px;margin-bottom:18px;}
192
- .skMeta{width:min(86%,520px);height:14px;margin-bottom:8px;}
193
- .skMeta2{width:min(50%,290px);height:14px;}
194
- .skTileL{width:70px;height:11px;margin-bottom:14px;}
195
- .skTileV{width:82px;height:34px;margin-bottom:14px;}
196
- .skTileS{width:64px;height:20px;border-radius:999px;}
197
- .skSecH{width:110px;height:11px;margin-bottom:16px;}
198
- .skLine{height:13px;margin-bottom:9px;}
199
- .skVisual{margin-top:14px;height:180px;border-radius:var(--radius-sm);}
200
-
201
- .bigLine{margin:0 0 12px;font-family:var(--font-display);font-weight:300;font-size:clamp(23px,2.4vw,31px);line-height:1.16;letter-spacing:-.03em;color:var(--ink);}
202
-
203
- /* rail: the sidebar collapses to its 64px icon rail */
204
- body[data-state="rail"]{--sidebar-w:var(--sidebar-w-rail);}
205
- body[data-state="rail"] .nav-item__label,body[data-state="rail"] .nav-group__head,body[data-state="rail"] .brand-mark__name,body[data-state="rail"] .shell-user__meta{display:none;}
206
- body[data-state="rail"] .nav-item{justify-content:center;padding:0 8px;}
207
- body[data-state="rail"] .app-sidebar__nav{padding:6px 8px 14px;}
208
- body[data-state="rail"] .identity{flex-direction:column;gap:2px;padding:6px 4px;}
209
- body[data-state="rail"] .shell-user{flex:none;justify-content:center;}
210
- body[data-state="rail"] .brand-mark{justify-content:center;padding:0;}
211
- body[data-state="rail"] .app-sidebar__foot{padding:8px 8px 12px;}
212
-
213
- /* drawer: the mobile panel open over a scrim */
214
- body[data-state="drawer"]{--sidebar-w:0px;}
215
- body[data-state="drawer"] .app-sidebar{width:var(--drawer-w);transform:none;z-index:var(--z-drawer);border-right:1px solid var(--rule);}
216
- body[data-state="drawer"] .app-scrim{display:block;}
217
- body[data-state="drawer"] .topbar-menu{display:inline-flex;}
218
- body[data-state="drawer"] .wrap{max-width:640px;}
219
- body[data-state="drawer"] .cols{grid-template-columns:minmax(0,1fr);}
220
- body[data-state="drawer"] .side{position:static;}
221
- body[data-state="drawer"] .tiles{grid-template-columns:repeat(2,1fr);}
222
- body[data-state="drawer"] .axes{grid-template-columns:repeat(2,1fr);}
223
-
224
- @media (max-width:1240px){
225
- body{--side-w:300px;}
226
- }
227
- @media (max-width:1024px){
228
- .nav-item__label,.nav-group__head,.brand-mark__name,.shell-user__meta{display:none;}
229
- .nav-item{justify-content:center;padding:0 8px;}
230
- .app-sidebar__nav{padding:6px 8px 14px;}
231
- .identity{flex-direction:column;gap:2px;padding:6px 4px;}
232
- .shell-user{flex:none;justify-content:center;}
233
- .brand-mark{justify-content:center;padding:0;}
234
- .topbar-note{display:none;}
235
- .cols{grid-template-columns:minmax(0,1fr);}
236
- .side{position:static;}
237
- }
238
- @media (max-width:900px){
239
- body{--gutter:20px;--shell-pad:16px;--sheet-pad:18px;}
240
- .app-sidebar{width:var(--drawer-w);transform:translateX(-100%);}
241
- .app-topbar{left:0;}
242
- .app-content{margin-left:0;}
243
- .topbar-menu{display:inline-flex;}
244
- .topbar-jump__label,.topbar-jump__kbd{display:none;}
245
- .topbar-jump__ic{display:block;}
246
- .topbar-jump{padding:0;width:34px;justify-content:center;}
247
- body[data-state="drawer"] .nav-item__label,body[data-state="drawer"] .nav-group__head,body[data-state="drawer"] .brand-mark__name,body[data-state="drawer"] .shell-user__meta{display:block;}
248
- body[data-state="drawer"] .nav-item{justify-content:flex-start;padding:0 12px;}
249
- body[data-state="drawer"] .identity{flex-direction:row;gap:8px;padding:8px;}
250
- body[data-state="drawer"] .shell-user{flex:1;justify-content:flex-start;}
251
- body[data-state="drawer"] .brand-mark{justify-content:flex-start;padding:0 8px;}
252
- .tiles{grid-template-columns:repeat(2,1fr);}
253
- .axes{grid-template-columns:repeat(2,1fr);}
254
- h1.recTitle{max-width:none;}
255
- .lrow{grid-template-columns:1fr;gap:3px;}
256
- }
257
- @media (max-width:520px){
258
- .tiles{grid-template-columns:1fr;}
259
- .axes{grid-template-columns:1fr;}
260
- }
261
- </style>
262
- <script>
263
- (function(){try{var q=new URLSearchParams(location.search||location.hash.slice(1)||'').get('mode');
264
- var m=(q==='light'||q==='dark')?q:'dark';
265
- document.documentElement.setAttribute('data-mode',m);
266
- document.documentElement.setAttribute('data-theme',m);}catch(e){}})();
267
- </script>
268
- </head>
269
- <body class="mock" data-state="populated">
270
- <!--
271
- Task detail in the chrome world, v2 "the sheet" (task 1003302, goal 1000081).
272
- THESIS a task record is an application surface, so it gets containers: bg-card sheets edged with one rule-soft hairline and radius-sm corners, separated by tone and never by lift, with the four ledger numbers promoted into a real stat tile grid in hall-1's rhythm.
273
- COMPOSITION first viewport at 1440: the back link, then a header sheet holding the TASK eyebrow, the status pill, the title, the meta line and the goal chip; under it four tiles (credits, estimated, actual, priority) each with a mono label, a big tabular figure and one quiet clause; then a two column body where the left column is the record (value, description, touches, blocked by, blocks) and the right is a sticky facts rail (claim, shipped, actions). Grade and session log close the page full width.
274
- LIGHT this version IS the owner's light reference, so light is where it is happiest: the sheets read as paper cards on a slightly darker paper ground and the mono labels turn crisp. In dark the sheet is a 16 point lift off pure black, which is the whole separation, so its hairline has to carry the edge.
275
- RISK it bends DESIGN.md's "hairlines, not containers": twenty two sheets is twenty two boxes on a page whose world says there are none. Defensible because this is an Operate surface and not a poster, but it is a real deviation and the owner should see it named. It also spends the vertical space the lifecycle rail would have taken, so v2 is the version with NO rail and only a status pill: compare it against v1 and v3 to judge whether the rail earns its keep. Regions 15 and 16 (grade, session log) do NOT exist on the shipped page and carry a "proposed" eyebrow; region 9 (the ship visual) draws nothing because task 1003322 shipped without one.
276
- ?state=populated the page with real data
277
- ?state=loading skeletons in the SHAPE of the final content
278
- ?state=empty a real URL for a task that does not exist
279
- ?state=error the feed failed
280
- ?state=rail the sidebar collapsed to its 64px rail
281
- ?state=drawer the mobile drawer open
282
- ?state=focus keyboard focus rings on the page's real controls
283
- -->
284
-
285
- <a class="skip" href="#main">Skip to content</a>
286
-
287
- <div class="app-scrim" id="app-scrim"></div>
288
-
289
- <div class="app-sidebar" id="app-sidebar">
290
- <div class="app-sidebar__brand">
291
- <a class="brand-mark" href="/" id="brand-mark">
292
- <span class="brand-mark__dot"></span><span class="brand-mark__name">Cloud Bongos</span></a>
293
- </div>
294
- <nav class="app-sidebar__nav" aria-label="Primary">
295
- <div class="nav-group">
296
- <a class="nav-item" id="nav-home" href="/" data-gate="always">
297
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.2 6.8 8 2.2l5.8 4.6V13H2.2z"/><path d="M6.4 13V9.4h3.2V13"/></svg>
298
- <span class="nav-item__label">Home</span></a>
299
- <a class="nav-item" id="nav-roadmap" href="/roadmap" data-gate="always">
300
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.4 4h11.2M2.4 8h7.4M2.4 12h4.6"/></svg>
301
- <span class="nav-item__label">Roadmap</span></a>
302
- <a class="nav-item" id="nav-goals" href="/goals" data-gate="always">
303
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.8"/><circle cx="8" cy="8" r="2.3"/></svg>
304
- <span class="nav-item__label">Goals</span></a>
305
- <a class="nav-item nav-item--active" id="nav-work" href="/work" data-gate="always" aria-current="page">
306
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><rect x="2.6" y="2.6" width="10.8" height="10.8" rx="1.4"/><path d="M5.4 8.2 7.2 10l3.4-4"/></svg>
307
- <span class="nav-item__label">Tasks</span></a>
308
- <a class="nav-item" id="nav-ideas" href="/ideas" data-gate="always">
309
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M5.6 9.6A4 4 0 1 1 10.4 9.6V11h-4.8z"/><path d="M6.6 13.4h2.8"/></svg>
310
- <span class="nav-item__label">Ideas</span></a>
311
- <a class="nav-item" id="nav-copy-desk" href="/copy-desk" data-gate="always">
312
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M5.2 2.6h5.6v2.8H5.2z"/><rect x="3" y="5.4" width="10" height="8" rx="1.2"/></svg>
313
- <span class="nav-item__label">Copy desk</span></a>
314
- </div>
315
- <div class="nav-group nav-group--collapsible" data-group="you">
316
- <button class="nav-group__head" data-gate="signed" data-group="you" aria-expanded="true" aria-controls="nav-group-you">
317
- <span class="nav-group__head-label">You</span>
318
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4 5 5 9 1.4"/></svg></button>
319
- <div class="nav-group__items" id="nav-group-you">
320
- <a class="nav-item" id="nav-standing" href="/#standing" data-gate="signed">
321
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M3.2 13V8.4M8 13V3.4M12.8 13V6.4"/></svg>
322
- <span class="nav-item__label">Standing</span></a>
323
- <a class="nav-item" id="nav-profile" href="/profile" data-gate="signed">
324
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="5.4" r="2.6"/><path d="M3 13.4c.8-2.2 2.6-3.3 5-3.3s4.2 1.1 5 3.3"/></svg>
325
- <span class="nav-item__label">Profile</span></a>
326
- </div>
327
- </div>
328
- <div class="nav-group nav-group--collapsible" data-group="community">
329
- <button class="nav-group__head" data-gate="signed" data-group="community" aria-expanded="true" aria-controls="nav-group-community">
330
- <span class="nav-group__head-label">Community</span>
331
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4 5 5 9 1.4"/></svg></button>
332
- <div class="nav-group__items" id="nav-group-community">
333
- <a class="nav-item" id="nav-collab" href="/collab" data-gate="signed">
334
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="5.8" cy="5.4" r="2.2"/><circle cx="11" cy="6" r="1.7"/><path d="M2 13c.6-2 1.9-3 3.8-3s3.2 1 3.8 3"/></svg>
335
- <span class="nav-item__label">Collab</span></a>
336
- <a class="nav-item" id="nav-leaderboard" href="/#leaderboard" data-gate="signed">
337
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M5.2 2.6h5.6v3a2.8 2.8 0 0 1-5.6 0z"/><path d="M8 8.4v2.8M5.6 13.4h4.8"/></svg>
338
- <span class="nav-item__label">Leaderboard</span></a>
339
- <a class="nav-item" id="nav-people" href="/people" data-gate="signed">
340
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="5.6" cy="5.4" r="2.2"/><path d="M1.8 13c.5-2 1.9-3 3.8-3s3.3 1 3.8 3"/><path d="M11 3.4a2.2 2.2 0 0 1 0 4M11.6 10.3c1.5.3 2.4 1.2 2.8 2.7"/></svg>
341
- <span class="nav-item__label">People</span></a>
342
- </div>
343
- </div>
344
- <div class="nav-group nav-group--collapsible" data-group="docs">
345
- <button class="nav-group__head" data-gate="signed" data-group="docs" aria-expanded="true" aria-controls="nav-group-docs">
346
- <span class="nav-group__head-label">Docs</span>
347
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4 5 5 9 1.4"/></svg></button>
348
- <div class="nav-group__items" id="nav-group-docs">
349
- <a class="nav-item" id="nav-primer" href="/primer" data-gate="signed">
350
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.6 3h3.6A1.8 1.8 0 0 1 8 4.8v8a1.5 1.5 0 0 0-1.4-1.2H2.6z"/><path d="M13.4 3H9.8A1.8 1.8 0 0 0 8 4.8v8a1.5 1.5 0 0 1 1.4-1.2h4z"/></svg>
351
- <span class="nav-item__label">Primer</span></a>
352
- <a class="nav-item" id="nav-ranks" href="/ranks" data-gate="signed">
353
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M8 2.4 9.7 5.9l3.9.6-2.8 2.7.7 3.8L8 11.2 4.5 13l.7-3.8-2.8-2.7 3.9-.6z"/></svg>
354
- <span class="nav-item__label">Ranks</span></a>
355
- <a class="nav-item" id="nav-economy" href="/drachmae" data-gate="signed">
356
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.8"/><path d="M9.8 6.1a2.1 2.1 0 1 0-2.6 3.1h2.4"/></svg>
357
- <span class="nav-item__label">Economy</span></a>
358
- <a class="nav-item" id="nav-diagrams" href="/diagrams" data-gate="signed">
359
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><rect x="2.4" y="2.4" width="4.2" height="4.2" rx="1"/><rect x="9.4" y="9.4" width="4.2" height="4.2" rx="1"/><path d="M6.6 4.5h4.9v4.9"/></svg>
360
- <span class="nav-item__label">Diagrams</span></a>
361
- <a class="nav-item" id="nav-atlas" href="/atlas" data-gate="signed">
362
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.8"/><path d="M2.3 8h11.4"/><path d="M8 2.3c1.7 1.7 2.6 3.7 2.6 5.7S9.7 12 8 13.7C6.3 12 5.4 10 5.4 8s.9-4 2.6-5.7z"/></svg>
363
- <span class="nav-item__label">Repo Atlas</span></a>
364
- <a class="nav-item" id="nav-modules" href="/modules" data-gate="signed">
365
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2.6 5.4 8 2.6l5.4 2.8L8 8.2z"/><path d="M2.6 5.4v5.2L8 13.4l5.4-2.8V5.4"/></svg>
366
- <span class="nav-item__label">Modules</span></a>
367
- <a class="nav-item" id="nav-apidocs" href="/docs" data-gate="signed">
368
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M6 4.6 2.9 8 6 11.4M10 4.6 13.1 8 10 11.4"/></svg>
369
- <span class="nav-item__label">API docs</span></a>
370
- </div>
371
- </div>
372
- <div class="nav-group nav-group--collapsible" data-group="government">
373
- <button class="nav-group__head" data-gate="signed" data-group="government" aria-expanded="true" aria-controls="nav-group-government">
374
- <span class="nav-group__head-label">Government</span>
375
- <svg class="nav-group__chevron" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1.4 5 5 9 1.4"/></svg></button>
376
- <div class="nav-group__items" id="nav-group-government">
377
- <a class="nav-item" id="nav-watch" href="/watch" data-gate="signed">
378
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M1.9 8S4 4.3 8 4.3 14.1 8 14.1 8 12 11.7 8 11.7 1.9 8 1.9 8z"/><circle cx="8" cy="8" r="1.7"/></svg>
379
- <span class="nav-item__label">Watch</span></a>
380
- <a class="nav-item" id="nav-harbor" href="/harbor" data-gate="signed">
381
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="3.9" r="1.4"/><path d="M8 5.4v8M5.2 8h5.6"/><path d="M2.6 10c.4 2 2.6 3.3 5.4 3.3S13 12 13.4 10"/></svg>
382
- <span class="nav-item__label">Harbor</span></a>
383
- <a class="nav-item" id="nav-gate" href="/gate" data-gate="signed">
384
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M3 13.4V5.8L8 2.6l5 3.2v7.6"/><path d="M6.4 13.4V9.2h3.2v4.2"/></svg>
385
- <span class="nav-item__label">Gate</span></a>
386
- <a class="nav-item" id="nav-sessions" href="/sessions" data-gate="signed">
387
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.8"/><path d="M8 4.8V8l2.2 1.5"/></svg>
388
- <span class="nav-item__label">Sessions</span></a>
389
- <a class="nav-item" id="nav-government" href="/government" data-gate="signed">
390
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M8 2.3l5 1.9v3.6c0 3-2.1 5.3-5 6.1-2.9-.8-5-3.1-5-6.1V4.2z"/></svg>
391
- <span class="nav-item__label">Permissions</span></a>
392
- </div>
393
- </div>
394
- </nav>
395
- <div class="app-sidebar__foot">
396
- <div class="identity">
397
- <a class="shell-user" id="shell-user" href="/settings" title="Settings">
398
- <span class="shell-user__avatar"></span>
399
- <span class="shell-user__meta">
400
- <span class="shell-user__name">Percy Jackson</span>
401
- <span class="shell-user__rank">Owner</span></span></a>
402
- <a class="shell-home" href="/" title="Back to Cloud Bongos">
403
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2.2 6.8 8 2.2l5.8 4.6V13H2.2z"/></svg></a>
404
- <a class="shell-signout" href="/api/bongos/auth/logout" title="Sign out">
405
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M6.4 3H3.2v10h3.2"/><path d="M9.8 5.5 12.3 8l-2.5 2.5M12.3 8H6.6"/></svg></a>
406
- </div>
407
- </div>
408
- </div>
409
-
410
- <header class="app-topbar" id="app-topbar">
411
- <button class="topbar-menu" id="topbar-menu" aria-label="Open navigation" aria-expanded="false" aria-controls="app-sidebar">
412
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 4.5h11M2.5 8h11M2.5 11.5h11"/></svg></button>
413
- <h2 class="topbar-title">Tasks</h2>
414
- <div class="topbar-side">
415
- <span class="topbar-note">BONGOS-V1</span>
416
- <button class="topbar-jump is-focus" id="topbar-jump" aria-label="Jump to a page or record">
417
- <svg class="topbar-jump__ic" viewBox="0 0 16 16" aria-hidden="true"><circle cx="7.2" cy="7.2" r="4.6"/><path d="M10.6 10.6 13.6 13.6"/></svg>
418
- <span class="topbar-jump__label">Jump to</span><kbd class="topbar-jump__kbd">Ctrl K</kbd></button>
419
- <button class="zoom-toggle" aria-label="Text size">
420
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M1.8 12.6 5.3 3.6l3.5 9M3 10h4.6M10.6 12.6V7M9 8.6h3.4"/></svg></button>
421
- <button class="theme-toggle" aria-label="Switch theme">
422
- <svg viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="8" r="5.6"/><path d="M8 2.4v11.2"/></svg></button>
423
- </div>
424
- </header>
425
-
426
- <main class="app-content" id="main" tabindex="-1">
427
- <div class="wrap">
428
-
429
- <!-- region 1: the way back, and the sub line -->
430
- <div class="crumb">
431
- <a class="backlink is-focus" href="/work">
432
- <svg class="ic" viewBox="0 0 16 16" aria-hidden="true"><path d="M9.4 3.6 5 8l4.4 4.4"/><path d="M5 8h7.2"/></svg>Back to Tasks</a>
433
- <p class="crumbsub"><span class="sP">Task 1003322</span><span class="sL">Loading task</span><span class="sE">Not found</span><span class="sX">Could not load</span></p>
434
- </div>
435
-
436
- <!-- loading: the skeleton takes the shape of the final sheets, including the ship visual figure -->
437
- <div class="onlyLoading" aria-hidden="true">
438
- <div class="sheet">
439
- <div class="sk skEyebrow"></div>
440
- <div class="sk skTitle"></div>
441
- <div class="sk skTitle2"></div>
442
- <div class="sk skMeta"></div>
443
- <div class="sk skMeta2"></div>
444
- </div>
445
- <div class="tiles">
446
- <div class="tile"><div class="sk skTileL"></div><div class="sk skTileV"></div><div class="sk skTileS"></div></div>
447
- <div class="tile"><div class="sk skTileL"></div><div class="sk skTileV"></div><div class="sk skTileS"></div></div>
448
- <div class="tile"><div class="sk skTileL"></div><div class="sk skTileV"></div><div class="sk skTileS"></div></div>
449
- <div class="tile"><div class="sk skTileL"></div><div class="sk skTileV"></div><div class="sk skTileS"></div></div>
450
- </div>
451
- <div class="cols">
452
- <div>
453
- <div class="sheet"><div class="sk skSecH"></div>
454
- <div class="sk skLine" style="width:min(100%,600px)"></div>
455
- <div class="sk skLine" style="width:min(90%,540px)"></div>
456
- <div class="sk skVisual"></div>
457
- </div>
458
- <div class="sheet"><div class="sk skSecH"></div>
459
- <div class="sk skLine" style="width:100%"></div>
460
- <div class="sk skLine" style="width:96%"></div>
461
- <div class="sk skLine" style="width:68%"></div>
462
- </div>
463
- </div>
464
- <div>
465
- <div class="sheet"><div class="sk skSecH"></div>
466
- <div class="sk skLine" style="width:92%"></div>
467
- <div class="sk skLine" style="width:64%"></div>
468
- </div>
469
- <div class="sheet"><div class="sk skSecH"></div>
470
- <div class="sk skLine" style="width:86%"></div>
471
- <div class="sk skLine" style="width:56%"></div>
472
- </div>
473
- </div>
474
- </div>
475
- </div>
476
-
477
- <!-- empty: the honest task-not-found case, at a real URL for a task that does not exist -->
478
- <section class="onlyEmpty sheet">
479
- <p class="kind">TASK <span class="pill pill--none">no such task</span></p>
480
- <p class="bigLine">1003999, no such task</p>
481
- <p class="body">Tasks in the ledger are numbered separately from GitHub pull requests, so this may be a PR number rather than a task. The work board lists everything that does exist.</p>
482
- <div class="actions" style="margin-top:22px"><a class="btn" href="/work">Open the work board</a></div>
483
- </section>
484
-
485
- <!-- error: the feed failed. The record is untouched; only the read failed -->
486
- <section class="onlyError sheet">
487
- <p class="kind">TASK <span class="pill pill--danger">feed unavailable</span></p>
488
- <p class="bigLine">Could not load 1003322</p>
489
- <p class="body">The task feed did not answer. Nothing on the record has changed, only the read failed. Try again in a moment, or open the work board.</p>
490
- <div class="actions" style="margin-top:22px"><button class="btn" type="button">Try again</button><a class="btn" href="/work">Open the work board</a></div>
491
- </section>
492
-
493
- <article class="rec">
494
-
495
- <!-- regions 2 to 6: the header sheet -->
496
- <section class="sheet">
497
- <p class="kind">TASK <span class="pill pill--ok">shipped</span></p>
498
- <h1 class="recTitle"><span class="tid">1003322</span>Carve public-landing/ into modules/public-landing/: manifest, the apex-root web surface, the nested CLAUDE.md for a newcomer</h1>
499
- <p class="meta"><b>BONGOS-V1</b> &middot; feature &middot; engineer &middot; P1 &middot; min rank Trusted</p>
500
- <p class="note">Created 28 August 2026, 2 days ago.</p>
501
- <p class="goalline">Goal <a href="/goals#/goal/1000080">1000080, Apex UI pass 2</a> <span class="chip"><i>inherited</i>platform</span></p>
502
- </section>
503
-
504
- <!-- hall-1's rhythm: mono uppercase label, big tabular figure, one quiet clause -->
505
- <div class="tiles">
506
- <div class="tile"><span class="tileL">Credits</span><span class="tileV">60</span><span class="tileS">1 credit is 1 dollar</span></div>
507
- <div class="tile"><span class="tileL">Estimated</span><span class="tileV">240<u>m</u></span><span class="tileS">4 hours</span></div>
508
- <div class="tile"><span class="tileL">Actual</span><span class="tileV">37<u>m</u></span><span class="tileS">85% under</span></div>
509
- <div class="tile"><span class="tileL">Priority</span><span class="tileV">P1</span><span class="tileS">highest</span></div>
510
- </div>
511
-
512
- <div class="cols">
513
- <div>
514
- <!-- region 8 -->
515
- <section class="sheet">
516
- <p class="secH">Value</p>
517
- <p class="body">The front door is a module. <b>public-landing/</b> now lives at <b>modules/public-landing/</b>, the third web surface module after status-UI and hall-UI and the first that answers at the apex root instead of a subdomain. All five apex pages are byte identical as served, apart from the module's own entry in the injected module list.</p>
518
-
519
- <!-- region 9: the ship visual. Task 1003322 shipped without one, so NOTHING is drawn
520
- here. No placeholder, no empty frame, no "no visual" line. Its geometry is only
521
- visible in the loading skeleton above, which is the honest reading of the page. -->
522
- </section>
523
-
524
- <!-- region 10 -->
525
- <section class="sheet">
526
- <p class="secH">Description</p>
527
- <p class="desc">Carve public-landing/ into modules/public-landing/ so the front door is a module like status-UI and hall-UI.
528
-
529
- The loader's web surface seam speaks one language: a Host header prefix ("status.", "builders."), matched with host.startsWith(s.host). The apex root is not a prefix of anything, it is whatever is left once the subdomains are taken. So a surface names where it answers in exactly one of two ways, never both and never neither: { host: "status." } or { apexRoot: true }.
530
-
531
- An empty host string must be rejected. Every string starts with the empty string, so an empty prefix answers on builders. and status. too, and makes isModuleSurfaceHost() true for every request, which is the predicate eleven /builders guards use to decide to step aside. The hall would stop serving itself, silently, from a declaration that reads as correct.
532
-
533
- Ships with: the manifest, the apex-root web surface, a nested CLAUDE.md a newcomer can read, and an ADR. Prove byte identity by hashing the five apex pages as served, before and after.</p>
534
- </section>
535
-
536
- <!-- region 11 -->
537
- <section class="sheet">
538
- <p class="secH">Touches <em>8 files</em></p>
539
- <ul class="fileList">
540
- <li>modules/public-landing/</li>
541
- <li>src/bongos/module-loader.js</li>
542
- <li>src/bongos/platform-server.js</li>
543
- <li>src/bongos/serve-internal.js</li>
544
- <li>docs/adr/0218-the-apex-root-web-surface.md</li>
545
- <li>docs/architecture.md</li>
546
- <li>docs/file-map.md</li>
547
- <li>tests/fitness.mjs</li>
548
- </ul>
549
- </section>
550
-
551
- <!-- region 12: dependencies, both directions -->
552
- <section class="sheet">
553
- <p class="secH">Blocked by</p>
554
- <ul class="depList">
555
- <li><a class="dep" href="/task/1003298"><b>1003298</b>The landing is built in the chrome world, and the world becomes the token contract</a><span class="pill pill--sm pill--ok">shipped</span></li>
556
- <li><a class="dep" href="/task/1003301"><b>1003301</b>The hub's poster card: the room behind an orb</a><span class="pill pill--sm pill--ok">shipped</span></li>
557
- </ul>
558
- </section>
559
- <section class="sheet">
560
- <p class="secH">Blocks</p>
561
- <ul class="depList">
562
- <li><a class="dep" href="/task/1003302"><b>1003302</b>The builders' hall composition round: three versions of five archetypes</a><span class="pill pill--sm pill--warn">active</span></li>
563
- <li><a class="dep" href="/task/1003303"><b>1003303</b>Build the picked hall into modules/hall-ui/public/style.css</a><span class="pill pill--sm pill--danger">blocked</span></li>
564
- </ul>
565
- </section>
566
- </div>
567
-
568
- <div class="side">
569
- <!-- region 7: the claim. The API surfaces the most recent claim only, never the ledger -->
570
- <section class="sheet">
571
- <p class="secH">Claim</p>
572
- <div class="ledger">
573
- <div class="lrow"><span class="lk">Last held by</span><span class="lv">Percy Jackson</span></div>
574
- <div class="lrow"><span class="lk">Claimed</span><span class="lv">30 Aug 2026, 09:12</span></div>
575
- <div class="lrow"><span class="lk">State</span><span class="lv"><span class="pill pill--sm pill--ok">released, shipped</span></span></div>
576
- </div>
577
- </section>
578
-
579
- <!-- region 13 -->
580
- <section class="sheet">
581
- <p class="secH">Shipped</p>
582
- <div class="ledger">
583
- <div class="lrow"><span class="lk">When</span><span class="lv">30 Aug 2026, 2 hours ago</span></div>
584
- <div class="lrow"><span class="lk">By</span><span class="lv">Percy Jackson</span></div>
585
- </div>
586
- </section>
587
-
588
- <!-- region 14: the actions. A shipped task has no lifecycle control left, so the sheet
589
- carries an explanatory note and no accent door. That is the One Warm Thing Rule
590
- doing its job: nothing here is pressable-or-live, so nothing here is warm. -->
591
- <section class="sheet">
592
- <p class="secH">Actions</p>
593
- <p class="actNote">This task has shipped and its credits have landed. Neither Ship it nor Confirm is available.</p>
594
- <div class="actions">
595
- <button class="btn is-focus" type="button" id="copy-prompt-btn">Copy prompt</button>
596
- <a class="btn is-focus" href="/work">Open the work board</a>
597
- </div>
598
- </section>
599
- </div>
600
- </div>
601
-
602
- <!-- region 15: PROPOSED. There is no grade panel on the shipped page. Grades live on
603
- Standing (#recent-grades). This round asks for the task's own grade to sit here. -->
604
- <section class="sheet proposed" style="margin-top:var(--sheet-gap)">
605
- <p class="secH">Grade <em>proposed</em></p>
606
- <p class="body" style="margin-bottom:18px">The adversarial panel of four workers. Every worker must independently report pass before confirmed becomes credits; one concerns falls the task through to the manual confirm path.</p>
607
- <div class="axes">
608
- <div class="axis"><span class="axisN">narc</span><span class="pill pill--sm pill--ok">pass</span></div>
609
- <div class="axis"><span class="axisN">quality</span><span class="pill pill--sm pill--ok">pass</span></div>
610
- <div class="axis"><span class="axisN">hacker</span><span class="pill pill--sm pill--ok">pass</span></div>
611
- <div class="axis"><span class="axisN">efficiency</span><span class="pill pill--sm pill--ok">pass</span></div>
612
- </div>
613
- <div class="scoreRow">
614
- <span class="scoreV">8.4<u>/10</u></span>
615
- <span class="pill pill--ok">verdict pass</span>
616
- <span class="crumbsub">threshold 6 &middot; panel v4.0 &middot; claude-sonnet-5</span>
617
- </div>
618
- </section>
619
-
620
- <!-- region 16: PROPOSED. There is no session log on the shipped page either. Session logs
621
- live on /sessions. This round asks for the session that shipped this task to sit here. -->
622
- <section class="sheet proposed">
623
- <p class="secH">Session log <em>proposed</em></p>
624
- <div class="ledger">
625
- <div class="lrow"><span class="lk">Session</span><span class="lv">30 August 2026, Percy Jackson, 37m</span></div>
626
- <div class="lrow"><span class="lk">Credits</span><span class="lv">60</span></div>
627
- <div class="lrow"><span class="lk">Handoff</span><span class="lv soft">Goal 1000080 is complete, 28 of 28 shipped. Three stale comments in src/bongos/ still name a file absorbed into the hub in task 1002763; they were stale before this diff.</span></div>
628
- <div class="lrow"><span class="lk">Full log</span><span class="lv"><a class="dep" href="/sessions" style="font-size:14.5px">Open in Sessions</a></span></div>
629
- </div>
630
- </section>
631
-
632
- </article>
633
- </div>
634
- </main>
635
-
636
- <script>
637
- /* the mock's state contract: read ?state= once and apply it. Nothing is built here, and no motion. */
638
- (function () {
639
- var ok = ['populated', 'loading', 'empty', 'error', 'rail', 'drawer', 'focus'];
640
- var s = new URLSearchParams(location.search || location.hash.slice(1) || '').get('state') || 'populated';
641
- if (ok.indexOf(s) === -1) s = 'populated';
642
- document.body.setAttribute('data-state', s);
643
- })();
644
- </script>
645
- </body>
646
- </html>