@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.
- package/.bongos-core.json +498 -353
- package/.claude/skills/ask-for-help/SKILL.md +1 -1
- package/.claude/skills/builder-sequence/SKILL.md +1 -1
- package/.claude/skills/design/SKILL.md +1 -1
- package/.claude/skills/goal-create/SKILL.md +1 -1
- package/.claude/skills/planning-session/SKILL.md +1 -1
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +8 -0
- package/clients/bongos-client/index.cjs +8 -0
- package/clients/bongos-client/index.d.ts +11 -0
- package/clients/bongos-client/index.mjs +8 -0
- package/docs/adr/0274-one-kernel-three-role-packs.md +2 -2
- package/docs/adr/0399-the-visor-is-glass-over-the-scene-and-owns-no-camera.md +91 -0
- package/docs/adr/0400-a-chain-reserves-work-and-each-sub-quest-is-still-claimed-alone.md +109 -0
- package/docs/adr/0401-one-options-menu-opens-every-settings-screen-in-a-frame.md +53 -0
- package/docs/adr/README.md +3 -0
- package/docs/api/openapi.json +195 -3
- package/docs/api-reference.md +8 -4
- package/docs/architecture.md +7 -3
- package/docs/copy-inventory.md +390 -370
- package/docs/copy-registry.json +719 -518
- package/docs/design/characters/character-sprites-source.webp +0 -0
- package/docs/file-map.md +7 -8
- package/docs/module-api-changelog.md +4 -0
- package/docs/modules-contract.md +5 -0
- package/docs/onboarding/slash-commands.md +1 -1
- package/docs/packs/{engineer.md → artisan.md} +5 -5
- package/docs/packs/artist.md +50 -4
- package/docs/page-inventory.json +15 -4
- package/docs/page-readings.json +3182 -3336
- package/docs/{packs/ideator.md → recipes/ideation-playbook.md} +5 -48
- package/migrations/core_296_crafts_artisan_artist.sql +72 -0
- package/migrations/core_297_builder_character.sql +30 -0
- package/modules/copy-desk/proposals.js +1 -1
- package/modules/economy/credits-by-craft.js +29 -15
- package/modules/hall-ui/public/ai-studio.html +4 -4
- package/modules/hall-ui/public/atlas.html +5 -5
- package/modules/hall-ui/public/atlas.js +3 -1
- package/modules/hall-ui/public/blockers.html +5 -5
- package/modules/hall-ui/public/board-room.html +4 -4
- package/modules/hall-ui/public/characters/artisan.png +0 -0
- package/modules/hall-ui/public/characters/artist.png +0 -0
- package/modules/hall-ui/public/characters/patron.png +0 -0
- package/modules/hall-ui/public/city.css +2 -1
- package/modules/hall-ui/public/city.html +9 -6
- package/modules/hall-ui/public/city.js +7 -1
- package/modules/hall-ui/public/collab.html +4 -4
- package/modules/hall-ui/public/commands.html +4 -4
- package/modules/hall-ui/public/copy-desk.html +4 -4
- package/modules/hall-ui/public/craft-mode.js +258 -64
- package/modules/hall-ui/public/deploy.html +4 -4
- package/modules/hall-ui/public/diagram-viewer.js +2 -1
- package/modules/hall-ui/public/dom-utils.js +1 -1
- package/modules/hall-ui/public/goal-map.html +9 -6
- package/modules/hall-ui/public/goals.html +5 -5
- package/modules/hall-ui/public/government.html +4 -4
- package/modules/hall-ui/public/hall-render.js +3 -1
- package/modules/hall-ui/public/home-city-draw.js +3 -3
- package/modules/hall-ui/public/home-city.css +4 -0
- package/modules/hall-ui/public/home-city.js +17 -9
- package/modules/hall-ui/public/home-gallery.js +8 -1
- package/modules/hall-ui/public/home-idea-box.css +2 -2
- package/modules/hall-ui/public/home-idea-box.js +3 -3
- package/modules/hall-ui/public/idea.html +5 -5
- package/modules/hall-ui/public/ideas.html +5 -5
- package/modules/hall-ui/public/index.html +11 -7
- package/modules/hall-ui/public/market-watch-item.html +4 -4
- package/modules/hall-ui/public/market-watch-rules.html +4 -4
- package/modules/hall-ui/public/market-watch.html +6 -9
- package/modules/hall-ui/public/market-watch.js +22 -45
- package/modules/hall-ui/public/modules.html +4 -4
- package/modules/hall-ui/public/money.html +4 -4
- package/modules/hall-ui/public/my-agents.html +4 -4
- package/modules/hall-ui/public/options-menu.js +409 -0
- package/modules/hall-ui/public/paintbrush.js +3 -3
- package/modules/hall-ui/public/palette.js +11 -13
- package/modules/hall-ui/public/primer.html +5 -5
- package/modules/hall-ui/public/profile-crafts.js +1 -1
- package/modules/hall-ui/public/profile-roles.js +23 -19
- package/modules/hall-ui/public/profile.css +1 -1
- package/modules/hall-ui/public/profile.html +19 -18
- package/modules/hall-ui/public/profile.js +19 -18
- package/modules/hall-ui/public/profile.states.json +4 -4
- package/modules/hall-ui/public/project-settings.html +4 -4
- package/modules/hall-ui/public/roster.html +4 -4
- package/modules/hall-ui/public/roster.js +3 -3
- package/modules/hall-ui/public/settings.css +24 -4
- package/modules/hall-ui/public/settings.html +21 -17
- package/modules/hall-ui/public/settings.js +44 -44
- package/modules/hall-ui/public/shell-game.css +65 -0
- package/modules/hall-ui/public/shell-game.js +283 -3
- package/modules/hall-ui/public/shell.js +7 -26
- package/modules/hall-ui/public/sky-interaction.js +7 -0
- package/modules/hall-ui/public/speciality-tools.js +1 -2
- package/modules/hall-ui/public/street-inside.js +3 -4
- package/modules/hall-ui/public/street.html +4 -4
- package/modules/hall-ui/public/studio.html +5 -5
- package/modules/hall-ui/public/style.css +73 -47
- package/modules/hall-ui/public/task-detail.js +5 -4
- package/modules/hall-ui/public/task.html +5 -5
- package/modules/hall-ui/public/thinking.css +10 -0
- package/modules/hall-ui/public/thinking.html +9 -6
- package/modules/hall-ui/public/tweak-editor.html +5 -5
- package/modules/hall-ui/public/tweak-editor.js +5 -1
- package/modules/hall-ui/public/update-pill.js +91 -2
- package/modules/hall-ui/public/visor.css +80 -0
- package/modules/hall-ui/public/visor.js +316 -0
- package/modules/hall-ui/public/watch-repo-invite.js +159 -0
- package/modules/hall-ui/public/watch.html +6 -5
- package/modules/hall-ui/public/watch.js +17 -2
- package/modules/hall-ui/public/welcome-boot.js +15 -6
- package/modules/hall-ui/public/work.html +5 -5
- package/modules/hall-ui/records/builders-roster.md +2 -2
- package/modules/hall-ui/records/craft-mode.md +13 -11
- package/modules/hall-ui/records/game-mode.md +2 -2
- package/modules/hall-ui/records/governor-street.md +1 -1
- package/modules/hall-ui/records/home-city.md +3 -1
- package/modules/hall-ui/records/market-watch-settings.md +2 -0
- package/modules/hall-ui/records/options-menu.md +15 -0
- package/modules/hall-ui/records/profile-roles.md +11 -11
- package/modules/hall-ui/records/sky.md +3 -3
- package/modules/hall-ui/records/start-screen.md +21 -0
- package/modules/hall-ui/records/tweak-editor.md +1 -1
- package/modules/hall-ui/records/update-pill.md +12 -0
- package/modules/hall-ui/records/visor.md +23 -0
- package/modules/hall-ui/records/welcome-tower.md +5 -5
- package/modules/ideas/ideator-stats.js +3 -1
- package/modules/ideas/inbox.js +2 -2
- package/modules/lifecycle/activity.js +1 -1
- package/modules/lifecycle/cascade.js +4 -4
- package/modules/lifecycle/goal-spec-task.js +1 -1
- package/modules/lifecycle/help-requests.js +19 -15
- package/modules/lifecycle/kickoff-checklist.js +3 -3
- package/modules/lifecycle/kickoff-seed.js +1 -1
- package/modules/lifecycle/migrations/lifecycle_021_crafts_artisan_artist.sql +29 -0
- package/modules/lifecycle/mingle.js +4 -4
- package/modules/lifecycle/page-tweak-write.js +1 -1
- package/modules/lifecycle/routes/task-write-routes.js +3 -1
- package/modules/lifecycle/routes/tasks.js +3 -3
- package/modules/lifecycle/ship-card.js +2 -3
- package/modules/lifecycle/task-classifier.js +39 -29
- package/modules/lifecycle/tests/cascade.mjs +7 -7
- package/modules/onboarding/founding-mode.js +3 -0
- package/modules/onboarding/genesis-home.js +21 -1
- package/modules/onboarding/routes/onboarding.js +2 -0
- package/modules/page-notes/notes.js +3 -2
- package/modules/page-notes/split.js +1 -1
- package/modules/platform-identity/craft-rollup.js +35 -7
- package/modules/platform-identity/migrations/platform_identity_036_crafts_artisan_artist.sql +45 -0
- package/modules/platform-identity/platform-identity.js +2 -2
- package/modules/platform-identity/routes/community-leaderboard.js +2 -1
- package/modules/platform-identity/routes/community-search.js +2 -1
- package/modules/platform-identity/routes/sso.js +2 -1
- package/modules/platform-identity/tests/platform-identity.mjs +6 -6
- package/modules/public-landing/public/community.html +3 -5
- package/modules/public-landing/public/index.html +1 -1
- package/modules/public-landing/public/projects.html +1 -1
- package/modules/specialities/migrations/specialities_004_crafts_artisan_artist.sql +30 -0
- package/modules/specialities/routes/specialities.js +2 -2
- package/modules/status-ui/public/status.js +1 -1
- package/modules/ui-design/kit/fixtures/community-leaderboard.json +10 -10
- package/modules/ui-design/kit/fixtures/community-search.json +2 -2
- package/modules/ui-design/kit/fixtures/scouting-recruiter.json +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +76 -0
- package/scripts/bongos/autobongos-host.js +19 -4
- package/scripts/bongos/autobongos-loop.js +1 -1
- package/scripts/bongos/claude-materialize.js +20 -1
- package/scripts/bongos/discipline-modes.json +7 -12
- package/scripts/bongos/fitness.js +1 -1
- package/scripts/bongos/gen-hall-sitemap.js +7 -7
- package/scripts/bongos/grade-smoke.js +2 -2
- package/scripts/bongos/init.js +2 -2
- package/scripts/bongos/newcomer-floor.config.json +1 -2
- package/scripts/bongos/newcomer-floor.js +4 -3
- package/scripts/bongos/newcomer-floor.templates.json +10 -12
- package/scripts/bongos/newcomer-floor.test.js +47 -38
- package/scripts/bongos/role-pack-guard.js +5 -4
- package/scripts/bongos/seed-tasks.example.json +3 -3
- package/scripts/bongos/setup.js +20 -107
- package/scripts/bongos/start.js +2 -2
- package/scripts/bongos/task.js +5 -4
- package/scripts/bongos/triage.js +1 -1
- package/scripts/bongos/worktree.js +16 -4
- package/scripts/setup-builder.js +6 -46
- package/src/bongos/auth-admission.js +8 -8
- package/src/bongos/craft-mode.js +2 -0
- package/src/bongos/db.js +39 -1
- package/src/bongos/github-repos.js +78 -0
- package/src/bongos/module-scope-map.js +22 -0
- package/src/bongos/role-stats.js +27 -11
- package/src/bongos/routes/github.js +100 -2
- package/src/bongos/routes/me.js +33 -0
- package/src/bongos/serve-internal.js +26 -9
- package/src/crafts.js +66 -0
- package/src/module-api.js +6 -1
- package/src/module-loader/manifest-schema.js +16 -0
- package/src/modules.js +2 -2
- package/src/role-responsibilities.js +6 -5
- package/tests/acclaim_feed_evidence_db.mjs +1 -1
- package/tests/activity_rollup_as_of.mjs +1 -1
- package/tests/api_alias_caller_ratchet.mjs +3 -3
- package/tests/application_lifecycle.mjs +1 -1
- package/tests/artist_review.mjs +1 -1
- package/tests/artist_review_goal.mjs +1 -1
- package/tests/autobongos_host.mjs +19 -1
- package/tests/blocker_hall_live_proof.mjs +1 -1
- package/tests/blocker_tasks_named_db.mjs +2 -2
- package/tests/canonical_profile_url.mjs +1 -1
- package/tests/cap_newcomer_tasks.mjs +13 -13
- package/tests/character_creation.mjs +294 -0
- package/tests/claim_gate_open_blocker.mjs +2 -2
- package/tests/claim_gate_rebase.mjs +6 -6
- package/tests/claude_materialize.mjs +75 -1
- package/tests/clawback_confirmed_backlog.mjs +3 -3
- package/tests/collab_page.mjs +8 -9
- package/tests/collab_self_settling.mjs +2 -2
- package/tests/community_leaderboard_route.mjs +13 -5
- package/tests/community_proof_db.mjs +3 -0
- package/tests/community_search_route.mjs +7 -6
- package/tests/conductor.mjs +1 -1
- package/tests/conductor_main_e2e.mjs +8 -8
- package/tests/copy_desk_flags_db.mjs +1 -1
- package/tests/copy_desk_page_approve.mjs +2 -2
- package/tests/copy_desk_page_claim.mjs +2 -2
- package/tests/copy_desk_page_next.mjs +1 -1
- package/tests/copy_desk_page_release.mjs +1 -1
- package/tests/copy_desk_page_submit.mjs +2 -2
- package/tests/core_258_box_session_claims_db.mjs +1 -1
- package/tests/craft_mode.mjs +48 -34
- package/tests/craft_mode_home.mjs +20 -20
- package/tests/craft_mode_looks.mjs +16 -15
- package/tests/craft_mode_nav.mjs +31 -29
- package/tests/craft_review_mode.mjs +46 -41
- package/tests/crafts_vocabulary.mjs +70 -0
- package/tests/cross_discipline_priority_direction.mjs +5 -5
- package/tests/fitness.mjs +7 -11
- package/tests/funded_project_pays_proof_db.mjs +1 -1
- package/tests/genesis_home.mjs +21 -1
- package/tests/github_chip.mjs +3 -3
- package/tests/github_repo_invite.mjs +379 -0
- package/tests/goal_criterion_confirm_ui.mjs +1 -1
- package/tests/goal_invite_consent.mjs +1 -1
- package/tests/goal_map_page.mjs +2 -2
- package/tests/goal_sort_staleness.mjs +1 -1
- package/tests/goal_spec_task.mjs +1 -1
- package/tests/goal_spec_task_db.mjs +3 -3
- package/tests/grade_engine.mjs +2 -2
- package/tests/grader_no_artifact.mjs +1 -1
- package/tests/grader_prompt_fencing.mjs +1 -1
- package/tests/grader_prompt_window_bound.mjs +1 -1
- package/tests/grader_reader_lens.mjs +2 -2
- package/tests/grader_severity_gate.mjs +1 -1
- package/tests/grader_unbacked_score.mjs +1 -1
- package/tests/hall_approval_queue.mjs +1 -1
- package/tests/hall_board_world.mjs +2 -2
- package/tests/hall_builders_page_pass.mjs +1 -1
- package/tests/hall_city.mjs +1 -1
- package/tests/hall_fullscreen.mjs +27 -3
- package/tests/hall_kit_charts.mjs +1 -1
- package/tests/hall_landing_boot.mjs +1 -1
- package/tests/hall_my_agents.mjs +16 -16
- package/tests/hall_nav.mjs +22 -15
- package/tests/hall_options_menu.mjs +247 -0
- package/tests/hall_oversight_world.mjs +1 -1
- package/tests/hall_palette.mjs +8 -9
- package/tests/hall_profile_world.mjs +3 -3
- package/tests/hall_record_world.mjs +2 -2
- package/tests/hall_settings_world.mjs +2 -1
- package/tests/hall_sitemap.mjs +6 -5
- package/tests/hall_start_screen.mjs +244 -0
- package/tests/hall_street.mjs +2 -2
- package/tests/hall_street_inside.mjs +17 -9
- package/tests/hall_studio_world.mjs +3 -3
- package/tests/hall_visor.mjs +224 -0
- package/tests/help_requests.mjs +47 -15
- package/tests/helpers.mjs +4 -4
- package/tests/home_city.mjs +6 -4
- package/tests/home_city_widget.mjs +33 -14
- package/tests/home_gallery_widget.mjs +4 -4
- package/tests/home_idea_box.mjs +6 -6
- package/tests/hub_community_page.mjs +3 -3
- package/tests/hub_craft_rollup.mjs +75 -36
- package/tests/hub_recent_ships.mjs +3 -2
- package/tests/idea_cascade.mjs +2 -2
- package/tests/idea_credit_streams_db.mjs +1 -1
- package/tests/idea_detail_page.mjs +1 -1
- package/tests/idea_ideate_full.mjs +5 -2
- package/tests/idea_spark_hall.mjs +1 -1
- package/tests/init.mjs +3 -3
- package/tests/instance_manifest.mjs +2 -2
- package/tests/kickoff_checklist.mjs +1 -1
- package/tests/leaderboard_roles.mjs +34 -25
- package/tests/lifecycle_claim_ladder_refs.mjs +55 -0
- package/tests/lightbulb.mjs +14 -10
- package/tests/main_discipline.mjs +8 -8
- package/tests/markdown_line_endings.mjs +1 -1
- package/tests/market_watch_pages.mjs +52 -74
- package/tests/me_streak_leaderboard_queries.mjs +3 -3
- package/tests/migration_allocation.mjs +1 -1
- package/tests/mingle.mjs +36 -21
- package/tests/module-scope-map.mjs +22 -2
- package/tests/module_api.mjs +1 -0
- package/tests/module_contributions.mjs +13 -13
- package/tests/module_manifest.mjs +29 -0
- package/tests/module_skills_hook.mjs +2 -2
- package/tests/modules.mjs +14 -7
- package/tests/nav_permission_atoms.mjs +2 -1
- package/tests/needs_rebase.mjs +1 -1
- package/tests/newcomer_restock.mjs +13 -13
- package/tests/page_notes_panel.mjs +22 -22
- package/tests/page_tweak_no_block.mjs +1 -1
- package/tests/paintbrush.mjs +7 -7
- package/tests/privacy_matrix.mjs +1 -0
- package/tests/profile_activity.mjs +20 -23
- package/tests/profile_earnings.mjs +1 -1
- package/tests/profile_nudge_prefs.mjs +4 -4
- package/tests/profile_role_headline.mjs +73 -46
- package/tests/profile_role_stats.mjs +55 -45
- package/tests/profile_rollup_consent.mjs +19 -6
- package/tests/profile_route.mjs +12 -12
- package/tests/profile_ui_cross_project.mjs +4 -4
- package/tests/project_invite_suggestions.mjs +2 -2
- package/tests/promote_goal_id.mjs +1 -1
- package/tests/publish_manifest.mjs +1 -1
- package/tests/rank_floor_wiring.mjs +1 -1
- package/tests/regrade_actual_minutes.mjs +1 -1
- package/tests/removal_proposal.mjs +2 -2
- package/tests/reward_gate.mjs +4 -4
- package/tests/reward_mode_cost_plus_only.mjs +1 -1
- package/tests/role_responsibilities.mjs +18 -12
- package/tests/role_stats_db.mjs +17 -16
- package/tests/scouting_rollup_fanout.mjs +5 -5
- package/tests/seed_tasks.mjs +5 -2
- package/tests/session_earnings_mirror_db.mjs +1 -1
- package/tests/session_reward_on_land_db.mjs +1 -1
- package/tests/session_reward_reconcile_db.mjs +2 -2
- package/tests/sessions_kit_pager.mjs +1 -1
- package/tests/settings_art_key_absent.mjs +2 -2
- package/tests/settings_main_role.mjs +21 -20
- package/tests/setup_flow.mjs +3 -3
- package/tests/setup_smoke.mjs +20 -0
- package/tests/ship_card.mjs +6 -6
- package/tests/specialities.mjs +16 -4
- package/tests/speciality_db_shape.mjs +6 -6
- package/tests/speciality_injection.mjs +17 -17
- package/tests/speciality_offer_ui.mjs +5 -5
- package/tests/speciality_offered.mjs +6 -5
- package/tests/speciality_session_skills.mjs +7 -7
- package/tests/speciality_skills.mjs +11 -11
- package/tests/speciality_walkthrough_ui.mjs +2 -2
- package/tests/sso_checkin_identity_spoof.mjs +2 -1
- package/tests/task_classifier_vocab.mjs +10 -0
- package/tests/task_cli.mjs +11 -3
- package/tests/task_criteria_unlink_db.mjs +2 -2
- package/tests/task_discipline_required.mjs +38 -16
- package/tests/task_goal_required.mjs +4 -4
- package/tests/task_needs_db.mjs +1 -1
- package/tests/tweak_replaces_artist_review.mjs +1 -1
- package/tests/update_pill.mjs +153 -2
- package/tests/upkeep_home.mjs +1 -1
- package/tests/v3_c1_options_proof.mjs +145 -0
- package/tests/visual_review.mjs +3 -3
- package/tests/watch_applications_queue.mjs +8 -5
- package/tests/watch_sealed_floor.mjs +3 -1
- package/tests/welcome_boot.mjs +12 -9
- package/tests/welcome_boot_browser.mjs +13 -13
- package/tests/worktree_helper.mjs +16 -1
|
@@ -1,25 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Ideation playbook — the artist's ideas half, in detail
|
|
2
2
|
|
|
3
|
-
>
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
8
|
-
//
|
|
9
|
-
//
|
|
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
|
|
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
|
|
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
|
|
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(['
|
|
50
|
-
const DEFAULT_CRAFT = '
|
|
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
|
-
|
|
63
|
+
artisan: 'artisan',
|
|
55
64
|
artist: 'artist',
|
|
56
65
|
ui: 'artist',
|
|
57
|
-
|
|
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 '
|
|
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, {
|
|
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-
|
|
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-
|
|
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-
|
|
93
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
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-
|
|
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-
|
|
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-
|
|
96
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
65
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
67
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
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>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
-
|
|
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-
|
|
15
|
-
<link rel="stylesheet" href="/builders/
|
|
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-
|
|
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-
|
|
112
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
166
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
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-
|
|
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-
|
|
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-
|
|
58
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
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-
|
|
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-
|
|
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-
|
|
184
|
-
<script src="/builders/shell.js?v=2026-11-
|
|
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>
|