@bongos/core 1.17.0 → 1.17.2
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 +363 -312
- package/.claude/skills/blocker-review/SKILL.md +1 -1
- package/.claude/skills/builder-claim/SKILL.md +2 -0
- package/.claude/skills/builder-exit/SKILL.md +2 -2
- package/.claude/skills/builder-redteam/SKILL.md +3 -3
- package/.claude/skills/builder-setup/SKILL.md +2 -2
- package/.claude/skills/builder-start/SKILL.md +1 -1
- package/.claude/skills/dev/SKILL.md +1 -1
- package/.claude/skills/idea-triage/SKILL.md +2 -2
- package/.claude/skills/ideate/SKILL.md +1 -1
- package/.claude/skills/merge-mode/SKILL.md +1 -1
- package/.claude/skills/new-project/SKILL.md +3 -0
- package/.claude/skills/paint/SKILL.md +1 -1
- package/CLAUDE.md +11 -238
- package/GOVERNANCE.md +1 -1
- package/README.md +1 -1
- package/bin/bongos.js +1 -0
- package/clients/bongos-client/README.md +4 -4
- package/clients/bongos-client/bongos-client.global.js +14 -1
- package/clients/bongos-client/index.cjs +14 -1
- package/clients/bongos-client/index.d.ts +19 -2
- package/clients/bongos-client/index.mjs +11 -1
- package/clients/bongos-client/package.json +1 -1
- package/docs/adr/0001-stack-choice-single-vps.md +1 -1
- package/docs/adr/0008-google-chat-oauth-user-auth.md +1 -1
- package/docs/adr/0019-red-team-bounty-payout-table.md +3 -3
- package/docs/adr/0020-security-model-public-stub.md +1 -1
- package/docs/adr/0023-kind-multipliers-and-idea-bonus.md +1 -1
- package/docs/adr/0024-cloneable-repo-local-first-memory.md +1 -1
- package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +4 -4
- package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +3 -3
- package/docs/adr/0030-builders-hall-live-updates.md +1 -1
- package/docs/adr/0031-cloud-dev-environments-for-builders.md +4 -4
- package/docs/adr/0032-discord-mirror-of-gds.md +2 -2
- package/docs/adr/0034-thetes-graduated-newcomer-rank.md +1 -1
- package/docs/adr/0044-mediterranean-palette-replacement.md +1 -1
- package/docs/adr/0044-per-box-live-game-preview.md +1 -1
- package/docs/adr/0054-session-token-reward-cost-plus.md +10 -10
- package/docs/adr/0057-container-cost-ledger.md +3 -3
- package/docs/adr/0062-medusa-instance-model-decoupling.md +4 -4
- package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +2 -2
- package/docs/adr/0085-remove-default-per-builder-spend-cap.md +1 -1
- package/docs/adr/0086-goal-scoped-work-hierarchy.md +1 -1
- package/docs/adr/0096-require-reward-before-workable.md +9 -9
- package/docs/adr/0097-retroactive-reward-backfill.md +3 -3
- package/docs/adr/0100-two-repo-instance-model.md +1 -1
- package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +3 -3
- package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +3 -3
- package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +1 -1
- package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +6 -6
- package/docs/adr/0133-github-app-manifest-onboarding-signin.md +2 -0
- package/docs/adr/0134-private-first-npm-distribution.md +20 -6
- package/docs/adr/0135-module-upstream-submission-interim-queue.md +34 -0
- package/docs/adr/0136-update-channel-subscription-policy.md +51 -0
- package/docs/adr/0137-upstream-publish-policy-manual-owner-gated.md +40 -0
- package/docs/adr/0138-bundled-module-deps-declared-per-module.md +45 -0
- package/docs/adr/README.md +14 -10
- package/docs/api/openapi.json +315 -6
- package/docs/api-reference.md +10 -5
- package/docs/architecture.md +3 -3
- package/docs/branding-contract.md +5 -4
- package/docs/canonical-permissions.md +1 -1
- package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
- package/docs/file-map.md +20 -19
- package/docs/handoff-template.md +2 -2
- package/docs/modules-contract.md +8 -1
- package/docs/onboarding/diagrams/README.md +7 -7
- package/docs/onboarding/drachmae-and-karma.md +18 -18
- package/docs/onboarding/primer.md +9 -9
- package/docs/recipes/audit-replay.md +2 -2
- package/docs/recipes/builder-box-lifecycle.md +2 -2
- package/docs/recipes/claude-design-loop.md +1 -1
- package/docs/recipes/instance-deploy.md +4 -4
- package/docs/recipes/instance-first-run.md +51 -0
- package/docs/recipes/ops-gotchas.md +1 -1
- package/docs/recipes/packaging-the-core.md +5 -5
- package/docs/recipes/private-npm-distribution.md +39 -12
- package/docs/recipes/self-host.md +1 -1
- package/docs/recipes/staging-environment.md +1 -1
- package/docs/recipes/upgrading-the-core.md +63 -8
- package/docs/research/cursor-competitive-analysis.md +1 -1
- package/docs/research/llm-model-agnostic-and-cheaper-grader.md +1 -1
- package/migrations/core_191_module_submissions.sql +45 -0
- package/modules/autonomy/CLAUDE.md +11 -45
- package/modules/builder-settings/CLAUDE.md +11 -54
- package/modules/dev-box/CLAUDE.md +11 -34
- package/modules/discord/CLAUDE.md +11 -46
- package/modules/discord/module.json +2 -1
- package/modules/economy/CLAUDE.md +11 -44
- package/modules/economy/achievements.js +9 -1
- package/modules/economy/credits.js +10 -1
- package/modules/grading/CLAUDE.md +11 -38
- package/modules/hall-ui/CLAUDE.md +11 -57
- package/modules/hall-ui/public/builders.js +71 -4
- package/modules/hall-ui/public/goal-inbox.js +191 -0
- package/modules/hall-ui/public/goals-page.js +227 -22
- package/modules/hall-ui/public/goals.html +16 -0
- package/modules/hall-ui/public/hall-widgets.js +14 -1
- package/modules/hall-ui/public/index.html +3 -0
- package/modules/hall-ui/public/new-project-wizard.js +6 -4
- package/modules/hall-ui/public/style.css +43 -0
- package/modules/ideas/CLAUDE.md +11 -33
- package/modules/lifecycle/CLAUDE.md +11 -59
- package/modules/lifecycle/routes/goals.js +80 -0
- package/modules/memory/CLAUDE.md +11 -36
- package/modules/onboarding/CLAUDE.md +11 -51
- package/modules/provisioning/CLAUDE.md +15 -0
- package/modules/provisioning/migrations/provisioning_001_tables.sql +160 -0
- package/modules/provisioning/migrations/provisioning_002_standalone_shape.sql +11 -0
- package/modules/provisioning/migrations/provisioning_003_github_app_manifest.sql +95 -0
- package/modules/provisioning/module.json +17 -0
- package/modules/provisioning/onboard-plan.js +37 -0
- package/modules/provisioning/provisioning.js +539 -0
- package/modules/provisioning/rate-limit.js +35 -0
- package/modules/provisioning/routes/provisioning.js +607 -0
- package/modules/provisioning/tests/provisioning.mjs +232 -0
- package/modules/provisioning/ui/.gitkeep +0 -0
- package/modules/security/CLAUDE.md +11 -40
- package/modules/security/secret-scrub.js +10 -0
- package/modules/sessions/CLAUDE.md +11 -35
- package/modules/status-ui/CLAUDE.md +11 -43
- package/package-lock.json +2 -2
- package/package.json +7 -2
- package/public-landing/create.html +58 -12
- package/public-landing/index.html +40 -21
- package/scripts/discord/README.md +1 -1
- package/scripts/gds/CLAUDE.md +11 -140
- package/scripts/gds/claim.js +98 -48
- package/scripts/gds/claude-materialize.js +174 -20
- package/scripts/gds/claude-md-template.js +84 -0
- package/scripts/gds/cli-lib.js +112 -2
- package/scripts/gds/cutover-codemod.js +241 -0
- package/scripts/gds/fitness.js +54 -0
- package/scripts/gds/gen-api-client.js +10 -10
- package/scripts/gds/init.js +112 -16
- package/scripts/gds/lint-infra-exec.js +70 -0
- package/scripts/gds/lint-workflow-exec.js +63 -0
- package/scripts/gds/migration-namespace.js +1 -1
- package/scripts/gds/mirror-lineage-check.js +14 -5
- package/scripts/gds/mirror-redact.js +8 -0
- package/scripts/gds/module.js +118 -4
- package/scripts/gds/npmrc.js +93 -0
- package/scripts/gds/onboard.js +17 -24
- package/scripts/gds/package-core.js +74 -17
- package/scripts/gds/provision.js +102 -17
- package/scripts/gds/publish-manifest.js +60 -2
- package/scripts/gds/run-routine.js +51 -13
- package/scripts/gds/run-unit-tests.js +4 -0
- package/scripts/gds/seed-adopt-tasks.js +1 -1
- package/scripts/gds/status.js +6 -1
- package/scripts/gds/task.js +166 -0
- package/scripts/gds/update-channel.js +186 -0
- package/scripts/gds/upgrade.js +172 -25
- package/src/bongos/CLAUDE.md +11 -60
- package/src/bongos/auth.js +24 -0
- package/src/bongos/module-submissions.js +56 -0
- package/src/bongos/route-rank-check.js +6 -0
- package/src/bongos/routes/CLAUDE.md +11 -39
- package/src/bongos/routes/auth.js +6 -1
- package/src/bongos/routes/modules.js +123 -21
- package/src/bongos/serve-internal.js +10 -1
- package/src/branding.js +1 -0
- package/src/instance-config.js +1 -1
- package/src/module-api.js +24 -1
- package/src/module-loader/loader.js +36 -4
- package/src/module-loader/manifest-schema.js +16 -1
- package/tests/branding.mjs +11 -0
- package/tests/claim_error_surface.mjs +107 -0
- package/tests/claude_materialize.mjs +125 -0
- package/tests/consumer_layout_boot.mjs +302 -0
- package/tests/cutover_codemod.mjs +184 -0
- package/tests/device_flow_start.mjs +96 -0
- package/tests/first_run_engine_check.mjs +79 -0
- package/tests/goal_membership_requests.mjs +33 -3
- package/tests/hook_core_resolve.mjs +125 -0
- package/tests/hook_user_agents.mjs +62 -0
- package/tests/infra_exec_paths.mjs +104 -0
- package/tests/init.mjs +106 -6
- package/tests/instance_mismatch_guard.mjs +101 -0
- package/tests/mirror_lineage_proof.mjs +14 -0
- package/tests/module_cli.mjs +130 -2
- package/tests/module_loader.mjs +42 -0
- package/tests/module_manifest.mjs +19 -0
- package/tests/module_submissions.mjs +135 -0
- package/tests/npmrc.mjs +105 -0
- package/tests/onboard.mjs +62 -0
- package/tests/package_core.mjs +76 -22
- package/tests/platform_boot.mjs +5 -2
- package/tests/provision.mjs +107 -8
- package/tests/provisioning_github_app_routes.mjs +44 -2
- package/tests/publish_manifest.mjs +52 -1
- package/tests/run_routine.mjs +26 -1
- package/tests/run_routine_two_root.mjs +77 -0
- package/tests/scrubber_corpus.mjs +17 -0
- package/tests/served_paths_shipped.mjs +2 -2
- package/tests/task_cli.mjs +99 -0
- package/tests/update_channel.mjs +186 -0
- package/tests/upgrade.mjs +220 -25
- package/tests/workflow_exec_paths.mjs +98 -0
- package/docs/design/container-exterior-tiles.md +0 -49
- package/docs/design/container-exterior.md +0 -81
- package/docs/design/container-interior.md +0 -77
- package/docs/design/world-map-scroll.md +0 -41
- package/docs/recipes/claude-gemini-bongos-doors.md +0 -155
- package/docs/recipes/cloudbongos-staging-gate.md +0 -139
- package/docs/recipes/cloudbongos-standup.md +0 -111
- package/docs/recipes/parallel-load-results-2026-05-30.md +0 -63
- package/docs/recipes/parallel-load-test.md +0 -32
- package/docs/recipes/pixel-art-pipeline.md +0 -411
- package/docs/recipes/staging-data.md +0 -50
- package/migrations/instance/018_pms_v3_planning_seed.sql +0 -131
- package/migrations/instance/080_gds_v4_planning_seed.sql +0 -75
- package/migrations/instance/110_medusa_planning_seed.sql +0 -70
- package/migrations/instance/120_bongos_v1_planning_seed.sql +0 -69
- package/migrations/instance/144_bongos_v1_module_system_criterion.sql +0 -26
- package/migrations/instance/159_bongos_v1_goal_hierarchy_criterion.sql +0 -29
- package/migrations/instance/172_v2_world_planning_seed.sql +0 -163
- package/migrations/instance/173_bongos_v1_c7_core_modularized.sql +0 -33
- package/migrations/instance/182_gdsv4_bongos_consolidation.sql +0 -132
- package/migrations/instance/183_gdsv4_carryover_themed_goals.sql +0 -116
- package/migrations/instance/186_bongos_v1_governance_planning_seed.sql +0 -69
- package/scripts/gds/art-stage.js +0 -152
- package/server.js +0 -212
- package/tests/art_key.mjs +0 -121
- package/tests/day_cycle.mjs +0 -197
- package/tests/snapshot_picker.mjs +0 -233
- package/tests/sprite_facing.mjs +0 -35
- package/tests/terrain_picker.mjs +0 -298
- package/tests/turn_in_place.mjs +0 -280
- package/tests/walkability.mjs +0 -188
package/docs/file-map.md
CHANGED
|
@@ -147,7 +147,7 @@
|
|
|
147
147
|
│ ├── gen-file-map.js ← ADR 0066 ([#1276](https://example.com/builders#/task/1276)): generates the `.claude/skills/` + `.claude/scheduled-tasks/` sections of docs/file-map.md from disk; per-entry notes come from docs/file-map.notes.json; `--check` fails on drift OR a skill/routine with no note (CI gate via fitness.js); regenerated on deploy by ship.js regenerateFileMap()
|
|
148
148
|
│ ├── fitness.js ← Path C (ADR 0062 §9, [#1225](https://example.com/builders#/task/1225)): architecture fitness functions — core↔host import boundary (zero grandfathered exceptions as of R52/#1191), CLAUDE.md budget + nested-doc presence (ADR 0061), no route bypasses rank checks (reuses route-rank-check), repo-map freshness. Enforced in CI via tests/fitness.mjs (the `unit` gate). `node scripts/gds/fitness.js`
|
|
149
149
|
│ ├── ship.js ← resolve claim as shipped, award credits (`/builder-ship`); also uploads a secret-scrubbed session digest to the corpus (6D.1, ADR 0027); on a dev box runs the sandbox-first review gate before resolving (#927, ADR 0046)
|
|
150
|
-
│ ├── 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/
|
|
150
|
+
│ ├── 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
|
|
151
151
|
│ ├── sandbox-stage.js ← stage the working tree on the live game preview (box OR local) for browser review before ship; resolvePreviewContext picks the context (`/builder-stage`; #927, ADR 0046; local: task 1056)
|
|
152
152
|
│ ├── 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)
|
|
153
153
|
│ ├── 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)
|
|
@@ -170,7 +170,7 @@
|
|
|
170
170
|
│ ├── gen-api-docs.js ← ADR 0109: generates `docs/api/openapi.json` + `docs/api-reference.md` from the live route files via `route-rank-check.js` introspection, so the API reference cannot drift from what the server actually mounts
|
|
171
171
|
│ ├── architect-audit.js ← MAS Phase 5 (ADR 0024): the Architect's bounded first-principles `--scope`/`--paths` audit CLI → `docs/audits/`
|
|
172
172
|
│ ├── module.js ← `bongos module new <key>` scaffolder + module CLI utilities (ADR 0083)
|
|
173
|
-
│ ├── upgrade.js ← `bongos upgrade` — bump the installed `@
|
|
173
|
+
│ ├── upgrade.js ← `bongos upgrade` — bump the installed `@bongos/core` package version with doorway/coreVersion pre-checks (ADR 0108)
|
|
174
174
|
│ └── newcomer-floor.js ← deterministic on-claim replenisher for the evergreen newcomer chores (engineer/artist/ideator floor); no cron, restocks when one is claimed (task 1168)
|
|
175
175
|
│
|
|
176
176
|
├── src/
|
|
@@ -364,23 +364,24 @@ tests/
|
|
|
364
364
|
<!-- BEGIN GENERATED FILE-MAP .claude/scheduled-tasks/ (scripts/gds/gen-file-map.js — do not hand-edit; notes live in docs/file-map.notes.json) -->
|
|
365
365
|
```
|
|
366
366
|
.claude/scheduled-tasks/
|
|
367
|
-
├── bfg/SKILL.md
|
|
368
|
-
├── bfg-session-eval/SKILL.md
|
|
369
|
-
├── box-dormant-reclaim/SKILL.md
|
|
370
|
-
├── box-idle-suspend/SKILL.md
|
|
371
|
-
├──
|
|
372
|
-
├──
|
|
373
|
-
├──
|
|
374
|
-
├──
|
|
375
|
-
├──
|
|
376
|
-
├── newcomer-
|
|
377
|
-
├──
|
|
378
|
-
├── overnight-
|
|
379
|
-
├──
|
|
380
|
-
├──
|
|
381
|
-
├──
|
|
382
|
-
├──
|
|
383
|
-
|
|
367
|
+
├── bfg/SKILL.md ← (MAS Phase 6, ADR 0026) BFG hygiene + read-the-room + steward routine: doc-vs-reality checks, memory hygiene, cross-builder learning. Read-mostly.
|
|
368
|
+
├── bfg-session-eval/SKILL.md ← (6D.3, ADR 0027) BFG session-inefficiency evaluator: search the session corpus, deep-dive wasteful sessions (ceremony-vs-work + footguns), file systemic findings. Read-only.
|
|
369
|
+
├── box-dormant-reclaim/SKILL.md ← (#598/ADR 0031) daily: deprovision dev boxes parked past the dormant threshold (pings the builder). Drives `box.js sweep-dormant --apply`. Control-plane only.
|
|
370
|
+
├── box-idle-suspend/SKILL.md ← (#598/ADR 0031) every 15 min: snapshot-and-park dev boxes idle past the idle threshold. Drives `box.js sweep-idle --apply`. Control-plane only.
|
|
371
|
+
├── core-update-subscription/SKILL.md ← (task 2150 / ADR 0136) daily: patch-only auto-upgrade of subscribed consumer instances (config/update-subscriptions.json) via `bongos upgrade --registry` with auto-rollback. Deterministic; opt-in + autonomy-gated (default OFF). Control-plane only.
|
|
372
|
+
├── dep-audit-nightly/SKILL.md ← autonomous nightly dependency-vulnerability scan on the droplet (`scripts/security/dep-audit.js --report-mode=nightly`) across npm + the devbox app
|
|
373
|
+
├── diagram-drift/SKILL.md ← belt-and-braces backstop for the onboarding diagrams — all five auto-regenerate on deploy, so this only flags any residual staleness
|
|
374
|
+
├── idea-triage-nightly/SKILL.md ← nightly autonomous walk of the idea_inbox; promotes high-confidence bugs/cleanups, discards obvious noise, defers ambiguous ideas
|
|
375
|
+
├── main-audit/SKILL.md ← (SEC #863 / ADR 0043) nightly post-push audit of `main` — flags commits where a sub-Metic builder edited a permission-sensitive surface
|
|
376
|
+
├── newcomer-floor/SKILL.md ← deterministic on-claim replenisher for the three evergreen newcomer chores (engineer/artist/ideator) — no cron; restocks when one is claimed (task 1168)
|
|
377
|
+
├── newcomer-generator/SKILL.md ← keep the newcomer_friendly task queue populated (C1) — deterministic generator tops the queue back up to its floor
|
|
378
|
+
├── overnight-builder/SKILL.md ← (#358) autonomous overnight session-runner: claims the highest-priority autonomous-fit task, works it in a fresh sub-agent, ships, re-polls. Archon-only. Runbook: docs/recipes/overnight-builder.md
|
|
379
|
+
├── overnight-code-review/SKILL.md ← nightly read-only code review; routes each finding into the idea_inbox (one row per finding; title prefix `[review YYYY-MM-DD]`)
|
|
380
|
+
├── peer-vote-tally/SKILL.md ← (V3.R25 / #245, C2) weekly tally of builder-on-builder peer votes into karma; folds votes ≥7 days old into karma_log
|
|
381
|
+
├── repo-simplify-sweep/SKILL.md ← weekly autonomous repo-cleanliness janitor: runs repo-metrics, files dead-code findings to the idea_inbox, auto-fixes the narrow safe class (unused vars/imports)
|
|
382
|
+
├── security-review-weekly/SKILL.md ← (V3.R69 / #288) autonomous weekly security-state review — surfaces stale vulnerability_reports + other stale-security signals
|
|
383
|
+
├── skill-usage-review/SKILL.md ← nightly skill-usage feedback loop: aggregates 24h of skill invocations, detects friction (over-invocation, errors), files findings
|
|
384
|
+
└── stale-claim-release/SKILL.md ← auto-release GDS claims whose session_pulses heartbeat went silent ≥ GDS_STALE_CLAIM_HOURS (default 6h); runs every 15 min on the droplet
|
|
384
385
|
```
|
|
385
386
|
<!-- END GENERATED FILE-MAP .claude/scheduled-tasks/ -->
|
|
386
387
|
|
package/docs/handoff-template.md
CHANGED
|
@@ -65,9 +65,9 @@ If even one of these is false, the claim is `[verified-smoke]` or `[implemented-
|
|
|
65
65
|
|
|
66
66
|
### Diagram backstop (task [#357](https://example.com/builders#/task/357); conceptual diagrams auto-generated [#436](https://example.com/builders#/task/436))
|
|
67
67
|
|
|
68
|
-
If your change touched anything the onboarding diagrams describe — the **rank enum or which ranks are wired** (`requireRank`, `builders.rank` default, exit/assign paths), the **task-status set**, the **versions** (id/track/status), or the **complete-architecture** (the ADR 0024 memory chain + the dev-box → production ship flow) **/
|
|
68
|
+
If your change touched anything the onboarding diagrams describe — the **rank enum or which ranks are wired** (`requireRank`, `builders.rank` default, exit/assign paths), the **task-status set**, the **versions** (id/track/status), or the **complete-architecture** (the ADR 0024 memory chain + the dev-box → production ship flow) **/ example-karma** models (which now flip per the **shipped** status of their backing tasks) — then before shipping:
|
|
69
69
|
|
|
70
|
-
- **All five diagrams are auto-generated** by `scripts/gds/gen-diagrams.js` — run it (`node scripts/gds/gen-diagrams.js`) and confirm the result looks right; **do not hand-edit any `.mmd`**. The mechanical three (`01-task-lifecycle`, `02-rank-ladder`, `05-versioning`) regenerate from migrations + the public version API. The conceptual two (`03-
|
|
70
|
+
- **All five diagrams are auto-generated** by `scripts/gds/gen-diagrams.js` — run it (`node scripts/gds/gen-diagrams.js`) and confirm the result looks right; **do not hand-edit any `.mmd`**. The mechanical three (`01-task-lifecycle`, `02-rank-ladder`, `05-versioning`) regenerate from migrations + the public version API. The conceptual two (`03-example-karma`, `04-architecture`) regenerate from the **authenticated** `/tasks/:id` status of their backing tasks (and 03's seeded-achievement count); if no session is present the generator skips them cleanly. Rendering produces both `.svg` (the pannable viewer asset) and `.png` (fallback).
|
|
71
71
|
- To change a diagram's **layout or wording**, edit the matching template function in `gen-diagrams.js` — not the `.mmd`. `assertions.json` is rebuilt by the generator in lockstep, so you don't hand-maintain it.
|
|
72
72
|
|
|
73
73
|
The `diagram-drift` routine is a belt-and-braces backstop (it should find nothing once the generator has run), but the point is not to rely on it — running `gen-diagrams.js` is part of the change.
|
package/docs/modules-contract.md
CHANGED
|
@@ -95,16 +95,23 @@ Every module must have a `module.json` at its root (`modules/<key>/module.json`)
|
|
|
95
95
|
},
|
|
96
96
|
"provides": ["box.hasEverConnected"], // OPTIONAL. Seam PORTS this module registers a provider for.
|
|
97
97
|
"consumes": [], // OPTIONAL. Seam ports this module resolves (required caps).
|
|
98
|
-
"prerequisites": { "modules": [] }
|
|
98
|
+
"prerequisites": { "modules": [] }, // OPTIONAL. Other modules that must be enabled first.
|
|
99
|
+
"dependencies": { "discord.js": "^14.26.4" } // OPTIONAL. External npm deps this module needs at runtime.
|
|
99
100
|
}
|
|
100
101
|
```
|
|
101
102
|
|
|
102
103
|
An unknown key throws at validate time — typos fail loud (top-level attribution fields have no closed allowlist; only `contributes` sub-keys do).
|
|
103
104
|
|
|
105
|
+
### `dependencies` — a module's own npm deps ([ADR 0138](adr/<redacted>.md))
|
|
106
|
+
|
|
107
|
+
`@bongos/core` ships lean — its synthesized `package.json` declares only `express` + `pg` ([ADR 0108](adr/<redacted>.md)). A bundled module that needs an external npm package at runtime (e.g. `discord` → `discord.js`) declares it in its own `module.json` `dependencies` (`{ "<npm-name>": "<semver-range>" }`, schema-validated). **Core does not carry it**, so the *consumer* must — greenfield `bongos init` composes the ENABLED modules' declared deps into the instance `package.json` (`enabledModuleDeps` → `buildInstancePackageJson`; an explicit pre-existing pin wins, `@bongos/core` is always set), and the R89 cutover preserves the monolith's existing dependency closure. If a module needs a dep and neither declares it nor is it in the consumer's closure, an instance that enables the module crashes at boot — so **declare it here**.
|
|
108
|
+
|
|
104
109
|
**Attribution (`author`/`origin`/`license`/`maintainer`) is portable metadata, not a cross-GDS link** — each repo runs its own GDS with its own builder identities ([ADR 0100](adr/<redacted>.md) §3), so credit travels *with the module* rather than through a foreign key ([ADR 0107](adr/<redacted>.md) §2). `bongos module new` stamps all four as TODO placeholders (license defaults to `AGPL-3.0`) so a module carries its authorship from the day it's scaffolded, not bolted on later at upstream-submit time.
|
|
105
110
|
|
|
106
111
|
**`bongos module check <key> [--sign-off "Name <email>"]`** ([ADR 0107](adr/<redacted>.md) §4) is the submit-time pre-check a module must clear before it can be upstreamed. It reuses (never re-types) the public-mirror publish denylist (`scripts/gds/publish-manifest.js`'s `matchesDeny`) to reject content that cannot ship under AGPL (game content, pixel art, copyrighted reference material) — deliberately the DENY half only, since a brand-new module is never on the publish ALLOWLIST until it's accepted into core (§6). It also requires `module.json`'s `license` to be AGPL-3.0 (inbound = outbound). On a pass, `--sign-off` records a lightweight DCO-style affirmation (own work, licensed AGPL-3.0 — never a copyright-assignment CLA) to `modules/<key>/.upstream-signoff.json`.
|
|
107
112
|
|
|
113
|
+
**`bongos module submit <key> [--sign-off "Name <email>"]`** ([ADR 0107](adr/<redacted>.md) §1) re-runs the §4 pre-check + requires a sign-off, then packages the module (manifest + a full file snapshot + the sign-off) and files it into the rank-gated (metic+archon) upstreaming review queue via `POST /modules/:key/submit` — the same route the hall "Modules" tab's submit button calls. Refuses (exit 1) if the pre-check fails or no sign-off can be found/recorded. The queue currently lives in **this instance's own DB**, not a live call to the extracted core repo — see [ADR 0135](adr/<redacted>.md) for why, and `GET /modules/submissions` to read it back.
|
|
114
|
+
|
|
108
115
|
---
|
|
109
116
|
|
|
110
117
|
## The loader — `src/module-loader/loader.js`
|
|
@@ -11,7 +11,7 @@ Five flowcharts that explain the Game Development System (GDS) to a new builder
|
|
|
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-
|
|
14
|
+
| `03-example-karma` · `04-architecture` (**conceptual**) | Each feature-piece is **LIVE iff its backing GDS 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 GDS session is available (headless run, no creds) the generator **skips** 03/04 and leaves them untouched rather than emit wrong data. (04's device/box/server/GitHub *topology* is structural; only its LIVE/PLANNED markers — the memory chain + the box→prod 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
|
|
|
@@ -28,7 +28,7 @@ The GDS is mid-build. These diagrams deliberately distinguish **what exists toda
|
|
|
28
28
|
## The five diagrams
|
|
29
29
|
|
|
30
30
|
### 1. Task lifecycle — backlog → shipped
|
|
31
|
-
How a task moves from creation to production, and the exact edge where **credits/
|
|
31
|
+
How a task moves from creation to production, and the exact edge where **credits/example are awarded** (`completed → confirmed`, *not* at ship).
|
|
32
32
|
|
|
33
33
|

|
|
34
34
|
|
|
@@ -41,12 +41,12 @@ The 16-value reserved rank enum (migration 023) in three Greek bands, which rank
|
|
|
41
41
|
|
|
42
42
|
Source: [`02-rank-ladder.mmd`](02-rank-ladder.mmd)
|
|
43
43
|
|
|
44
|
-
### 3.
|
|
45
|
-
Where each comes from and where each goes. Key facts: **
|
|
44
|
+
### 3. Example & karma — sourcing and spending
|
|
45
|
+
Where each comes from and where each goes. Key facts: **example = credits** (same thing, in-world name), they are **equity, not a spendable currency**, and the **primary source is now a cost-plus reward on each shipped session** — `round(true_cost × 1.20)` ([ADR 0054](../../adr/<redacted>.md)) — alongside per-task `credits_reward × kind multiplier` ([ADR 0023](../../adr/<redacted>.md)), achievements, and the (rate-card-live) security bounty. Karma is a separate peer-trust signal that does **not** gate rank promotions; its LIVE/PLANNED state tracks its backing tasks (R25/R32/R26). The full write-up is [`docs/onboarding/example-and-karma.md`](../example-and-karma.md).
|
|
46
46
|
|
|
47
|
-

|
|
48
48
|
|
|
49
|
-
Source: [`03-
|
|
49
|
+
Source: [`03-example-karma.mmd`](03-example-karma.mmd)
|
|
50
50
|
|
|
51
51
|
### 4. The complete architecture — where your work runs and how code reaches production
|
|
52
52
|
One map of the whole system, merging the old "server ↔ repo ↔ memory" three-layer view with the dev-box → production ship flow. The four places Claude Code splits across — your **device** (screen only) · the **dev box** (the worker, the code, *and* your local memory dir) · the **server/droplet** (authority *and* production: Postgres, the server-side memory store, the push credential) · **GitHub** (branch-protected main + Actions) — plus two flows woven through it: the **per-builder memory layer** (ADR 0024 — local ↔ server, sync-on-ship / pull-on-start) and the **box → prod ship path** (a credential-less box re-auths and uploads its branch as a git bundle; the server pushes it with a GitHub App credential; the PR auto-merges and GitHub Actions deploys — no droplet key on any box). 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); dev box [#904](https://example.com/builders#/task/904)/[#774](https://example.com/builders#/task/774)/[#897](https://example.com/builders#/task/897)/[#919](https://example.com/builders#/task/919); box→prod [#1025](https://example.com/builders#/task/1025)/[#859](https://example.com/builders#/task/859)/[#1028](https://example.com/builders#/task/1028)/[#1027](https://example.com/builders#/task/1027) (all shipped → the map reads all-LIVE today). See [ADR 0024](../../adr/<redacted>.md) (cloneable memory), [ADR 0055](../../adr/<redacted>.md) (server-mediated publish), [ADR 0053](../../adr/0053-scoped-dev-box-session.md) (scoped box token), [ADR 0042](../../adr/<redacted>.md) (CI self-deploy), [ADR 0016](../../adr/<redacted>.md) (trust boundary).
|
|
@@ -78,7 +78,7 @@ Two mechanisms keep these honest as the system changes (added under [#356](https
|
|
|
78
78
|
node .claude/scheduled-tasks/diagram-drift/check.js --file-idea
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
`assertions.json` is the machine-readable record of what these diagrams claim about the live system (rank enum + wired ranks, task-status set, live versions, and the conceptual `architecture` + `
|
|
81
|
+
`assertions.json` is the machine-readable record of what these diagrams claim about the live system (rank enum + wired ranks, task-status set, live versions, and the conceptual `architecture` + `example_karma` piece→task slices). It is **rebuilt by `gen-diagrams.js` in lockstep with the diagrams**, so you no longer hand-maintain it; it stays as the drift checker's reference.
|
|
82
82
|
|
|
83
83
|
## Regenerating the diagrams by hand
|
|
84
84
|
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Example & karma — how you get paid, and how you earn trust
|
|
2
2
|
|
|
3
3
|
*The complete reference for the two reputation tracks in the GDS. The [primer](primer.md) gives you the one-paragraph version; this is the full picture, kept honest against the live system. ~8 minutes.*
|
|
4
4
|
|
|
5
|
-
> **Source of truth.** The numbers live in the production database (`builders.total_credits`, `builders.karma`) and the rules live in code (`src/bongos/db.js`, `src/bongos/cost.js`). This doc *describes* them; where they disagree, the code wins. The two diagrams that visualize this — [task lifecycle](diagrams/01-task-lifecycle.png) and [
|
|
5
|
+
> **Source of truth.** The numbers live in the production database (`builders.total_credits`, `builders.karma`) and the rules live in code (`src/bongos/db.js`, `src/bongos/cost.js`). This doc *describes* them; where they disagree, the code wins. The two diagrams that visualize this — [task lifecycle](diagrams/01-task-lifecycle.png) and [example & karma](diagrams/03-example-karma.png) — are auto-generated from the same live facts.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## The 30-second version
|
|
10
10
|
|
|
11
|
-
- **
|
|
12
|
-
- The **headline change (June 2026):** most of your
|
|
11
|
+
- **Example** (the code calls them *credits*) are your **equity** in Example. You earn them by shipping work, and they only ever go up. They are a score and a stake — **not** a currency you spend on anything in-game.
|
|
12
|
+
- The **headline change (June 2026):** most of your example now come from a **cost-plus reward on each shipped session** — we pay you the real API cost of the work you did, **plus 20%**. Expensive, real work pays more than declaring a big number ever did.
|
|
13
13
|
- **Karma** is a *separate* signal. It measures **peer trust** — how other trusted builders rate your work — not how much you shipped. It is surfaced on your profile and the leaderboard, and it feeds your "builder strength" score. It is **not** a gate on rank promotions.
|
|
14
14
|
- A **monthly budget cap** ($50 by default) limits how much you can *spend*; it's the cost side of the same coin the reward is computed from.
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
-
## Part 1 —
|
|
18
|
+
## Part 1 — Example (credits)
|
|
19
19
|
|
|
20
20
|
### What they are
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Example are the in-world name for the `total_credits` counter on your builder row. The owner's framing ([ADR 0054](../adr/<redacted>.md)) is that **example are equity** — units of ownership in the thing you're helping build. Practically, today, they are:
|
|
23
23
|
|
|
24
24
|
- **Append-only.** Every award is a row in `credit_log`; the `total_credits` counter is maintained by a database trigger. History is never rewritten — a correction is a new (sometimes negative) row, never an edit.
|
|
25
|
-
- **Persistent across exit.** If you leave and come back, your
|
|
25
|
+
- **Persistent across exit.** If you leave and come back, your example are still there (migration 025). They are reputation, not a session balance.
|
|
26
26
|
- **Not spendable.** There is no shop, no sink, nothing to buy with them. They are a *score and a stake*. (This may change in a future version; today it does not.)
|
|
27
27
|
- **Public.** Your total is visible on the [builders' hall](https://example.com/builders) leaderboard.
|
|
28
28
|
|
|
@@ -35,7 +35,7 @@ There are several sources. They all land in the same `credit_log` and roll up in
|
|
|
35
35
|
When you **ship** a session, the server looks at the LLM tokens that session actually burned, prices them, and pays you:
|
|
36
36
|
|
|
37
37
|
```
|
|
38
|
-
|
|
38
|
+
example = round( true_cost_usd × 1.20 ) // whole example (1 drachma = $1)
|
|
39
39
|
└─ REWARD_MARGIN_PCT = 20 (a code constant in src/bongos/db.js)
|
|
40
40
|
```
|
|
41
41
|
|
|
@@ -47,7 +47,7 @@ The important details, because they're designed to be fair *and* un-gameable:
|
|
|
47
47
|
- **Idempotent per session.** Re-shipping or retrying the same session is a true no-op — keyed on `session_id`, you can't get paid twice.
|
|
48
48
|
- **Reversible.** A bad award is undone with a compensating negative `credit_log` row; the trigger nets it out. History stays intact.
|
|
49
49
|
|
|
50
|
-
> **Why pay for cost at all — doesn't that reward waste?** It can, and that was accepted on purpose ([ADR 0054](../adr/<redacted>.md)). The guardrails are: you only get paid for sessions that *ship*;
|
|
50
|
+
> **Why pay for cost at all — doesn't that reward waste?** It can, and that was accepted on purpose ([ADR 0054](../adr/<redacted>.md)). The guardrails are: you only get paid for sessions that *ship*; example are *equity*, so padding your own cost dilutes a pool you hold (early builders self-police); and the [BFG session-inefficiency evaluator](../adr/<redacted>.md) already flags wasteful sessions, so a future version can discount the reward by an efficiency factor. The stated direction is to move toward market/bidding pricing once there's a real multi-builder pool.
|
|
51
51
|
|
|
52
52
|
#### 2. Per-task credits, adjusted by *kind* ([ADR 0023](../adr/<redacted>.md))
|
|
53
53
|
|
|
@@ -80,11 +80,11 @@ A ship whose committed diff **removes more lines than it adds** earns a small `s
|
|
|
80
80
|
|
|
81
81
|
#### 6. Red-team / security bounty *(rate card live; awarding still landing)*
|
|
82
82
|
|
|
83
|
-
There's a published payout rate-card by severity for red-team / security findings (shown on the hall, `src/bongos/security.js`). The **automatic**
|
|
83
|
+
There's a published payout rate-card by severity for red-team / security findings (shown on the hall, `src/bongos/security.js`). The **automatic** example payout for a filed-and-confirmed vulnerability is still being wired up (tracked by [#286](https://example.com/builders#/task/286) + [#282](https://example.com/builders#/task/282)); the rates are real, the auto-pay isn't switched on yet.
|
|
84
84
|
|
|
85
85
|
### Where in the lifecycle credits land
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
Example are awarded at the **`completed → confirmed`** edge — when verification (smoke tests, and the grader when it's enabled) passes — **not** at the final ship/deploy. Releasing a task with `/builder-release` pays nothing.
|
|
88
88
|
|
|
89
89
|
```
|
|
90
90
|
active ──▶ completed ──▶ confirmed ──▶ shipped
|
|
@@ -103,7 +103,7 @@ We knowingly run two conventions on the same ledger ([ADR 0054](../adr/<redacted
|
|
|
103
103
|
|
|
104
104
|
## Part 2 — The monthly budget cap (the cost side)
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
Example are what you *earn*; the budget cap limits what you *spend*. They're linked, because the reward is computed from the same true cost the cap meters.
|
|
107
107
|
|
|
108
108
|
Defined in `src/bongos/cost.js` (criterion C3, [#302](https://example.com/builders#/task/302)):
|
|
109
109
|
|
|
@@ -126,21 +126,21 @@ If a cap is set and you hit `over`, you're not in trouble — you've just reache
|
|
|
126
126
|
|
|
127
127
|
## Part 3 — Karma
|
|
128
128
|
|
|
129
|
-
Karma (added in migration 040) is a **completely separate** counter from
|
|
129
|
+
Karma (added in migration 040) is a **completely separate** counter from example. Where example measure *output* (work shipped), karma measures **peer trust** — how other builders, and the project's good-citizenship signals, rate the *way* you work.
|
|
130
130
|
|
|
131
131
|
### How karma is earned (and lost)
|
|
132
132
|
|
|
133
133
|
- **Peer votes on confirmed work.** Builders upvote/downvote each other's confirmed tasks. Only **Metic-and-above** can cast a vote (`POST /api/gds/tasks/:id/vote` is rank-gated). Votes are **tallied weekly** into one net `peer_vote_weekly` karma entry per builder. There's an **anti-self-vote** guard and an anti-retaliation rule (a downvote can't dent your karma within the same week).
|
|
134
134
|
- **Proposal ratification.** When a criterion-proposal you made is ratified, you get **+3 karma** (`proposal_ratified`).
|
|
135
135
|
- **Idea promotion.** Promoting an idea into a real task awards karma to the capturer.
|
|
136
|
-
- **It can go down.** The [BFG](../adr/<redacted>.md) good-citizenship corrections can apply a *non-positive* karma delta. Karma is a slower, more reflective signal than
|
|
136
|
+
- **It can go down.** The [BFG](../adr/<redacted>.md) good-citizenship corrections can apply a *non-positive* karma delta. Karma is a slower, more reflective signal than example — you can ship fast and still lose karma if you break things.
|
|
137
137
|
|
|
138
138
|
> Discord cheers don't count. Reaction "applause" in Discord is cosmetic and **never** mints karma — only rank-gated peer votes do ([ADR 0033](../adr/<redacted>.md)). Unranked enthusiasm can't manufacture trust.
|
|
139
139
|
|
|
140
140
|
### Where karma shows up
|
|
141
141
|
|
|
142
142
|
- **Your profile card** on the hall shows your karma and its **30-day trend**, plus your recent karma feed (last 10 entries).
|
|
143
|
-
- **The leaderboard** is sortable by karma (it still defaults to
|
|
143
|
+
- **The leaderboard** is sortable by karma (it still defaults to example order).
|
|
144
144
|
- **Builder strength.** Karma is one input (weight ~0.15) into the BFG's 0–100 "builder strength" score (`src/bongos/bfg.js`), alongside ship volume, grader pass-rate, and reliability.
|
|
145
145
|
|
|
146
146
|
### What karma is *not*
|
|
@@ -154,9 +154,9 @@ Karma is evidence an Archon *can weigh* when deciding a discretionary promotion,
|
|
|
154
154
|
|
|
155
155
|
---
|
|
156
156
|
|
|
157
|
-
##
|
|
157
|
+
## Example vs karma, side by side
|
|
158
158
|
|
|
159
|
-
| | **
|
|
159
|
+
| | **Example** (credits) | **Karma** |
|
|
160
160
|
|---|---|---|
|
|
161
161
|
| Measures | Output — work shipped | Peer trust — how others rate your work |
|
|
162
162
|
| Earned by | Shipping (cost-plus reward, per-task credits, bonuses) | Metic+ peer votes, ratification, idea promotion |
|
|
@@ -173,6 +173,6 @@ Both are reputation. Neither is a spendable currency today. You don't have to *d
|
|
|
173
173
|
## See it / dig deeper
|
|
174
174
|
|
|
175
175
|
- **Your numbers:** [builders' hall](https://example.com/builders) (profile card + leaderboard), or `/builder-start` (shows your credit total).
|
|
176
|
-
- **The diagram:** [`diagrams/03-
|
|
176
|
+
- **The diagram:** [`diagrams/03-example-karma.png`](diagrams/03-example-karma.png) — sources and sinks at a glance.
|
|
177
177
|
- **The decisions:** [ADR 0054](../adr/<redacted>.md) (cost-plus reward), [ADR 0023](../adr/<redacted>.md) (kind multipliers + idea bonus), [ADR 0028](../adr/<redacted>.md) (token→USD pricing).
|
|
178
178
|
- **The code:** `src/bongos/db.js` (`REWARD_MARGIN_PCT`, `KIND_MULTIPLIERS`, `computeSessionTokenReward`), `src/bongos/llm-pricing.js` (pricing), `src/bongos/cost.js` (budget cap), `src/bongos/bfg.js` (builder strength).
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
*Read this before you claim your first work. ~10 minutes.*
|
|
4
4
|
|
|
5
|
-
You're about to build inside
|
|
5
|
+
You're about to build inside Example, a project that runs on a small purpose-built dev system. This primer is the one document that gives you enough context to ask Claude smart questions and ship your first task without getting lost. Read it linearly — it's short on purpose.
|
|
6
6
|
|
|
7
7
|
When you're done, open [/builders](https://example.com/builders) and run `/builder-start`. There's no separate "I have read it" step anymore — reading the primer is on your honor, and the work queue is already open to you.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## What
|
|
11
|
+
## What this project is
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
This primer teaches the **platform** — how you claim work and ship it, the same on every Cloud Bongos instance. *What* you're building here — the product, its world, and its visual style — is specific to this instance and lives in **[`docs/project-context.md`](../project-context.md)**. Read that first for the product; everything below is the build system you'll use to make it.
|
|
14
14
|
|
|
15
15
|
## What the GDS is
|
|
16
16
|
|
|
@@ -66,13 +66,13 @@ Four ranks, in ancient-Greek-civilization order:
|
|
|
66
66
|
|
|
67
67
|
So the sandbox is short: ship three small `newcomer_friendly` tasks and the city opens the whole queue to you on its own (the jump to **Metic** — with its triage/trust powers — is still a deliberate Archon promotion). Rank lives on the `builders.rank` column in the production database and is checked server-side on every privileged request — **with no caching**. A demotion takes effect on your next request. You cannot escalate your own rank by editing local files; the server is the source of truth. See [ADR 0016](../adr/<redacted>.md) and [ADR 0034](../adr/<redacted>.md) for the full trust model.
|
|
68
68
|
|
|
69
|
-
##
|
|
69
|
+
## Example and karma
|
|
70
70
|
|
|
71
|
-
Two parallel reputation tracks. You don't need to *do* anything special to earn either — claim a task, do good work, ship it, and the system tracks both. The full mechanics (formulas, the kind table, the budget cap, every karma source) live in **[
|
|
71
|
+
Two parallel reputation tracks. You don't need to *do* anything special to earn either — claim a task, do good work, ship it, and the system tracks both. The full mechanics (formulas, the kind table, the budget cap, every karma source) live in **[Example & karma — how you get paid](example-and-karma.md)**; here's the shape of it.
|
|
72
72
|
|
|
73
|
-
- **
|
|
73
|
+
- **Example** (called "credits" in code) are your **equity** in the project — a score and a stake, *not* a currency you spend on anything. They only go up, and they persist if you leave and come back. Most of your example now come from a **cost-plus reward on each shipped session**: the server prices the LLM tokens your work actually burned and pays you that real cost **plus 20%** ([ADR 0054](../adr/<redacted>.md)). On top of that, each task pays its `credits_reward` adjusted by the *kind* of work (a captured learning or a resolved blocker is worth 1.5×; cleanup 0.8×), and capturing an idea that someone else then ships earns you a 25% bonus ([ADR 0023](../adr/<redacted>.md)). Credits land at the `completed → confirmed` edge — when verification passes, not at deploy. See the standings on [/builders](https://example.com/builders).
|
|
74
74
|
|
|
75
|
-
- **Karma** is a *separate* signal that measures **peer trust** — how other builders rate the *way* you work, not how much you ship. It's earned when Metic-and-above builders upvote your confirmed work (tallied weekly), when a proposal of yours is ratified, and when you capture ideas; it can also go *down* if you break things. Karma shows up on your profile (with a 30-day trend) and as a sortable column on the leaderboard, and it feeds your "builder strength" score. **It does not gate rank promotions** — those happen automatically by ship count (Xenos → Thetes after three ships) or by an Archon's deliberate decision. A builder who ships fast but breaks things gains
|
|
75
|
+
- **Karma** is a *separate* signal that measures **peer trust** — how other builders rate the *way* you work, not how much you ship. It's earned when Metic-and-above builders upvote your confirmed work (tallied weekly), when a proposal of yours is ratified, and when you capture ideas; it can also go *down* if you break things. Karma shows up on your profile (with a 30-day trend) and as a sortable column on the leaderboard, and it feeds your "builder strength" score. **It does not gate rank promotions** — those happen automatically by ship count (Xenos → Thetes after three ships) or by an Archon's deliberate decision. A builder who ships fast but breaks things gains example and loses karma; a builder who ships thoughtfully gains both.
|
|
76
76
|
|
|
77
77
|
One more thing worth knowing: builders are **uncapped by default** — your spend is tracked (it's the cost side of the same coin the reward is computed from) but never blocks you. There's no default budget. An Archon *can* set a per-builder **monthly budget cap** as a manual brake on a runaway; if one is set for you, you get a warning at 80% and `/builder-ship` pauses at 100% until it's raised ([ADR 0085](../adr/<redacted>.md)).
|
|
78
78
|
|
|
@@ -111,7 +111,7 @@ The whole project's source-of-truth index is [`CLAUDE.md`](../../CLAUDE.md). Two
|
|
|
111
111
|
|
|
112
112
|
Other depth, in roughly the order you'll need it:
|
|
113
113
|
|
|
114
|
-
- [`docs/onboarding/
|
|
114
|
+
- [`docs/onboarding/example-and-karma.md`](example-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/architecture.md`](../architecture.md) — live system: droplet, stack, schema, API surface
|
|
116
116
|
- [`docs/modules-contract.md`](../modules-contract.md) — the product is built as a small core plus swappable `modules/<key>/` (dev boxes, the game, Discord, art, and more); this is the live roster and how a task lands inside one
|
|
117
117
|
- [`docs/canonical-permissions.md`](../canonical-permissions.md) — who can do what (rank gates)
|
|
@@ -190,7 +190,7 @@ If a `/builder-*` command ever says "no GDS session," just run `/builder-setup`
|
|
|
190
190
|
|
|
191
191
|
Run `/builder-start` to see what you can claim — no acknowledgment step needed, the queue is open. New builders see only `newcomer_friendly` tasks — small, well-scoped, easy to finish in one sitting. Pick one that looks interesting, claim it with `/builder-claim N`, do the work, and ship it with `/builder-ship`.
|
|
192
192
|
|
|
193
|
-
When you ship your **first** task,
|
|
193
|
+
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.
|
|
194
194
|
|
|
195
195
|
## Your own dev box
|
|
196
196
|
|
|
@@ -15,7 +15,7 @@ Run by an Archon when investigating an incident, a suspected compromise, or a "w
|
|
|
15
15
|
|---|---|---|
|
|
16
16
|
| `CLAIM` | `claims.claimed_at` | Builder claimed a task — task locked to this session. |
|
|
17
17
|
| `CLAIM_END` | `claims.released_at` + `outcome` | Claim resolved — `outcome` says whether the work shipped, was abandoned, partially completed, or expired. |
|
|
18
|
-
| `CREDIT` | `credit_log.recorded_at` |
|
|
18
|
+
| `CREDIT` | `credit_log.recorded_at` | Example moved (`task.confirmed`, `ship.net_negative`, rank-change audit, etc.) — `delta` is the integer amount. |
|
|
19
19
|
| `COST` | `cost_log.recorded_at` | The builder logged a USD spend — `category` (api / compute / infra / domain / art / other) + `source`. |
|
|
20
20
|
| `SESSION_START` / `SESSION_END` | `session_logs.started_at` / `ended_at` | Claim-scoped working session boundaries. Pair with `outcome` for "shipped / partial / abandoned." |
|
|
21
21
|
| `HTTP_<METHOD>` | `audit_log.recorded_at` | Every authenticated POST / PATCH / PUT / DELETE the builder made — route, status, IP. The forensic fine-grain. |
|
|
@@ -23,7 +23,7 @@ Run by an Archon when investigating an incident, a suspected compromise, or a "w
|
|
|
23
23
|
Notably absent — and worth knowing about so you can ask follow-up questions if needed:
|
|
24
24
|
|
|
25
25
|
- **GET requests** are not in `audit_log` (by design; high volume, low signal). Read patterns aren't part of this replay.
|
|
26
|
-
- **Builder rank changes** show up as `HTTP_PATCH route=/api/gds/builders/:id/rank` rows and as `CREDIT` rows when the rank change carries a
|
|
26
|
+
- **Builder rank changes** show up as `HTTP_PATCH route=/api/gds/builders/:id/rank` rows and as `CREDIT` rows when the rank change carries a example adjustment. The new rank value lives in `audit_log.request_body_redacted`.
|
|
27
27
|
- **Game-server WebSocket events** (movement, world state) live in `world_events` and are NOT included here — this script is GDS-scoped. If a game-side investigation is needed, query `world_events` separately.
|
|
28
28
|
|
|
29
29
|
## Running the script
|
|
@@ -105,7 +105,7 @@ Put these in `/etc/example/box.env` (chmod 600 — **secrets never go in the rep
|
|
|
105
105
|
|
|
106
106
|
## Cost (Criterion C1 / cost)
|
|
107
107
|
|
|
108
|
-
A box accrues compute cost **only while `active`**. At park/deprovision the CLI computes `active hours × the size's hourly rate` and writes it to both the `box_events` ledger and `cost_log` (category `compute`, builder-attributed) — so the public status dashboard's per-builder split sees real box spend. `box.js status` prints the active monthly run-rate + total spent. The **rebill to
|
|
108
|
+
A box accrues compute cost **only while `active`**. At park/deprovision the CLI computes `active hours × the size's hourly rate` and writes it to both the `box_events` ledger and `cost_log` (category `compute`, builder-attributed) — so the public status dashboard's per-builder split sees real box spend. `box.js status` prints the active monthly run-rate + total spent. The **rebill to example/earnings** (org-funded starter → self-fund) is a separate task, [#602](https://example.com/builders#/task/602).
|
|
109
109
|
|
|
110
110
|
## Going live (one-time operator steps)
|
|
111
111
|
|
|
@@ -143,7 +143,7 @@ These spend money and are intentionally manual.
|
|
|
143
143
|
- **[#596](https://example.com/builders#/task/596)** (done) — the devcontainer (box-as-code) this provisions.
|
|
144
144
|
- **[#599](https://example.com/builders#/task/599)** — Claude Desktop managed-settings + the stable-hostname cutover the lifecycle records. (The browser-on-ramp is now the ttyd web terminal over a Cloudflare Tunnel — [#760](https://example.com/builders#/task/760)/[ADR 0038](../adr/<redacted>.md) — not the retired `claude rc` Remote-Control service.)
|
|
145
145
|
- **[#600](https://example.com/builders#/task/600)** — rank-gated **source access**: the scoped GitHub credential the box holds, granted/revoked by rank. [#598](https://example.com/builders#/task/598) records `scope`; [#600](https://example.com/builders#/task/600) enforces it.
|
|
146
|
-
- **[#602](https://example.com/builders#/task/602)** — cost passthrough (org-funded starter → self-fund via the `costs`/
|
|
146
|
+
- **[#602](https://example.com/builders#/task/602)** — cost passthrough (org-funded starter → self-fund via the `costs`/example system). [#598](https://example.com/builders#/task/598) logs the cost; [#602](https://example.com/builders#/task/602) rebills it.
|
|
147
147
|
|
|
148
148
|
## Safety properties
|
|
149
149
|
|
|
@@ -61,7 +61,7 @@ node scripts/gds/design-sync.js --surface hall-ui
|
|
|
61
61
|
Use the DesignSync MCP tool in your Claude Code session:
|
|
62
62
|
|
|
63
63
|
```
|
|
64
|
-
list_projects → pick the OTB project (or create "
|
|
64
|
+
list_projects → pick the OTB project (or create "Example — Design System")
|
|
65
65
|
finalize_plan → stage all files from manifest.files, rooted at bundlePath
|
|
66
66
|
write_files → push the bundle
|
|
67
67
|
```
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Recipe — deploying a Cloud Bongos instance on a pinned core (`git reset` → `npm ci`)
|
|
2
2
|
|
|
3
|
-
> ADR [0108](../adr/<redacted>.md) §4 (configurable-root W4, task [#1884](https://example.com/builders#/task/1884)). How a **consumer instance** — one that installs `@
|
|
3
|
+
> ADR [0108](../adr/<redacted>.md) §4 (configurable-root W4, task [#1884](https://example.com/builders#/task/1884)). How a **consumer instance** — one that installs `@bongos/core` as a versioned npm dependency rather than living in the monorepo — deploys. This is the target the live droplet deploy converts to; the reference implementation is [`scripts/deploy/deploy-instance.sh`](../../scripts/deploy/deploy-instance.sh).
|
|
4
4
|
|
|
5
5
|
## The two models
|
|
6
6
|
|
|
7
7
|
| | Pre-split (today, `example`) | Post-split (consumer instance) |
|
|
8
8
|
|---|---|---|
|
|
9
|
-
| Core code | in-tree (the monorepo) | `node_modules/@
|
|
9
|
+
| Core code | in-tree (the monorepo) | `node_modules/@bongos/core` (a pinned version) |
|
|
10
10
|
| Deploy | [`deploy-prod.sh`](../../scripts/deploy/deploy-prod.sh): `git reset --hard origin/main` on a shared checkout | [`deploy-instance.sh`](../../scripts/deploy/deploy-instance.sh): `git pull` the instance repo → `npm ci` → migrate → restart |
|
|
11
11
|
| Upgrade the core | (n/a — one tree) | bump the pin in `package.json` → `npm ci` → migrate → restart (ADR 0108 §4; the R86 channel, task [#1690](https://example.com/builders#/task/1690)) |
|
|
12
12
|
| `cloudbongos.com` | a 2nd service on the **same** checkout (why it ran stale) | its **own** consumer repo + its own `deploy-instance.sh` |
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
## The flow (`deploy-instance.sh`)
|
|
15
15
|
|
|
16
16
|
1. **`git pull --ff-only origin main`** the *instance* repo — host content only: `config/`, `migrations/instance/`, and the pinned core version in `package.json`.
|
|
17
|
-
2. **`npm ci --omit=dev`** — installs the pinned `@
|
|
17
|
+
2. **`npm ci --omit=dev`** — installs the pinned `@bongos/core` + instance deps. This is what replaces `git reset --hard`: the core is a dependency, so an upgrade is a pin bump + `npm ci`, not a source merge.
|
|
18
18
|
3. **`bash <core>/scripts/migrate.sh`** — the core's **three-root** migrate (W5 / ADR 0108 §5) merges `<core>/migrations` + `<instance>/migrations/instance` + each enabled module's migrations, keyed by namespaced filename stems (`core_NNN_`, `<key>_NNN_`, bare instance) so the two repos never collide. It resolves core-root vs instance-root via `src/instance-config.js`.
|
|
19
19
|
4. **restart the platform** — a systemd unit runs `node <core>/src/platform-server.js` (GDS-only) with `WorkingDirectory` = the instance root (so `resolveInstanceRoot()` resolves to the instance) + `PORT`/`HOST` env; then poll `/healthz`.
|
|
20
20
|
|
|
@@ -32,6 +32,6 @@
|
|
|
32
32
|
## Wiring it on a consumer host (R85/R89)
|
|
33
33
|
|
|
34
34
|
1. Install the script as the droplet's `~/deploy.sh` (the CI deploy key is forced-command-locked to `~/deploy.sh` — ADR 0043 — so it stays hand-installed, like `deploy-prod.sh`).
|
|
35
|
-
2. Create a systemd unit for the instance: `ExecStart=/usr/bin/node <instanceRoot>/node_modules/@
|
|
35
|
+
2. Create a systemd unit for the instance: `ExecStart=/usr/bin/node <instanceRoot>/node_modules/@bongos/core/src/platform-server.js`, `WorkingDirectory=<instanceRoot>`, `Environment=PORT=… HOST=127.0.0.1 <PREFIX>_INSTANCE_ROOT=<instanceRoot>`.
|
|
36
36
|
3. Set `INSTANCE_SERVICE=<unit>` + `PORT=<port>` in the deploy environment.
|
|
37
37
|
4. Front it with TLS and point the origins at the real domain (see [self-host.md](self-host.md)).
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# First run: clone → working instance
|
|
2
|
+
|
|
3
|
+
> The one-shot path from `git clone` of a **standalone Cloud Bongos instance repo**
|
|
4
|
+
> (ADR 0108 — a repo that pins `@cloudbongos/core` as a dependency, e.g. `example-owner/demo`)
|
|
5
|
+
> to a session that can actually claim + ship work. This is for a **builder joining an
|
|
6
|
+
> existing instance**; standing up a *new* instance is `/new-project` (`bongos onboard`).
|
|
7
|
+
|
|
8
|
+
## Why this recipe exists
|
|
9
|
+
|
|
10
|
+
A cloned instance repo ships `config/` + `package.json` + a vendored core tarball, but
|
|
11
|
+
**not** the installed engine. Until you install it there is no `bongos` binary and no
|
|
12
|
+
`scripts/gds/…`, so every `/builder-*` skill fails. An agent that presses on in that
|
|
13
|
+
state has no tools of its own and can fall back on whatever *other* Cloud Bongos instance
|
|
14
|
+
the machine is signed in to — which is how a `demo` clone once offered to write a task
|
|
15
|
+
into the wrong live backlog (2026-07-08). The session-start hook now prints these same
|
|
16
|
+
steps when it detects an uninstalled instance (task 2105); the wrong-instance write it
|
|
17
|
+
used to risk is refused outright (task 2102).
|
|
18
|
+
|
|
19
|
+
## The steps
|
|
20
|
+
|
|
21
|
+
From the repo root, in order:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# 1. Install the engine (the vendored core → node_modules + the `bongos` bin).
|
|
25
|
+
# No registry auth needed: the dependency is a local file: tarball.
|
|
26
|
+
npm install
|
|
27
|
+
|
|
28
|
+
# 2. Sign in to THIS instance (one browser click — no code to paste).
|
|
29
|
+
# Use the instance's own origin — the one in config/branding.json → domains.publicOrigin.
|
|
30
|
+
npx bongos login https://<this-instance-origin>
|
|
31
|
+
|
|
32
|
+
# 3. Confirm you're wired up: this lists what you can claim right now.
|
|
33
|
+
npx bongos start
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
That's it — `bongos claim <id>` / `bongos ship` now work, scoped to this instance.
|
|
37
|
+
|
|
38
|
+
## Notes
|
|
39
|
+
|
|
40
|
+
- **Sign in to the RIGHT instance.** `bongos login <url>` writes a per-instance session
|
|
41
|
+
(`session.api_base`), and the CLI **refuses to act** if the session it would use belongs
|
|
42
|
+
to a different instance than this repo is configured for (task 2102). If you see that
|
|
43
|
+
refusal, re-run `bongos login` with *this* instance's origin.
|
|
44
|
+
- **Which origin?** `config/branding.json` → `domains.publicOrigin`. `GET <origin>/api/bongos`
|
|
45
|
+
also re-advertises an instance's own hall/status/docs origins (the docs-discovery contract,
|
|
46
|
+
ADR 0114).
|
|
47
|
+
- **Invite-only by default.** A brand-new GitHub account isn't admitted until an Archon
|
|
48
|
+
approves it; `bongos login` files the request and waits, then finishes sign-in.
|
|
49
|
+
- **The engine lives in the package, not the repo.** `bongos` resolves the heavy CLI inside
|
|
50
|
+
`node_modules/@cloudbongos/core`; that's why step 1 must come first. On a machine with the
|
|
51
|
+
core installed globally you can drop the `npx`.
|
|
@@ -119,7 +119,7 @@ Organized by topic, not chronology. New entries go in the matching section; crea
|
|
|
119
119
|
|
|
120
120
|
- **Symptom:** Visitor clicks "Sign in with GitHub" on /builders, GitHub renders its red "Be careful!" warning page or returns `?error=redirect_uri_mismatch`, and the visitor never lands back on the hall.
|
|
121
121
|
- **Root cause:** The GitHub OAuth app's **Authorization callback URL** field must match exactly what the server tells GitHub. Our server sends `${publicOrigin}/api/gds/auth/web/callback` — easy to misconfigure as just `https://example.com/` or `/auth/callback` when registering a fresh OAuth app.
|
|
122
|
-
- **Fix:** In github.com → Settings → Developer settings → OAuth Apps → (the
|
|
122
|
+
- **Fix:** In github.com → Settings → Developer settings → OAuth Apps → (the Example app) → **Authorization callback URL**, set:
|
|
123
123
|
```
|
|
124
124
|
https://example.com/api/gds/auth/web/callback
|
|
125
125
|
```
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> Implements [ADR 0100 §1](../adr/<redacted>.md) (the two-repo instance model). This is **R84**, the first step of the `R84 → R85 → R86` spine: package the core → stand a downstream instance up on a pinned core → make `bongos upgrade` a real update channel. Tooling: [`scripts/gds/package-core.js`](../../scripts/gds/package-core.js) (`bongos package-core`).
|
|
4
4
|
>
|
|
5
|
-
> **Real installable npm package ([ADR 0108](../adr/<redacted>.md) §2, task 1882/W2, shipped):** the artifact is `package/`-rooted (the npm convention `npm install ./x.tgz` requires) and carries a synthesized `package.json` — `name: "@
|
|
5
|
+
> **Real installable npm package ([ADR 0108](../adr/<redacted>.md) §2, task 1882/W2, shipped):** the artifact is `package/`-rooted (the npm convention `npm install ./x.tgz` requires) and carries a synthesized `package.json` — `name: "@bongos/core"`, `version` = `CORE_VERSION`, `main: "src/platform-server.js"`, `exports` for the default entry (`buildPlatformApp`) plus `./serve-internal` (`mountInternalSurfaces`) and `./module-api`, `bin: "bongos"` — and a **pruned** `package-lock.json` (express + pg's own transitive closure only, resolved offline from the source lockfile — no colyseus/phaser/sharp/discord.js). Both files are synthesized fresh, never copied verbatim from the source repo's game-heavy `package.json`. `resolveCoreRoot()`/`resolveInstanceRoot()` ([`src/instance-config.js`](../../src/instance-config.js), W1/task 1881) are what a consumer's own code routes through once installed.
|
|
6
6
|
|
|
7
7
|
## What the artifact is
|
|
8
8
|
|
|
@@ -12,9 +12,9 @@ A Cloud Bongos *instance* can be its **own repository** that installs a **pinned
|
|
|
12
12
|
|
|
13
13
|
| Output | What it is |
|
|
14
14
|
|---|---|
|
|
15
|
-
| `
|
|
16
|
-
| `
|
|
17
|
-
| `
|
|
15
|
+
| `bongos-core-<version>.tgz` | the installable unit — a gzip'd tar of the redacted core tree, rooted at `package/` (the npm convention `npm install ./x.tgz` requires), carrying a synthesized `@bongos/core` `package.json` + pruned `package-lock.json` (task 1882) |
|
|
16
|
+
| `bongos-core-<version>.manifest.json` | the **pin** — version, source commit, per-file hashes, and the tree hash a consumer verifies against |
|
|
17
|
+
| `bongos-core-<version>/` | the same redacted tree unpacked, for inspection |
|
|
18
18
|
|
|
19
19
|
The version is the **platform version** — `CORE_VERSION` from [`src/module-api.js`](../../src/module-api.js), the same coordinate the module loader and `bongos upgrade` compare against ([#1203](https://example.com/builders#/task/1203)). That shared coordinate is what keeps the spine coherent: a module pinned to `^core_contract` is guaranteed to load against the packaged core.
|
|
20
20
|
|
|
@@ -36,7 +36,7 @@ If the no-leak gate fails, it names the file + the residual literal. Fix the red
|
|
|
36
36
|
|
|
37
37
|
A downstream instance repo:
|
|
38
38
|
|
|
39
|
-
1. **Installs** the `.tgz` — `npm install ./
|
|
39
|
+
1. **Installs** the `.tgz` — `npm install ./bongos-core-<version>.tgz` (or a fetched-in-CI path) — which lands it at `node_modules/@bongos/core/`, a directory the consumer does not hand-edit.
|
|
40
40
|
2. **Pins** by recording `core_version` + `source_commit` + `tree_sha256` from the manifest.
|
|
41
41
|
3. **Verifies** the install by recomputing `tree_sha256` from the unpacked tree — for each core file, `sha256(content)` with a canonical mode (`0000644`/`0000755`), then `sha256` over the sorted `"<path> <mode> <filesha>"` lines. It must equal the manifest's `tree_sha256`. The tree hash is **compression-independent**, so it is a stable pin even though `.tgz` bytes are an implementation detail (`tarball.sha256` separately verifies the exact download).
|
|
42
42
|
|