@bongos/core 1.24.78 → 1.24.80

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 (369) hide show
  1. package/.bongos-core.json +498 -353
  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/README.md +3 -0
  17. package/docs/api/openapi.json +195 -3
  18. package/docs/api-reference.md +8 -4
  19. package/docs/architecture.md +7 -3
  20. package/docs/copy-inventory.md +390 -370
  21. package/docs/copy-registry.json +719 -518
  22. package/docs/design/characters/character-sprites-source.webp +0 -0
  23. package/docs/file-map.md +7 -8
  24. package/docs/module-api-changelog.md +4 -0
  25. package/docs/modules-contract.md +5 -0
  26. package/docs/onboarding/slash-commands.md +1 -1
  27. package/docs/packs/{engineer.md → artisan.md} +5 -5
  28. package/docs/packs/artist.md +50 -4
  29. package/docs/page-inventory.json +15 -4
  30. package/docs/page-readings.json +3182 -3336
  31. package/docs/{packs/ideator.md → recipes/ideation-playbook.md} +5 -48
  32. package/migrations/core_296_crafts_artisan_artist.sql +72 -0
  33. package/migrations/core_297_builder_character.sql +30 -0
  34. package/modules/copy-desk/proposals.js +1 -1
  35. package/modules/economy/credits-by-craft.js +29 -15
  36. package/modules/hall-ui/public/ai-studio.html +4 -4
  37. package/modules/hall-ui/public/atlas.html +5 -5
  38. package/modules/hall-ui/public/atlas.js +3 -1
  39. package/modules/hall-ui/public/blockers.html +5 -5
  40. package/modules/hall-ui/public/board-room.html +4 -4
  41. package/modules/hall-ui/public/characters/artisan.png +0 -0
  42. package/modules/hall-ui/public/characters/artist.png +0 -0
  43. package/modules/hall-ui/public/characters/patron.png +0 -0
  44. package/modules/hall-ui/public/city.css +2 -1
  45. package/modules/hall-ui/public/city.html +9 -6
  46. package/modules/hall-ui/public/city.js +7 -1
  47. package/modules/hall-ui/public/collab.html +4 -4
  48. package/modules/hall-ui/public/commands.html +4 -4
  49. package/modules/hall-ui/public/copy-desk.html +4 -4
  50. package/modules/hall-ui/public/craft-mode.js +258 -64
  51. package/modules/hall-ui/public/deploy.html +4 -4
  52. package/modules/hall-ui/public/diagram-viewer.js +2 -1
  53. package/modules/hall-ui/public/dom-utils.js +1 -1
  54. package/modules/hall-ui/public/goal-map.html +9 -6
  55. package/modules/hall-ui/public/goals.html +5 -5
  56. package/modules/hall-ui/public/government.html +4 -4
  57. package/modules/hall-ui/public/hall-render.js +3 -1
  58. package/modules/hall-ui/public/home-city-draw.js +3 -3
  59. package/modules/hall-ui/public/home-city.css +4 -0
  60. package/modules/hall-ui/public/home-city.js +17 -9
  61. package/modules/hall-ui/public/home-gallery.js +8 -1
  62. package/modules/hall-ui/public/home-idea-box.css +2 -2
  63. package/modules/hall-ui/public/home-idea-box.js +3 -3
  64. package/modules/hall-ui/public/idea.html +5 -5
  65. package/modules/hall-ui/public/ideas.html +5 -5
  66. package/modules/hall-ui/public/index.html +11 -7
  67. package/modules/hall-ui/public/market-watch-item.html +4 -4
  68. package/modules/hall-ui/public/market-watch-rules.html +4 -4
  69. package/modules/hall-ui/public/market-watch.html +6 -9
  70. package/modules/hall-ui/public/market-watch.js +22 -45
  71. package/modules/hall-ui/public/modules.html +4 -4
  72. package/modules/hall-ui/public/money.html +4 -4
  73. package/modules/hall-ui/public/my-agents.html +4 -4
  74. package/modules/hall-ui/public/options-menu.js +409 -0
  75. package/modules/hall-ui/public/paintbrush.js +3 -3
  76. package/modules/hall-ui/public/palette.js +11 -13
  77. package/modules/hall-ui/public/primer.html +5 -5
  78. package/modules/hall-ui/public/profile-crafts.js +1 -1
  79. package/modules/hall-ui/public/profile-roles.js +23 -19
  80. package/modules/hall-ui/public/profile.css +1 -1
  81. package/modules/hall-ui/public/profile.html +19 -18
  82. package/modules/hall-ui/public/profile.js +19 -18
  83. package/modules/hall-ui/public/profile.states.json +4 -4
  84. package/modules/hall-ui/public/project-settings.html +4 -4
  85. package/modules/hall-ui/public/roster.html +4 -4
  86. package/modules/hall-ui/public/roster.js +3 -3
  87. package/modules/hall-ui/public/settings.css +24 -4
  88. package/modules/hall-ui/public/settings.html +21 -17
  89. package/modules/hall-ui/public/settings.js +44 -44
  90. package/modules/hall-ui/public/shell-game.css +65 -0
  91. package/modules/hall-ui/public/shell-game.js +283 -3
  92. package/modules/hall-ui/public/shell.js +7 -26
  93. package/modules/hall-ui/public/sky-interaction.js +7 -0
  94. package/modules/hall-ui/public/speciality-tools.js +1 -2
  95. package/modules/hall-ui/public/street-inside.js +3 -4
  96. package/modules/hall-ui/public/street.html +4 -4
  97. package/modules/hall-ui/public/studio.html +5 -5
  98. package/modules/hall-ui/public/style.css +73 -47
  99. package/modules/hall-ui/public/task-detail.js +5 -4
  100. package/modules/hall-ui/public/task.html +5 -5
  101. package/modules/hall-ui/public/thinking.css +10 -0
  102. package/modules/hall-ui/public/thinking.html +9 -6
  103. package/modules/hall-ui/public/tweak-editor.html +5 -5
  104. package/modules/hall-ui/public/tweak-editor.js +5 -1
  105. package/modules/hall-ui/public/update-pill.js +91 -2
  106. package/modules/hall-ui/public/visor.css +80 -0
  107. package/modules/hall-ui/public/visor.js +316 -0
  108. package/modules/hall-ui/public/watch-repo-invite.js +159 -0
  109. package/modules/hall-ui/public/watch.html +6 -5
  110. package/modules/hall-ui/public/watch.js +17 -2
  111. package/modules/hall-ui/public/welcome-boot.js +15 -6
  112. package/modules/hall-ui/public/work.html +5 -5
  113. package/modules/hall-ui/records/builders-roster.md +2 -2
  114. package/modules/hall-ui/records/craft-mode.md +13 -11
  115. package/modules/hall-ui/records/game-mode.md +2 -2
  116. package/modules/hall-ui/records/governor-street.md +1 -1
  117. package/modules/hall-ui/records/home-city.md +3 -1
  118. package/modules/hall-ui/records/market-watch-settings.md +2 -0
  119. package/modules/hall-ui/records/options-menu.md +15 -0
  120. package/modules/hall-ui/records/profile-roles.md +11 -11
  121. package/modules/hall-ui/records/sky.md +3 -3
  122. package/modules/hall-ui/records/start-screen.md +21 -0
  123. package/modules/hall-ui/records/tweak-editor.md +1 -1
  124. package/modules/hall-ui/records/update-pill.md +12 -0
  125. package/modules/hall-ui/records/visor.md +23 -0
  126. package/modules/hall-ui/records/welcome-tower.md +5 -5
  127. package/modules/ideas/ideator-stats.js +3 -1
  128. package/modules/ideas/inbox.js +2 -2
  129. package/modules/lifecycle/activity.js +1 -1
  130. package/modules/lifecycle/cascade.js +4 -4
  131. package/modules/lifecycle/goal-spec-task.js +1 -1
  132. package/modules/lifecycle/help-requests.js +19 -15
  133. package/modules/lifecycle/kickoff-checklist.js +3 -3
  134. package/modules/lifecycle/kickoff-seed.js +1 -1
  135. package/modules/lifecycle/migrations/lifecycle_021_crafts_artisan_artist.sql +29 -0
  136. package/modules/lifecycle/mingle.js +4 -4
  137. package/modules/lifecycle/page-tweak-write.js +1 -1
  138. package/modules/lifecycle/routes/task-write-routes.js +3 -1
  139. package/modules/lifecycle/routes/tasks.js +3 -3
  140. package/modules/lifecycle/ship-card.js +2 -3
  141. package/modules/lifecycle/task-classifier.js +39 -29
  142. package/modules/lifecycle/tests/cascade.mjs +7 -7
  143. package/modules/onboarding/founding-mode.js +3 -0
  144. package/modules/onboarding/genesis-home.js +21 -1
  145. package/modules/onboarding/routes/onboarding.js +2 -0
  146. package/modules/page-notes/notes.js +3 -2
  147. package/modules/page-notes/split.js +1 -1
  148. package/modules/platform-identity/craft-rollup.js +35 -7
  149. package/modules/platform-identity/migrations/platform_identity_036_crafts_artisan_artist.sql +45 -0
  150. package/modules/platform-identity/platform-identity.js +2 -2
  151. package/modules/platform-identity/routes/community-leaderboard.js +2 -1
  152. package/modules/platform-identity/routes/community-search.js +2 -1
  153. package/modules/platform-identity/routes/sso.js +2 -1
  154. package/modules/platform-identity/tests/platform-identity.mjs +6 -6
  155. package/modules/public-landing/public/community.html +3 -5
  156. package/modules/public-landing/public/index.html +1 -1
  157. package/modules/public-landing/public/projects.html +1 -1
  158. package/modules/specialities/migrations/specialities_004_crafts_artisan_artist.sql +30 -0
  159. package/modules/specialities/routes/specialities.js +2 -2
  160. package/modules/status-ui/public/status.js +1 -1
  161. package/modules/ui-design/kit/fixtures/community-leaderboard.json +10 -10
  162. package/modules/ui-design/kit/fixtures/community-search.json +2 -2
  163. package/modules/ui-design/kit/fixtures/scouting-recruiter.json +1 -1
  164. package/package-lock.json +2 -2
  165. package/package.json +1 -1
  166. package/release-notes.json +76 -0
  167. package/scripts/bongos/autobongos-host.js +19 -4
  168. package/scripts/bongos/autobongos-loop.js +1 -1
  169. package/scripts/bongos/claude-materialize.js +20 -1
  170. package/scripts/bongos/discipline-modes.json +7 -12
  171. package/scripts/bongos/fitness.js +1 -1
  172. package/scripts/bongos/gen-hall-sitemap.js +7 -7
  173. package/scripts/bongos/grade-smoke.js +2 -2
  174. package/scripts/bongos/init.js +2 -2
  175. package/scripts/bongos/newcomer-floor.config.json +1 -2
  176. package/scripts/bongos/newcomer-floor.js +4 -3
  177. package/scripts/bongos/newcomer-floor.templates.json +10 -12
  178. package/scripts/bongos/newcomer-floor.test.js +47 -38
  179. package/scripts/bongos/role-pack-guard.js +5 -4
  180. package/scripts/bongos/seed-tasks.example.json +3 -3
  181. package/scripts/bongos/setup.js +20 -107
  182. package/scripts/bongos/start.js +2 -2
  183. package/scripts/bongos/task.js +5 -4
  184. package/scripts/bongos/triage.js +1 -1
  185. package/scripts/bongos/worktree.js +16 -4
  186. package/scripts/setup-builder.js +6 -46
  187. package/src/bongos/auth-admission.js +8 -8
  188. package/src/bongos/craft-mode.js +2 -0
  189. package/src/bongos/db.js +39 -1
  190. package/src/bongos/github-repos.js +78 -0
  191. package/src/bongos/module-scope-map.js +22 -0
  192. package/src/bongos/role-stats.js +27 -11
  193. package/src/bongos/routes/github.js +100 -2
  194. package/src/bongos/routes/me.js +33 -0
  195. package/src/bongos/serve-internal.js +26 -9
  196. package/src/crafts.js +66 -0
  197. package/src/module-api.js +6 -1
  198. package/src/module-loader/manifest-schema.js +16 -0
  199. package/src/modules.js +2 -2
  200. package/src/role-responsibilities.js +6 -5
  201. package/tests/acclaim_feed_evidence_db.mjs +1 -1
  202. package/tests/activity_rollup_as_of.mjs +1 -1
  203. package/tests/api_alias_caller_ratchet.mjs +3 -3
  204. package/tests/application_lifecycle.mjs +1 -1
  205. package/tests/artist_review.mjs +1 -1
  206. package/tests/artist_review_goal.mjs +1 -1
  207. package/tests/autobongos_host.mjs +19 -1
  208. package/tests/blocker_hall_live_proof.mjs +1 -1
  209. package/tests/blocker_tasks_named_db.mjs +2 -2
  210. package/tests/canonical_profile_url.mjs +1 -1
  211. package/tests/cap_newcomer_tasks.mjs +13 -13
  212. package/tests/character_creation.mjs +294 -0
  213. package/tests/claim_gate_open_blocker.mjs +2 -2
  214. package/tests/claim_gate_rebase.mjs +6 -6
  215. package/tests/claude_materialize.mjs +75 -1
  216. package/tests/clawback_confirmed_backlog.mjs +3 -3
  217. package/tests/collab_page.mjs +8 -9
  218. package/tests/collab_self_settling.mjs +2 -2
  219. package/tests/community_leaderboard_route.mjs +13 -5
  220. package/tests/community_proof_db.mjs +3 -0
  221. package/tests/community_search_route.mjs +7 -6
  222. package/tests/conductor.mjs +1 -1
  223. package/tests/conductor_main_e2e.mjs +8 -8
  224. package/tests/copy_desk_flags_db.mjs +1 -1
  225. package/tests/copy_desk_page_approve.mjs +2 -2
  226. package/tests/copy_desk_page_claim.mjs +2 -2
  227. package/tests/copy_desk_page_next.mjs +1 -1
  228. package/tests/copy_desk_page_release.mjs +1 -1
  229. package/tests/copy_desk_page_submit.mjs +2 -2
  230. package/tests/core_258_box_session_claims_db.mjs +1 -1
  231. package/tests/craft_mode.mjs +48 -34
  232. package/tests/craft_mode_home.mjs +20 -20
  233. package/tests/craft_mode_looks.mjs +16 -15
  234. package/tests/craft_mode_nav.mjs +31 -29
  235. package/tests/craft_review_mode.mjs +46 -41
  236. package/tests/crafts_vocabulary.mjs +70 -0
  237. package/tests/cross_discipline_priority_direction.mjs +5 -5
  238. package/tests/fitness.mjs +7 -11
  239. package/tests/funded_project_pays_proof_db.mjs +1 -1
  240. package/tests/genesis_home.mjs +21 -1
  241. package/tests/github_chip.mjs +3 -3
  242. package/tests/github_repo_invite.mjs +379 -0
  243. package/tests/goal_criterion_confirm_ui.mjs +1 -1
  244. package/tests/goal_invite_consent.mjs +1 -1
  245. package/tests/goal_map_page.mjs +2 -2
  246. package/tests/goal_sort_staleness.mjs +1 -1
  247. package/tests/goal_spec_task.mjs +1 -1
  248. package/tests/goal_spec_task_db.mjs +3 -3
  249. package/tests/grade_engine.mjs +2 -2
  250. package/tests/grader_no_artifact.mjs +1 -1
  251. package/tests/grader_prompt_fencing.mjs +1 -1
  252. package/tests/grader_prompt_window_bound.mjs +1 -1
  253. package/tests/grader_reader_lens.mjs +2 -2
  254. package/tests/grader_severity_gate.mjs +1 -1
  255. package/tests/grader_unbacked_score.mjs +1 -1
  256. package/tests/hall_approval_queue.mjs +1 -1
  257. package/tests/hall_board_world.mjs +2 -2
  258. package/tests/hall_builders_page_pass.mjs +1 -1
  259. package/tests/hall_city.mjs +1 -1
  260. package/tests/hall_fullscreen.mjs +27 -3
  261. package/tests/hall_kit_charts.mjs +1 -1
  262. package/tests/hall_landing_boot.mjs +1 -1
  263. package/tests/hall_my_agents.mjs +16 -16
  264. package/tests/hall_nav.mjs +22 -15
  265. package/tests/hall_options_menu.mjs +247 -0
  266. package/tests/hall_oversight_world.mjs +1 -1
  267. package/tests/hall_palette.mjs +8 -9
  268. package/tests/hall_profile_world.mjs +3 -3
  269. package/tests/hall_record_world.mjs +2 -2
  270. package/tests/hall_settings_world.mjs +2 -1
  271. package/tests/hall_sitemap.mjs +6 -5
  272. package/tests/hall_start_screen.mjs +244 -0
  273. package/tests/hall_street.mjs +2 -2
  274. package/tests/hall_street_inside.mjs +17 -9
  275. package/tests/hall_studio_world.mjs +3 -3
  276. package/tests/hall_visor.mjs +224 -0
  277. package/tests/help_requests.mjs +47 -15
  278. package/tests/helpers.mjs +4 -4
  279. package/tests/home_city.mjs +6 -4
  280. package/tests/home_city_widget.mjs +33 -14
  281. package/tests/home_gallery_widget.mjs +4 -4
  282. package/tests/home_idea_box.mjs +6 -6
  283. package/tests/hub_community_page.mjs +3 -3
  284. package/tests/hub_craft_rollup.mjs +75 -36
  285. package/tests/hub_recent_ships.mjs +3 -2
  286. package/tests/idea_cascade.mjs +2 -2
  287. package/tests/idea_credit_streams_db.mjs +1 -1
  288. package/tests/idea_detail_page.mjs +1 -1
  289. package/tests/idea_ideate_full.mjs +5 -2
  290. package/tests/idea_spark_hall.mjs +1 -1
  291. package/tests/init.mjs +3 -3
  292. package/tests/instance_manifest.mjs +2 -2
  293. package/tests/kickoff_checklist.mjs +1 -1
  294. package/tests/leaderboard_roles.mjs +34 -25
  295. package/tests/lifecycle_claim_ladder_refs.mjs +55 -0
  296. package/tests/lightbulb.mjs +14 -10
  297. package/tests/main_discipline.mjs +8 -8
  298. package/tests/markdown_line_endings.mjs +1 -1
  299. package/tests/market_watch_pages.mjs +52 -74
  300. package/tests/me_streak_leaderboard_queries.mjs +3 -3
  301. package/tests/migration_allocation.mjs +1 -1
  302. package/tests/mingle.mjs +36 -21
  303. package/tests/module-scope-map.mjs +22 -2
  304. package/tests/module_api.mjs +1 -0
  305. package/tests/module_contributions.mjs +13 -13
  306. package/tests/module_manifest.mjs +29 -0
  307. package/tests/module_skills_hook.mjs +2 -2
  308. package/tests/modules.mjs +14 -7
  309. package/tests/nav_permission_atoms.mjs +2 -1
  310. package/tests/needs_rebase.mjs +1 -1
  311. package/tests/newcomer_restock.mjs +13 -13
  312. package/tests/page_notes_panel.mjs +22 -22
  313. package/tests/page_tweak_no_block.mjs +1 -1
  314. package/tests/paintbrush.mjs +7 -7
  315. package/tests/privacy_matrix.mjs +1 -0
  316. package/tests/profile_activity.mjs +20 -23
  317. package/tests/profile_earnings.mjs +1 -1
  318. package/tests/profile_nudge_prefs.mjs +4 -4
  319. package/tests/profile_role_headline.mjs +73 -46
  320. package/tests/profile_role_stats.mjs +55 -45
  321. package/tests/profile_rollup_consent.mjs +19 -6
  322. package/tests/profile_route.mjs +12 -12
  323. package/tests/profile_ui_cross_project.mjs +4 -4
  324. package/tests/project_invite_suggestions.mjs +2 -2
  325. package/tests/promote_goal_id.mjs +1 -1
  326. package/tests/publish_manifest.mjs +1 -1
  327. package/tests/rank_floor_wiring.mjs +1 -1
  328. package/tests/regrade_actual_minutes.mjs +1 -1
  329. package/tests/removal_proposal.mjs +2 -2
  330. package/tests/reward_gate.mjs +4 -4
  331. package/tests/reward_mode_cost_plus_only.mjs +1 -1
  332. package/tests/role_responsibilities.mjs +18 -12
  333. package/tests/role_stats_db.mjs +17 -16
  334. package/tests/scouting_rollup_fanout.mjs +5 -5
  335. package/tests/seed_tasks.mjs +5 -2
  336. package/tests/session_earnings_mirror_db.mjs +1 -1
  337. package/tests/session_reward_on_land_db.mjs +1 -1
  338. package/tests/session_reward_reconcile_db.mjs +2 -2
  339. package/tests/sessions_kit_pager.mjs +1 -1
  340. package/tests/settings_art_key_absent.mjs +2 -2
  341. package/tests/settings_main_role.mjs +21 -20
  342. package/tests/setup_flow.mjs +3 -3
  343. package/tests/setup_smoke.mjs +20 -0
  344. package/tests/ship_card.mjs +6 -6
  345. package/tests/specialities.mjs +16 -4
  346. package/tests/speciality_db_shape.mjs +6 -6
  347. package/tests/speciality_injection.mjs +17 -17
  348. package/tests/speciality_offer_ui.mjs +5 -5
  349. package/tests/speciality_offered.mjs +6 -5
  350. package/tests/speciality_session_skills.mjs +7 -7
  351. package/tests/speciality_skills.mjs +11 -11
  352. package/tests/speciality_walkthrough_ui.mjs +2 -2
  353. package/tests/sso_checkin_identity_spoof.mjs +2 -1
  354. package/tests/task_classifier_vocab.mjs +10 -0
  355. package/tests/task_cli.mjs +11 -3
  356. package/tests/task_criteria_unlink_db.mjs +2 -2
  357. package/tests/task_discipline_required.mjs +38 -16
  358. package/tests/task_goal_required.mjs +4 -4
  359. package/tests/task_needs_db.mjs +1 -1
  360. package/tests/tweak_replaces_artist_review.mjs +1 -1
  361. package/tests/update_pill.mjs +153 -2
  362. package/tests/upkeep_home.mjs +1 -1
  363. package/tests/v3_c1_options_proof.mjs +145 -0
  364. package/tests/visual_review.mjs +3 -3
  365. package/tests/watch_applications_queue.mjs +8 -5
  366. package/tests/watch_sealed_floor.mjs +3 -1
  367. package/tests/welcome_boot.mjs +12 -9
  368. package/tests/welcome_boot_browser.mjs +13 -13
  369. package/tests/worktree_helper.mjs +16 -1
@@ -1,25 +1,12 @@
1
- # Ideator pack
1
+ # Ideation playbook — the artist's ideas half, in detail
2
2
 
3
- > **The role pack for `discipline = ideator`.** The kernel ([`CLAUDE.md`](../../CLAUDE.md)) is what every session reads whatever its craft; this file is the half that is only true for ideators. Read the whole thing before acting — it changes how you behave for the rest of the session. Registered in [`scripts/bongos/discipline-modes.json`](../../scripts/bongos/discipline-modes.json); the Conductor injects this pointer into a session holding a claim of this craft (task 1002992).
4
-
5
- An ideation session is not the build-and-ship loop, and **it needs no claim**. "I'm just exploring" is a first-class state: an ideator should never need a chore checked out to start thinking.
6
-
7
- ---
8
-
9
- ## The first rule: you are the instrument, not the author
10
-
11
- In every other craft, Claude does the work and asks the human to approve it. **Here it is inverted.** The ideator is the creative driver; you are the sounding board, the research arm, and the devil's advocate they reach for. Your job is to give them room to think and to be the one they *ask* — not to hand them finished ideas and file them.
12
-
13
- - **Do not dump a batch of ideas.** Producing "5–8 ideas" on command is exactly the failure mode this pack exists to kill. Volume is not the goal; a developed, pressure-tested idea is.
14
- - **Provoke, don't conclude.** Offer directions, tensions, and questions — "here are three ways this could go, which pulls at you?", "what's the version of this that scares you?", "here's why this might be a bad idea, talk me out of it." Let the human choose the thread.
15
- - **Do the legwork they ask for, on demand.** Search the inbox, run `/recall`, check consistency with what the project already decided, work out what an idea would actually touch. They should never have to do the digging.
16
- - **The human decides what gets filed.** You only capture an idea once they have blessed it. The conversation is the product; the filed idea is its residue.
3
+ > Read from [`docs/packs/artist.md`](../packs/artist.md) (part two). The ideator craft folded into the artist in the game conversion (task 1005141, BONGOS-V3); this is the detail of its pack that would not fit the pack's size budget (ADR 0061). The pack keeps the two rules and the trust boundary; everything here applies whenever the work is an idea rather than a surface.
17
4
 
18
5
  ## The second rule: be quiet about the machinery
19
6
 
20
7
  The behaviour above inverts for this role — and so does the **surface** ([ADR 0271](../adr/0271-the-ideator-surface-is-two-halves.md)). Someone came here to think about an idea, not to watch a build. **Report outcomes, not mechanism.**
21
8
 
22
- - **Don't narrate the plumbing.** No tool-call commentary, file paths, script names, API routes, task ids, or claim bookkeeping in your prose. You still *use* all of it — you just don't make the ideator read about it.
9
+ - **Don't narrate the plumbing.** No tool-call commentary, file paths, script names, API routes, task ids, or claim bookkeeping in your prose. You still *use* all of it — you just don't make the artist read about it.
23
10
  - **Speak in the language of the idea.** "We tried something close to this in the spring and it died on cost" beats "I ran the recall script over the ADR corpus and got four hits."
24
11
  - **One line out, then the answer.** When legwork will take a moment, say in one short line what you're going after, then come back with what you found — not a running commentary.
25
12
  - **Quiet is never hiding.** If something breaks, or you need a decision only they can make, say so plainly and immediately. A quiet surface that swallows a problem is a broken surface.
@@ -28,13 +15,6 @@ The behaviour above inverts for this role — and so does the **surface** ([ADR
28
15
 
29
16
  ---
30
17
 
31
- ## Step 0 — is a human here?
32
-
33
- - A normal interactive session (they are typing to you, you can ask and get an answer) → **interactive mode**.
34
- - An autonomous, bypass-permissions, or scheduled run where no one will answer → **autonomous mode**.
35
-
36
- If unsure, ask once: *"Are you here to ideate with me, or should I run this autonomously?"* If no answer comes, treat it as autonomous.
37
-
38
18
  ## Step 1 (both modes) — load the ground before you think
39
19
 
40
20
  So that every idea lands against reality rather than in a vacuum:
@@ -45,19 +25,9 @@ So that every idea lands against reality rather than in a vacuum:
45
25
 
46
26
  ---
47
27
 
48
- ## The two grades, and the question between them
49
-
50
- An idea is filed at one of two grades, and **the step between them is a question you ask, never an assumption you make.**
51
-
52
- ### A quick idea stays one line
53
-
54
- A quick idea is a spark: one line of substance and nothing more. Do not pad it, do not "develop it up" into paragraphs, do not attach a plan. Its whole value is that it costs nothing to have, and inflating it destroys that.
55
-
56
- **After a quick idea is filed, ask — every time — whether they want to develop it into a Full Idea.** One short question, then take their answer. "No" is a completely good answer and ends it; the spark stays a spark and someone can develop it later. Never develop one silently because it seemed promising.
57
-
58
28
  ### A Full Idea is five answered questions
59
29
 
60
- A **Full Idea** is the ideator craft's real output: a baseline scope of work someone else can deliver against *without re-interviewing the person who had the thought*. It is **scored on completeness**, and that score feeds credits.
30
+ A **Full Idea** is the artist craft's real output: a baseline scope of work someone else can deliver against *without re-interviewing the person who had the thought*. It is **scored on completeness**, and that score feeds credits.
61
31
 
62
32
  **Get the questions from the template, never from memory** — they are declared once, as data, and a project can define its own:
63
33
 
@@ -65,7 +35,7 @@ A **Full Idea** is the ideator craft's real output: a baseline scope of work som
65
35
  node scripts/bongos/spark.js --template
66
36
  ```
67
37
 
68
- That prints each field, its label, and the substance floor the scorer expects. Ask them **as questions, in that order** — one at a time, in the ideator's own thread of thought, not as a form read aloud. Drawing five answers out of a conversation is exactly this pack's dynamic, and it is the path for someone who thinks by talking rather than by filling in boxes.
38
+ That prints each field, its label, and the substance floor the scorer expects. Ask them **as questions, in that order** — one at a time, in the artist's own thread of thought, not as a form read aloud. Drawing five answers out of a conversation is exactly this pack's dynamic, and it is the path for someone who thinks by talking rather than by filling in boxes.
69
39
 
70
40
  #### You write down what they said
71
41
 
@@ -126,16 +96,3 @@ There is no quota in either mode. One deeply-developed idea is a great session;
126
96
 
127
97
  ---
128
98
 
129
- ## Trust boundary — filing is open, triage is not
130
-
131
- Filing into the inbox is open to **any** authenticated builder, Xenos included. **Triage** — promote, discard, merge — reshapes the whole team's backlog and is **Metic+ only** (`/idea-triage`). So in this pack you *file*; you never verdict. If a sub-Metic ideator asks to promote their own idea, explain that triage is a trusted-builder step and their idea is now queued for it.
132
-
133
- ---
134
-
135
- <!-- BEGIN GENERATED ROLE RESPONSIBILITY (scripts/bongos/gen-role-responsibilities.js — do not hand-edit) -->
136
- ## What this craft is answerable for
137
-
138
- > Make good ideas; be a philosopher / thought leader for the project; enable Engineers to scope and Artists to create with maximum efficiency — a baseline for creating scopes of work.
139
-
140
- *The ideator's written responsibility — one source (`src/role-responsibilities.js`), shown on the hall profile, taught here, and referenced by the grader. Fixed by the area owner on 2026-09-08, criterion `wa6-written-responsibilities`. Generated: do not hand-edit, and do not paraphrase it elsewhere.*
141
- <!-- END GENERATED ROLE RESPONSIBILITY -->
@@ -0,0 +1,72 @@
1
+ -- core_296_crafts_artisan_artist.sql — task 1005141 (BONGOS-V3, goal 1000141, C1):
2
+ -- rename the crafts to the game's characters.
3
+ --
4
+ -- engineer → artisan
5
+ -- ideator → artist (ideation folds into the artist craft; spec settled point 6)
6
+ -- artist → artist (unchanged)
7
+ -- ui → ui (module-contributed, ADR 0272; not a character)
8
+ --
9
+ -- The vocabulary and its old spellings live in src/crafts.js (normalizeCraft); every
10
+ -- write path normalizes, so after this runs nothing NEW is written with an old word.
11
+ --
12
+ -- FORWARD-SAFE BY SUPERSET. `bongos upgrade` rolls code back without rolling the
13
+ -- database back (scripts/bongos/lint-migrations.js). Old code still writes 'engineer'
14
+ -- and 'ideator', so both CHECKs below ACCEPT the old words as well as the new ones. A
15
+ -- later contraction migration drops them once no supported core writes them. The data
16
+ -- itself moves to the new words now, so new code never has to read an old one — and
17
+ -- new code still normalizes on read, in case a rolled-back release wrote one since.
18
+ --
19
+ -- Constraints are dropped BEFORE the updates and re-added after (the 086/176 pattern).
20
+ -- Every UPDATE is a no-op on already-migrated rows, so the file is idempotent.
21
+
22
+ BEGIN;
23
+
24
+ ALTER TABLE tasks DROP CONSTRAINT IF EXISTS tasks_discipline_check;
25
+ ALTER TABLE builders DROP CONSTRAINT IF EXISTS builders_preferred_disciplines_check;
26
+
27
+ -- tasks.discipline
28
+ UPDATE tasks SET discipline = 'artisan' WHERE discipline = 'engineer';
29
+ UPDATE tasks SET discipline = 'artist' WHERE discipline = 'ideator';
30
+
31
+ -- Newcomer-floor stock refs carry the craft (scripts/bongos/newcomer-floor.js
32
+ -- instanceSourceRef: 'tmpl:<craft>:<template>:<seq>'). Moved with the craft so the
33
+ -- restock counts the stock it already made instead of minting a second set.
34
+ UPDATE tasks SET source_ref = 'tmpl:artisan:' || substr(source_ref, length('tmpl:engineer:') + 1)
35
+ WHERE source_ref LIKE 'tmpl:engineer:%';
36
+ UPDATE tasks SET source_ref = 'tmpl:artist:' || substr(source_ref, length('tmpl:ideator:') + 1)
37
+ WHERE source_ref LIKE 'tmpl:ideator:%';
38
+
39
+ -- builders.preferred_disciplines — mapped and DEDUPED in first-seen order:
40
+ -- {artist, ideator} is one craft now, not two.
41
+ UPDATE builders b
42
+ SET preferred_disciplines = sub.mapped
43
+ FROM (
44
+ SELECT id,
45
+ ARRAY(
46
+ SELECT m.craft
47
+ FROM (
48
+ SELECT CASE d WHEN 'engineer' THEN 'artisan' WHEN 'ideator' THEN 'artist' ELSE d END AS craft,
49
+ min(ord) AS first_seen
50
+ FROM unnest(preferred_disciplines) WITH ORDINALITY AS u(d, ord)
51
+ GROUP BY 1
52
+ ) m
53
+ ORDER BY m.first_seen
54
+ ) AS mapped
55
+ FROM builders
56
+ WHERE preferred_disciplines && ARRAY['engineer', 'ideator']::text[]
57
+ ) sub
58
+ WHERE b.id = sub.id;
59
+
60
+ -- builders.main_discipline (core_268; no CHECK — the vocabulary is open)
61
+ UPDATE builders SET main_discipline = 'artisan' WHERE main_discipline = 'engineer';
62
+ UPDATE builders SET main_discipline = 'artist' WHERE main_discipline = 'ideator';
63
+
64
+ ALTER TABLE tasks ADD CONSTRAINT tasks_discipline_check
65
+ CHECK (discipline IN ('artisan', 'artist', 'ui', 'engineer', 'ideator'));
66
+ ALTER TABLE builders ADD CONSTRAINT builders_preferred_disciplines_check
67
+ CHECK (preferred_disciplines <@ ARRAY['artisan', 'artist', 'patron', 'ui', 'engineer', 'ideator']::text[]);
68
+
69
+ INSERT INTO schema_migrations (version) VALUES ('core_296_crafts_artisan_artist')
70
+ ON CONFLICT DO NOTHING;
71
+
72
+ COMMIT;
@@ -0,0 +1,30 @@
1
+ -- core_297_builder_character.sql — the character a builder holds (task 1005147,
2
+ -- BONGOS-V3 G2 / criterion you-are-a-character-in-first-person).
3
+ --
4
+ -- A builder picks one of three characters when they join: artisan, artist or patron
5
+ -- (src/crafts.js names them). The pick is IDENTITY AND VIEW, never authority
6
+ -- (criterion character-is-identity-not-authority): nothing that gates a claim, a vote,
7
+ -- a deploy or a spend reads this column — rank does, on the server, as before.
8
+ --
9
+ -- Settled point 2 of docs/specs/bongos-v3-game-conversion.md: switching character is
10
+ -- signing out and back in. The hall clears the column and signs out; the next sign-in
11
+ -- finds it NULL and shows character creation again.
12
+ --
13
+ -- NULL means "not picked yet" (every builder who joined before this migration), and the
14
+ -- hall asks. The column is named game_character because CHARACTER is a SQL type word.
15
+ --
16
+ -- ADDITIVE AND FORWARD-SAFE: a rolled-back core never reads the column, and a builder's
17
+ -- own row is the only one any route writes.
18
+
19
+ BEGIN;
20
+
21
+ ALTER TABLE builders ADD COLUMN IF NOT EXISTS game_character text;
22
+
23
+ ALTER TABLE builders DROP CONSTRAINT IF EXISTS builders_game_character_check;
24
+ ALTER TABLE builders ADD CONSTRAINT builders_game_character_check
25
+ CHECK (game_character IS NULL OR game_character IN ('artisan', 'artist', 'patron'));
26
+
27
+ INSERT INTO schema_migrations (version) VALUES ('core_297_builder_character')
28
+ ON CONFLICT DO NOTHING;
29
+
30
+ COMMIT;
@@ -118,7 +118,7 @@ function normalizeProposalPayload({ body = {}, entry, builderId = null } = {}) {
118
118
  }
119
119
 
120
120
  // The placeholder arithmetic. This is the one rule that makes the patch
121
- // MECHANICALLY applicable rather than a note for an engineer: the applier
121
+ // MECHANICALLY applicable rather than a note for an artisan: the applier
122
122
  // re-injects the source's own interpolations into the holes, so the count has
123
123
  // to match and the order has to be the author's intent.
124
124
  const want = placeholderCount(current);
@@ -4,10 +4,10 @@
4
4
  // (task 1004433 / WA6.RP03, goal 1000095, criterion wa6-roles-read-true-in-public).
5
5
  //
6
6
  // WHY. builders.total_credits is one number, and every public surface read it as
7
- // "payout from shipped work". That is true for an engineer and false for the
8
- // other two crafts: an artist is paid per approved page (`tweak.page_approved:`),
9
- // an ideator per idea stream (`idea.credit.*`), and neither has to ship a task to
10
- // earn. The owner's 2026-09-30 rules need the split: a role other than the main
7
+ // "payout from shipped work". That is true for an artisan and false for the
8
+ // artist, who is paid per approved page (`tweak.page_approved:`) and per idea
9
+ // stream (`idea.credit.*`) — the ideator's pay before task 1005141 folded that
10
+ // craft into the artist — and need not ship a task to earn. The owner's 2026-09-30 rules need the split: a role other than the main
11
11
  // one shows (chip, Activity tab, leaderboard entry) only once it has EARNED
12
12
  // credits, and a leaderboard filtered to one role ranks by the credits earned in
13
13
  // that craft. So the split is a ledger fact, read here, once.
@@ -15,13 +15,14 @@
15
15
  // THE RULE, per credit_log row:
16
16
  //
17
17
  // tweak.page_approved:<task> artist (ADR 0341 D10, the artist lane)
18
- // idea.credit.* · idea_promotion_bonus ideator (ADR 0172, every idea stream,
19
- // the spark/developer split too)
18
+ // idea.credit.* · idea_promotion_bonus artist (ADR 0172, every idea stream,
19
+ // the spark/developer split too;
20
+ // also kept apart as `ideas`)
20
21
  // task.shipped · task.confirmed · the craft of the TASK's discipline
21
22
  // ship.net_negative
22
23
  // session.token_reward the craft of the tasks that session
23
24
  // shipped, split evenly across them; a
24
- // session that names none is engineering
25
+ // session that names none is artisan
25
26
  // (an AI build session is, by default)
26
27
  // anything else (achievement.*, `other` — credited, but to no craft
27
28
  // rank_change, a hand grant)
@@ -30,7 +31,7 @@
30
31
  // module-contributed design discipline (ADR 0079, 0272) and counts as ARTIST:
31
32
  // the artist's craft is how the project looks and reads (docs/packs/artist.md),
32
33
  // and UI design is that. A discipline this table does not know (a module may
33
- // contribute one later) counts as engineering, the default craft, rather than
34
+ // contribute one later) counts as artisan, the default craft, rather than
34
35
  // vanishing from every total.
35
36
  //
36
37
  // THE SUM IS EXACT. A session's reward split across three tasks is a third each,
@@ -46,15 +47,25 @@ const api = require('../../src/module-api');
46
47
  const { pool } = api;
47
48
  const { ARTIST_PAGE_REASON_PREFIX } = require('./credits');
48
49
 
49
- const CRAFTS = Object.freeze(['engineer', 'artist', 'ideator']);
50
- const DEFAULT_CRAFT = 'engineer';
50
+ const CRAFTS = Object.freeze(['artisan', 'artist']);
51
+ const DEFAULT_CRAFT = 'artisan';
51
52
  const OTHER = 'other';
53
+ // Idea credit streams are ARTIST money since the ideator folded into the artist
54
+ // (task 1005141), but the sky's idea numbers still need them on their own (a
55
+ // "total size" of ideas must not include page credits). So the SQL tags them
56
+ // `ideas`, the craft split counts them as artist, and each folded row also carries
57
+ // `ideas` — that share alone, NOT a craft and not added to the total twice.
58
+ const IDEAS = 'ideas';
52
59
 
60
+ // ui is the artist's craft; the old spellings (engineer, ideator — task 1005141) are
61
+ // read as today's, in case a rolled-back release wrote one after core_296 ran.
53
62
  const DISCIPLINE_CRAFT = Object.freeze({
54
- engineer: 'engineer',
63
+ artisan: 'artisan',
55
64
  artist: 'artist',
56
65
  ui: 'artist',
57
- ideator: 'ideator',
66
+ engineer: 'artisan',
67
+ ideator: 'artist',
68
+ [IDEAS]: 'artist',
58
69
  });
59
70
 
60
71
  // The per-task reasons whose craft is the task's own. The same three the
@@ -100,7 +111,7 @@ const CREDITS_BY_CRAFT_SQL = `
100
111
  cl.delta::numeric AS amount,
101
112
  CASE
102
113
  WHEN cl.reason LIKE $2 THEN 'artist'
103
- WHEN cl.reason LIKE 'idea.credit.%' OR cl.reason = 'idea_promotion_bonus' THEN 'ideator'
114
+ WHEN cl.reason LIKE 'idea.credit.%' OR cl.reason = 'idea_promotion_bonus' THEN '${IDEAS}'
104
115
  WHEN cl.reason = ANY($3::text[]) THEN COALESCE(t.discipline, '${DEFAULT_CRAFT}')
105
116
  ELSE '${OTHER}'
106
117
  END AS discipline
@@ -149,7 +160,8 @@ function apportion(parts, total) {
149
160
 
150
161
  // foldCraftRows — the grouped SQL rows into one exact row per builder. Pure,
151
162
  // so the rounding and the discipline mapping are testable without a database.
152
- // Returns Map<builderIdString, { engineer, artist, ideator, other, total }>,
163
+ // Returns Map<builderIdString, { artisan, artist, other, total, ideas }> (ideas = the
164
+ // idea-stream share of artist, see IDEAS),
153
165
  // with every builder asked for present (at zero when they have earned nothing:
154
166
  // "no credits" is an answer, not a gap).
155
167
  function foldCraftRows(ids, rows) {
@@ -160,15 +172,17 @@ function foldCraftRows(ids, rows) {
160
172
  parts[OTHER] = 0;
161
173
  raw.set(id, parts);
162
174
  }
175
+ const ideas = new Map();
163
176
  for (const r of rows || []) {
164
177
  const parts = raw.get(String(r.builder_id));
165
178
  if (!parts) continue;
166
179
  parts[craftOfDiscipline(r.discipline)] += Number(r.amount) || 0;
180
+ if (r.discipline === IDEAS) ideas.set(String(r.builder_id), (ideas.get(String(r.builder_id)) || 0) + (Number(r.amount) || 0));
167
181
  }
168
182
  const out = new Map();
169
183
  for (const [id, parts] of raw) {
170
184
  const total = Math.round(Object.values(parts).reduce((a, b) => a + b, 0));
171
- out.set(id, { ...apportion(parts, total), total });
185
+ out.set(id, { ...apportion(parts, total), total, ideas: Math.round(ideas.get(id) || 0) });
172
186
  }
173
187
  return out;
174
188
  }
@@ -8,7 +8,7 @@
8
8
  <title>Studio — {{worldName}}</title>
9
9
  <meta name="description" content="Make something with AI in the studio: bring sketches, pictures or a PDF, say what you want, and get an answer and pictures back.">
10
10
  <link rel="icon" href="/modules/ui-design/public/brand/favicon.svg" type="image/svg+xml">
11
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
12
12
  <link rel="stylesheet" href="/builders/studio.css?v=2026-10-09-day">
13
13
  <link rel="stylesheet" href="/builders/ai-studio.css?v=2026-10-29-ais1">
14
14
  </head>
@@ -87,10 +87,10 @@
87
87
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
88
88
 
89
89
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
90
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
90
+ <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
91
91
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
92
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
93
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
92
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
93
+ <script src="/builders/shell.js?v=2026-11-10-character"></script>
94
94
  <script src="/builders/hall-dialog.js"></script>
95
95
  <script src="/builders/palette.js" defer></script>
96
96
  <script src="/builders/tweak-editor-lib.js?v=2026-09-28-tw23"></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-02-shell1">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
12
12
  <!-- task 1003472: the island index under the map is a run of oversight rows,
13
13
  and the detail panel's facts are the family's lines, so the family sheet
14
14
  loads first and atlas.css holds only the scene. -->
@@ -90,13 +90,13 @@
90
90
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
91
91
 
92
92
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
93
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
93
+ <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
94
94
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
95
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
96
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
95
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
96
+ <script src="/builders/shell.js?v=2026-11-10-character"></script>
97
97
  <script src="/builders/hall-dialog.js"></script>
98
98
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
99
99
  <script src="/builders/palette.js" defer></script>
100
- <script src="/builders/atlas.js?v=2026-09-02-index" defer></script>
100
+ <script src="/builders/atlas.js?v=2026-11-10-options" defer></script>
101
101
  </body>
102
102
  </html>
@@ -386,7 +386,9 @@
386
386
  for (var i = 0; i < btns.length; i++) btns[i].addEventListener('click', function () { setView(this.getAttribute('data-view')); });
387
387
  document.getElementById('popupClose').addEventListener('click', function (ev) { ev.stopPropagation(); closePopup(); });
388
388
  svg.addEventListener('click', function () { closePopup(); });
389
- document.addEventListener('keydown', function (ev) { if (ev.key === 'Escape' && popup.classList.contains('show')) closePopup(); });
389
+ // An Escape that closed the card is spent (preventDefault), so in game mode it does not also
390
+ // open the options menu, and outside it does not also bring the bars back (ADR 0399 §2.4, task 1005144).
391
+ document.addEventListener('keydown', function (ev) { if (ev.key === 'Escape' && popup.classList.contains('show')) { ev.preventDefault(); closePopup(); } });
390
392
  // A neighbour chip in the map's card opens that island's card.
391
393
  popup.addEventListener('click', function (ev) {
392
394
  var jump = ev.target.closest('.ab-jump'); if (!jump) return;
@@ -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-10-options">
12
12
  <link rel="stylesheet" href="/builders/hall-ask.css">
13
13
  <!-- task 1003455: the row shape (title + facts) is the oversight family's,
14
14
  the same archetype collab/copy-desk/watch/gate already ride. -->
@@ -59,10 +59,10 @@
59
59
  <!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
60
60
  chrome exists before the page script runs. -->
61
61
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
62
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
62
+ <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
63
63
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
64
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
65
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
64
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
65
+ <script src="/builders/shell.js?v=2026-11-10-character"></script>
66
66
  <script src="/builders/hall-dialog.js"></script>
67
67
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
68
68
  <script src="/builders/palette.js" defer></script>
@@ -72,7 +72,7 @@
72
72
  <!-- task-detail.js still owns the #/blocker/N deep-link overlay every row's
73
73
  title opens into — this page needs its link-builder (OTBTaskDetail.href)
74
74
  for the "blocking N tasks" facts line, but not the overlay's own render. -->
75
- <script src="/builders/task-detail.js?v=2026-07-03-taskdetail"></script>
75
+ <script src="/builders/task-detail.js?v=2026-11-10-options"></script>
76
76
  <script src="/builders/blockers-lib.js"></script>
77
77
  <script src="/builders/hall-ask.js"></script>
78
78
  <script src="/builders/blockers.js"></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-02-shell1">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
12
12
  <link rel="stylesheet" href="/builders/hall-ask.css">
13
13
  <link rel="stylesheet" href="/builders/oversight.css">
14
14
  <!-- The room's own sheet: the sitting card and the ballot controls moved here
@@ -61,10 +61,10 @@
61
61
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
62
62
 
63
63
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
64
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
64
+ <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
65
65
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
66
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
67
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
66
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
67
+ <script src="/builders/shell.js?v=2026-11-10-character"></script>
68
68
  <script src="/builders/hall-dialog.js"></script>
69
69
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
70
70
  <script src="/builders/palette.js" defer></script>
@@ -89,7 +89,8 @@ html:has(body[data-page="city"]) { height: 100%; }
89
89
  the home above and below measures from the stage instead of the window. */
90
90
  .city-main { position: fixed; top: var(--topbar-h, 56px); left: var(--sidebar-w-rail, 64px); right: 0; bottom: 0; max-width: none; margin: 0; contain: layout paint; z-index: 1; }
91
91
  html[data-fullscreen="on"] .city-main { top: 0; left: 0; }
92
- @media (max-width: 768px) { .city-main { left: 0; } }
92
+ /* task 1005148: at phone width with the visor up (game mode), the door rises clear of its bottom row of pills. */
93
+ @media (max-width: 768px) { .city-main { left: 0; } html.visor-on .city-door { bottom: 120px; } }
93
94
  /* The full-screen switch floats top right over the stage, where the sun/moon
94
95
  switch sits; the strip steps in by the button's width so nothing sits under it.
95
96
  Under 640 the exit is the round button (style.css). */
@@ -11,8 +11,9 @@
11
11
  links, injected into this head by the server like every hall page's
12
12
  (tests/hall_tokens.mjs: no hall page hardcodes a web-font stylesheet).
13
13
  The prototype carried its own Google Fonts link for the same two faces. -->
14
- <link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
15
- <link rel="stylesheet" href="/builders/city.css?v=2026-10-23-decide12">
14
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
15
+ <link rel="stylesheet" href="/builders/visor.css?v=2026-11-10-visor">
16
+ <link rel="stylesheet" href="/builders/city.css?v=2026-11-10-visor">
16
17
  <!-- the ask card in the glass language, shared with the street's deck (task 1004702) -->
17
18
  <link rel="stylesheet" href="/builders/street-deck.css?v=2026-10-17-tidy">
18
19
  </head>
@@ -106,11 +107,13 @@
106
107
  </div>
107
108
 
108
109
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
109
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode" defer></script>
110
+ <script src="/builders/shell-game.js?v=2026-11-10-options" defer></script>
110
111
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers" defer></script>
111
- <script src="/builders/craft-mode.js?v=2026-11-05-goals" defer></script>
112
- <script src="/builders/shell.js?v=2026-11-09-game-mode" defer></script>
112
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor" defer></script>
113
+ <script src="/builders/shell.js?v=2026-11-10-character" defer></script>
113
114
  <script src="/builders/hall-dialog.js" defer></script>
115
+ <!-- task 1005148: the visor (glass over the scene, game mode only; ADR 0399), after the shell and hall-dialog.js -->
116
+ <script src="/builders/visor.js?v=2026-11-10-visor" defer></script>
114
117
  <script src="/builders/palette.js" defer></script>
115
118
  <script src="/builders/gov-living.js?v=2026-10-09-positions1" defer></script>
116
119
  <script src="/builders/gov-feeds.js?v=2026-10-09-living3" defer></script>
@@ -126,6 +129,6 @@
126
129
  <script src="/builders/street-deck.js?v=2026-10-13-glass1" defer></script>
127
130
  <script src="/builders/city-decide.js?v=2026-10-23-decide12" defer></script>
128
131
  <script src="/builders/city-switchboard.js?v=2026-10-23-board5" defer></script>
129
- <script src="/builders/city.js?v=2026-10-23-decide12" defer></script>
132
+ <script src="/builders/city.js?v=2026-11-10-visor" defer></script>
130
133
  </body>
131
134
  </html>
@@ -697,7 +697,9 @@
697
697
  // 1 / 2 / 3 answer the card's ask, as on the deck
698
698
  function cardKey(e) {
699
699
  if (!e) return;
700
- if (e.key === 'Escape') { closeCard(); return; }
700
+ // Spent once it closed the card (task 1005188, found by ADR 0399 §3): without it the same press
701
+ // also brought the bars back, and in game mode would open the options menu (task 1005144).
702
+ if (e.key === 'Escape') { if (e.preventDefault) e.preventDefault(); closeCard(); return; }
701
703
  if ((e.key === 'ArrowLeft' || e.key === 'ArrowRight') && !e.ctrlKey && !e.metaKey && !e.altKey && !(e.target && /^(INPUT|TEXTAREA)$/.test(String(e.target.tagName)))) { if (e.preventDefault) e.preventDefault(); flipCard(e.key === 'ArrowLeft' ? -1 : 1); return; }
702
704
  var inText = e.target && /^(INPUT|TEXTAREA)$/.test(String(e.target.tagName));
703
705
  // Tab is the next thing that needs you in this building, never the next button
@@ -775,4 +777,8 @@
775
777
 
776
778
  window.GovCityPage = { boot: boot, draw: draw, load: load, fit: fit, openCard: openCard, closeCard: closeCard, openDecide: function (scope, how) { openDecide(scope, how); return decide; }, FEEDS: FEEDS, LIVING_FEEDS: LIVING_FEEDS, THEME_KEY: THEME_KEY };
777
779
  window.GovCityPage.ready = boot();
780
+ // task 1005148: the Governor City as the visor's scene. No camera until R13, so no movement
781
+ // actions (ADR 0399 §2.2); the card's own keys are listed for the sheet.
782
+ window.__visorScene = { name: 'city', place: 'Governor city', keys: [{ label: 'On a card: answer', key: '1–9' }, { label: 'On a card: next', key: '← →' }] };
783
+ if (window.OTBVisor) window.OTBVisor.scene(window.__visorScene);
778
784
  }());
@@ -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-10-options">
12
12
  <link rel="stylesheet" href="/builders/oversight.css">
13
13
  <link rel="stylesheet" href="/builders/collab.css">
14
14
  </head>
@@ -160,10 +160,10 @@
160
160
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
161
161
 
162
162
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
163
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
163
+ <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
164
164
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
165
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
166
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
165
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
166
+ <script src="/builders/shell.js?v=2026-11-10-character"></script>
167
167
  <script src="/builders/hall-dialog.js"></script>
168
168
  <script src="/builders/palette.js" defer></script>
169
169
  <script src="/builders/collab-lib.js?v=2026-09-24-archive"></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-02-shell1">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
12
12
  <link rel="stylesheet" href="/builders/commands.css">
13
13
  </head>
14
14
  <body data-page="commands" data-page-title="Commands">
@@ -52,10 +52,10 @@
52
52
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
53
53
 
54
54
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
55
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
55
+ <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
56
56
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
57
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
58
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
57
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
58
+ <script src="/builders/shell.js?v=2026-11-10-character"></script>
59
59
  <script src="/builders/hall-dialog.js"></script>
60
60
  <!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
61
61
  <script src="/builders/palette.js" defer></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-02-shell1">
11
+ <link rel="stylesheet" href="/builders/style.css?v=2026-11-10-options">
12
12
  <link rel="stylesheet" href="/builders/oversight.css">
13
13
  <link rel="stylesheet" href="/builders/copy-desk.css">
14
14
  </head>
@@ -178,10 +178,10 @@
178
178
  <div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
179
179
 
180
180
  <script src="/builders/dom-utils.js?v=2026-11-05-numbers"></script>
181
- <script src="/builders/shell-game.js?v=2026-11-09-game-mode"></script>
181
+ <script src="/builders/shell-game.js?v=2026-11-10-options"></script>
182
182
  <script src="/builders/shell-trail.js?v=2026-11-05-numbers"></script>
183
- <script src="/builders/craft-mode.js?v=2026-11-05-goals"></script>
184
- <script src="/builders/shell.js?v=2026-11-09-game-mode"></script>
183
+ <script src="/builders/craft-mode.js?v=2026-11-10-visor"></script>
184
+ <script src="/builders/shell.js?v=2026-11-10-character"></script>
185
185
  <script src="/builders/hall-dialog.js"></script>
186
186
  <script src="/builders/palette.js" defer></script>
187
187
  <script src="/builders/hall-kit.js"></script>