@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,633 +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, v1 "the ledger" (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. v1 is the world taken
15
- literally into Operate mode: no panels anywhere, hairline rules and rows directly on the page
16
- ground, section headings a mono label over a full width rule. */
17
- --shell-pad:22px;
18
- --gutter:26px;
19
- --content-w:960px;
20
- --row-y:15px;
21
- --band-y:22px;
22
- --drawer-w:284px;
23
- --nav-h:38px;
24
- margin:0;
25
- background:var(--bg);
26
- color:var(--ink);
27
- font-family:var(--font-body);
28
- font-size:16px;
29
- line-height:1.5;
30
- -webkit-font-smoothing:antialiased;
31
- }
32
- *{box-sizing:border-box;}
33
-
34
- /* ── the skip link ── */
35
- .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);}
36
- .skip:focus{top:10px;}
37
-
38
- /* ── focus: one two tone ring, everywhere ── */
39
- 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;}
40
- #main:focus{outline:none;}
41
- #main:focus-visible{outline:none;box-shadow:none;}
42
- 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;}
43
-
44
- /* ══ the shell ══ */
45
- .app-scrim{display:none;position:fixed;inset:0;z-index:var(--z-scrim);background:rgba(0,0,0,.55);}
46
-
47
- .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);border-right:1px solid var(--rule);overflow:hidden;transition:transform 260ms cubic-bezier(.2,.7,.3,1);}
48
- .app-sidebar__brand{flex:none;height:var(--topbar-h);display:flex;align-items:center;padding:0 12px;border-bottom:1px solid var(--rule);}
49
- .brand-mark{display:flex;align-items:center;gap:10px;min-height:38px;min-width:40px;padding:0 8px;text-decoration:none;color:var(--ink);}
50
- .brand-mark__dot{width:9px;height:9px;border-radius:999px;border:1px solid var(--ink);flex:none;}
51
- .brand-mark__name{font-weight:500;font-size:15px;letter-spacing:-.015em;white-space:nowrap;}
52
- .app-sidebar__nav{flex:1;min-height:0;overflow-y:auto;padding:10px 0 14px;}
53
- .nav-group{padding:0 0 10px;}
54
- .nav-group__head{display:flex;align-items:center;justify-content:space-between;width:100%;min-height:30px;padding:6px 20px 6px 18px;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;}
55
- .nav-group__chevron{width:10px;height:6px;stroke:currentColor;fill:none;stroke-width:1.4;flex:none;}
56
- .nav-item{display:flex;align-items:center;gap:11px;min-height:var(--nav-h);padding:0 16px 0 16px;border-left:2px solid transparent;color:var(--ink-soft);text-decoration:none;font-size:14.5px;text-transform:lowercase;border-top:1px solid var(--rule-soft);}
57
- .nav-group .nav-item:first-of-type{border-top:0;}
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);border-left-color:var(--rule);}
61
- .nav-item--active{color:var(--ink);border-left-color:var(--accent);}
62
- .app-sidebar__foot{flex:none;border-top:1px solid var(--rule);padding:10px 14px 12px;display:flex;align-items:center;gap:8px;}
63
- .shell-user{flex:1;min-width:0;display:flex;align-items:center;gap:10px;min-height:40px;text-decoration:none;color:var(--ink);}
64
- .shell-user__avatar{width:26px;height:26px;border-radius:999px;flex:none;background:var(--bg-deep);border:1px solid var(--rule);}
65
- .shell-user__meta{display:grid;min-width:0;}
66
- .shell-user__name{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
67
- .shell-user__rank{font-family:var(--label-face);font-size:10.5px;letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);}
68
- .shell-home,.shell-signout{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;flex:none;color:var(--ink-faint);text-decoration:none;}
69
- .shell-home:hover,.shell-signout:hover{color:var(--ink);}
70
- .shell-home svg,.shell-signout svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.35;stroke-linecap:round;stroke-linejoin:round;}
71
-
72
- .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);}
73
- .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;}
74
- .topbar-menu svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round;}
75
- .topbar-title{margin:0;font-family:var(--font-display);font-weight:300;font-size:21px;letter-spacing:-.03em;text-transform:lowercase;color:var(--ink);}
76
- .topbar-side{margin-left:auto;display:flex;align-items:center;gap:10px;}
77
- .topbar-note{font-family:var(--font-mono);font-size:12px;font-variant-numeric:tabular-nums;color:var(--ink-faint);}
78
- .topbar-jump{display:inline-flex;align-items:center;gap:9px;min-height:34px;padding:0 12px;background:none;border:1px solid var(--rule);border-radius:var(--radius-pill);color:var(--ink-soft);cursor:pointer;font-family:var(--font-body);font-size:13.5px;text-transform:lowercase;}
79
- .topbar-jump:hover{border-color:var(--ink-faint);color:var(--ink);}
80
- .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;}
81
- .topbar-jump__ic{display:none;width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round;}
82
- .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;}
83
- .zoom-toggle:hover,.theme-toggle:hover{color:var(--ink);}
84
- .zoom-toggle svg,.theme-toggle svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.35;stroke-linecap:round;stroke-linejoin:round;}
85
-
86
- .app-content{margin-left:var(--sidebar-w);padding:var(--topbar-h) 0 0;min-height:100vh;}
87
- .wrap{max-width:var(--content-w);margin:0 auto;padding:22px var(--gutter) 76px;}
88
-
89
- /* ══ the page ══ */
90
- .crumb{display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;padding-bottom:14px;}
91
- .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;}
92
- .backlink:hover{color:var(--ink);text-decoration:underline;}
93
- .backlink .ic{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round;}
94
- .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;}
95
- .sE,.sX,.sL{display:none;}
96
-
97
- /* the kind eyebrow and the status pill */
98
- .kind{display:flex;align-items:center;gap:12px;margin:0 0 10px;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);}
99
- .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;}
100
- .pill--ok{color:var(--ok);border-color:color-mix(in srgb, var(--ok) 42%, transparent);background:var(--ok-weak);}
101
- .pill--warn{color:var(--warn);border-color:color-mix(in srgb, var(--warn) 42%, transparent);background:var(--warn-weak);}
102
- .pill--danger{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 42%, transparent);background:var(--danger-weak);}
103
- .pill--info{color:var(--info);border-color:color-mix(in srgb, var(--info) 42%, transparent);background:var(--info-weak);}
104
- .pill--none{color:var(--ink-faint);}
105
- .pill--sm{min-height:22px;padding:0 9px;font-size:11.5px;}
106
-
107
- h1.recTitle{margin:0 0 14px;font-family:var(--font-display);font-weight:300;font-size:clamp(24px,2.5vw,33px);line-height:1.16;letter-spacing:-.03em;color:var(--ink);max-width:26ch;}
108
- .tid{font-family:var(--font-mono);font-size:.62em;letter-spacing:0;color:var(--ink-faint);font-variant-numeric:tabular-nums;margin-right:.45em;vertical-align:.12em;}
109
-
110
- .meta{margin:0 0 6px;font-size:14px;color:var(--ink-soft);font-variant-numeric:tabular-nums;}
111
- .meta b{font-weight:500;color:var(--ink);}
112
- .note{margin:0 0 6px;font-size:14px;color:var(--ink-soft);font-variant-numeric:tabular-nums;}
113
-
114
- .goalline{margin:12px 0 0;display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:14.5px;color:var(--ink-soft);}
115
- .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;}
116
- .goalline a:hover{border-bottom-color:var(--ink);}
117
- .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);}
118
- .chip i{font-style:normal;font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;color:var(--ink-faint);text-transform:lowercase;}
119
-
120
- /* v1: stat figures sit BARE on the page ground, rule-soft between */
121
- .figs{display:grid;grid-template-columns:repeat(4,1fr);margin:26px 0 0;border-top:1px solid var(--rule);}
122
- .fig{padding:16px 18px 18px 0;border-left:1px solid var(--rule-soft);padding-left:18px;}
123
- .fig:first-child{border-left:0;padding-left:0;}
124
- .figL{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:8px;}
125
- .figV{display:block;font-family:var(--font-display);font-weight:300;font-size:clamp(27px,3.2vw,42px);line-height:1;letter-spacing:-.035em;color:var(--ink);font-variant-numeric:tabular-nums;}
126
- .figV u{text-decoration:none;font-size:.42em;letter-spacing:0;color:var(--ink-faint);margin-left:.35em;font-family:var(--font-mono);}
127
-
128
- /* the lifecycle rail: five beats, exactly one lit */
129
- .rail{display:grid;grid-template-columns:repeat(5,1fr);gap:0;margin:30px 0 0;list-style:none;padding:0;}
130
- .step{border-top:1px solid var(--rule-soft);padding:14px 16px 0 0;}
131
- .stepDot{width:7px;height:7px;border-radius:999px;border:1px solid var(--ink-faint);margin-bottom:11px;}
132
- .stepN{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:4px;}
133
- .stepC{display:block;font-size:12.5px;line-height:1.35;color:var(--ink-faint);}
134
- .step[aria-current="step"]{border-top-color:var(--accent);}
135
- .step[aria-current="step"] .stepDot{background:var(--accent);border-color:var(--accent);}
136
- .step[aria-current="step"] .stepN{color:var(--ink);}
137
- .step[aria-current="step"] .stepC{color:var(--ink-soft);}
138
-
139
- /* v1's section: a mono label over a rule that runs the full content width */
140
- .sec{margin:30px 0 0;}
141
- .secH{display:flex;align-items:baseline;gap:12px;border-top:1px solid var(--rule);padding-top:9px;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);}
142
- .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;}
143
- .body{font-size:15.5px;line-height:1.55;color:var(--ink-soft);max-width:66ch;margin:0;}
144
- .body b{font-weight:500;color:var(--ink);}
145
- .desc{font-size:15.5px;line-height:1.6;color:var(--ink-soft);max-width:66ch;white-space:pre-wrap;margin:0;}
146
-
147
- .fileList{list-style:none;margin:0;padding:0;}
148
- .fileList li{border-top:1px solid var(--rule-soft);padding:var(--row-y) 0;font-family:var(--font-mono);font-size:13px;color:var(--ink-soft);overflow-wrap:anywhere;}
149
- .fileList li:first-child{border-top:0;padding-top:0;}
150
-
151
- .depList{list-style:none;margin:0;padding:0;}
152
- .depList li{display:flex;align-items:center;gap:14px;flex-wrap:wrap;border-top:1px solid var(--rule-soft);padding:var(--row-y) 0;}
153
- .depList li:first-child{border-top:0;padding-top:0;}
154
- .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;}
155
- .dep:hover{text-decoration:underline;}
156
- .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;}
157
-
158
- .ledger{display:grid;gap:0;}
159
- .lrow{display:grid;grid-template-columns:190px 1fr;gap:22px;border-top:1px solid var(--rule-soft);padding:12px 0;align-items:baseline;}
160
- .lrow:first-child{border-top:0;}
161
- .lk{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);}
162
- .lv{font-size:14.5px;color:var(--ink);font-variant-numeric:tabular-nums;}
163
- .lv.soft{color:var(--ink-soft);}
164
-
165
- .actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap;}
166
- .btn{display:inline-flex;align-items:center;justify-content:center;min-height:42px;padding:0 22px;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;}
167
- .btn:hover{border-color:var(--ink-faint);}
168
- .btn--primary{background:var(--accent);border-color:var(--accent);color:var(--accent-on);font-weight:500;}
169
- .btn--primary:hover{background:var(--accent-lift);border-color:var(--accent-lift);}
170
- .actNote{margin:0;font-size:14px;color:var(--ink-soft);flex:1;min-width:220px;}
171
-
172
- .axes{display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--rule-soft);}
173
- .axis{padding:14px 16px 16px 0;border-left:1px solid var(--rule-soft);padding-left:16px;}
174
- .axis:first-child{border-left:0;padding-left:0;}
175
- .axisN{display:block;font-family:var(--font-mono);font-size:12px;color:var(--ink-soft);margin-bottom:9px;}
176
- .scoreRow{display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;margin:20px 0 0;}
177
- .scoreV{font-family:var(--font-display);font-weight:300;font-size:clamp(30px,3.6vw,46px);line-height:1;letter-spacing:-.035em;color:var(--ink);font-variant-numeric:tabular-nums;}
178
- .scoreV u{text-decoration:none;font-size:.36em;color:var(--ink-faint);font-family:var(--font-mono);margin-left:.3em;}
179
-
180
- /* ══ the states ══ */
181
- .onlyLoading,.onlyEmpty,.onlyError{display:none;}
182
- body[data-state="loading"] .rec,body[data-state="empty"] .rec,body[data-state="error"] .rec{display:none;}
183
- body[data-state="loading"] .onlyLoading{display:block;}
184
- body[data-state="empty"] .onlyEmpty{display:block;}
185
- body[data-state="error"] .onlyError{display:block;}
186
- body[data-state="loading"] .sP,body[data-state="empty"] .sP,body[data-state="error"] .sP{display:none;}
187
- body[data-state="loading"] .sL{display:inline;}
188
- body[data-state="empty"] .sE{display:inline;}
189
- body[data-state="error"] .sX{display:inline;}
190
-
191
- /* loading: a skeleton in the SHAPE of the final page, not a spinner */
192
- /* the skeleton tone has to survive BOTH modes: --bg-deep collapses to pure black in dark,
193
- which made the whole loading state invisible on the black ground. */
194
- .sk{background:color-mix(in srgb, var(--ink) 10%, var(--bg-card));border-radius:4px;}
195
- .skEyebrow{width:150px;height:14px;margin-bottom:16px;}
196
- .skTitle{width:min(100%,620px);height:30px;margin-bottom:10px;}
197
- .skTitle2{width:min(76%,470px);height:30px;margin-bottom:18px;}
198
- .skMeta{width:min(88%,540px);height:14px;margin-bottom:8px;}
199
- .skMeta2{width:min(52%,300px);height:14px;margin-bottom:26px;}
200
- .skFigs{display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--rule);}
201
- .skFig{padding:16px 18px 18px 0;border-left:1px solid var(--rule-soft);padding-left:18px;}
202
- .skFig:first-child{border-left:0;padding-left:0;}
203
- .skFigL{width:70px;height:11px;margin-bottom:12px;}
204
- .skFigV{width:82px;height:34px;}
205
- .skSec{margin-top:30px;border-top:1px solid var(--rule);padding-top:9px;}
206
- .skSecH{width:110px;height:11px;margin-bottom:16px;}
207
- .skLine{height:13px;margin-bottom:9px;}
208
- .skVisual{margin-top:14px;height:190px;border-radius:var(--radius-sm);}
209
-
210
- .stateBox{padding-top:6px;}
211
- .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);}
212
-
213
- /* rail: the sidebar collapses to its 64px icon rail */
214
- body[data-state="rail"]{--sidebar-w:var(--sidebar-w-rail);}
215
- 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;}
216
- body[data-state="rail"] .nav-item{justify-content:center;padding:0 8px 0 6px;}
217
- body[data-state="rail"] .app-sidebar__foot{flex-direction:column;gap:4px;padding:8px 6px 10px;}
218
- body[data-state="rail"] .shell-user{flex:none;justify-content:center;}
219
- body[data-state="rail"] .brand-mark{justify-content:center;padding:0;}
220
-
221
- /* drawer: the mobile panel open over a scrim */
222
- body[data-state="drawer"]{--sidebar-w:0px;}
223
- body[data-state="drawer"] .app-sidebar{width:var(--drawer-w);transform:none;z-index:var(--z-drawer);border-right:1px solid var(--rule);}
224
- body[data-state="drawer"] .app-scrim{display:block;}
225
- body[data-state="drawer"] .topbar-menu{display:inline-flex;}
226
- body[data-state="drawer"] .wrap{max-width:640px;}
227
- body[data-state="drawer"] .figs,body[data-state="drawer"] .skFigs{grid-template-columns:repeat(2,1fr);}
228
- body[data-state="drawer"] .fig:nth-child(3),body[data-state="drawer"] .skFig:nth-child(3){border-left:0;padding-left:0;}
229
- body[data-state="drawer"] .fig:nth-child(3),body[data-state="drawer"] .fig:nth-child(4),body[data-state="drawer"] .skFig:nth-child(3),body[data-state="drawer"] .skFig:nth-child(4){border-top:1px solid var(--rule-soft);}
230
- body[data-state="drawer"] .rail{grid-template-columns:1fr;}
231
- body[data-state="drawer"] .step{padding:12px 0 0;}
232
- body[data-state="drawer"] .axes{grid-template-columns:repeat(2,1fr);}
233
- body[data-state="drawer"] .axis:nth-child(3){border-left:0;padding-left:0;}
234
- body[data-state="drawer"] .lrow{grid-template-columns:1fr;gap:4px;}
235
-
236
- @media (max-width:1024px){
237
- .nav-item__label,.nav-group__head,.brand-mark__name,.shell-user__meta{display:none;}
238
- .nav-item{justify-content:center;padding:0 8px 0 6px;}
239
- .app-sidebar__foot{flex-direction:column;gap:4px;padding:8px 6px 10px;}
240
- .shell-user{flex:none;justify-content:center;}
241
- .brand-mark{justify-content:center;padding:0;}
242
- .topbar-note{display:none;}
243
- }
244
- @media (max-width:900px){
245
- body{--gutter:20px;--shell-pad:16px;}
246
- .app-sidebar{width:var(--drawer-w);transform:translateX(-100%);}
247
- .app-topbar{left:0;}
248
- .app-content{margin-left:0;}
249
- .topbar-menu{display:inline-flex;}
250
- .topbar-jump__label,.topbar-jump__kbd{display:none;}
251
- .topbar-jump__ic{display:block;}
252
- .topbar-jump{padding:0;width:34px;justify-content:center;border-radius:999px;}
253
- 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;}
254
- body[data-state="drawer"] .nav-item{justify-content:flex-start;padding:0 16px;}
255
- body[data-state="drawer"] .app-sidebar__foot{flex-direction:row;gap:8px;padding:10px 14px 12px;}
256
- body[data-state="drawer"] .shell-user{flex:1;justify-content:flex-start;}
257
- body[data-state="drawer"] .brand-mark{justify-content:flex-start;padding:0 8px;}
258
- .figs,.skFigs{grid-template-columns:repeat(2,1fr);}
259
- .fig:nth-child(3),.skFig:nth-child(3){border-left:0;padding-left:0;}
260
- .fig:nth-child(3),.fig:nth-child(4),.skFig:nth-child(3),.skFig:nth-child(4){border-top:1px solid var(--rule-soft);}
261
- .rail{grid-template-columns:1fr;}
262
- .step{padding:12px 0 0;}
263
- .axes{grid-template-columns:repeat(2,1fr);}
264
- .axis:nth-child(3){border-left:0;padding-left:0;}
265
- .lrow{grid-template-columns:1fr;gap:4px;}
266
- h1.recTitle{max-width:none;}
267
- }
268
- </style>
269
- <script>
270
- (function(){try{var q=new URLSearchParams(location.search||location.hash.slice(1)||'').get('mode');
271
- var m=(q==='light'||q==='dark')?q:'dark';
272
- document.documentElement.setAttribute('data-mode',m);
273
- document.documentElement.setAttribute('data-theme',m);}catch(e){}})();
274
- </script>
275
- </head>
276
- <body class="mock" data-state="populated">
277
- <!--
278
- Task detail in the chrome world, v1 "the ledger" (task 1003302, goal 1000081).
279
- THESIS a task record is a ledger entry, so the page is hairlines and rows on the bare ground: no panel holds anything, and the only warm mark on a shipped task is the one lit beat of the lifecycle rail.
280
- COMPOSITION first viewport at 1440: back link and mono sub, the TASK eyebrow with the status pill, the title at 33px over a one line meta, the goal with its inherited chip, then four bare figures (credits, estimated, actual, priority) sitting straight on the ground under a full width rule, then the five beat lifecycle rail with credit lit. Everything below is a mono section label over a rule that runs the whole content width.
281
- LIGHT identical structure; the label face flips to JetBrains Mono on paper, the hairlines flatten to solid grey, and the four figures stop glowing off black and read as printed ledger numbers.
282
- RISK this is the densest of the three and the least differentiated: twenty seven pages of pure hairline can read as one undifferentiated grey field, and with no card edge a long description runs into the touches list. Region 9 (the ship visual) is deliberately absent because task 1003322 shipped without one, so its geometry is only visible in the loading skeleton. Regions 15 and 16 (grade, session log) were proposed in this round and built by task 1003437; grades also live on Standing and session logs on /sessions.
283
- ?state=populated the page with real data
284
- ?state=loading skeletons in the SHAPE of the final content
285
- ?state=empty a real URL for a task that does not exist
286
- ?state=error the feed failed
287
- ?state=rail the sidebar collapsed to its 64px rail
288
- ?state=drawer the mobile drawer open
289
- ?state=focus keyboard focus rings on the page's real controls
290
- -->
291
-
292
- <a class="skip" href="#main">Skip to content</a>
293
-
294
- <div class="app-scrim" id="app-scrim"></div>
295
-
296
- <div class="app-sidebar" id="app-sidebar">
297
- <div class="app-sidebar__brand">
298
- <a class="brand-mark" href="/" id="brand-mark">
299
- <span class="brand-mark__dot"></span><span class="brand-mark__name">Cloud Bongos</span></a>
300
- </div>
301
- <nav class="app-sidebar__nav" aria-label="Primary">
302
- <div class="nav-group">
303
- <a class="nav-item" id="nav-home" href="/" data-gate="always">
304
- <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>
305
- <span class="nav-item__label">Home</span></a>
306
- <a class="nav-item" id="nav-roadmap" href="/roadmap" data-gate="always">
307
- <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>
308
- <span class="nav-item__label">Roadmap</span></a>
309
- <a class="nav-item" id="nav-goals" href="/goals" data-gate="always">
310
- <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>
311
- <span class="nav-item__label">Goals</span></a>
312
- <a class="nav-item nav-item--active" id="nav-work" href="/work" data-gate="always" aria-current="page">
313
- <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>
314
- <span class="nav-item__label">Tasks</span></a>
315
- <a class="nav-item" id="nav-ideas" href="/ideas" data-gate="always">
316
- <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>
317
- <span class="nav-item__label">Ideas</span></a>
318
- <a class="nav-item" id="nav-copy-desk" href="/copy-desk" data-gate="always">
319
- <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>
320
- <span class="nav-item__label">Copy desk</span></a>
321
- </div>
322
- <div class="nav-group nav-group--collapsible" data-group="you">
323
- <button class="nav-group__head" data-gate="signed" data-group="you" aria-expanded="true" aria-controls="nav-group-you">
324
- <span class="nav-group__head-label">You</span>
325
- <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>
326
- <div class="nav-group__items" id="nav-group-you">
327
- <a class="nav-item" id="nav-standing" href="/#standing" data-gate="signed">
328
- <svg class="nav-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M3.2 13V8.4M8 13V3.4M12.8 13V6.4"/></svg>
329
- <span class="nav-item__label">Standing</span></a>
330
- <a class="nav-item" id="nav-profile" href="/profile" data-gate="signed">
331
- <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>
332
- <span class="nav-item__label">Profile</span></a>
333
- </div>
334
- </div>
335
- <div class="nav-group nav-group--collapsible" data-group="community">
336
- <button class="nav-group__head" data-gate="signed" data-group="community" aria-expanded="true" aria-controls="nav-group-community">
337
- <span class="nav-group__head-label">Community</span>
338
- <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>
339
- <div class="nav-group__items" id="nav-group-community">
340
- <a class="nav-item" id="nav-collab" href="/collab" data-gate="signed">
341
- <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>
342
- <span class="nav-item__label">Collab</span></a>
343
- <a class="nav-item" id="nav-leaderboard" href="/#leaderboard" data-gate="signed">
344
- <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>
345
- <span class="nav-item__label">Leaderboard</span></a>
346
- <a class="nav-item" id="nav-people" href="/people" data-gate="signed">
347
- <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>
348
- <span class="nav-item__label">People</span></a>
349
- </div>
350
- </div>
351
- <div class="nav-group nav-group--collapsible" data-group="docs">
352
- <button class="nav-group__head" data-gate="signed" data-group="docs" aria-expanded="true" aria-controls="nav-group-docs">
353
- <span class="nav-group__head-label">Docs</span>
354
- <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>
355
- <div class="nav-group__items" id="nav-group-docs">
356
- <a class="nav-item" id="nav-primer" href="/primer" data-gate="signed">
357
- <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>
358
- <span class="nav-item__label">Primer</span></a>
359
- <a class="nav-item" id="nav-ranks" href="/ranks" data-gate="signed">
360
- <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>
361
- <span class="nav-item__label">Ranks</span></a>
362
- <a class="nav-item" id="nav-economy" href="/drachmae" data-gate="signed">
363
- <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>
364
- <span class="nav-item__label">Economy</span></a>
365
- <a class="nav-item" id="nav-diagrams" href="/diagrams" data-gate="signed">
366
- <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>
367
- <span class="nav-item__label">Diagrams</span></a>
368
- <a class="nav-item" id="nav-atlas" href="/atlas" data-gate="signed">
369
- <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>
370
- <span class="nav-item__label">Repo Atlas</span></a>
371
- <a class="nav-item" id="nav-modules" href="/modules" data-gate="signed">
372
- <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>
373
- <span class="nav-item__label">Modules</span></a>
374
- <a class="nav-item" id="nav-apidocs" href="/docs" data-gate="signed">
375
- <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>
376
- <span class="nav-item__label">API docs</span></a>
377
- </div>
378
- </div>
379
- <div class="nav-group nav-group--collapsible" data-group="government">
380
- <button class="nav-group__head" data-gate="signed" data-group="government" aria-expanded="true" aria-controls="nav-group-government">
381
- <span class="nav-group__head-label">Government</span>
382
- <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>
383
- <div class="nav-group__items" id="nav-group-government">
384
- <a class="nav-item" id="nav-watch" href="/watch" data-gate="signed">
385
- <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>
386
- <span class="nav-item__label">Watch</span></a>
387
- <a class="nav-item" id="nav-harbor" href="/harbor" data-gate="signed">
388
- <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>
389
- <span class="nav-item__label">Harbor</span></a>
390
- <a class="nav-item" id="nav-gate" href="/gate" data-gate="signed">
391
- <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>
392
- <span class="nav-item__label">Gate</span></a>
393
- <a class="nav-item" id="nav-sessions" href="/sessions" data-gate="signed">
394
- <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>
395
- <span class="nav-item__label">Sessions</span></a>
396
- <a class="nav-item" id="nav-government" href="/government" data-gate="signed">
397
- <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>
398
- <span class="nav-item__label">Permissions</span></a>
399
- </div>
400
- </div>
401
- </nav>
402
- <div class="app-sidebar__foot">
403
- <a class="shell-user" id="shell-user" href="/settings" title="Settings">
404
- <span class="shell-user__avatar"></span>
405
- <span class="shell-user__meta">
406
- <span class="shell-user__name">Percy Jackson</span>
407
- <span class="shell-user__rank">Owner</span></span></a>
408
- <a class="shell-home" href="/" title="Back to Cloud Bongos">
409
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2.2 6.8 8 2.2l5.8 4.6V13H2.2z"/></svg></a>
410
- <a class="shell-signout" href="/api/bongos/auth/logout" title="Sign out">
411
- <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>
412
- </div>
413
- </div>
414
-
415
- <header class="app-topbar" id="app-topbar">
416
- <button class="topbar-menu" id="topbar-menu" aria-label="Open navigation" aria-expanded="false" aria-controls="app-sidebar">
417
- <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 4.5h11M2.5 8h11M2.5 11.5h11"/></svg></button>
418
- <h2 class="topbar-title">Tasks</h2>
419
- <div class="topbar-side">
420
- <span class="topbar-note">BONGOS-V1</span>
421
- <button class="topbar-jump is-focus" id="topbar-jump" aria-label="Jump to a page or record">
422
- <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>
423
- <span class="topbar-jump__label">Jump to</span><kbd class="topbar-jump__kbd">Ctrl K</kbd></button>
424
- <button class="zoom-toggle" aria-label="Text size">
425
- <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>
426
- <button class="theme-toggle" aria-label="Switch theme">
427
- <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>
428
- </div>
429
- </header>
430
-
431
- <main class="app-content" id="main" tabindex="-1">
432
- <div class="wrap">
433
-
434
- <!-- region 1: the way back, and the sub line -->
435
- <div class="crumb">
436
- <a class="backlink is-focus" href="/work">
437
- <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>
438
- <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>
439
- </div>
440
-
441
- <!-- loading: the skeleton takes the shape of the final page, including the ship visual figure -->
442
- <div class="onlyLoading" aria-hidden="true">
443
- <div class="sk skEyebrow"></div>
444
- <div class="sk skTitle"></div>
445
- <div class="sk skTitle2"></div>
446
- <div class="sk skMeta"></div>
447
- <div class="sk skMeta2"></div>
448
- <div class="skFigs">
449
- <div class="skFig"><div class="sk skFigL"></div><div class="sk skFigV"></div></div>
450
- <div class="skFig"><div class="sk skFigL"></div><div class="sk skFigV"></div></div>
451
- <div class="skFig"><div class="sk skFigL"></div><div class="sk skFigV"></div></div>
452
- <div class="skFig"><div class="sk skFigL"></div><div class="sk skFigV"></div></div>
453
- </div>
454
- <div class="skSec"><div class="sk skSecH"></div>
455
- <div class="sk skLine" style="width:min(100%,620px)"></div>
456
- <div class="sk skLine" style="width:min(92%,560px)"></div>
457
- <div class="sk skVisual" style="width:min(100%,560px)"></div>
458
- </div>
459
- <div class="skSec"><div class="sk skSecH"></div>
460
- <div class="sk skLine" style="width:min(100%,640px)"></div>
461
- <div class="sk skLine" style="width:min(96%,600px)"></div>
462
- <div class="sk skLine" style="width:min(70%,430px)"></div>
463
- </div>
464
- </div>
465
-
466
- <!-- empty: the honest task-not-found case, at a real URL for a task that does not exist -->
467
- <section class="onlyEmpty stateBox">
468
- <p class="kind">TASK <span class="pill pill--none">no such task</span></p>
469
- <p class="bigLine">1003999, no such task</p>
470
- <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>
471
- <div class="actions" style="margin-top:22px"><a class="btn" href="/work">Open the work board</a></div>
472
- </section>
473
-
474
- <!-- error: the feed failed. The record is untouched; only the read failed -->
475
- <section class="onlyError stateBox">
476
- <p class="kind">TASK <span class="pill pill--danger">feed unavailable</span></p>
477
- <p class="bigLine">Could not load 1003322</p>
478
- <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>
479
- <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>
480
- </section>
481
-
482
- <article class="rec">
483
-
484
- <!-- region 2: the kind eyebrow, and the one place a lifecycle state is coloured -->
485
- <p class="kind">TASK <span class="pill pill--ok">shipped</span></p>
486
-
487
- <!-- region 3 -->
488
- <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>
489
-
490
- <!-- region 4 and 5 -->
491
- <p class="meta"><b>BONGOS-V1</b> &middot; feature &middot; engineer &middot; P1 &middot; min rank Trusted</p>
492
- <p class="note">Created 28 August 2026, 2 days ago.</p>
493
-
494
- <!-- region 6: the goal it lives in, with the category it inherits -->
495
- <p class="goalline">Goal <a href="/goals#/goal/1000080">1000080, Apex UI pass 2</a> <span class="chip"><i>inherited</i>platform</span></p>
496
-
497
- <!-- v1's stat figures: bare on the page ground, mono label above, tabular figure below -->
498
- <div class="figs">
499
- <div class="fig"><span class="figL">Credits</span><span class="figV">60</span></div>
500
- <div class="fig"><span class="figL">Estimated</span><span class="figV">240<u>m</u></span></div>
501
- <div class="fig"><span class="figL">Actual</span><span class="figV">37<u>m</u></span></div>
502
- <div class="fig"><span class="figL">Priority</span><span class="figV">P1</span></div>
503
- </div>
504
-
505
- <!-- the world's signature component: five beats, exactly one lit -->
506
- <ol class="rail" aria-label="Lifecycle">
507
- <li class="step"><div class="stepDot"></div><span class="stepN">Claim</span><span class="stepC">one builder, one worktree</span></li>
508
- <li class="step"><div class="stepDot"></div><span class="stepN">Build</span><span class="stepC">the code and the docs</span></li>
509
- <li class="step"><div class="stepDot"></div><span class="stepN">Grade</span><span class="stepC">the panel reads the diff</span></li>
510
- <li class="step"><div class="stepDot"></div><span class="stepN">Ship</span><span class="stepC">merged, then deployed</span></li>
511
- <li class="step" aria-current="step"><div class="stepDot"></div><span class="stepN">Credit</span><span class="stepC">60 credits landed</span></li>
512
- </ol>
513
-
514
- <!-- region 7: the claim. The API surfaces the most recent claim only, never the full ledger -->
515
- <section class="sec">
516
- <p class="secH">Claim</p>
517
- <p class="body">Last claimed by <b>Percy Jackson</b> on 30 August 2026 at 09:12. Released, outcome shipped.</p>
518
- </section>
519
-
520
- <!-- region 8 -->
521
- <section class="sec">
522
- <p class="secH">Value</p>
523
- <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>
524
- </section>
525
-
526
- <!-- region 9: the ship visual. Task 1003322 shipped without one, so NOTHING is drawn here.
527
- No placeholder, no empty frame, no "no visual" line. The figure's geometry is only
528
- visible in the loading skeleton above, which is the honest reading of the shipped page. -->
529
-
530
- <!-- region 10 -->
531
- <section class="sec">
532
- <p class="secH">Description</p>
533
- <p class="desc">Carve public-landing/ into modules/public-landing/ so the front door is a module like status-UI and hall-UI.
534
-
535
- 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 }.
536
-
537
- 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.
538
-
539
- 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>
540
- </section>
541
-
542
- <!-- region 11 -->
543
- <section class="sec">
544
- <p class="secH">Touches <em>8 files</em></p>
545
- <ul class="fileList">
546
- <li>modules/public-landing/</li>
547
- <li>src/bongos/module-loader.js</li>
548
- <li>src/bongos/platform-server.js</li>
549
- <li>src/bongos/serve-internal.js</li>
550
- <li>docs/adr/0218-the-apex-root-web-surface.md</li>
551
- <li>docs/architecture.md</li>
552
- <li>docs/file-map.md</li>
553
- <li>tests/fitness.mjs</li>
554
- </ul>
555
- </section>
556
-
557
- <!-- region 12: dependencies, both directions -->
558
- <section class="sec">
559
- <p class="secH">Blocked by</p>
560
- <ul class="depList">
561
- <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>
562
- <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>
563
- </ul>
564
- </section>
565
- <section class="sec">
566
- <p class="secH">Blocks</p>
567
- <ul class="depList">
568
- <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>
569
- <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>
570
- </ul>
571
- </section>
572
-
573
- <!-- region 13 -->
574
- <section class="sec">
575
- <p class="secH">Shipped</p>
576
- <p class="body">Shipped 30 August 2026 by <b>Percy Jackson</b>, 2 hours ago.</p>
577
- </section>
578
-
579
- <!-- region 14: the actions. A shipped task has no lifecycle control left, so the page
580
- carries an explanatory note instead, and no accent door. That is the One Warm Thing
581
- Rule doing its job: nothing here is pressable-or-live, so nothing here is warm. -->
582
- <section class="sec">
583
- <p class="secH">Actions</p>
584
- <div class="actions">
585
- <p class="actNote">This task has shipped and its credits have landed. Neither Ship it nor Confirm is available.</p>
586
- <button class="btn is-focus" type="button" id="copy-prompt-btn">Copy prompt</button>
587
- <a class="btn is-focus" href="/work">Open the work board</a>
588
- </div>
589
- </section>
590
-
591
- <!-- region 15: the grade panel — proposed in this round, built by task 1003437. -->
592
- <section class="sec">
593
- <p class="secH">Grade</p>
594
- <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>
595
- <div class="axes">
596
- <div class="axis"><span class="axisN">narc</span><span class="pill pill--sm pill--ok">pass</span></div>
597
- <div class="axis"><span class="axisN">quality</span><span class="pill pill--sm pill--ok">pass</span></div>
598
- <div class="axis"><span class="axisN">hacker</span><span class="pill pill--sm pill--ok">pass</span></div>
599
- <div class="axis"><span class="axisN">efficiency</span><span class="pill pill--sm pill--ok">pass</span></div>
600
- </div>
601
- <div class="scoreRow">
602
- <span class="scoreV">8.4<u>/10</u></span>
603
- <span class="pill pill--ok">verdict pass</span>
604
- <span class="crumbsub">threshold 6 &middot; panel v4.0 &middot; claude-sonnet-5</span>
605
- </div>
606
- </section>
607
-
608
- <!-- region 16: the session log — proposed in this round, built by task 1003437. -->
609
- <section class="sec">
610
- <p class="secH">Session log</p>
611
- <div class="ledger">
612
- <div class="lrow"><span class="lk">Session</span><span class="lv">30 August 2026, Percy Jackson, 37m</span></div>
613
- <div class="lrow"><span class="lk">Credits awarded</span><span class="lv">60</span></div>
614
- <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>
615
- <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>
616
- </div>
617
- </section>
618
-
619
- </article>
620
- </div>
621
- </main>
622
-
623
- <script>
624
- /* the mock's state contract: read ?state= once and apply it. Nothing is built here, and no motion. */
625
- (function () {
626
- var ok = ['populated', 'loading', 'empty', 'error', 'rail', 'drawer', 'focus'];
627
- var s = new URLSearchParams(location.search || location.hash.slice(1) || '').get('state') || 'populated';
628
- if (ok.indexOf(s) === -1) s = 'populated';
629
- document.body.setAttribute('data-state', s);
630
- })();
631
- </script>
632
- </body>
633
- </html>