@bongos/core 1.17.0
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 +5727 -0
- package/.claude/skills/blocker-review/SKILL.md +91 -0
- package/.claude/skills/blocker-solve/SKILL.md +96 -0
- package/.claude/skills/builder-backup/SKILL.md +54 -0
- package/.claude/skills/builder-box/SKILL.md +45 -0
- package/.claude/skills/builder-claim/SKILL.md +76 -0
- package/.claude/skills/builder-connect/SKILL.md +59 -0
- package/.claude/skills/builder-cost/SKILL.md +47 -0
- package/.claude/skills/builder-end/SKILL.md +81 -0
- package/.claude/skills/builder-exit/SKILL.md +88 -0
- package/.claude/skills/builder-key/SKILL.md +40 -0
- package/.claude/skills/builder-reauth/SKILL.md +50 -0
- package/.claude/skills/builder-redteam/SKILL.md +109 -0
- package/.claude/skills/builder-release/SKILL.md +41 -0
- package/.claude/skills/builder-setup/SKILL.md +62 -0
- package/.claude/skills/builder-ship/SKILL.md +79 -0
- package/.claude/skills/builder-stage/SKILL.md +51 -0
- package/.claude/skills/builder-start/SKILL.md +46 -0
- package/.claude/skills/close-box/SKILL.md +43 -0
- package/.claude/skills/design-sync/SKILL.md +69 -0
- package/.claude/skills/dev/SKILL.md +49 -0
- package/.claude/skills/feedback/SKILL.md +32 -0
- package/.claude/skills/figma-design-sync/SKILL.md +74 -0
- package/.claude/skills/goal-review/SKILL.md +89 -0
- package/.claude/skills/idea-triage/SKILL.md +144 -0
- package/.claude/skills/ideate/SKILL.md +82 -0
- package/.claude/skills/merge-mode/SKILL.md +169 -0
- package/.claude/skills/new-project/SKILL.md +108 -0
- package/.claude/skills/otb-character-review/SKILL.md +71 -0
- package/.claude/skills/otb-design-review/SKILL.md +47 -0
- package/.claude/skills/otb-feedback-capture/SKILL.md +45 -0
- package/.claude/skills/otb-figma-sync/SKILL.md +54 -0
- package/.claude/skills/otb-tile-generate/SKILL.md +45 -0
- package/.claude/skills/paint/SKILL.md +70 -0
- package/.claude/skills/planning-session/SKILL.md +299 -0
- package/.claude/skills/priority-session/SKILL.md +134 -0
- package/.claude/skills/read-session-export/SKILL.md +58 -0
- package/.claude/skills/recall/SKILL.md +52 -0
- package/.claude/skills/session-handoff/SKILL.md +46 -0
- package/.claude/skills/status/SKILL.md +33 -0
- package/.devcontainer/Dockerfile +69 -0
- package/.devcontainer/README.md +73 -0
- package/.devcontainer/devcontainer-lock.json +19 -0
- package/.devcontainer/devcontainer.json +93 -0
- package/.devcontainer/healthcheck.sh +84 -0
- package/.devcontainer/init-firewall.sh +198 -0
- package/.devcontainer/post-create.sh +153 -0
- package/.dockerignore +36 -0
- package/.env.local.example +32 -0
- package/.gitattributes +83 -0
- package/.gitignore +91 -0
- package/CLAUDE.md +242 -0
- package/CODE_OF_CONDUCT.md +46 -0
- package/CONTRIBUTING.md +51 -0
- package/Dockerfile +46 -0
- package/GOVERNANCE.md +44 -0
- package/LICENSE +661 -0
- package/README.md +88 -0
- package/bin/bongos.js +222 -0
- package/clients/bongos-client/README.md +48 -0
- package/clients/bongos-client/bongos-client.global.js +617 -0
- package/clients/bongos-client/examples/hello-world.mjs +62 -0
- package/clients/bongos-client/index.cjs +619 -0
- package/clients/bongos-client/index.d.ts +793 -0
- package/clients/bongos-client/index.mjs +614 -0
- package/clients/bongos-client/package.json +32 -0
- package/config/branding.neutral.json +60 -0
- package/config/design-tokens.neutral.json +51 -0
- package/config/design-tokens.schema.json +96 -0
- package/config/modules.neutral.json +9 -0
- package/docker-compose.yml +52 -0
- package/docker-entrypoint.sh +30 -0
- package/docs/adr/0001-stack-choice-single-vps.md +45 -0
- package/docs/adr/0002-digitalocean-over-hetzner.md +27 -0
- package/docs/adr/0003-cloudflare-origin-cert-over-letsencrypt.md +35 -0
- package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +45 -0
- package/docs/adr/0005-invisible-other-players-in-v1.md +37 -0
- package/docs/adr/0006-singleton-worldroom-plus-queueroom.md +30 -0
- package/docs/adr/0007-persistent-identity-via-localstorage-uuid.md +31 -0
- package/docs/adr/0008-family-based-tile-generation.md +86 -0
- package/docs/adr/0008-google-chat-oauth-user-auth.md +37 -0
- package/docs/adr/0009-autotile-architecture.md +181 -0
- package/docs/adr/0010-pms-architecture.md +70 -0
- package/docs/adr/0011-terrain-id-rendering-model.md +174 -0
- package/docs/adr/0012-ground-object-cell-split.md +208 -0
- package/docs/adr/0013-paths-as-object-overlays-with-autotile-dispatch.md +158 -0
- package/docs/adr/0014-families-canonical-over-vocabulary.md +103 -0
- package/docs/adr/0015-task-dependencies-and-auto-promotion.md +125 -0
- package/docs/adr/0016-trust-boundary-server-enforced-permissions.md +132 -0
- package/docs/adr/0017-code-simplification-and-repo-cleanliness.md +74 -0
- package/docs/adr/0018-three-rank-model-goes-live.md +97 -0
- package/docs/adr/0019-red-team-bounty-payout-table.md +52 -0
- package/docs/adr/0020-security-model-public-stub.md +70 -0
- package/docs/adr/0021-per-builder-skill-model-preferences.md +99 -0
- package/docs/adr/0022-secrets-policy.md +124 -0
- package/docs/adr/0023-kind-multipliers-and-idea-bonus.md +118 -0
- package/docs/adr/0024-cloneable-repo-local-first-memory.md +277 -0
- package/docs/adr/0024-multi-agent-system-architecture.md +125 -0
- package/docs/adr/0025-offsite-backup-vendor-digitalocean-spaces.md +59 -0
- package/docs/adr/0025-structured-criterion-task-link.md +44 -0
- package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +117 -0
- package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +170 -0
- package/docs/adr/0028-honest-llm-spend-accounting.md +109 -0
- package/docs/adr/0029-status-page-outage-resilience.md +59 -0
- package/docs/adr/0030-builders-hall-live-updates.md +59 -0
- package/docs/adr/0031-cloud-dev-environments-for-builders.md +222 -0
- package/docs/adr/0032-discord-mirror-of-gds.md +50 -0
- package/docs/adr/0033-discord-bot-service-principal.md +82 -0
- package/docs/adr/0034-thetes-graduated-newcomer-rank.md +53 -0
- package/docs/adr/0035-builder-onboarding-three-paths.md +128 -0
- package/docs/adr/0036-builders-subdomain-and-ui-reorg.md +40 -0
- package/docs/adr/0037-discord-channel-management.md +51 -0
- package/docs/adr/0038-chromebook-ttyd-cloudflare-tunnel.md +111 -0
- package/docs/adr/0039-setup-first-onboarding-ux.md +49 -0
- package/docs/adr/0040-remote-control-default-browser-onramp.md +47 -0
- package/docs/adr/0041-temporary-grader-bypass-killswitch.md +40 -0
- package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +82 -0
- package/docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md +74 -0
- package/docs/adr/0044-mediterranean-palette-replacement.md +73 -0
- package/docs/adr/0044-per-box-live-game-preview.md +57 -0
- package/docs/adr/0045-devbox-desktop-app.md +133 -0
- package/docs/adr/0046-sandbox-first-review-gate.md +72 -0
- package/docs/adr/0047-discord-bugs-intake-anti-abuse.md +36 -0
- package/docs/adr/0048-works-in-progress-ia-split.md +32 -0
- package/docs/adr/0049-split-parallel-safety-contract.md +46 -0
- package/docs/adr/0050-device-flow-admission-invite-gated-by-default.md +43 -0
- package/docs/adr/0051-full-session-transcript-corpus.md +57 -0
- package/docs/adr/0052-sandbox-for-everyone-game-only-preview.md +70 -0
- package/docs/adr/0053-scoped-dev-box-session.md +55 -0
- package/docs/adr/0054-session-token-reward-cost-plus.md +63 -0
- package/docs/adr/0055-server-mediated-branch-publish.md +47 -0
- package/docs/adr/0056-prod-deploy-script-mirror-and-healthcheck-retry.md +62 -0
- package/docs/adr/0057-container-cost-ledger.md +28 -0
- package/docs/adr/0057-discord-archon-approval-channels.md +64 -0
- package/docs/adr/0058-automatic-gate-surface-gatekeeper.md +64 -0
- package/docs/adr/0059-single-approval-remove-devbox-approval-gate.md +37 -0
- package/docs/adr/0060-gds-retrieval-layer.md +97 -0
- package/docs/adr/0061-context-layer-decomposition.md +61 -0
- package/docs/adr/0062-medusa-instance-model-decoupling.md +107 -0
- package/docs/adr/0063-generated-repo-map-symbol-skeleton.md +44 -0
- package/docs/adr/0064-rename-medusa-to-cloud-bongos.md +49 -0
- package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +69 -0
- package/docs/adr/0066-generated-file-map-sections.md +51 -0
- package/docs/adr/0067-session-start-fast-forward-pull.md +43 -0
- package/docs/adr/0068-shared-art-key-for-newcomers.md +38 -0
- package/docs/adr/0069-hall-live-channel-sse-decouple.md +35 -0
- package/docs/adr/0070-deterministic-session-card-delivery.md +44 -0
- package/docs/adr/0071-box-confirm-before-destroyed-and-drift-reconcile.md +59 -0
- package/docs/adr/0072-bongos-app-mac-signed-first-windows-deferred.md +35 -0
- package/docs/adr/0072-dev-box-code-staleness-visibility.md +39 -0
- package/docs/adr/0073-builder-needs-signal-and-byok-gemini-key.md +64 -0
- package/docs/adr/0073-secrets-scan-exclude-uri-detector.md +37 -0
- package/docs/adr/0074-memory-map-stays-light.md +32 -0
- package/docs/adr/0075-per-system-cost-attribution.md +37 -0
- package/docs/adr/0076-in-session-deterministic-compaction.md +58 -0
- package/docs/adr/0077-content-addressed-llm-cache.md +32 -0
- package/docs/adr/0078-deterministic-first-cron.md +48 -0
- package/docs/adr/0079-value-gated-autonomous-engagement.md +39 -0
- package/docs/adr/0080-llm-cache-api-transport-and-trust-model.md +46 -0
- package/docs/adr/0081-tool-agnostic-design-layer.md +62 -0
- package/docs/adr/0082-productized-key-storage-provisioning.md +32 -0
- package/docs/adr/0082-server-side-merge-conflict-auto-resolution.md +55 -0
- package/docs/adr/0083-modular-architecture-strangler-build-plan.md +143 -0
- package/docs/adr/0084-auto-derived-per-task-rank-floor.md +86 -0
- package/docs/adr/0085-remove-default-per-builder-spend-cap.md +39 -0
- package/docs/adr/0086-goal-scoped-work-hierarchy.md +123 -0
- package/docs/adr/0087-bongos-app-architecture-and-handoff-contract.md +49 -0
- package/docs/adr/0087-compete-on-governance-not-tooling-cursor.md +65 -0
- package/docs/adr/0088-consistent-character-generative-animation.md +169 -0
- package/docs/adr/0089-modular-multi-model-adversarial-grader.md +179 -0
- package/docs/adr/0090-metic-task-authoring.md +73 -0
- package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +106 -0
- package/docs/adr/0092-hosting-module-and-on-prem-target.md +117 -0
- package/docs/adr/0093-tranche-2-core-carve-sequence.md +72 -0
- package/docs/adr/0094-repo-atlas-self-drawing-codebase-map.md +49 -0
- package/docs/adr/0095-borrowed-memory-and-retrieval-concepts.md +65 -0
- package/docs/adr/0095-cross-agent-context-management.md +58 -0
- package/docs/adr/0096-require-reward-before-workable.md +209 -0
- package/docs/adr/0097-one-active-claim-per-session-and-worktree-binding.md +46 -0
- package/docs/adr/0097-retroactive-reward-backfill.md +124 -0
- package/docs/adr/0098-public-mirror-publish-manifest.md +92 -0
- package/docs/adr/0099-delayed-redacted-mirror-export.md +55 -0
- package/docs/adr/0100-two-repo-instance-model.md +60 -0
- package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +90 -0
- package/docs/adr/0102-finish-bounding-the-kernel.md +36 -0
- package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +70 -0
- package/docs/adr/0103-gdsv4-bongos-consolidation.md +28 -0
- package/docs/adr/0104-trust-gds-api-channel-in-auto-mode.md +42 -0
- package/docs/adr/0105-instance-seed-migrations-out-of-core.md +47 -0
- package/docs/adr/0106-goal-owner-manager-authority.md +84 -0
- package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +83 -0
- package/docs/adr/0108-instance-composition-configurable-root.md +87 -0
- package/docs/adr/0109-self-describing-openapi-and-hosted-docs.md +44 -0
- package/docs/adr/0110-untrack-whole-file-generated-nav-docs.md +49 -0
- package/docs/adr/0111-instance-hosting-provisioning-module.md +135 -0
- package/docs/adr/0112-private-goals-invitations-join-requests.md +72 -0
- package/docs/adr/0113-sandbox-studio-descope-superseded-by-0044-0052.md +41 -0
- package/docs/adr/0114-instance-docs-discovery-contract.md +32 -0
- package/docs/adr/0115-scheduled-routines-portability.md +31 -0
- package/docs/adr/0116-api-error-envelope-and-code-taxonomy.md +62 -0
- package/docs/adr/0117-api-versioning-and-deprecation-policy.md +50 -0
- package/docs/adr/0118-api-contract-source-of-truth-code-first.md +47 -0
- package/docs/adr/0119-api-pagination-contract.md +34 -0
- package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +108 -0
- package/docs/adr/0121-greenfield-vs-brownfield-onboarding-adopt-existing-repo.md +97 -0
- package/docs/adr/0122-onboarding-diagram-renders-deploy-rendered-off-git.md +43 -0
- package/docs/adr/0123-box-idle-sweep-autosave-before-destroy.md +36 -0
- package/docs/adr/0124-typed-api-response-bodies.md +37 -0
- package/docs/adr/0125-control-plane-scaffolds-standalone-instance-repo.md +36 -0
- package/docs/adr/0126-dedicated-cloudbongos-control-plane-droplet.md +30 -0
- package/docs/adr/0127-cross-box-fleet-observability.md +64 -0
- package/docs/adr/0128-provisioning-runner-privilege-and-db-auth-model.md +46 -0
- package/docs/adr/0129-cloudbongos-control-plane-pull-deploy.md +34 -0
- package/docs/adr/0130-provision-remote-exec-over-ssh.md +61 -0
- package/docs/adr/0131-rank-scoped-skill-visibility.md +47 -0
- package/docs/adr/0132-cohost-fleet-control-plane-migration.md +54 -0
- package/docs/adr/0133-github-app-manifest-onboarding-signin.md +42 -0
- package/docs/adr/0134-private-first-npm-distribution.md +38 -0
- package/docs/adr/README.md +208 -0
- package/docs/api/openapi.json +13720 -0
- package/docs/api-reference.md +437 -0
- package/docs/architecture.md +244 -0
- package/docs/branding-contract.md +66 -0
- package/docs/branding-fill-prompt.md +25 -0
- package/docs/canonical-permissions.md +241 -0
- package/docs/design/container-exterior-tiles.md +49 -0
- package/docs/design/container-exterior.md +81 -0
- package/docs/design/container-interior.md +77 -0
- package/docs/design/modular-architecture/00-research-report.md +107 -0
- package/docs/design/modular-architecture/01-architecture.md +125 -0
- package/docs/design/modular-architecture/02-module-map.md +116 -0
- package/docs/design/modular-architecture/03-builder-flows.md +104 -0
- package/docs/design/modular-architecture/04-module-lifecycle.md +62 -0
- package/docs/design/modular-architecture/README.md +27 -0
- package/docs/design/vanilla-hall-ui-redesign-scope.md +284 -0
- package/docs/design/world-map-scroll.md +41 -0
- package/docs/design-contract.md +320 -0
- package/docs/file-map.md +418 -0
- package/docs/handoff-template.md +92 -0
- package/docs/modules-contract.md +293 -0
- package/docs/onboarding/browser-terminal-guide.md +73 -0
- package/docs/onboarding/diagrams/01-task-lifecycle.mmd +28 -0
- package/docs/onboarding/diagrams/02-rank-ladder.mmd +54 -0
- package/docs/onboarding/diagrams/03-drachmae-karma.mmd +37 -0
- package/docs/onboarding/diagrams/04-architecture.mmd +51 -0
- package/docs/onboarding/diagrams/05-versioning.mmd +29 -0
- package/docs/onboarding/diagrams/README.md +94 -0
- package/docs/onboarding/diagrams/assertions.json +170 -0
- package/docs/onboarding/diagrams/puppeteer-config.json +1 -0
- package/docs/onboarding/diagrams/render-config.json +9 -0
- package/docs/onboarding/drachmae-and-karma.md +178 -0
- package/docs/onboarding/primer.md +202 -0
- package/docs/project-context.template.md +67 -0
- package/docs/recipes/README.md +35 -0
- package/docs/recipes/audit-replay.md +100 -0
- package/docs/recipes/bongos-cli-release.md +66 -0
- package/docs/recipes/builder-box-lifecycle.md +152 -0
- package/docs/recipes/claude-design-loop.md +143 -0
- package/docs/recipes/claude-gemini-bongos-doors.md +155 -0
- package/docs/recipes/cloudbongos-staging-gate.md +139 -0
- package/docs/recipes/cloudbongos-standup.md +111 -0
- package/docs/recipes/devbox-app-release.md +93 -0
- package/docs/recipes/devbox-app-windows-test.md +128 -0
- package/docs/recipes/failed-ship-recovery-proof.md +102 -0
- package/docs/recipes/figma-design-loop.md +129 -0
- package/docs/recipes/gds-db-backup.md +255 -0
- package/docs/recipes/instance-deploy.md +37 -0
- package/docs/recipes/managed-settings-remote-control.md +416 -0
- package/docs/recipes/memory-backup.md +71 -0
- package/docs/recipes/memory-sync-conflicts.md +98 -0
- package/docs/recipes/multi-builder-merge.md +78 -0
- package/docs/recipes/ops-gotchas.md +212 -0
- package/docs/recipes/overnight-builder.md +53 -0
- package/docs/recipes/packaging-the-core.md +49 -0
- package/docs/recipes/parallel-load-results-2026-05-30.md +63 -0
- package/docs/recipes/parallel-load-test.md +32 -0
- package/docs/recipes/pixel-art-pipeline.md +411 -0
- package/docs/recipes/private-npm-distribution.md +79 -0
- package/docs/recipes/search-index-ingestion.md +67 -0
- package/docs/recipes/self-host.md +60 -0
- package/docs/recipes/ship-and-regrade.md +72 -0
- package/docs/recipes/staging-data.md +50 -0
- package/docs/recipes/staging-environment.md +215 -0
- package/docs/recipes/upgrading-the-core.md +58 -0
- package/docs/research/cursor-competitive-analysis.md +255 -0
- package/docs/research/llm-model-agnostic-and-cheaper-grader.md +227 -0
- package/migrations/003_pms.sql +284 -0
- package/migrations/004_pms_cost_idempotency.sql +13 -0
- package/migrations/005_pms_smoke_filter.sql +44 -0
- package/migrations/006_pms_v2.sql +378 -0
- package/migrations/007_pms_v2_hierarchy_trigger.sql +59 -0
- package/migrations/008_pms_v2_migration_allocator.sql +27 -0
- package/migrations/009_pms_v2_blockers_table.sql +68 -0
- package/migrations/010_uptime.sql +29 -0
- package/migrations/011_backfill_v2_v3_done_when.sql +20 -0
- package/migrations/012_pms_v2_task_lifecycle_states.sql +82 -0
- package/migrations/013_claim_locking.sql +22 -0
- package/migrations/014_pms_task_discipline.sql +86 -0
- package/migrations/015_pms_estimation_calibration.sql +140 -0
- package/migrations/016_pms_task_grades.sql +60 -0
- package/migrations/017_version_progress_exclude_abandoned.sql +49 -0
- package/migrations/019_rename_pms_v3_to_gds_v3.sql +65 -0
- package/migrations/020_task_dependencies.sql +99 -0
- package/migrations/021_v3_renumber_and_deps.sql +224 -0
- package/migrations/022_v3_reconcile_dep_gated_status.sql +41 -0
- package/migrations/023_pms_rank.sql +30 -0
- package/migrations/025_builder_exit_status.sql +15 -0
- package/migrations/027_builders_preferred_disciplines.sql +46 -0
- package/migrations/028_tasks_parallel_safe.sql +71 -0
- package/migrations/029_rank_three_live.sql +32 -0
- package/migrations/030_vulnerability_reports.sql +61 -0
- package/migrations/031_reward_simplification.sql +57 -0
- package/migrations/032_repo_health_snapshots.sql +56 -0
- package/migrations/033_audit_log.sql +64 -0
- package/migrations/034_lifecycle_breakdown_leaf_only.sql +62 -0
- package/migrations/035_auth_token_hygiene.sql +66 -0
- package/migrations/037_builder_skill_model_prefs.sql +44 -0
- package/migrations/038_task_override_requests.sql +51 -0
- package/migrations/039_newcomer_friendly_column.sql +124 -0
- package/migrations/040_builder_karma.sql +58 -0
- package/migrations/041_kind_multipliers_and_idea_bonus.sql +42 -0
- package/migrations/042_criterion_proposal_workflow.sql +78 -0
- package/migrations/043_builder_onboarding_observability.sql +66 -0
- package/migrations/044_tasks_requires_rank.sql +97 -0
- package/migrations/045_builder_onboarding_state.sql +147 -0
- package/migrations/046_cost_log_builder_attribution.sql +42 -0
- package/migrations/054_builder_memory.sql +108 -0
- package/migrations/055_task_criteria.sql +90 -0
- package/migrations/058_peer_votes.sql +41 -0
- package/migrations/059_onboarding_pick_disciplines.sql +59 -0
- package/migrations/060_access_requests.sql +46 -0
- package/migrations/061_backfill_override_ship_attribution.sql +29 -0
- package/migrations/062_session_records.sql +34 -0
- package/migrations/063_session_records_tool_errors_idx.sql +11 -0
- package/migrations/064_grade_attempts.sql +18 -0
- package/migrations/065_bfg_principal.sql +58 -0
- package/migrations/066_live_notify_triggers.sql +69 -0
- package/migrations/067_builder_boxes.sql +117 -0
- package/migrations/067_discord_bot_foundation.sql +69 -0
- package/migrations/068_thetes_requires_rank.sql +27 -0
- package/migrations/069_builder_ssh_keys.sql +66 -0
- package/migrations/070_box_intents.sql +101 -0
- package/migrations/071_box_first_provision_approval.sql +46 -0
- package/migrations/072_onboarding_ship_three_remove_primer.sql +80 -0
- package/migrations/073_box_terminal_access.sql +46 -0
- package/migrations/075_builder_sound_prefs.sql +28 -0
- package/migrations/078_box_claude_active.sql +22 -0
- package/migrations/079_box_first_connected_at.sql +20 -0
- package/migrations/081_tasks_needs_migration.sql +34 -0
- package/migrations/084_tasks_security_sensitive.sql +24 -0
- package/migrations/085_security_engagement_docs.sql +34 -0
- package/migrations/086_rename_disciplines.sql +125 -0
- package/migrations/088_builders_anthropic_link.sql +28 -0
- package/migrations/089_builders_monthly_budget.sql +19 -0
- package/migrations/090_box_scoped_sessions.sql +38 -0
- package/migrations/091_session_token_reward.sql +44 -0
- package/migrations/093_tasks_sandbox_review.sql +22 -0
- package/migrations/102_remove_box_first_provision_approval.sql +58 -0
- package/migrations/103_search_chunks.sql +90 -0
- package/migrations/104_builder_box_blocked.sql +34 -0
- package/migrations/105_box_host_keys.sql +35 -0
- package/migrations/111_medusa_customer0_framing.sql +35 -0
- package/migrations/112_drop_track_check.sql +25 -0
- package/migrations/113_merge_lease.sql +16 -0
- package/migrations/114_cloudbongos_rename_live_strings.sql +32 -0
- package/migrations/118_currency_label_decoupling.sql +23 -0
- package/migrations/119_builder_behavior_prefs.sql +31 -0
- package/migrations/121_box_code_version.sql +37 -0
- package/migrations/122_builder_gemini_key.sql +30 -0
- package/migrations/123_cost_log_tiers.sql +33 -0
- package/migrations/124_cost_baseline.sql +45 -0
- package/migrations/125_llm_cache.sql +54 -0
- package/migrations/126_autonomy_runs.sql +33 -0
- package/migrations/143_cost_calibration.sql +63 -0
- package/migrations/145_backfill_task_requires_rank.sql +84 -0
- package/migrations/160_goal_tier.sql +88 -0
- package/migrations/163_polymorphic_dependencies.sql +187 -0
- package/migrations/164_event_sound_prefs.sql +20 -0
- package/migrations/165_task_module_key.sql +15 -0
- package/migrations/171_claims_published_head_sha.sql +24 -0
- package/migrations/174_close_orphaned_claims_on_terminal_tasks.sql +30 -0
- package/migrations/175_task_grades_diff_hash.sql +9 -0
- package/migrations/176_promotion_respects_open_blockers.sql +58 -0
- package/migrations/176_ui_discipline.sql +40 -0
- package/migrations/177_require_reward_before_workable.sql +76 -0
- package/migrations/178_reward_gate_auto_assign_revert_autopromote.sql +61 -0
- package/migrations/179_search_chunk_usefulness.sql +33 -0
- package/migrations/180_one_active_claim_per_session.sql +54 -0
- package/migrations/181_cost_log_skill_name.sql +33 -0
- package/migrations/184_claim_release_requested.sql +25 -0
- package/migrations/185_module_upstreaming_goal_wiring.sql +59 -0
- package/migrations/187_goal_sort_order.sql +30 -0
- package/migrations/187_tasks_kind_check_add_verify.sql +21 -0
- package/migrations/README.md +88 -0
- package/migrations/core_188_goal_visibility_and_membership_requests.sql +71 -0
- package/migrations/core_189_core_upgrades_ledger.sql +37 -0
- package/migrations/core_189_credit_log_task_id_index.sql +19 -0
- package/migrations/core_190_rebuild_claimable_task_views.sql +71 -0
- package/migrations/instance/018_pms_v3_planning_seed.sql +131 -0
- package/migrations/instance/080_gds_v4_planning_seed.sql +75 -0
- package/migrations/instance/110_medusa_planning_seed.sql +70 -0
- package/migrations/instance/120_bongos_v1_planning_seed.sql +69 -0
- package/migrations/instance/144_bongos_v1_module_system_criterion.sql +26 -0
- package/migrations/instance/159_bongos_v1_goal_hierarchy_criterion.sql +29 -0
- package/migrations/instance/172_v2_world_planning_seed.sql +163 -0
- package/migrations/instance/173_bongos_v1_c7_core_modularized.sql +33 -0
- package/migrations/instance/182_gdsv4_bongos_consolidation.sql +132 -0
- package/migrations/instance/183_gdsv4_carryover_themed_goals.sql +116 -0
- package/migrations/instance/186_bongos_v1_governance_planning_seed.sql +69 -0
- package/modules/autonomy/CLAUDE.md +49 -0
- package/modules/autonomy/db.js +50 -0
- package/modules/autonomy/module.json +13 -0
- package/modules/autonomy/pollers/routine-timers.js +146 -0
- package/modules/autonomy/routes/autonomy.js +37 -0
- package/modules/builder-settings/CLAUDE.md +58 -0
- package/modules/builder-settings/builder-needs.js +115 -0
- package/modules/builder-settings/db.js +168 -0
- package/modules/builder-settings/display-name.js +84 -0
- package/modules/builder-settings/event-sound-prefs.js +169 -0
- package/modules/builder-settings/interaction-prefs.js +201 -0
- package/modules/builder-settings/model-alloc-prefs.js +147 -0
- package/modules/builder-settings/module.json +10 -0
- package/modules/builder-settings/render-prefs.js +103 -0
- package/modules/builder-settings/routes/settings.js +417 -0
- package/modules/builder-settings/settings.js +52 -0
- package/modules/builder-settings/skill-prefs.js +196 -0
- package/modules/builder-settings/sound-prefs.js +178 -0
- package/modules/builder-settings/wandering-prefs.js +282 -0
- package/modules/dev-box/CLAUDE.md +38 -0
- package/modules/dev-box/box-access.js +275 -0
- package/modules/dev-box/box-credential.js +94 -0
- package/modules/dev-box/box-onboard.js +486 -0
- package/modules/dev-box/boxes.js +842 -0
- package/modules/dev-box/db.js +39 -0
- package/modules/dev-box/module.json +14 -0
- package/modules/dev-box/routes/box.js +977 -0
- package/modules/discord/CLAUDE.md +50 -0
- package/modules/discord/auth.js +54 -0
- package/modules/discord/bug-attachments.js +210 -0
- package/modules/discord/db.js +96 -0
- package/modules/discord/discord-approvals.js +145 -0
- package/modules/discord/discord-audit.js +29 -0
- package/modules/discord/discord-bot.js +545 -0
- package/modules/discord/discord-bugs.js +257 -0
- package/modules/discord/discord-channels.js +412 -0
- package/modules/discord/discord-inbound.js +147 -0
- package/modules/discord/discord-message-buffer.js +54 -0
- package/modules/discord/discord-reaction.js +186 -0
- package/modules/discord/discord-role-sync.js +318 -0
- package/modules/discord/module.json +14 -0
- package/modules/discord/pollers/discord-bot.js +19 -0
- package/modules/discord/routes/bug-attachments.js +44 -0
- package/modules/discord/routes/discord.js +102 -0
- package/modules/discord/ship-broadcast.js +78 -0
- package/modules/discord/webhook.js +74 -0
- package/modules/economy/CLAUDE.md +48 -0
- package/modules/economy/achievements.js +594 -0
- package/modules/economy/cost-classify.js +331 -0
- package/modules/economy/cost-summary-shape.js +90 -0
- package/modules/economy/cost.js +438 -0
- package/modules/economy/credits.js +430 -0
- package/modules/economy/migrations/economy_001_fix_gds_shipper_description.sql +91 -0
- package/modules/economy/module.json +10 -0
- package/modules/economy/reward.js +61 -0
- package/modules/economy/routes/cost.js +97 -0
- package/modules/economy/routes/leaderboard.js +26 -0
- package/modules/economy/routes/reward.js +42 -0
- package/modules/economy/streak.js +285 -0
- package/modules/grading/CLAUDE.md +42 -0
- package/modules/grading/db.js +39 -0
- package/modules/grading/grader-rubric.json +151 -0
- package/modules/grading/grader-workers/efficiency.js +213 -0
- package/modules/grading/grader-workers/extract-json.js +80 -0
- package/modules/grading/grader-workers/fence.js +100 -0
- package/modules/grading/grader-workers/hacker.js +239 -0
- package/modules/grading/grader-workers/index.js +183 -0
- package/modules/grading/grader-workers/narc.js +207 -0
- package/modules/grading/grader-workers/quality.js +198 -0
- package/modules/grading/grader-workers/rubric.js +20 -0
- package/modules/grading/grader-workers/worker-prompt.js +89 -0
- package/modules/grading/grader-workers/worker-verdict.js +50 -0
- package/modules/grading/grader.js +1790 -0
- package/modules/grading/module.json +12 -0
- package/modules/grading/routes/grade.js +51 -0
- package/modules/hall-ui/CLAUDE.md +61 -0
- package/modules/hall-ui/module.json +14 -0
- package/modules/hall-ui/public/atlas.html +180 -0
- package/modules/hall-ui/public/atlas.js +336 -0
- package/modules/hall-ui/public/box-panel.js +423 -0
- package/modules/hall-ui/public/brand-apply.js +117 -0
- package/modules/hall-ui/public/builders.js +3028 -0
- package/modules/hall-ui/public/chime.wav +0 -0
- package/modules/hall-ui/public/copy-on-click.js +174 -0
- package/modules/hall-ui/public/cursors/arrow.png +0 -0
- package/modules/hall-ui/public/cursors/hand-pointer.png +0 -0
- package/modules/hall-ui/public/cursors/magnifier-out.png +0 -0
- package/modules/hall-ui/public/cursors/magnifier.png +0 -0
- package/modules/hall-ui/public/diagram-viewer.css +125 -0
- package/modules/hall-ui/public/diagram-viewer.js +330 -0
- package/modules/hall-ui/public/diagrams.html +113 -0
- package/modules/hall-ui/public/dom-utils.js +212 -0
- package/modules/hall-ui/public/drachmae.html +68 -0
- package/modules/hall-ui/public/drachmae.js +136 -0
- package/modules/hall-ui/public/gate.html +143 -0
- package/modules/hall-ui/public/gate.js +228 -0
- package/modules/hall-ui/public/goals-page.js +1297 -0
- package/modules/hall-ui/public/goals.html +376 -0
- package/modules/hall-ui/public/goals.js +119 -0
- package/modules/hall-ui/public/hall-widgets.js +189 -0
- package/modules/hall-ui/public/harbor.html +167 -0
- package/modules/hall-ui/public/harbor.js +335 -0
- package/modules/hall-ui/public/index.html +116 -0
- package/modules/hall-ui/public/instances-panel.js +172 -0
- package/modules/hall-ui/public/md-reader.js +234 -0
- package/modules/hall-ui/public/modules.html +119 -0
- package/modules/hall-ui/public/modules.js +154 -0
- package/modules/hall-ui/public/new-project-wizard.js +186 -0
- package/modules/hall-ui/public/not-ready.html +48 -0
- package/modules/hall-ui/public/pair.html +119 -0
- package/modules/hall-ui/public/pair.js +132 -0
- package/modules/hall-ui/public/primer.css +404 -0
- package/modules/hall-ui/public/primer.html +85 -0
- package/modules/hall-ui/public/primer.js +641 -0
- package/modules/hall-ui/public/profile.html +85 -0
- package/modules/hall-ui/public/profile.js +236 -0
- package/modules/hall-ui/public/ranks.html +69 -0
- package/modules/hall-ui/public/ranks.js +206 -0
- package/modules/hall-ui/public/roadmap.html +209 -0
- package/modules/hall-ui/public/roadmap.js +375 -0
- package/modules/hall-ui/public/sessions.html +92 -0
- package/modules/hall-ui/public/sessions.js +222 -0
- package/modules/hall-ui/public/settings.html +640 -0
- package/modules/hall-ui/public/settings.js +1219 -0
- package/modules/hall-ui/public/shell.js +495 -0
- package/modules/hall-ui/public/style.css +1748 -0
- package/modules/hall-ui/public/task-detail.js +253 -0
- package/modules/hall-ui/public/task.html +83 -0
- package/modules/hall-ui/public/task.js +326 -0
- package/modules/hall-ui/public/watch.html +333 -0
- package/modules/hall-ui/public/watch.js +859 -0
- package/modules/hall-ui/public/work.html +469 -0
- package/modules/hall-ui/public/work.js +1292 -0
- package/modules/ideas/CLAUDE.md +37 -0
- package/modules/ideas/blockers.js +100 -0
- package/modules/ideas/inbox.js +459 -0
- package/modules/ideas/module.json +10 -0
- package/modules/ideas/routes/blockers.js +120 -0
- package/modules/ideas/routes/inbox.js +230 -0
- package/modules/lifecycle/CLAUDE.md +63 -0
- package/modules/lifecycle/conflict-resolve.js +436 -0
- package/modules/lifecycle/db.js +4970 -0
- package/modules/lifecycle/done-when.js +355 -0
- package/modules/lifecycle/github-push.js +969 -0
- package/modules/lifecycle/goal-conflicts.js +133 -0
- package/modules/lifecycle/hierarchy.js +104 -0
- package/modules/lifecycle/lifecycle.js +58 -0
- package/modules/lifecycle/merge-lock.js +261 -0
- package/modules/lifecycle/migrations/lifecycle_001_goal_first_leads.sql +28 -0
- package/modules/lifecycle/migrations/lifecycle_002_backfill_orphan_task_goals.sql +36 -0
- package/modules/lifecycle/module.json +13 -0
- package/modules/lifecycle/pollers/publish-reconciler.js +20 -0
- package/modules/lifecycle/publish-reconciler.js +418 -0
- package/modules/lifecycle/routes/analytics.js +63 -0
- package/modules/lifecycle/routes/claims.js +506 -0
- package/modules/lifecycle/routes/dependencies.js +82 -0
- package/modules/lifecycle/routes/done-when.js +136 -0
- package/modules/lifecycle/routes/gate-approvals.js +197 -0
- package/modules/lifecycle/routes/goals.js +1419 -0
- package/modules/lifecycle/routes/lifecycle.js +43 -0
- package/modules/lifecycle/routes/tasks.js +1703 -0
- package/modules/lifecycle/routes/versions.js +128 -0
- package/modules/lifecycle/ship-card.js +505 -0
- package/modules/lifecycle/ship-preflight.js +225 -0
- package/modules/lifecycle/task-classifier.js +512 -0
- package/modules/lifecycle/version-close.js +106 -0
- package/modules/memory/CLAUDE.md +40 -0
- package/modules/memory/learnings.js +275 -0
- package/modules/memory/memory.js +572 -0
- package/modules/memory/module.json +12 -0
- package/modules/memory/routes/learnings.js +90 -0
- package/modules/memory/routes/memory.js +916 -0
- package/modules/memory/routes/search.js +188 -0
- package/modules/memory/search-chunker.js +252 -0
- package/modules/memory/search.js +320 -0
- package/modules/onboarding/CLAUDE.md +55 -0
- package/modules/onboarding/approval-broadcast.js +59 -0
- package/modules/onboarding/db.js +54 -0
- package/modules/onboarding/module.json +10 -0
- package/modules/onboarding/newcomer-restock.js +212 -0
- package/modules/onboarding/onboarding-state.js +532 -0
- package/modules/onboarding/onboarding.js +508 -0
- package/modules/onboarding/port.js +63 -0
- package/modules/onboarding/routes/access-requests.js +208 -0
- package/modules/onboarding/routes/onboarding.js +54 -0
- package/modules/security/CLAUDE.md +44 -0
- package/modules/security/module.json +10 -0
- package/modules/security/routes/reports.js +251 -0
- package/modules/security/secret-scrub.js +201 -0
- package/modules/security/security.js +294 -0
- package/modules/sessions/CLAUDE.md +39 -0
- package/modules/sessions/bfg.js +357 -0
- package/modules/sessions/db.js +326 -0
- package/modules/sessions/module.json +10 -0
- package/modules/sessions/pulse.js +149 -0
- package/modules/sessions/routes/sessions.js +331 -0
- package/modules/status-ui/CLAUDE.md +47 -0
- package/modules/status-ui/module.json +14 -0
- package/modules/status-ui/public/README.md +29 -0
- package/modules/status-ui/public/cursors/arrow.png +0 -0
- package/modules/status-ui/public/cursors/hand-pointer.png +0 -0
- package/modules/status-ui/public/index.html +363 -0
- package/modules/status-ui/public/snapshots/.gitkeep +0 -0
- package/modules/status-ui/public/status.js +1375 -0
- package/modules/status-ui/public/style.css +1342 -0
- package/package-lock.json +975 -0
- package/package.json +28 -0
- package/public-docs/index.html +35 -0
- package/public-docs/redoc.standalone.js +1838 -0
- package/public-docs/redoc.standalone.js.LICENSE.txt +102 -0
- package/public-landing/buddha.png +0 -0
- package/public-landing/create.html +868 -0
- package/public-landing/index.html +168 -0
- package/scripts/bongos-mcp.js +28 -0
- package/scripts/cron/style_guide_audit.sh +134 -0
- package/scripts/discord/README.md +52 -0
- package/scripts/discord/lib.js +80 -0
- package/scripts/discord/post.js +51 -0
- package/scripts/gds/CLAUDE.md +144 -0
- package/scripts/gds/abandon.js +58 -0
- package/scripts/gds/adopt-detect.js +123 -0
- package/scripts/gds/adopt-import.js +111 -0
- package/scripts/gds/adopt-preflight.js +121 -0
- package/scripts/gds/api.js +78 -0
- package/scripts/gds/architect-audit.js +288 -0
- package/scripts/gds/art-stage.js +152 -0
- package/scripts/gds/audit-authorship.sh +243 -0
- package/scripts/gds/audit-deps.js +121 -0
- package/scripts/gds/audit-exports.js +128 -0
- package/scripts/gds/audit-replay.sh +161 -0
- package/scripts/gds/audit-ships.js +251 -0
- package/scripts/gds/autonomy-gate.js +135 -0
- package/scripts/gds/backfill-cost.js +165 -0
- package/scripts/gds/backfill-sessions.js +351 -0
- package/scripts/gds/backfill-task-rewards.js +408 -0
- package/scripts/gds/backup.js +94 -0
- package/scripts/gds/bfg-principal-token.js +65 -0
- package/scripts/gds/box-auth-check.js +160 -0
- package/scripts/gds/box-connect-lib.js +453 -0
- package/scripts/gds/box.js +1258 -0
- package/scripts/gds/build-bongos.js +94 -0
- package/scripts/gds/capture.js +123 -0
- package/scripts/gds/cf-tunnel.js +419 -0
- package/scripts/gds/ci-grade.js +82 -0
- package/scripts/gds/claim-recall.js +112 -0
- package/scripts/gds/claim.js +333 -0
- package/scripts/gds/classify-discipline.js +153 -0
- package/scripts/gds/claude-materialize.js +176 -0
- package/scripts/gds/cleanup-orphans.js +74 -0
- package/scripts/gds/cli-lib.js +518 -0
- package/scripts/gds/code.js +101 -0
- package/scripts/gds/codemod-rename-src-gds.js +145 -0
- package/scripts/gds/conductor-dispatch.js +426 -0
- package/scripts/gds/context-pack.js +228 -0
- package/scripts/gds/coreB-carve-proof.sh +716 -0
- package/scripts/gds/cost.js +47 -0
- package/scripts/gds/db-backup-nightly.sh +160 -0
- package/scripts/gds/db-backup-offsite.sh +152 -0
- package/scripts/gds/demote.js +40 -0
- package/scripts/gds/design-sync.js +62 -0
- package/scripts/gds/diagnose-achievements.js +118 -0
- package/scripts/gds/diagram-facts.js +319 -0
- package/scripts/gds/discipline-modes.json +25 -0
- package/scripts/gds/discord-channels.js +66 -0
- package/scripts/gds/do-api.js +176 -0
- package/scripts/gds/docs-entropy.js +403 -0
- package/scripts/gds/doctor.js +389 -0
- package/scripts/gds/feedback-latest.js +94 -0
- package/scripts/gds/fetch-art-key.js +106 -0
- package/scripts/gds/fetch-sound-prefs.js +88 -0
- package/scripts/gds/figma-design-sync.js +61 -0
- package/scripts/gds/fitness.js +1446 -0
- package/scripts/gds/gate-review.js +322 -0
- package/scripts/gds/gating.js +325 -0
- package/scripts/gds/gds-db-backup.service +24 -0
- package/scripts/gds/gds-db-backup.timer +20 -0
- package/scripts/gds/gds-db-offsite.service +29 -0
- package/scripts/gds/gds-db-offsite.timer +18 -0
- package/scripts/gds/gen-api-client.js +508 -0
- package/scripts/gds/gen-api-docs.js +1037 -0
- package/scripts/gds/gen-atlas.js +366 -0
- package/scripts/gds/gen-diagrams.js +608 -0
- package/scripts/gds/gen-file-map.js +196 -0
- package/scripts/gds/gen-repo-map.js +519 -0
- package/scripts/gds/gen-session-index.js +210 -0
- package/scripts/gds/git-merge-regen.js +147 -0
- package/scripts/gds/grade-smoke.js +205 -0
- package/scripts/gds/hooks/pre-push.js +169 -0
- package/scripts/gds/http-api-client.js +88 -0
- package/scripts/gds/init.js +903 -0
- package/scripts/gds/install-git-hooks.js +114 -0
- package/scripts/gds/key-card.js +213 -0
- package/scripts/gds/key-status.js +126 -0
- package/scripts/gds/land-watch.js +168 -0
- package/scripts/gds/learning-capture.js +145 -0
- package/scripts/gds/lib.sh +44 -0
- package/scripts/gds/linkify-refs.js +473 -0
- package/scripts/gds/local-preview-lib.js +159 -0
- package/scripts/gds/local-preview.js +95 -0
- package/scripts/gds/login.js +225 -0
- package/scripts/gds/main-audit.js +279 -0
- package/scripts/gds/me.js +88 -0
- package/scripts/gds/memory-map.js +174 -0
- package/scripts/gds/merge-lock.js +71 -0
- package/scripts/gds/migration-namespace.js +200 -0
- package/scripts/gds/mirror-lineage-check.js +319 -0
- package/scripts/gds/mirror-redact.js +305 -0
- package/scripts/gds/module.js +482 -0
- package/scripts/gds/newcomer-floor.config.json +13 -0
- package/scripts/gds/newcomer-floor.js +415 -0
- package/scripts/gds/newcomer-floor.templates.json +86 -0
- package/scripts/gds/newcomer-floor.test.js +235 -0
- package/scripts/gds/next-number.js +163 -0
- package/scripts/gds/oauth-secret.js +197 -0
- package/scripts/gds/onboard.js +217 -0
- package/scripts/gds/onboarding-analyze.js +226 -0
- package/scripts/gds/onboarding-config.js +178 -0
- package/scripts/gds/onboarding-ship.js +92 -0
- package/scripts/gds/package-core.js +684 -0
- package/scripts/gds/paste-token.js +131 -0
- package/scripts/gds/portability-smoke-art.sh +85 -0
- package/scripts/gds/portability-smoke-memory.sh +147 -0
- package/scripts/gds/provision.js +1324 -0
- package/scripts/gds/publish-manifest.js +307 -0
- package/scripts/gds/pulse.js +309 -0
- package/scripts/gds/push-main.js +45 -0
- package/scripts/gds/read-session-export.js +359 -0
- package/scripts/gds/reauth.js +149 -0
- package/scripts/gds/recall.js +135 -0
- package/scripts/gds/release.js +71 -0
- package/scripts/gds/render-ideas.js +173 -0
- package/scripts/gds/repo-metrics.js +363 -0
- package/scripts/gds/resolve-skill-model.js +57 -0
- package/scripts/gds/run-routine.js +197 -0
- package/scripts/gds/run-unit-tests.js +178 -0
- package/scripts/gds/sandbox-stage.js +653 -0
- package/scripts/gds/search-ingest-db.js +209 -0
- package/scripts/gds/search-ingest-md.js +225 -0
- package/scripts/gds/security-baseline-check.sh +180 -0
- package/scripts/gds/seed-adopt-tasks.js +75 -0
- package/scripts/gds/seed-api-contract-goal-tasks.js +141 -0
- package/scripts/gds/seed-bongos-app-tasks.js +294 -0
- package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +81 -0
- package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +100 -0
- package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +307 -0
- package/scripts/gds/seed-bongos-module-system-tasks.js +346 -0
- package/scripts/gds/seed-bongos-tasks.js +214 -0
- package/scripts/gds/seed-gds-v4-tasks.js +624 -0
- package/scripts/gds/seed-governance-tasks.js +340 -0
- package/scripts/gds/seed-medusa-tasks.js +440 -0
- package/scripts/gds/seed-module-upstreaming.js +219 -0
- package/scripts/gds/seed-productization-tasks.js +235 -0
- package/scripts/gds/seed-provisioning-tasks.js +83 -0
- package/scripts/gds/seed-staging.sh +104 -0
- package/scripts/gds/seed-v2-world-tasks.js +283 -0
- package/scripts/gds/seed-v3-tasks.js +1981 -0
- package/scripts/gds/session-cost.js +393 -0
- package/scripts/gds/session-digest.js +179 -0
- package/scripts/gds/session-eval.js +576 -0
- package/scripts/gds/session.js +404 -0
- package/scripts/gds/setup.js +504 -0
- package/scripts/gds/shell.js +100 -0
- package/scripts/gds/ship.js +3618 -0
- package/scripts/gds/smoke-batch-claim.sh +213 -0
- package/scripts/gds/smoke-batch-release.sh +296 -0
- package/scripts/gds/smoke-box.sh +150 -0
- package/scripts/gds/smoke-claim-consistency.sh +212 -0
- package/scripts/gds/smoke-dependencies.sh +84 -0
- package/scripts/gds/smoke-gds.js +125 -0
- package/scripts/gds/smoke-write.sh +168 -0
- package/scripts/gds/start.js +782 -0
- package/scripts/gds/status.js +365 -0
- package/scripts/gds/triage.js +366 -0
- package/scripts/gds/upgrade.js +421 -0
- package/scripts/gds/validate-design.js +254 -0
- package/scripts/gds/version-close.js +549 -0
- package/scripts/migrate.sh +183 -0
- package/scripts/migrate_cost_ledger.sh +178 -0
- package/scripts/public-mirror-export.js +291 -0
- package/scripts/render-diagrams.sh +88 -0
- package/scripts/security/dep-audit.js +276 -0
- package/scripts/setup-builder.js +274 -0
- package/scripts/setup-builder.sh +28 -0
- package/scripts/snapshots/backfill-history.mjs +292 -0
- package/scripts/snapshots/maybe-render-on-deploy.sh +66 -0
- package/scripts/snapshots/render-pre-art-eras.mjs +329 -0
- package/scripts/snapshots/render-world.mjs +322 -0
- package/scripts/status-mirror-sync.js +192 -0
- package/scripts/status-probe.mjs +185 -0
- package/server.js +212 -0
- package/src/asset-version.js +71 -0
- package/src/bongos/CLAUDE.md +64 -0
- package/src/bongos/api-errors.js +281 -0
- package/src/bongos/api-path-404.js +67 -0
- package/src/bongos/api-prefix.js +38 -0
- package/src/bongos/app-pair.js +172 -0
- package/src/bongos/auth.js +979 -0
- package/src/bongos/cascade-dispatch.js +123 -0
- package/src/bongos/db-kernel.js +252 -0
- package/src/bongos/db.js +911 -0
- package/src/bongos/goal-scope-check.js +120 -0
- package/src/bongos/hierarchy-config.js +189 -0
- package/src/bongos/live-channel.js +145 -0
- package/src/bongos/llm-cache.js +260 -0
- package/src/bongos/llm-pricing.js +220 -0
- package/src/bongos/metrics.js +286 -0
- package/src/bongos/middleware/audit.js +274 -0
- package/src/bongos/middleware/error-envelope.js +93 -0
- package/src/bongos/middleware/rate-limit.js +195 -0
- package/src/bongos/module-scope-map.js +271 -0
- package/src/bongos/optimizer.js +166 -0
- package/src/bongos/path-match.js +47 -0
- package/src/bongos/permission-path-check.js +248 -0
- package/src/bongos/pool.js +55 -0
- package/src/bongos/repo-info.js +91 -0
- package/src/bongos/route-rank-check.js +420 -0
- package/src/bongos/routes/CLAUDE.md +43 -0
- package/src/bongos/routes/_helpers.js +369 -0
- package/src/bongos/routes/audit-log.js +59 -0
- package/src/bongos/routes/auth.js +755 -0
- package/src/bongos/routes/backup.js +104 -0
- package/src/bongos/routes/builders.js +526 -0
- package/src/bongos/routes/healthz.js +16 -0
- package/src/bongos/routes/instance.js +129 -0
- package/src/bongos/routes/live.js +125 -0
- package/src/bongos/routes/llm-cache.js +119 -0
- package/src/bongos/routes/me.js +380 -0
- package/src/bongos/routes/modules.js +131 -0
- package/src/bongos/routes/optimizer.js +54 -0
- package/src/bongos/routes/public.js +476 -0
- package/src/bongos/routes/security.js +207 -0
- package/src/bongos/routes.js +166 -0
- package/src/bongos/secret-box.js +177 -0
- package/src/bongos/sensitive-surfaces.js +30 -0
- package/src/bongos/serve-internal.js +889 -0
- package/src/bongos/uptime-poller.js +90 -0
- package/src/bongos-downloads.js +70 -0
- package/src/branding.js +182 -0
- package/src/build-info.js +77 -0
- package/src/devbox-downloads.js +67 -0
- package/src/instance-config.js +200 -0
- package/src/module-api.js +366 -0
- package/src/module-loader/loader.js +268 -0
- package/src/module-loader/manifest-schema.js +140 -0
- package/src/module-loader/provenance.js +28 -0
- package/src/module-loader/semver.js +100 -0
- package/src/module-seams.js +291 -0
- package/src/modules.js +254 -0
- package/src/platform-server.js +135 -0
- package/src/ui/adapters/claude-design/index.js +333 -0
- package/src/ui/adapters/figma/index.js +328 -0
- package/tests/abandon_task.mjs +138 -0
- package/tests/achievements_reconcile.mjs +167 -0
- package/tests/adopt_detect.mjs +141 -0
- package/tests/adopt_import.mjs +132 -0
- package/tests/adopt_preflight.mjs +105 -0
- package/tests/anti_grid.mjs +89 -0
- package/tests/api_client.mjs +231 -0
- package/tests/api_docs.mjs +283 -0
- package/tests/api_error_envelope_buildcheck.mjs +56 -0
- package/tests/api_error_envelope_middleware.mjs +99 -0
- package/tests/api_error_registry.mjs +108 -0
- package/tests/api_pagination_contract.mjs +51 -0
- package/tests/api_path_404.mjs +96 -0
- package/tests/app_pair.mjs +168 -0
- package/tests/architect.mjs +140 -0
- package/tests/art_key.mjs +121 -0
- package/tests/art_stage.mjs +121 -0
- package/tests/asset_version.mjs +94 -0
- package/tests/atlas.mjs +69 -0
- package/tests/audit_deps.mjs +74 -0
- package/tests/audit_middleware.mjs +385 -0
- package/tests/auth_admission_gate.mjs +164 -0
- package/tests/auth_anthropic_identity.mjs +95 -0
- package/tests/auth_duplicate_cookie.mjs +56 -0
- package/tests/auth_error_brand.mjs +77 -0
- package/tests/auth_flow_slice1.mjs +223 -0
- package/tests/auth_inactive_builder.mjs +94 -0
- package/tests/auth_page_gate.mjs +92 -0
- package/tests/auth_session_ttl.mjs +155 -0
- package/tests/autonomous_fit_protected_paths.mjs +115 -0
- package/tests/autonomy_gate.mjs +85 -0
- package/tests/autotile_variants.mjs +256 -0
- package/tests/autotile_xverify.mjs +133 -0
- package/tests/backfill_sessions.mjs +101 -0
- package/tests/backfill_task_rewards.mjs +152 -0
- package/tests/backup_cli.mjs +104 -0
- package/tests/bfg.mjs +327 -0
- package/tests/bfg_write.mjs +423 -0
- package/tests/bongos_box_connect.mjs +89 -0
- package/tests/bongos_dispatch.mjs +74 -0
- package/tests/bongos_downloads.mjs +118 -0
- package/tests/bongos_login.mjs +34 -0
- package/tests/box_access.mjs +186 -0
- package/tests/box_auth_check.mjs +114 -0
- package/tests/box_code_staleness.mjs +116 -0
- package/tests/box_connect_e2e.mjs +196 -0
- package/tests/box_cost.mjs +70 -0
- package/tests/box_dns_repoint.mjs +151 -0
- package/tests/box_host_keys.mjs +102 -0
- package/tests/box_onboard.mjs +317 -0
- package/tests/box_scope_session.mjs +115 -0
- package/tests/box_ship_permissions.mjs +71 -0
- package/tests/box_terminal_ssrf.mjs +90 -0
- package/tests/boxes.mjs +1255 -0
- package/tests/branding.mjs +88 -0
- package/tests/bug_attachments.mjs +189 -0
- package/tests/build_info.mjs +88 -0
- package/tests/builder_needs.mjs +99 -0
- package/tests/cap_newcomer_tasks.mjs +114 -0
- package/tests/cascade-dispatch.mjs +95 -0
- package/tests/cf_tunnel.mjs +459 -0
- package/tests/claim_recall.mjs +150 -0
- package/tests/claims_bind_session.mjs +47 -0
- package/tests/claude_materialize.mjs +148 -0
- package/tests/cli_box_scope.mjs +52 -0
- package/tests/cli_lib_formatters.mjs +87 -0
- package/tests/cli_token_reissue.mjs +147 -0
- package/tests/client_bundle_route.mjs +47 -0
- package/tests/cloud_bongos_pack.mjs +85 -0
- package/tests/conductor.mjs +496 -0
- package/tests/confirm_attribution.mjs +156 -0
- package/tests/conflict_resolve.mjs +462 -0
- package/tests/context_pack.mjs +240 -0
- package/tests/cost.mjs +94 -0
- package/tests/cost_audit.mjs +122 -0
- package/tests/cost_budget_status.mjs +78 -0
- package/tests/cost_reconcile.mjs +102 -0
- package/tests/cost_summary_shape.mjs +94 -0
- package/tests/credit_grant.mjs +376 -0
- package/tests/criterion_progress.mjs +220 -0
- package/tests/criterion_proposal.mjs +109 -0
- package/tests/criterion_ref_parse.mjs +53 -0
- package/tests/currency_label.mjs +119 -0
- package/tests/day_cycle.mjs +197 -0
- package/tests/dependencies_migration.mjs +77 -0
- package/tests/dependencies_polymorphic.mjs +212 -0
- package/tests/deploy_instance.mjs +78 -0
- package/tests/devbox_downloads.mjs +122 -0
- package/tests/diff_derived_signals.mjs +115 -0
- package/tests/discord_approvals.mjs +174 -0
- package/tests/discord_autojoin.mjs +158 -0
- package/tests/discord_bot.mjs +94 -0
- package/tests/discord_bugs.mjs +297 -0
- package/tests/discord_channels.mjs +337 -0
- package/tests/discord_foundation.mjs +76 -0
- package/tests/discord_inbound.mjs +190 -0
- package/tests/discord_message_buffer.mjs +87 -0
- package/tests/discord_oauth.mjs +55 -0
- package/tests/discord_reaction.mjs +170 -0
- package/tests/discord_role_sync.mjs +151 -0
- package/tests/display_name.mjs +123 -0
- package/tests/dns_preflight.mjs +74 -0
- package/tests/event_sound_prefs.mjs +194 -0
- package/tests/eviction_policy.mjs +279 -0
- package/tests/figma_adapter.mjs +199 -0
- package/tests/file_map.mjs +91 -0
- package/tests/first_admin_bootstrap.mjs +40 -0
- package/tests/fitness.mjs +435 -0
- package/tests/fitness_two_root.mjs +104 -0
- package/tests/fixtures/session-506-digest.json +34 -0
- package/tests/gate_approvals.mjs +451 -0
- package/tests/gate_review.mjs +152 -0
- package/tests/git_merge_regen.mjs +151 -0
- package/tests/github_push_ancestry.mjs +119 -0
- package/tests/github_push_land_proof.mjs +127 -0
- package/tests/github_push_merge_driver.mjs +175 -0
- package/tests/goal_abuse_matrix.mjs +187 -0
- package/tests/goal_achievement.mjs +146 -0
- package/tests/goal_conflicts.mjs +305 -0
- package/tests/goal_dependencies_read.mjs +73 -0
- package/tests/goal_member_roles.mjs +420 -0
- package/tests/goal_membership_requests.mjs +332 -0
- package/tests/goal_routes.mjs +203 -0
- package/tests/goal_scope_check.mjs +167 -0
- package/tests/goal_tier.mjs +312 -0
- package/tests/goal_wall_proof.mjs +112 -0
- package/tests/grade_attempts.mjs +73 -0
- package/tests/grade_attribution.mjs +117 -0
- package/tests/grade_diff_hash.mjs +191 -0
- package/tests/grade_server_authoritative.mjs +305 -0
- package/tests/grade_unavailable_display.mjs +66 -0
- package/tests/grader.mjs +1960 -0
- package/tests/grader_bypass.mjs +57 -0
- package/tests/grader_panel.mjs +252 -0
- package/tests/grader_prompt_fencing.mjs +192 -0
- package/tests/helpers.mjs +52 -0
- package/tests/hierarchy-config.mjs +81 -0
- package/tests/init.mjs +463 -0
- package/tests/instance_config.mjs +76 -0
- package/tests/instance_manifest.mjs +110 -0
- package/tests/interaction_prefs.mjs +72 -0
- package/tests/key-card.mjs +110 -0
- package/tests/key-status.mjs +45 -0
- package/tests/land_watch.mjs +115 -0
- package/tests/lifecycle-card.mjs +145 -0
- package/tests/lifecycle_breakdown_view.mjs +236 -0
- package/tests/linkify_refs.mjs +264 -0
- package/tests/live_channel.mjs +128 -0
- package/tests/live_sse.mjs +122 -0
- package/tests/llm-cache-route.mjs +110 -0
- package/tests/llm-cache.mjs +140 -0
- package/tests/llm-pricing.mjs +152 -0
- package/tests/local_preview.mjs +136 -0
- package/tests/main_audit.mjs +137 -0
- package/tests/memory_isolation.mjs +431 -0
- package/tests/memory_map.mjs +107 -0
- package/tests/memory_pull.mjs +429 -0
- package/tests/merge_lease.mjs +100 -0
- package/tests/merge_lock.mjs +312 -0
- package/tests/metrics.mjs +147 -0
- package/tests/migration_allocation.mjs +146 -0
- package/tests/migration_namespace.mjs +185 -0
- package/tests/migrations_fresh_replay_guard.mjs +38 -0
- package/tests/mirror_lineage_fulltree.mjs +45 -0
- package/tests/mirror_lineage_proof.mjs +72 -0
- package/tests/mirror_redact.mjs +193 -0
- package/tests/model_alloc_prefs.mjs +63 -0
- package/tests/module-scope-map.mjs +88 -0
- package/tests/module_api.mjs +110 -0
- package/tests/module_cli.mjs +292 -0
- package/tests/module_contributions.mjs +148 -0
- package/tests/module_loader.mjs +286 -0
- package/tests/module_manifest.mjs +194 -0
- package/tests/module_owned_tests.mjs +105 -0
- package/tests/module_provenance.mjs +34 -0
- package/tests/module_route_rank.mjs +147 -0
- package/tests/module_seams.mjs +68 -0
- package/tests/modules.mjs +156 -0
- package/tests/modules_route.mjs +38 -0
- package/tests/newcomer_floor.mjs +17 -0
- package/tests/newcomer_restock.mjs +80 -0
- package/tests/next_number.mjs +154 -0
- package/tests/oauth_secret.mjs +60 -0
- package/tests/onboard.mjs +70 -0
- package/tests/onboarding_gate.mjs +267 -0
- package/tests/onboarding_observability.mjs +344 -0
- package/tests/onboarding_route_signals.mjs +175 -0
- package/tests/onboarding_state.mjs +346 -0
- package/tests/one_active_claim_per_session.mjs +111 -0
- package/tests/orphaned_claim_ship.mjs +135 -0
- package/tests/override_attribution.mjs +142 -0
- package/tests/override_request_ownership.mjs +235 -0
- package/tests/package_core.mjs +435 -0
- package/tests/parallel-load.mjs +402 -0
- package/tests/path_match.mjs +62 -0
- package/tests/permission_path.mjs +151 -0
- package/tests/platform_boot.mjs +167 -0
- package/tests/pre_compact.mjs +60 -0
- package/tests/preview_server.mjs +127 -0
- package/tests/profile_route.mjs +197 -0
- package/tests/provision.mjs +805 -0
- package/tests/provisioning_github_app_routes.mjs +98 -0
- package/tests/public_mirror_export.mjs +124 -0
- package/tests/public_task_resolver.mjs +112 -0
- package/tests/publish_branch_route.mjs +422 -0
- package/tests/publish_manifest.mjs +184 -0
- package/tests/publish_reconciler.mjs +728 -0
- package/tests/rank_gate.mjs +463 -0
- package/tests/rate_limit_public.mjs +217 -0
- package/tests/read_session_export.mjs +89 -0
- package/tests/recall_cli.mjs +82 -0
- package/tests/recall_hints.mjs +119 -0
- package/tests/recent_shipped_window.mjs +80 -0
- package/tests/regrade_eligibility.mjs +202 -0
- package/tests/render_prefs.mjs +122 -0
- package/tests/repo_map.mjs +92 -0
- package/tests/reward_gate.mjs +284 -0
- package/tests/route_rank_check.mjs +243 -0
- package/tests/route_validation.mjs +490 -0
- package/tests/routine_timers.mjs +72 -0
- package/tests/rubric_fixtures.mjs +140 -0
- package/tests/run_routine.mjs +69 -0
- package/tests/sandbox_stage.mjs +582 -0
- package/tests/scrubber_corpus.mjs +257 -0
- package/tests/search_chunker.mjs +209 -0
- package/tests/search_ingest.mjs +96 -0
- package/tests/search_ingest_db.mjs +88 -0
- package/tests/search_isolation.mjs +204 -0
- package/tests/search_route.mjs +95 -0
- package/tests/secret_box.mjs +189 -0
- package/tests/security_docs.mjs +186 -0
- package/tests/security_route.mjs +108 -0
- package/tests/served_paths_shipped.mjs +118 -0
- package/tests/session-cards.mjs +142 -0
- package/tests/session_506_regression.mjs +69 -0
- package/tests/session_caps.mjs +238 -0
- package/tests/session_cost.mjs +133 -0
- package/tests/session_digest.mjs +73 -0
- package/tests/session_eval.mjs +386 -0
- package/tests/session_index.mjs +105 -0
- package/tests/session_records.mjs +369 -0
- package/tests/session_search.mjs +78 -0
- package/tests/session_start_freshness.mjs +123 -0
- package/tests/setup_smoke.mjs +154 -0
- package/tests/ship_autolinkify.mjs +60 -0
- package/tests/ship_automerge_injection.mjs +174 -0
- package/tests/ship_broadcast_routing.mjs +125 -0
- package/tests/ship_broadcast_server.mjs +175 -0
- package/tests/ship_card.mjs +280 -0
- package/tests/ship_ci_deploy.mjs +374 -0
- package/tests/ship_preflight.mjs +368 -0
- package/tests/ship_premerge.mjs +75 -0
- package/tests/ship_resume.mjs +129 -0
- package/tests/ship_upload_skip.mjs +89 -0
- package/tests/ship_zero_commit.mjs +60 -0
- package/tests/single_host_hall.mjs +98 -0
- package/tests/skill_prefs.mjs +150 -0
- package/tests/smoke_preflight.mjs +66 -0
- package/tests/snapshot_picker.mjs +233 -0
- package/tests/sound_prefs.mjs +198 -0
- package/tests/sprite_facing.mjs +35 -0
- package/tests/status-probe.mjs +89 -0
- package/tests/status_backfill.mjs +94 -0
- package/tests/stop_refcheck.mjs +127 -0
- package/tests/streak.mjs +175 -0
- package/tests/subdomain_auth.mjs +58 -0
- package/tests/task_classifier_vocab.mjs +41 -0
- package/tests/task_create_idempotency.mjs +96 -0
- package/tests/task_goal_link.mjs +93 -0
- package/tests/task_ownership_gate.mjs +125 -0
- package/tests/terrain_picker.mjs +298 -0
- package/tests/touches_overlap.mjs +75 -0
- package/tests/triage_development.mjs +140 -0
- package/tests/turn_in_place.mjs +280 -0
- package/tests/upgrade.mjs +357 -0
- package/tests/verify_task_guard.mjs +64 -0
- package/tests/version_close.mjs +76 -0
- package/tests/versions_route.mjs +93 -0
- package/tests/walkability.mjs +188 -0
- package/tests/wandering_prefs.mjs +176 -0
- package/tests/worktree_disambiguation.mjs +105 -0
- package/tests/worktree_guard.mjs +90 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
-- 060_access_requests.sql — onboarding cold-start (2026-05-30).
|
|
2
|
+
--
|
|
3
|
+
-- A brand-new person who wants to build has a chicken-and-egg problem: the code
|
|
4
|
+
-- lives in a PRIVATE GitHub repo, so they can't do anything until an Archon adds
|
|
5
|
+
-- them as a collaborator. Until now there was no way to ask — the welcome copy
|
|
6
|
+
-- said "an Archon will give thee the link" with no mechanism behind it, and the
|
|
7
|
+
-- Archon was never notified. This table is the request queue that closes that gap.
|
|
8
|
+
--
|
|
9
|
+
-- It is written by an UNAUTHENTICATED visitor (POST /api/gds/access-requests is
|
|
10
|
+
-- the one public write on the GDS) — by definition the requester is outside the
|
|
11
|
+
-- system and has no builder row yet. The only thing we capture is what an Archon
|
|
12
|
+
-- needs to send the GitHub collaborator invite: the GitHub username, an optional
|
|
13
|
+
-- display name, and an optional note. The global IP rate-limiter guards the
|
|
14
|
+
-- endpoint against spam; a partial unique index stops a username from piling up
|
|
15
|
+
-- duplicate open requests.
|
|
16
|
+
--
|
|
17
|
+
-- Lifecycle: pending → invited | dismissed (terminal; the row stays as the audit
|
|
18
|
+
-- trail). 'invited' = an Archon sent the GitHub invite. 'dismissed' = declined /
|
|
19
|
+
-- spam / duplicate. resolved_by_builder_id records which Archon acted.
|
|
20
|
+
|
|
21
|
+
CREATE TABLE IF NOT EXISTS access_requests (
|
|
22
|
+
id bigserial PRIMARY KEY,
|
|
23
|
+
github_login text NOT NULL,
|
|
24
|
+
display_name text,
|
|
25
|
+
note text,
|
|
26
|
+
status text NOT NULL DEFAULT 'pending'
|
|
27
|
+
CHECK (status IN ('pending', 'invited', 'dismissed')),
|
|
28
|
+
resolved_by_builder_id bigint REFERENCES builders(id),
|
|
29
|
+
resolved_at timestamptz,
|
|
30
|
+
created_at timestamptz NOT NULL DEFAULT now()
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
-- Archon queue lookup: "open requests, newest first."
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_access_requests_pending
|
|
35
|
+
ON access_requests (created_at DESC)
|
|
36
|
+
WHERE status = 'pending';
|
|
37
|
+
|
|
38
|
+
-- At most one OPEN request per GitHub login (case-insensitive). Historical
|
|
39
|
+
-- rows (invited/dismissed) don't conflict, so a username can re-request after
|
|
40
|
+
-- a dismissal.
|
|
41
|
+
CREATE UNIQUE INDEX IF NOT EXISTS uniq_access_requests_open_per_login
|
|
42
|
+
ON access_requests (lower(github_login))
|
|
43
|
+
WHERE status = 'pending';
|
|
44
|
+
|
|
45
|
+
INSERT INTO schema_migrations (version) VALUES ('060_access_requests')
|
|
46
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
-- 061_backfill_override_ship_attribution.sql — fix #538 misattribution (2026-06-02).
|
|
2
|
+
--
|
|
3
|
+
-- Before #538, decideOverrideRequest set tasks.shipped_by = COALESCE(shipped_by,
|
|
4
|
+
-- archonId) when an Archon APPROVED a grader-false-negative override, so the SHIP
|
|
5
|
+
-- was attributed to the approving Archon (driving the builders' hall + peer-vote
|
|
6
|
+
-- feed) instead of the builder who actually did the work — even though the CREDIT
|
|
7
|
+
-- was routed to the requester correctly. The code is fixed; this backfills the
|
|
8
|
+
-- rows the old code already mis-stamped.
|
|
9
|
+
--
|
|
10
|
+
-- Re-point shipped_by to the original requester for every task that an APPROVED
|
|
11
|
+
-- override left attributed to its approving Archon. Idempotent: once
|
|
12
|
+
-- shipped_by = requester (which is DISTINCT FROM the decider) the WHERE no longer
|
|
13
|
+
-- matches, so re-running is a no-op.
|
|
14
|
+
--
|
|
15
|
+
-- Known instance at write time: task #477 (fisher NPC, LarsCode #3), already
|
|
16
|
+
-- corrected by hand on prod under the #538 claim. This migration makes that
|
|
17
|
+
-- correction reproducible in every environment (staging, restored backups) and
|
|
18
|
+
-- auditable in the diff — addressing the grader's blocker that the backfill was
|
|
19
|
+
-- otherwise invisible outside a side-channel psql command.
|
|
20
|
+
|
|
21
|
+
UPDATE tasks t
|
|
22
|
+
SET shipped_by = r.requested_by_builder_id,
|
|
23
|
+
updated_at = now()
|
|
24
|
+
FROM task_override_requests r
|
|
25
|
+
WHERE r.task_id = t.id
|
|
26
|
+
AND r.status = 'approved'
|
|
27
|
+
AND r.requested_by_builder_id IS NOT NULL
|
|
28
|
+
AND t.shipped_by = r.decided_by_builder_id
|
|
29
|
+
AND t.shipped_by IS DISTINCT FROM r.requested_by_builder_id;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
-- 062_session_records.sql — BFG session-inefficiency evaluator, sub-phase 6D.1
|
|
2
|
+
-- (ADR 0027). Stores a compact, secret-scrubbed digest of each shipped Claude
|
|
3
|
+
-- Code session so the BFG (a LOCAL Claude Code routine — 6D.3) can search the
|
|
4
|
+
-- corpus (6D.2) and deep-dive the wasteful ones.
|
|
5
|
+
--
|
|
6
|
+
-- Design note (privacy + size): the heavy transcript CONTENT is never uploaded.
|
|
7
|
+
-- Each row holds per-turn METADATA (role, tool name, error flag, token usage,
|
|
8
|
+
-- content length) + short secret-scrubbed snippets + token aggregates. That
|
|
9
|
+
-- keeps rows small (KB, not MB) and the secret surface minimal — ADR 0027's
|
|
10
|
+
-- "scrubbed, retention-bounded" posture.
|
|
11
|
+
--
|
|
12
|
+
-- Write path: scripts/gds/ship.js uploads via POST /api/gds/sessions on a
|
|
13
|
+
-- successful ship (best-effort, non-blocking). Deduped per session_id — a
|
|
14
|
+
-- session that ships multiple tasks upserts once, accumulating task_ids.
|
|
15
|
+
-- Read path (6D.2, separate task): self-serve read of one's OWN sessions + an
|
|
16
|
+
-- Archon-gated (BFG-principal when 6C.1 lands) cross-builder search.
|
|
17
|
+
|
|
18
|
+
CREATE TABLE IF NOT EXISTS session_records (
|
|
19
|
+
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
20
|
+
session_id text NOT NULL UNIQUE, -- Claude Code CLAUDE_CODE_SESSION_ID
|
|
21
|
+
builder_id bigint NOT NULL REFERENCES builders(id),
|
|
22
|
+
task_ids bigint[] NOT NULL DEFAULT '{}', -- tasks shipped from this session
|
|
23
|
+
drachmae_earned integer NOT NULL DEFAULT 0, -- credit_log delta attributable to the session
|
|
24
|
+
total_tokens bigint NOT NULL DEFAULT 0, -- summed transcript usage (in + out + cache)
|
|
25
|
+
duration_seconds integer, -- transcript first -> last timestamp
|
|
26
|
+
started_at timestamptz,
|
|
27
|
+
ended_at timestamptz,
|
|
28
|
+
uploaded_at timestamptz NOT NULL DEFAULT now(),
|
|
29
|
+
detail jsonb NOT NULL DEFAULT '[]'::jsonb, -- per-turn metadata + short scrubbed snippets
|
|
30
|
+
metrics jsonb NOT NULL DEFAULT '{}'::jsonb -- derived aggregates (turns, tool errors, token buckets)
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_session_records_builder ON session_records (builder_id);
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_session_records_uploaded ON session_records (uploaded_at DESC);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
-- 063_session_records_tool_errors_idx.sql — BFG session evaluator 6D.2 (ADR 0027).
|
|
2
|
+
--
|
|
3
|
+
-- searchSessions sorts AND filters on COALESCE((metrics->>'tool_error_count')::int, 0)
|
|
4
|
+
-- (the "interesting session" signal). Postgres only uses an expression index
|
|
5
|
+
-- when the indexed expression EXACTLY matches the query's — so the index must
|
|
6
|
+
-- include the same COALESCE wrapper db.js uses, or it's inert (#541 grade).
|
|
7
|
+
--
|
|
8
|
+
-- Harmless + fast at current scale (the table is tiny); this is forward cover.
|
|
9
|
+
|
|
10
|
+
CREATE INDEX IF NOT EXISTS idx_session_records_tool_errors
|
|
11
|
+
ON session_records ((COALESCE((metrics->>'tool_error_count')::int, 0)));
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
-- 064_grade_attempts.sql — BFG session evaluator 6D.6 (ADR 0027).
|
|
2
|
+
--
|
|
3
|
+
-- task_grades has task_id UNIQUE — it keeps only the LATEST grade, so the number
|
|
4
|
+
-- of grade ATTEMPTS (re-grade thrash) is lost. This append-only log records every
|
|
5
|
+
-- grader run so that thrash is countable (the #506-class signal: a task graded
|
|
6
|
+
-- 3+ times burned a lot of tokens). Written best-effort + post-commit by
|
|
7
|
+
-- db.applyGrade — a logging failure never affects the grade that just committed.
|
|
8
|
+
|
|
9
|
+
CREATE TABLE IF NOT EXISTS grade_attempts (
|
|
10
|
+
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
11
|
+
task_id bigint NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
12
|
+
builder_id bigint REFERENCES builders(id),
|
|
13
|
+
passed boolean NOT NULL,
|
|
14
|
+
score numeric(3,1),
|
|
15
|
+
attempted_at timestamptz NOT NULL DEFAULT now()
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_grade_attempts_task ON grade_attempts (task_id);
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
-- 065_bfg_principal.sql — BFG service principal + cross-builder memory WRITE
|
|
2
|
+
-- substrate (MAS Phase 6 sub-phase 6C.1, ADR 0026 §6C).
|
|
3
|
+
--
|
|
4
|
+
-- THE trust-boundary exception (extends ADR 0016): this lands the IDENTITY half
|
|
5
|
+
-- of the first cross-builder memory WRITE capability in the system. The write
|
|
6
|
+
-- endpoint (src/bongos/routes/memory.js) gates on the EXACT principal identity
|
|
7
|
+
-- (builders.system_role = 'bfg'), NOT on rank — so an Archon token, or any
|
|
8
|
+
-- rank-escalated / stolen token, is rejected at the write endpoint (ADR 0026:
|
|
9
|
+
-- "gate on the exact principal identity, not on rank"). The principal:
|
|
10
|
+
-- * cannot claim work — status='inactive' reuses the existing db.claimTask
|
|
11
|
+
-- guard (BUILDER_INACTIVE), so no new claim-path code is needed;
|
|
12
|
+
-- * cannot earn drachmae — it never claims/ships, so credit_log never grows
|
|
13
|
+
-- for it (and it's rank='xenos', which carries no authority anyway);
|
|
14
|
+
-- * is not loginable — github_id 'system:bfg' is non-numeric, so the GitHub
|
|
15
|
+
-- OAuth upsert path (numeric ids) can never produce or authenticate it.
|
|
16
|
+
--
|
|
17
|
+
-- karma_log.reason is free-text (migration 040) — no schema change is needed to
|
|
18
|
+
-- "add" a reason. This migration DOCUMENTS the new BFG vocabulary so the value
|
|
19
|
+
-- is discoverable in one place:
|
|
20
|
+
-- karma_log.reason 'bfg_correction' — a transparent, attributed
|
|
21
|
+
-- negative karma delta the BFG applies ALONGSIDE a visible
|
|
22
|
+
-- corrective memory note (wired in 6C.2). granted_by = the
|
|
23
|
+
-- BFG principal id.
|
|
24
|
+
-- audit_log action 'bfg_dream_write' / — recorded per cross-builder write
|
|
25
|
+
-- 'bfg_correction_write' by the write endpoint (the
|
|
26
|
+
-- audit_log.method CHECK only allows write verbs, so the
|
|
27
|
+
-- true semantics live in request_body_redacted.action,
|
|
28
|
+
-- mirroring the Archon forensic-read pattern).
|
|
29
|
+
|
|
30
|
+
-- 1. system_role marker: NULL for every human builder, 'bfg' for the principal.
|
|
31
|
+
-- The write endpoint's identity gate keys on this exact value.
|
|
32
|
+
ALTER TABLE builders ADD COLUMN IF NOT EXISTS system_role text;
|
|
33
|
+
|
|
34
|
+
-- At most one row per system role (a second 'bfg' row is a bug, not a feature).
|
|
35
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_builders_system_role
|
|
36
|
+
ON builders (system_role) WHERE system_role IS NOT NULL;
|
|
37
|
+
|
|
38
|
+
-- Defense-in-depth allowlist: system_role may only be NULL or a KNOWN system
|
|
39
|
+
-- role. The app-layer gate (requireBfgPrincipal) checks exact equality, but a
|
|
40
|
+
-- DB-level CHECK means even raw SQL or a future careless update route cannot
|
|
41
|
+
-- mint an arbitrary system_role and ride a (hypothetically relaxed) gate. A new
|
|
42
|
+
-- system principal in the future widens this CHECK in its own migration — an
|
|
43
|
+
-- intentional, reviewable act, not an accident. Idempotent via pg_constraint.
|
|
44
|
+
DO $$ BEGIN
|
|
45
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'builders_system_role_check') THEN
|
|
46
|
+
ALTER TABLE builders
|
|
47
|
+
ADD CONSTRAINT builders_system_role_check
|
|
48
|
+
CHECK (system_role IS NULL OR system_role IN ('bfg'));
|
|
49
|
+
END IF;
|
|
50
|
+
END $$;
|
|
51
|
+
|
|
52
|
+
-- 2. The BFG service principal. Idempotent via NOT EXISTS (the #476 guard for
|
|
53
|
+
-- hardcoded natural keys — re-running this migration is a no-op). All three
|
|
54
|
+
-- NOT NULL columns without defaults (github_id, github_login, display_name)
|
|
55
|
+
-- are provided; rank/status are set explicitly though they have defaults.
|
|
56
|
+
INSERT INTO builders (github_id, github_login, display_name, rank, status, system_role)
|
|
57
|
+
SELECT 'system:bfg', 'bfg-system', 'The BFG (system)', 'xenos', 'inactive', 'bfg'
|
|
58
|
+
WHERE NOT EXISTS (SELECT 1 FROM builders WHERE system_role = 'bfg');
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
-- #569 — Builders-hall live updates: Postgres NOTIFY triggers.
|
|
2
|
+
--
|
|
3
|
+
-- The builders hall (public-builders/) fetched every panel ONCE at page load
|
|
4
|
+
-- and then froze until a manual refresh — so an onboarding step that ticks
|
|
5
|
+
-- server-side (e.g. after /builder-ship) never showed until the page reloaded.
|
|
6
|
+
-- See docs/adr/0030-builders-hall-live-updates.md for the full design.
|
|
7
|
+
--
|
|
8
|
+
-- This migration is the "something changed" signal source. A single
|
|
9
|
+
-- statement-level AFTER trigger on each table that backs a live panel emits a
|
|
10
|
+
-- pg_notify on the 'gds_live' channel carrying a minimal {table, op} payload.
|
|
11
|
+
-- The GDS process holds one persistent LISTEN connection (src/bongos/live-channel.js)
|
|
12
|
+
-- and relays each notification to the Colyseus BuildersHallRoom
|
|
13
|
+
-- (src/rooms/BuildersHallRoom.js), which broadcasts a nudge over the existing
|
|
14
|
+
-- game WebSocket so the hall re-pulls the affected panels.
|
|
15
|
+
--
|
|
16
|
+
-- Why statement-level (FOR EACH STATEMENT), not row-level:
|
|
17
|
+
-- * The payload carries NO row data — only the table name + op — so we don't
|
|
18
|
+
-- need OLD/NEW. A bulk UPDATE therefore needs exactly one nudge, not one
|
|
19
|
+
-- per row. Statement-level coalesces it for free and keeps write overhead
|
|
20
|
+
-- on these tables negligible.
|
|
21
|
+
-- * The browser de-bounces nudges and re-fetches whole panels regardless, so
|
|
22
|
+
-- per-row granularity would buy nothing.
|
|
23
|
+
--
|
|
24
|
+
-- Why pg_notify (not row data over the wire): it catches EVERY write path —
|
|
25
|
+
-- API routes, background routines, AND direct psql writes (the methodology's
|
|
26
|
+
-- "direct DB writes are work too" reality) — because the trigger lives in the
|
|
27
|
+
-- database, below the application. That direct-write coverage is the whole
|
|
28
|
+
-- point: the original staleness often came from changes the app never saw.
|
|
29
|
+
|
|
30
|
+
-- Generic notifier. Used by every trigger below. TG_OP / TG_TABLE_NAME are
|
|
31
|
+
-- available in statement-level triggers; OLD/NEW are not, and we don't use them.
|
|
32
|
+
CREATE OR REPLACE FUNCTION gds_notify_live() RETURNS trigger AS $$
|
|
33
|
+
BEGIN
|
|
34
|
+
PERFORM pg_notify(
|
|
35
|
+
'gds_live',
|
|
36
|
+
json_build_object('table', TG_TABLE_NAME, 'op', TG_OP)::text
|
|
37
|
+
);
|
|
38
|
+
RETURN NULL; -- AFTER STATEMENT triggers ignore the return value
|
|
39
|
+
END;
|
|
40
|
+
$$ LANGUAGE plpgsql;
|
|
41
|
+
|
|
42
|
+
-- One trigger per table backing a live hall panel:
|
|
43
|
+
-- tasks — claimable list, recent ships, the "ship" step
|
|
44
|
+
-- claims — claimable list churn, the "claim" step
|
|
45
|
+
-- builders — standing (credits/karma cached counters), rank, disciplines
|
|
46
|
+
-- builder_onboarding_state — the onboarding checklist itself (the reported bug)
|
|
47
|
+
-- credit_log / karma_log — drachmae + karma feeds (and the leaderboard)
|
|
48
|
+
--
|
|
49
|
+
-- DROP-then-CREATE keeps the migration idempotent (CREATE TRIGGER has no
|
|
50
|
+
-- IF NOT EXISTS form before PG 17; the droplet runs PG 16).
|
|
51
|
+
DO $$
|
|
52
|
+
DECLARE t text;
|
|
53
|
+
BEGIN
|
|
54
|
+
FOREACH t IN ARRAY ARRAY[
|
|
55
|
+
'tasks', 'claims', 'builders',
|
|
56
|
+
'builder_onboarding_state', 'credit_log', 'karma_log'
|
|
57
|
+
] LOOP
|
|
58
|
+
EXECUTE format('DROP TRIGGER IF EXISTS trg_%s_notify_live ON %I', t, t);
|
|
59
|
+
EXECUTE format(
|
|
60
|
+
'CREATE TRIGGER trg_%s_notify_live
|
|
61
|
+
AFTER INSERT OR UPDATE OR DELETE ON %I
|
|
62
|
+
FOR EACH STATEMENT EXECUTE FUNCTION gds_notify_live()',
|
|
63
|
+
t, t
|
|
64
|
+
);
|
|
65
|
+
END LOOP;
|
|
66
|
+
END $$;
|
|
67
|
+
|
|
68
|
+
INSERT INTO schema_migrations (version) VALUES ('066_live_notify_triggers')
|
|
69
|
+
ON CONFLICT DO NOTHING;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
-- 067_builder_boxes.sql — #598 (ADR 0031 §2 / §5): per-builder cloud dev box lifecycle.
|
|
2
|
+
--
|
|
3
|
+
-- Context
|
|
4
|
+
-- -------
|
|
5
|
+
-- ADR 0031 decided the worker (the part of Claude Code that opens files and
|
|
6
|
+
-- runs commands) lives on an org-controlled, containerized DigitalOcean box —
|
|
7
|
+
-- ONE per builder (§2). #596 shipped the box-as-code (.devcontainer/). This
|
|
8
|
+
-- migration is the STATE LEDGER for the box LIFECYCLE that #598 builds on top:
|
|
9
|
+
-- provision → run → auto-suspend when idle → reclaim when dormant.
|
|
10
|
+
--
|
|
11
|
+
-- Why a DB table and not just DO's own droplet list: the GDS is the project's
|
|
12
|
+
-- complete ledger (CLAUDE.md hard rule). The lifecycle sweeps (idle-suspend,
|
|
13
|
+
-- dormant-reclaim) need a builder→box mapping, an activity heartbeat, and a
|
|
14
|
+
-- per-builder compute-cost tally that DO's API does not give us. DO holds the
|
|
15
|
+
-- live droplet; this table holds the lifecycle truth we reason over.
|
|
16
|
+
--
|
|
17
|
+
-- §9.3 resolution (recorded in ADR 0031): auto-suspend is SNAPSHOT-AND-PARK,
|
|
18
|
+
-- not a Coder control-plane. DO has no native suspend and a *powered-off*
|
|
19
|
+
-- droplet still bills, so "park" snapshots then DESTROYS the droplet (keeping
|
|
20
|
+
-- only the cheap snapshot, ~$0.30/mo) and "wake" recreates from the snapshot.
|
|
21
|
+
-- That is why `droplet_id`/`ip` are NULLable (gone while parked) but
|
|
22
|
+
-- `snapshot_id` persists across a park.
|
|
23
|
+
--
|
|
24
|
+
-- Idempotent: safe to re-run.
|
|
25
|
+
|
|
26
|
+
-- ---------------------------------------------------------------------------
|
|
27
|
+
-- builder_boxes — one row per builder, the lifecycle state of their box.
|
|
28
|
+
-- ---------------------------------------------------------------------------
|
|
29
|
+
CREATE TABLE IF NOT EXISTS builder_boxes (
|
|
30
|
+
id bigserial PRIMARY KEY,
|
|
31
|
+
-- One box per builder (ADR 0031 §2: a shared box collides on files/ports/DB).
|
|
32
|
+
builder_id bigint NOT NULL UNIQUE REFERENCES builders(id) ON DELETE CASCADE,
|
|
33
|
+
|
|
34
|
+
-- Lifecycle state machine (mirrored in src/bongos/boxes.js BOX_STATES):
|
|
35
|
+
-- none — no box yet (default; a row may exist pre-provision)
|
|
36
|
+
-- provisioning— create-droplet in flight
|
|
37
|
+
-- active — droplet running, billing compute
|
|
38
|
+
-- parking — snapshot+destroy in flight
|
|
39
|
+
-- parked — droplet destroyed, only the snapshot remains (cheap)
|
|
40
|
+
-- waking — recreate-from-snapshot in flight
|
|
41
|
+
-- destroyed — fully de-provisioned (droplet + snapshot gone). The
|
|
42
|
+
-- dormant-reclaim sweep moves a long-parked box straight here.
|
|
43
|
+
-- error — a lifecycle op failed; needs operator attention
|
|
44
|
+
state text NOT NULL DEFAULT 'none'
|
|
45
|
+
CHECK (state IN ('none','provisioning','active','parking','parked',
|
|
46
|
+
'waking','destroyed','error')),
|
|
47
|
+
|
|
48
|
+
-- Source-access scope recorded at provision time. CONSUMED by #600 (rank-gated
|
|
49
|
+
-- source access): 'starter' = a Xenos's scoped surface (art/docs/good-first),
|
|
50
|
+
-- 'full' = a Metic+'s full private-repo credential. #598 records it; #600
|
|
51
|
+
-- enforces what the box's GitHub credential can actually reach.
|
|
52
|
+
scope text NOT NULL DEFAULT 'starter'
|
|
53
|
+
CHECK (scope IN ('starter','full')),
|
|
54
|
+
-- The live rank the builder held when the box was provisioned (audit + #600).
|
|
55
|
+
provisioned_rank text,
|
|
56
|
+
|
|
57
|
+
-- DigitalOcean handles. droplet_id/ip are NULL while parked (droplet gone);
|
|
58
|
+
-- snapshot_id is the durable residual that a wake restores from.
|
|
59
|
+
droplet_id text,
|
|
60
|
+
droplet_name text,
|
|
61
|
+
snapshot_id text,
|
|
62
|
+
region text NOT NULL DEFAULT 'nyc3',
|
|
63
|
+
size_slug text NOT NULL DEFAULT 's-2vcpu-4gb',
|
|
64
|
+
ip text,
|
|
65
|
+
-- Stable per-builder DNS (e.g. box-<login>.dev.amazonprimea.com). The droplet
|
|
66
|
+
-- IP churns on every wake; the hostname is what #599's Desktop managed-settings
|
|
67
|
+
-- pin to. #598 records it + exposes a DNS hook; #599 owns the cutover.
|
|
68
|
+
hostname text,
|
|
69
|
+
|
|
70
|
+
-- Activity + lifecycle timestamps.
|
|
71
|
+
last_activity_at timestamptz, -- bumped by POST /box/heartbeat; drives idle sweep
|
|
72
|
+
provisioned_at timestamptz, -- first ever provision
|
|
73
|
+
active_since timestamptz, -- when the CURRENT live droplet started billing
|
|
74
|
+
parked_at timestamptz, -- when it last entered 'parked' (drives dormant sweep)
|
|
75
|
+
destroyed_at timestamptz,
|
|
76
|
+
|
|
77
|
+
-- Running tally of compute cost charged to this box (USD). Accrued at park /
|
|
78
|
+
-- deprovision as (active hours × size hourly rate); also mirrored to cost_log
|
|
79
|
+
-- (category 'compute', builder-attributed) so the status dashboard sees it.
|
|
80
|
+
compute_cost_usd numeric(10,4) NOT NULL DEFAULT 0,
|
|
81
|
+
|
|
82
|
+
error_note text,
|
|
83
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
84
|
+
updated_at timestamptz NOT NULL DEFAULT now()
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
-- Both sweeps select by state (listBoxes: WHERE state = $1) and then refine by
|
|
88
|
+
-- recency in memory (selectIdleBoxes / selectDormantBoxes), so a single index on
|
|
89
|
+
-- `state` serves every read path. Partial indexes on last_activity_at/parked_at
|
|
90
|
+
-- were deliberately NOT added: they would add write overhead on the hot heartbeat
|
|
91
|
+
-- UPDATE (which touches last_activity_at every ~5 min per active box) without
|
|
92
|
+
-- accelerating any query. If filtering ever moves into SQL at scale, add the
|
|
93
|
+
-- matching index in that same migration.
|
|
94
|
+
CREATE INDEX IF NOT EXISTS idx_builder_boxes_state ON builder_boxes (state);
|
|
95
|
+
|
|
96
|
+
-- ---------------------------------------------------------------------------
|
|
97
|
+
-- box_events — append-only lifecycle ledger. Direct infra mutations (CLI/sweep)
|
|
98
|
+
-- are project state changes too, so they get an audit row (CLAUDE.md hard rule).
|
|
99
|
+
-- The HTTP audit_log only captures API mutations; lifecycle ops run on the
|
|
100
|
+
-- control-plane CLI, so they record here.
|
|
101
|
+
-- ---------------------------------------------------------------------------
|
|
102
|
+
CREATE TABLE IF NOT EXISTS box_events (
|
|
103
|
+
id bigserial PRIMARY KEY,
|
|
104
|
+
box_id bigint NOT NULL REFERENCES builder_boxes(id) ON DELETE CASCADE,
|
|
105
|
+
builder_id bigint REFERENCES builders(id) ON DELETE SET NULL,
|
|
106
|
+
-- provision | park | wake | deprovision | heartbeat | cost | error
|
|
107
|
+
event text NOT NULL,
|
|
108
|
+
detail text,
|
|
109
|
+
cost_usd numeric(10,4),
|
|
110
|
+
-- Who/what triggered it: 'cli:<login>' | 'sweep:idle' | 'sweep:dormant' | 'api'
|
|
111
|
+
actor text,
|
|
112
|
+
created_at timestamptz NOT NULL DEFAULT now()
|
|
113
|
+
);
|
|
114
|
+
CREATE INDEX IF NOT EXISTS idx_box_events_box ON box_events (box_id, created_at DESC);
|
|
115
|
+
|
|
116
|
+
INSERT INTO schema_migrations (version) VALUES ('067_builder_boxes')
|
|
117
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
-- 067_discord_bot_foundation.sql — Discord bot service principal + account
|
|
2
|
+
-- linking + cosmetic applause + audit surface (Discord Phase 3 F1, ADR 0033).
|
|
3
|
+
--
|
|
4
|
+
-- Foundation for the Phase 3 bot. The bot is a SERVICE PRINCIPAL, gated by
|
|
5
|
+
-- identity (builders.system_role='discord_bot'), NEVER by rank — the same
|
|
6
|
+
-- pattern as the BFG principal (migration 065 / ADR 0026 §6C). It is trusted
|
|
7
|
+
-- only to assert "this Discord user, who reacted/posted, is linked builder X";
|
|
8
|
+
-- every write it triggers re-checks X's live rank server-side (ADR 0033 §1).
|
|
9
|
+
--
|
|
10
|
+
-- Decision-independent substrate: needs no live bot. Account linking (F2), the
|
|
11
|
+
-- bot process (F3), upvoting (F4), role-sync (F5) and inbound (F6) build on top.
|
|
12
|
+
|
|
13
|
+
-- 1. Widen the system_role allowlist to admit the discord_bot principal. The
|
|
14
|
+
-- CHECK was introduced by migration 065 ('bfg' only); adding a new system
|
|
15
|
+
-- principal widens it in its own migration — an intentional, reviewable act
|
|
16
|
+
-- (065's own note). Drop-then-add is idempotent on re-run, and every existing
|
|
17
|
+
-- row (NULL for humans, 'bfg' for the BFG) already satisfies the wider set.
|
|
18
|
+
ALTER TABLE builders DROP CONSTRAINT IF EXISTS builders_system_role_check;
|
|
19
|
+
ALTER TABLE builders
|
|
20
|
+
ADD CONSTRAINT builders_system_role_check
|
|
21
|
+
CHECK (system_role IS NULL OR system_role IN ('bfg', 'discord_bot'));
|
|
22
|
+
|
|
23
|
+
-- 2. The Discord bot service principal. Mirrors the BFG principal exactly:
|
|
24
|
+
-- * cannot claim work — status='inactive' trips the db.claimTask guard;
|
|
25
|
+
-- * cannot earn drachmae — it never claims/ships, and rank='xenos' carries
|
|
26
|
+
-- no authority anyway;
|
|
27
|
+
-- * is not loginable — github_id 'system:discord_bot' is non-numeric, so the
|
|
28
|
+
-- GitHub OAuth upsert (numeric ids) can never produce or authenticate it.
|
|
29
|
+
-- The bot authenticates via a session token minted out-of-band (F3); the
|
|
30
|
+
-- requireDiscordBot gate keys on system_role='discord_bot', not rank.
|
|
31
|
+
-- Idempotent via NOT EXISTS (the #476 hardcoded-natural-key guard).
|
|
32
|
+
INSERT INTO builders (github_id, github_login, display_name, rank, status, system_role)
|
|
33
|
+
SELECT 'system:discord_bot', 'discord-bot-system', 'Discord Bot (system)', 'xenos', 'inactive', 'discord_bot'
|
|
34
|
+
WHERE NOT EXISTS (SELECT 1 FROM builders WHERE system_role = 'discord_bot');
|
|
35
|
+
|
|
36
|
+
-- 3. Account links: builder <-> Discord user, 1:1 both ways. A row exists only
|
|
37
|
+
-- because the builder PERSONALLY linked their Discord via the UI-first OAuth
|
|
38
|
+
-- flow (F2) — the bot never invents a mapping (ADR 0033 §2). PRIMARY KEY
|
|
39
|
+
-- (builder_id) = at most one Discord per builder; UNIQUE (discord_user_id) =
|
|
40
|
+
-- at most one builder per Discord. ON DELETE CASCADE: offboarding drops it.
|
|
41
|
+
CREATE TABLE IF NOT EXISTS discord_links (
|
|
42
|
+
builder_id bigint NOT NULL PRIMARY KEY REFERENCES builders(id) ON DELETE CASCADE,
|
|
43
|
+
discord_user_id text NOT NULL UNIQUE,
|
|
44
|
+
linked_at timestamptz NOT NULL DEFAULT now()
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
-- 4. Cosmetic applause — the "everyone" half of both-mode upvoting (ADR 0033
|
|
48
|
+
-- §3). A reaction by anyone (player, Xenos, unlinked, self) lands here and
|
|
49
|
+
-- NEVER touches karma_log. One applause per Discord user per target task;
|
|
50
|
+
-- re-reacting is a harmless no-op (ON CONFLICT DO NOTHING in the helper).
|
|
51
|
+
-- discord_user_id is stored raw (no FK to discord_links) precisely because
|
|
52
|
+
-- applause does NOT require a link — that is the point of the cosmetic tier.
|
|
53
|
+
CREATE TABLE IF NOT EXISTS discord_applause (
|
|
54
|
+
id bigserial PRIMARY KEY,
|
|
55
|
+
target_task_id bigint NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
56
|
+
discord_user_id text NOT NULL,
|
|
57
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
58
|
+
UNIQUE (target_task_id, discord_user_id)
|
|
59
|
+
);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_discord_applause_task ON discord_applause (target_task_id);
|
|
61
|
+
|
|
62
|
+
-- 5. Audit surface (ADR 0033 §1 + the grader's forensic note). NULL for direct
|
|
63
|
+
-- human web/CLI writes; set to the system-principal id (e.g. 'discord_bot')
|
|
64
|
+
-- for principal-originated writes, so "all bot-originated writes" is a clean
|
|
65
|
+
-- WHERE clause for forensic review. Populated by the bot endpoints (F4);
|
|
66
|
+
-- additive + nullable, so existing audit rows are unaffected.
|
|
67
|
+
ALTER TABLE audit_log ADD COLUMN IF NOT EXISTS surface text;
|
|
68
|
+
COMMENT ON COLUMN audit_log.surface IS
|
|
69
|
+
'Originating surface: NULL for direct human web/CLI writes, or a system principal id (e.g. discord_bot, bfg). Lets forensic review distinguish principal-originated writes (ADR 0033).';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
-- 068_thetes_requires_rank.sql — #692 / ADR 0034: make `thetes` a 4th LIVE rank.
|
|
2
|
+
--
|
|
3
|
+
-- Context: `thetes` is the GRADUATED-newcomer rank, sitting between `xenos`
|
|
4
|
+
-- (sandboxed entry) and `metic` (trusted working rank): ladder is
|
|
5
|
+
-- archon > metic > thetes > xenos.
|
|
6
|
+
-- A Thetes escapes the newcomer_friendly sandbox and claims the whole general
|
|
7
|
+
-- queue (any task with requires_rank='xenos', the default) but is blocked from
|
|
8
|
+
-- tasks raised to requires_rank='metic'/'archon'. A Xenos auto-graduates here
|
|
9
|
+
-- after 3 confirmed tasks (server-side, in the confirm transaction — db.js
|
|
10
|
+
-- maybeAutoGraduateToThetes).
|
|
11
|
+
--
|
|
12
|
+
-- `thetes` is ALREADY allowed by builders.rank's CHECK (migration 023 reserved
|
|
13
|
+
-- the full ladder up front), so this migration only widens the INVERSE gate:
|
|
14
|
+
-- tasks.requires_rank, whose CHECK (migration 044) currently allows just
|
|
15
|
+
-- xenos/metic/archon. Without this, an Archon could never raise a task's floor
|
|
16
|
+
-- to 'thetes', and rankAllowsTask's tier comparison would have no schema-backed
|
|
17
|
+
-- domain for the value.
|
|
18
|
+
--
|
|
19
|
+
-- Idempotent: drops + re-adds the named constraint, safe to re-run.
|
|
20
|
+
|
|
21
|
+
ALTER TABLE tasks DROP CONSTRAINT IF EXISTS tasks_requires_rank_enum;
|
|
22
|
+
ALTER TABLE tasks
|
|
23
|
+
ADD CONSTRAINT tasks_requires_rank_enum
|
|
24
|
+
CHECK (requires_rank IN ('xenos', 'thetes', 'metic', 'archon'));
|
|
25
|
+
|
|
26
|
+
INSERT INTO schema_migrations (version) VALUES ('068_thetes_requires_rank')
|
|
27
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
-- 069_builder_ssh_keys.sql — #685 (ADR 0031 §1/§6): server-side SSH-key distribution.
|
|
2
|
+
-- (Renumbered 068→069 at ship time: main had meanwhile merged 068_thetes_requires_rank.)
|
|
3
|
+
--
|
|
4
|
+
-- Context
|
|
5
|
+
-- -------
|
|
6
|
+
-- Today, connecting a builder's Claude Desktop to their dev box requires the
|
|
7
|
+
-- operator to SSH into the box and hand-append the builder's public key to
|
|
8
|
+
-- ~/.ssh/authorized_keys — a manual round-trip across two machines (the builder
|
|
9
|
+
-- ssh-keygens, pastes the public half back, the operator installs it). #685
|
|
10
|
+
-- removes that round-trip: the builder registers their OWN public key with the
|
|
11
|
+
-- GDS (POST /box/ssh-key), and the box PULLS its authorized_keys from the GDS at
|
|
12
|
+
-- boot + on a cron (GET /box/authorized-keys), exactly like it already pulls
|
|
13
|
+
-- rank-gated source (#600 / box-source-fetch.sh).
|
|
14
|
+
--
|
|
15
|
+
-- This table is the registry that backs both. A public SSH key is NOT a secret
|
|
16
|
+
-- (it is, by design, the half you hand out), so it lives in the DB in the clear —
|
|
17
|
+
-- unlike the box source CREDENTIAL, which stays in the prod env (ADR 0022). The
|
|
18
|
+
-- security property is the SAME as source access: GET /box/authorized-keys is
|
|
19
|
+
-- gated on the builder's LIVE rank+status (box-access.decideSourceAccess), so a
|
|
20
|
+
-- demoted/deactivated builder's keys stop being served on the box's very next
|
|
21
|
+
-- fetch — instant, credential-layer offboarding (the droplet teardown is the
|
|
22
|
+
-- slower control-plane half via `box.js reconcile`). Empty served file = no SSH
|
|
23
|
+
-- login = the box is locked even before it is destroyed.
|
|
24
|
+
--
|
|
25
|
+
-- Idempotent: safe to re-run.
|
|
26
|
+
|
|
27
|
+
-- ---------------------------------------------------------------------------
|
|
28
|
+
-- builder_ssh_keys — public SSH keys a builder authorizes for their dev box.
|
|
29
|
+
-- Many keys per builder (laptop + desktop + a re-key); de-duped by fingerprint.
|
|
30
|
+
-- ---------------------------------------------------------------------------
|
|
31
|
+
CREATE TABLE IF NOT EXISTS builder_ssh_keys (
|
|
32
|
+
id bigserial PRIMARY KEY,
|
|
33
|
+
builder_id bigint NOT NULL REFERENCES builders(id) ON DELETE CASCADE,
|
|
34
|
+
|
|
35
|
+
-- The full authorized_keys line as the builder presented it, already
|
|
36
|
+
-- validated + normalized server-side to "<type> <base64> [comment]" (a single
|
|
37
|
+
-- line, no shell metacharacters) by src/bongos/box-onboard.validateSshPublicKey.
|
|
38
|
+
-- Stored verbatim so GET /box/authorized-keys can emit it unchanged.
|
|
39
|
+
public_key text NOT NULL,
|
|
40
|
+
-- Algorithm token (ssh-ed25519 | ssh-rsa | ecdsa-sha2-* | sk-*). Recorded for
|
|
41
|
+
-- the roster/audit and so a future policy ("ed25519 only") is a pure filter.
|
|
42
|
+
key_type text NOT NULL,
|
|
43
|
+
-- SHA256 fingerprint (base64, no padding — the `SHA256:...` form ssh-keygen
|
|
44
|
+
-- prints). The natural de-dupe key: re-registering the same key is a no-op,
|
|
45
|
+
-- not a duplicate authorized_keys line on the box.
|
|
46
|
+
fingerprint text NOT NULL,
|
|
47
|
+
-- Human label for the roster ("box-connect macOS 2026-06-05"); never trusted
|
|
48
|
+
-- input on the box side (it is a comment, not part of the key material).
|
|
49
|
+
label text,
|
|
50
|
+
|
|
51
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
52
|
+
-- Bumped when GET /box/authorized-keys serves this key to a live box, so the
|
|
53
|
+
-- roster can show "last seen on a box" without a separate events table.
|
|
54
|
+
last_used_at timestamptz,
|
|
55
|
+
|
|
56
|
+
-- One row per (builder, key). Re-registering the same key updates the label /
|
|
57
|
+
-- last_used_at via ON CONFLICT rather than inserting a duplicate.
|
|
58
|
+
UNIQUE (builder_id, fingerprint)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
-- The hot read path is "every key for THIS builder" (GET /box/authorized-keys,
|
|
62
|
+
-- GET /box/ssh-key). A single index on builder_id serves both.
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_builder_ssh_keys_builder ON builder_ssh_keys (builder_id);
|
|
64
|
+
|
|
65
|
+
INSERT INTO schema_migrations (version) VALUES ('069_builder_ssh_keys')
|
|
66
|
+
ON CONFLICT (version) DO NOTHING;
|