@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,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>