@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,22 @@
|
|
|
1
|
+
-- Claim session lock — closes the cross-session claim-interference hole
|
|
2
|
+
-- described 2026-05-11.
|
|
3
|
+
--
|
|
4
|
+
-- The bug: builder has claim A active in session-A (terminal 1). Session-B
|
|
5
|
+
-- (terminal 2) calls /builder-release — same builder_id passes the existing
|
|
6
|
+
-- NOT_YOUR_CLAIM check — drops claim A, then claims a conflicting task.
|
|
7
|
+
-- Session-A has no idea its claim was released and keeps working. Both
|
|
8
|
+
-- sessions advance changes to the same files; only one wins at ship time.
|
|
9
|
+
--
|
|
10
|
+
-- Fix: record which session created each claim. The resolve endpoint
|
|
11
|
+
-- enforces that only the creator session can ship or release it. A different
|
|
12
|
+
-- terminal (different session token) gets CLAIM_SESSION_MISMATCH (403).
|
|
13
|
+
-- Use --force on /builder-release as an emergency escape hatch when the
|
|
14
|
+
-- original terminal is gone.
|
|
15
|
+
--
|
|
16
|
+
-- Parallel non-conflicting claims (different touches[]) are still allowed —
|
|
17
|
+
-- this change only prevents cross-session resolve, not cross-session claiming.
|
|
18
|
+
ALTER TABLE claims
|
|
19
|
+
ADD COLUMN IF NOT EXISTS creator_session_id bigint REFERENCES builder_sessions(id);
|
|
20
|
+
|
|
21
|
+
INSERT INTO schema_migrations (version) VALUES ('013_claim_locking')
|
|
22
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
-- 014_pms_task_discipline.sql — adds tasks.discipline.
|
|
2
|
+
--
|
|
3
|
+
-- tasks.kind classifies the TYPE of change (feature / bug / refactor / ...).
|
|
4
|
+
-- tasks.discipline classifies the BUILDER INTEREST AREA — orthogonal axis
|
|
5
|
+
-- so a builder can filter the work queue to what they actually want to do:
|
|
6
|
+
--
|
|
7
|
+
-- creative — map/world recommendations, quests, narrative, visual art,
|
|
8
|
+
-- level design, pixel-art pipeline work
|
|
9
|
+
-- engineering — gameplay mechanics, infra, the PMS itself, performance,
|
|
10
|
+
-- data plumbing, bug fixes that aren't visual
|
|
11
|
+
-- unclassified — default for existing rows + new captures; gets triaged later
|
|
12
|
+
--
|
|
13
|
+
-- Applies to both tracks (product + internal). Existing rows stay
|
|
14
|
+
-- 'unclassified'; retroactive classification is a separate task.
|
|
15
|
+
--
|
|
16
|
+
-- The two existing tasks views that expose `SELECT t.*` (claimable_tasks,
|
|
17
|
+
-- tasks_session_fit) are rebuilt below so the new column flows through to
|
|
18
|
+
-- API consumers without a follow-up migration. version_progress and
|
|
19
|
+
-- version_lifecycle_breakdown project specific columns and don't need
|
|
20
|
+
-- rebuilding.
|
|
21
|
+
--
|
|
22
|
+
-- Idempotent: safe to re-run.
|
|
23
|
+
|
|
24
|
+
-- =========================================================================
|
|
25
|
+
-- 1. Column + CHECK constraint
|
|
26
|
+
-- =========================================================================
|
|
27
|
+
|
|
28
|
+
ALTER TABLE tasks
|
|
29
|
+
ADD COLUMN IF NOT EXISTS discipline text NOT NULL DEFAULT 'unclassified';
|
|
30
|
+
|
|
31
|
+
DO $$
|
|
32
|
+
BEGIN
|
|
33
|
+
IF NOT EXISTS (
|
|
34
|
+
SELECT 1 FROM pg_constraint WHERE conname = 'tasks_discipline_check'
|
|
35
|
+
) THEN
|
|
36
|
+
ALTER TABLE tasks ADD CONSTRAINT tasks_discipline_check
|
|
37
|
+
CHECK (discipline IN ('creative', 'engineering', 'unclassified'));
|
|
38
|
+
END IF;
|
|
39
|
+
END$$;
|
|
40
|
+
|
|
41
|
+
-- =========================================================================
|
|
42
|
+
-- 2. Rebuild views that use SELECT t.* so the new column is exposed
|
|
43
|
+
-- =========================================================================
|
|
44
|
+
|
|
45
|
+
-- claimable_tasks — body identical to migration 006's definition. Rebuilt
|
|
46
|
+
-- only so SELECT t.* re-expands and picks up tasks.discipline.
|
|
47
|
+
DROP VIEW IF EXISTS claimable_tasks;
|
|
48
|
+
CREATE VIEW claimable_tasks AS
|
|
49
|
+
SELECT t.*
|
|
50
|
+
FROM tasks t
|
|
51
|
+
WHERE t.status = 'ready'
|
|
52
|
+
AND t.title NOT LIKE '\_\_smoke\_\_%' ESCAPE '\'
|
|
53
|
+
AND NOT EXISTS (
|
|
54
|
+
SELECT 1 FROM task_blockers tb WHERE tb.task_id = t.id
|
|
55
|
+
)
|
|
56
|
+
AND NOT EXISTS (
|
|
57
|
+
SELECT 1 FROM claims c
|
|
58
|
+
JOIN tasks t2 ON t2.id = c.task_id
|
|
59
|
+
WHERE c.released_at IS NULL
|
|
60
|
+
AND t2.touches && t.touches
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
-- tasks_session_fit — body identical to migration 006's definition.
|
|
64
|
+
DROP VIEW IF EXISTS tasks_session_fit;
|
|
65
|
+
CREATE VIEW tasks_session_fit AS
|
|
66
|
+
SELECT t.*,
|
|
67
|
+
CASE
|
|
68
|
+
WHEN t.automation_tag = 'overnight-safe' AND COALESCE(t.manual_degree, 5) <= 2
|
|
69
|
+
AND NOT EXISTS (SELECT 1 FROM task_blockers tb WHERE tb.task_id = t.id)
|
|
70
|
+
THEN ARRAY['autonomous','check-in','active']
|
|
71
|
+
WHEN t.automation_tag = 'live-only' OR COALESCE(t.manual_degree, 5) >= 4
|
|
72
|
+
THEN ARRAY['active']
|
|
73
|
+
ELSE ARRAY['check-in','active']
|
|
74
|
+
END AS fits_session_modes,
|
|
75
|
+
CASE WHEN t.credits_reward > 0 AND t.est_minutes IS NOT NULL AND t.est_minutes > 0
|
|
76
|
+
THEN ROUND(t.credits_reward::numeric / t.est_minutes, 3)
|
|
77
|
+
ELSE NULL
|
|
78
|
+
END AS credits_per_minute
|
|
79
|
+
FROM tasks t;
|
|
80
|
+
|
|
81
|
+
-- =========================================================================
|
|
82
|
+
-- 3. Record migration
|
|
83
|
+
-- =========================================================================
|
|
84
|
+
|
|
85
|
+
INSERT INTO schema_migrations (version) VALUES ('014_pms_task_discipline')
|
|
86
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
-- 015_pms_estimation_calibration.sql — per-kind estimate calibration.
|
|
2
|
+
--
|
|
3
|
+
-- Problem (investigated 2026-05-11, idea #25, task #198):
|
|
4
|
+
-- Across 109 shipped tasks with actuals, median actual/est ratio is 0.03
|
|
5
|
+
-- (mean 0.14, p90 0.10). Estimates are sized for humans but the work is
|
|
6
|
+
-- Claude-executed — they run ~30× faster than the prior assumes. The
|
|
7
|
+
-- optimizer's `est_minutes <= timeBudgetMin` filter rejects tasks that
|
|
8
|
+
-- would actually fit; displayed estimates create false expectations.
|
|
9
|
+
--
|
|
10
|
+
-- Fix:
|
|
11
|
+
-- `pms_calibrated_minutes(est, kind)` returns est × per-kind median ratio
|
|
12
|
+
-- computed live from shipped+confirmed tasks (the smoke-filter row
|
|
13
|
+
-- pattern from view 006 is preserved). Three-tier fallback:
|
|
14
|
+
-- 1. ≥5 same-kind samples → use kind-specific median.
|
|
15
|
+
-- 2. ≥10 total samples → use overall median (kind has too little data).
|
|
16
|
+
-- 3. <10 total samples → return raw est (cold-start; trust the human).
|
|
17
|
+
-- Returning NULL for NULL/zero est. Result is GREATEST(1, …) so we never
|
|
18
|
+
-- tell a builder "0 minutes".
|
|
19
|
+
--
|
|
20
|
+
-- `claimable_tasks` and `tasks_session_fit` are rebuilt to expose
|
|
21
|
+
-- `est_minutes_calibrated` and to compute `credits_per_minute` from
|
|
22
|
+
-- the calibrated number rather than the raw input.
|
|
23
|
+
--
|
|
24
|
+
-- Selection follow-on (src/pms/optimizer.js):
|
|
25
|
+
-- `est_minutes <= timeBudgetMin` becomes
|
|
26
|
+
-- `COALESCE(est_minutes_calibrated, est_minutes) <= timeBudgetMin`.
|
|
27
|
+
--
|
|
28
|
+
-- Idempotent: CREATE OR REPLACE for function + views.
|
|
29
|
+
|
|
30
|
+
CREATE OR REPLACE FUNCTION pms_calibrated_minutes(est integer, in_kind text)
|
|
31
|
+
RETURNS integer
|
|
32
|
+
LANGUAGE sql
|
|
33
|
+
STABLE
|
|
34
|
+
AS $$
|
|
35
|
+
WITH ratios AS (
|
|
36
|
+
SELECT t.kind,
|
|
37
|
+
t.actual_minutes::numeric / t.est_minutes AS r
|
|
38
|
+
FROM tasks t
|
|
39
|
+
WHERE t.status IN ('shipped', 'confirmed')
|
|
40
|
+
AND t.actual_minutes IS NOT NULL
|
|
41
|
+
AND t.est_minutes IS NOT NULL
|
|
42
|
+
AND t.est_minutes > 0
|
|
43
|
+
AND t.title NOT LIKE '\_\_smoke\_\_%' ESCAPE '\'
|
|
44
|
+
),
|
|
45
|
+
kind_stats AS (
|
|
46
|
+
SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY r)::numeric AS median,
|
|
47
|
+
COUNT(*)::integer AS n
|
|
48
|
+
FROM ratios
|
|
49
|
+
WHERE kind = in_kind
|
|
50
|
+
),
|
|
51
|
+
overall_stats AS (
|
|
52
|
+
SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY r)::numeric AS median,
|
|
53
|
+
COUNT(*)::integer AS n
|
|
54
|
+
FROM ratios
|
|
55
|
+
)
|
|
56
|
+
SELECT CASE
|
|
57
|
+
WHEN est IS NULL OR est <= 0 THEN NULL
|
|
58
|
+
WHEN (SELECT n FROM kind_stats) >= 5 THEN
|
|
59
|
+
GREATEST(1, ROUND(est * (SELECT median FROM kind_stats))::integer)
|
|
60
|
+
WHEN (SELECT n FROM overall_stats) >= 10 THEN
|
|
61
|
+
GREATEST(1, ROUND(est * (SELECT median FROM overall_stats))::integer)
|
|
62
|
+
ELSE est
|
|
63
|
+
END;
|
|
64
|
+
$$;
|
|
65
|
+
|
|
66
|
+
-- Companion summary function for transparency / debugging. Returns the
|
|
67
|
+
-- ratios table used by pms_calibrated_minutes. Not used in production
|
|
68
|
+
-- selection — only by smoke tests, /builder-start --debug, and any future
|
|
69
|
+
-- status-page transparency row (deferred follow-up).
|
|
70
|
+
CREATE OR REPLACE FUNCTION pms_calibration_summary()
|
|
71
|
+
RETURNS TABLE (kind text, median_ratio numeric, sample_size integer)
|
|
72
|
+
LANGUAGE sql
|
|
73
|
+
STABLE
|
|
74
|
+
AS $$
|
|
75
|
+
WITH ratios AS (
|
|
76
|
+
SELECT t.kind,
|
|
77
|
+
t.actual_minutes::numeric / t.est_minutes AS r
|
|
78
|
+
FROM tasks t
|
|
79
|
+
WHERE t.status IN ('shipped', 'confirmed')
|
|
80
|
+
AND t.actual_minutes IS NOT NULL
|
|
81
|
+
AND t.est_minutes IS NOT NULL
|
|
82
|
+
AND t.est_minutes > 0
|
|
83
|
+
AND t.title NOT LIKE '\_\_smoke\_\_%' ESCAPE '\'
|
|
84
|
+
)
|
|
85
|
+
SELECT kind,
|
|
86
|
+
ROUND(percentile_cont(0.5) WITHIN GROUP (ORDER BY r)::numeric, 4) AS median_ratio,
|
|
87
|
+
COUNT(*)::integer AS sample_size
|
|
88
|
+
FROM ratios
|
|
89
|
+
GROUP BY kind
|
|
90
|
+
ORDER BY sample_size DESC, kind;
|
|
91
|
+
$$;
|
|
92
|
+
|
|
93
|
+
-- Rebuild claimable_tasks to expose est_minutes_calibrated. Same WHERE
|
|
94
|
+
-- clauses as 006 — only the SELECT list changes.
|
|
95
|
+
DROP VIEW IF EXISTS claimable_tasks;
|
|
96
|
+
CREATE VIEW claimable_tasks AS
|
|
97
|
+
SELECT t.*,
|
|
98
|
+
pms_calibrated_minutes(t.est_minutes, t.kind) AS est_minutes_calibrated
|
|
99
|
+
FROM tasks t
|
|
100
|
+
WHERE t.status = 'ready'
|
|
101
|
+
AND t.title NOT LIKE '\_\_smoke\_\_%' ESCAPE '\'
|
|
102
|
+
AND NOT EXISTS (
|
|
103
|
+
SELECT 1 FROM task_blockers tb WHERE tb.task_id = t.id
|
|
104
|
+
)
|
|
105
|
+
AND NOT EXISTS (
|
|
106
|
+
SELECT 1 FROM claims c
|
|
107
|
+
JOIN tasks t2 ON t2.id = c.task_id
|
|
108
|
+
WHERE c.released_at IS NULL
|
|
109
|
+
AND t2.touches && t.touches
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
-- Rebuild tasks_session_fit to compute credits_per_minute against the
|
|
113
|
+
-- calibrated estimate (was: raw est_minutes). Also exposes
|
|
114
|
+
-- est_minutes_calibrated so consumers can display it. Uses DROP+CREATE
|
|
115
|
+
-- rather than OR REPLACE because adding a column mid-SELECT-list isn't
|
|
116
|
+
-- supported by CREATE OR REPLACE VIEW. No dependent views (verified
|
|
117
|
+
-- against pg_depend at migration-write time).
|
|
118
|
+
DROP VIEW IF EXISTS tasks_session_fit;
|
|
119
|
+
CREATE VIEW tasks_session_fit AS
|
|
120
|
+
SELECT t.*,
|
|
121
|
+
CASE
|
|
122
|
+
WHEN t.automation_tag = 'overnight-safe' AND COALESCE(t.manual_degree, 5) <= 2
|
|
123
|
+
AND NOT EXISTS (SELECT 1 FROM task_blockers tb WHERE tb.task_id = t.id)
|
|
124
|
+
THEN ARRAY['autonomous','check-in','active']
|
|
125
|
+
WHEN t.automation_tag = 'live-only' OR COALESCE(t.manual_degree, 5) >= 4
|
|
126
|
+
THEN ARRAY['active']
|
|
127
|
+
ELSE ARRAY['check-in','active']
|
|
128
|
+
END AS fits_session_modes,
|
|
129
|
+
pms_calibrated_minutes(t.est_minutes, t.kind) AS est_minutes_calibrated,
|
|
130
|
+
CASE
|
|
131
|
+
WHEN t.credits_reward > 0
|
|
132
|
+
AND pms_calibrated_minutes(t.est_minutes, t.kind) IS NOT NULL
|
|
133
|
+
AND pms_calibrated_minutes(t.est_minutes, t.kind) > 0
|
|
134
|
+
THEN ROUND(t.credits_reward::numeric / pms_calibrated_minutes(t.est_minutes, t.kind), 3)
|
|
135
|
+
ELSE NULL
|
|
136
|
+
END AS credits_per_minute
|
|
137
|
+
FROM tasks t;
|
|
138
|
+
|
|
139
|
+
INSERT INTO schema_migrations (version) VALUES ('015_pms_estimation_calibration')
|
|
140
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
-- PMS-V2 task 197: quality grader for task output.
|
|
2
|
+
--
|
|
3
|
+
-- One row per task. Inserted when a task transitions completed → confirmed
|
|
4
|
+
-- (or when verification passes and the grade fails — see grader.js).
|
|
5
|
+
-- The grade gates the lifecycle transition: passed=true → confirmed +
|
|
6
|
+
-- credits, passed=false → task stays at completed, no credits.
|
|
7
|
+
--
|
|
8
|
+
-- The threshold + grader_version are captured PER ROW so historical grades
|
|
9
|
+
-- stay interpretable when either moves. V2 ships with threshold=5.0 and
|
|
10
|
+
-- grader_version='v1'; rubric weights live in src/pms/grader-rubric.json.
|
|
11
|
+
|
|
12
|
+
CREATE TABLE IF NOT EXISTS task_grades (
|
|
13
|
+
id BIGSERIAL PRIMARY KEY,
|
|
14
|
+
task_id BIGINT NOT NULL UNIQUE REFERENCES tasks(id) ON DELETE CASCADE,
|
|
15
|
+
score NUMERIC(3,1) NOT NULL CHECK (score >= 0 AND score <= 10),
|
|
16
|
+
passed BOOLEAN NOT NULL,
|
|
17
|
+
threshold NUMERIC(3,1) NOT NULL,
|
|
18
|
+
grader_kind TEXT NOT NULL CHECK (grader_kind IN ('auto', 'subagent', 'lars')),
|
|
19
|
+
grader_version TEXT NOT NULL,
|
|
20
|
+
rubric_scores JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
21
|
+
signals JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
22
|
+
notes_md TEXT,
|
|
23
|
+
graded_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_task_grades_graded_at ON task_grades(graded_at DESC);
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_task_grades_passed_grade ON task_grades(passed, graded_at DESC);
|
|
28
|
+
|
|
29
|
+
-- View: grades joined with task + claim + cost. Powers the V4 optimizer
|
|
30
|
+
-- (quality-per-dollar) and the public dashboard tile.
|
|
31
|
+
CREATE OR REPLACE VIEW task_grades_with_context AS
|
|
32
|
+
SELECT
|
|
33
|
+
g.id AS grade_id,
|
|
34
|
+
g.task_id,
|
|
35
|
+
g.score,
|
|
36
|
+
g.passed,
|
|
37
|
+
g.threshold,
|
|
38
|
+
g.grader_kind,
|
|
39
|
+
g.grader_version,
|
|
40
|
+
g.rubric_scores,
|
|
41
|
+
g.signals,
|
|
42
|
+
g.graded_at,
|
|
43
|
+
t.title AS task_title,
|
|
44
|
+
t.kind AS task_kind,
|
|
45
|
+
t.discipline AS task_discipline,
|
|
46
|
+
t.version_id,
|
|
47
|
+
t.est_minutes,
|
|
48
|
+
t.actual_minutes,
|
|
49
|
+
t.shipped_by AS builder_id,
|
|
50
|
+
b.github_login,
|
|
51
|
+
b.display_name,
|
|
52
|
+
(SELECT COALESCE(SUM(amount_usd), 0)
|
|
53
|
+
FROM cost_log cl WHERE cl.task_id = g.task_id) AS total_cost_usd
|
|
54
|
+
FROM task_grades g
|
|
55
|
+
JOIN tasks t ON t.id = g.task_id
|
|
56
|
+
LEFT JOIN builders b ON b.id = t.shipped_by;
|
|
57
|
+
|
|
58
|
+
-- Bump the migration counter past 016 so the next claim that includes
|
|
59
|
+
-- 'migrations/' allocates 017.
|
|
60
|
+
UPDATE migration_counter SET next_number = GREATEST(next_number, 17) WHERE id = 1;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
-- PMS task #218 — version_progress should not count abandoned tasks.
|
|
2
|
+
--
|
|
3
|
+
-- Background: migration 012 rebuilt version_progress to treat completed +
|
|
4
|
+
-- confirmed + shipped as "done" but kept abandoned tasks in the denominator.
|
|
5
|
+
-- That's wrong: abandoned is a terminal state (deliberately cut), not pending
|
|
6
|
+
-- work. It should be filtered out just like __smoke__ and parent tasks.
|
|
7
|
+
--
|
|
8
|
+
-- Effect: closing versions surface their true completion ratio. PMS-V2 (which
|
|
9
|
+
-- abandoned 5 tasks during build, mostly debris + redundant rows) jumps from
|
|
10
|
+
-- 92% to 100% once its last in-flight task lands. The progress-bar metric now
|
|
11
|
+
-- matches "of the work this version actually scoped, what shipped?"
|
|
12
|
+
--
|
|
13
|
+
-- DROP+CREATE rather than CREATE OR REPLACE because Postgres rejects the
|
|
14
|
+
-- latter when the column list/order would change. Here the columns are
|
|
15
|
+
-- identical to migration 012 — the only diff is one extra clause in each
|
|
16
|
+
-- FILTER — but DROP+CREATE is the safe pattern for view edits (see PMS
|
|
17
|
+
-- learnings).
|
|
18
|
+
|
|
19
|
+
DROP VIEW IF EXISTS version_progress;
|
|
20
|
+
CREATE VIEW version_progress AS
|
|
21
|
+
SELECT v.id AS version_id,
|
|
22
|
+
v.name,
|
|
23
|
+
v.track,
|
|
24
|
+
v.status,
|
|
25
|
+
count(*) FILTER (
|
|
26
|
+
WHERE t.status IN ('completed', 'confirmed', 'shipped')
|
|
27
|
+
AND t.title NOT LIKE '\_\_smoke\_\_%' ESCAPE '\'
|
|
28
|
+
AND NOT EXISTS (SELECT 1 FROM tasks c WHERE c.parent_task_id = t.id)
|
|
29
|
+
) AS shipped_count,
|
|
30
|
+
count(*) FILTER (
|
|
31
|
+
WHERE t.status <> 'abandoned'
|
|
32
|
+
AND t.title NOT LIKE '\_\_smoke\_\_%' ESCAPE '\'
|
|
33
|
+
AND NOT EXISTS (SELECT 1 FROM tasks c WHERE c.parent_task_id = t.id)
|
|
34
|
+
) AS total_count,
|
|
35
|
+
COALESCE(SUM(CASE
|
|
36
|
+
WHEN t.status IN ('completed', 'confirmed', 'shipped')
|
|
37
|
+
AND t.title NOT LIKE '\_\_smoke\_\_%' ESCAPE '\'
|
|
38
|
+
AND NOT EXISTS (SELECT 1 FROM tasks c WHERE c.parent_task_id = t.id)
|
|
39
|
+
THEN (6 - COALESCE(t.priority, 5))
|
|
40
|
+
ELSE 0 END), 0) AS shipped_weight,
|
|
41
|
+
COALESCE(SUM(CASE
|
|
42
|
+
WHEN t.status <> 'abandoned'
|
|
43
|
+
AND t.title NOT LIKE '\_\_smoke\_\_%' ESCAPE '\'
|
|
44
|
+
AND NOT EXISTS (SELECT 1 FROM tasks c WHERE c.parent_task_id = t.id)
|
|
45
|
+
THEN (6 - COALESCE(t.priority, 5))
|
|
46
|
+
ELSE 0 END), 0) AS total_weight
|
|
47
|
+
FROM versions v
|
|
48
|
+
LEFT JOIN tasks t ON t.version_id = v.id
|
|
49
|
+
GROUP BY v.id, v.name, v.track, v.status;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
-- 019_rename_pms_v3_to_gds_v3.sql
|
|
2
|
+
--
|
|
3
|
+
-- V3.R01: rename the in-flight version's ID from `PMS-V3` to `GDS-V3`, and
|
|
4
|
+
-- rename the related `pms-shipper` achievement to `gds-shipper`.
|
|
5
|
+
--
|
|
6
|
+
-- PMS-V1 and PMS-V2 are intentionally NOT renamed — those versions shipped
|
|
7
|
+
-- under those names and their archives in `limitations/pms-v*-shipped.md`
|
|
8
|
+
-- are immutable historical records. Going forward (V3 onward), the system
|
|
9
|
+
-- is the Game Development System (GDS); future versions are GDS-V4, GDS-V5,
|
|
10
|
+
-- etc.
|
|
11
|
+
--
|
|
12
|
+
-- The version id `versions(id)` is a TEXT primary key referenced by FK from
|
|
13
|
+
-- `tasks`, `done_when_criteria`, and `idea_inbox`. The `achievements(id)`
|
|
14
|
+
-- primary key is referenced by FK from `builder_achievements`. Neither FK
|
|
15
|
+
-- was declared with `ON UPDATE CASCADE`, so we drop them, rewrite all the
|
|
16
|
+
-- relevant tables in one transaction, and re-add them at the end.
|
|
17
|
+
--
|
|
18
|
+
-- `source_ref` strings that were seeded as `pms-v3-r##` are rewritten to
|
|
19
|
+
-- `gds-v3-r##` for consistency (these are internal audit identifiers — no
|
|
20
|
+
-- user-visible surface).
|
|
21
|
+
|
|
22
|
+
BEGIN;
|
|
23
|
+
|
|
24
|
+
-- ─────────────────────────────────────────────────────────────────────────
|
|
25
|
+
-- 1. Versions rename: PMS-V3 → GDS-V3
|
|
26
|
+
-- ─────────────────────────────────────────────────────────────────────────
|
|
27
|
+
|
|
28
|
+
ALTER TABLE tasks DROP CONSTRAINT IF EXISTS tasks_version_id_fkey;
|
|
29
|
+
ALTER TABLE done_when_criteria DROP CONSTRAINT IF EXISTS done_when_criteria_version_id_fkey;
|
|
30
|
+
ALTER TABLE idea_inbox DROP CONSTRAINT IF EXISTS idea_inbox_suggested_version_fkey;
|
|
31
|
+
|
|
32
|
+
UPDATE versions SET id = 'GDS-V3' WHERE id = 'PMS-V3';
|
|
33
|
+
|
|
34
|
+
UPDATE tasks SET version_id = 'GDS-V3' WHERE version_id = 'PMS-V3';
|
|
35
|
+
UPDATE done_when_criteria SET version_id = 'GDS-V3' WHERE version_id = 'PMS-V3';
|
|
36
|
+
UPDATE idea_inbox SET suggested_version = 'GDS-V3' WHERE suggested_version = 'PMS-V3';
|
|
37
|
+
|
|
38
|
+
-- Rewrite V3 planning-seed source_refs (pms-v3-r## → gds-v3-r##)
|
|
39
|
+
UPDATE tasks SET source_ref = REPLACE(source_ref, 'pms-v3-', 'gds-v3-') WHERE source_ref LIKE 'pms-v3-%';
|
|
40
|
+
|
|
41
|
+
ALTER TABLE tasks ADD CONSTRAINT tasks_version_id_fkey FOREIGN KEY (version_id) REFERENCES versions(id);
|
|
42
|
+
ALTER TABLE done_when_criteria ADD CONSTRAINT done_when_criteria_version_id_fkey FOREIGN KEY (version_id) REFERENCES versions(id);
|
|
43
|
+
ALTER TABLE idea_inbox ADD CONSTRAINT idea_inbox_suggested_version_fkey FOREIGN KEY (suggested_version) REFERENCES versions(id);
|
|
44
|
+
|
|
45
|
+
-- ─────────────────────────────────────────────────────────────────────────
|
|
46
|
+
-- 2. Achievement rename: pms-shipper → gds-shipper
|
|
47
|
+
-- Display name also updates ("PMS Shipper" → "GDS Shipper") for the UI.
|
|
48
|
+
-- ─────────────────────────────────────────────────────────────────────────
|
|
49
|
+
|
|
50
|
+
ALTER TABLE builder_achievements DROP CONSTRAINT IF EXISTS builder_achievements_achievement_id_fkey;
|
|
51
|
+
|
|
52
|
+
UPDATE achievements
|
|
53
|
+
SET id = 'gds-shipper',
|
|
54
|
+
name = 'GDS Shipper'
|
|
55
|
+
WHERE id = 'pms-shipper';
|
|
56
|
+
|
|
57
|
+
UPDATE builder_achievements
|
|
58
|
+
SET achievement_id = 'gds-shipper'
|
|
59
|
+
WHERE achievement_id = 'pms-shipper';
|
|
60
|
+
|
|
61
|
+
ALTER TABLE builder_achievements
|
|
62
|
+
ADD CONSTRAINT builder_achievements_achievement_id_fkey
|
|
63
|
+
FOREIGN KEY (achievement_id) REFERENCES achievements(id);
|
|
64
|
+
|
|
65
|
+
COMMIT;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
-- 020_task_dependencies.sql
|
|
2
|
+
-- GDS-V3 / task 309 / V3.R01b — Task dependencies + auto-promotion system.
|
|
3
|
+
--
|
|
4
|
+
-- Adds a many-to-many task-dependency table and a trigger that auto-promotes
|
|
5
|
+
-- non-spike tasks from 'backlog' → 'ready' when their last dependency ships.
|
|
6
|
+
--
|
|
7
|
+
-- Operating rules (see ADR 0015):
|
|
8
|
+
-- * task_dependencies(task_id, depends_on_task_id) is the canonical edge list.
|
|
9
|
+
-- * A task is "satisfied" iff every row pointing at it from task_dependencies
|
|
10
|
+
-- has the referenced task in status='shipped'.
|
|
11
|
+
-- * The trigger fires when a task transitions INTO status='shipped'.
|
|
12
|
+
-- It scans every dependent of the just-shipped task. If a dependent is
|
|
13
|
+
-- in 'backlog', is NOT a spike, and all its other deps are also shipped,
|
|
14
|
+
-- it auto-promotes to 'ready'. Spikes stay in backlog by convention —
|
|
15
|
+
-- they're the architectural gates that humans open manually.
|
|
16
|
+
-- * Claim-time enforcement (refusing to claim while a dep is unshipped) is
|
|
17
|
+
-- handled in the application layer (src/bongos/db.js createClaim).
|
|
18
|
+
|
|
19
|
+
BEGIN;
|
|
20
|
+
|
|
21
|
+
-- ============================================================================
|
|
22
|
+
-- 1. task_dependencies table
|
|
23
|
+
-- ============================================================================
|
|
24
|
+
CREATE TABLE IF NOT EXISTS task_dependencies (
|
|
25
|
+
task_id bigint NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
26
|
+
depends_on_task_id bigint NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
27
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
28
|
+
PRIMARY KEY (task_id, depends_on_task_id),
|
|
29
|
+
CONSTRAINT no_self_dep CHECK (task_id <> depends_on_task_id)
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
-- "What does X depend on?" (forward edge)
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_task_deps_task
|
|
34
|
+
ON task_dependencies (task_id);
|
|
35
|
+
|
|
36
|
+
-- "What depends on Y?" (reverse edge — used by the auto-promotion trigger)
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_task_deps_depends_on
|
|
38
|
+
ON task_dependencies (depends_on_task_id);
|
|
39
|
+
|
|
40
|
+
-- ============================================================================
|
|
41
|
+
-- 2. Auto-promotion trigger
|
|
42
|
+
-- ============================================================================
|
|
43
|
+
-- Fires AFTER UPDATE OF status when the new status is 'shipped'. Looks for
|
|
44
|
+
-- backlog tasks that depend on the just-shipped one, AND whose remaining
|
|
45
|
+
-- deps are also all shipped, AND that are not kind='spike'. Promotes them
|
|
46
|
+
-- to 'ready'.
|
|
47
|
+
--
|
|
48
|
+
-- We deliberately do NOT touch tasks in any other status (active, blocked,
|
|
49
|
+
-- completed, etc.) — auto-promotion only kicks in from 'backlog'. If a task
|
|
50
|
+
-- was manually promoted earlier and is mid-flight, the trigger leaves it
|
|
51
|
+
-- alone.
|
|
52
|
+
|
|
53
|
+
CREATE OR REPLACE FUNCTION promote_dependents_on_ship()
|
|
54
|
+
RETURNS TRIGGER AS $$
|
|
55
|
+
BEGIN
|
|
56
|
+
-- Only fire on transition INTO 'shipped'
|
|
57
|
+
IF NEW.status = 'shipped' AND (OLD.status IS DISTINCT FROM 'shipped') THEN
|
|
58
|
+
UPDATE tasks t
|
|
59
|
+
SET status = 'ready',
|
|
60
|
+
promoted_at = COALESCE(t.promoted_at, now()),
|
|
61
|
+
updated_at = now()
|
|
62
|
+
WHERE t.status = 'backlog'
|
|
63
|
+
AND t.kind <> 'spike'
|
|
64
|
+
AND EXISTS (
|
|
65
|
+
SELECT 1 FROM task_dependencies td
|
|
66
|
+
WHERE td.task_id = t.id
|
|
67
|
+
AND td.depends_on_task_id = NEW.id
|
|
68
|
+
)
|
|
69
|
+
AND NOT EXISTS (
|
|
70
|
+
-- still has at least one unshipped dep
|
|
71
|
+
SELECT 1 FROM task_dependencies td2
|
|
72
|
+
JOIN tasks dep ON dep.id = td2.depends_on_task_id
|
|
73
|
+
WHERE td2.task_id = t.id
|
|
74
|
+
AND dep.status <> 'shipped'
|
|
75
|
+
AND dep.id <> NEW.id -- the one we just shipped counts as shipped
|
|
76
|
+
);
|
|
77
|
+
END IF;
|
|
78
|
+
RETURN NEW;
|
|
79
|
+
END;
|
|
80
|
+
$$ LANGUAGE plpgsql;
|
|
81
|
+
|
|
82
|
+
DROP TRIGGER IF EXISTS trg_promote_dependents_on_ship ON tasks;
|
|
83
|
+
CREATE TRIGGER trg_promote_dependents_on_ship
|
|
84
|
+
AFTER UPDATE OF status ON tasks
|
|
85
|
+
FOR EACH ROW
|
|
86
|
+
EXECUTE FUNCTION promote_dependents_on_ship();
|
|
87
|
+
|
|
88
|
+
-- ============================================================================
|
|
89
|
+
-- 3. Bump migration counter
|
|
90
|
+
-- ============================================================================
|
|
91
|
+
UPDATE migration_counter SET next_number = GREATEST(next_number, 21) WHERE id = 1;
|
|
92
|
+
|
|
93
|
+
-- ============================================================================
|
|
94
|
+
-- 4. Record migration
|
|
95
|
+
-- ============================================================================
|
|
96
|
+
INSERT INTO schema_migrations (version) VALUES ('020_task_dependencies')
|
|
97
|
+
ON CONFLICT (version) DO NOTHING;
|
|
98
|
+
|
|
99
|
+
COMMIT;
|