@bongos/core 1.19.1072 → 1.19.1074
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 +320 -465
- package/.claude/skills/feedback/SKILL.md +2 -2
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +4 -60
- package/clients/bongos-client/index.cjs +4 -60
- package/clients/bongos-client/index.d.ts +5 -90
- package/clients/bongos-client/index.mjs +4 -60
- package/config/branding.neutral.json +1 -5
- package/config/modules.neutral.json +2 -3
- package/config/scheduled-routines.json +0 -2
- package/docs/adr/0145-free-hosted-project-tier-isolation-and-domain-separation.md +1 -0
- package/docs/adr/0285-a-shared-box-holds-about-twelve-projects-per-gb-and-memory-is-the-wall.md +1 -0
- package/docs/adr/0323-hosting-is-three-shapes-and-we-are-not-the-landlord.md +1 -1
- package/docs/adr/0327-a-cloud-host-runs-on-the-owners-account-and-the-key-is-borrowed.md +1 -1
- package/docs/adr/0341-the-page-is-the-unit-of-tweak-mode.md +6 -2
- package/docs/adr/0345-we-host-every-projects-hall-and-its-app-deploys-where-the-owner-chooses.md +94 -0
- package/docs/adr/README.md +2 -1
- package/docs/api/openapi.json +171 -1661
- package/docs/api-reference.md +9 -41
- package/docs/architecture.md +16 -1
- package/docs/branding-contract.md +0 -3
- package/docs/copy-inventory.md +454 -479
- package/docs/copy-registry.json +746 -978
- package/docs/file-map.md +5 -34
- package/docs/module-api-changelog.md +4 -0
- package/docs/modules-contract.md +13 -1
- package/docs/onboarding/diagrams/04-architecture.mmd +11 -22
- package/docs/onboarding/diagrams/README.md +3 -3
- package/docs/onboarding/diagrams/assertions.json +2 -22
- package/docs/onboarding/primer.md +9 -28
- package/docs/page-inventory.json +4 -1
- package/docs/page-readings.json +1032 -1077
- package/docs/recipes/render-pilot.md +29 -10
- package/migrations/core_257_module_store_registry.sql +87 -0
- package/migrations/core_258_drop_dev_box_tables.sql +55 -0
- package/modules/agents/module.json +1 -0
- package/modules/autonomy/module.json +1 -0
- package/modules/builder-settings/module.json +1 -0
- package/modules/builder-settings/render-prefs.js +4 -5
- package/modules/copy-desk/docx.js +78 -5
- package/modules/copy-desk/module.json +1 -0
- package/modules/copy-desk/routes/copy-desk.js +9 -9
- package/modules/copy-desk/tests/copy_docx.mjs +107 -1
- package/modules/copy-desk/tests/fixtures/word-docx.mjs +30 -0
- package/modules/discord/module.json +1 -0
- package/modules/economy/module.json +1 -0
- package/modules/economy/routes/credits.js +1 -2
- package/modules/government/catalog.js +13 -17
- package/modules/government/migrations/government_019_retire_box_permissions.sql +33 -0
- package/modules/government/module.json +1 -0
- package/modules/government/protected-surfaces.json +3 -11
- package/modules/government/resolver.js +3 -46
- package/modules/government/routes/government.js +0 -2
- package/modules/government/session-scopes.js +43 -83
- package/modules/government/session-scopes.json +8 -18
- package/modules/grading/module.json +1 -0
- package/modules/hall-ui/module.json +1 -0
- package/modules/hall-ui/public/board-lib.js +2 -2
- package/modules/hall-ui/public/builders.js +29 -40
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/collab.js +1 -1
- package/modules/hall-ui/public/diagrams.html +3 -3
- package/modules/hall-ui/public/dom-utils.js +1 -1
- package/modules/hall-ui/public/gate.js +2 -2
- package/modules/hall-ui/public/gate.states.json +1 -1
- package/modules/hall-ui/public/hall-render.js +43 -79
- package/modules/hall-ui/public/index.html +5 -1
- package/modules/hall-ui/public/modules.js +1 -0
- package/modules/hall-ui/public/oversight.css +5 -5
- package/modules/hall-ui/public/palette.js +0 -11
- package/modules/hall-ui/public/primer.js +1 -1
- package/modules/hall-ui/public/sessions.html +1 -1
- package/modules/hall-ui/public/settings-sessions.js +1 -1
- package/modules/hall-ui/public/settings.css +0 -1
- package/modules/hall-ui/public/settings.html +4 -33
- package/modules/hall-ui/public/settings.js +3 -33
- package/modules/hall-ui/public/settings.states.json +2 -2
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/style.css +10 -13
- package/modules/hall-ui/public/task.html +4 -1
- package/modules/hall-ui/public/task.js +36 -1
- package/modules/hall-ui/public/tweak-editor-lib.js +18 -1
- package/modules/hall-ui/public/tweak-editor.css +16 -0
- package/modules/hall-ui/public/tweak-editor.html +26 -3
- package/modules/hall-ui/public/tweak-editor.js +32 -1
- package/modules/hall-ui/public/work.js +1 -1
- package/modules/hall-ui/records/tweak-editor.md +1 -0
- package/modules/ideas/module.json +1 -0
- package/modules/lifecycle/db-claim-reads.js +1 -58
- package/modules/lifecycle/db-ship.js +0 -5
- package/modules/lifecycle/db.js +0 -4
- package/modules/lifecycle/kickoff-checklist.js +0 -4
- package/modules/lifecycle/lifecycle.js +0 -8
- package/modules/lifecycle/module.json +1 -0
- package/modules/lifecycle/routes/tasks.js +5 -7
- package/modules/memory/module.json +1 -0
- package/modules/npm-release/module.json +1 -0
- package/modules/onboarding/module.json +1 -0
- package/modules/onboarding/onboarding-state.js +17 -36
- package/modules/onboarding/routes/access-requests.js +3 -3
- package/modules/platform-identity/module.json +1 -0
- package/modules/platform-identity/platform-identity.js +13 -5
- package/modules/platform-identity/routes/sso.js +2 -2
- package/modules/platform-identity/tests/platform-identity.mjs +17 -3
- package/modules/provisioning/module.json +1 -0
- package/modules/provisioning/provisioning.js +2 -2
- package/modules/provisioning/starter-bundles.js +5 -25
- package/modules/public-landing/module.json +1 -0
- package/modules/public-landing/public/assets/cosmos.css +1 -1
- package/modules/public-landing/public/contact.html +1 -1
- package/modules/public-landing/public/privacy.html +1 -1
- package/modules/public-landing/public/projects.html +101 -32
- package/modules/public-landing/public/projects.probes.json +2 -2
- package/modules/public-landing/public/projects.states.json +4 -3
- package/modules/public-landing/public/terms.html +1 -1
- package/modules/security/module.json +1 -0
- package/modules/sessions/module.json +1 -0
- package/modules/specialities/module.json +1 -0
- package/modules/status-ui/module.json +1 -0
- package/modules/ui-design/module.json +1 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +84 -0
- package/scripts/gds/artifact-format.js +203 -0
- package/scripts/gds/audit-authorship.sh +1 -13
- package/scripts/gds/claim.js +0 -15
- package/scripts/gds/cli-lib.js +8 -8
- package/scripts/gds/diagram-facts.js +12 -23
- package/scripts/gds/do-api.js +13 -80
- package/scripts/gds/doc-cli-guard.js +2 -0
- package/scripts/gds/doctor.js +1 -1
- package/scripts/gds/feedback-latest.js +139 -9
- package/scripts/gds/fitness-checks-identity.js +2 -7
- package/scripts/gds/fitness-checks-write-validation.js +4 -0
- package/scripts/gds/fitness-ratchets.js +4 -4
- package/scripts/gds/fitness.js +10 -10
- package/scripts/gds/gen-diagrams.js +49 -71
- package/scripts/gds/http-api-client.js +12 -19
- package/scripts/gds/init.js +1 -1
- package/scripts/gds/lint-infra-exec.js +1 -1
- package/scripts/gds/local-preview-lib.js +8 -39
- package/scripts/gds/local-preview.js +2 -15
- package/scripts/gds/migration-namespace.js +3 -3
- package/scripts/gds/module-artifact.js +212 -0
- package/scripts/gds/module.js +95 -6
- package/scripts/gds/package-core.js +5 -116
- package/scripts/gds/provision-config.js +2 -2
- package/scripts/gds/provision-net.js +2 -3
- package/scripts/gds/provision.js +9 -9
- package/scripts/gds/publish-manifest.js +1 -2
- package/scripts/gds/regen-instance-docs.js +1 -1
- package/scripts/gds/run-unit-tests.js +2 -16
- package/scripts/gds/sandbox-stage.js +39 -341
- package/scripts/gds/ship-flow.js +6 -6
- package/scripts/gds/ship-land.js +3 -4
- package/scripts/gds/ship-regen.js +10 -41
- package/scripts/gds/ship.js +4 -24
- package/scripts/gds/start.js +0 -15
- package/scripts/hall-preview/README.md +5 -5
- package/scripts/hall-preview/server.js +6 -6
- package/scripts/render-diagrams.sh +1 -1
- package/src/bongos/api-errors.js +1 -1
- package/src/bongos/auth-github.js +2 -3
- package/src/bongos/auth.js +51 -126
- package/src/bongos/db-kernel.js +2 -3
- package/src/bongos/db.js +5 -28
- package/src/bongos/module-scope-map.js +14 -29
- package/src/bongos/module-store.js +141 -0
- package/src/bongos/route-rank-check.js +3 -16
- package/src/bongos/routes/auth.js +0 -116
- package/src/bongos/routes/builders.js +5 -15
- package/src/bongos/routes/instance.js +8 -14
- package/src/bongos/routes/me.js +6 -22
- package/src/bongos/routes/modules.js +83 -0
- package/src/bongos/routes.js +5 -0
- package/src/module-api.js +13 -6
- package/src/module-loader/catalog.js +3 -0
- package/src/module-loader/loader.js +4 -4
- package/src/module-loader/manifest-schema.js +15 -7
- package/src/module-seams.js +2 -3
- package/src/modules.js +42 -14
- package/tests/agents_spend_guard.mjs +1 -1
- package/tests/api_client.mjs +0 -15
- package/tests/auth_page_gate.mjs +10 -10
- package/tests/canonical_profile_url.mjs +1 -3
- package/tests/claim_action.mjs +4 -1
- package/tests/claim_from_task_and_home.mjs +127 -0
- package/tests/consumer_layout_boot.mjs +2 -0
- package/tests/copy_desk_page_docx.mjs +33 -2
- package/tests/core_upgrade_runner.mjs +6 -6
- package/tests/deploy_divergence_line.mjs +11 -11
- package/tests/diagram_facts_offset.mjs +1 -1
- package/tests/do_api.mjs +106 -0
- package/tests/feedback_latest.mjs +122 -0
- package/tests/fitness.mjs +44 -42
- package/tests/gate_approvals.mjs +0 -1
- package/tests/go_live.mjs +3 -3
- package/tests/government_abuse_matrix.mjs +20 -19
- package/tests/government_ownership_scope.mjs +33 -35
- package/tests/government_parity.mjs +2 -2
- package/tests/government_protected_surfaces.mjs +56 -37
- package/tests/government_require_permission.mjs +3 -3
- package/tests/government_seed.mjs +37 -4
- package/tests/government_session_scope.mjs +92 -366
- package/tests/hall_error_envelope.mjs +4 -0
- package/tests/hall_landing_boot.mjs +4 -1
- package/tests/hall_palette.mjs +1 -16
- package/tests/hall_record_world.mjs +6 -0
- package/tests/hall_tweak_editor.mjs +52 -1
- package/tests/host_topology_skips.mjs +1 -2
- package/tests/html_comment_nesting.mjs +137 -0
- package/tests/infra_exec_paths.mjs +9 -10
- package/tests/init.mjs +4 -5
- package/tests/instance_manifest.mjs +18 -25
- package/tests/kickoff_checklist.mjs +1 -1
- package/tests/lib_sh_resolution.mjs +0 -221
- package/tests/local_preview.mjs +0 -12
- package/tests/module-scope-map.mjs +9 -9
- package/tests/module_catalog.mjs +1 -1
- package/tests/module_cli.mjs +15 -15
- package/tests/module_contributions.mjs +6 -6
- package/tests/module_loader.mjs +6 -6
- package/tests/module_manifest.mjs +13 -4
- package/tests/module_store_publish.mjs +307 -0
- package/tests/module_store_publish_route.mjs +121 -0
- package/tests/module_store_registry_migration.mjs +70 -0
- package/tests/modules.mjs +56 -26
- package/tests/onboarding_route_signals.mjs +21 -31
- package/tests/onboarding_state.mjs +35 -49
- package/tests/permission_path.mjs +0 -3
- package/tests/platform_boot.mjs +1 -2
- package/tests/profile_route.mjs +1 -6
- package/tests/projects_hub.mjs +5 -5
- package/tests/projects_hub_app_step.mjs +138 -0
- package/tests/projects_hub_module_picker.mjs +2 -2
- package/tests/projects_hub_pre_uat.mjs +4 -5
- package/tests/provision.mjs +7 -7
- package/tests/provisioning_starter_bundles.mjs +0 -22
- package/tests/publish_branch_route.mjs +10 -18
- package/tests/publish_manifest.mjs +1 -2
- package/tests/rank_tier_single_source.mjs +1 -13
- package/tests/repo_map.mjs +3 -4
- package/tests/runner_drift.mjs +3 -21
- package/tests/sandbox_stage.mjs +57 -390
- package/tests/session_rename_fallback.mjs +0 -21
- package/tests/ship_error_shape.mjs +1 -1
- package/tests/task_visual_slots.mjs +31 -0
- package/tests/terms_acceptance.mjs +1 -1
- package/tests/upgrade.mjs +4 -4
- package/tests/watch_sealed_floor.mjs +0 -1
- package/tests/wizard_draft_resume.mjs +2 -2
- package/tests/wizard_intent_resume.mjs +21 -10
- package/tests/wizard_preselect_why.mjs +18 -18
- package/docs/onboarding/browser-terminal-guide.md +0 -73
- package/docs/recipes/managed-settings-remote-control.md +0 -416
- package/modules/dev-box/CLAUDE.md +0 -15
- package/modules/dev-box/box-access.js +0 -623
- package/modules/dev-box/box-credential.js +0 -94
- package/modules/dev-box/box-onboard.js +0 -486
- package/modules/dev-box/boxes.js +0 -1038
- package/modules/dev-box/db.js +0 -39
- package/modules/dev-box/module.json +0 -19
- package/modules/dev-box/routes/box.js +0 -1223
- package/scripts/gds/box-auth-check.js +0 -160
- package/scripts/gds/box-infra.js +0 -321
- package/scripts/gds/box-sync.js +0 -216
- package/scripts/gds/box.js +0 -1332
- package/scripts/gds/cf-tunnel.js +0 -558
- package/scripts/gds/smoke-box.sh +0 -150
- package/scripts/gds/tree-preflight.js +0 -241
- package/src/bongos/app-pair.js +0 -172
- package/tests/app_pair.mjs +0 -168
- package/tests/box_access.mjs +0 -578
- package/tests/box_auth_check.mjs +0 -114
- package/tests/box_code_staleness.mjs +0 -129
- package/tests/box_connect_e2e.mjs +0 -196
- package/tests/box_cost.mjs +0 -70
- package/tests/box_credential.mjs +0 -125
- package/tests/box_dns_repoint.mjs +0 -153
- package/tests/box_env.mjs +0 -64
- package/tests/box_host_keys.mjs +0 -126
- package/tests/box_infra_resolve.mjs +0 -246
- package/tests/box_onboard.mjs +0 -317
- package/tests/box_scope_session.mjs +0 -119
- package/tests/box_sweep_docs.mjs +0 -119
- package/tests/box_sync.mjs +0 -55
- package/tests/box_sync_scope_report.mjs +0 -126
- package/tests/box_task_scope.mjs +0 -169
- package/tests/box_task_scope_pause.mjs +0 -66
- package/tests/box_terminal_ssrf.mjs +0 -96
- package/tests/boxes.mjs +0 -1585
- package/tests/cf_ruleset_preflight.mjs +0 -142
- package/tests/cf_tunnel.mjs +0 -496
- package/tests/docs_scrubber_damage.mjs +0 -111
- package/tests/module_scope_active_claims.mjs +0 -94
- package/tests/ship_api_client_pathspec.mjs +0 -100
- package/tests/tree_preflight.mjs +0 -243
package/docs/file-map.md
CHANGED
|
@@ -64,8 +64,7 @@
|
|
|
64
64
|
│ │ ├── ops-gotchas.md ← Postgres, Caddy, SSH, Mac toolchain recipes
|
|
65
65
|
│ │ ├── windows-builders.md ← (task 1002809) the Windows + Git Bash builder loop: worktree junction trap, api.js MSYS auto-repair, --body-file pattern, local test baseline
|
|
66
66
|
│ │ ├── pixel-art-pipeline.md
|
|
67
|
-
│ │
|
|
68
|
-
│ │ └── managed-settings-remote-control.md ← (#599/ADR 0031 §1, #760/ADR 0038) operator+builder guide: distribute the locked Claude Desktop SSH config; the browser web-terminal (ttyd + Cloudflare Tunnel) on-ramp
|
|
67
|
+
│ │ └── overnight-builder.md ← (#358) operator runbook for the autonomous overnight session-runner
|
|
69
68
|
│ ├── research/ ← investigations that answer a question rather than record a decision (an ADR) or a procedure (a recipe)
|
|
70
69
|
│ │ ├── task-network-map-readability.md ← (task 1003282, goal 1000072) the spike verdict: a node-link map of ~1,357 tasks is unreadable at every dependency density — 59–97% isolated dots, and the dense fix overplots 84% of them into the 40-node goal graph. Build the goal graph + a per-goal dependency forest; measure the real density with `--from` first
|
|
71
70
|
│ │ └── task-network-map/ ← the figures that verdict argues from, rendered by scripts/gds/spike-task-map.js — regenerate, never hand-edit
|
|
@@ -74,22 +73,6 @@
|
|
|
74
73
|
│ ├── session-log-archive.md ← compressed older session-log prose
|
|
75
74
|
│ └── voice.md ← task 1003976 (ADR 0298): the VOICE GUIDE — the standard a line of visible product copy is judged against. Eleven cited rules in two tiers: V1–V5 hard (a lens may assert a break), V6–V11 judgement (a lens flags, the artist decides), plus a Part C of what is deliberately NOT ruled on so a lens cannot manufacture findings in the gaps. Every rule derives from a line this project already praised or condemned in a recorded artist review, not from a general style guide. Part D is the rubric contract the advisory `reader` worker (task 1003977) is handed. DESIGN.md:346 points here for the copy half
|
|
76
75
|
│
|
|
77
|
-
├── infra/
|
|
78
|
-
│ ├── Caddyfile ← reverse proxy + Cloudflare Origin Cert TLS
|
|
79
|
-
│ ├── example.service ← systemd unit
|
|
80
|
-
│ ├── box-idle-suspend.{service,timer} ← (#598) 15-min CONTROL-PLANE sweep: snapshot-and-park idle dev boxes
|
|
81
|
-
│ ├── box-dormant-reclaim.{service,timer} ← (#598) daily CONTROL-PLANE sweep: deprovision long-parked dev boxes
|
|
82
|
-
│ ├── box-intent-runner.{service,timer} ← (#701) 1-min CONTROL-PLANE runner: drain box_intents (auto-provision + wake-on-connect) via `box.js run-intents --apply`
|
|
83
|
-
│ ├── box-drift-reconcile.{service,timer} ← (#1289/ADR 0071) hourly CONTROL-PLANE sweep: repair DO⇄DB drift via `box.js reconcile-drift --apply` (kill zombie droplets, mark ghost rows destroyed)
|
|
84
|
-
│ ├── box-heartbeat.sh ← (#598) runs ON THE BOX: pings /api/bongos/box/heartbeat while in use, so the idle sweep measures activity not uptime
|
|
85
|
-
│ ├── box-report-terminal.sh ← (#760/ADR 0038) runs ON THE BOX: POSTs the box's web-terminal URL + basic-auth credential UP to /api/bongos/box/terminal so a Chromebook builder reads them from the web
|
|
86
|
-
│ ├── box-source-fetch.sh ← (#600/#898/ADR 0052) runs ON THE BOX post-clone: scope-aware source fetch (sparse starter / full) + idempotently installs & enables the box units (box-game-preview, box-terminal, close-box) on every fetch so existing boxes self-heal; also self-tests (task 843) — every cycle it black-box-probes box-terminal/cloudflared/box-game-preview + the terminal credential and restarts whatever's unhealthy, not just what's absent
|
|
87
|
-
│ ├── builder-box-cloud-init.yaml ← (#598/#599/#760) first-boot bootstrap: Docker + devcontainer up, Claude Code + ttyd + cloudflared on host, box-terminal.service + cloudflared.service + heartbeat cron wired (substituted by box.js)
|
|
88
|
-
│ ├── managed-settings.template.json ← (#599) Claude Desktop sshConfigs template (locked to one approved box); filled per-builder by gen-managed-settings.sh
|
|
89
|
-
│ ├── gen-managed-settings.sh ← (#599) operator: emit per-builder Claude Desktop managed-settings.json (JSON-safe node substitution + input validation, #667)
|
|
90
|
-
│ ├── box-terminal.service ← (#760/ADR 0038) always-on ttyd web terminal (127.0.0.1:7681, per-box basic-auth) for thin-device (Chromebook/browser) builders
|
|
91
|
-
│ ├── cloudflared.service ← (#760/ADR 0038) outbound-only Cloudflare Tunnel exposing the box terminal (no inbound ports); runs cloudflared-run.sh
|
|
92
|
-
│ └── cloudflared-run.sh ← (#760/ADR 0038) runs ON THE BOX: named tunnel (BOX_TUNNEL_TOKEN) or tokenless quick tunnel; writes the public URL to /run/otb/terminal-url
|
|
93
76
|
├── migrations/ ← CORE (build-system / Bongos) migrations — schema + platform-universal seeds, applied on EVERY instance (migrate.sh `migrations/*.sql`). Game-module migrations moved to modules/game/migrations/ (BV1.R49).
|
|
94
77
|
│ ├── instance/ ← OTB/product SCOPE-TRUTH seeds (versions, goals, done_when_criteria). Applied only on the OWNING instance — `GDS_APPLY_INSTANCE_SEEDS=1`, default OFF — so a vanilla/branded self-host never inherits them (task 1704 / ADR 0105). Merge-sorted with core by basename, so global order is preserved.
|
|
95
78
|
│ ├── game/ ← LEGACY game-module migrations (moved to modules/game/migrations/ in BV1.R49 — stem-keyed, so they did NOT re-run on prod). Kept here as a frozen archive; migrate.sh still applies them for backward compat.
|
|
@@ -114,7 +97,6 @@
|
|
|
114
97
|
│ ├── 067_builder_boxes.sql ← #598/ADR 0031: builder_boxes (per-builder dev box lifecycle state) + box_events ledger
|
|
115
98
|
│ └── <redacted>.sql ← task 615: rename disciplines engineering→engineer, creative→artist|ideator; swaps both CHECK constraints + backfills tasks.discipline & builders.preferred_disciplines
|
|
116
99
|
├── modules/ ← self-contained optional feature modules (ADR 0083 / docs/modules-contract.md). Each `modules/<key>/` is a full vertical slice — routes, migrations, skills, seam registrations — reached only through src/module-api.js. The loader discovers them at boot; no core file changes to add one.
|
|
117
|
-
│ ├── dev-box/ ← per-builder cloud dev environments (DigitalOcean + Cloudflare tunnels, sandbox preview, branch publish). Template move (BV1.R43). CLAUDE.md, module.json, routes/box.js, boxes.js, box-access.js, box-onboard.js, do-api.js, cf-tunnel.js, http-api-client.js, box-credential.js.
|
|
118
100
|
│ ├── game/ ← the playable Example world — Phaser client, Colyseus rooms (WorldRoom/QueueRoom), world/terrain model, game DB tables, static assets. Moved BV1.R49 (task 1418). CLAUDE.md, module.json, routes/game.js, rooms/, world/, public/, migrations/.
|
|
119
101
|
│ ├── discord/ ← outbound ship broadcast + inbound #ideas/#bugs bot + role-sync + channel management + account-link state + the Board Room mirror. Mirror only, never authority (ADR 0033). CLAUDE.md, module.json, routes/discord.js, routes/bug-attachments.js, discord-bot.js, discord-lib.js, board-broadcast.js (announce a window / edit the outcome onto it — R21/R22 of goal 1000069), migrations/discord_001_board_messages.sql.
|
|
120
102
|
│ ├── art-pipeline/ ← self-improving pixel-art generation pipeline + the four otb-* art skills + the artist discipline. CLAUDE.md, module.json, routes/art-key.js, art/ (lives under art/ at repo root; module owns the route and discipline entry).
|
|
@@ -172,7 +154,7 @@
|
|
|
172
154
|
│ ├── package-core.js ← package the core as a versioned, installable artifact + pin manifest (`bongos package-core`; R84, ADR 0100 §1, [#1688](https://example.com/builders#/task/1688)): isPublishable() selection + mirror redaction + fail-closed no-leak gate → dist/bongos-core-<version>.{tgz,manifest.json}; version = src/module-api CORE_VERSION. Recipe: docs/recipes/packaging-the-core.md
|
|
173
155
|
│ ├── release-notes.js ← what each core release brought in (task 1004218): generated at pack time from the ref's HISTORY into the package's release-notes.json (exact per-release ranges, 1 MiB bound; package-core redacts its prose like a doc), read back by the upgrade runner for a from→to range; home of the one merge-summary parser
|
|
174
156
|
│ ├── surface.js ← who the CLI output is FOR: agent (default) or terminal (task 1003680). The `bongos` dispatcher sets BONGOS_SURFACE=terminal when a person types a verb; the skills and the card hook run `node scripts/gds/<verb>.js` directly and keep the agent card byte-identical. Never inferred from isTTY — a session's stdout is not a TTY either, so sniffing would invert it. Helpers: action() (/builder-ship N vs bongos ship N), taskRef(), strong()/em()/code(), table() (markdown vs aligned columns). Guarded by tests/cli_surface.mjs
|
|
175
|
-
│ ├── sandbox-stage.js ← stage the working tree on the
|
|
157
|
+
│ ├── sandbox-stage.js ← stage the working tree on the builder's local game preview for browser review before ship (`/builder-stage`; #927, ADR 0046; task 1056)
|
|
176
158
|
│ ├── local-preview.js ← builder CLI for the LOCAL sandbox: start/stop/status/restart/logs/url of the game-only preview at http://localhost:3100 (`npm run preview`; task 1056)
|
|
177
159
|
│ ├── local-preview-lib.js ← core of the local sandbox launcher (detached `node src/preview-server.js`, pid/health/port mgmt); shared by local-preview.js + sandbox-stage.js (task 1056)
|
|
178
160
|
│ ├── dev.js ← `bongos dev`: one-command LOCAL launcher for a standalone instance (Postgres → createdb → migrate → server on the branding port → sign-in); up/stop/status (ADR 0149)
|
|
@@ -190,8 +172,6 @@
|
|
|
190
172
|
│ ├── stray-unit-sweep.sh ← (task 1003939) control-plane sweep: the ledger's torn-down slugs that still have a service/backup unit loaded or on disk (a torn-down project holding memory outside the ADR 0285 count); survey by default, `--apply` disables, removes, reloads, reset-failed's; DB/dumps/checkout/Caddy left alone
|
|
191
173
|
│ ├── address-park-sweep.sh ← (task 1003947) control-plane sweep: the ledger's torn-down rows that still have a `<slug>.caddy` block or a hostname not yet parked (rows torn down before task 1002897 taught teardown to do both); survey by default, `--apply` removes the snippets, reloads Caddy and parks each non-reserved hostname at 192.0.2.1 via the DNS hook; the reserved rule, zone and apex come from the installed core
|
|
192
174
|
│ ├── smoke-gds.js ← public-surface + 401-check smoke test (asserts /api/pms/* now 404s — removed in V3.R01-followup #308)
|
|
193
|
-
│ ├── box.js ← (#598/ADR 0031) per-builder dev box lifecycle CLI: provision·park·wake·deprovision·sweep-idle·sweep-dormant·status (dry-run default, --apply to act; rank-gated)
|
|
194
|
-
│ ├── smoke-box.sh ← (#598) hermetic box-lifecycle smoke (no DB/DO/network): runs tests/boxes.mjs + tests/cf_tunnel.mjs (#771 named tunnel) + route-rank + module-load
|
|
195
175
|
│ ├── recall.js ← `/recall` CLI: two-call progressive-disclosure search (summary → `--expand <id>`) over Bongos retrieval layer (ADR 0060); `node scripts/gds/recall.js <query>`
|
|
196
176
|
│ ├── capture.js ← file an idea_inbox row from the CLI (the ideas.capture kernel port); backs the "capture a tangent" flow across skills. Task 1002927 / R151 taught it the GRADES: `--full --fields-file f.json` files a Full Idea, `--spark` is capture-then-mark (two requests — the route refuses a pre-marked capture), and after a plain quick capture it OFFERS to develop further. That offer is TTY-gated (`--no-prompt` too): capture.js is run by agents with no terminal and reads its body from stdin, so an unguarded prompt would hang every non-interactive caller. Task 1003070 / R09 (goal 1000071) taught it capture-time ROUTING: `--goal N` sends goal_id, `--goal none` opts out explicitly, and with neither it defaults to the caller's active claim's goal, else prints a one-line R07 suggester hint
|
|
197
177
|
│ ├── spark.js ← (tasks 1002920 / R144 + 1002921 / R145 + 1002922 / R146) the whole spark handoff from the terminal: mark one of your OWN quick ideas as a Big Idea Spark (`--undo` withdraws it), `--list` is the SPARK QUEUE, `--template` prints the five Full Idea fields, `--develop <id> --fields-file <json>` is the PICKUP (any builder; author + developer both recorded). Author-only server-side for the mark (it is the consent); its own command because sparking acts on an EXISTING idea, which is why capture.js refuses grade='spark'
|
|
@@ -237,7 +217,7 @@
|
|
|
237
217
|
│ ├── bongos/ ← the Bongos core kernel (mounted at /api/bongos; canonical path since the V4/BONGOS-V1 rename — /api/gds/* stays mounted forever as a permanent alias, /api/pms/* removed V3.R01-followup #308 — now 404). Own nested map: src/bongos/CLAUDE.md.
|
|
238
218
|
│ │ ├── pool.js ← the kernel-owned pg pool (R52 carve-out, task 1191/ADR 0062 §5): resolves DATABASE_URL → PG* → branding db.database (no hard-coded DB name); the core no longer imports the game's src/db.js
|
|
239
219
|
│ │ ├── db.js / db-kernel.js ← the RESIDUE after the ADR 0091/0093 tranche 1+2 core-domain carve: builder identity/admission, rank/status management, auth sessions, the Discord/karma social twins, audit log, security_docs. The build state machine (tasks·claims·versions·done-when·ship) graduated to modules/lifecycle/db.js; grading/economy/ideas/security(feature)/builder-settings/onboarding/sessions/autonomy each graduated to their own `modules/<key>/` with a kernel PORT back-reference — see src/bongos/CLAUDE.md for the full carve map.
|
|
240
|
-
│ │ ├── auth.js ← GitHub Device Flow (CLI) + Authorization Code (web) + middleware (requireBuilder, requireRank,
|
|
220
|
+
│ │ ├── auth.js ← GitHub Device Flow (CLI) + Authorization Code (web) + middleware (requireBuilder, requireRank, requirePermission)
|
|
241
221
|
│ │ ├── routes.js ← thin mounter — imports each routes/* sub-router + every enabled module's routes and stitches them behind kernel-composed auth
|
|
242
222
|
│ │ ├── api-prefix.js ← API_PREFIX ('/api/bongos') + LEGACY_API_PREFIXES ('/api/gds' permanent alias) + API_VERSION
|
|
243
223
|
│ │ ├── api-path-404.js ← recognize Bongos-API-shaped paths that missed the mount → JSON 404 + corrective hint (server.js catch-all; V4.R14, [#952](https://example.com/builders#/task/952))
|
|
@@ -260,19 +240,13 @@
|
|
|
260
240
|
│ │ ├── goal-scope-check.js / hierarchy-config.js / module-scope-map.js ← goal-scope protected-path checks, the configurable work-hierarchy tiers, and the module→file-glob map
|
|
261
241
|
│ │ ├── project-door.js ← the project's COMPOSED join/apply door — visibility × join_grant × joinability → open | apply | invite_only | locked (BV1.R12 / task 1002331, ADR 0182 D6 + ADR 0247). PURE + kernel; published as api.projectJoinDoor() so the public POST /access-requests, the hall landing form, the CLI and the hub's join relay cannot answer one stranger differently — and since task 1003579 (ADR 0256) the SIGN-IN gate reads it too (openEnrollmentEnabled), which is why joinabilityMode() lives here rather than in auth-admission.js
|
|
262
242
|
│ │ ├── artist-gate.js ← the project's ARTIST GATE — off | advisory | strict (task 1003575, ADR 0241). PURE + kernel; published as api.artistGate so the lifecycle cascade ("file this review?") and the pin move ("does an open one hold?") resolve the same knob through one reader. It reads a STATE (is a cascade-filed artist review still open?), never a verdict, and what it can hold is the DEPLOY, never a builder's ship — that boundary is the whole reconciliation with ADR 0162
|
|
263
|
-
│ │ ├── path-match.js / repo-info.js / metrics.js / uptime-poller.js
|
|
243
|
+
│ │ ├── path-match.js / repo-info.js / metrics.js / uptime-poller.js ← touches[] overlap matcher, git-remote parser, Prometheus metrics endpoint, uptime poller
|
|
264
244
|
│ └── world/
|
|
265
245
|
│ ├── terrain.js ← (Phase D + ADR 0012, CJS): TERRAIN + OBJECT enums + BLOCKING_TERRAINS + BLOCKING_OBJECTS (server twin of public/game/world/terrain.js)
|
|
266
246
|
│ └── map.js ← (Phase D + ADR 0012): two-grid INITIAL_MAP {ground, objects}; isBlocked checks both layers (mirrors public/game/world/{terrain,map}.js)
|
|
267
247
|
│ (public-status/ moved to modules/status-ui/public/ in BV1.R84 — see the modules/ block above)
|
|
268
248
|
│ (public-builders/ moved to modules/hall-ui/public/ in BV1.R85 — the authenticated builders' hall; see the modules/ block above. It keeps its DEDICATED serving block in src/bongos/serve-internal.js: the builders.<apex> + apex /builders/* shim, canonical redirects, the citizen/Archon page gates, asset-stamping, and the module hall-widget injection — partitioned out of the generic web-surface loop. index.html=the hall dashboard; work/board/roadmap/goals/watch/gate/settings/ranks/sessions/primer/diagrams/atlas pages (harbor + pair left with the dev box, task 1003890); ideas.{html,js,css}=the Full Idea composer (task 1002928 / R152 of goal 1000062 — the five R141 fields with a live R142 completeness meter, both fetched from the server so the page carries no copy of the rules; drafts in localStorage so navigation costs nothing. Task 1002930 / R154 added the SPARK QUEUE above it and a second mode: `?develop=<id>` reuses the same form to develop a spark — the spark's words shown above the fields, its title read-only, and the file routed to POST /inbox/:id/develop instead of POST /inbox, under its own per-idea draft key); idea.html/idea.js=the idea-detail PAGE (/idea/:id, task 1002929 / R153 — the SECOND two-segment hall page after /task/:id: grade, the five answers in template order, the score, and both attributions. The GRADE decides what the page contains — a quick idea gets no five-field skeleton. task-detail.js keeps the #/idea/N overlay because ~320 of its lines are the Metic+ triage panel; the overlay now links here); profile.html/profile.js=the public, shareable builder profile page (/profile?id=N — rank, works, credits, karma, achievements; task 1467); profile-connections.js=section 6 of that page, the hub-only connections block (task 1002296 / R20 of goal 1000045 — the viewer-relative 1st/2nd/3rd/out-of-network label, the mutuals it was computed from, the connect button, and on your own profile both request queues plus your connections ledger. Loaded BEFORE profile.js, which calls window.OTBConnections.render behind a guard, so a page that omits the script simply has no section; the section reveals only when the hub's /connections routes answer, exactly as the cross-project record does. ADR 0212 records why it is on this page rather than the not-yet-built /u/<handle>, and why it addresses a builder by github_login and then uses the canonical handle the API echoes back); profile-canonical.js=the canonical-profile wiring for that page (task 1002804 / P08, ADR 0214 — on a FEDERATED instance the rel=canonical plus the visible "see the cross-project record" link-out ADR 0171 D1 asks for; on the HUB the numeric ?id= form redirects to the handle URL instead, because a page cannot both redirect to a URL and declare it canonical. All three read ONE resolver, modules/platform-identity/canonical-profile.js, which answers null while /u/<handle> does not exist — so everything is dark today and one boolean turns it all on together); task.html/task.js=the task-detail page (/task/:id, task 751 — replaced the old #/task/N overlay); builders.js=the controller; dom-utils.js/hall-widgets.js=the widget+settings-panel registries.)
|
|
269
249
|
│
|
|
270
|
-
├── infra/ ← ON-BOX scripts (task 1002699): the four reporter/heartbeat crons every dev box runs from its /workspace clone — box-heartbeat.sh (idle-sweep activity signal), box-report-version.sh (HEAD → POST /box/version), box-report-host-keys.sh (SSH host keys → POST /box/host-keys), box-report-terminal.sh (ttyd URL+credential → POST /box/terminal). Delivered by the workspace clone itself (modules/dev-box/box-access.js sparse scope includes infra/); crons self-installed by box-source-fetch.sh's per-tick bring-up. API base resolves GDS_BASE env → session-file api_base → skip (no hardcoded host in the neutral core).
|
|
271
|
-
│ ├── src/ ← main process: main.js (tray/window/IPC), brand.js (ADR 0004 — the ONE civ-name string), pairing.js, box-controller.js, gds-client.js, session-store.js (shares ~/.config/otb/gds-session.json with the CLI), ssh-setup.js (key 600 + known_hosts replace + managed-settings install w/ elevation), tray.js, preload.js
|
|
272
|
-
│ ├── renderer/ ← the panel UI (sandboxed; parchment theme)
|
|
273
|
-
│ ├── assets/tray/ + build-resources/ ← generated icons (scripts/gen-icons.js; build-resources name dodges the global build/ gitignore)
|
|
274
|
-
│ └── test/unit.mjs ← hermetic unit tests (run by the CI workflow, not the root gate)
|
|
275
|
-
│
|
|
276
250
|
├── modules/public-landing/public/ ← the APEX front door + hub surfaces. Its OWN MODULE since task 1003322 / ADR 0218 (manifest declares { apexRoot: true, dir: "public" } — the apex is not a Host prefix), still served by src/platform-server.js (landingPage(): apex-only strip → brand-token stamp → theme injection → ?v= asset stamp). Ships to EVERY instance; <!--apex-only:start/end--> regions are removed on a child
|
|
277
251
|
│ ├── index.html ← the landing (/) — v3 "the template's page" of the chrome world (task 1003298, ADR 0196): server-stamped head, the breath (CSS-only signature), live figures/ledger/orbs from the public feeds baked inside sentinels; page-local <style> only (no :root), links /assets/world.css
|
|
278
252
|
│ ├── projects.html ← the hub (/projects?view=map|mine|manage|new) on cosmos.css (A4, task 1003299, rebuilds it in the world)
|
|
@@ -365,8 +339,7 @@ tests/
|
|
|
365
339
|
├── session_506_regression.mjs ← (6D.5): the #506 regression gate — runs the engine over tests/fixtures/session-506-digest.json, asserts the hand-labelled findings (→#513/#514/#468) reproduce.
|
|
366
340
|
├── grade_attempts.mjs ← (6D.6): logGradeAttempt swallow-safety + param coercion via an injected queryFn (no DB).
|
|
367
341
|
├── linkify_refs.mjs ← (#604): the doc-linkifier classifier — pins which `#NNN` rewrite (tasks) vs stay bare (heading anchors, link targets, idea/blocker/session/PR ids, code spans), incl. comma-list entity inheritance + idempotency.
|
|
368
|
-
├──
|
|
369
|
-
├── sandbox_stage.mjs ← (#927, ADR 0046): sandbox-first review gate — box detection, BOX_PREVIEW_HOSTNAME parsing, previewable-surface matching, decideShipGate table, tree-stamp freshness (temp git repo), runShipGate composition with injected fs/exec/prompt.
|
|
342
|
+
├── sandbox_stage.mjs ← (#927, ADR 0046): sandbox-first review gate — previewable-surface matching, decideShipGate table, tree-stamp freshness (temp git repo), runShipGate composition with injected fs/exec/prompt.
|
|
370
343
|
├── session_start_freshness.mjs ← (#1277, ADR 0067): the SessionStart freshness decision (decideFreshness) — pull ONLY on a clean `main` full clone strictly behind origin/main; warn in every other behind case; skip when up to date.
|
|
371
344
|
├── own_scope_guard.mjs ← (task 1003343, goal 1000045 criterion own-scope-held-by-a-test): the OWN-SCOPE structural guard, generalised out of memory_isolation.mjs. An explicit inventory of own-scoped route files; inside them the route's declared PATH decides — a path naming no builder must never read a subject from the request (direct, optional-chained, destructured, aliased, computed-key or header), a path that DOES name one needs a per-route exemption whose gate the guard verifies is present. Repo-wide backstop: any file mounting a `/me` route must be in the inventory. Source-grepping, so it runs in the DB-free `unit` lane.
|
|
372
345
|
├── account_existence_rate_limit.mjs ← (task 1003339, goal 1000045, ADR 0209): the two PUBLIC account-existence probes (onboarding GET /access-requests/status + core GET /auth/web/admission-status) share ONE per-IP budget. Counts to the limit on each route, proves the budget is shared in both directions and when alternated, moves Date.now to prove the window slides on the real mounted route, and proves a refused probe issues no query. DB-free; mutation-checked three ways.
|
|
@@ -447,8 +420,6 @@ tests/
|
|
|
447
420
|
├── artifact-staleness/SKILL.md ← freshness backstop for the gitignored deploy-generated navigation docs (task 1001930, ADR 0110 pt.5): docs/repo-map.md and docs/session-log-index.md are untracked, so no PR gate can see them and a broken deploy regen step leaves a stale or missing map with only a journald line as the alarm. Asks each artifact's own generator (--check-whole) whether it still matches the served commit, reports absent and stale separately, and posts findings to Discord #ship-news itself. INSTANCE-SIDE ONLY — a fresh CI clone legitimately lacks these files, so it declares no cadence and no workflow fires it; config/scheduled-routines.json records the intended daily cadence.
|
|
448
421
|
├── bfg/SKILL.md ← nightly BFG pass (MAS Phase 6, ADR 0026) — doc/memory hygiene + DB counter-vs-ledger drift (Part A), per-builder interaction scoring into transferable-practice suggestions (Part B), and the audited cross-builder memory write (Part C, OFF unless BFG_WRITE_ENABLED) (restored in task 1003365; unscheduled in core — only redteam-weekly has a firing workflow; config/scheduled-routines.json records the intended cadence)
|
|
449
422
|
├── bfg-session-eval/SKILL.md ← nightly session-inefficiency evaluator (MAS Phase 6D, ADR 0027) — mines the session corpus for wasteful sessions and files the fixes as idea_inbox rows plus a docs/audits report (restored in task 1003365; unscheduled in core — only redteam-weekly has a firing workflow; config/scheduled-routines.json records the intended cadence)
|
|
450
|
-
├── box-dormant-reclaim/SKILL.md ← daily control-plane sweep that fully de-provisions dev boxes parked longer than BOX_DORMANT_DAYS, destroying the leftover snapshot and pinging the builder (ADR 0031 §5(a)); a no-op on an instance with no managed boxes (restored in task 1003365; unscheduled in core — only redteam-weekly has a firing workflow; config/scheduled-routines.json records the intended cadence)
|
|
451
|
-
├── box-idle-suspend/SKILL.md ← hourly control-plane sweep that DESTROYS idle dev boxes — droplet and snapshot, not a reversible park — once BOX_IDLE_MINUTES elapses with no heartbeat (ADR 0031 §5(a), task 804) (restored in task 1003365; unscheduled in core — only redteam-weekly has a firing workflow; config/scheduled-routines.json records the intended cadence)
|
|
452
423
|
├── core-update-subscription/SKILL.md ← daily patch-only auto-upgrade of subscribed consumer instances (ADR 0136) — deterministic `subscribe.js` step, health-gated with auto-rollback; opt-in and autonomy-gated, so a no-op until an operator arms it (restored in task 1003365; unscheduled in core — only redteam-weekly has a firing workflow; config/scheduled-routines.json records the intended cadence)
|
|
453
424
|
├── dep-audit-nightly/SKILL.md ← nightly dependency-vulnerability scan (`scripts/security/dep-audit.js`) across npm and the droplet's system packages; findings become idea_inbox rows plus one vulnerability_report per high/critical (restored in task 1003365; unscheduled in core — only redteam-weekly has a firing workflow; config/scheduled-routines.json records the intended cadence)
|
|
454
425
|
├── diagram-drift/SKILL.md ← daily deterministic backstop that re-derives the onboarding diagrams from migrations plus the live version API and files an idea when the committed ones have drifted (`check.js --file-idea`) (restored in task 1003365; unscheduled in core — only redteam-weekly has a firing workflow; config/scheduled-routines.json records the intended cadence)
|
|
@@ -2631,5 +2631,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2631
2631
|
landed since 1.19.1070 with no explicit bump. run 36473239367. (task 1002620)
|
|
2632
2632
|
1.19.1072 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2633
2633
|
landed since 1.19.1071 with no explicit bump. run 36474285523. (task 1002620)
|
|
2634
|
+
1.19.1073 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2635
|
+
landed since 1.19.1072 with no explicit bump. run 36485068639. (task 1002620)
|
|
2636
|
+
1.19.1074 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2637
|
+
landed since 1.19.1073 with no explicit bump. run 36510198162. (task 1002620)
|
|
2634
2638
|
---------------------------------------------------------------------------
|
|
2635
2639
|
```
|
package/docs/modules-contract.md
CHANGED
|
@@ -31,7 +31,7 @@ The **only** core file a module may `require`. It re-exports the kernel capabili
|
|
|
31
31
|
|---|---|
|
|
32
32
|
| `requireBuilder` / `requireRank` / `rankMeetsThreshold` | Auth gates (ADR 0016). Modules self-gate per route: write routes call `api.requireRank(rank)`; authenticated read routes call `api.requireBuilder`; intentionally public read routes (e.g. leaderboard, claimable tasks) need no gate. The fitness check enforces the write-route rule; audit is composed at the kernel level before module routes mount. |
|
|
33
33
|
| `requireBfgPrincipal` | Gate a route to the BFG agent principal. |
|
|
34
|
-
| `allowBoxScope` |
|
|
34
|
+
| `allowBoxScope` | **Deprecated no-op** (task 1003894): the narrowing session scope it opted a route into was retired, and a session of an undeclared source is now denied on every route regardless. Kept so the doorway loses no export inside 1.x; drop at the next MAJOR. |
|
|
35
35
|
| `pool` | The shared Postgres pool. A module owns its `<key>_*` tables via its migrations. |
|
|
36
36
|
| `instanceDbName` | The resolved DB name (from branding). |
|
|
37
37
|
| `db` | Kernel-managed DB helpers (`getBuilderById`, `setBuilderBoxBlocked`, `getBuilderGeminiKeyRow`, `setBuilderGeminiKey`, `clearBuilderGeminiKey`, `insertAuditLog`, `createTask`). Grow this additive-only. |
|
|
@@ -79,6 +79,8 @@ Every module must have a `module.json` at its root (`modules/<key>/module.json`)
|
|
|
79
79
|
"key": "dev-box", // REQUIRED. ^[a-z][a-z0-9-]*$ — must match the dir name.
|
|
80
80
|
"title": "Dev boxes", // REQUIRED. Human label.
|
|
81
81
|
"description": "…", // REQUIRED. One sentence.
|
|
82
|
+
"version": "1.0.0", // REQUIRED. The module's OWN exact version "X.Y.Z" (not a range) —
|
|
83
|
+
// what update, rollout channels and re-assessment name (task 1003781).
|
|
82
84
|
"coreVersion": "^1.2.0", // REQUIRED. semver range of CORE_VERSION this module supports.
|
|
83
85
|
"default": false, // OPTIONAL (default false). Fail-safe when no config names it.
|
|
84
86
|
"author": "…", // OPTIONAL. Attribution (ADR 0107 §2) — portable, not a cross-Bongos FK.
|
|
@@ -330,6 +332,7 @@ This creates `modules/<key>/` with:
|
|
|
330
332
|
### 3. Declare
|
|
331
333
|
|
|
332
334
|
Update `module.json`:
|
|
335
|
+
- Set `version` to the module's own exact version (`"1.0.0"` for a first release; bump it on every change you ship).
|
|
333
336
|
- Set `coreVersion` to `^<CORE_VERSION>` (the current doorway version).
|
|
334
337
|
- Declare everything the module contributes in `contributes`.
|
|
335
338
|
- List ports under `provides`/`consumes`.
|
|
@@ -348,6 +351,15 @@ Or via env: `<PREFIX>_MODULE_<KEY>=1`. The loader discovers and mounts it on nex
|
|
|
348
351
|
|
|
349
352
|
Run `bongos upgrade` to confirm coreVersion compatibility, then `node scripts/gds/fitness.js` to confirm the boundary checks pass. The `unit` CI job runs fitness on every PR.
|
|
350
353
|
|
|
354
|
+
### 6. Publish to the store (optional)
|
|
355
|
+
|
|
356
|
+
`bongos module publish <key>` packs `modules/<key>/` as one version for the Bongos-hosted module store ([ADR 0338](adr/0338-modules-travel-through-a-bongos-hosted-store.md)): a tarball plus hash manifest in the core release's own format (`scripts/gds/module-artifact.js` over `artifact-format.js`), then uploads it to `POST /store/modules/:key/versions`. `--dry-run` packs without uploading; `--out <dir>` also writes the tarball and its manifest.
|
|
357
|
+
|
|
358
|
+
- The version is `module.json`'s `version`. Each version is published **once** and must be newer than the last — bump it to publish a fix.
|
|
359
|
+
- Your first publish of a key makes you its author; only the author can publish later versions, and a delisted key takes none.
|
|
360
|
+
- The publish denylist applies (ADR 0098), plus a refusal of credential-named files (`.env*`, `*.pem`, `*.key`, `id_rsa`, …) anywhere in the module. The store re-checks every hash and the denylist itself.
|
|
361
|
+
- Gate: Metic+ (`module.submit`) for now. This is not `bongos module submit`, which proposes a module *into* core.
|
|
362
|
+
|
|
351
363
|
## Carving an existing core domain (the `db.js` per-domain pattern)
|
|
352
364
|
|
|
353
365
|
Most BONGOS-V1 module work is not scaffolding a *new* module — it's **carving an existing core domain out of the monolith** (ADR 0091, criterion C7). The reference carve is the kernel slice `src/bongos/db-kernel.js` (BV1.R69); the feature precedents are `modules/discord/db.js` + `modules/game/db.js`. Every later carve (memory R72, grading R73, …) copies this recipe. The invariant is **OTB byte-identical** at every step — you are *moving* code, not changing behavior.
|
|
@@ -4,18 +4,10 @@ config:
|
|
|
4
4
|
layout: elk
|
|
5
5
|
---
|
|
6
6
|
flowchart TB
|
|
7
|
-
subgraph
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
subgraph BOX["DEV BOX — a machine WE create on DigitalOcean (gated · revocable · audited; Metic+ may instead clone locally)"]
|
|
12
|
-
WORKER["Claude Code WORKER\n(opens files · runs commands · runs the /builder-* skills)"]
|
|
13
|
-
CODE["the code — git clone + per-builder worktrees (.claude/worktrees/*)\nfor sub-Metic builders it lives ONLY here · CLAUDE.md is DESCRIPTIVE only"]
|
|
7
|
+
subgraph MACHINE["YOUR MACHINE — a clone of the instance repo"]
|
|
8
|
+
WORKER["Claude Code — the desktop app or the terminal\n(opens files · runs commands · runs the /builder-* skills)"]
|
|
9
|
+
CODE["the code — git clone + per-task worktrees (.claude/worktrees/*)\nCLAUDE.md is DESCRIPTIVE only"]
|
|
14
10
|
LOCAL["local ~/.claude memory\nMAP = MEMORY.md — a one-line index loaded EVERY session\n(a guard + auto-tidy keep it light; ADR 0074)\n+ drawer of full notes, loaded only on demand"]
|
|
15
|
-
ORIGIN["credential-less git origin\n(NO GitHub push secret on the box — by design)"]
|
|
16
|
-
BOXTOK["box-scoped Bongos token\n(deny-by-default: bootstrap endpoints only;\nrejected for branch upload → re-auth first — LIVE)"]
|
|
17
|
-
PREVIEW["sandbox preview server on :3000\n→ a per-builder sandbox URL (LIVE)"]
|
|
18
|
-
SWITCH["on / off + browser terminal\n(desktop app LIVE · ttyd-over-tunnel LIVE)"]
|
|
19
11
|
end
|
|
20
12
|
|
|
21
13
|
subgraph SERVER["THE INSTANCE SERVER — localhost:3000 (the authority AND production)"]
|
|
@@ -24,7 +16,7 @@ flowchart TB
|
|
|
24
16
|
DB["Postgres — tasks · claims · versions · builders.rank\ncredit_log · grades · idea_inbox · builder_memory\n(KING for work-state + permissions; CLAUDE.md only describes it)"]
|
|
25
17
|
RANK["auth.requireRank — checked per request, NO caching\n(ADR 0016: a demotion takes effect on the next request)"]
|
|
26
18
|
SRVMEM["server-side builder_memory store\nLIVE: per-builder · isolated · forensic read at Metic+ (ADR 0157)\nyour memory follows you across machines & worktrees\n/recall fetches only the relevant subset (ADR 0060)\n(R54 / R55 / R56 / R57 — all shipped)"]
|
|
27
|
-
PUSHTOK["server-held push credential\n(GitHub App, short-lived tokens —
|
|
19
|
+
PUSHTOK["server-held push credential\n(GitHub App, short-lived tokens — for a checkout that has none of its own)"]
|
|
28
20
|
DEPLOY["auto-pull deploy (ADR 0129)\na timer pulls THIS instance repo every ~2 min →\nnpm ci if the pin changed → migrate → regenerate docs → restart → healthz"]
|
|
29
21
|
end
|
|
30
22
|
|
|
@@ -34,20 +26,17 @@ flowchart TB
|
|
|
34
26
|
|
|
35
27
|
LIVEAPP["the live app — localhost:3000\n(same server · same Node process as /api/bongos/*)"]
|
|
36
28
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
WORKER -->|"2 ·
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
MAIN -->|"6 · the instance auto-pulls its own main"| DEPLOY
|
|
44
|
-
DEPLOY -->|"7 · migrate · regenerate docs · restart"| LIVEAPP
|
|
29
|
+
WORKER -->|"1 · edit + commit"| CODE
|
|
30
|
+
WORKER -->|"2 · push the branch + open a PR (a machine signed in to GitHub)"| MAIN
|
|
31
|
+
WORKER -->|"2 · or upload the branch as a git bundle (no push credential here)"| API
|
|
32
|
+
API -->|"3 · the server pushes it + opens the PR (LIVE)"| MAIN
|
|
33
|
+
MAIN -->|"4 · the instance auto-pulls its own main"| DEPLOY
|
|
34
|
+
DEPLOY -->|"5 · migrate · regenerate docs · restart"| LIVEAPP
|
|
45
35
|
CORE --- API
|
|
46
36
|
PUSHTOK -.-> API
|
|
47
|
-
ORIGIN -. "direct push blocked" .-> MAIN
|
|
48
37
|
API -. "claim / ship / cost" .-> WORKER
|
|
49
38
|
LOCAL -->|"sync on ship (push)"| SRVMEM
|
|
50
39
|
SRVMEM -->|"pull on session start"| LOCAL
|
|
51
40
|
|
|
52
|
-
NEXT["
|
|
41
|
+
NEXT["Both ways onto main work today: a machine signed in to GitHub pushes its own branch, and a checkout without a push credential uploads it for the server to push. Either way the instance auto-pulls and redeploys."]
|
|
53
42
|
LIVEAPP --- NEXT
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Five flowcharts that explain Bongos to a new builder at a glance. Each diagram is committed as **Mermaid source** (`.mmd`) plus a rendered **`.svg`** (the crisp, pannable/zoomable asset) and **`.png`** (a static fallback / external-embed image), embedded in the `/builders` hall at `/builders/diagrams` and the builder primer ([V3.R13 / #237](../../../CLAUDE.md)). On those pages the diagrams are **pan-and-zoom canvases** (drag to pan, scroll to zoom, fullscreen) — see [`modules/hall-ui/public/diagram-viewer.js`](../../../modules/hall-ui/public/diagram-viewer.js).
|
|
4
4
|
|
|
5
|
-
> Built under **V3.R76 ([#295](https://example.com/builders#/task/295))**; auto-regeneration + drift detection added under **[#356](https://example.com/builders#/task/356)/[#357](https://example.com/builders#/task/357)**; conceptual diagrams (03/04) made auto-generated under **[#436](https://example.com/builders#/task/436)**;
|
|
5
|
+
> Built under **V3.R76 ([#295](https://example.com/builders#/task/295))**; auto-regeneration + drift detection added under **[#356](https://example.com/builders#/task/356)/[#357](https://example.com/builders#/task/357)**; conceptual diagrams (03/04) made auto-generated under **[#436](https://example.com/builders#/task/436)**; consolidated into the single **`04-architecture` map + SVG pan/zoom viewer under [#1059](https://example.com/builders#/task/1059)**.
|
|
6
6
|
|
|
7
7
|
### Auto-generated vs hand-authored (important)
|
|
8
8
|
|
|
@@ -11,7 +11,7 @@ Five flowcharts that explain Bongos to a new builder at a glance. Each diagram i
|
|
|
11
11
|
| Diagram | What drives its state |
|
|
12
12
|
|---|---|
|
|
13
13
|
| `01-task-lifecycle` · `02-rank-ladder` · `05-versioning` (**mechanical**) | The task-status set + rank enum/wiring (read from `migrations/` + `src/bongos/`) and the live version set (production API). No auth needed — always regenerate. |
|
|
14
|
-
| `03-drachmae-karma` · `04-architecture` (**conceptual**) | Each feature-piece is **LIVE iff its backing Bongos task is `shipped`**, plus 03's "N seeded" count from the achievements seed in `migrations/`. These read the **authenticated** `/tasks/:id` status, so when no Bongos session is available (headless run, no creds) the generator **skips** 03/04 and leaves them untouched rather than emit wrong data. (04's
|
|
14
|
+
| `03-drachmae-karma` · `04-architecture` (**conceptual**) | Each feature-piece is **LIVE iff its backing Bongos task is `shipped`**, plus 03's "N seeded" count from the achievements seed in `migrations/`. These read the **authenticated** `/tasks/:id` status, so when no Bongos session is available (headless run, no creds) the generator **skips** 03/04 and leaves them untouched rather than emit wrong data. (04's machine/server/GitHub *topology* is structural; only its LIVE/PLANNED markers — the memory chain + the ship-flow legs — are task-gated.) |
|
|
15
15
|
|
|
16
16
|
The mechanical diagrams regenerate **on every deploy** (`ship.js` / `/merge-mode` run `gen-diagrams.js` before deploying; a changed diagram is committed and shipped automatically). The conceptual diagrams regenerate the same way whenever a session is present (the deploy host has one). The `diagram-drift` routine remains as a belt-and-braces backstop. So `/builders/diagrams` is never more than one deploy behind the live architecture.
|
|
17
17
|
|
|
@@ -49,7 +49,7 @@ Where each comes from and where each goes. Key facts: **example = credits** (sam
|
|
|
49
49
|
Source: [`03-drachmae-karma.mmd`](03-drachmae-karma.mmd)
|
|
50
50
|
|
|
51
51
|
### 4. The complete architecture — where your work runs and how code reaches production
|
|
52
|
-
One map of the whole system
|
|
52
|
+
One map of the whole system. The three places the work lives — **your machine** (the Claude Code worker, the code, *and* your local memory dir) · the **server** (authority *and* production: Postgres, the server-side memory store, the push credential) · **GitHub** (branch-protected main) — plus two flows woven through it: the **per-builder memory layer** (ADR 0024 — local ↔ server, sync-on-ship / pull-on-start) and the **ship path** (a machine signed in to GitHub pushes its own branch and opens the PR; a checkout with no push credential uploads its branch as a git bundle and the server pushes it with a GitHub App credential; either way the PR auto-merges and the instance auto-pulls its own main). Every feature-piece + flow edge is LIVE/solid iff its backing task is `shipped`. Backing tasks: memory chain [#273](https://example.com/builders#/task/273)–[#276](https://example.com/builders#/task/276); ship path [#1025](https://example.com/builders#/task/1025)/[#1028](https://example.com/builders#/task/1028) (all shipped → the map reads all-LIVE today). See [ADR 0024](../../adr/0024-cloneable-repo-local-first-memory.md) (cloneable memory), [ADR 0055](../../adr/0055-server-mediated-branch-publish.md) (server-mediated publish), [ADR 0129](../../adr/0129-cloudbongos-control-plane-pull-deploy.md) (auto-pull deploy), [ADR 0016](../../adr/0016-trust-boundary-server-enforced-permissions.md) (trust boundary).
|
|
53
53
|
|
|
54
54
|

|
|
55
55
|
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
},
|
|
112
112
|
"architecture": {
|
|
113
113
|
"diagram": "04-architecture",
|
|
114
|
-
"_comment": "Pieces of 04-architecture gated on a backing Bongos task. A piece is LIVE iff its task is 'shipped'; live_tasks must ALL be shipped, pending_tasks must NOT yet be. Rebuilt by scripts/gds/gen-diagrams.js in lockstep with the diagram, so this is the drift checker's backstop. The
|
|
114
|
+
"_comment": "Pieces of 04-architecture gated on a backing Bongos task. A piece is LIVE iff its task is 'shipped'; live_tasks must ALL be shipped, pending_tasks must NOT yet be. Rebuilt by scripts/gds/gen-diagrams.js in lockstep with the diagram, so this is the drift checker's backstop. The machine/server/GitHub topology is structural (not task-gated); these are the LIVE/PLANNED markers. MEMORY layer (ADR 0024): 273 schema / 274 sync-on-ship / 275 pull-on-start / 276 isolation. Ship flow: 1025 (server-mediated publish, for a checkout with no push credential), 1028 (GitHub App push credential). The deploy leg is the standalone AUTO-PULL (ADR 0108/0129), not a task-gated GitHub-Actions CI job, so 859 is intentionally absent.",
|
|
115
115
|
"live_tasks": [
|
|
116
116
|
{
|
|
117
117
|
"id": 273,
|
|
@@ -129,29 +129,9 @@
|
|
|
129
129
|
"id": 276,
|
|
130
130
|
"label": "R57 — per-builder isolation + forensic read at Metic+ (ADR 0157)"
|
|
131
131
|
},
|
|
132
|
-
{
|
|
133
|
-
"id": 904,
|
|
134
|
-
"label": "devbox-app — desktop on-off switch"
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
"id": 774,
|
|
138
|
-
"label": "browser-only box terminal (ttyd over tunnel)"
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
"id": 897,
|
|
142
|
-
"label": "per-builder sandbox live preview"
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
"id": 919,
|
|
146
|
-
"label": "scoped dev-box session (box token deny-by-default)"
|
|
147
|
-
},
|
|
148
132
|
{
|
|
149
133
|
"id": 1025,
|
|
150
|
-
"label": "server-mediated branch publish (
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
"id": 1027,
|
|
154
|
-
"label": "hardware-verify the box-to-prod flow end-to-end"
|
|
134
|
+
"label": "server-mediated branch publish (a checkout with no push credential uploads a bundle, the server pushes)"
|
|
155
135
|
},
|
|
156
136
|
{
|
|
157
137
|
"id": 1028,
|
|
@@ -98,7 +98,7 @@ What doesn't work well:
|
|
|
98
98
|
As you work, Claude writes down durable facts — your standing preferences, a gotcha that cost real time, the current state of the project — so the next session doesn't start cold. You don't manage any of this by hand, but it's worth knowing the shape:
|
|
99
99
|
|
|
100
100
|
- **The map** (`MEMORY.md`) — a short index loaded at the **start of every session**: one line per memory, just enough to know *what* is known and where the detail lives. Kept deliberately small.
|
|
101
|
-
- **The drawer** — the full notes themselves. They live on your machine, sync to the server (so your memory follows you across machines
|
|
101
|
+
- **The drawer** — the full notes themselves. They live on your machine, sync to the server (so your memory follows you across machines), and are searchable with `/recall`. They cost nothing until something fetches them.
|
|
102
102
|
|
|
103
103
|
The map stays light on its own: a session-start guard warns if it's drifting large, and an auto-tidy moves the oldest, least-relevant notes off the map into the drawer when it crosses a threshold — **nothing is deleted**, it's just no longer loaded every session (a `/recall` away when a task needs it). Your standing rules, and anything pinned, always stay on the map. Full picture: [ADR 0074](../adr/0074-memory-map-stays-light.md) and [diagram 4 — the architecture](diagrams/).
|
|
104
104
|
|
|
@@ -114,7 +114,7 @@ Other depth, in roughly the order you'll need it:
|
|
|
114
114
|
- [`docs/onboarding/example-and-karma.md`](drachmae-and-karma.md) — the full reward economy: how example and karma are earned, the cost-plus session reward, and the monthly budget cap
|
|
115
115
|
- [`docs/onboarding/slash-commands.md`](slash-commands.md) — which slash commands ship with Claude Code and which are this project's, and what to do about the ones that collide
|
|
116
116
|
- [`docs/architecture.md`](../architecture.md) — live system: droplet, stack, schema, API surface
|
|
117
|
-
- [`docs/modules-contract.md`](../modules-contract.md) — the product is built as a small core plus swappable `modules/<key>/` (
|
|
117
|
+
- [`docs/modules-contract.md`](../modules-contract.md) — the product is built as a small core plus swappable `modules/<key>/` (the game, Discord, art, and more); this is the live roster and how a task lands inside one
|
|
118
118
|
- [`docs/canonical-permissions.md`](../canonical-permissions.md) — who can do what (rank gates)
|
|
119
119
|
- [`docs/file-map.md`](../file-map.md) — where every folder is and what it contains
|
|
120
120
|
- [`docs/recipes/`](../recipes/) — long-form ops gotchas (read before deploying)
|
|
@@ -131,28 +131,14 @@ You don't need to be a programmer to build here. Entry to the project is **appro
|
|
|
131
131
|
Claude Code is **three pieces that can live in different places**:
|
|
132
132
|
|
|
133
133
|
- **The screen** — the window you look at and type into. Always on *your* device (the Claude desktop app, or a browser tab). It just shows files and sends your messages.
|
|
134
|
-
- **The worker** — the part that opens files, runs commands, edits code, runs the project.
|
|
135
|
-
- **The brain** — the AI model itself. **Always on Anthropic's servers
|
|
134
|
+
- **The worker** — the part that opens files, runs commands, edits code, runs the project.
|
|
135
|
+
- **The brain** — the AI model itself. **Always on Anthropic's servers**.
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
Today the worker runs in one place: **your own computer**, working on a clone of the project. The single map that shows the whole picture — your device, the per-builder memory layer, the server (authority *and* production), and how code travels to prod — is [diagram 4, *The complete architecture*](diagrams/).
|
|
138
138
|
|
|
139
|
-
|
|
139
|
+
> **Why a copy of the code at all?** The `/builder-*` commands you'll use every session aren't a separate download — they live *inside* the project's code (in `.claude/skills/`). The moment Claude Code **starts a session on a folder that already holds the code**, all the commands appear automatically. So "get the code" and "get the commands" are the same step — there's no plugin or zip to install. (One wrinkle: if you *clone the code mid-session into a folder that started empty*, the commands won't appear until you start a fresh session on that folder — step 3 handles it.)
|
|
140
140
|
|
|
141
|
-
|
|
142
|
-
|---|---|---|
|
|
143
|
-
| **Cloud box** — *the default for new builders* | A dev box we create for you on DigitalOcean; your desktop app connects to it | Anyone new on a Mac or Windows machine. Nothing to install but the app — the code never lands on your own disk |
|
|
144
|
-
| **Remote Control** | The **same** cloud box, but driven from a browser tab — [step-by-step guide](browser-terminal-guide.md) | Chromebooks / iPads / phones that can't run the desktop app |
|
|
145
|
-
| **Local** — *trusted builders only (Metic and up)* | Your own computer | Power users who'd rather run the code on their own hardware to save the box cost |
|
|
146
|
-
|
|
147
|
-
Your **first** cloud box is created hands-off; a returning box wakes itself; you never wait on an operator. (Entry to the project is already approval-gated — an Archon admitted you when you joined — so there's no separate per-box approval step.)
|
|
148
|
-
|
|
149
|
-
> **Why is Local trusted-only?** Below Metic, the project's code lives **only inside the cloud box we control** — gated, revocable, and audited. Holding a permanent copy on your own machine is a trust grant that arrives when you're promoted to Metic, not on day one. New builders work in the box.
|
|
150
|
-
|
|
151
|
-
> **Where things stand today.** The cloud-box on-ramp is built *and* now verified end-to-end — the desktop on/off app, the browser terminal, the per-builder sandbox preview, and the box → production ship path (a credential-less box uploads its branch and the server merges + deploys it via a GitHub App credential) have all shipped, and the whole box → production chain has been hardware-verified on a real box ([#1027](https://example.com/builders#/task/1027), [#1028](https://example.com/builders#/task/1028)). So the **cloud box is the proven default for new builders.** The **local-clone route below is the permanent home for Metic-and-up builders** — a fully supported alternative, not a stopgap. The single map that shows the whole picture — device, dev box, the per-builder memory layer, the server (authority *and* production), and how code travels from a box to prod — is [diagram 4, *The complete architecture*](diagrams/).
|
|
152
|
-
|
|
153
|
-
> **Why a copy of the code at all?** The `/builder-*` commands you'll use every session aren't a separate download — they live *inside* the project's code (in `.claude/skills/`). The moment Claude Code **starts a session on a folder (or box) that already holds the code**, all the commands appear automatically. So "get the code" and "get the commands" are the same step — there's no plugin or zip to install. (One wrinkle: if you *clone the code mid-session into a folder that started empty*, the commands won't appear until you start a fresh session on that folder — step 3 handles it.)
|
|
154
|
-
|
|
155
|
-
### The steps that work today (local route)
|
|
141
|
+
### The steps
|
|
156
142
|
|
|
157
143
|
Take them in order — each one sets up the next, from "I'm admitted" to "I'm looking at work I can claim."
|
|
158
144
|
|
|
@@ -193,11 +179,6 @@ Run `/builder-start` to see what you can claim — no acknowledgment step needed
|
|
|
193
179
|
|
|
194
180
|
When you ship your **first** task, example land in your column and you're inducted as a citizen of Example. Ship your **third** and you graduate to **Thetes** — the one-claim limit lifts and the whole general queue opens to you. Welcome.
|
|
195
181
|
|
|
196
|
-
##
|
|
197
|
-
|
|
198
|
-
Every active builder — from your very first day as a **Xenos**, and **whatever your craft** (engineer, artist, or ideator) — gets a **personal dev box and a live game preview of your own**. There's no separate Archon approval to unlock them: being admitted to the project *is* the approval. Two everyday commands put them at your fingertips:
|
|
199
|
-
|
|
200
|
-
- **`/builder-box`** — your box's control panel. It shows whether your box is awake, what it has cost, and your sign-in details, and it can **wake or (re)create your box hands-off** when it's asleep — you never wait on an operator. It's also where you find your **sandbox URL** (below) and, on a Chromebook or tablet, the browser-terminal link. Reach for it whenever you're unsure your box is up or you need to get back onto it.
|
|
201
|
-
- **`/builder-stage`** — your private preview. Before you ship a change that touches the game, run `/builder-stage` to push your current edits to your **sandbox** — a personal copy of the game at `sandbox-<your-login>.example.com` that reflects only *your* work-in-progress. Open the link, watch your change running for real, and only then ship it. Nothing you stage there touches the live game or anyone else's box.
|
|
182
|
+
## Previewing your change
|
|
202
183
|
|
|
203
|
-
|
|
184
|
+
Before you ship a change that touches the game, run **`/builder-stage`** to start your own private copy of the game on your computer (at `http://localhost:<port>`) with your current edits in it. Open the link, watch your change running for real, and only then ship it. Nothing you stage there touches the live game or anyone else's work.
|
package/docs/page-inventory.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"pages": 38,
|
|
14
14
|
"surfaces": 3,
|
|
15
15
|
"with_states": 31,
|
|
16
|
-
"states":
|
|
16
|
+
"states": 168
|
|
17
17
|
},
|
|
18
18
|
"surfaces": [
|
|
19
19
|
{
|
|
@@ -475,6 +475,7 @@
|
|
|
475
475
|
"modules/hall-ui/public/goal-inbox.js",
|
|
476
476
|
"modules/hall-ui/public/hall-render.js",
|
|
477
477
|
"modules/hall-ui/public/profile-nudge.js",
|
|
478
|
+
"modules/hall-ui/public/claim-action.js",
|
|
478
479
|
"modules/hall-ui/public/builders.js",
|
|
479
480
|
"modules/hall-ui/public/copy-on-click.js"
|
|
480
481
|
],
|
|
@@ -898,6 +899,7 @@
|
|
|
898
899
|
"modules/hall-ui/public/brand-apply.js",
|
|
899
900
|
"modules/hall-ui/public/md-reader.js",
|
|
900
901
|
"modules/hall-ui/public/hall-visual.js",
|
|
902
|
+
"modules/hall-ui/public/claim-action.js",
|
|
901
903
|
"modules/hall-ui/public/task.js"
|
|
902
904
|
],
|
|
903
905
|
"states_files": [
|
|
@@ -1159,6 +1161,7 @@
|
|
|
1159
1161
|
"in-new-modules-search",
|
|
1160
1162
|
"in-new-home",
|
|
1161
1163
|
"in-new-address",
|
|
1164
|
+
"in-new-app",
|
|
1162
1165
|
"in-new-review",
|
|
1163
1166
|
"in-new-done",
|
|
1164
1167
|
"in-new-resume-offer",
|