@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
@@ -0,0 +1,142 @@
1
+ # 0402 — Helm is the hall's look, and the hall is dark only
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-11-11
5
+ - **Deciders:** the owner, 2026-11-11, on the Helm mock-ups: Helm applies to the game only, which is the hall (everything after sign-in); the hall wears Helm alone, with no light theme. Claude implemented.
6
+ - **Task:** [task 1005192](https://cloudbongos.com/builders#/task/1005192) ("Helm look 1": the tier, the shared button, the start screen and the load screen)
7
+ - **Supersedes in part:** [ADR 0204](0204-the-apex-is-dark-only.md) Decision 3 ("Light is the builders' hall's alone"): no surface of the platform offers a light mode any more. Its method stands and is reused here: pin the mode, leave the other tier's CSS in place until a follow-up removes it.
8
+ - **Interacts with:** [ADR 0062 §3](0062-medusa-instance-model-decoupling.md) (the pack is still thirteen colours and two faces, spliced as a plain `:root`), [ADR 0196](0196-chrome-world-token-contract-and-the-landing-sheets.md) (the token contract), [ADR 0219](0219-a-look-is-a-branding-pack-the-style-library.md) and [ADR 0358](0358-a-hall-wears-a-look-and-its-night-takes-a-tint.md) (a hall that wears a look keeps its own faces and its tinted night), [ADR 0401](0401-one-options-menu-opens-every-settings-screen-in-a-frame.md) (the options menu, restyled by a later task).
9
+
10
+ ## Context
11
+
12
+ The game conversion (goal 1000141) turned the hall into a place you enter: a start screen, a load screen, then a world. Its controls still wore the chrome world of the landing: a black void, Manrope in lowercase, pills. The owner picked a look for the game from a round of mock-ups and named it **Helm**: the inside of a visor at night. Two decisions came with the pick.
13
+
14
+ 1. **Helm is the game's, not the platform's.** The public landing, the projects hub and the status page keep the chrome world. Nothing in `config/branding.neutral.json`, `modules/public-landing`, `cosmos.css`, `world.css` or the status page changes.
15
+ 2. **The hall has one look and no light theme.** Day and night will show later in the city and the sky, as art, never in the controls.
16
+
17
+ Three facts shaped how it was built.
18
+
19
+ - **The pack is one face pair for every surface.** `themeMarkup()` splices `--font-display` and `--font-body` as a plain `:root` at the end of `<head>` on every page, so the landing and the hall always read the same face. Helm needs the hall to read Barlow while the landing keeps Manrope, without a sixteenth pack token and without taking a face away from an instance that chose its own.
20
+ - **The status page links the hall's shared controls** (`controls.css`) without the hall's token tier. A change to the shared button reaches it unless the change is written so that it does not.
21
+ - **A cut corner is a `clip-path`, and a clip-path clips outlines.** The hall's focus indicator is an outline inside a halo. On a cut control both disappear.
22
+
23
+ ## Decision
24
+
25
+ ### 1. The kit
26
+
27
+ Helm is three small sets of rules. Each is recorded here once and lives as tokens in the hall's tier.
28
+
29
+ **Type, two voices.**
30
+
31
+ | Voice | Face | How it is set | What it is for |
32
+ |---|---|---|---|
33
+ | The name voice | Barlow Condensed, 500 (600 when lit) | wide tracked capitals, `.16em` to `.3em` | the name of a thing: a title, a button, an eyebrow |
34
+ | The body voice | Barlow, 400 and 500 | plain sentences | everything said to you |
35
+
36
+ The mono face stays JetBrains Mono, for where the hall quotes the machine.
37
+
38
+ **Colour, one job each.**
39
+
40
+ | Name | Value | Token | Its one job |
41
+ |---|---|---|---|
42
+ | Night | `#050d16` | `--bg`, `--bg-deep`, `--void`; lifted a step as `--bg-card` `#0a1622` and `--bg-frame` `#07111b`; at 72% over art as `--night-glass` | the ground and every panel |
43
+ | Ice | `#c8f1f7` | `--ink-soft`; `--ink-faint` `#a9cdd4`; the hairlines `--rule` (ice at 40%) and `--rule-soft` (ice at 20%); the glass family (ice at 10%, 16%, 20%) | information you read |
44
+ | White | `#ffffff` | `--ink` | names and numbers |
45
+ | Moon | the pack's accent | `--accent`, with `--accent-on` as the dark ink on it | only what you can act on |
46
+ | Dawn | none | none | the art. Never a control |
47
+
48
+ The Moon is the existing accent and is never pinned (the Unpinned Accent Rule stands), so an instance with its own accent keeps it. The status vocabulary (`--ok`, `--warn`, `--danger`, `--info`) is unchanged, value for value, and still clears 4.5:1 on both night grounds (`tests/hall_tokens.mjs`).
49
+
50
+ **Shape, three moves.**
51
+
52
+ | Move | What it is | Where it lives |
53
+ |---|---|---|
54
+ | The cut corner | anything you can press: the top-left and bottom-right corners cut, 12px (8px at the row size), no pill | `--cut`, `--cut-sm`, `--cut-path`, `--cut-path-sm`; spent by `.btn` and its family in `controls.css` |
55
+ | The segment | progress: one small bar per step, skewed 28 degrees | `--seg-w`, `--seg-h`, `--seg-gap`, `--seg-skew`; the shared rules `.segs` and `.seg` in `controls.css` |
56
+ | The arc | the edge of the visor | not built in this task (task 1005195) |
57
+
58
+ **One behaviour rule.** A control you may not use stays visible and says why. The city never hides what exists. No code in this task depends on it; it is recorded so the tasks that follow keep it.
59
+
60
+ ### 2. Where the values live
61
+
62
+ All of it is in the token block of `modules/hall-ui/public/style.css`, which is the one place a literal may live.
63
+
64
+ - The Helm **neutrals** are the hall's dark tier, written twice, byte-identical, as before (`html[data-theme="dark"]` and its `prefers-color-scheme` twin).
65
+ - The kit's **recipes** (the name voice, the cut, the press fill and focus ring, the segment, the panel over art and its measures) sit in the bare `:root`, because none of them flips with a mode.
66
+ - The **faces** are `--helm-display` and `--helm-body`. One rule, `html[data-faces="helm"]`, hands them to `--font-display` and `--font-body`. It is (0,1,1), so it outranks the pack's spliced `:root`.
67
+
68
+ Nothing was added to the shared scale sheet (`modules/ui-design/public/tokens.css`): the landing and the status page load it, and they are out of scope.
69
+
70
+ ### 3. The hall is recognised at serve time, in one place
71
+
72
+ `src/hall-helm.js` recognises a hall page by what makes it one: it links the hall's sheet (`/builders/style.css`). `injectBrandingGlobal` (the splice every served page already passes through, in the server, the preview harness and the design kit's stub) calls it. For a hall page it does two things; every other page comes back untouched.
73
+
74
+ - It stamps `data-theme="dark"` on `<html>`. A fixed attribute selects the dark tier before first paint, with nothing to flash and nothing for the OS preference to reach.
75
+ - For a hall whose pack still names the platform's default faces, it stamps `data-faces="helm"` and links the two Barlow families (`display=swap`; every hall page already preconnects to both font origins). A hall whose pack names faces of its own, in `config/branding.json` or through a look from the style library, is never stamped and keeps them.
76
+
77
+ ### 4. The hall is dark only
78
+
79
+ - The light/dark switch is gone from the top bar (`shell.js`), from the governor city and from the street. `shell.js` sets `data-theme="dark"` again for a page read without the server's stamp. The `hall-theme` preference is never read or written.
80
+ - Scripts that only read `html[data-theme]` (the sky, the atlas, Home's city, the approval queue) are unchanged and always read dark.
81
+ - **The light tier stays for now**, as ADR 0204 left the apex's: the light values in the hall's `:root`, the light rules in page sheets and the tests that measure light pairs. Nothing in the hall renders them. Removing them is a follow-up.
82
+ - Every hall `*.states.json` now declares `"modes": ["dark"]`, so the design kit renders each state once.
83
+
84
+ ### 5. The shared button takes the cut and the name voice, and the status page does not move
85
+
86
+ Every Helm piece on `.btn` is a hall-tier token spent with a fallback, and the fallback is the look the sheet drew before: `clip-path: var(--cut-path, none)`, `border-radius: var(--press-radius, var(--radius-pill))`, `font-family: var(--name-face, var(--font-body))`, and so on. The status page defines none of those tokens, so its buttons are the pills they were.
87
+
88
+ - **Focus.** A cut control hands the shell's `:focus-visible` rule an inset ring (`--press-focus`): 2px of the focus colour on the edge, then a 2px band of the ground inside it. One of the two reads on any fill: measured on the accent 8.93:1, on the ghost fill 7.20:1, on the danger fill 7.06:1.
89
+ - **The ghost.** A cut removes the hairline at the two cut corners, so the ghost button takes a fill (`--press-fill`) and reads as a shape, not as a broken outline.
90
+ - **The text button** is a link in a sentence: no cut, no capitals.
91
+ - Fields, status pills, chips and the view toggle keep their shapes in this task.
92
+
93
+ ### 6. The start screen and the load screen
94
+
95
+ Restyled to the mock-up with the tokens above; the sheet types in no colour, size, corner, shadow or breakpoint. Behaviour, keys, words and the welcome painting are unchanged.
96
+
97
+ - **Start:** one full-height night panel (`--night-glass`) 400px wide, standing off the left edge on a desk and filling the width on a phone (`--helm-inset`, a `clamp`, so there is no breakpoint). The mark and the project's name in the name voice; Start as a full-width accent bar that names its key; the other choices as quiet rows on ice hairlines; one tip at the foot.
98
+ - **Load:** the same panel, centred: the week in the name voice, one segment per week of the city's history, the city, the tip.
99
+
100
+ ## Measured
101
+
102
+ Contrast, from the tier's own values (4.5:1 body, 3:1 large and non-text):
103
+
104
+ | Pair | Ratio |
105
+ |---|---|
106
+ | White on Night / on the lifted Night | 19.52 / 18.25 |
107
+ | Ice on Night / on the lifted Night | 16.16 / 15.10 |
108
+ | Faint ice on Night / on the lifted Night | 11.50 / 10.75 |
109
+ | The accent as text on Night / on the lifted Night | 8.93 / 8.35 |
110
+ | `--accent-on` on the accent | 8.05 |
111
+ | The strong hairline (ice at 40%) on Night | 3.34 |
112
+ | Ice / White on the start panel over a pure white part of a painting | 6.67 / 8.05 |
113
+
114
+ ## Consequences
115
+
116
+ - A builder whose OS prefers light, or who had chosen light in the hall, sees the dark hall.
117
+ - Every hall page changes at once in its neutrals, its faces and its buttons, because they all spend the tier. Pages were not restyled one by one; a page with hand-drawn pills, 16px panels or lowercase labels keeps those until its own task.
118
+ - The city and the street draw their night faces only, until day and night return as art.
119
+ - The public design reference (`/brand`) reads the hall's tier, so its dark values now show the Helm neutrals. It was regenerated.
120
+
121
+ ## Known limits
122
+
123
+ - **A hall that wears a look keeps its tinted night** (ADR 0358): the tint is laid over the dark tier after the sheet, so that hall's grounds are its accent mixed into black, with Helm's inks, hairlines and shapes on top. Rebasing the tint on the Night is a separate decision.
124
+ - **"Has not chosen faces" is judged by the font stacks alone**: a pack whose two stacks equal the neutral pack's takes Helm. A custom look (one accent over the chrome world) therefore takes the Helm faces, which is intended; an instance that wants Manrope in its hall has to name a different stack.
125
+ - **The sign-in screens** link the hall's sheet but are built outside this seam, and they are before sign-in. They are not pinned dark and keep the pack's faces. Under a dark OS they now show the Helm neutrals.
126
+ - **The reading measure** (`--measure: 48ch`) was measured for Manrope. Barlow is narrower, so a line holds a few more characters. Not re-measured here.
127
+ - **The diagonal of a cut has no hairline.** The edge is a clipped border, as in the mock-up.
128
+
129
+ ## Follow-ups
130
+
131
+ - Remove the hall's light tier (the light values, the light-only rules, the light-pair tests).
132
+ - The options menu and character select: task 1005194.
133
+ - The visor, with the arc: task 1005195.
134
+ - The city in the clouds and the day cycle: task 1005196.
135
+
136
+ ## Rejected
137
+
138
+ - **A Helm branding pack** (a look in the style library). A pack reaches every surface, and the owner scoped Helm to the hall.
139
+ - **Setting the Helm faces inside the dark tier.** It would outrank every instance's own faces for good.
140
+ - **A pre-paint script, or the attribute typed into 33 pages.** One serve-time stamp covers every page and every page added later.
141
+ - **Deleting the light tier in this task.** A second, larger diff under a look the owner has not yet reviewed on every page.
142
+ - **A second button sheet for the status page.** One sheet with fallbacks keeps the hall and the status page on the same rules.
@@ -514,3 +514,7 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
514
514
  | 0395 | [**A task says what it needs, and each person's lists show only what they can do** ([task 1004950](https://cloudbongos.com/builders#/task/1004950)). `tasks.needs` ⊆ {owner, server} is its own set, not an `automation_tag` value (that one says whether work runs unattended). Capabilities are read fresh like rank: `owner` from the owner seat (founding builder fallback, the UAT reading), `server` from `builders.capability_grants`, set only by the owner. The recommend lists (claimable feed, optimizer, autonomous runner) show only tasks whose needs the viewer holds; the runner never holds owner. The claim refuses only `server` (`NEEDS_SERVER_ACCESS`, all three surfaces). Visibility elsewhere is unchanged; the board filters by need.](0395-a-task-says-what-it-needs-and-lists-show-only-what-you-can-do.md) | lifecycle / work tracking |
515
515
  | 0397 | [**The payment rail is Stripe Connect, one connected account per project; J.P. Morgan Payments is the fallback** ([task 1004906](https://cloudbongos.com/builders#/task/1004906), goal 1000092). The owner chose Stripe on 2026-10-30. Each project holds its money in its own connected account and each payee has one, so Cloud Bongos holds nothing (ADR 0385). Every flow in the ADR 0385 map is named against a Stripe primitive; a processor adapter module is the only place that names Stripe, so the fallback replaces one adapter. The processor is the party that monitors the money it holds. Test mode first; no live key is created, and counsel items 1 to 4 still gate real money.](0397-the-payment-rail-is-stripe-connect-with-one-connected-account-per-project.md) | economy / payments |
516
516
  | 0398 | [**Every hosted project takes its own update, and nobody asks for one** ([task 1005128](https://cloudbongos.com/builders#/task/1005128)). "Ask for this upgrade" is gone from every hall. A hosted hall with no upgrade address still names its hub door, by its own web address (`/deploy?host=`), which the hub resolves among the visitor's own projects; every core move writes the missing address into the project's settings. A self-hosted instance keeps the `bongos upgrade` instruction.](0398-every-hosted-project-takes-its-own-update-and-nobody-asks-for-one.md) | upgrades / hosting |
517
+ | 0399 | [**The visor is glass over the scene, owns no camera, and spends Escape in a fixed order** ([task 1005146](https://cloudbongos.com/builders#/task/1005146), goal 1000142). The first-person HUD is one DOM overlay (`visor.js`, game mode only) over the sky, the Governor City and Home's city. It passes pointers through, never draws inside a scene and never changes the stage's size. It writes no camera: it calls the scene's own `fitAll`/`flyTo`, which the scene registers. Stacking: scene → ambient glass → the scene's pop-ups → the visor's open sheet → modals. One Escape closes one layer, top first: dialog, picker, palette, visor sheet (capture listener, `stopPropagation`), the scene's pop-up (bubble listener, `preventDefault`), then the options menu in game mode or the shell outside it. Found: the city card's Escape does not call `preventDefault`, so it also drops the bars.](0399-the-visor-is-glass-over-the-scene-and-owns-no-camera.md) | hall / game frame |
518
+ | 0401 | [**One options menu opens every settings screen in a frame** ([task 1005144](https://cloudbongos.com/builders#/task/1005144), goal 1000141). `/settings` is the options menu: a search box over a grouped list. Settings' own panels stay native; My agents, Project settings, Modules, Permissions and Market Watch's settings and rules open inside it in an `<iframe>` of the old address with `?embed=1`, which `shell-game.js` reads only inside a frame to drop the page's chrome, send an unused Escape to the menu and open links to other pages in the whole window. A plain visit to an old address 302s to `/settings?open=<entry>` (the old #anchor rides along); the framed request keeps its own page gate and routes. In game mode the last Escape opens the menu and closes it again. Rejected: merging seven pages' scripts into one, a second /options page, links out of the menu.](0401-one-options-menu-opens-every-settings-screen-in-a-frame.md) | hall / game frame |
519
+ | 0400 | [**A chain reserves work; each sub-quest is still claimed on its own** ([task 1005158](https://cloudbongos.com/builders#/task/1005158), spike V3G.R18, goal 1000144). C5 of the game conversion: work is claimed as a chain, not picked from a flat table. Owner ruling (interview answer 3): a chain RESERVES, tasks are still claimed one at a time. **Decision:** three new tables (`chains` inside one goal, `chain_tasks` with a task in at most one open chain, `chain_party`), none of them a claim — no `claims` row, no session binding, no worktree — so `gateOneActiveClaimPerSession` (ADR 0097) and its unique index never see a chain. **Order is derived, never stored** (ADR 0153's rejection holds): the topological order of `task_dependencies` over the chain's members, ties by priority/estimate/id — `sequence.js`'s `topoOrder`, moved into one shared module. Every sub-quest claims through the unchanged `POST /claims` ladder. **The one addition** is a narrowing-only `CHAIN_RESERVED` check placed AFTER the last existing rung on both insert sites + the dry run + the feed: an outsider can't claim a reserved chain's sub-quest, while every existing refusal keeps its code, message and precedence. Party size (raid quorum vs routine) is refused at the chain's own join door, never in the claim ladder; character counts seats and is never read by a claim rung. A reservation lapses after days with no claim or ship, reported before it acts (ADR 0226). Rejected: a chain as N claims, loosening the session guard, chain = goal, a stored order, an early-ladder check (would mask rank/deps refusals), a feed-only reservation.](0400-a-chain-reserves-work-and-each-sub-quest-is-still-claimed-alone.md) | lifecycle / claims / game conversion |
520
+ | 0402 | [**Helm is the hall's look, and the hall is dark only** ([task 1005192](https://cloudbongos.com/builders#/task/1005192)). The game (the hall, everything after sign-in) wears Helm; the landing, the hub and the status page keep the chrome world. The kit: two voices (Barlow Condensed in wide capitals names a thing, Barlow says everything else), four colours with one job each (Night the ground, Ice what you read, White names and numbers, the accent only what you can act on), three shapes (the cut corner for anything pressable, the segment for progress, the arc for the visor). The values live in the hall's token block; `src/hall-helm.js` recognises a hall page by the sheet it links, pins it dark and hands it the Helm faces unless its pack chose its own. The light/dark switch is gone; the light tier stays until its own removal. The shared button spends every Helm token with the old pill as the fallback, so the status page does not move.](0402-helm-is-the-halls-look-and-the-hall-is-dark-only.md) | design system / hall |
@@ -7615,6 +7615,37 @@
7615
7615
  ]
7616
7616
  }
7617
7617
  },
7618
+ "/founding/skip": {
7619
+ "post": {
7620
+ "operationId": "post_founding_skip",
7621
+ "tags": [
7622
+ "founding"
7623
+ ],
7624
+ "summary": "POST /founding/skip",
7625
+ "description": "Skip genesis: the owner opens the full hall from any stage, no sitting, no gate.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
7626
+ "x-rank": "any-builder",
7627
+ "x-source": "modules/onboarding/routes/onboarding.js",
7628
+ "responses": {
7629
+ "200": {
7630
+ "description": "Success."
7631
+ },
7632
+ "400": {
7633
+ "$ref": "#/components/responses/BadRequest"
7634
+ },
7635
+ "401": {
7636
+ "$ref": "#/components/responses/Unauthorized"
7637
+ },
7638
+ "403": {
7639
+ "$ref": "#/components/responses/Forbidden"
7640
+ }
7641
+ },
7642
+ "security": [
7643
+ {
7644
+ "builderSession": []
7645
+ }
7646
+ ]
7647
+ }
7648
+ },
7618
7649
  "/founding/stages/{stage}/close": {
7619
7650
  "post": {
7620
7651
  "operationId": "post_founding_stages_stage_close",
@@ -7812,6 +7843,83 @@
7812
7843
  ]
7813
7844
  }
7814
7845
  },
7846
+ "/github/repo-invite": {
7847
+ "get": {
7848
+ "operationId": "get_github_repo_invite",
7849
+ "tags": [
7850
+ "github"
7851
+ ],
7852
+ "summary": "GET /github/repo-invite",
7853
+ "description": "(permission access_request.review) — where one person stands on the project's repo: collaborator, pending (invite sent, not yet accepted) or none.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `access_request.review` (all required).",
7854
+ "x-rank": "archon",
7855
+ "x-source": "src/bongos/routes/github.js",
7856
+ "x-permissions": [
7857
+ "access_request.review"
7858
+ ],
7859
+ "responses": {
7860
+ "200": {
7861
+ "description": "Success."
7862
+ },
7863
+ "400": {
7864
+ "$ref": "#/components/responses/BadRequest"
7865
+ },
7866
+ "401": {
7867
+ "$ref": "#/components/responses/Unauthorized"
7868
+ },
7869
+ "403": {
7870
+ "$ref": "#/components/responses/Forbidden"
7871
+ }
7872
+ },
7873
+ "security": [
7874
+ {
7875
+ "builderSession": []
7876
+ }
7877
+ ]
7878
+ },
7879
+ "post": {
7880
+ "operationId": "post_github_repo_invite",
7881
+ "tags": [
7882
+ "github"
7883
+ ],
7884
+ "summary": "POST /github/repo-invite",
7885
+ "description": "(permission access_request.review, the same gate as a hall invite) — invites a person to THIS project's GitHub repository, acting as the caller's OWN GitHub account (their stored repo token), never a platform credential. GitHub decides whether the caller may add people. The access is always READ-ONLY: write ('push') and above are refused, since a builder ships through the server. It grants no Bongos rank and does not admit anyone to the hall: those are the hall invite's own record.\n\n**Rank:** `archon` — Archon only (rank and identity management + the escalation keys — the trust boundary).\n\n**Permissions:** `access_request.review` (all required).",
7886
+ "x-rank": "archon",
7887
+ "x-source": "src/bongos/routes/github.js",
7888
+ "x-permissions": [
7889
+ "access_request.review"
7890
+ ],
7891
+ "requestBody": {
7892
+ "required": true,
7893
+ "content": {
7894
+ "application/json": {
7895
+ "schema": {
7896
+ "$ref": "#/components/schemas/PostGithubRepoInviteRequest"
7897
+ }
7898
+ }
7899
+ },
7900
+ "x-validated": true
7901
+ },
7902
+ "responses": {
7903
+ "200": {
7904
+ "description": "Success."
7905
+ },
7906
+ "400": {
7907
+ "$ref": "#/components/responses/ValidationFailed"
7908
+ },
7909
+ "401": {
7910
+ "$ref": "#/components/responses/Unauthorized"
7911
+ },
7912
+ "403": {
7913
+ "$ref": "#/components/responses/Forbidden"
7914
+ }
7915
+ },
7916
+ "security": [
7917
+ {
7918
+ "builderSession": []
7919
+ }
7920
+ ]
7921
+ }
7922
+ },
7815
7923
  "/github/repo/visibility": {
7816
7924
  "post": {
7817
7925
  "operationId": "post_github_repo_visibility",
@@ -15422,6 +15530,55 @@
15422
15530
  ]
15423
15531
  }
15424
15532
  },
15533
+ "/me/character": {
15534
+ "put": {
15535
+ "operationId": "put_me_character",
15536
+ "tags": [
15537
+ "me"
15538
+ ],
15539
+ "summary": "PUT /me/character",
15540
+ "description": "task 1005147 (BONGOS-V3 G2): character creation. Body: { character } — 'artisan' | 'artist' | 'patron', or null to clear it (the hall clears it and signs out: switching character is signing out and back in, spec settled point 2). Identity and view only: no claim, vote, deploy or spend gate reads it (criterion character-is-identity-not-authority). 422 invalid_character otherwise. rank: any-builder — a builder writes only their own row (req.builder.id), the /me/disciplines posture.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
15541
+ "x-rank": "any-builder",
15542
+ "x-source": "src/bongos/routes/me.js",
15543
+ "requestBody": {
15544
+ "required": false,
15545
+ "content": {
15546
+ "application/json": {
15547
+ "schema": {
15548
+ "$ref": "#/components/schemas/PutMeCharacterRequest"
15549
+ }
15550
+ }
15551
+ },
15552
+ "x-validated": true
15553
+ },
15554
+ "responses": {
15555
+ "200": {
15556
+ "description": "Success.",
15557
+ "content": {
15558
+ "application/json": {
15559
+ "schema": {
15560
+ "$ref": "#/components/schemas/PutMeCharacterResponse"
15561
+ }
15562
+ }
15563
+ }
15564
+ },
15565
+ "400": {
15566
+ "$ref": "#/components/responses/ValidationFailed"
15567
+ },
15568
+ "401": {
15569
+ "$ref": "#/components/responses/Unauthorized"
15570
+ },
15571
+ "403": {
15572
+ "$ref": "#/components/responses/Forbidden"
15573
+ }
15574
+ },
15575
+ "security": [
15576
+ {
15577
+ "builderSession": []
15578
+ }
15579
+ ]
15580
+ }
15581
+ },
15425
15582
  "/me/checkout-freshness": {
15426
15583
  "patch": {
15427
15584
  "operationId": "patch_me_checkout_freshness",
@@ -37483,6 +37640,22 @@
37483
37640
  },
37484
37641
  "additionalProperties": false
37485
37642
  },
37643
+ "PostGithubRepoInviteRequest": {
37644
+ "type": "object",
37645
+ "properties": {
37646
+ "github_login": {
37647
+ "type": "string",
37648
+ "maxLength": 60
37649
+ },
37650
+ "permission": {
37651
+ "type": "string"
37652
+ }
37653
+ },
37654
+ "required": [
37655
+ "github_login"
37656
+ ],
37657
+ "additionalProperties": false
37658
+ },
37486
37659
  "PostGithubRepoVisibilityRequest": {
37487
37660
  "type": "object",
37488
37661
  "properties": {
@@ -42942,6 +43115,25 @@
42942
43115
  ],
42943
43116
  "additionalProperties": false
42944
43117
  },
43118
+ "PutMeCharacterRequest": {
43119
+ "type": "object",
43120
+ "properties": {
43121
+ "character": {
43122
+ "type": "string",
43123
+ "maxLength": 32
43124
+ }
43125
+ },
43126
+ "additionalProperties": false
43127
+ },
43128
+ "PutMeCharacterResponse": {
43129
+ "type": "object",
43130
+ "properties": {
43131
+ "character": {}
43132
+ },
43133
+ "required": [
43134
+ "character"
43135
+ ]
43136
+ },
42945
43137
  "PutMingleOptInRequest": {
42946
43138
  "type": "object",
42947
43139
  "properties": {
@@ -43265,9 +43457,9 @@
43265
43457
  "description": "A required dependency/feature is not configured or is temporarily down."
43266
43458
  }
43267
43459
  },
43268
- "x-endpoint-count": 690,
43269
- "x-schema-count": 726,
43460
+ "x-endpoint-count": 694,
43461
+ "x-schema-count": 729,
43270
43462
  "x-undocumented-bodies": 12,
43271
- "x-response-schemas": 461,
43463
+ "x-response-schemas": 462,
43272
43464
  "x-generated-by": "scripts/bongos/gen-api-docs.js"
43273
43465
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Bongos API reference
4
4
 
5
- > **Generated from the live route files** — the route file is authoritative. 690 endpoints across 117 route files.
5
+ > **Generated from the live route files** — the route file is authoritative. 694 endpoints across 117 route files.
6
6
  > Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
7
7
 
8
8
  Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
@@ -313,7 +313,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
313
313
  | POST | `/api/bongos/feedback/receipt` | `any-builder` | `sha256`, `kind` | signed-in builder — a receipt only says "this builder sent this text"; it grants nothing here, and the hub files every report behind a nod. |
314
314
  | GET | `/api/bongos/feedback/receipt/:id` | `public` | — | the hub redeems a receipt with no session of its own. |
315
315
 
316
- ## `founding` (6)
316
+ ## `founding` (7)
317
317
 
318
318
  | Method | Path | Rank | Body | Description |
319
319
  |---|---|---|---|---|
@@ -321,16 +321,19 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
321
321
  | GET | `/api/bongos/founding/builders` | `any-builder` | — | The founding mark (task 1004424): who joined while the project was founding, in join order, with the stage each joined at. |
322
322
  | GET | `/api/bongos/founding/genesis` | `any-builder` | — | A project born through the startup flow enters genesis on its first founding read (founding-birth.js, task 1004506) — here and on GET /me… |
323
323
  | POST | `/api/bongos/founding/plan` | `any-builder` | `days`, `passes`, `advisors`, `government`, `expected_builders`, `existing` | The plan's ranges and vocabularies are genesis-home.js parsePlan's (one source); this schema only names the fields so an unknown one is r… |
324
+ | POST | `/api/bongos/founding/skip` | `any-builder` | — | Skip genesis: the owner opens the full hall from any stage, no sitting, no gate. |
324
325
  | POST | `/api/bongos/founding/stages/:stage/close` | `any-builder` | — | task 1005121: one call. |
325
326
  | POST | `/api/bongos/founding/start` | `any-builder` | — | |
326
327
 
327
- ## `github` (6)
328
+ ## `github` (8)
328
329
 
329
330
  | Method | Path | Rank | Body | Description |
330
331
  |---|---|---|---|---|
331
332
  | GET | `/api/bongos/github/orgs` | `any-builder` | — | the caller's OWN GitHub organisations (task 1004651), for the project page's "on an organisation" choice. |
332
333
  | GET | `/api/bongos/github/orgs/:org` | `any-builder` | — | checks ONE organisation name the caller typed, as their own GitHub credential sees it (task 1004651). |
333
334
  | GET | `/api/bongos/github/repo` | `any-builder` | — | reads one repo AS the caller's own GitHub credential sees it (the manage page's repo-visibility read, task 1003045). |
335
+ | GET | `/api/bongos/github/repo-invite` | `archon` | — | (permission access_request.review) — where one person stands on the project's repo: collaborator, pending (invite sent, not yet accepted)… |
336
+ | POST | `/api/bongos/github/repo-invite` | `archon` | `github_login`, `permission` | (permission access_request.review, the same gate as a hall invite) — invites a person to THIS project's GitHub repository, acting as the … |
334
337
  | POST | `/api/bongos/github/repo/visibility` | `any-builder` | `repo`, `visibility` | flips one of the caller's repos PUBLIC, with their own credential. |
335
338
  | GET | `/api/bongos/github/repos` | `any-builder` | — | acts only on the caller's OWN GitHub identity (the token they granted). |
336
339
  | POST | `/api/bongos/github/repos` | `any-builder` | `name`, `org` | creates a repo in the caller's OWN account, or (task 1004651) under an organisation they name in `org`. |
@@ -564,7 +567,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
564
567
  | PUT | `/api/bongos/market-watch/settings/key` | `metic+archon` | `key` | |
565
568
  | DELETE | `/api/bongos/market-watch/settings/key` | `metic+archon` | — | |
566
569
 
567
- ## `me` (60)
570
+ ## `me` (61)
568
571
 
569
572
  | Method | Path | Rank | Body | Description |
570
573
  |---|---|---|---|---|
@@ -575,6 +578,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
575
578
  | POST | `/api/bongos/me/cash-outs` | `any-builder` | `amount_cents`, `instruction_id` | POST /api/bongos/me/cash-outs — ask to take amount_cents of my balance to my bank. |
576
579
  | POST | `/api/bongos/me/cash-outs/:id/cancel` | `any-builder` | — | POST /api/bongos/me/cash-outs/:id/cancel — withdraw one of my requests that has not been sent. |
577
580
  | POST | `/api/bongos/me/cash-outs/:id/retry` | `any-builder` | — | POST /api/bongos/me/cash-outs/:id/retry — try one of my unfinished withdrawals again. |
581
+ | PUT | `/api/bongos/me/character` | `any-builder` | `character` | task 1005147 (BONGOS-V3 G2): character creation. |
578
582
  | PATCH | `/api/bongos/me/checkout-freshness` | `any-builder` | `behind`, `branch`, `reason` | How far behind this builder's local project folder is (task 1005021, checkout-freshness.js). |
579
583
  | PATCH | `/api/bongos/me/core-move-seen` | `any-builder` | `id` | The core move this builder has been told about (task 1004731, core-move-seen.js): closing the hall's "Upgraded to core X" notice stores t… |
580
584
  | GET | `/api/bongos/me/credits` | `any-builder` | — | GET /me/credits — the caller's own ledger. |
@@ -163,11 +163,15 @@ tasks + kind text NOT NULL DEFAULT 'unclassified' CHECK IN (feature|bug|infra|
163
163
  -- claim and is deliberately not counted (task 1003964)
164
164
  + scoping_confidence integer CHECK (1..5)
165
165
  + discipline text NOT NULL DEFAULT 'unclassified' (mig 014; renamed mig 086)
166
- CHECK IN (engineer|artist|ideator|unclassified)
166
+ CHECK IN (artisan|artist|ui|engineer|ideator)
167
+ -- (core_296, task 1005141: engineer/ideator still
168
+ -- accepted for rollback, read as artisan/artist;
169
+ -- unclassified dropped by core_247)
167
170
  -- orthogonal to kind; classifies builder
168
- -- interest area (engineer = code/infra/mechanics/bugs,
171
+ -- interest area (artisan = code/infra/mechanics/bugs,
169
172
  -- artist = pixel art/sprites/pipeline,
170
- -- ideator = scoping/research/docs/narrative/lore)
173
+ -- ideas = scoping/research/docs/narrative/lore,
174
+ -- the artist's since the ideator folded in)
171
175
  claims + head_sha text -- captured at claim time for incidental-work scanner
172
176
  builders + timezone text NOT NULL DEFAULT 'America/New_York'
173
177