@bongos/core 1.24.79 → 1.24.81

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 (413) hide show
  1. package/.bongos-core.json +554 -394
  2. package/.claude/skills/ask-for-help/SKILL.md +1 -1
  3. package/.claude/skills/builder-sequence/SKILL.md +1 -1
  4. package/.claude/skills/design/SKILL.md +1 -1
  5. package/.claude/skills/goal-create/SKILL.md +1 -1
  6. package/.claude/skills/planning-session/SKILL.md +1 -1
  7. package/clients/bongos-client/README.md +1 -1
  8. package/clients/bongos-client/bongos-client.global.js +8 -0
  9. package/clients/bongos-client/index.cjs +8 -0
  10. package/clients/bongos-client/index.d.ts +11 -0
  11. package/clients/bongos-client/index.mjs +8 -0
  12. package/docs/adr/0274-one-kernel-three-role-packs.md +2 -2
  13. package/docs/adr/0399-the-visor-is-glass-over-the-scene-and-owns-no-camera.md +91 -0
  14. package/docs/adr/0400-a-chain-reserves-work-and-each-sub-quest-is-still-claimed-alone.md +109 -0
  15. package/docs/adr/0401-one-options-menu-opens-every-settings-screen-in-a-frame.md +53 -0
  16. package/docs/adr/0402-helm-is-the-halls-look-and-the-hall-is-dark-only.md +142 -0
  17. package/docs/adr/README.md +4 -0
  18. package/docs/api/openapi.json +195 -3
  19. package/docs/api-reference.md +8 -4
  20. package/docs/architecture.md +7 -3
  21. package/docs/copy-inventory.md +393 -378
  22. package/docs/copy-registry.json +722 -578
  23. package/docs/design/characters/character-sprites-source.webp +0 -0
  24. package/docs/file-map.md +7 -8
  25. package/docs/module-api-changelog.md +4 -0
  26. package/docs/modules-contract.md +5 -0
  27. package/docs/onboarding/slash-commands.md +1 -1
  28. package/docs/packs/{engineer.md → artisan.md} +5 -5
  29. package/docs/packs/artist.md +50 -4
  30. package/docs/page-inventory.json +16 -7
  31. package/docs/page-readings.json +3184 -3338
  32. package/docs/{packs/ideator.md → recipes/ideation-playbook.md} +5 -48
  33. package/migrations/core_296_crafts_artisan_artist.sql +72 -0
  34. package/migrations/core_297_builder_character.sql +30 -0
  35. package/modules/copy-desk/proposals.js +1 -1
  36. package/modules/economy/credits-by-craft.js +29 -15
  37. package/modules/hall-ui/public/ai-studio.html +6 -4
  38. package/modules/hall-ui/public/ai-studio.states.json +1 -0
  39. package/modules/hall-ui/public/atlas.html +5 -5
  40. package/modules/hall-ui/public/atlas.js +3 -1
  41. package/modules/hall-ui/public/atlas.states.json +1 -0
  42. package/modules/hall-ui/public/blockers.html +5 -5
  43. package/modules/hall-ui/public/board-room.html +4 -4
  44. package/modules/hall-ui/public/board-room.states.json +1 -0
  45. package/modules/hall-ui/public/characters/artisan.png +0 -0
  46. package/modules/hall-ui/public/characters/artist.png +0 -0
  47. package/modules/hall-ui/public/characters/patron.png +0 -0
  48. package/modules/hall-ui/public/city.css +3 -4
  49. package/modules/hall-ui/public/city.html +9 -9
  50. package/modules/hall-ui/public/city.js +17 -56
  51. package/modules/hall-ui/public/city.states.json +7 -32
  52. package/modules/hall-ui/public/collab.html +4 -4
  53. package/modules/hall-ui/public/collab.states.json +1 -0
  54. package/modules/hall-ui/public/commands.html +4 -4
  55. package/modules/hall-ui/public/commands.states.json +1 -0
  56. package/modules/hall-ui/public/controls.css +63 -11
  57. package/modules/hall-ui/public/copy-desk.html +4 -4
  58. package/modules/hall-ui/public/copy-desk.states.json +1 -0
  59. package/modules/hall-ui/public/craft-mode.js +258 -64
  60. package/modules/hall-ui/public/deploy.html +4 -4
  61. package/modules/hall-ui/public/deploy.states.json +1 -0
  62. package/modules/hall-ui/public/diagram-viewer.js +2 -1
  63. package/modules/hall-ui/public/dom-utils.js +1 -1
  64. package/modules/hall-ui/public/goal-map.html +9 -6
  65. package/modules/hall-ui/public/goals.html +5 -5
  66. package/modules/hall-ui/public/goals.states.json +1 -0
  67. package/modules/hall-ui/public/government.html +4 -4
  68. package/modules/hall-ui/public/government.states.json +1 -0
  69. package/modules/hall-ui/public/hall-render.js +3 -1
  70. package/modules/hall-ui/public/home-city-draw.js +3 -3
  71. package/modules/hall-ui/public/home-city.css +4 -0
  72. package/modules/hall-ui/public/home-city.js +17 -9
  73. package/modules/hall-ui/public/home-gallery.js +8 -1
  74. package/modules/hall-ui/public/home-idea-box.css +2 -2
  75. package/modules/hall-ui/public/home-idea-box.js +3 -3
  76. package/modules/hall-ui/public/idea.html +5 -5
  77. package/modules/hall-ui/public/idea.states.json +1 -0
  78. package/modules/hall-ui/public/ideas.html +5 -5
  79. package/modules/hall-ui/public/ideas.states.json +1 -0
  80. package/modules/hall-ui/public/index-founding.states.json +1 -0
  81. package/modules/hall-ui/public/index-genesis-decide.states.json +1 -0
  82. package/modules/hall-ui/public/index-genesis-demo.states.json +1 -0
  83. package/modules/hall-ui/public/index-genesis.states.json +1 -0
  84. package/modules/hall-ui/public/index.html +11 -7
  85. package/modules/hall-ui/public/index.states.json +1 -0
  86. package/modules/hall-ui/public/market-watch-item.html +4 -4
  87. package/modules/hall-ui/public/market-watch-item.states.json +1 -0
  88. package/modules/hall-ui/public/market-watch-rules.html +4 -4
  89. package/modules/hall-ui/public/market-watch-rules.states.json +1 -0
  90. package/modules/hall-ui/public/market-watch.html +6 -9
  91. package/modules/hall-ui/public/market-watch.js +22 -45
  92. package/modules/hall-ui/public/market-watch.states.json +1 -0
  93. package/modules/hall-ui/public/modules.html +4 -4
  94. package/modules/hall-ui/public/modules.states.json +1 -0
  95. package/modules/hall-ui/public/money.html +4 -4
  96. package/modules/hall-ui/public/money.states.json +1 -0
  97. package/modules/hall-ui/public/my-agents.html +4 -4
  98. package/modules/hall-ui/public/my-agents.states.json +1 -0
  99. package/modules/hall-ui/public/options-menu.js +409 -0
  100. package/modules/hall-ui/public/paintbrush.js +3 -3
  101. package/modules/hall-ui/public/palette.js +11 -13
  102. package/modules/hall-ui/public/primer.html +5 -5
  103. package/modules/hall-ui/public/primer.states.json +1 -0
  104. package/modules/hall-ui/public/profile-crafts.js +1 -1
  105. package/modules/hall-ui/public/profile-roles.js +23 -19
  106. package/modules/hall-ui/public/profile.css +1 -1
  107. package/modules/hall-ui/public/profile.html +19 -18
  108. package/modules/hall-ui/public/profile.js +19 -18
  109. package/modules/hall-ui/public/profile.states.json +5 -4
  110. package/modules/hall-ui/public/project-settings.html +4 -4
  111. package/modules/hall-ui/public/roster.html +4 -4
  112. package/modules/hall-ui/public/roster.js +3 -3
  113. package/modules/hall-ui/public/roster.states.json +1 -0
  114. package/modules/hall-ui/public/settings.css +24 -4
  115. package/modules/hall-ui/public/settings.html +21 -17
  116. package/modules/hall-ui/public/settings.js +44 -44
  117. package/modules/hall-ui/public/settings.states.json +1 -0
  118. package/modules/hall-ui/public/shell-game.css +110 -0
  119. package/modules/hall-ui/public/shell-game.js +316 -3
  120. package/modules/hall-ui/public/shell.js +15 -66
  121. package/modules/hall-ui/public/sky-interaction.js +7 -0
  122. package/modules/hall-ui/public/speciality-tools.js +1 -2
  123. package/modules/hall-ui/public/street-card.states.json +1 -0
  124. package/modules/hall-ui/public/street-inside.js +3 -4
  125. package/modules/hall-ui/public/street.css +1 -5
  126. package/modules/hall-ui/public/street.html +6 -10
  127. package/modules/hall-ui/public/street.js +8 -59
  128. package/modules/hall-ui/public/street.states.json +7 -32
  129. package/modules/hall-ui/public/studio.html +5 -5
  130. package/modules/hall-ui/public/studio.states.json +1 -0
  131. package/modules/hall-ui/public/style.css +197 -112
  132. package/modules/hall-ui/public/task-detail.js +5 -4
  133. package/modules/hall-ui/public/task.html +5 -5
  134. package/modules/hall-ui/public/task.states.json +1 -0
  135. package/modules/hall-ui/public/thinking.css +10 -0
  136. package/modules/hall-ui/public/thinking.html +9 -6
  137. package/modules/hall-ui/public/thinking.states.json +1 -0
  138. package/modules/hall-ui/public/tweak-editor.html +5 -5
  139. package/modules/hall-ui/public/tweak-editor.js +5 -1
  140. package/modules/hall-ui/public/tweak-editor.states.json +1 -0
  141. package/modules/hall-ui/public/update-pill.js +91 -2
  142. package/modules/hall-ui/public/visor.css +80 -0
  143. package/modules/hall-ui/public/visor.js +316 -0
  144. package/modules/hall-ui/public/watch-repo-invite.js +159 -0
  145. package/modules/hall-ui/public/watch.html +6 -5
  146. package/modules/hall-ui/public/watch.js +17 -2
  147. package/modules/hall-ui/public/watch.states.json +1 -0
  148. package/modules/hall-ui/public/welcome-boot.js +15 -6
  149. package/modules/hall-ui/public/work-founding.states.json +1 -0
  150. package/modules/hall-ui/public/work.html +5 -5
  151. package/modules/hall-ui/public/work.states.json +1 -0
  152. package/modules/hall-ui/records/builders-roster.md +2 -2
  153. package/modules/hall-ui/records/craft-mode.md +13 -11
  154. package/modules/hall-ui/records/game-mode.md +2 -2
  155. package/modules/hall-ui/records/governor-street.md +1 -1
  156. package/modules/hall-ui/records/home-city.md +3 -1
  157. package/modules/hall-ui/records/market-watch-settings.md +2 -0
  158. package/modules/hall-ui/records/options-menu.md +15 -0
  159. package/modules/hall-ui/records/profile-roles.md +11 -11
  160. package/modules/hall-ui/records/sky.md +3 -3
  161. package/modules/hall-ui/records/start-screen.md +25 -0
  162. package/modules/hall-ui/records/tweak-editor.md +1 -1
  163. package/modules/hall-ui/records/update-pill.md +12 -0
  164. package/modules/hall-ui/records/visor.md +23 -0
  165. package/modules/hall-ui/records/welcome-tower.md +5 -5
  166. package/modules/hall-ui/specimens/components.states.json +2 -1
  167. package/modules/ideas/ideator-stats.js +3 -1
  168. package/modules/ideas/inbox.js +2 -2
  169. package/modules/lifecycle/activity.js +1 -1
  170. package/modules/lifecycle/cascade.js +4 -4
  171. package/modules/lifecycle/goal-spec-task.js +1 -1
  172. package/modules/lifecycle/help-requests.js +19 -15
  173. package/modules/lifecycle/kickoff-checklist.js +3 -3
  174. package/modules/lifecycle/kickoff-seed.js +1 -1
  175. package/modules/lifecycle/migrations/lifecycle_021_crafts_artisan_artist.sql +29 -0
  176. package/modules/lifecycle/mingle.js +4 -4
  177. package/modules/lifecycle/page-tweak-write.js +1 -1
  178. package/modules/lifecycle/routes/task-write-routes.js +3 -1
  179. package/modules/lifecycle/routes/tasks.js +3 -3
  180. package/modules/lifecycle/ship-card.js +2 -3
  181. package/modules/lifecycle/task-classifier.js +39 -29
  182. package/modules/lifecycle/tests/cascade.mjs +7 -7
  183. package/modules/onboarding/founding-mode.js +3 -0
  184. package/modules/onboarding/genesis-home.js +21 -1
  185. package/modules/onboarding/routes/onboarding.js +2 -0
  186. package/modules/page-notes/notes.js +3 -2
  187. package/modules/page-notes/split.js +1 -1
  188. package/modules/platform-identity/craft-rollup.js +35 -7
  189. package/modules/platform-identity/migrations/platform_identity_036_crafts_artisan_artist.sql +45 -0
  190. package/modules/platform-identity/platform-identity.js +2 -2
  191. package/modules/platform-identity/routes/community-leaderboard.js +2 -1
  192. package/modules/platform-identity/routes/community-search.js +2 -1
  193. package/modules/platform-identity/routes/sso.js +2 -1
  194. package/modules/platform-identity/tests/platform-identity.mjs +6 -6
  195. package/modules/public-landing/public/community.html +3 -5
  196. package/modules/public-landing/public/index.html +1 -1
  197. package/modules/public-landing/public/projects.html +1 -1
  198. package/modules/specialities/migrations/specialities_004_crafts_artisan_artist.sql +30 -0
  199. package/modules/specialities/routes/specialities.js +2 -2
  200. package/modules/status-ui/public/status.js +1 -1
  201. package/modules/ui-design/kit/fixtures/community-leaderboard.json +10 -10
  202. package/modules/ui-design/kit/fixtures/community-search.json +2 -2
  203. package/modules/ui-design/kit/fixtures/scouting-recruiter.json +1 -1
  204. package/modules/ui-design/public/brand.html +2 -2
  205. package/package-lock.json +2 -2
  206. package/package.json +1 -1
  207. package/release-notes.json +76 -0
  208. package/scripts/bongos/autobongos-loop.js +1 -1
  209. package/scripts/bongos/discipline-modes.json +7 -12
  210. package/scripts/bongos/fitness.js +1 -1
  211. package/scripts/bongos/gen-hall-sitemap.js +7 -7
  212. package/scripts/bongos/grade-smoke.js +2 -2
  213. package/scripts/bongos/init.js +2 -2
  214. package/scripts/bongos/newcomer-floor.config.json +1 -2
  215. package/scripts/bongos/newcomer-floor.js +4 -3
  216. package/scripts/bongos/newcomer-floor.templates.json +10 -12
  217. package/scripts/bongos/newcomer-floor.test.js +47 -38
  218. package/scripts/bongos/role-pack-guard.js +5 -4
  219. package/scripts/bongos/seed-tasks.example.json +3 -3
  220. package/scripts/bongos/setup.js +20 -107
  221. package/scripts/bongos/start.js +2 -2
  222. package/scripts/bongos/task.js +5 -4
  223. package/scripts/bongos/triage.js +1 -1
  224. package/scripts/bongos/worktree.js +16 -4
  225. package/scripts/hall-preview/README.md +2 -3
  226. package/scripts/setup-builder.js +6 -46
  227. package/src/bongos/auth-admission.js +8 -8
  228. package/src/bongos/craft-mode.js +2 -0
  229. package/src/bongos/db.js +39 -1
  230. package/src/bongos/github-repos.js +78 -0
  231. package/src/bongos/module-scope-map.js +22 -0
  232. package/src/bongos/role-stats.js +27 -11
  233. package/src/bongos/routes/github.js +100 -2
  234. package/src/bongos/routes/me.js +33 -0
  235. package/src/bongos/serve-internal.js +33 -11
  236. package/src/crafts.js +66 -0
  237. package/src/hall-helm.js +79 -0
  238. package/src/module-api.js +6 -1
  239. package/src/module-loader/manifest-schema.js +16 -0
  240. package/src/modules.js +2 -2
  241. package/src/role-responsibilities.js +6 -5
  242. package/tests/acclaim_feed_evidence_db.mjs +1 -1
  243. package/tests/activity_rollup_as_of.mjs +1 -1
  244. package/tests/api_alias_caller_ratchet.mjs +3 -3
  245. package/tests/application_lifecycle.mjs +1 -1
  246. package/tests/artist_review.mjs +1 -1
  247. package/tests/artist_review_goal.mjs +1 -1
  248. package/tests/blocker_hall_live_proof.mjs +1 -1
  249. package/tests/blocker_tasks_named_db.mjs +2 -2
  250. package/tests/canonical_profile_url.mjs +1 -1
  251. package/tests/cap_newcomer_tasks.mjs +13 -13
  252. package/tests/character_creation.mjs +294 -0
  253. package/tests/claim_gate_open_blocker.mjs +2 -2
  254. package/tests/claim_gate_rebase.mjs +6 -6
  255. package/tests/claude_materialize.mjs +1 -1
  256. package/tests/clawback_confirmed_backlog.mjs +3 -3
  257. package/tests/collab_page.mjs +8 -9
  258. package/tests/collab_self_settling.mjs +2 -2
  259. package/tests/community_leaderboard_route.mjs +13 -5
  260. package/tests/community_proof_db.mjs +3 -0
  261. package/tests/community_search_route.mjs +7 -6
  262. package/tests/conductor.mjs +1 -1
  263. package/tests/conductor_main_e2e.mjs +8 -8
  264. package/tests/copy_desk_flags_db.mjs +1 -1
  265. package/tests/copy_desk_page_approve.mjs +2 -2
  266. package/tests/copy_desk_page_claim.mjs +2 -2
  267. package/tests/copy_desk_page_next.mjs +1 -1
  268. package/tests/copy_desk_page_release.mjs +1 -1
  269. package/tests/copy_desk_page_submit.mjs +2 -2
  270. package/tests/core_258_box_session_claims_db.mjs +1 -1
  271. package/tests/craft_mode.mjs +48 -34
  272. package/tests/craft_mode_home.mjs +20 -20
  273. package/tests/craft_mode_looks.mjs +16 -15
  274. package/tests/craft_mode_nav.mjs +31 -29
  275. package/tests/craft_review_mode.mjs +46 -41
  276. package/tests/crafts_vocabulary.mjs +70 -0
  277. package/tests/cross_discipline_priority_direction.mjs +5 -5
  278. package/tests/design_reference.mjs +1 -1
  279. package/tests/fitness.mjs +7 -11
  280. package/tests/funded_project_pays_proof_db.mjs +1 -1
  281. package/tests/genesis_home.mjs +21 -1
  282. package/tests/github_chip.mjs +3 -3
  283. package/tests/github_repo_invite.mjs +379 -0
  284. package/tests/goal_criterion_confirm_ui.mjs +1 -1
  285. package/tests/goal_invite_consent.mjs +1 -1
  286. package/tests/goal_map_page.mjs +2 -2
  287. package/tests/goal_sort_staleness.mjs +1 -1
  288. package/tests/goal_spec_task.mjs +1 -1
  289. package/tests/goal_spec_task_db.mjs +3 -3
  290. package/tests/grade_engine.mjs +2 -2
  291. package/tests/grader_no_artifact.mjs +1 -1
  292. package/tests/grader_prompt_fencing.mjs +1 -1
  293. package/tests/grader_prompt_window_bound.mjs +1 -1
  294. package/tests/grader_reader_lens.mjs +2 -2
  295. package/tests/grader_severity_gate.mjs +1 -1
  296. package/tests/grader_unbacked_score.mjs +1 -1
  297. package/tests/hall_approval_queue.mjs +1 -1
  298. package/tests/hall_board_world.mjs +2 -2
  299. package/tests/hall_builders_page_pass.mjs +3 -2
  300. package/tests/hall_city.mjs +16 -30
  301. package/tests/hall_controls.mjs +52 -4
  302. package/tests/hall_fullscreen.mjs +27 -3
  303. package/tests/hall_helm.mjs +187 -0
  304. package/tests/hall_kit_charts.mjs +1 -1
  305. package/tests/hall_landing_boot.mjs +1 -1
  306. package/tests/hall_my_agents.mjs +16 -16
  307. package/tests/hall_nav.mjs +22 -15
  308. package/tests/hall_options_menu.mjs +247 -0
  309. package/tests/hall_oversight_world.mjs +1 -1
  310. package/tests/hall_palette.mjs +8 -9
  311. package/tests/hall_profile_world.mjs +3 -3
  312. package/tests/hall_record_world.mjs +6 -4
  313. package/tests/hall_settings_world.mjs +2 -1
  314. package/tests/hall_sitemap.mjs +6 -5
  315. package/tests/hall_start_screen.mjs +307 -0
  316. package/tests/hall_street.mjs +15 -28
  317. package/tests/hall_street_inside.mjs +17 -9
  318. package/tests/hall_studio_world.mjs +3 -3
  319. package/tests/hall_topbar_320.mjs +4 -2
  320. package/tests/hall_visor.mjs +224 -0
  321. package/tests/help_requests.mjs +47 -15
  322. package/tests/helpers.mjs +4 -4
  323. package/tests/home_city.mjs +6 -4
  324. package/tests/home_city_widget.mjs +33 -14
  325. package/tests/home_gallery_widget.mjs +4 -4
  326. package/tests/home_idea_box.mjs +6 -6
  327. package/tests/hub_community_page.mjs +3 -3
  328. package/tests/hub_craft_rollup.mjs +75 -36
  329. package/tests/hub_recent_ships.mjs +3 -2
  330. package/tests/idea_cascade.mjs +2 -2
  331. package/tests/idea_credit_streams_db.mjs +1 -1
  332. package/tests/idea_detail_page.mjs +1 -1
  333. package/tests/idea_ideate_full.mjs +5 -2
  334. package/tests/idea_spark_hall.mjs +1 -1
  335. package/tests/init.mjs +3 -3
  336. package/tests/instance_manifest.mjs +2 -2
  337. package/tests/kickoff_checklist.mjs +1 -1
  338. package/tests/leaderboard_roles.mjs +34 -25
  339. package/tests/lifecycle_claim_ladder_refs.mjs +55 -0
  340. package/tests/lightbulb.mjs +14 -10
  341. package/tests/main_discipline.mjs +8 -8
  342. package/tests/markdown_line_endings.mjs +1 -1
  343. package/tests/market_watch_pages.mjs +52 -74
  344. package/tests/me_streak_leaderboard_queries.mjs +3 -3
  345. package/tests/migration_allocation.mjs +1 -1
  346. package/tests/mingle.mjs +36 -21
  347. package/tests/module-scope-map.mjs +22 -2
  348. package/tests/module_api.mjs +1 -0
  349. package/tests/module_contributions.mjs +13 -13
  350. package/tests/module_manifest.mjs +29 -0
  351. package/tests/module_skills_hook.mjs +2 -2
  352. package/tests/modules.mjs +14 -7
  353. package/tests/nav_permission_atoms.mjs +2 -1
  354. package/tests/needs_rebase.mjs +1 -1
  355. package/tests/newcomer_restock.mjs +13 -13
  356. package/tests/page_notes_panel.mjs +22 -22
  357. package/tests/page_tweak_no_block.mjs +1 -1
  358. package/tests/paintbrush.mjs +7 -7
  359. package/tests/privacy_matrix.mjs +1 -0
  360. package/tests/profile_activity.mjs +20 -23
  361. package/tests/profile_earnings.mjs +1 -1
  362. package/tests/profile_nudge_prefs.mjs +4 -4
  363. package/tests/profile_role_headline.mjs +73 -46
  364. package/tests/profile_role_stats.mjs +55 -45
  365. package/tests/profile_rollup_consent.mjs +19 -6
  366. package/tests/profile_route.mjs +12 -12
  367. package/tests/profile_ui_cross_project.mjs +4 -4
  368. package/tests/project_invite_suggestions.mjs +2 -2
  369. package/tests/promote_goal_id.mjs +1 -1
  370. package/tests/publish_manifest.mjs +1 -1
  371. package/tests/rank_floor_wiring.mjs +1 -1
  372. package/tests/regrade_actual_minutes.mjs +1 -1
  373. package/tests/removal_proposal.mjs +2 -2
  374. package/tests/reward_gate.mjs +4 -4
  375. package/tests/reward_mode_cost_plus_only.mjs +1 -1
  376. package/tests/role_responsibilities.mjs +18 -12
  377. package/tests/role_stats_db.mjs +17 -16
  378. package/tests/scouting_rollup_fanout.mjs +5 -5
  379. package/tests/seed_tasks.mjs +5 -2
  380. package/tests/session_earnings_mirror_db.mjs +1 -1
  381. package/tests/session_reward_on_land_db.mjs +1 -1
  382. package/tests/session_reward_reconcile_db.mjs +2 -2
  383. package/tests/sessions_kit_pager.mjs +1 -1
  384. package/tests/settings_art_key_absent.mjs +2 -2
  385. package/tests/settings_main_role.mjs +21 -20
  386. package/tests/setup_flow.mjs +3 -3
  387. package/tests/setup_smoke.mjs +20 -0
  388. package/tests/ship_card.mjs +6 -6
  389. package/tests/specialities.mjs +16 -4
  390. package/tests/speciality_db_shape.mjs +6 -6
  391. package/tests/speciality_injection.mjs +17 -17
  392. package/tests/speciality_offer_ui.mjs +5 -5
  393. package/tests/speciality_offered.mjs +6 -5
  394. package/tests/speciality_session_skills.mjs +7 -7
  395. package/tests/speciality_skills.mjs +11 -11
  396. package/tests/speciality_walkthrough_ui.mjs +2 -2
  397. package/tests/sso_checkin_identity_spoof.mjs +2 -1
  398. package/tests/task_classifier_vocab.mjs +10 -0
  399. package/tests/task_cli.mjs +11 -3
  400. package/tests/task_criteria_unlink_db.mjs +2 -2
  401. package/tests/task_discipline_required.mjs +38 -16
  402. package/tests/task_goal_required.mjs +4 -4
  403. package/tests/task_needs_db.mjs +1 -1
  404. package/tests/tweak_replaces_artist_review.mjs +1 -1
  405. package/tests/update_pill.mjs +153 -2
  406. package/tests/upkeep_home.mjs +1 -1
  407. package/tests/v3_c1_options_proof.mjs +145 -0
  408. package/tests/visual_review.mjs +3 -3
  409. package/tests/watch_applications_queue.mjs +8 -5
  410. package/tests/watch_sealed_floor.mjs +3 -1
  411. package/tests/welcome_boot.mjs +12 -9
  412. package/tests/welcome_boot_browser.mjs +13 -13
  413. package/tests/worktree_helper.mjs +16 -1
@@ -11,8 +11,9 @@
11
11
  <!-- The faces (Manrope, JetBrains Mono) come from the branding pack's font
12
12
  links, injected into this head by the server like every hall page's
13
13
  (tests/hall_tokens.mjs: no hall page hardcodes a web-font stylesheet). -->
14
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
15
- <link rel="stylesheet" href="/builders/thinking.css?v=2026-09-27-split">
14
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
15
+ <link rel="stylesheet" href="/builders/visor.css?v=2026-11-10-visor">
16
+ <link rel="stylesheet" href="/builders/thinking.css?v=2026-11-10-visor">
16
17
  </head>
17
18
  <!-- THE PROJECT SKY (task 1004232 / sky part 4 of 5, goal 1000095; ADR 0331,
18
19
  ADR 0227 §11). The SAME page as /thinking — docs/design/mocks/sky/
@@ -138,11 +139,13 @@
138
139
  </div>
139
140
 
140
141
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
141
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
142
+ <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
142
143
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
143
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
144
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
144
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
145
+ <script src="/builders/shell.js?v=2026-11-11-helm"></script>
145
146
  <script src="/builders/hall-dialog.js"></script>
147
+ <!-- task 1005148: the visor (glass over the scene, game mode only; ADR 0399), after the shell and hall-dialog.js -->
148
+ <script src="/builders/visor.js?v=2026-11-10-visor"></script>
146
149
  <script src="/builders/palette.js" defer></script>
147
150
 
148
151
  <script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
@@ -151,7 +154,7 @@
151
154
  <script src="/builders/sky-data.js?v=2026-09-30-uat1"></script>
152
155
  <script src="/builders/sky-layout.js?v=2026-09-27-split"></script>
153
156
  <script src="/builders/sky-draw.js?v=2026-09-27-split"></script>
154
- <script src="/builders/sky-interaction.js?v=2026-09-30-uat1"></script>
157
+ <script src="/builders/sky-interaction.js?v=2026-11-10-visor"></script>
155
158
  <script src="/builders/sky-panel.js?v=2026-09-30-uat1"></script>
156
159
  <script src="/builders/sky-composer.js?v=2026-09-27-split"></script>
157
160
  <script src="/builders/sky-tour.js?v=2026-09-27-split"></script>
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-03-goals1">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
12
12
  <!-- task 1003470: the family sheet the list's figure band and group heads
13
13
  come from (.ov-figs, .ov-group__head), linked before the page's own. -->
14
14
  <link rel="stylesheet" href="/builders/oversight.css">
@@ -251,10 +251,10 @@
251
251
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
252
252
 
253
253
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
254
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
254
+ <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
255
255
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
256
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
257
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
256
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
257
+ <script src="/builders/shell.js?v=2026-11-11-helm"></script>
258
258
  <script src="/builders/hall-dialog.js"></script>
259
259
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
260
260
  <script src="/builders/palette.js" defer></script>
@@ -267,7 +267,7 @@
267
267
  <!-- task 1003458: the hall's ONE claim/release action + refusal copy (window.OTBClaimAction).
268
268
  Before goals-render.js, which destructures errCode/errDetails/friendlyClaimError from it. -->
269
269
  <script src="/builders/claim-action.js?v=2026-09-26-claimaction1"></script>
270
- <script src="/builders/task-detail.js?v=2026-07-03-taskdetail"></script>
270
+ <script src="/builders/task-detail.js?v=2026-11-10-options"></script>
271
271
  <script src="/builders/brand-apply.js?v=2026-06-27-r75"></script>
272
272
  <script src="/builders/goals-lib.js?v=2026-08-21-goalslib1"></script>
273
273
  <!-- task 1003480: the per-goal dependency forest's pure model + layout —
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The hall's Goals list + goal detail through modules/ui-design/kit/render.js (task 1003307; redesigned in task 1003470). Goals is the LIST ARCHETYPE the governance-and-lists re-skin applies across thirteen pages, so its floors are measured first and the rest are held against them. Populated look: node scripts/hall-preview/server.js --port 4620 --fixture-me, then --base-in/--base-out at that origin (the harness carries goals, goals/rollups and work-categories since task 1003470). `filters` opens the kit's Filters disclosure (the five lenses that left the open bar); `cards` flips the rows|cards toggle on the count line.",
3
3
  "page": "/builders/goals",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
12
12
  <link rel="stylesheet" href="/builders/oversight.css">
13
13
  <link rel="stylesheet" href="/builders/government.css">
14
14
  </head>
@@ -155,10 +155,10 @@
155
155
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
156
156
 
157
157
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
158
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
158
+ <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
159
159
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
160
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
161
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
160
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
161
+ <script src="/builders/shell.js?v=2026-11-11-helm"></script>
162
162
  <script src="/builders/hall-dialog.js"></script>
163
163
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
164
164
  <script src="/builders/palette.js" defer></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "Government — the constitution, ranks, permissions and assignments, behind requireGovernmentPage (metic+). The tabbed panels are the state vocabulary here: one render per tab is what proves the panel switch does not reflow the column. Written with the re-skin (task 1003307) so this page is MEASURED at three widths in both modes rather than looked at once.",
3
3
  "page": "/builders/government",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -206,6 +206,8 @@
206
206
  // task 1005076: incomplete setup holds the hall behind setup-gate.js.
207
207
  setup: (onboarding && onboarding.setup) || null,
208
208
  builder,
209
+ // task 1005147: the character this builder holds (null: character creation shows).
210
+ character: ctx.lastMeState ? ctx.lastMeState.character : undefined,
209
211
  });
210
212
  }
211
213
  // The project's door, as the platform pushed it into this instance's pack
@@ -611,7 +613,7 @@
611
613
  }
612
614
  return { place: idx + 1, total: ranked.length, role };
613
615
  }
614
- const ROLE_AS = { engineer: 'an engineer', artist: 'an artist', ideator: 'an ideator' };
616
+ const ROLE_AS = { artisan: 'an artisan', artist: 'an artist' };
615
617
  // "#2 as an artist" — only when it says something the overall place does not.
616
618
  function rolePlaceText(p) {
617
619
  if (!p || !p.role || !ROLE_AS[p.role.craft] || p.role.place === p.place) return '';
@@ -251,7 +251,7 @@
251
251
  const h = hash(x.id), recent = i - x.week <= 1;
252
252
  band.push(circle(80 + (h % 1000) / 1000 * 840, 14 + (Math.floor(h / 1000) % 1000) / 1000 * (SKY_H - 34), recent ? 1.7 : 1.1, Object.assign({ fill: I.star, opacity: recent ? 0.75 : 0.28 }, x.week === i ? { class: 'hc-twinkle' } : {})));
253
253
  });
254
- out.push(node('a', { href: '/', class: 'hc-door hc-sky', 'data-craft-door': 'ideating', 'aria-label': `The ideas: ${fresh} new this week. Open the sky.`, 'data-tip': 'Ideas', 'data-tip-body': `${fresh} new this week. Click to look up at the sky.` }, band));
254
+ out.push(node('a', { href: '/thinking', class: 'hc-door hc-sky', 'aria-label': `The ideas: ${fresh} new this week. Open the sky.`, 'data-tip': 'Ideas', 'data-tip-body': `${fresh} new this week. Click to look up at the sky.` }, band));
255
255
 
256
256
  // every building on the ground, back to front; the civic core draws as one district
257
257
  const items = m.areas.map((a) => ({ k: 'area', a, depth: a.x + a.y + FOOT }));
@@ -363,7 +363,7 @@
363
363
  const p = P(tr[0], tr[1], 0);
364
364
  g.push(line(p, [p[0], p[1] - 9], I.dark, 1.6), circle(p[0], p[1] - 16, 8.5 + (n % 3) * 1.5, { fill: I.tree[n % 3] }));
365
365
  });
366
- return node('a', { href: '/', class: 'hc-door hc-museum' + quiet('museum'), 'data-craft-door': 'artistry', 'aria-label': 'The art museum, where the artists’ works hang. Go in.', 'data-tip': 'The art museum', 'data-tip-body': 'The art district: where the artists’ works hang, beside the park. Click to go in.' }, g);
366
+ return node('a', { href: '/', class: 'hc-door hc-museum' + quiet('museum'), 'data-craft-door': 'artist', 'aria-label': 'The art museum, where the artists’ works hang. Go in.', 'data-tip': 'The art museum', 'data-tip-body': 'The art district: where the artists’ works hang, beside the park. Click to go in.' }, g);
367
367
  }
368
368
  }
369
369
 
@@ -489,7 +489,7 @@
489
489
  const DOORS = {
490
490
  area: { href: '/goals', tip: 'Building', body: 'Every goal building in the city. Click to open the goals.', aria: 'The goal buildings. Open the goals.' },
491
491
  civic: { href: (Gov && Gov.STREET_HREF) || '/builders/street', tip: 'Government', body: 'The Cloud Bongos core. Click to walk the street.', aria: 'The government district. Walk the street.' },
492
- museum: { href: '/', door: 'artistry', tip: 'Art', body: 'The art museum. Click to go into the gallery.', aria: 'The art museum. Go into the gallery.' },
492
+ museum: { href: '/', door: 'artist', tip: 'Art', body: 'The art museum. Click to go into the gallery.', aria: 'The art museum. Go into the gallery.' },
493
493
  };
494
494
  const first = {};
495
495
  out.push(node('g', { class: 'hc-hits' }, hits.map(({ s, d }) => {
@@ -93,10 +93,14 @@ html[data-theme="dark"] .home-city.hc-is-sky { background: linear-gradient(color
93
93
  .hc-slab { animation: hc-lift 20s ease-in-out infinite; }
94
94
  .hc-orb, .hc-twinkle { animation: hc-glow 24s ease-in-out infinite; }
95
95
 
96
+ /* task 1005148: with the visor up (game mode), Home's greeting row keeps clear of its Actions pill. */
97
+ html.visor-on .hall-standing { transform: translateX(-140px); }
98
+
96
99
  /* a phone: the ladder runs full width under the city */
97
100
  @media (max-width: 700px) {
98
101
  .hc-stage { flex-direction: column; align-items: stretch; }
99
102
  .hc-svg { width: 100%; }
100
103
  .hc-ladder { width: auto; margin: 12px 18px 4px; }
101
104
  .hc-time { padding: 6px 16px 16px; }
105
+ html.visor-on .hall-standing { transform: none; } /* task 1005148: the visor's pills are in its bottom row here */
102
106
  }
@@ -39,10 +39,10 @@
39
39
  const SPEED = { rw: -1 / 34, play: 1 / 96, ff: 1 / 26 };
40
40
  const STILL = () => !!(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches);
41
41
  const CRAFTS = [
42
- ['art', 'artistry', 'Art', 'pages designed'],
43
- ['build', 'building', 'Build', 'shipped'],
42
+ ['art', 'artist', 'Art', 'pages designed'],
43
+ ['build', 'artisan', 'Build', 'shipped'],
44
44
  ['idea', 'ideating', 'Ideas', 'ideas'],
45
- ['gov', 'governing', 'Govern', 'votes and decisions'],
45
+ ['gov', 'patron', 'Govern', 'votes and decisions'],
46
46
  ];
47
47
  // the ideator's line: a lightbulb, a star, and an arrow into the work
48
48
  const IDEATOR = [
@@ -74,7 +74,10 @@
74
74
  return d && !isNaN(d) ? 'week of ' + d.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', timeZone: 'UTC' }) : 'that week';
75
75
  }
76
76
 
77
- // Ideating draws the sky; every other craft (or none) the builder's city.
77
+ // The ideator's sky Home went with the Ideating mode when the ideator folded into
78
+ // the artist (task 1005141): every craft now lands in the builder's city, and the
79
+ // sky is a door away (the city's sky door, Your thinking). Kept as one switch so the
80
+ // sky branch can come back as its own view without re-plumbing the draw.
78
81
  function craft() {
79
82
  const CM = window.OTBCraftMode;
80
83
  const m = CM && typeof CM.current === 'function' ? CM.current() : document.documentElement.dataset.craft;
@@ -292,11 +295,13 @@
292
295
 
293
296
  // ---- the artist's Home (task 1005060): in Artistry the same section is the gallery,
294
297
  // home-gallery.js, the bench in the museum the city's art district opens onto ----
295
- // In Ideating, the idea box (home-idea-box.js) opens Home above the sky, and shows even
296
- // when the sky could not be read: filing an idea needs no picture of the others.
298
+ // The idea box (home-idea-box.js) opens the artist's Home above the gallery: ideation
299
+ // folded into the artist (task 1005141), so the box task 1005078 built for Ideating moved
300
+ // with it. It shows even when the sky could not be read: filing an idea needs no picture.
297
301
  function craftHome() {
298
- const art = !!gallery && document.documentElement.dataset.craft === 'artistry';
299
- const idea = !!ideaBox && craft() === 'ideating';
302
+ const isArtist = document.documentElement.dataset.craft === 'artist';
303
+ const art = !!gallery && isArtist;
304
+ const idea = !!ideaBox && isArtist;
300
305
  host.classList.toggle('hc--gallery', art);
301
306
  if (gallery) gallery.show(art);
302
307
  if (ideaBox) ideaBox.show(idea);
@@ -306,7 +311,7 @@
306
311
  // ---- the governor's Home is the street; tests swap the hop for a recorder ----
307
312
  function streetHop() {
308
313
  const href = window.GovCity && window.GovCity.STREET_HREF;
309
- if (document.documentElement.dataset.craft !== 'governing' || !href) return false;
314
+ if (document.documentElement.dataset.craft !== 'patron' || !href) return false;
310
315
  (window.OTBHomeStreetHop || ((h) => window.location.assign(h)))(href);
311
316
  return true;
312
317
  }
@@ -348,6 +353,9 @@
348
353
  new MutationObserver(() => { if (model) drawScene(); }).observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] });
349
354
  document.addEventListener('otb:craft', () => { if (model) { drawScene(); drawLadder(); } });
350
355
  window.addEventListener('resize', () => { if (model) drawLadder(); });
356
+ // task 1005148: Home's city as the visor's scene; R13 adds its camera's actions here.
357
+ window.__visorScene = { name: 'home', place: 'Home' };
358
+ if (window.OTBVisor) window.OTBVisor.scene(window.__visorScene);
351
359
  load();
352
360
  }
353
361
 
@@ -272,7 +272,14 @@
272
272
  if (e.key === 'ArrowLeft') { go(at - 1); e.preventDefault(); }
273
273
  else if (e.key === 'ArrowRight') { go(at + 1); e.preventDefault(); }
274
274
  else if ((e.key === 'f' || e.key === 'F') && !e.metaKey && !e.ctrlKey && !e.altKey) { setFs(!isFs()); e.preventDefault(); }
275
- else if (e.key === 'Escape') { if (isFs()) setFs(false); track.querySelectorAll('.hg-hang.is-reading').forEach(function (h) { read(h, false); }); }
275
+ else if (e.key === 'Escape') {
276
+ // Spent only when it closed something (ADR 0399 §2.4 row 5, task 1005144); an Escape that
277
+ // closed nothing falls through to the options menu in game mode.
278
+ var reading = track.querySelectorAll('.hg-hang.is-reading');
279
+ if (isFs() || reading.length) e.preventDefault();
280
+ if (isFs()) setFs(false);
281
+ reading.forEach(function (h) { read(h, false); });
282
+ }
276
283
  });
277
284
  track.addEventListener('click', function (e) {
278
285
  var h = e.target.closest('.hg-heart');
@@ -29,5 +29,5 @@
29
29
  .hib-said--err { color: var(--danger); }
30
30
  .hib-said a { color: var(--ink); }
31
31
 
32
- /* The setup guide is about building on your own machine; in Ideating, Home opens on the box */
33
- html[data-craft="ideating"] #welcome-scroll { display: none; }
32
+ /* The setup guide is about building on your own machine; an artist's Home opens on the box */
33
+ html[data-craft="artist"] #welcome-scroll { display: none; }
@@ -2,7 +2,7 @@
2
2
  // (goal 1000095, the owner's "work-first hall", 2026-11-04; record
3
3
  // modules/hall-ui/records/home-city.md § "The idea box").
4
4
  //
5
- // In Ideating, the first thing on Home is a place to type an idea and file it; the sky
5
+ // In the artist's Home (Ideating folded into it, task 1005141), the first thing is a place to type an idea and file it; the sky
6
6
  // and the ladder of ideators stay under it, secondary. It is ONE box and a button
7
7
  // (owner, 2026-11-05: "only one box"): Enter files, Shift+Enter starts a new line, and
8
8
  // the box grows with what is typed. The first line is the idea's title, any lines after
@@ -12,7 +12,7 @@
12
12
  // Your thinking, where every thought the builder filed is listed.
13
13
  //
14
14
  // It is not a hall widget of its own (Home's stats zone holds one): home-city.js
15
- // attaches it at the top of its section and shows it when the craft is Ideating, the
15
+ // attaches it at the top of its section and shows it when the craft is Artist, the
16
16
  // way it shows the gallery in Artistry. It reads nothing; it writes one thing.
17
17
  (function () {
18
18
  'use strict';
@@ -97,7 +97,7 @@
97
97
  });
98
98
 
99
99
  return {
100
- // shown in Ideating
100
+ // shown in the artist's Home
101
101
  show: function (on) { root.hidden = !on; },
102
102
  };
103
103
  }
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
12
12
  <!-- The record archetype, shared with task.html (task 1003305). idea.css below
13
13
  carries only what an idea record has and a task record does not. -->
14
14
  <link rel="stylesheet" href="/builders/record.css">
@@ -51,15 +51,15 @@
51
51
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
52
52
 
53
53
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
54
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
54
+ <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
55
55
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
56
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
57
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
56
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
57
+ <script src="/builders/shell.js?v=2026-11-11-helm"></script>
58
58
  <script src="/builders/hall-dialog.js"></script>
59
59
  <script src="/builders/palette.js" defer></script>
60
60
  <!-- task-detail.js still owns the #/idea/N and #/blocker/N overlay, so a ref
61
61
  written inside an idea's own prose keeps resolving from this page. -->
62
- <script src="/builders/task-detail.js?v=2026-07-03-taskdetail2" defer></script>
62
+ <script src="/builders/task-detail.js?v=2026-11-10-options" defer></script>
63
63
  <script src="/builders/brand-apply.js?v=2026-06-19-r56" defer></script>
64
64
  <script src="/builders/md-reader.js" defer></script>
65
65
  <script src="/builders/idea.js?v=2026-08-22-r153" defer></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The hall's IDEA RECORD through modules/ui-design/kit/render.js (task 1003305). Same harness note as task.states.json: the idea's five answers, its completeness bar and its author-only mark control need a LOADED idea, so run it against the hall-preview harness:\n\n node scripts/hall-preview/server.js --port 4612 --fixture-me\n node modules/ui-design/kit/render.js --states modules/hall-ui/public/idea.states.json --base-in http://builders.localhost:4612 --base-out http://builders.localhost:4612",
3
3
  "page": "/idea/12",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -12,7 +12,7 @@
12
12
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
13
13
  <link rel="preconnect" href="https://fonts.googleapis.com">
14
14
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
15
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
15
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
16
16
  <link rel="stylesheet" href="/builders/ideas.css">
17
17
  </head>
18
18
  <body data-page="ideas" data-page-title="Ideas">
@@ -226,17 +226,17 @@
226
226
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
227
227
 
228
228
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
229
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
229
+ <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
230
230
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
231
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
232
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
231
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
232
+ <script src="/builders/shell.js?v=2026-11-11-helm"></script>
233
233
  <script src="/builders/hall-dialog.js"></script>
234
234
  <script src="/builders/palette.js" defer></script>
235
235
  <!-- task 1004727: the ONE karma vote control every task/idea list renders -->
236
236
  <script src="/builders/vote-control.js"></script>
237
237
  <!-- task 1003069 (R08) — the quick-filing form's routed result links a task
238
238
  through window.OTBTaskDetail.href(); guarded if this ever loads without it. -->
239
- <script src="/builders/task-detail.js?v=2026-07-03-taskdetail2" defer></script>
239
+ <script src="/builders/task-detail.js?v=2026-11-10-options" defer></script>
240
240
  <script src="/builders/ideas.js?v=2026-09-24-r04fold"></script>
241
241
  </body>
242
242
  </html>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The hall's IDEA COMPOSER through modules/ui-design/kit/render.js (task 1003305). The five questions are rendered from GET /inbox/template and the spark queue from GET /inbox/sparks, so the populated form needs the hall-preview harness; the kit's own stub answers neither and renders the honest `could not load the idea template` line instead, which is the `no-template` state below.\n\n node scripts/hall-preview/server.js --port 4612 --fixture-me\n node modules/ui-design/kit/render.js --states modules/hall-ui/public/ideas.states.json --base-in http://builders.localhost:4612 --base-out http://builders.localhost:4612\n\nTHE FOLD (task 1004087 / spec R04) is why there are now three states rather than two. `compose` is what a builder actually lands on — the one-line composer at the top, the Full Idea form folded away behind one press, and NO rail reserve, which is the whole reason that state is rendered at 1440 as well as at 390/320. `full` is the same page one press later: the five questions, the meter, and the rail. Rendering only one of them would measure half the page, and the half that is measured on every arrival is the first.",
3
3
  "page": "/ideas",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The founding wall on Home (task 1004424): the home-founding widget a founded project shows, from the kit fixture founding-builders-sample.json. The page itself is index.states.json's; only the founding read differs. The never-founded case is index.states.json, where the wall stays hidden. Run it with --states (Home has no last path segment).",
3
3
  "page": "/builders/",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The genesis home on Home (task 1004423) while the founder decides the plan: each stage's length and done-when line, the starting government by its real name with its plain explanation (the recommended one picked, from government-constitution-sample.json), passes and advisors, every default pre-picked so a solo founder needs one click. /founding/genesis answers founding-genesis-decide.json, built from the real server shaper.",
3
3
  "page": "/builders/",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The genesis home of a DEMO, born into genesis (task 1004506): 3 people, 4 hours each. The plan was settled at birth from the demo's picks, so there is no decide form: one line names the plan, and each stage reads in minutes (scope in progress, due at a time). /me says founding at scope (kit fixture me-founding-demo.json) and /founding/genesis answers founding-genesis-demo.json, built from the real server shaper. A real project's genesis is index-genesis.states.json and index-genesis-decide.states.json; a hall that is not founding is index.states.json.",
3
3
  "page": "/builders/",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The genesis home on Home (task 1004423), mid-genesis: scope passed, strategize in progress. /me says founding (kit fixture me-founding.json) and /founding/genesis answers founding-genesis-stage.json, built from the real server shaper. The deciding step is index-genesis-decide.states.json; a hall that is not founding is index.states.json, where the card never renders and never asks. Run it with --states (Home has no last path segment).",
3
3
  "page": "/builders/",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -18,10 +18,12 @@
18
18
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
19
19
  <link rel="preconnect" href="https://fonts.googleapis.com">
20
20
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
21
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
21
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
22
+ <link rel="stylesheet" href="/builders/visor.css?v=2026-11-10-visor">
22
23
  <link rel="stylesheet" href="/builders/welcome-boot.css?v=2026-11-07-brand-mark">
24
+ <link rel="stylesheet" href="/builders/shell-game.css?v=2026-11-11-helm">
23
25
  <link rel="stylesheet" href="/builders/hall-ask.css">
24
- <link rel="stylesheet" href="/builders/home-city.css">
26
+ <link rel="stylesheet" href="/builders/home-city.css?v=2026-11-10-visor">
25
27
  <link rel="stylesheet" href="/builders/home-gallery.css">
26
28
  <link rel="stylesheet" href="/builders/home-idea-box.css">
27
29
  </head>
@@ -98,7 +100,7 @@
98
100
  <!-- shared frontend toolkit (window.OTB) — loaded FIRST so every consuming
99
101
  IIFE below can pull escapeHtml/$/fmtNum/... from one place. -->
100
102
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
101
- <script src="/builders/task-detail.js?v=2026-07-03-taskdetail" defer></script>
103
+ <script src="/builders/task-detail.js?v=2026-11-10-options" defer></script>
102
104
  <!-- R56 (task 1195): apply the instance currency label from window.__BRANDING__
103
105
  to [data-currency-label]/[data-currency-tmpl] markup + expose OTBBranding.
104
106
  Loaded BEFORE builders.js so the global is ready when the hall renders. -->
@@ -108,11 +110,13 @@
108
110
  <!-- task 1004785: the first-visit-of-the-day welcome (the tower). Before shell.js, which asks it
109
111
  before the craft picker so the two never stack. Home only. -->
110
112
  <script src="/builders/welcome-boot.js?v=2026-11-07-brand-mark" defer></script>
111
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode" defer></script>
113
+ <script src="/builders/shell-game.js?v=2026-11-11-helm" defer></script>
112
114
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers" defer></script>
113
- <script src="/builders/craft-mode.js?v=2026-11-05-goals" defer></script>
114
- <script src="/builders/shell.js?v=2026-11-09-game-mode" defer></script>
115
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor" defer></script>
116
+ <script src="/builders/shell.js?v=2026-11-11-helm" defer></script>
115
117
  <script src="/builders/hall-dialog.js" defer></script>
118
+ <!-- task 1005148: the visor (glass over the scene, game mode only; ADR 0399), after the shell and hall-dialog.js -->
119
+ <script src="/builders/visor.js?v=2026-11-10-visor" defer></script>
116
120
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
117
121
  <script src="/builders/palette.js" defer></script>
118
122
  <!-- task 2166: the shared component kit (window.OTBKit) — pager/ledger/rail.
@@ -135,7 +139,7 @@
135
139
  <script src="/builders/home-city-draw.js" defer></script>
136
140
  <script src="/builders/home-gallery.js" defer></script>
137
141
  <script src="/builders/home-idea-box.js" defer></script>
138
- <script src="/builders/home-city.js" defer></script>
142
+ <script src="/builders/home-city.js?v=2026-11-10-visor" defer></script>
139
143
  <!-- task 1003455: the shared blocker-row renderer (window.OTBBlockersLib), read by
140
144
  both goal-inbox.js's attention-inbox slice below and the /blockers page.
141
145
  Loaded BEFORE goal-inbox.js, which calls it while rendering. -->
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The hall's HOME page through modules/ui-design/kit/render.js (task 1003304). Home is served at the surface root, so its page path has no last segment to name the file — run it with `--states modules/hall-ui/public/index.states.json`, not `--page`.",
3
3
  "page": "/builders/",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
12
12
  <link rel="stylesheet" href="/builders/market-watch.css">
13
13
  </head>
14
14
  <body data-page="market-watch-item" data-page-title="Market Watch">
@@ -72,10 +72,10 @@
72
72
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
73
73
 
74
74
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
75
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
75
+ <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
76
76
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
77
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
78
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
77
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
78
+ <script src="/builders/shell.js?v=2026-11-11-helm"></script>
79
79
  <script src="/builders/hall-dialog.js"></script>
80
80
  <script src="/builders/palette.js" defer></script>
81
81
  <script src="/builders/hall-kit.js"></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "MARKET WATCH ITEM, the dossier (task 1004939; design of record docs/design/mocks/market-watch/item.html, option B). One read, GET /market-watch/items/:id. Against the kit's own stub it 404s with no item code, which the page reads as the module being off. The populated card and case file need the hall-preview harness with the module reported on; its market-watch__items__4.json (GitHub Copilot coding agent) and market-watch__items__37.json (NLnet Foundation) fixtures were built from the committed 2026-10-28 seed through the real shapes:\n\n node scripts/hall-preview/server.js --port 4639 --fixture-me --modules-on market-watch\n node modules/ui-design/kit/render.js --states modules/hall-ui/public/market-watch-item.states.json --base-in http://localhost:4639 --base-out http://localhost:4639",
3
3
  "page": "/builders/market-watch-item?id=4",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
12
12
  <link rel="stylesheet" href="/builders/hall-ask.css">
13
13
  <link rel="stylesheet" href="/builders/market-watch-rules.css">
14
14
  </head>
@@ -41,10 +41,10 @@
41
41
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
42
42
 
43
43
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
44
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
44
+ <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
45
45
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
46
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
47
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
46
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
47
+ <script src="/builders/shell.js?v=2026-11-11-helm"></script>
48
48
  <script src="/builders/hall-dialog.js"></script>
49
49
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
50
50
  <script src="/builders/palette.js" defer></script>
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_": "The Market Watch rules page (task 1004941), built to docs/design/mocks/market-watch/rules.html, option C (the pipeline map). One read, GET /market-watch/rules. Against the kit's own stub it 404s, so the page renders its 'Market Watch is off' state, which the floors must hold too. TO SEE IT POPULATED, point the kit at the hall-preview harness: `node scripts/hall-preview/server.js --port 4641 --fixture-me`, then `render.js --page /builders/market-watch-rules --base-in http://builders.localhost:4641 --base-out http://builders.localhost:4641`. The harness answers from fixtures/market-watch__rules.json, built by the real composers (rules-view.buildView over the seed's rules and 60 items, two approved changes and four open proposals). Steps are opened with clickIfVisible because against the stub the nodes do not exist.",
3
3
  "page": "/builders/market-watch-rules",
4
+ "modes": ["dark"],
4
5
  "_storage": "The hall asks a first-visit question (the session mode picker, craft-mode.js) over every page; seeding \"already asked\" renders the page a returning builder sees (task 1005080).",
5
6
  "storage": { "session": { "hall-craft-asked": "1" } },
6
7
  "surface": "hall-ui",
@@ -8,7 +8,7 @@
8
8
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-11-helm">
12
12
  <link rel="stylesheet" href="/builders/market-watch.css">
13
13
  <link rel="stylesheet" href="/builders/market-watch-settings.css">
14
14
  </head>
@@ -26,11 +26,8 @@
26
26
  </div>
27
27
 
28
28
  <main id="hall-main">
29
- <!-- task 1005045: the owner's tabs. Hidden for everyone else, who see the watch
30
- alone; market-watch.js builds the strip only for the owner (cosmetic: the
31
- settings routes are the wall, ADR 0016). #settings is where the old
32
- /market-watch-settings URL lands. -->
33
- <div id="mw-tabs" hidden></div>
29
+ <!-- task 1005144: the owner's settings panel below shows only inside the options
30
+ menu's frame (?embed=1); a plain visit is the watch alone, with no tab strip. -->
34
31
 
35
32
  <div id="mw-panel-watch">
36
33
  <p class="hall-loading hall-loading--page" id="mw-loading" role="status">Loading the watch…</p>
@@ -186,10 +183,10 @@
186
183
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
187
184
 
188
185
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
189
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
186
+ <script src="/builders/shell-game.js?v=2026-11-11-helm"></script>
190
187
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
191
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
192
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
188
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
189
+ <script src="/builders/shell.js?v=2026-11-11-helm"></script>
193
190
  <script src="/builders/hall-dialog.js"></script>
194
191
  <script src="/builders/palette.js" defer></script>
195
192
  <script src="/builders/hall-kit.js"></script>