@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,66 @@
|
|
|
1
|
+
-- V3.R14 (#238) — onboarding observability columns on builders.
|
|
2
|
+
--
|
|
3
|
+
-- Two new timestamps on builders so the Archon can see the funnel
|
|
4
|
+
-- (signed in → shipped first task) without crawling credit_log and
|
|
5
|
+
-- session_logs by hand:
|
|
6
|
+
--
|
|
7
|
+
-- 1. onboarded_at — the moment this builder first crossed the gate.
|
|
8
|
+
-- Today that's effectively created_at (first upsert from the
|
|
9
|
+
-- GitHub OAuth callback), but we capture it as a separate column
|
|
10
|
+
-- so we can move the definition later (e.g. "completed the
|
|
11
|
+
-- welcome quest") without rewriting history.
|
|
12
|
+
--
|
|
13
|
+
-- 2. first_ship_at — the moment this builder's first task hit
|
|
14
|
+
-- 'shipped' (auto-merged + deployed). The gap between
|
|
15
|
+
-- onboarded_at and first_ship_at is the *time-to-first-ship* —
|
|
16
|
+
-- the single most useful onboarding metric we don't yet
|
|
17
|
+
-- surface. Archon roster will render TTFS per builder.
|
|
18
|
+
--
|
|
19
|
+
-- Backfill strategy:
|
|
20
|
+
-- - onboarded_at ← created_at (the closest proxy we have).
|
|
21
|
+
-- - first_ship_at ← MIN(t.shipped_at) WHERE t.shipped_by = b.id
|
|
22
|
+
-- across shipped tasks. Builders who haven't shipped stay NULL.
|
|
23
|
+
--
|
|
24
|
+
-- The write-side bump (shipTask in src/bongos/db.js) is responsible for
|
|
25
|
+
-- keeping first_ship_at honest going forward via
|
|
26
|
+
-- `UPDATE builders SET first_ship_at = COALESCE(first_ship_at, now())`.
|
|
27
|
+
|
|
28
|
+
BEGIN;
|
|
29
|
+
|
|
30
|
+
ALTER TABLE builders
|
|
31
|
+
ADD COLUMN IF NOT EXISTS onboarded_at timestamptz,
|
|
32
|
+
ADD COLUMN IF NOT EXISTS first_ship_at timestamptz;
|
|
33
|
+
|
|
34
|
+
-- Backfill onboarded_at from created_at. Idempotent — only fills NULLs,
|
|
35
|
+
-- so re-running this migration after a partial run is safe.
|
|
36
|
+
UPDATE builders
|
|
37
|
+
SET onboarded_at = created_at
|
|
38
|
+
WHERE onboarded_at IS NULL;
|
|
39
|
+
|
|
40
|
+
-- Backfill first_ship_at from the earliest shipped task per builder.
|
|
41
|
+
-- tasks.shipped_by is the canonical author key set by shipTask; tasks
|
|
42
|
+
-- that never reached 'shipped' have shipped_at NULL and are excluded.
|
|
43
|
+
UPDATE builders b
|
|
44
|
+
SET first_ship_at = sub.first_ship_at
|
|
45
|
+
FROM (
|
|
46
|
+
SELECT shipped_by AS builder_id, MIN(shipped_at) AS first_ship_at
|
|
47
|
+
FROM tasks
|
|
48
|
+
WHERE shipped_by IS NOT NULL
|
|
49
|
+
AND shipped_at IS NOT NULL
|
|
50
|
+
GROUP BY shipped_by
|
|
51
|
+
) sub
|
|
52
|
+
WHERE b.id = sub.builder_id
|
|
53
|
+
AND b.first_ship_at IS NULL;
|
|
54
|
+
|
|
55
|
+
-- Cheap roster sort: builders with the longest time-to-first-ship rise
|
|
56
|
+
-- to the top of "still onboarding" queries. Index on (first_ship_at) is
|
|
57
|
+
-- sparse (only ships have non-NULL) but the partial-index covering
|
|
58
|
+
-- still-onboarding rows is what the Archon roster will hit most often.
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_builders_first_ship_at
|
|
60
|
+
ON builders (first_ship_at);
|
|
61
|
+
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_builders_still_onboarding
|
|
63
|
+
ON builders (onboarded_at)
|
|
64
|
+
WHERE first_ship_at IS NULL;
|
|
65
|
+
|
|
66
|
+
COMMIT;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
-- 044_tasks_requires_rank.sql — V3.R82 (#301): per-task minimum rank gate.
|
|
2
|
+
--
|
|
3
|
+
-- Context: V3.R15 (migration 039) added `newcomer_friendly` as the row-level
|
|
4
|
+
-- gate that LETS A XENOS claim a sensitive-by-default task. This migration
|
|
5
|
+
-- adds the INVERSE — a per-task floor that RAISES the minimum required rank
|
|
6
|
+
-- above the default (xenos), so some tasks become Metic-only or Archon-only
|
|
7
|
+
-- because they touch sensitive infra.
|
|
8
|
+
--
|
|
9
|
+
-- The two flags compose without contradiction:
|
|
10
|
+
-- - requires_rank='xenos' — the default; anyone may claim (subject to
|
|
11
|
+
-- the existing xenos sandbox: if the caller
|
|
12
|
+
-- IS a xenos, newcomer_friendly must also
|
|
13
|
+
-- be true. This preserves the V3.R15 rule).
|
|
14
|
+
-- - requires_rank='metic' — at least a Metic may claim. Xenos blocked.
|
|
15
|
+
-- - requires_rank='archon' — only an Archon may claim. Xenos+Metic blocked.
|
|
16
|
+
--
|
|
17
|
+
-- Tier ordering (lowest→highest): xenos < metic < archon. This is the three
|
|
18
|
+
-- LIVE ranks in V3 (ADR 0018); reserved-but-not-live ranks stay out of the
|
|
19
|
+
-- CHECK enum because Lars chose to wire only three for now (#360). When/if
|
|
20
|
+
-- another rank goes live, this CHECK extends in the same migration that wires
|
|
21
|
+
-- the new rank.
|
|
22
|
+
--
|
|
23
|
+
-- View rebuild: claimable_tasks and tasks_session_fit both do SELECT t.*, so
|
|
24
|
+
-- the new column flows through implicitly — but the views must be rebuilt
|
|
25
|
+
-- (DROP+CREATE) because column-list changes require it (same pattern as
|
|
26
|
+
-- migrations 028, 039). View bodies are unchanged.
|
|
27
|
+
--
|
|
28
|
+
-- View-level filter: the per-rank gate is realized in db.js listClaimableTasks
|
|
29
|
+
-- at SELECT time (same pattern as the xenos/newcomer_friendly gate added in
|
|
30
|
+
-- migration 039) — views are builder-agnostic (can't read session context).
|
|
31
|
+
-- Belt-and-braces: db.claimTask + claimTasksBatch re-check at claim time and
|
|
32
|
+
-- throw INSUFFICIENT_RANK (this migration is purely the schema piece; code
|
|
33
|
+
-- changes ship alongside).
|
|
34
|
+
--
|
|
35
|
+
-- Idempotent: safe to re-run.
|
|
36
|
+
|
|
37
|
+
ALTER TABLE tasks
|
|
38
|
+
ADD COLUMN IF NOT EXISTS requires_rank text NOT NULL DEFAULT 'xenos';
|
|
39
|
+
|
|
40
|
+
-- Constrain to the three LIVE ranks. NOT VALID would let bad rows slip in;
|
|
41
|
+
-- the column has a NOT NULL DEFAULT so every existing row is already 'xenos'.
|
|
42
|
+
DO $$
|
|
43
|
+
BEGIN
|
|
44
|
+
IF NOT EXISTS (
|
|
45
|
+
SELECT 1 FROM pg_constraint
|
|
46
|
+
WHERE conname = 'tasks_requires_rank_enum'
|
|
47
|
+
AND conrelid = 'tasks'::regclass
|
|
48
|
+
) THEN
|
|
49
|
+
ALTER TABLE tasks
|
|
50
|
+
ADD CONSTRAINT tasks_requires_rank_enum
|
|
51
|
+
CHECK (requires_rank IN ('xenos', 'metic', 'archon'));
|
|
52
|
+
END IF;
|
|
53
|
+
END $$;
|
|
54
|
+
|
|
55
|
+
-- Rebuild the two SELECT t.* views so the new column flows through. Bodies
|
|
56
|
+
-- identical to migration 039 — only the implicit t.* column list changes.
|
|
57
|
+
|
|
58
|
+
DROP VIEW IF EXISTS claimable_tasks;
|
|
59
|
+
CREATE VIEW claimable_tasks AS
|
|
60
|
+
SELECT t.*,
|
|
61
|
+
pms_calibrated_minutes(t.est_minutes, t.kind) AS est_minutes_calibrated
|
|
62
|
+
FROM tasks t
|
|
63
|
+
WHERE t.status = 'ready'
|
|
64
|
+
AND t.title NOT LIKE '\_\_smoke\_\_%' ESCAPE '\'
|
|
65
|
+
AND NOT EXISTS (
|
|
66
|
+
SELECT 1 FROM task_blockers tb WHERE tb.task_id = t.id
|
|
67
|
+
)
|
|
68
|
+
AND NOT EXISTS (
|
|
69
|
+
SELECT 1 FROM claims c
|
|
70
|
+
JOIN tasks t2 ON t2.id = c.task_id
|
|
71
|
+
WHERE c.released_at IS NULL
|
|
72
|
+
AND t2.touches && t.touches
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
DROP VIEW IF EXISTS tasks_session_fit;
|
|
76
|
+
CREATE VIEW tasks_session_fit AS
|
|
77
|
+
SELECT t.*,
|
|
78
|
+
CASE
|
|
79
|
+
WHEN t.automation_tag = 'overnight-safe' AND COALESCE(t.manual_degree, 5) <= 2
|
|
80
|
+
AND NOT EXISTS (SELECT 1 FROM task_blockers tb WHERE tb.task_id = t.id)
|
|
81
|
+
THEN ARRAY['autonomous','check-in','active']
|
|
82
|
+
WHEN t.automation_tag = 'live-only' OR COALESCE(t.manual_degree, 5) >= 4
|
|
83
|
+
THEN ARRAY['active']
|
|
84
|
+
ELSE ARRAY['check-in','active']
|
|
85
|
+
END AS fits_session_modes,
|
|
86
|
+
pms_calibrated_minutes(t.est_minutes, t.kind) AS est_minutes_calibrated,
|
|
87
|
+
CASE
|
|
88
|
+
WHEN t.credits_reward > 0
|
|
89
|
+
AND pms_calibrated_minutes(t.est_minutes, t.kind) IS NOT NULL
|
|
90
|
+
AND pms_calibrated_minutes(t.est_minutes, t.kind) > 0
|
|
91
|
+
THEN ROUND(t.credits_reward::numeric / pms_calibrated_minutes(t.est_minutes, t.kind), 3)
|
|
92
|
+
ELSE NULL
|
|
93
|
+
END AS credits_per_minute
|
|
94
|
+
FROM tasks t;
|
|
95
|
+
|
|
96
|
+
INSERT INTO schema_migrations (version) VALUES ('044_tasks_requires_rank')
|
|
97
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
-- 045_builder_onboarding_state.sql — V3.R75 (#294): auto-completing onboarding checklist.
|
|
2
|
+
--
|
|
3
|
+
-- #238 (migration 043) gave us the funnel basics: builders.onboarded_at and
|
|
4
|
+
-- builders.first_ship_at, the two single-timestamp shortcuts the Archon roster
|
|
5
|
+
-- already renders. That covers the *start* and *finish* of the funnel but
|
|
6
|
+
-- nothing in between, and it gives the *builder* themselves no way to see
|
|
7
|
+
-- "where am I in onboarding right now?". This migration adds the structured
|
|
8
|
+
-- middle: a small state-machine row per builder that ticks itself off as
|
|
9
|
+
-- events fire (Device Flow done, first /builder-start, first claim, first
|
|
10
|
+
-- ship, first karma vote received, graduated).
|
|
11
|
+
--
|
|
12
|
+
-- Design choices:
|
|
13
|
+
--
|
|
14
|
+
-- * One row per builder (PRIMARY KEY = builder_id). The state is a 1:1
|
|
15
|
+
-- relationship — every builder gets exactly one onboarding journey, and
|
|
16
|
+
-- re-running it has no meaning. Upserts on first hit.
|
|
17
|
+
--
|
|
18
|
+
-- * `current_stage` is the next stage the builder needs to clear. Stays
|
|
19
|
+
-- 'graduated' once they've graduated. completed_stages[] is the audit
|
|
20
|
+
-- trail (what they've already cleared) so the UI can render checkmarks
|
|
21
|
+
-- without inferring from the cached current_stage alone.
|
|
22
|
+
--
|
|
23
|
+
-- * `completed_stages text[]` not `jsonb`: this is a flat append-only set
|
|
24
|
+
-- of stage names. Postgres arrays + the ANY operator are the right shape;
|
|
25
|
+
-- jsonb would be a strictly-worse fit for the set semantics.
|
|
26
|
+
--
|
|
27
|
+
-- * CHECK constraint on `current_stage` against the 7 stages so a code bug
|
|
28
|
+
-- can't smuggle in 'frist_ship'-style typos. completed_stages[] is NOT
|
|
29
|
+
-- CHECK-constrained per element — Postgres can't CHECK array elements
|
|
30
|
+
-- against an enum without a custom domain or a trigger, and the cost
|
|
31
|
+
-- isn't worth the marginal safety. The application layer normalizes
|
|
32
|
+
-- stage names through markStage().
|
|
33
|
+
--
|
|
34
|
+
-- * `started_at` set on first row creation (when auth_complete fires).
|
|
35
|
+
-- `completed_at` set when `current_stage` flips to 'graduated'. The gap
|
|
36
|
+
-- between the two is the time-to-graduate metric (extends time-to-first-
|
|
37
|
+
-- ship from #238 — graduation = first_ship + first_vote_received).
|
|
38
|
+
--
|
|
39
|
+
-- Backfill strategy:
|
|
40
|
+
--
|
|
41
|
+
-- Every existing builder gets a row with completed_stages reconstructed from
|
|
42
|
+
-- the observability columns added in migration 043:
|
|
43
|
+
--
|
|
44
|
+
-- onboarded_at IS NOT NULL → auth_complete cleared
|
|
45
|
+
-- first_ship_at IS NOT NULL → first_claim + first_ship cleared
|
|
46
|
+
-- (you can't ship without claiming first, so
|
|
47
|
+
-- first_claim is implied — backfilling both
|
|
48
|
+
-- keeps the checklist coherent)
|
|
49
|
+
--
|
|
50
|
+
-- We can't reconstruct first_start (the GET /tasks/claimable signal) or
|
|
51
|
+
-- first_vote_received (karma_log peer-vote rows) from existing data because
|
|
52
|
+
-- those weren't tracked. Existing builders who have already cleared those
|
|
53
|
+
-- stages WILL re-fire the event the next time they hit the endpoint —
|
|
54
|
+
-- markStage() is idempotent, so the re-fire is a no-op and graduation is
|
|
55
|
+
-- still reachable. primer_read has no historical signal at all and stays
|
|
56
|
+
-- uncleared for everyone until the primer-read route lands (see notes_md on
|
|
57
|
+
-- the issuing task).
|
|
58
|
+
--
|
|
59
|
+
-- current_stage is set to the FIRST stage not yet in completed_stages, with
|
|
60
|
+
-- a graduation-detector that flips to 'graduated' iff all six prior stages
|
|
61
|
+
-- are cleared. The application code maintains the same invariant going
|
|
62
|
+
-- forward.
|
|
63
|
+
--
|
|
64
|
+
-- Idempotent: safe to re-run.
|
|
65
|
+
|
|
66
|
+
BEGIN;
|
|
67
|
+
|
|
68
|
+
CREATE TABLE IF NOT EXISTS builder_onboarding_state (
|
|
69
|
+
builder_id bigint PRIMARY KEY REFERENCES builders(id) ON DELETE CASCADE,
|
|
70
|
+
current_stage text NOT NULL,
|
|
71
|
+
completed_stages text[] NOT NULL DEFAULT '{}'::text[],
|
|
72
|
+
started_at timestamptz NOT NULL DEFAULT now(),
|
|
73
|
+
completed_at timestamptz
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
-- The seven stages. Order matters for current_stage advancement but is
|
|
77
|
+
-- defined in the application layer (src/bongos/onboarding-state.js) — the DB
|
|
78
|
+
-- only validates the enum membership.
|
|
79
|
+
DO $$
|
|
80
|
+
BEGIN
|
|
81
|
+
IF NOT EXISTS (
|
|
82
|
+
SELECT 1 FROM pg_constraint
|
|
83
|
+
WHERE conname = 'builder_onboarding_state_stage_enum'
|
|
84
|
+
AND conrelid = 'builder_onboarding_state'::regclass
|
|
85
|
+
) THEN
|
|
86
|
+
ALTER TABLE builder_onboarding_state
|
|
87
|
+
ADD CONSTRAINT builder_onboarding_state_stage_enum
|
|
88
|
+
CHECK (current_stage IN (
|
|
89
|
+
'auth_complete',
|
|
90
|
+
'primer_read',
|
|
91
|
+
'first_start',
|
|
92
|
+
'first_claim',
|
|
93
|
+
'first_ship',
|
|
94
|
+
'first_vote_received',
|
|
95
|
+
'graduated'
|
|
96
|
+
));
|
|
97
|
+
END IF;
|
|
98
|
+
END $$;
|
|
99
|
+
|
|
100
|
+
-- Sparse index for "still onboarding" queries (completed_at IS NULL) — the
|
|
101
|
+
-- Archon dashboard will hit this frequently to surface in-progress builders.
|
|
102
|
+
CREATE INDEX IF NOT EXISTS idx_builder_onboarding_in_progress
|
|
103
|
+
ON builder_onboarding_state (started_at)
|
|
104
|
+
WHERE completed_at IS NULL;
|
|
105
|
+
|
|
106
|
+
-- ---------------------------------------------------------------------------
|
|
107
|
+
-- Backfill. Inserts one row per builder if missing, with completed_stages[]
|
|
108
|
+
-- reconstructed from the migration 043 observability columns.
|
|
109
|
+
-- ---------------------------------------------------------------------------
|
|
110
|
+
|
|
111
|
+
-- Helper: pick the first uncompleted stage in canonical order, or 'graduated'
|
|
112
|
+
-- if all six are done. Inlined as a CASE in the INSERT below — keeps it one
|
|
113
|
+
-- statement, no PL/pgSQL function needed.
|
|
114
|
+
INSERT INTO builder_onboarding_state (builder_id, current_stage, completed_stages, started_at, completed_at)
|
|
115
|
+
SELECT
|
|
116
|
+
b.id,
|
|
117
|
+
CASE
|
|
118
|
+
WHEN b.onboarded_at IS NULL THEN 'auth_complete'
|
|
119
|
+
-- primer_read has no historical signal — always next-after-auth unless
|
|
120
|
+
-- a later stage is already cleared (in which case the builder has clearly
|
|
121
|
+
-- already moved on, and we don't want to gate them on a backfilled stage
|
|
122
|
+
-- they never saw the prompt for).
|
|
123
|
+
WHEN b.first_ship_at IS NULL THEN 'primer_read'
|
|
124
|
+
-- After first_ship is cleared, the only stage left is first_vote_received.
|
|
125
|
+
ELSE 'first_vote_received'
|
|
126
|
+
END AS current_stage,
|
|
127
|
+
ARRAY(
|
|
128
|
+
SELECT s FROM (VALUES
|
|
129
|
+
('auth_complete', b.onboarded_at IS NOT NULL),
|
|
130
|
+
-- first_claim is implied by first_ship_at (can't ship what you didn't
|
|
131
|
+
-- claim). Backfilling both keeps the checklist coherent for legacy rows.
|
|
132
|
+
('first_claim', b.first_ship_at IS NOT NULL),
|
|
133
|
+
('first_ship', b.first_ship_at IS NOT NULL)
|
|
134
|
+
) AS v(s, cleared)
|
|
135
|
+
WHERE cleared
|
|
136
|
+
) AS completed_stages,
|
|
137
|
+
COALESCE(b.onboarded_at, b.created_at, now()) AS started_at,
|
|
138
|
+
NULL::timestamptz AS completed_at
|
|
139
|
+
FROM builders b
|
|
140
|
+
WHERE NOT EXISTS (
|
|
141
|
+
SELECT 1 FROM builder_onboarding_state s WHERE s.builder_id = b.id
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
INSERT INTO schema_migrations (version) VALUES ('045_builder_onboarding_state')
|
|
145
|
+
ON CONFLICT (version) DO NOTHING;
|
|
146
|
+
|
|
147
|
+
COMMIT;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
-- 046_cost_log_builder_attribution.sql — V3.R11 (#91): per-builder cost attribution.
|
|
2
|
+
--
|
|
3
|
+
-- Background
|
|
4
|
+
-- ----------
|
|
5
|
+
-- Until now, cost_log rows carried no builder identity. Spend was attributable
|
|
6
|
+
-- by task (when task_id was set) and by category, but the dashboard could not
|
|
7
|
+
-- show "who spent what." That was acceptable while a single shared Google AI
|
|
8
|
+
-- Studio key fed every builder's pipeline — there was nobody to attribute *to*.
|
|
9
|
+
--
|
|
10
|
+
-- V3.R11 (#91) flips that: each builder now registers their own Gemini key
|
|
11
|
+
-- during /builder-setup, and the art pipeline knows which builder is making
|
|
12
|
+
-- each call. This migration gives cost_log a place to record it.
|
|
13
|
+
--
|
|
14
|
+
-- Design choices
|
|
15
|
+
-- --------------
|
|
16
|
+
-- * Nullable column. Historical rows pre-date the feature; we must not
|
|
17
|
+
-- invalidate them. New writes are expected to populate it (the route auto-
|
|
18
|
+
-- fills from the authed builder when no body field is provided).
|
|
19
|
+
-- * ON DELETE SET NULL — if a builder row is ever deleted, the cost survives;
|
|
20
|
+
-- it just becomes attributed to "unknown" rather than vanishing.
|
|
21
|
+
-- * Index on (builder_id, recorded_at DESC) for the dashboard's per-builder
|
|
22
|
+
-- timeline query. The leading column is builder_id so the WHERE clause
|
|
23
|
+
-- selects a builder cheaply; the trailing recorded_at DESC matches the
|
|
24
|
+
-- "newest first" sort.
|
|
25
|
+
--
|
|
26
|
+
-- Acceptance
|
|
27
|
+
-- ----------
|
|
28
|
+
-- A fresh builder registering their key, running the art pipeline, and POSTing
|
|
29
|
+
-- to /api/gds/cost has their builder_id stamped onto each row. The public
|
|
30
|
+
-- /cost-summary endpoint exposes a by_builder aggregate that the status page
|
|
31
|
+
-- renders alongside the existing by_category and by_track splits.
|
|
32
|
+
|
|
33
|
+
ALTER TABLE cost_log
|
|
34
|
+
ADD COLUMN IF NOT EXISTS builder_id bigint
|
|
35
|
+
REFERENCES builders(id) ON DELETE SET NULL;
|
|
36
|
+
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_cost_log_builder_recorded
|
|
38
|
+
ON cost_log (builder_id, recorded_at DESC)
|
|
39
|
+
WHERE builder_id IS NOT NULL;
|
|
40
|
+
|
|
41
|
+
INSERT INTO schema_migrations (version) VALUES ('046_cost_log_builder_attribution')
|
|
42
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
-- 054_builder_memory.sql — V3.R54 (#273): server-side store for a builder's
|
|
2
|
+
-- Claude Code per-session memory dir. Implements ADR 0024 §1 (schema) and is
|
|
3
|
+
-- the storage half of §4 (per-builder isolation — enforced at the helper +
|
|
4
|
+
-- route layers, with the PRIMARY KEY making cross-builder collisions
|
|
5
|
+
-- impossible by construction).
|
|
6
|
+
--
|
|
7
|
+
-- What "memory" is here (ADR 0024 "What memory means"):
|
|
8
|
+
-- ----------------------------------------------------
|
|
9
|
+
-- NOT code (git is canonical), NOT work-state (the GDS tables are canonical).
|
|
10
|
+
-- This is the third artifact class: the markdown that Claude Code itself writes
|
|
11
|
+
-- under ~/.claude/projects/<encoded-project>/memory/*.md (MEMORY.md,
|
|
12
|
+
-- feedback_*.md) plus any builder-authored persistent context that isn't a git
|
|
13
|
+
-- file and isn't a GDS row. Today it lives only on one laptop; this table is
|
|
14
|
+
-- where it becomes server-canonical so it can follow a builder across machines
|
|
15
|
+
-- and survive a dead laptop. #274 (push-on-ship) and #275 (pull-on-start) wire
|
|
16
|
+
-- the round-trip; this task only lays the table + the helper layer.
|
|
17
|
+
--
|
|
18
|
+
-- Schema choice — Postgres TEXT, per-file rows (ADR 0024 §1)
|
|
19
|
+
-- ---------------------------------------------------------
|
|
20
|
+
-- The spike weighed BYTEA-per-file vs object storage (DO Spaces / S3) and chose
|
|
21
|
+
-- Postgres TEXT in one new table:
|
|
22
|
+
-- * content is TEXT, not BYTEA — memory files are markdown; being readable in
|
|
23
|
+
-- `psql` for forensics is a real Archon convenience, and the values are
|
|
24
|
+
-- kilobytes.
|
|
25
|
+
-- * Object storage was REJECTED: +$5/mo minimum, +an SDK dependency, +a second
|
|
26
|
+
-- auth surface, +a second backup story — all to solve a problem (large
|
|
27
|
+
-- binary blobs) we don't have. Revisit only if per-file sizes routinely
|
|
28
|
+
-- exceed 100 KB or the table passes ~1 GB and pg_dump time becomes painful.
|
|
29
|
+
-- * git-backed memory was REJECTED: it would leak one builder's memory diffs
|
|
30
|
+
-- into the public repo, contradicting the isolation requirement.
|
|
31
|
+
--
|
|
32
|
+
-- PRIMARY KEY (builder_id, path): one row per (builder, relative-path). `path`
|
|
33
|
+
-- is the path under the builder's memory dir (e.g. 'MEMORY.md',
|
|
34
|
+
-- 'feedback_auth_flows_ui_first.md'). A push for an existing (builder_id, path)
|
|
35
|
+
-- is an UPSERT (last-write-wins per ADR 0024 §3 — applied in #274's push
|
|
36
|
+
-- handler; the table just stores whatever the winning write left).
|
|
37
|
+
--
|
|
38
|
+
-- Quotas (ADR 0024 §1) are enforced at the HELPER layer (src/bongos/memory.js),
|
|
39
|
+
-- not by DB constraints, so the API can return clean 413s with a prune hint:
|
|
40
|
+
-- * 1 MB per file (1000x current observed sizes)
|
|
41
|
+
-- * 50 MB per builder (50,000x current)
|
|
42
|
+
-- * 2000 files per builder (defensive)
|
|
43
|
+
-- byte_len + sha256 are stored so the pull side (#275) can do cheap
|
|
44
|
+
-- newer/changed checks without shipping content, and so the per-builder total
|
|
45
|
+
-- can be summed without scanning content.
|
|
46
|
+
--
|
|
47
|
+
-- Backup (ADR 0024 §5): this is a plain Postgres table, so it rides the GDS
|
|
48
|
+
-- DB's nightly pg_dump (stood up by #412) for free. No separate backup story.
|
|
49
|
+
--
|
|
50
|
+
-- Idempotent: CREATE TABLE IF NOT EXISTS + IF NOT EXISTS indexes + ON CONFLICT
|
|
51
|
+
-- DO NOTHING migration row.
|
|
52
|
+
|
|
53
|
+
CREATE TABLE IF NOT EXISTS builder_memory (
|
|
54
|
+
-- Owner. Every read/write is scoped by this column (ADR 0024 §4). FK so a
|
|
55
|
+
-- row can never reference a ghost builder; ON DELETE CASCADE because a
|
|
56
|
+
-- builder's memory has no meaning once the builder row is gone (unlike
|
|
57
|
+
-- credit_log / cost_log, which preserve history on delete — memory is
|
|
58
|
+
-- mutable scratch, not an audit trail).
|
|
59
|
+
builder_id bigint NOT NULL REFERENCES builders(id) ON DELETE CASCADE,
|
|
60
|
+
-- Relative path under the builder's memory dir, e.g. 'MEMORY.md'. NOT a
|
|
61
|
+
-- filesystem-absolute path — the local checkout path is hyphen-encoded and
|
|
62
|
+
-- machine-specific (ADR 0024 §5 path-encoding gotcha); memory is keyed by
|
|
63
|
+
-- (builder_id, relative-path) so it restores regardless of where on disk a
|
|
64
|
+
-- checkout lives.
|
|
65
|
+
path text NOT NULL CHECK (length(path) > 0),
|
|
66
|
+
-- The file body. TEXT (markdown), not BYTEA — see header.
|
|
67
|
+
content text NOT NULL,
|
|
68
|
+
-- Client's reported mtime of the file at push time. The conflict policy
|
|
69
|
+
-- (ADR 0024 §3) is last-write-wins on the SERVER clock; this column records
|
|
70
|
+
-- the source file's mtime for the pull side's newer-than comparison and for
|
|
71
|
+
-- forensics. Defaults to now() so a row is never left without one.
|
|
72
|
+
mtime timestamptz NOT NULL DEFAULT now(),
|
|
73
|
+
-- Content hash + byte length: let the pull side (#275) detect unchanged files
|
|
74
|
+
-- cheaply and let the helper sum a builder's total bytes without scanning
|
|
75
|
+
-- content.
|
|
76
|
+
sha256 text NOT NULL,
|
|
77
|
+
byte_len integer NOT NULL CHECK (byte_len >= 0),
|
|
78
|
+
-- When this row was first stored / last overwritten on the server. Distinct
|
|
79
|
+
-- from mtime (which is the client file's timestamp). updated_at is the
|
|
80
|
+
-- server's truth for "when did the canonical copy last change."
|
|
81
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
82
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
83
|
+
PRIMARY KEY (builder_id, path)
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
-- Primary access patterns:
|
|
87
|
+
-- * fetch one file: WHERE builder_id = $1 AND path = $2 → served by the PK.
|
|
88
|
+
-- * list / sum for a builder: WHERE builder_id = $1 → served by the PK
|
|
89
|
+
-- prefix, but an explicit index on (builder_id, updated_at DESC) keeps the
|
|
90
|
+
-- "what changed since" pull query (#275) and the "newest first" listing
|
|
91
|
+
-- fast without leaning on PK ordering.
|
|
92
|
+
CREATE INDEX IF NOT EXISTS idx_builder_memory_builder_updated
|
|
93
|
+
ON builder_memory (builder_id, updated_at DESC);
|
|
94
|
+
|
|
95
|
+
-- Auto-bump updated_at on every overwrite. Reuses the same trigger function the
|
|
96
|
+
-- tasks table uses (pms_touch_updated_at, defined in 003_pms.sql) — one
|
|
97
|
+
-- canonical "touch updated_at" function for the whole GDS schema.
|
|
98
|
+
DROP TRIGGER IF EXISTS trg_builder_memory_updated_at ON builder_memory;
|
|
99
|
+
CREATE TRIGGER trg_builder_memory_updated_at
|
|
100
|
+
BEFORE UPDATE ON builder_memory
|
|
101
|
+
FOR EACH ROW EXECUTE FUNCTION pms_touch_updated_at();
|
|
102
|
+
|
|
103
|
+
-- Keep the migration counter ahead of 054 so the next claim that includes
|
|
104
|
+
-- 'migrations/' allocates 055 (same convention as the recent migrations).
|
|
105
|
+
UPDATE migration_counter SET next_number = GREATEST(next_number, 55) WHERE id = 1;
|
|
106
|
+
|
|
107
|
+
INSERT INTO schema_migrations (version) VALUES ('054_builder_memory')
|
|
108
|
+
ON CONFLICT (version) DO NOTHING;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
-- 055_task_criteria.sql — #435: structured criterion↔task link.
|
|
2
|
+
--
|
|
3
|
+
-- WHY THIS EXISTS
|
|
4
|
+
-- ---------------
|
|
5
|
+
-- Before this table, the only record of "which tasks satisfy criterion C8"
|
|
6
|
+
-- lived as prose in each task's description (`**Criterion:** C8 — …`).
|
|
7
|
+
-- Answering "what's left for C8?" therefore meant grepping seed-v3-tasks.js,
|
|
8
|
+
-- eyeballing a "Gates V3.R55–V3.R63" sentence, then re-querying every task's
|
|
9
|
+
-- status by hand (~10 calls). This makes the relation a first-class, queryable
|
|
10
|
+
-- thing so GET /api/gds/versions/:id/progress (and the /status skill) can roll
|
|
11
|
+
-- it up in one call. See ADR 0025.
|
|
12
|
+
--
|
|
13
|
+
-- WHY MANY-TO-MANY (and not a column on tasks)
|
|
14
|
+
-- --------------------------------------------
|
|
15
|
+
-- done_when_criteria.satisfied_by_task_id already exists, but it is the SINGLE,
|
|
16
|
+
-- REVERSE link: the one ship-task that *closed* a criterion. We need the
|
|
17
|
+
-- forward, MANY link: the many tasks that *gate*/contribute to a criterion
|
|
18
|
+
-- (C8 ← R55–R63). Tasks also contribute to multiple criteria (prose like
|
|
19
|
+
-- "C2, C7"), so the relation is many-to-many → a join table is the only honest
|
|
20
|
+
-- shape. (ADR 0025 records the rejected alternatives.)
|
|
21
|
+
--
|
|
22
|
+
-- THE BACKFILL IS POSITIONAL — and that is exactly the fragility we're retiring
|
|
23
|
+
-- -----------------------------------------------------------------------------
|
|
24
|
+
-- The prose says "C8" but a criterion's criterion_id is a semantic slug
|
|
25
|
+
-- (`cloneable-local-memory-server-sync`). "Cn" is the 1-based position by
|
|
26
|
+
-- (sort_order, criterion_id) within the version: C1 = onboarding-2h, …,
|
|
27
|
+
-- C8 = cloneable-local-memory-server-sync. So the backfill ranks each version's
|
|
28
|
+
-- criteria with ROW_NUMBER() and joins prose "Cn" → the n-th criterion of the
|
|
29
|
+
-- SAME version. A task listing "C2, C7" yields two rows.
|
|
30
|
+
--
|
|
31
|
+
-- This positional decode is brittle (reorder the criteria and old prose drifts),
|
|
32
|
+
-- which is the whole reason this table exists: from here on the structured link
|
|
33
|
+
-- is canonical and new tasks should populate task_criteria directly (follow-up
|
|
34
|
+
-- task: wire task-create + a manage endpoint). This is a ONE-TIME historical
|
|
35
|
+
-- backfill of the prose that existed at migration time — it is not re-run.
|
|
36
|
+
--
|
|
37
|
+
-- Tasks whose Criterion line has no "Cn" token (e.g. "cross-cutting (identity)",
|
|
38
|
+
-- "the proof Tier 1 is done") are intentionally left unlinked; /progress counts
|
|
39
|
+
-- them as unattributed rather than guessing.
|
|
40
|
+
|
|
41
|
+
BEGIN;
|
|
42
|
+
|
|
43
|
+
CREATE TABLE IF NOT EXISTS task_criteria (
|
|
44
|
+
task_id bigint NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
45
|
+
criterion_id bigint NOT NULL REFERENCES done_when_criteria(id) ON DELETE CASCADE,
|
|
46
|
+
source text NOT NULL DEFAULT 'backfill', -- 'backfill' | 'manual' | 'planning'
|
|
47
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
48
|
+
PRIMARY KEY (task_id, criterion_id)
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_task_criteria_criterion ON task_criteria (criterion_id);
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_task_criteria_task ON task_criteria (task_id);
|
|
53
|
+
|
|
54
|
+
-- One-time positional backfill from the **Criterion:** Cn prose.
|
|
55
|
+
WITH crit_line AS (
|
|
56
|
+
-- The text of the Criterion line only (so we never pick up a stray "Cn"
|
|
57
|
+
-- elsewhere in the body). regexp_match (singular) → first occurrence.
|
|
58
|
+
SELECT id AS task_id,
|
|
59
|
+
version_id,
|
|
60
|
+
(regexp_match(description, '\*\*Criterion:\*\*\s*([^\r\n]*)'))[1] AS line
|
|
61
|
+
FROM tasks
|
|
62
|
+
WHERE description ~ '\*\*Criterion:\*\*'
|
|
63
|
+
),
|
|
64
|
+
crit_nums AS (
|
|
65
|
+
-- Every "Cn" token on that line → one (task, n) pair. 'g' flag handles
|
|
66
|
+
-- multi-criterion tasks ("C2, C7").
|
|
67
|
+
SELECT task_id,
|
|
68
|
+
version_id,
|
|
69
|
+
(regexp_matches(line, 'C([0-9]+)', 'g'))[1]::int AS cnum
|
|
70
|
+
FROM crit_line
|
|
71
|
+
WHERE line IS NOT NULL AND line <> ''
|
|
72
|
+
),
|
|
73
|
+
ranked AS (
|
|
74
|
+
-- Live 1-based position per version — same ordering listCriteria() uses.
|
|
75
|
+
SELECT id AS criterion_id,
|
|
76
|
+
version_id,
|
|
77
|
+
ROW_NUMBER() OVER (PARTITION BY version_id ORDER BY sort_order, criterion_id) AS cnum
|
|
78
|
+
FROM done_when_criteria
|
|
79
|
+
)
|
|
80
|
+
INSERT INTO task_criteria (task_id, criterion_id, source)
|
|
81
|
+
SELECT cn.task_id, r.criterion_id, 'backfill'
|
|
82
|
+
FROM crit_nums cn
|
|
83
|
+
JOIN ranked r
|
|
84
|
+
ON r.version_id = cn.version_id
|
|
85
|
+
AND r.cnum = cn.cnum
|
|
86
|
+
ON CONFLICT DO NOTHING;
|
|
87
|
+
|
|
88
|
+
INSERT INTO schema_migrations (version) VALUES ('055_task_criteria') ON CONFLICT DO NOTHING;
|
|
89
|
+
|
|
90
|
+
COMMIT;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
-- V3.R25 (#245) — builder-on-builder peer votes on confirmed/shipped work.
|
|
2
|
+
--
|
|
3
|
+
-- Criterion C2 (karma signal sourcing): karma (migration 040) needs a
|
|
4
|
+
-- continuous peer input. Every confirmed/shipped task can be voted on by other
|
|
5
|
+
-- Metic+ builders: +1 = good work, -1 = concerns. A weekly tally folds the net
|
|
6
|
+
-- votes into karma_log rows for the SHIPPING builder.
|
|
7
|
+
--
|
|
8
|
+
-- Anti-retaliation by design — two guards:
|
|
9
|
+
-- 1. Anti-self-vote: enforced in the route (a CHECK can't see tasks.shipped_by
|
|
10
|
+
-- from here). 403 if voter == task.shipped_by.
|
|
11
|
+
-- 2. 7-day karma lag: the weekly tally only folds votes that are ≥ 7 days old
|
|
12
|
+
-- (recorded_at <= now() - 7d). A vote cast today can't move karma until
|
|
13
|
+
-- next week, so retaliation cycles have no immediate payoff. tallied_at
|
|
14
|
+
-- marks a vote as already folded so it's never double-counted; once a vote
|
|
15
|
+
-- is tallied it's frozen (the route refuses to change it).
|
|
16
|
+
--
|
|
17
|
+
-- Feeds R26 (#246) which surfaces karma on the profile + leaderboard.
|
|
18
|
+
|
|
19
|
+
CREATE TABLE IF NOT EXISTS peer_votes (
|
|
20
|
+
id bigserial PRIMARY KEY,
|
|
21
|
+
voter_builder_id bigint NOT NULL REFERENCES builders(id),
|
|
22
|
+
target_task_id bigint NOT NULL REFERENCES tasks(id),
|
|
23
|
+
vote integer NOT NULL CHECK (vote IN (-1, 1)), -- 0 = cleared = row deleted
|
|
24
|
+
recorded_at timestamptz NOT NULL DEFAULT now(),
|
|
25
|
+
tallied_at timestamptz, -- NULL = not yet folded into karma; set by the weekly tally
|
|
26
|
+
UNIQUE (voter_builder_id, target_task_id)
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
-- Net-votes-per-task read (feed + single task display).
|
|
30
|
+
CREATE INDEX IF NOT EXISTS idx_peer_votes_target ON peer_votes (target_task_id);
|
|
31
|
+
-- Weekly tally hot path: matured, not-yet-folded votes.
|
|
32
|
+
CREATE INDEX IF NOT EXISTS idx_peer_votes_untallied ON peer_votes (recorded_at) WHERE tallied_at IS NULL;
|
|
33
|
+
|
|
34
|
+
-- Supports the acclaim feed (GET /tasks/peer-votes/feed): a partial, functional
|
|
35
|
+
-- index whose predicate matches the feed's WHERE (confirmed/shipped, attributed)
|
|
36
|
+
-- and whose ordering matches its sort — COALESCE(shipped_at, updated_at) DESC —
|
|
37
|
+
-- so the feed reads the top rows from the index instead of scanning + sorting
|
|
38
|
+
-- every historical task. Without it, cost grows linearly with project history.
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_votable_recent
|
|
40
|
+
ON tasks ((COALESCE(shipped_at, updated_at)) DESC)
|
|
41
|
+
WHERE status IN ('confirmed', 'shipped') AND shipped_by IS NOT NULL;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
-- 059_onboarding_pick_disciplines.sql — 2026-05-30: reshape the onboarding path.
|
|
2
|
+
--
|
|
3
|
+
-- Two changes to the onboarding state machine that migration 045 established:
|
|
4
|
+
--
|
|
5
|
+
-- 1. Remove 'first_vote_received'. Gating graduation on a peer upvote is too
|
|
6
|
+
-- much to ask of a brand-new builder — they can graduate before anyone
|
|
7
|
+
-- has had a chance to vote on their work. The stage is dropped from the
|
|
8
|
+
-- allowed-stage set.
|
|
9
|
+
--
|
|
10
|
+
-- 2. Add 'pick_disciplines'. New builders now choose the kind of work they
|
|
11
|
+
-- want (creative / engineering / both) as an explicit onboarding step,
|
|
12
|
+
-- wired to the existing builders.preferred_disciplines column (migration
|
|
13
|
+
-- 027). The application layer (src/bongos/onboarding-state.js STAGES) places
|
|
14
|
+
-- it after 'primer_read' and before 'first_start' so the choice is made
|
|
15
|
+
-- before the builder surveys the works on offer.
|
|
16
|
+
--
|
|
17
|
+
-- The DB only validates enum membership of current_stage; ordering lives in
|
|
18
|
+
-- the app layer. So this migration just swaps the CHECK constraint's allowed
|
|
19
|
+
-- set and re-homes any rows currently parked at the removed stage.
|
|
20
|
+
--
|
|
21
|
+
-- Grandfathering: a builder sitting at current_stage='first_vote_received' has
|
|
22
|
+
-- already cleared every stage that mattered in the old model (auth → ship).
|
|
23
|
+
-- Rather than re-prompt them through the reshaped path, we promote them
|
|
24
|
+
-- straight to 'graduated' and stamp completed_at. completed_stages[] is an
|
|
25
|
+
-- audit array (not CHECK-constrained per element), so the lingering
|
|
26
|
+
-- 'first_vote_received' entry there is harmless and left as-is.
|
|
27
|
+
--
|
|
28
|
+
-- Idempotent: safe to re-run.
|
|
29
|
+
|
|
30
|
+
BEGIN;
|
|
31
|
+
|
|
32
|
+
-- 1. Re-home rows parked at the removed stage BEFORE swapping the constraint,
|
|
33
|
+
-- or the new CHECK would reject them.
|
|
34
|
+
UPDATE builder_onboarding_state
|
|
35
|
+
SET current_stage = 'graduated',
|
|
36
|
+
completed_at = COALESCE(completed_at, now())
|
|
37
|
+
WHERE current_stage = 'first_vote_received';
|
|
38
|
+
|
|
39
|
+
-- 2. Swap the stage enum: drop the old constraint (if present) and add the new
|
|
40
|
+
-- one. Names match migration 045 so re-running is clean.
|
|
41
|
+
ALTER TABLE builder_onboarding_state
|
|
42
|
+
DROP CONSTRAINT IF EXISTS builder_onboarding_state_stage_enum;
|
|
43
|
+
|
|
44
|
+
ALTER TABLE builder_onboarding_state
|
|
45
|
+
ADD CONSTRAINT builder_onboarding_state_stage_enum
|
|
46
|
+
CHECK (current_stage IN (
|
|
47
|
+
'auth_complete',
|
|
48
|
+
'primer_read',
|
|
49
|
+
'pick_disciplines',
|
|
50
|
+
'first_start',
|
|
51
|
+
'first_claim',
|
|
52
|
+
'first_ship',
|
|
53
|
+
'graduated'
|
|
54
|
+
));
|
|
55
|
+
|
|
56
|
+
INSERT INTO schema_migrations (version) VALUES ('059_onboarding_pick_disciplines')
|
|
57
|
+
ON CONFLICT (version) DO NOTHING;
|
|
58
|
+
|
|
59
|
+
COMMIT;
|