@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/api/openapi.json
CHANGED
|
@@ -4281,6 +4281,56 @@
|
|
|
4281
4281
|
}
|
|
4282
4282
|
},
|
|
4283
4283
|
"/goals/{id}/requests": {
|
|
4284
|
+
"get": {
|
|
4285
|
+
"operationId": "get_goals_id_requests",
|
|
4286
|
+
"tags": [
|
|
4287
|
+
"goals"
|
|
4288
|
+
],
|
|
4289
|
+
"summary": "GET /goals/:id/requests",
|
|
4290
|
+
"description": "GET /goals/:id/requests — the goal's own pending invite/join-request queue (task 1953): every pending row on THIS goal, both kinds — outstanding invites the goal has sent (awaiting the invitee) and join-requests awaiting approval. db.listPendingRequestsForGoal was built for this route in task 1952's landing but never wired to HTTP; this is the goals-page manager view alongside the cross-goal GET /goals/inbox. rank: any-builder (requireBuilder) + the in-handler owner|manager|Archon gate (authorizeGoalManagement) — same wall as visibility/invite/request-respond.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
4291
|
+
"x-rank": "any-builder",
|
|
4292
|
+
"x-source": "modules/lifecycle/routes/goals.js",
|
|
4293
|
+
"parameters": [
|
|
4294
|
+
{
|
|
4295
|
+
"name": "id",
|
|
4296
|
+
"in": "path",
|
|
4297
|
+
"required": true,
|
|
4298
|
+
"schema": {
|
|
4299
|
+
"type": "string"
|
|
4300
|
+
},
|
|
4301
|
+
"description": "Path parameter `id`."
|
|
4302
|
+
}
|
|
4303
|
+
],
|
|
4304
|
+
"responses": {
|
|
4305
|
+
"200": {
|
|
4306
|
+
"description": "Success.",
|
|
4307
|
+
"content": {
|
|
4308
|
+
"application/json": {
|
|
4309
|
+
"schema": {
|
|
4310
|
+
"$ref": "#/components/schemas/GetGoalsIdRequestsResponse"
|
|
4311
|
+
}
|
|
4312
|
+
}
|
|
4313
|
+
}
|
|
4314
|
+
},
|
|
4315
|
+
"400": {
|
|
4316
|
+
"$ref": "#/components/responses/BadRequest"
|
|
4317
|
+
},
|
|
4318
|
+
"401": {
|
|
4319
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
4320
|
+
},
|
|
4321
|
+
"403": {
|
|
4322
|
+
"$ref": "#/components/responses/Forbidden"
|
|
4323
|
+
},
|
|
4324
|
+
"404": {
|
|
4325
|
+
"$ref": "#/components/responses/NotFound"
|
|
4326
|
+
}
|
|
4327
|
+
},
|
|
4328
|
+
"security": [
|
|
4329
|
+
{
|
|
4330
|
+
"builderSession": []
|
|
4331
|
+
}
|
|
4332
|
+
]
|
|
4333
|
+
},
|
|
4284
4334
|
"post": {
|
|
4285
4335
|
"operationId": "post_goals_id_requests",
|
|
4286
4336
|
"tags": [
|
|
@@ -4415,6 +4465,67 @@
|
|
|
4415
4465
|
]
|
|
4416
4466
|
}
|
|
4417
4467
|
},
|
|
4468
|
+
"/goals/{id}/requests/{reqId}/withdraw": {
|
|
4469
|
+
"post": {
|
|
4470
|
+
"operationId": "post_goals_id_requests_reqId_withdraw",
|
|
4471
|
+
"tags": [
|
|
4472
|
+
"goals"
|
|
4473
|
+
],
|
|
4474
|
+
"summary": "POST /goals/:id/requests/:reqId/withdraw",
|
|
4475
|
+
"description": "POST /goals/:id/requests/:reqId/withdraw — the requester cancels their OWN pending join-request (task 1953): the symmetric self-served mirror of a manager's deny. Sets status='cancelled' (kept as the audit trail, like a deny's 'rejected'); never touches an invitation row. rank: any-builder (requireBuilder) + the in-handler authorizeWithdrawJoinRequest.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
4476
|
+
"x-rank": "any-builder",
|
|
4477
|
+
"x-source": "modules/lifecycle/routes/goals.js",
|
|
4478
|
+
"parameters": [
|
|
4479
|
+
{
|
|
4480
|
+
"name": "id",
|
|
4481
|
+
"in": "path",
|
|
4482
|
+
"required": true,
|
|
4483
|
+
"schema": {
|
|
4484
|
+
"type": "string"
|
|
4485
|
+
},
|
|
4486
|
+
"description": "Path parameter `id`."
|
|
4487
|
+
},
|
|
4488
|
+
{
|
|
4489
|
+
"name": "reqId",
|
|
4490
|
+
"in": "path",
|
|
4491
|
+
"required": true,
|
|
4492
|
+
"schema": {
|
|
4493
|
+
"type": "string"
|
|
4494
|
+
},
|
|
4495
|
+
"description": "Path parameter `reqId`."
|
|
4496
|
+
}
|
|
4497
|
+
],
|
|
4498
|
+
"responses": {
|
|
4499
|
+
"200": {
|
|
4500
|
+
"description": "Success.",
|
|
4501
|
+
"content": {
|
|
4502
|
+
"application/json": {
|
|
4503
|
+
"schema": {
|
|
4504
|
+
"$ref": "#/components/schemas/PostGoalsIdRequestsReqIdWithdrawResponse"
|
|
4505
|
+
}
|
|
4506
|
+
}
|
|
4507
|
+
}
|
|
4508
|
+
},
|
|
4509
|
+
"400": {
|
|
4510
|
+
"$ref": "#/components/responses/BadRequest"
|
|
4511
|
+
},
|
|
4512
|
+
"401": {
|
|
4513
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
4514
|
+
},
|
|
4515
|
+
"403": {
|
|
4516
|
+
"$ref": "#/components/responses/Forbidden"
|
|
4517
|
+
},
|
|
4518
|
+
"404": {
|
|
4519
|
+
"$ref": "#/components/responses/NotFound"
|
|
4520
|
+
}
|
|
4521
|
+
},
|
|
4522
|
+
"security": [
|
|
4523
|
+
{
|
|
4524
|
+
"builderSession": []
|
|
4525
|
+
}
|
|
4526
|
+
]
|
|
4527
|
+
}
|
|
4528
|
+
},
|
|
4418
4529
|
"/goals/{id}/scope": {
|
|
4419
4530
|
"post": {
|
|
4420
4531
|
"operationId": "post_goals_id_scope",
|
|
@@ -6586,6 +6697,44 @@
|
|
|
6586
6697
|
]
|
|
6587
6698
|
}
|
|
6588
6699
|
},
|
|
6700
|
+
"/modules/submissions": {
|
|
6701
|
+
"get": {
|
|
6702
|
+
"operationId": "get_modules_submissions",
|
|
6703
|
+
"tags": [
|
|
6704
|
+
"modules"
|
|
6705
|
+
],
|
|
6706
|
+
"summary": "GET /modules/submissions",
|
|
6707
|
+
"description": "GET /api/gds/modules/submissions?status=&module_key= — the upstreaming review queue (task 1771 reads this). Metadata only — no file contents (a future GET .../:id can add a with-files fetch if the review UI needs it). rank: metic+archon — the review queue, same rank as filing into it.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).",
|
|
6708
|
+
"x-rank": "metic+archon",
|
|
6709
|
+
"x-source": "src/bongos/routes/modules.js",
|
|
6710
|
+
"responses": {
|
|
6711
|
+
"200": {
|
|
6712
|
+
"description": "Success.",
|
|
6713
|
+
"content": {
|
|
6714
|
+
"application/json": {
|
|
6715
|
+
"schema": {
|
|
6716
|
+
"$ref": "#/components/schemas/GetModulesSubmissionsResponse"
|
|
6717
|
+
}
|
|
6718
|
+
}
|
|
6719
|
+
}
|
|
6720
|
+
},
|
|
6721
|
+
"400": {
|
|
6722
|
+
"$ref": "#/components/responses/BadRequest"
|
|
6723
|
+
},
|
|
6724
|
+
"401": {
|
|
6725
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
6726
|
+
},
|
|
6727
|
+
"403": {
|
|
6728
|
+
"$ref": "#/components/responses/Forbidden"
|
|
6729
|
+
}
|
|
6730
|
+
},
|
|
6731
|
+
"security": [
|
|
6732
|
+
{
|
|
6733
|
+
"builderSession": []
|
|
6734
|
+
}
|
|
6735
|
+
]
|
|
6736
|
+
}
|
|
6737
|
+
},
|
|
6589
6738
|
"/modules/{key}/enable": {
|
|
6590
6739
|
"post": {
|
|
6591
6740
|
"operationId": "post_modules_key_enable",
|
|
@@ -6656,7 +6805,7 @@
|
|
|
6656
6805
|
"modules"
|
|
6657
6806
|
],
|
|
6658
6807
|
"summary": "POST /modules/:key/submit",
|
|
6659
|
-
"description": "
|
|
6808
|
+
"description": "POST /api/gds/modules/:key/submit — ADR 0107 §1 upstreaming submission. task 1770. Body: { signed_by?: \"Name <email>\" }. Re-runs the §4 AGPL/publish pre-check + requires a DCO-style sign-off against THIS box's OWN on-disk copy of modules/:key (the authoritative check — a local `bongos module check` pass on a builder's box is a courtesy, not proof, if the module's changes aren't committed + shipped + deployed here yet). signed_by records a NEW sign-off only if none is on file; an existing .upstream-signoff.json is reused as-is (not overwritten). rank: metic+archon — files into a shared review queue, not just a toggle for the caller.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).",
|
|
6660
6809
|
"x-rank": "metic+archon",
|
|
6661
6810
|
"x-source": "src/bongos/routes/modules.js",
|
|
6662
6811
|
"parameters": [
|
|
@@ -6670,12 +6819,30 @@
|
|
|
6670
6819
|
"description": "Path parameter `key`."
|
|
6671
6820
|
}
|
|
6672
6821
|
],
|
|
6822
|
+
"requestBody": {
|
|
6823
|
+
"required": false,
|
|
6824
|
+
"content": {
|
|
6825
|
+
"application/json": {
|
|
6826
|
+
"schema": {
|
|
6827
|
+
"$ref": "#/components/schemas/PostModulesKeySubmitRequest"
|
|
6828
|
+
}
|
|
6829
|
+
}
|
|
6830
|
+
},
|
|
6831
|
+
"x-validated": true
|
|
6832
|
+
},
|
|
6673
6833
|
"responses": {
|
|
6674
6834
|
"200": {
|
|
6675
|
-
"description": "Success."
|
|
6835
|
+
"description": "Success.",
|
|
6836
|
+
"content": {
|
|
6837
|
+
"application/json": {
|
|
6838
|
+
"schema": {
|
|
6839
|
+
"$ref": "#/components/schemas/PostModulesKeySubmitResponse"
|
|
6840
|
+
}
|
|
6841
|
+
}
|
|
6842
|
+
}
|
|
6676
6843
|
},
|
|
6677
6844
|
"400": {
|
|
6678
|
-
"$ref": "#/components/responses/
|
|
6845
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
6679
6846
|
},
|
|
6680
6847
|
"401": {
|
|
6681
6848
|
"$ref": "#/components/responses/Unauthorized"
|
|
@@ -6878,6 +7045,34 @@
|
|
|
6878
7045
|
"security": []
|
|
6879
7046
|
}
|
|
6880
7047
|
},
|
|
7048
|
+
"/provisioning/github-app/status": {
|
|
7049
|
+
"get": {
|
|
7050
|
+
"operationId": "get_provisioning_github_app_status",
|
|
7051
|
+
"tags": [
|
|
7052
|
+
"provisioning"
|
|
7053
|
+
],
|
|
7054
|
+
"summary": "GET /provisioning/github-app/status",
|
|
7055
|
+
"description": "GET /provisioning/github-app/status?state=<> — the PUBLIC progress read the onboarding callback page polls (task 2096) to know when setup is done + where to send the owner. Same public-by-state model as the callback: the unguessable, single-use `state` token is the only key, and the response reveals only the manifest lifecycle status + the instance's own (already-public) domain — never a secret. Per-IP rate-limited because the page polls it every ~3s. `ready` is true iff the manifest reached 'done' (creds placed + /healthz verified) — the page then auto-redirects to https://<domain>. rank: public — no session, no mutation, no secret; an unknown state is a 404 no-op.\n\n**Rank:** `public` — No authentication — any caller.",
|
|
7056
|
+
"x-rank": "public",
|
|
7057
|
+
"x-source": "modules/provisioning/routes/provisioning.js",
|
|
7058
|
+
"responses": {
|
|
7059
|
+
"200": {
|
|
7060
|
+
"description": "Success.",
|
|
7061
|
+
"content": {
|
|
7062
|
+
"application/json": {
|
|
7063
|
+
"schema": {
|
|
7064
|
+
"$ref": "#/components/schemas/GetProvisioningGithubAppStatusResponse"
|
|
7065
|
+
}
|
|
7066
|
+
}
|
|
7067
|
+
}
|
|
7068
|
+
},
|
|
7069
|
+
"400": {
|
|
7070
|
+
"$ref": "#/components/responses/BadRequest"
|
|
7071
|
+
}
|
|
7072
|
+
},
|
|
7073
|
+
"security": []
|
|
7074
|
+
}
|
|
7075
|
+
},
|
|
6881
7076
|
"/provisioning/health": {
|
|
6882
7077
|
"get": {
|
|
6883
7078
|
"operationId": "get_provisioning_health",
|
|
@@ -7203,6 +7398,34 @@
|
|
|
7203
7398
|
]
|
|
7204
7399
|
}
|
|
7205
7400
|
},
|
|
7401
|
+
"/provisioning/onboard-plan": {
|
|
7402
|
+
"get": {
|
|
7403
|
+
"operationId": "get_provisioning_onboard_plan",
|
|
7404
|
+
"tags": [
|
|
7405
|
+
"provisioning"
|
|
7406
|
+
],
|
|
7407
|
+
"summary": "GET /provisioning/onboard-plan",
|
|
7408
|
+
"description": "GET /provisioning/onboard-plan?mode=greenfield|adopt — the CANONICAL onboarding step sequence (task 2085; goal 35 / criterion 165: \"the canonical step sequence is the source of truth; skill/CLI/hall are forms over it\"). The branded /create page + the hall wizard fetch it so their human-steps checklist can't drift from the CLI's (scripts/gds/onboard.js reads the same modules/provisioning/onboard-plan.js). rank: public — the signed-out /create landing page reads it; it is the same public runbook the /new-project skill documents (no write, no secret).\n\n**Rank:** `public` — No authentication — any caller.",
|
|
7409
|
+
"x-rank": "public",
|
|
7410
|
+
"x-source": "modules/provisioning/routes/provisioning.js",
|
|
7411
|
+
"responses": {
|
|
7412
|
+
"200": {
|
|
7413
|
+
"description": "Success.",
|
|
7414
|
+
"content": {
|
|
7415
|
+
"application/json": {
|
|
7416
|
+
"schema": {
|
|
7417
|
+
"$ref": "#/components/schemas/GetProvisioningOnboardPlanResponse"
|
|
7418
|
+
}
|
|
7419
|
+
}
|
|
7420
|
+
}
|
|
7421
|
+
},
|
|
7422
|
+
"400": {
|
|
7423
|
+
"$ref": "#/components/responses/BadRequest"
|
|
7424
|
+
}
|
|
7425
|
+
},
|
|
7426
|
+
"security": []
|
|
7427
|
+
}
|
|
7428
|
+
},
|
|
7206
7429
|
"/provisioning/tls-check": {
|
|
7207
7430
|
"get": {
|
|
7208
7431
|
"operationId": "get_provisioning_tls_check",
|
|
@@ -10250,6 +10473,15 @@
|
|
|
10250
10473
|
"cross_goals_considered"
|
|
10251
10474
|
]
|
|
10252
10475
|
},
|
|
10476
|
+
"GetGoalsIdRequestsResponse": {
|
|
10477
|
+
"type": "object",
|
|
10478
|
+
"properties": {
|
|
10479
|
+
"requests": {}
|
|
10480
|
+
},
|
|
10481
|
+
"required": [
|
|
10482
|
+
"requests"
|
|
10483
|
+
]
|
|
10484
|
+
},
|
|
10253
10485
|
"GetGoalsIdResponse": {
|
|
10254
10486
|
"type": "object",
|
|
10255
10487
|
"properties": {
|
|
@@ -10530,6 +10762,15 @@
|
|
|
10530
10762
|
"submit_pipeline_live"
|
|
10531
10763
|
]
|
|
10532
10764
|
},
|
|
10765
|
+
"GetModulesSubmissionsResponse": {
|
|
10766
|
+
"type": "object",
|
|
10767
|
+
"properties": {
|
|
10768
|
+
"submissions": {}
|
|
10769
|
+
},
|
|
10770
|
+
"required": [
|
|
10771
|
+
"submissions"
|
|
10772
|
+
]
|
|
10773
|
+
},
|
|
10533
10774
|
"GetOverrideRequestsResponse": {
|
|
10534
10775
|
"type": "object",
|
|
10535
10776
|
"properties": {
|
|
@@ -10548,6 +10789,27 @@
|
|
|
10548
10789
|
"instances"
|
|
10549
10790
|
]
|
|
10550
10791
|
},
|
|
10792
|
+
"GetProvisioningGithubAppStatusResponse": {
|
|
10793
|
+
"type": "object",
|
|
10794
|
+
"properties": {
|
|
10795
|
+
"ok": {
|
|
10796
|
+
"type": "boolean"
|
|
10797
|
+
},
|
|
10798
|
+
"status": {},
|
|
10799
|
+
"ready": {},
|
|
10800
|
+
"terminal": {},
|
|
10801
|
+
"domain": {},
|
|
10802
|
+
"instance_status": {}
|
|
10803
|
+
},
|
|
10804
|
+
"required": [
|
|
10805
|
+
"ok",
|
|
10806
|
+
"status",
|
|
10807
|
+
"ready",
|
|
10808
|
+
"terminal",
|
|
10809
|
+
"domain",
|
|
10810
|
+
"instance_status"
|
|
10811
|
+
]
|
|
10812
|
+
},
|
|
10551
10813
|
"GetProvisioningHealthResponse": {
|
|
10552
10814
|
"type": "object",
|
|
10553
10815
|
"properties": {
|
|
@@ -10583,6 +10845,17 @@
|
|
|
10583
10845
|
"instances"
|
|
10584
10846
|
]
|
|
10585
10847
|
},
|
|
10848
|
+
"GetProvisioningOnboardPlanResponse": {
|
|
10849
|
+
"type": "object",
|
|
10850
|
+
"properties": {
|
|
10851
|
+
"mode": {},
|
|
10852
|
+
"steps": {}
|
|
10853
|
+
},
|
|
10854
|
+
"required": [
|
|
10855
|
+
"mode",
|
|
10856
|
+
"steps"
|
|
10857
|
+
]
|
|
10858
|
+
},
|
|
10586
10859
|
"GetPublicBlockersIdResponse": {
|
|
10587
10860
|
"type": "object",
|
|
10588
10861
|
"properties": {
|
|
@@ -12305,6 +12578,19 @@
|
|
|
12305
12578
|
"request"
|
|
12306
12579
|
]
|
|
12307
12580
|
},
|
|
12581
|
+
"PostGoalsIdRequestsReqIdWithdrawResponse": {
|
|
12582
|
+
"type": "object",
|
|
12583
|
+
"properties": {
|
|
12584
|
+
"ok": {
|
|
12585
|
+
"type": "boolean"
|
|
12586
|
+
},
|
|
12587
|
+
"request": {}
|
|
12588
|
+
},
|
|
12589
|
+
"required": [
|
|
12590
|
+
"ok",
|
|
12591
|
+
"request"
|
|
12592
|
+
]
|
|
12593
|
+
},
|
|
12308
12594
|
"PostGoalsIdRequestsRequest": {
|
|
12309
12595
|
"type": "object",
|
|
12310
12596
|
"properties": {
|
|
@@ -12807,6 +13093,29 @@
|
|
|
12807
13093
|
"note"
|
|
12808
13094
|
]
|
|
12809
13095
|
},
|
|
13096
|
+
"PostModulesKeySubmitRequest": {
|
|
13097
|
+
"type": "object",
|
|
13098
|
+
"properties": {
|
|
13099
|
+
"signed_by": {
|
|
13100
|
+
"type": "string",
|
|
13101
|
+
"maxLength": 200
|
|
13102
|
+
}
|
|
13103
|
+
},
|
|
13104
|
+
"additionalProperties": false
|
|
13105
|
+
},
|
|
13106
|
+
"PostModulesKeySubmitResponse": {
|
|
13107
|
+
"type": "object",
|
|
13108
|
+
"properties": {
|
|
13109
|
+
"ok": {
|
|
13110
|
+
"type": "boolean"
|
|
13111
|
+
},
|
|
13112
|
+
"submission": {}
|
|
13113
|
+
},
|
|
13114
|
+
"required": [
|
|
13115
|
+
"ok",
|
|
13116
|
+
"submission"
|
|
13117
|
+
]
|
|
13118
|
+
},
|
|
12810
13119
|
"PostOverrideRequestsIdDecideRequest": {
|
|
12811
13120
|
"type": "object",
|
|
12812
13121
|
"properties": {
|
|
@@ -13712,9 +14021,9 @@
|
|
|
13712
14021
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
13713
14022
|
}
|
|
13714
14023
|
},
|
|
13715
|
-
"x-endpoint-count":
|
|
13716
|
-
"x-schema-count":
|
|
14024
|
+
"x-endpoint-count": 229,
|
|
14025
|
+
"x-schema-count": 250,
|
|
13717
14026
|
"x-undocumented-bodies": 8,
|
|
13718
|
-
"x-response-schemas":
|
|
14027
|
+
"x-response-schemas": 170,
|
|
13719
14028
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
13720
14029
|
}
|
package/docs/api-reference.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# GDS API reference
|
|
4
4
|
|
|
5
|
-
> **Generated from the live route files** — the route file is authoritative.
|
|
5
|
+
> **Generated from the live route files** — the route file is authoritative. 229 endpoints across 38 route files.
|
|
6
6
|
> Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
|
|
7
7
|
|
|
8
8
|
Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -181,7 +181,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
181
181
|
| GET | `/api/bongos/gate-approvals` | `archon` | — | GET /gate-approvals — open PRs awaiting owner approval (gate-review red), with the verdict + per-file reasons + changed files + diff link. |
|
|
182
182
|
| POST | `/api/bongos/gate-approvals/:pr/approve` | `archon` | — | POST /gate-approvals/:pr/approve — record owner approval for a stuck gate PR and re-run the gate-review check so it clears. |
|
|
183
183
|
|
|
184
|
-
## `goals` (
|
|
184
|
+
## `goals` (23)
|
|
185
185
|
|
|
186
186
|
| Method | Path | Rank | Body | Description |
|
|
187
187
|
|---|---|---|---|---|
|
|
@@ -198,8 +198,10 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
198
198
|
| POST | `/api/bongos/goals/:id/members` | `any-builder` | `role`, `builder_id` | POST /goals/:id/members — the goal's own authority (owner \| manager \| Archon) invites a builder to the goal (task 1762: widened from Arch… |
|
|
199
199
|
| PATCH | `/api/bongos/goals/:id/members/:builderId` | `any-builder` | `role` | PATCH /goals/:id/members/:builderId — role management by the goal's own authority (task 1735): the owner, a manager, or an Archon promote… |
|
|
200
200
|
| POST | `/api/bongos/goals/:id/reopen` | `metic+archon` | — | POST /goals/:id/reopen — bring an archived goal back to open (ADR 0086 §6 / BV1.R64). |
|
|
201
|
+
| GET | `/api/bongos/goals/:id/requests` | `any-builder` | — | GET /goals/:id/requests — the goal's own pending invite/join-request queue (task 1953): every pending row on THIS goal, both kinds — outs… |
|
|
201
202
|
| POST | `/api/bongos/goals/:id/requests` | `any-builder` | `note` | POST /goals/:id/requests — a builder asks to join a (private or protected) goal (task 1952 / ADR 0112). |
|
|
202
203
|
| POST | `/api/bongos/goals/:id/requests/:reqId/respond` | `any-builder` | `action` | POST /goals/:id/requests/:reqId/respond { action: approve\|deny } — an owner\| manager\|Archon resolves a pending join-request (task 1952). |
|
|
204
|
+
| POST | `/api/bongos/goals/:id/requests/:reqId/withdraw` | `any-builder` | — | POST /goals/:id/requests/:reqId/withdraw — the requester cancels their OWN pending join-request (task 1953): the symmetric self-served mi… |
|
|
203
205
|
| POST | `/api/bongos/goals/:id/scope` | `metic+archon` | `add` | POST /goals/:id/scope — "ask to widen": add module(s) to a goal's scope_modules (ADR 0086 §4 / BV1.R64). |
|
|
204
206
|
| POST | `/api/bongos/goals/:id/tasks` | `any-builder` | `title`, `description`, `touches`, `est_minutes`, `priority`, `kind`, `discipline`, `value_summary`, `parent_task_id` | POST /goals/:id/tasks — bounded task authoring within a goal's scope (BV1.R60 / ADR 0086 §3). |
|
|
205
207
|
| POST | `/api/bongos/goals/:id/transfer` | `any-builder` | `builder_id` | POST /goals/:id/transfer — hand the goal to a new owner (task 1735). |
|
|
@@ -303,13 +305,14 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
303
305
|
| GET | `/api/bongos/memory/files` | `any-builder` | — | GET /memory/files — list the AUTHENTICATED builder's memory files (metadata only, no content). |
|
|
304
306
|
| POST | `/api/bongos/memory/sync` | `any-builder` | `files` | POST /memory/sync — push a builder's local memory files to the server. |
|
|
305
307
|
|
|
306
|
-
## `modules` (
|
|
308
|
+
## `modules` (4)
|
|
307
309
|
|
|
308
310
|
| Method | Path | Rank | Body | Description |
|
|
309
311
|
|---|---|---|---|---|
|
|
310
312
|
| GET | `/api/bongos/modules` | `any-builder` | — | list every on-disk module with attribution + provenance (same read gate as the atlas/primer pages). |
|
|
311
313
|
| POST | `/api/bongos/modules/:key/enable` | `metic+archon` | `enabled` | toggling a module changes running behavior for the whole instance, not just the caller. |
|
|
312
|
-
| POST | `/api/bongos/modules/:key/submit` | `metic+archon` |
|
|
314
|
+
| POST | `/api/bongos/modules/:key/submit` | `metic+archon` | `signed_by` | POST /api/gds/modules/:key/submit — ADR 0107 §1 upstreaming submission. |
|
|
315
|
+
| GET | `/api/bongos/modules/submissions` | `metic+archon` | — | GET /api/gds/modules/submissions?status=&module_key= — the upstreaming review queue (task 1771 reads this). |
|
|
313
316
|
|
|
314
317
|
## `override-requests` (2)
|
|
315
318
|
|
|
@@ -318,13 +321,14 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
318
321
|
| GET | `/api/bongos/override-requests` | `archon` | — | GET /override-requests?status=open — Archon queue. |
|
|
319
322
|
| POST | `/api/bongos/override-requests/:id/decide` | `archon` | `decision`, `note` | POST /override-requests/:id/decide — body: { decision: 'approve'\|'deny', note? } On approve, atomically flips the task completed→confirme… |
|
|
320
323
|
|
|
321
|
-
## `provisioning` (
|
|
324
|
+
## `provisioning` (13)
|
|
322
325
|
|
|
323
326
|
| Method | Path | Rank | Body | Description |
|
|
324
327
|
|---|---|---|---|---|
|
|
325
328
|
| GET | `/api/bongos/provisioning/fleet` | `archon` | — | GET /provisioning/fleet — the full instance roster across all owners. |
|
|
326
329
|
| GET | `/api/bongos/provisioning/fleet/cost-ledger` | `archon` | — | GET /provisioning/fleet/cost-ledger — per-instance monthly estimate + total. |
|
|
327
330
|
| GET | `/api/bongos/provisioning/github-app/callback` | `public` | — | GET /provisioning/github-app/callback?code=&state= — GitHub redirects the owner's BROWSER here after they approve the App Manifest (task … |
|
|
331
|
+
| GET | `/api/bongos/provisioning/github-app/status` | `public` | — | GET /provisioning/github-app/status?state=<> — the PUBLIC progress read the onboarding callback page polls (task 2096) to know when setup… |
|
|
328
332
|
| GET | `/api/bongos/provisioning/health` | `public` | — | GET /provisioning/health — liveness + the core version this module mounted against. |
|
|
329
333
|
| GET | `/api/bongos/provisioning/instances` | `any-builder` | — | GET /provisioning/instances — the caller's own instances + each open intent. |
|
|
330
334
|
| POST | `/api/bongos/provisioning/instances` | `any-builder` | `slug`, `target_ref`, `hosting_shape`, `domain`, `tier` | POST /provisioning/instances — request a new instance. |
|
|
@@ -332,6 +336,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
332
336
|
| POST | `/api/bongos/provisioning/instances/:id/force-teardown` | `archon` | — | POST /provisioning/instances/:id/force-teardown — Archon tears down ANY instance. |
|
|
333
337
|
| POST | `/api/bongos/provisioning/instances/:id/github-app` | `any-builder` | `account` | POST /provisioning/instances/:id/github-app — mint a GitHub-App-Manifest onboarding link for the caller's OWN instance (task 2080, ADR 01… |
|
|
334
338
|
| POST | `/api/bongos/provisioning/instances/:id/teardown` | `any-builder` | — | POST /provisioning/instances/:id/teardown — request teardown of the caller's OWN instance. |
|
|
339
|
+
| GET | `/api/bongos/provisioning/onboard-plan` | `public` | — | GET /provisioning/onboard-plan?mode=greenfield\|adopt — the CANONICAL onboarding step sequence (task 2085; goal 35 / criterion 165: "the c… |
|
|
335
340
|
| GET | `/api/bongos/provisioning/tls-check` | `public` | — | GET /provisioning/tls-check?domain=<host> — the Caddy on-demand-TLS ALLOW-LIST (ADR 0111 §4, task P4 task 1945). |
|
|
336
341
|
|
|
337
342
|
## `public` (18)
|
package/docs/architecture.md
CHANGED
|
@@ -69,7 +69,7 @@ The product is organized as a small kernel (`src/`) + **19 modules** under `modu
|
|
|
69
69
|
- **Post-merge branch cleanup (standard practice):** Every feature branch that lands on main via `--no-ff` merge gets deleted on origin once the deploy succeeds. The merge commit itself preserves the branch's history in main, so the named ref isn't carrying any signal — keeping it just clutters GitHub's branch list and tricks the UI into offering empty PRs against zero-diff branches. The auto-merge in [`scripts/gds/ship.js`](../scripts/gds/ship.js) does this automatically after `~/deploy.sh` returns 0; the manual [`/merge-mode`](../.claude/skills/merge-mode/SKILL.md) flow follows the same step 5b. Local refs and worktree directories stay — only the origin branch and the local tracking ref (cleaned on next `git fetch --prune`) go.
|
|
70
70
|
- **Local dev machine:** Lars's MacBook Air (Apple Silicon, macOS Sequoia). Tooling installed via Homebrew at `/opt/homebrew/`. Node v26.0.0 locally; `package.json` declares `"engines": { "node": ">=22" }`. Single ed25519 SSH key (`~/.ssh/id_ed25519`) authenticates to GitHub and droplet.
|
|
71
71
|
- **Smoke tests:** lightweight scripts in `/tmp/colyseus-*-smoketest.js` verify joinOrCreate, move protocol, interact, identity, queue. Run any after deploy with `node /tmp/colyseus-<name>-smoketest.js`.
|
|
72
|
-
- **Repo topology today vs. the configurable-root future ([ADR 0108](adr/<redacted>.md)):** everything above describes the current **single checkout** — `git reset --hard` deploy, `resolveCoreRoot()`/`resolveInstanceRoot()` ([`src/instance-config.js`](../src/instance-config.js)) both resolving to this same repo root. ADR 0108 lands (Mercury-first, then Example last) a model where Example instead installs a versioned `@
|
|
72
|
+
- **Repo topology today vs. the configurable-root future ([ADR 0108](adr/<redacted>.md)):** everything above describes the current **single checkout** — `git reset --hard` deploy, `resolveCoreRoot()`/`resolveInstanceRoot()` ([`src/instance-config.js`](../src/instance-config.js)) both resolving to this same repo root. ADR 0108 lands (Mercury-first, then Example last) a model where Example instead installs a versioned `@bongos/core` npm package and deploy becomes `git pull` (the instance repo) → `npm ci` (the pinned core) → migrate → restart — no more `git reset --hard` on a shared checkout. This section gets rewritten for the new topology once Example actually splits (ADR 0108 §6, task 1884/W4); until then it is unchanged and accurate.
|
|
73
73
|
|
|
74
74
|
**Database (`example` on Postgres 16, peer auth as `lars`):**
|
|
75
75
|
|
|
@@ -93,7 +93,7 @@ builders(id, github_id UNIQUE, github_login, display_name, avatar_url, total_cre
|
|
|
93
93
|
gemini_key_enc, gemini_key_last4, gemini_key_set_at) -- mig 122: per-builder Gemini key, AES-256-GCM at rest (ADR 0073); master key BUILDER_SECRET_KEY in server env only
|
|
94
94
|
rank text NOT NULL DEFAULT 'xenos' (mig 023; default flipped to xenos in mig 029)
|
|
95
95
|
CHECK IN 16-value ladder; LIVE: archon|metic|xenos (three-rank model, #360/ADR 0018)
|
|
96
|
-
karma integer NOT NULL DEFAULT 0 (mig 040) -- good-citizenship track alongside
|
|
96
|
+
karma integer NOT NULL DEFAULT 0 (mig 040) -- good-citizenship track alongside example
|
|
97
97
|
(=total_credits); append-only karma_log + AFTER INSERT trigger keep it in sync
|
|
98
98
|
status text DEFAULT 'active' (mig 025) -- 'active'|'inactive'; a deactivated builder can't claim (#307)
|
|
99
99
|
system_role text NULL (mig 065) -- NULL for every human; 'bfg' = the BFG service principal
|
|
@@ -168,7 +168,7 @@ task_grades(id, task_id UNIQUE, score NUMERIC(3,1), passed bool, threshold NUMER
|
|
|
168
168
|
grade_attempts(id, task_id, builder_id?, passed bool, score NUMERIC(3,1), attempted_at)
|
|
169
169
|
-- mig 064 (6D.6, ADR 0027): APPEND-ONLY, one row per grade run, so
|
|
170
170
|
-- re-grade thrash is countable (task_grades keeps only the latest)
|
|
171
|
-
session_records(id, session_id UNIQUE, builder_id, task_ids bigint[],
|
|
171
|
+
session_records(id, session_id UNIQUE, builder_id, task_ids bigint[], example_earned,
|
|
172
172
|
total_tokens, duration_seconds, started_at, ended_at, uploaded_at,
|
|
173
173
|
detail jsonb, metrics jsonb) -- mig 062 (6D.1, ADR 0027): per-shipped-session
|
|
174
174
|
-- secret-scrubbed digest (per-turn metadata + short snippets); idx on
|
|
@@ -19,7 +19,7 @@ env override → instance config (config/branding.json) → neutral star
|
|
|
19
19
|
|
|
20
20
|
| Path | Meaning |
|
|
21
21
|
|---|---|
|
|
22
|
-
| `identity.productName` | The product name (e.g. "
|
|
22
|
+
| `identity.productName` | The product name (e.g. "Example"). **Required.** |
|
|
23
23
|
| `identity.worldName` | The in-world / civilization name rendered at runtime (e.g. "Example"). **Required.** |
|
|
24
24
|
| `identity.company` | `{ name, site }` of the operating company (may be empty). |
|
|
25
25
|
| `llmProjectName` | The project name injected into grader / architect / onboarding **LLM prompts**, so a non-OTB instance is graded against its own identity. **Required.** |
|
|
@@ -27,13 +27,14 @@ env override → instance config (config/branding.json) → neutral star
|
|
|
27
27
|
| `domains.buildersOrigin` / `statusOrigin` | Hall + status origins. **These three (`publicOrigin`/`buildersOrigin`/`statusOrigin`) are the docs-discovery contract** ([ADR 0114](adr/<redacted>.md)): the hall is the canonical doc-reading surface, `/docs` on `publicOrigin` renders the API reference, the status page is the outage fallback. `GET <publicOrigin>/api/bongos` re-advertises them (`hall`/`status`/`public`) so an agent resolves the surfaces with no hard-coded host. |
|
|
28
28
|
| `domains.cookieDomain` | Session cookie domain (`""` = host-only — the safe default; never widen to a parent domain by accident). |
|
|
29
29
|
| `domains.oauthOrigin` | Canonical sign-in origin. |
|
|
30
|
+
| `domains.provisioningOrigin` | **Optional.** Control-plane front-door origin the [provisioning module](../../modules/provisioning/CLAUDE.md) uses to build a new customer's GitHub-App `redirect_url`. Set it when the control plane co-hosts a game whose `publicOrigin` is the game's own domain (OTB = customer 0) so the customer's App carries the PLATFORM brand (e.g. `https://get.cloudbongos.com`), not the game's. **Falls back to `publicOrigin` when unset** — an instance whose `publicOrigin` is already the platform needs no override. Env-overridable: `<PREFIX>_PROVISIONING_ORIGIN`. ([#2101](https://example.com/builders#/task/2101)) |
|
|
30
31
|
| `domains.devBoxBase` | Apex zone the **proxied** browser-terminal + sandbox hosts ride (`term-<login>.<devBoxBase>`, `sandbox-<login>.<devBoxBase>`). Must be a one-label-under-apex zone so free edge TLS (`*.<apex>`) covers it — a two-label host fails edge TLS (the [#771](https://example.com/builders#/task/771) lesson). Empty ⇒ no managed boxes. |
|
|
31
32
|
| `domains.sshBoxBase` | Zone for the **legacy direct-IP SSH** box host (`box-<login>.<sshBoxBase>`, unproxied). Deliberately distinct from `devBoxBase` (one proxied/edge-TLS, one direct-IP). |
|
|
32
33
|
| `domains.sandboxPrefix` / `termPrefix` | Subdomain prefixes for the sandbox-preview + browser-terminal hosts. |
|
|
33
34
|
| `repo` | `{ owner, name }` GitHub binding. |
|
|
34
35
|
| `db.database` | DB name the GDS pool connects to when neither `DATABASE_URL` nor `PGHOST`/`PGDATABASE` is set (`src/bongos/pool.js`, ADR 0062 §5). `null` in the neutral starter = **fail loud** rather than silently target a host DB. |
|
|
35
|
-
| `currency` | `{ label, symbol }` — the reward unit label (e.g. "
|
|
36
|
-
| `reward` | `{ marginPct, usdPeg }` — the per-instance reward POLICY the economy module reads ([ADR 0054](adr/<redacted>.md), task 2009): the cost-plus margin percent (default `20`) and the
|
|
36
|
+
| `currency` | `{ label, symbol }` — the reward unit label (e.g. "example"). Display only. |
|
|
37
|
+
| `reward` | `{ marginPct, usdPeg }` — the per-instance reward POLICY the economy module reads ([ADR 0054](adr/<redacted>.md), task 2009): the cost-plus margin percent (default `20`) and the example-per-USD peg (default `1`). A committed, code-reviewed change — not a live UI knob. Omit ⇒ code defaults (20% margin, 1:1 peg). |
|
|
37
38
|
| `models` | `{ main, subagentDefault, subagentRoutine }` — the per-instance subagent model-allocation DEFAULT the builder-settings module reads (task 2011): the tier for the main session, subagent-default work, and routine plumbing (tiers: `haiku`/`sonnet`/`opus`/`fable`). A per-builder override resolves over this. Omit ⇒ code defaults (`opus`/`opus`/`haiku`). |
|
|
38
39
|
| `tracks` | The configurable version-track set (replaces the hardcoded `product\|internal`). |
|
|
39
40
|
| `theme` | `{ palette, mode }` — palette file ref + theme mode. |
|
|
@@ -59,7 +60,7 @@ The browser never sees the full pack — only the **client-safe projection** `cl
|
|
|
59
60
|
- **On-box (hall + status served from the droplet):** injected synchronously by `mountInternalSurfaces` (`src/bongos/serve-internal.js` → `injectBrandingGlobal`) into the page `<head>` as **`window.__BRANDING__`** (the strings) **plus theme markup** (`themeMarkup` → a `:root` palette/font-var override `<style>`, the web-font `<link>`s, and the favicon `<link>`). The `<style>` lands after the page's own stylesheet so the pack wins. No fetch, no flash-of-default.
|
|
60
61
|
- **Off-box (the GitHub-Pages status page):** read cross-origin from **`GET /api/gds/public/branding`**.
|
|
61
62
|
|
|
62
|
-
R56 seeded the projection with the configurable **currency label** (`public-builders/brand-apply.js` fills `[data-currency-label]` / `[data-currency-tmpl]` markup + `window.OTBBranding.currencyLabel()`). R57 widens it to the **LOOK** — `theme.ui` (palette + fonts + favicon; note this is the WEB theme, distinct from the server-only `theme.palette` game pixel-art path) — and the **rank display-label map** (`window.OTB.rankLabel()` reads `rankLabels`; the rank ENUM stays Greek by decision, only the label is presentation). The remaining
|
|
63
|
+
R56 seeded the projection with the configurable **currency label** (`public-builders/brand-apply.js` fills `[data-currency-label]` / `[data-currency-tmpl]` markup + `window.OTBBranding.currencyLabel()`). R57 widens it to the **LOOK** — `theme.ui` (palette + fonts + favicon; note this is the WEB theme, distinct from the server-only `theme.palette` game pixel-art path) — and the **rank display-label map** (`window.OTB.rankLabel()` reads `rankLabels`; the rank ENUM stays Greek by decision, only the label is presentation). The remaining themed **page copy + identity strings** (titles, ledes, world-flavor copy) are tracked as the R57 copy-pack follow-up.
|
|
63
64
|
|
|
64
65
|
## Branding a new instance
|
|
65
66
|
|
|
@@ -86,7 +86,7 @@ forming the ordered claim-gate tier **`xenos` (1) < `thetes` (2) < `metic` (3) <
|
|
|
86
86
|
`db.claimTask` / `claimTasksBatch`, returns `rank_too_low_for_task`). Cannot triage, resolve
|
|
87
87
|
blockers, or run planning/priority sessions. This is also the tier a deactivated/offboarded builder
|
|
88
88
|
is dropped to by `/builder-exit` (migration `025`); for them `status='inactive'` additionally blocks
|
|
89
|
-
*all* claims. Either way,
|
|
89
|
+
*all* claims. Either way, example / credit history / shipped-task attribution are preserved.
|
|
90
90
|
|
|
91
91
|
Everything else on the citizen ladder (`strategos`…`zeugitai`), the divine tiers, and the other
|
|
92
92
|
sub-citizen tiers (`periokoi`/`doulos`/`helot`) stay **reserved but unwired** — promoting anyone to
|
|
@@ -227,7 +227,7 @@ Not layout, but it rides along. Most of this already flows through the brand pac
|
|
|
227
227
|
| "The Builders' Hall" · "chronicles of the city" epigraph | "Builders" · no epigraph | brand pack + markup |
|
|
228
228
|
| "scroll" (section) | card / panel | markup + CSS class |
|
|
229
229
|
| "Thy Standing in the City" | Standing / Profile | markup |
|
|
230
|
-
|
|
|
230
|
+
| example | credits (`currency-label`) | brand pack (already) |
|
|
231
231
|
| Honours / laurels | Achievements | markup |
|
|
232
232
|
| "Works Wrought by Thy Hand" | Your work | markup |
|
|
233
233
|
| "Marks of the Inspector" | Reviews / quality marks | markup |
|