@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,101 @@
|
|
|
1
|
+
-- 070_box_intents.sql — #701 (ADR 0031 §1/§2, open-question §9.4): the box
|
|
2
|
+
-- onboarding middleware — server-side auto-provision + wake-on-connect + the
|
|
3
|
+
-- web/Chromebook Remote-Control pairing path.
|
|
4
|
+
--
|
|
5
|
+
-- Context
|
|
6
|
+
-- -------
|
|
7
|
+
-- The box lifecycle (provision/park/wake/deprovision) is OPERATOR-ONLY: it runs
|
|
8
|
+
-- on the trusted control plane (scripts/gds/box.js) so the internet-facing web
|
|
9
|
+
-- process never holds DO_API_TOKEN and a stolen builder token can never spin up
|
|
10
|
+
-- or destroy infrastructure (routes/box.js header). That is the right security
|
|
11
|
+
-- posture, but it leaves a non-technical / Chromebook newcomer with no hands-off
|
|
12
|
+
-- on-ramp: someone has to run a CLI to give them a box, and a returning builder's
|
|
13
|
+
-- parked box stays parked until an operator wakes it.
|
|
14
|
+
--
|
|
15
|
+
-- #701 closes that gap WITHOUT moving the DO token into the web process. The web
|
|
16
|
+
-- side only ever RECORDS A REQUEST — an "intent" — in this queue. The existing
|
|
17
|
+
-- control-plane runner (box-intent-runner.timer → `box.js run-intents --apply`,
|
|
18
|
+
-- the same systemd-timer pattern as box-idle-suspend) drains the queue and does
|
|
19
|
+
-- the actual DigitalOcean work. The web process stays powerless over infra: it
|
|
20
|
+
-- can ask for a box to be provisioned or woken, never create or destroy one.
|
|
21
|
+
--
|
|
22
|
+
-- Two pieces:
|
|
23
|
+
-- 1. box_intents — the provision/wake request queue (this is the middleware).
|
|
24
|
+
-- 2. builder_boxes.remote_pairing_url/_at — where a box publishes its current
|
|
25
|
+
-- Remote-Control pairing link (POST /box/pairing) so a Chromebook builder
|
|
26
|
+
-- can read it from the browser (GET /box/pairing-link) without first SSHing
|
|
27
|
+
-- into the box (open question §9.4).
|
|
28
|
+
--
|
|
29
|
+
-- Idempotent: safe to re-run.
|
|
30
|
+
|
|
31
|
+
-- ---------------------------------------------------------------------------
|
|
32
|
+
-- box_intents — the provision / wake request queue (the trust-boundary-safe
|
|
33
|
+
-- bridge between the web process and the control plane).
|
|
34
|
+
-- ---------------------------------------------------------------------------
|
|
35
|
+
CREATE TABLE IF NOT EXISTS box_intents (
|
|
36
|
+
id bigserial PRIMARY KEY,
|
|
37
|
+
builder_id bigint NOT NULL REFERENCES builders(id) ON DELETE CASCADE,
|
|
38
|
+
|
|
39
|
+
-- The lifecycle op being requested. Only the two SAFE, builder-initiated ops
|
|
40
|
+
-- are queueable: 'provision' (first box) and 'wake' (recreate a parked box).
|
|
41
|
+
-- park/deprovision are NEVER queued from the web — those stay operator/sweep
|
|
42
|
+
-- only (a builder can't be tricked into destroying their own box).
|
|
43
|
+
action text NOT NULL CHECK (action IN ('provision', 'wake')),
|
|
44
|
+
|
|
45
|
+
-- pending → waiting for the runner to pick it up
|
|
46
|
+
-- running → the runner claimed it and is doing the DO work
|
|
47
|
+
-- done → the lifecycle op succeeded
|
|
48
|
+
-- error → the op failed (last_error carries why); a fresh intent can be
|
|
49
|
+
-- enqueued (this row is no longer "open" so the partial unique
|
|
50
|
+
-- index below lets a retry through).
|
|
51
|
+
state text NOT NULL DEFAULT 'pending'
|
|
52
|
+
CHECK (state IN ('pending', 'running', 'done', 'error')),
|
|
53
|
+
|
|
54
|
+
-- Who asked. 'api:self' for a builder's own /box/ensure call; an actor tag for
|
|
55
|
+
-- anything the control plane enqueues. Audit only.
|
|
56
|
+
requested_by text,
|
|
57
|
+
|
|
58
|
+
-- Retry accounting. The runner bumps attempts each time it claims the intent;
|
|
59
|
+
-- a small cap (enforced in the runner, not here) stops a poison intent from
|
|
60
|
+
-- looping forever.
|
|
61
|
+
attempts int NOT NULL DEFAULT 0,
|
|
62
|
+
last_error text,
|
|
63
|
+
|
|
64
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
65
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
66
|
+
resolved_at timestamptz
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
-- At most ONE open (pending|running) intent per builder. A builder hammering
|
|
70
|
+
-- "connect" from a flaky Chromebook tab must not pile up a queue of redundant
|
|
71
|
+
-- provisions — the second enqueue collides here and the route returns the
|
|
72
|
+
-- already-open intent instead. Resolved (done|error) rows are exempt, so a retry
|
|
73
|
+
-- after a failure is always allowed.
|
|
74
|
+
CREATE UNIQUE INDEX IF NOT EXISTS ux_box_intents_open
|
|
75
|
+
ON box_intents (builder_id)
|
|
76
|
+
WHERE state IN ('pending', 'running');
|
|
77
|
+
|
|
78
|
+
-- The runner's hot path: "oldest pending intent". A partial index keeps it tiny
|
|
79
|
+
-- (it only ever indexes the unresolved tail, not the full history).
|
|
80
|
+
CREATE INDEX IF NOT EXISTS idx_box_intents_pending
|
|
81
|
+
ON box_intents (created_at)
|
|
82
|
+
WHERE state = 'pending';
|
|
83
|
+
|
|
84
|
+
-- ---------------------------------------------------------------------------
|
|
85
|
+
-- builder_boxes — where an active box publishes its Remote-Control pairing link.
|
|
86
|
+
-- ---------------------------------------------------------------------------
|
|
87
|
+
-- A box running `claude rc` (the always-on Remote-Control service, infra/
|
|
88
|
+
-- claude-rc.service) emits a pairing link a thin device drives the session from.
|
|
89
|
+
-- For a Chromebook (no Claude Desktop) that link is the whole on-ramp, but it
|
|
90
|
+
-- only exists ON the box — and reaching it would require SSH, which defeats the
|
|
91
|
+
-- point. So the box POSTs its current link up to the GDS (POST /box/pairing,
|
|
92
|
+
-- authenticated as the builder via the GDS token already on the box), and the
|
|
93
|
+
-- builder reads it from the browser (GET /box/pairing-link). The URL is a
|
|
94
|
+
-- short-lived Remote-Control handle, not a credential — but it IS sensitive, so
|
|
95
|
+
-- it is only ever returned to the box's OWN builder, and cleared when the box is
|
|
96
|
+
-- parked/destroyed (it is meaningless once the droplet is gone).
|
|
97
|
+
ALTER TABLE builder_boxes ADD COLUMN IF NOT EXISTS remote_pairing_url text;
|
|
98
|
+
ALTER TABLE builder_boxes ADD COLUMN IF NOT EXISTS remote_pairing_at timestamptz;
|
|
99
|
+
|
|
100
|
+
INSERT INTO schema_migrations (version) VALUES ('070_box_intents')
|
|
101
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
-- 071_box_first_provision_approval.sql — ADR 0035 Decision 2 (#717): a newcomer's
|
|
2
|
+
-- FIRST box must be approved by an Archon before any paid droplet is created.
|
|
3
|
+
--
|
|
4
|
+
-- Context
|
|
5
|
+
-- -------
|
|
6
|
+
-- #701 (migration 070) made POST /box/ensure enqueue a provision/wake intent that
|
|
7
|
+
-- the control-plane runner (box.js run-intents) auto-drains. That is correct for
|
|
8
|
+
-- wakes and for a builder who has already EARNED a box — but anyone with a GitHub
|
|
9
|
+
-- account can sign in and become a Xenos, and a Xenos is above the box provisioning
|
|
10
|
+
-- floor, so a bare signup could cause a paid droplet (~$24/mo) to be created with
|
|
11
|
+
-- NO human in the loop. On a ~$5,000/yr budget that is an open cost hole
|
|
12
|
+
-- (ADR 0035 §Problem-3).
|
|
13
|
+
--
|
|
14
|
+
-- This migration adds a 'pending_approval' state to box_intents. A provision intent
|
|
15
|
+
-- for a builder with no prior provisioned box is enqueued as 'pending_approval'
|
|
16
|
+
-- (NOT 'pending'), so the runner — which only ever claims state='pending' — skips
|
|
17
|
+
-- it until an Archon approves (POST /box/intents/:id/approve flips it to 'pending').
|
|
18
|
+
-- Wakes and any subsequent provision auto-drain unchanged. The web tier still only
|
|
19
|
+
-- RECORDS A REQUEST; it never holds DO_API_TOKEN (the migration 070 invariant) — so
|
|
20
|
+
-- approval authorizes spend without granting the web any power over infrastructure.
|
|
21
|
+
--
|
|
22
|
+
-- Idempotent: safe to re-run.
|
|
23
|
+
|
|
24
|
+
-- Widen the state CHECK to admit 'pending_approval'. Postgres has no ALTER ... ADD
|
|
25
|
+
-- VALUE for a CHECK constraint, so drop + re-add. The inline column constraint from
|
|
26
|
+
-- migration 070 is auto-named <table>_<column>_check.
|
|
27
|
+
ALTER TABLE box_intents DROP CONSTRAINT IF EXISTS box_intents_state_check;
|
|
28
|
+
ALTER TABLE box_intents ADD CONSTRAINT box_intents_state_check
|
|
29
|
+
CHECK (state IN ('pending', 'pending_approval', 'running', 'done', 'error'));
|
|
30
|
+
|
|
31
|
+
-- Audit: who approved the held first-box provision, and when.
|
|
32
|
+
ALTER TABLE box_intents ADD COLUMN IF NOT EXISTS approved_by text;
|
|
33
|
+
ALTER TABLE box_intents ADD COLUMN IF NOT EXISTS approved_at timestamptz;
|
|
34
|
+
|
|
35
|
+
-- 'pending_approval' is an OPEN state: it must count toward the one-open-intent-per-
|
|
36
|
+
-- builder rule (else a builder could pile up approval requests). Recreate the partial
|
|
37
|
+
-- unique index to include it. The runner's hot-path index (idx_box_intents_pending)
|
|
38
|
+
-- stays on state='pending' only, so a held intent is NEVER claimed by the runner —
|
|
39
|
+
-- approval (flip to 'pending') is precisely what makes it visible to the drainer.
|
|
40
|
+
DROP INDEX IF EXISTS ux_box_intents_open;
|
|
41
|
+
CREATE UNIQUE INDEX IF NOT EXISTS ux_box_intents_open
|
|
42
|
+
ON box_intents (builder_id)
|
|
43
|
+
WHERE state IN ('pending', 'pending_approval', 'running');
|
|
44
|
+
|
|
45
|
+
INSERT INTO schema_migrations (version) VALUES ('071_box_first_provision_approval')
|
|
46
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
-- 072_onboarding_ship_three_remove_primer.sql — #766: reshape the Xenos path.
|
|
2
|
+
--
|
|
3
|
+
-- Two changes to the onboarding state machine (migrations 045 + 059):
|
|
4
|
+
--
|
|
5
|
+
-- 1. Remove 'primer_read'. Newcomers no longer have to read the citizen's
|
|
6
|
+
-- primer (or the "how the system works" maps) before they can work — the
|
|
7
|
+
-- Xenos path is now purely action-based: bear the seal → choose a craft →
|
|
8
|
+
-- survey the works → claim → ship. The primer page itself stays for
|
|
9
|
+
-- Metic+ citizens; only the newcomer *requirement* is dropped. The
|
|
10
|
+
-- primer_read stage, its claimable/claim gate, and the /builder-primer-read
|
|
11
|
+
-- CLI path are all removed in the same change.
|
|
12
|
+
--
|
|
13
|
+
-- 2. Rename 'first_ship' → 'ship_three'. The terminal action stage now clears
|
|
14
|
+
-- only when the builder has THREE successfully shipped tasks — the same
|
|
15
|
+
-- threshold that auto-promotes a Xenos to Thetes (#692 / ADR 0034). So the
|
|
16
|
+
-- onboarding checklist's graduation and the xenos→thetes promotion become
|
|
17
|
+
-- the same moment. The live "N of 3" counter the hall renders is computed
|
|
18
|
+
-- in shapeForApi from the shipped-task count, NOT from this stage (the
|
|
19
|
+
-- stage is binary: cleared at 3, uncleared before).
|
|
20
|
+
--
|
|
21
|
+
-- The DB only validates enum membership of current_stage; ordering lives in the
|
|
22
|
+
-- app layer (src/bongos/onboarding-state.js STAGES). So this migration rewrites the
|
|
23
|
+
-- affected rows, then swaps the CHECK constraint's allowed set.
|
|
24
|
+
--
|
|
25
|
+
-- Grandfathering:
|
|
26
|
+
-- * Rows already at current_stage='graduated' (graduated under the old
|
|
27
|
+
-- 1-ship rule) stay graduated — we never demote an existing graduate, even
|
|
28
|
+
-- if they have fewer than 3 ships. Their completed_stages 'first_ship'
|
|
29
|
+
-- entry is renamed to 'ship_three' for audit consistency.
|
|
30
|
+
-- * A row parked at current_stage='primer_read' has not yet picked a craft
|
|
31
|
+
-- (primer_read came before pick_disciplines in the old order), so it
|
|
32
|
+
-- advances to 'pick_disciplines'.
|
|
33
|
+
-- * A row parked at current_stage='first_ship' (claimed/shipped once but not
|
|
34
|
+
-- yet graduated — only possible transiently) advances to 'ship_three'; they
|
|
35
|
+
-- now need three ships. (Under the old model first_ship in completed_stages
|
|
36
|
+
-- implied graduation, so no NON-graduated row carries it in the array.)
|
|
37
|
+
--
|
|
38
|
+
-- Idempotent: safe to re-run.
|
|
39
|
+
|
|
40
|
+
BEGIN;
|
|
41
|
+
|
|
42
|
+
-- 1. Audit array: strip the removed stage, rename the renamed one. array_remove
|
|
43
|
+
-- / array_replace are no-ops when the element is absent, so this is safe to
|
|
44
|
+
-- re-run and safe on rows that never had either entry.
|
|
45
|
+
UPDATE builder_onboarding_state
|
|
46
|
+
SET completed_stages = array_remove(completed_stages, 'primer_read');
|
|
47
|
+
|
|
48
|
+
UPDATE builder_onboarding_state
|
|
49
|
+
SET completed_stages = array_replace(completed_stages, 'first_ship', 'ship_three');
|
|
50
|
+
|
|
51
|
+
-- 2. Re-home current_stage values that are being removed/renamed BEFORE swapping
|
|
52
|
+
-- the constraint, or the new CHECK would reject them.
|
|
53
|
+
UPDATE builder_onboarding_state
|
|
54
|
+
SET current_stage = 'pick_disciplines'
|
|
55
|
+
WHERE current_stage = 'primer_read';
|
|
56
|
+
|
|
57
|
+
UPDATE builder_onboarding_state
|
|
58
|
+
SET current_stage = 'ship_three'
|
|
59
|
+
WHERE current_stage = 'first_ship';
|
|
60
|
+
|
|
61
|
+
-- 3. Swap the stage enum: drop the old constraint (if present) and add the new
|
|
62
|
+
-- one. Name matches migrations 045/059 so re-running stays clean.
|
|
63
|
+
ALTER TABLE builder_onboarding_state
|
|
64
|
+
DROP CONSTRAINT IF EXISTS builder_onboarding_state_stage_enum;
|
|
65
|
+
|
|
66
|
+
ALTER TABLE builder_onboarding_state
|
|
67
|
+
ADD CONSTRAINT builder_onboarding_state_stage_enum
|
|
68
|
+
CHECK (current_stage IN (
|
|
69
|
+
'auth_complete',
|
|
70
|
+
'pick_disciplines',
|
|
71
|
+
'first_start',
|
|
72
|
+
'first_claim',
|
|
73
|
+
'ship_three',
|
|
74
|
+
'graduated'
|
|
75
|
+
));
|
|
76
|
+
|
|
77
|
+
INSERT INTO schema_migrations (version) VALUES ('072_onboarding_ship_three_remove_primer')
|
|
78
|
+
ON CONFLICT (version) DO NOTHING;
|
|
79
|
+
|
|
80
|
+
COMMIT;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
-- 073_box_terminal_access.sql — #760 (ADR 0038): the Chromebook on-ramp redesign.
|
|
2
|
+
--
|
|
3
|
+
-- Context
|
|
4
|
+
-- -------
|
|
5
|
+
-- Migration 070 added builder_boxes.remote_pairing_url/_at for the `claude rc`
|
|
6
|
+
-- Remote-Control on-ramp: the box published a claude.ai pairing link UP to the
|
|
7
|
+
-- GDS so a Chromebook builder could read it from the browser. #745 leg-5 then
|
|
8
|
+
-- proved `claude rc` CANNOT run on a headless box — Anthropic gates Remote
|
|
9
|
+
-- Control behind interactive Trusted-Devices enrollment + a controlling TTY +
|
|
10
|
+
-- full-scope OAuth, and every non-interactive auth path (ANTHROPIC_API_KEY,
|
|
11
|
+
-- setup-token, apiKeyHelper) is excluded from RC by design. No plumbing fixes it.
|
|
12
|
+
--
|
|
13
|
+
-- ADR 0038 replaces that path: the box serves its OWN browser session — ttyd (a
|
|
14
|
+
-- basic-auth web terminal) on 127.0.0.1:7681, exposed via an outbound-only
|
|
15
|
+
-- Cloudflare Tunnel (cloudflared). Inside it the builder runs NORMAL interactive
|
|
16
|
+
-- `claude` in a real PTY, so /login + workspace-trust + device enrollment all
|
|
17
|
+
-- work (there IS a human at a browser-backed terminal). The box reports its
|
|
18
|
+
-- current terminal URL AND a per-box basic-auth credential UP to the GDS (the
|
|
19
|
+
-- same up-report/serve-to-owner shape migration 070 built), and the builder
|
|
20
|
+
-- reads BOTH from the browser (GET /box/terminal).
|
|
21
|
+
--
|
|
22
|
+
-- This migration adds the terminal_* columns. Unlike the RC pairing link (a
|
|
23
|
+
-- bare handle), the terminal needs a CREDENTIAL too — hence the extra column.
|
|
24
|
+
-- The remote_pairing_url/_at columns from 070 are now DEPRECATED and left in
|
|
25
|
+
-- place (non-destructive); nothing writes them after this ships.
|
|
26
|
+
--
|
|
27
|
+
-- Staleness model (unchanged from 070): the value is only ever SERVED when the
|
|
28
|
+
-- box is state='active' (GET /box/terminal gates on it) and only ever WRITTEN
|
|
29
|
+
-- when active (boxes.setTerminalAccess gates on it), so a parked box's stale URL
|
|
30
|
+
-- is simply never returned — no explicit NULL-clear needed. The credential
|
|
31
|
+
-- persists in the box snapshot across park/wake (stable); the quick-tunnel URL
|
|
32
|
+
-- changes on each cloudflared restart, so the box re-reports it after a wake.
|
|
33
|
+
--
|
|
34
|
+
-- Sensitivity: terminal_credential IS a secret (basic-auth password to a live
|
|
35
|
+
-- shell). Like remote_pairing_url it is returned ONLY to the box's own builder
|
|
36
|
+
-- (GET /box/terminal, requireBuilder, own resource). It never appears in any
|
|
37
|
+
-- public surface or in box_events detail.
|
|
38
|
+
--
|
|
39
|
+
-- Idempotent: safe to re-run.
|
|
40
|
+
|
|
41
|
+
ALTER TABLE builder_boxes ADD COLUMN IF NOT EXISTS terminal_url text;
|
|
42
|
+
ALTER TABLE builder_boxes ADD COLUMN IF NOT EXISTS terminal_credential text;
|
|
43
|
+
ALTER TABLE builder_boxes ADD COLUMN IF NOT EXISTS terminal_at timestamptz;
|
|
44
|
+
|
|
45
|
+
INSERT INTO schema_migrations (version) VALUES ('073_box_terminal_access')
|
|
46
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-- 075_builder_sound_prefs.sql — per-builder per-sound on/off preferences
|
|
2
|
+
-- (V3.R91 / #786). Follow-up to the #781 sound system.
|
|
3
|
+
--
|
|
4
|
+
-- One jsonb column on `builders` (sound_prefs), default '{}'. Each entry maps a
|
|
5
|
+
-- sound name (chime | alert | ship | triumph | fanfare) to a boolean: false =
|
|
6
|
+
-- the builder has muted that sound. A MISSING key falls back to the system
|
|
7
|
+
-- default (ON), so the column stays sparse — a builder who never opens the
|
|
8
|
+
-- setting has '{}' and hears everything, exactly as before this shipped.
|
|
9
|
+
--
|
|
10
|
+
-- This deliberately mirrors migration 037 (skill_model_prefs): per-builder
|
|
11
|
+
-- personalized config, sparse + irregular, read by primary key, with the
|
|
12
|
+
-- allowlist + defaults living in code (src/bongos/sound-prefs.js) rather than a
|
|
13
|
+
-- Postgres CHECK — so adding a sixth sound is a one-line code change, not a
|
|
14
|
+
-- coordinated schema migration.
|
|
15
|
+
--
|
|
16
|
+
-- The toggle is stored server-side but the sound plays from a LOCAL hook
|
|
17
|
+
-- (.claude/sounds/play.js); a SessionStart step (scripts/gds/fetch-sound-prefs.js)
|
|
18
|
+
-- mirrors this column into ~/.config/otb/sound-prefs.json so the offline hook
|
|
19
|
+
-- can honor it without a per-turn network call. play.js fails OPEN (plays) when
|
|
20
|
+
-- the local file is absent, so a fresh machine still gets sounds.
|
|
21
|
+
--
|
|
22
|
+
-- Idempotent: safe to re-run.
|
|
23
|
+
|
|
24
|
+
ALTER TABLE builders
|
|
25
|
+
ADD COLUMN IF NOT EXISTS sound_prefs jsonb NOT NULL DEFAULT '{}'::jsonb;
|
|
26
|
+
|
|
27
|
+
INSERT INTO schema_migrations (version) VALUES ('075_builder_sound_prefs')
|
|
28
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
-- migration 078: box claude_active flag + deprovision intent action
|
|
2
|
+
--
|
|
3
|
+
-- Two changes:
|
|
4
|
+
-- 1. builder_boxes.claude_active — the box-side heartbeat reports whether a
|
|
5
|
+
-- `claude` process is running. The idle sweep skips boxes where this is
|
|
6
|
+
-- true, so a running Claude session keeps the box alive indefinitely.
|
|
7
|
+
-- Resets to false on deprovision (setBoxState clears it).
|
|
8
|
+
--
|
|
9
|
+
-- 2. box_intents.action CHECK extended to include 'deprovision' — the new
|
|
10
|
+
-- POST /box/close route enqueues this, and the intent runner calls
|
|
11
|
+
-- cmdDeprovision. Keeps the DO token on the control plane (trust boundary
|
|
12
|
+
-- holds); the web tier only ever records a request.
|
|
13
|
+
|
|
14
|
+
ALTER TABLE builder_boxes
|
|
15
|
+
ADD COLUMN IF NOT EXISTS claude_active bool NOT NULL DEFAULT false;
|
|
16
|
+
|
|
17
|
+
ALTER TABLE box_intents
|
|
18
|
+
DROP CONSTRAINT IF EXISTS box_intents_action_check;
|
|
19
|
+
|
|
20
|
+
ALTER TABLE box_intents
|
|
21
|
+
ADD CONSTRAINT box_intents_action_check
|
|
22
|
+
CHECK (action IN ('provision', 'wake', 'deprovision'));
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
-- migration 079: box first_connected_at — the monotonic "properly connected" signal
|
|
2
|
+
--
|
|
3
|
+
-- The onboarding "Path into the City" gains a first step, "Connect to thy dev
|
|
4
|
+
-- box" (#823, follow-up to #777 / ADR 0039). It must clear the moment a
|
|
5
|
+
-- newcomer actually reaches a working Claude on their box, and — being an
|
|
6
|
+
-- onboarding milestone — it must NEVER un-tick afterwards.
|
|
7
|
+
--
|
|
8
|
+
-- builder_boxes.claude_active (migration 078) is the live signal: the box-side
|
|
9
|
+
-- heartbeat (infra/box-heartbeat.sh) reports true while a `claude` process is
|
|
10
|
+
-- running. But it flips back to false when Claude stops, so it can't back a
|
|
11
|
+
-- monotonic step on its own. first_connected_at is the write-once derivative:
|
|
12
|
+
-- boxes.bumpActivity stamps it (COALESCE, never overwritten) the first time a
|
|
13
|
+
-- heartbeat reports claude_active=true. NULL until then; once set it stays set.
|
|
14
|
+
--
|
|
15
|
+
-- A heartbeat can only ping with a GDS token present on the box, so a
|
|
16
|
+
-- claude_active=true beat also implies the GDS CLI is authenticated — this one
|
|
17
|
+
-- signal subsumes the old cli_setup onboarding step it replaces.
|
|
18
|
+
|
|
19
|
+
ALTER TABLE builder_boxes
|
|
20
|
+
ADD COLUMN IF NOT EXISTS first_connected_at timestamptz;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
-- migration 081: re-home migration-number allocation onto tasks.needs_migration
|
|
2
|
+
--
|
|
3
|
+
-- touches[] cleanup [1/8] (task 876, architect audit
|
|
4
|
+
-- docs/audits/touches-array-2026-06-09.md, Musk algorithm / deletion-emphasized).
|
|
5
|
+
--
|
|
6
|
+
-- Until now the ONLY trigger for reserving a migration number at claim time was
|
|
7
|
+
-- the literal string 'migrations/' living inside a task's touches[] array
|
|
8
|
+
-- (db.js claimTask + batchClaim). That coupled a load-bearing allocation to a
|
|
9
|
+
-- free-text path array that drifts as code wanders into unexpected files — the
|
|
10
|
+
-- exact friction the audit targets. Replace the string sentinel with an
|
|
11
|
+
-- explicit boolean column the allocator keys off instead.
|
|
12
|
+
--
|
|
13
|
+
-- POST /tasks now sets needs_migration from the same detectsMigration()
|
|
14
|
+
-- title/description regex that used to inject 'migrations/'. Backfill every task
|
|
15
|
+
-- that still carries the old sentinel so no in-flight migration task loses its
|
|
16
|
+
-- reservation trigger across the cutover. (Duplicate migration numbers merge
|
|
17
|
+
-- cleanly and are NOT detectable at merge, so this column must land before the
|
|
18
|
+
-- touches[] column is ever dropped — see cluster steps [4/8]+.)
|
|
19
|
+
|
|
20
|
+
ALTER TABLE tasks
|
|
21
|
+
ADD COLUMN IF NOT EXISTS needs_migration boolean NOT NULL DEFAULT false;
|
|
22
|
+
|
|
23
|
+
-- Backfill from the retiring sentinel: a task that declared 'migrations/' in
|
|
24
|
+
-- touches[] is a migration-bearing task.
|
|
25
|
+
UPDATE tasks
|
|
26
|
+
SET needs_migration = true
|
|
27
|
+
WHERE needs_migration = false
|
|
28
|
+
AND 'migrations/' = ANY (touches);
|
|
29
|
+
|
|
30
|
+
-- Counter hygiene: 080_gds_v4_planning_seed.sql shipped without the customary
|
|
31
|
+
-- counter bump, so the allocator handed out 080 while 080_*.sql already existed
|
|
32
|
+
-- (the live collision that surfaced this task). Re-base the floor above this
|
|
33
|
+
-- file so the next reservation can't collide.
|
|
34
|
+
UPDATE migration_counter SET next_number = GREATEST(next_number, 82) WHERE id = 1;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
-- migration 084: tasks.security_sensitive — explicit Archon-only-broadcast flag
|
|
2
|
+
--
|
|
3
|
+
-- task 990 (owner requirement): "Security updates should only be posted to
|
|
4
|
+
-- Archons and live in a separate Discord ship-feed channel." When a task with
|
|
5
|
+
-- this flag set ships, ship.js routes its broadcast ONLY to the Archon-only
|
|
6
|
+
-- #security-ship-feed channel — never the public #ship-news or the builder
|
|
7
|
+
-- #ship-feed.
|
|
8
|
+
--
|
|
9
|
+
-- This is an EXPLICIT flag, NOT a heuristic. A title/description classifier here
|
|
10
|
+
-- would be the wrong tool: a single misfire (a security fix mis-classified as
|
|
11
|
+
-- routine) leaks the existence — and often the shape — of an unpatched exploit
|
|
12
|
+
-- to a public channel before the fix is even live. The cost of a false negative
|
|
13
|
+
-- is a disclosed vulnerability, so the flag is set deliberately by the director
|
|
14
|
+
-- on the specific tasks that warrant it, never inferred.
|
|
15
|
+
--
|
|
16
|
+
-- No backfill: the director sets security_sensitive on specific tasks
|
|
17
|
+
-- separately. Every task defaults to false (the safe-loud public broadcast).
|
|
18
|
+
|
|
19
|
+
ALTER TABLE tasks
|
|
20
|
+
ADD COLUMN IF NOT EXISTS security_sensitive boolean NOT NULL DEFAULT false;
|
|
21
|
+
|
|
22
|
+
-- Counter hygiene: keep the migration-number allocator above this file so the
|
|
23
|
+
-- next reservation can't collide with 084.
|
|
24
|
+
UPDATE migration_counter SET next_number = GREATEST(next_number, 85) WHERE id = 1;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
-- migration 085: security_docs — Archon-only sensitive security documents
|
|
2
|
+
--
|
|
3
|
+
-- task 991 (owner decision: "in the repo but Archon-gated → Archon-only server
|
|
4
|
+
-- route"). The DATED security engagement reports (exploit-detail red-team
|
|
5
|
+
-- reports — full repro, evidence, the attacker cookbook) must NOT live as files
|
|
6
|
+
-- in the git clone: the repo is cloned in full onto every Metic+ dev box
|
|
7
|
+
-- (threat-model §6.3), so a committed exploit report is an attacker cookbook on
|
|
8
|
+
-- every box. Instead the report bodies live here in the prod DB and are served
|
|
9
|
+
-- ONLY to Archons via GET /api/gds/security/docs/:slug (requireRank('archon')).
|
|
10
|
+
-- The SAFE conceptual docs (threat-model.md, the README) stay in docs/security/;
|
|
11
|
+
-- only the dated exploit reports move to this table. See ADR 0020 (the full
|
|
12
|
+
-- operational threat model is intentionally kept off-repo) and threat-model §6.3.
|
|
13
|
+
--
|
|
14
|
+
-- This is a doc store: content_md is deliberately uncapped at the schema layer
|
|
15
|
+
-- (full reports run tens of KB) — the route layer applies an explicit large cap,
|
|
16
|
+
-- NOT the small LIMITS.DESCRIPTION used for task/report fields.
|
|
17
|
+
--
|
|
18
|
+
-- No seed: the director uploads each dated report after deploy via the POST
|
|
19
|
+
-- route (slug e.g. 2026-06-12-newbuilder-redteam), so no exploit content ever
|
|
20
|
+
-- touches the repo or a migration.
|
|
21
|
+
|
|
22
|
+
CREATE TABLE IF NOT EXISTS security_docs (
|
|
23
|
+
id bigserial PRIMARY KEY,
|
|
24
|
+
slug text UNIQUE NOT NULL,
|
|
25
|
+
title text NOT NULL,
|
|
26
|
+
content_md text NOT NULL,
|
|
27
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
28
|
+
updated_at timestamptz NOT NULL DEFAULT now()
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
-- Counter hygiene: 086_rename_disciplines.sql is already on main, so push the
|
|
32
|
+
-- allocator floor above it (to 88) — the next reservation must not collide with
|
|
33
|
+
-- 085, 086, or a not-yet-merged 087.
|
|
34
|
+
UPDATE migration_counter SET next_number = GREATEST(next_number, 88) WHERE id = 1;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
-- 086_rename_disciplines.sql — task #615 / GDS-V3: rename builder disciplines.
|
|
2
|
+
--
|
|
3
|
+
-- The original discipline set (migration 014 / 027) was:
|
|
4
|
+
-- creative | engineering | unclassified
|
|
5
|
+
--
|
|
6
|
+
-- "creative" conflated two different kinds of contribution — making visual
|
|
7
|
+
-- art assets vs. thinking/writing/scoping. A builder who can scope, research,
|
|
8
|
+
-- and write but cannot produce pixel art had no clean home. The new set
|
|
9
|
+
-- splits that axis three ways:
|
|
10
|
+
--
|
|
11
|
+
-- engineer — builds code: routes, scripts, game logic, infra, migrations
|
|
12
|
+
-- artist — produces visual assets: pixel-art tiles, sprites, icons,
|
|
13
|
+
-- avatars, the art pipeline itself
|
|
14
|
+
-- ideator — contributes through thinking: idea capture, task scoping,
|
|
15
|
+
-- research, docs/briefs, feedback, user observation, naming, lore
|
|
16
|
+
--
|
|
17
|
+
-- Plus 'unclassified' (task-only) for un-triaged work, unchanged.
|
|
18
|
+
--
|
|
19
|
+
-- This migration swaps BOTH discipline CHECK constraints and backfills the
|
|
20
|
+
-- existing data:
|
|
21
|
+
--
|
|
22
|
+
-- tasks.discipline (mig 014, enum: creative|engineering|unclassified):
|
|
23
|
+
-- engineering → engineer
|
|
24
|
+
-- creative + art touches (art/, png, → artist
|
|
25
|
+
-- sprite, avatar, public/assets/)
|
|
26
|
+
-- creative + docs/ touches → ideator
|
|
27
|
+
-- creative (ambiguous / no touches) → unclassified (hand-triage)
|
|
28
|
+
-- unclassified → unclassified (unchanged)
|
|
29
|
+
--
|
|
30
|
+
-- builders.preferred_disciplines (mig 027, enum: creative|engineering):
|
|
31
|
+
-- engineering → {engineer}
|
|
32
|
+
-- creative → {artist, ideator} (inclusive: the builder opted into
|
|
33
|
+
-- non-engineering work, so surface both new lanes; they can
|
|
34
|
+
-- narrow later in /settings)
|
|
35
|
+
--
|
|
36
|
+
-- Constraints are dropped BEFORE the data updates (so the UPDATEs aren't
|
|
37
|
+
-- rejected by the old enum mid-flight) and re-added AFTER, matching the
|
|
38
|
+
-- pattern in migration 059. Every UPDATE is a no-op on already-migrated
|
|
39
|
+
-- values, so the whole file is idempotent and safe to re-run.
|
|
40
|
+
--
|
|
41
|
+
-- The discipline column is text (not a native enum) and the two SELECT t.*
|
|
42
|
+
-- views (claimable_tasks, tasks_session_fit) project the column by value, so
|
|
43
|
+
-- no view rebuild is needed — a value change is invisible to a `SELECT t.*`.
|
|
44
|
+
|
|
45
|
+
BEGIN;
|
|
46
|
+
|
|
47
|
+
-- =========================================================================
|
|
48
|
+
-- 1. Drop both CHECK constraints so the backfill UPDATEs can run.
|
|
49
|
+
-- =========================================================================
|
|
50
|
+
ALTER TABLE tasks DROP CONSTRAINT IF EXISTS tasks_discipline_check;
|
|
51
|
+
ALTER TABLE builders DROP CONSTRAINT IF EXISTS builders_preferred_disciplines_check;
|
|
52
|
+
|
|
53
|
+
-- =========================================================================
|
|
54
|
+
-- 2. Backfill tasks.discipline.
|
|
55
|
+
-- =========================================================================
|
|
56
|
+
|
|
57
|
+
-- engineering → engineer
|
|
58
|
+
UPDATE tasks SET discipline = 'engineer'
|
|
59
|
+
WHERE discipline = 'engineering';
|
|
60
|
+
|
|
61
|
+
-- creative + art-production touches → artist (applied first so it wins over
|
|
62
|
+
-- the docs rule when a task carries both art and docs paths).
|
|
63
|
+
UPDATE tasks SET discipline = 'artist'
|
|
64
|
+
WHERE discipline = 'creative'
|
|
65
|
+
AND touches IS NOT NULL
|
|
66
|
+
AND EXISTS (
|
|
67
|
+
SELECT 1 FROM unnest(touches) AS t
|
|
68
|
+
WHERE t LIKE 'art/%'
|
|
69
|
+
OR t LIKE 'public/assets/%'
|
|
70
|
+
OR t ILIKE '%png%'
|
|
71
|
+
OR t ILIKE '%sprite%'
|
|
72
|
+
OR t ILIKE '%avatar%'
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
-- creative + docs touches → ideator
|
|
76
|
+
UPDATE tasks SET discipline = 'ideator'
|
|
77
|
+
WHERE discipline = 'creative'
|
|
78
|
+
AND touches IS NOT NULL
|
|
79
|
+
AND EXISTS (
|
|
80
|
+
SELECT 1 FROM unnest(touches) AS t
|
|
81
|
+
WHERE t LIKE 'docs/%'
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
-- remaining creative (ambiguous / no touches) → unclassified for hand-triage
|
|
85
|
+
UPDATE tasks SET discipline = 'unclassified'
|
|
86
|
+
WHERE discipline = 'creative';
|
|
87
|
+
|
|
88
|
+
-- =========================================================================
|
|
89
|
+
-- 3. Backfill builders.preferred_disciplines.
|
|
90
|
+
-- Map each element through the rename table, flatten, de-dup, re-aggregate.
|
|
91
|
+
-- engineering→{engineer}, creative→{artist,ideator}, anything already-new
|
|
92
|
+
-- passes through unchanged (idempotent).
|
|
93
|
+
-- =========================================================================
|
|
94
|
+
UPDATE builders b
|
|
95
|
+
SET preferred_disciplines = COALESCE((
|
|
96
|
+
SELECT array_agg(DISTINCT m.mapped ORDER BY m.mapped)
|
|
97
|
+
FROM unnest(b.preferred_disciplines) AS d
|
|
98
|
+
CROSS JOIN LATERAL (
|
|
99
|
+
SELECT unnest(
|
|
100
|
+
CASE d
|
|
101
|
+
WHEN 'engineering' THEN ARRAY['engineer']
|
|
102
|
+
WHEN 'creative' THEN ARRAY['artist', 'ideator']
|
|
103
|
+
ELSE ARRAY[d]
|
|
104
|
+
END
|
|
105
|
+
) AS mapped
|
|
106
|
+
) AS m
|
|
107
|
+
), '{}')
|
|
108
|
+
WHERE preferred_disciplines IS NOT NULL
|
|
109
|
+
AND array_length(preferred_disciplines, 1) > 0;
|
|
110
|
+
|
|
111
|
+
-- =========================================================================
|
|
112
|
+
-- 4. Re-add both CHECK constraints with the new enum.
|
|
113
|
+
-- =========================================================================
|
|
114
|
+
ALTER TABLE tasks ADD CONSTRAINT tasks_discipline_check
|
|
115
|
+
CHECK (discipline IN ('engineer', 'artist', 'ideator', 'unclassified'));
|
|
116
|
+
|
|
117
|
+
-- preferred_disciplines never carries 'unclassified' (that's a task state,
|
|
118
|
+
-- not an interest area), mirroring migration 027's narrower set.
|
|
119
|
+
ALTER TABLE builders ADD CONSTRAINT builders_preferred_disciplines_check
|
|
120
|
+
CHECK (preferred_disciplines <@ ARRAY['engineer', 'artist', 'ideator']::text[]);
|
|
121
|
+
|
|
122
|
+
INSERT INTO schema_migrations (version) VALUES ('086_rename_disciplines')
|
|
123
|
+
ON CONFLICT (version) DO NOTHING;
|
|
124
|
+
|
|
125
|
+
COMMIT;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-- migration 088: per-builder Anthropic account attestation (V3.R10 / task 235, criterion C3)
|
|
2
|
+
--
|
|
3
|
+
-- C3 wants every builder shipping under their OWN credentials, with cost +
|
|
4
|
+
-- authorship attributable to a real person. The GDS identity is already a
|
|
5
|
+
-- GitHub OAuth login, but we also want to know WHICH Anthropic account is
|
|
6
|
+
-- driving the Claude Code session that makes the API calls — so a forged or
|
|
7
|
+
-- borrowed CLI token can be cross-checked against the Anthropic identity the
|
|
8
|
+
-- trusted local agent reports.
|
|
9
|
+
--
|
|
10
|
+
-- A first-party "sign in with Anthropic" OAuth does not exist yet. Instead we
|
|
11
|
+
-- lean on the fact that Claude Code itself is the trusted agent on the
|
|
12
|
+
-- builder's machine: during /builder-setup it reads its own ~/.claude.json
|
|
13
|
+
-- oauthAccount (emailAddress + accountUuid), the builder confirms the email,
|
|
14
|
+
-- and we store the attested pair here. Thereafter the CLI sends the
|
|
15
|
+
-- accountUuid as an X-Anthropic-User header and requireBuilder cross-checks it.
|
|
16
|
+
--
|
|
17
|
+
-- This is ATTESTATION, not strong auth (the header can be omitted) — the V4
|
|
18
|
+
-- follow-up replaces it with real Anthropic OAuth when that ships. Both columns
|
|
19
|
+
-- are NULL until a builder links, so the requireBuilder cross-check is inert
|
|
20
|
+
-- for every existing builder and the column add is fully back-compat.
|
|
21
|
+
|
|
22
|
+
ALTER TABLE builders
|
|
23
|
+
ADD COLUMN IF NOT EXISTS anthropic_email text,
|
|
24
|
+
ADD COLUMN IF NOT EXISTS anthropic_user_id text;
|
|
25
|
+
|
|
26
|
+
-- Counter hygiene: keep the migration-number allocator above this file so the
|
|
27
|
+
-- next reservation can't collide with 088.
|
|
28
|
+
UPDATE migration_counter SET next_number = GREATEST(next_number, 89) WHERE id = 1;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
-- migration 089: per-builder monthly spend budget (V3.R84 / task 302, criterion C3)
|
|
2
|
+
--
|
|
3
|
+
-- C3 wants each builder to ship under their OWN cost ceiling, with a soft-cap
|
|
4
|
+
-- warning before they hit it and a hard-cap refusal at it. This column is the
|
|
5
|
+
-- per-builder override; NULL means "use the project default"
|
|
6
|
+
-- (cost.DEFAULT_MONTHLY_BUDGET_USD) so the global default can move without a
|
|
7
|
+
-- migration. An Archon sets a non-null value via PATCH /builders/:id/budget to
|
|
8
|
+
-- raise or lower a specific builder's ceiling.
|
|
9
|
+
--
|
|
10
|
+
-- Spend is month-to-date over cost_log.recorded_at (date_trunc('month', now())),
|
|
11
|
+
-- attributed by cost_log.builder_id (migration 046). No new spend column — the
|
|
12
|
+
-- ledger already records every dollar; this only stores the ceiling.
|
|
13
|
+
|
|
14
|
+
ALTER TABLE builders
|
|
15
|
+
ADD COLUMN IF NOT EXISTS monthly_budget_usd numeric;
|
|
16
|
+
|
|
17
|
+
-- Counter hygiene: keep the migration-number allocator above this file so the
|
|
18
|
+
-- next reservation can't collide with 089.
|
|
19
|
+
UPDATE migration_counter SET next_number = GREATEST(next_number, 90) WHERE id = 1;
|