@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,512 @@
|
|
|
1
|
+
// Heuristic classifier for tasks.kind.
|
|
2
|
+
//
|
|
3
|
+
// Returns one of:
|
|
4
|
+
// feature, bug, infra, refactor, spike, learning-capture,
|
|
5
|
+
// cleanup, decision, blocker-resolution, unclassified
|
|
6
|
+
//
|
|
7
|
+
// Strategy:
|
|
8
|
+
// 1. If description carries a structured "KIND: <x>" tag near the top,
|
|
9
|
+
// trust it (confidence 0.95).
|
|
10
|
+
// 2. Otherwise regex-score over title + description. Highest score wins.
|
|
11
|
+
// 3. If no rule matches, return 'feature' (the optimistic default) at
|
|
12
|
+
// confidence 0.5 — POST /tasks treats < 0.5 as unclassified.
|
|
13
|
+
|
|
14
|
+
const VALID_KINDS = new Set([
|
|
15
|
+
'feature',
|
|
16
|
+
'bug',
|
|
17
|
+
'infra',
|
|
18
|
+
'refactor',
|
|
19
|
+
'spike',
|
|
20
|
+
'learning-capture',
|
|
21
|
+
'cleanup',
|
|
22
|
+
'decision',
|
|
23
|
+
'blocker-resolution',
|
|
24
|
+
// task 1053 (F): a task whose deliverable IS a verification (e.g. a hardware-
|
|
25
|
+
// verify run). Confirming one requires an explicit `verified` attestation that
|
|
26
|
+
// the verification actually passed — not just a passing code grade — so it
|
|
27
|
+
// can't be prematurely confirmed (the #1027 trap). Deliberately NOT auto-
|
|
28
|
+
// classified from title text (a task ABOUT verify tasks would false-positive);
|
|
29
|
+
// a planner opts in by setting kind='verify' (or a `KIND: verify` tag).
|
|
30
|
+
'verify',
|
|
31
|
+
'unclassified',
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
// Order matters: first match wins per category, but we score across all
|
|
35
|
+
// categories and pick the strongest signal.
|
|
36
|
+
const RULES = [
|
|
37
|
+
{ kind: 'bug', re: /\b(fix|bug|broken|regression|hotfix|crash)\b/i, weight: 0.85 },
|
|
38
|
+
{ kind: 'refactor', re: /\b(refactor|rename|restructure|extract)\b/i, weight: 0.8 },
|
|
39
|
+
{ kind: 'cleanup', re: /\b(cleanup|clean ?up|dead code|tidy|prune|remove unused)\b/i, weight: 0.8 },
|
|
40
|
+
{ kind: 'infra', re: /\b(schema|migration|deploy|deployment|infra|cron|systemd|caddy|nginx)\b/i, weight: 0.85 },
|
|
41
|
+
{ kind: 'spike', re: /\b(spike|investigate|research|RFC|prototype|explore)\b/i, weight: 0.8 },
|
|
42
|
+
{ kind: 'learning-capture', re: /\b(learning|gotcha|lesson|postmortem|retrospective)\b/i, weight: 0.9 },
|
|
43
|
+
{ kind: 'decision', re: /\b(decision|ADR|rationale|architecture decision)\b/i, weight: 0.9 },
|
|
44
|
+
{ kind: 'blocker-resolution', re: /\b(unblock|credentials|api key|access)\b/i, weight: 0.85 },
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
// Instance-specific external-vendor names (a payment processor, a fulfillment
|
|
48
|
+
// partner, …) are ALSO a blocker-resolution signal — but they are NOT core
|
|
49
|
+
// vocabulary, since a vanilla Cloud Bongos instance integrates no such vendors.
|
|
50
|
+
// R59 (task 1198) moves them out of the core rule above and into per-instance
|
|
51
|
+
// branding config (branding.vocab.blockerVendors); OTB's config supplies
|
|
52
|
+
// ["hermeslines","stripe"]. buildBlockerVendorRe is pure (testable with no I/O);
|
|
53
|
+
// the resolved RegExp is cached, and resolution fails to "no vendors" so tooling
|
|
54
|
+
// or tests that load no branding simply get the core rule.
|
|
55
|
+
function buildBlockerVendorRe(vendors) {
|
|
56
|
+
if (!Array.isArray(vendors) || vendors.length === 0) return null;
|
|
57
|
+
const alt = vendors
|
|
58
|
+
.filter((v) => typeof v === 'string' && v.trim())
|
|
59
|
+
.map((v) => v.trim().replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))
|
|
60
|
+
.join('|');
|
|
61
|
+
return alt ? new RegExp(`\\b(${alt})\\b`, 'i') : null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let _blockerVendorRe; // undefined = unresolved; null = none for this instance
|
|
65
|
+
function blockerVendorRule() {
|
|
66
|
+
if (_blockerVendorRe === undefined) {
|
|
67
|
+
_blockerVendorRe = null;
|
|
68
|
+
try {
|
|
69
|
+
_blockerVendorRe = buildBlockerVendorRe(require('../../src/module-api').branding().vocab?.blockerVendors);
|
|
70
|
+
} catch { /* no branding (tooling/test) → no instance vendors */ }
|
|
71
|
+
}
|
|
72
|
+
return _blockerVendorRe;
|
|
73
|
+
}
|
|
74
|
+
const _resetVendorCacheForTests = () => { _blockerVendorRe = undefined; };
|
|
75
|
+
|
|
76
|
+
function extractKindTag(description) {
|
|
77
|
+
if (!description) return null;
|
|
78
|
+
// Match "KIND: <word>" within the first 400 chars; case-insensitive.
|
|
79
|
+
const head = String(description).slice(0, 400);
|
|
80
|
+
const m = head.match(/^\s*KIND\s*:\s*([a-z\-]+)/im);
|
|
81
|
+
if (!m) return null;
|
|
82
|
+
const tag = m[1].toLowerCase().trim();
|
|
83
|
+
if (VALID_KINDS.has(tag) && tag !== 'unclassified') return tag;
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function classifyTaskKind(title, description) {
|
|
88
|
+
const text = `${title || ''} ${description || ''}`;
|
|
89
|
+
|
|
90
|
+
// 1. Structured tag wins.
|
|
91
|
+
const tagged = extractKindTag(description);
|
|
92
|
+
if (tagged) return { kind: tagged, confidence: 0.95 };
|
|
93
|
+
|
|
94
|
+
// 2. Regex scoring.
|
|
95
|
+
let best = null;
|
|
96
|
+
for (const rule of RULES) {
|
|
97
|
+
if (rule.re.test(text)) {
|
|
98
|
+
if (!best || rule.weight > best.confidence) {
|
|
99
|
+
best = { kind: rule.kind, confidence: rule.weight };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Instance vendor names also signal blocker-resolution (R59 — config, not core).
|
|
104
|
+
const vendorRe = blockerVendorRule();
|
|
105
|
+
if (vendorRe && vendorRe.test(text)) {
|
|
106
|
+
if (!best || 0.85 > best.confidence) best = { kind: 'blocker-resolution', confidence: 0.85 };
|
|
107
|
+
}
|
|
108
|
+
if (best) return best;
|
|
109
|
+
|
|
110
|
+
// 3. Optimistic default at boundary confidence — caller treats <0.5 as
|
|
111
|
+
// 'unclassified' so we sit it right at 0.5 to bias toward 'feature'
|
|
112
|
+
// when text gave us nothing.
|
|
113
|
+
return { kind: 'feature', confidence: 0.5 };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// -------------------------------------------------------------------------
|
|
117
|
+
// Discipline classifier
|
|
118
|
+
// -------------------------------------------------------------------------
|
|
119
|
+
//
|
|
120
|
+
// Orthogonal to kind. Classifies the builder-interest axis (migration 086):
|
|
121
|
+
// engineer — the prompter is reasoning about algorithms, infra, data
|
|
122
|
+
// plumbing, dev tooling, scanners, schemas, integrations.
|
|
123
|
+
// The person guiding the prompt brings software-engineering
|
|
124
|
+
// experience.
|
|
125
|
+
// artist — producing or shipping visual artifacts: sprite/tile
|
|
126
|
+
// generation, palettes, walk animations, aesthetic passes.
|
|
127
|
+
// ideator — thinking/writing/scoping: quest narrative, world/level
|
|
128
|
+
// design, lore, briefs, research, naming.
|
|
129
|
+
// unclassified — signals weak or balanced; hand-triage.
|
|
130
|
+
//
|
|
131
|
+
// The scoring engine first decides engineer-vs-creative; a creative verdict
|
|
132
|
+
// is then split into artist/ideator by splitCreativeDiscipline().
|
|
133
|
+
//
|
|
134
|
+
// Calibrated against Lars's hand-classifications of 25 tasks (mig 014
|
|
135
|
+
// backfill, 2026-05-12). Key insights from those decisions:
|
|
136
|
+
// - Title text matters more than description text. A creative-leaning
|
|
137
|
+
// description ("iterating on art changes") inside an otherwise
|
|
138
|
+
// engineering title ("Dev shortcut: Shift+R") shouldn't tip the result.
|
|
139
|
+
// - Tools that OPERATE ON art (renderers, validators, anti-grid eval,
|
|
140
|
+
// content-hash atlas, walkability BFS) are engineering — the prompter
|
|
141
|
+
// reasons about algorithms, not about how a sprite should look.
|
|
142
|
+
// - Producing or shipping visual artifacts (tilesheet deploy, world PNG
|
|
143
|
+
// snapshot, status page redesign, sprite family migration) is creative —
|
|
144
|
+
// even when the verb sounds infra ("deploy", "push").
|
|
145
|
+
// - Bug fixes, doc rewrites, integrations, achievement evaluators land as
|
|
146
|
+
// engineering regardless of which domain they bug-fix or document.
|
|
147
|
+
//
|
|
148
|
+
// Scoring model: title text + (description text × 0.4) + touches[] hits,
|
|
149
|
+
// summed and capped. The 0.4 description weight is what stops incidental
|
|
150
|
+
// creative phrasing in long descriptions from flipping engineering tasks.
|
|
151
|
+
|
|
152
|
+
// Migration 086 split the old "creative" lane into 'artist' (visual asset
|
|
153
|
+
// production) and 'ideator' (thinking/writing/scoping) and renamed
|
|
154
|
+
// 'engineering' → 'engineer'. The binary scoring engine below still decides
|
|
155
|
+
// engineer-vs-creative; a creative verdict is then disambiguated into
|
|
156
|
+
// artist/ideator/ui by splitCreativeDiscipline(). When that split is unclear,
|
|
157
|
+
// it returns 'unclassified' (hand-triage) — matching the #615 backfill rule.
|
|
158
|
+
//
|
|
159
|
+
// Migration 176 (task 1376) added 'ui' — UI/interface DESIGN work (Figma,
|
|
160
|
+
// Claude-Design, design systems, layout/wireframes). It splits out of the
|
|
161
|
+
// pixel-art `artist` lane (ADR 0079): producing interface designs is a
|
|
162
|
+
// distinct discipline from producing pixel-art assets, and routes to its own
|
|
163
|
+
// /design work-mode (discipline-modes.json) instead of /paint.
|
|
164
|
+
const VALID_DISCIPLINES = new Set(['engineer', 'artist', 'ideator', 'ui', 'unclassified']);
|
|
165
|
+
|
|
166
|
+
// Numeric field bounds for task creation (POST /tasks). The single source of
|
|
167
|
+
// truth: the route schema in routes/tasks.js references these so the validator
|
|
168
|
+
// and the claim-time context pack (V4.R04 / sessions-start-knowing) can never
|
|
169
|
+
// drift apart. `priority` mirrors the DB CHECK exactly — `tasks_priority_check`
|
|
170
|
+
// (priority BETWEEN 1 AND 5, migrations/003_pms.sql) — so a value the validator
|
|
171
|
+
// accepts is one the INSERT accepts. (It used to be a laxer 0–100, which let a
|
|
172
|
+
// value like 40 pass validation only to fail the DB CHECK with an opaque
|
|
173
|
+
// `create_failed` constraint-violation message, and taught the context pack the
|
|
174
|
+
// wrong range — task 1233.) `convention` is retained so the pack can surface the
|
|
175
|
+
// human-facing "use P1–P5 tiers" label alongside the accepted range.
|
|
176
|
+
const TASK_FIELD_BOUNDS = {
|
|
177
|
+
priority: { min: 1, max: 5, convention: { min: 1, max: 5, label: 'P1–P5 planning tiers' } },
|
|
178
|
+
manual_degree: { min: 0, max: 5 },
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// Task statuses that can receive peer-acclaim votes (a work must be at least
|
|
182
|
+
// verified). Canonical home here so routes/tasks.js and discord-reaction.js
|
|
183
|
+
// (the vote → applause Discord mirror) share one definition (D1).
|
|
184
|
+
const VOTABLE_TASK_STATUSES = new Set(['confirmed', 'shipped']);
|
|
185
|
+
|
|
186
|
+
// Disambiguation signals for the creative lane (migration 086). Visual
|
|
187
|
+
// art-production cues → artist; narrative / design-thinking / writing cues →
|
|
188
|
+
// ideator. Scored by distinct-rule hit count over title+description, plus
|
|
189
|
+
// touches[] path prefixes; the stronger side wins, ties / no-signal fall to
|
|
190
|
+
// 'unclassified' for hand-triage.
|
|
191
|
+
const ARTIST_SIGNALS = [
|
|
192
|
+
/\bpixel[-\s]?art\b/i,
|
|
193
|
+
/\btile-?sheets?\b/i,
|
|
194
|
+
/\b(sprites?|spritesheet|atlas|autotile)\b/i,
|
|
195
|
+
/\b(palettes?|paint(ing)?|illustrations?|hue\b|color\s+profile)\b/i,
|
|
196
|
+
/\b(walk\s+(animation|cycle|frames?)|animation\s+frames?)\b/i,
|
|
197
|
+
/\b(visual\s+redesign|aesthetic\s+pass|regen(erate)?\b)\b/i,
|
|
198
|
+
];
|
|
199
|
+
const IDEATOR_SIGNALS = [
|
|
200
|
+
/\b(quest|narrative|story|dialog(ue)?|NPC|lore)\b/i,
|
|
201
|
+
/\b(scene|level|world|map)\s+design\b/i,
|
|
202
|
+
/\b(style\s+guide|rubric|reviewer)\b/i,
|
|
203
|
+
/\b(scope|scoping|research|brief|naming|writing|feedback|observation|taxonomy)\b/i,
|
|
204
|
+
];
|
|
205
|
+
// UI/interface DESIGN signals (mig 176 / task 1376). Distinct from pixel-art
|
|
206
|
+
// `artist` work: this is interface layout, wireframes, design systems, and the
|
|
207
|
+
// Figma / Claude-Design tooling used to produce them. Figma is a UI-design cue
|
|
208
|
+
// (it moved here from ARTIST_SIGNALS), so a "Figma redesign of the hall" lands
|
|
209
|
+
// as `ui`, not `artist`.
|
|
210
|
+
const UI_SIGNALS = [
|
|
211
|
+
/\b(UI|UX)\b/,
|
|
212
|
+
/\b(user\s+(interface|experience)|interface\s+design)\b/i,
|
|
213
|
+
/\b(figma|claude[-\s]?design|design\s+system|design\s+token|wireframes?|mock-?ups?|prototyp(e|ing))\b/i,
|
|
214
|
+
/\b(layout|landing\s+page|component\s+library|responsive|css\s+(redesign|theme)|theming)\b/i,
|
|
215
|
+
];
|
|
216
|
+
const ARTIST_PATH_PREFIXES = [
|
|
217
|
+
'modules/art-pipeline/template/',
|
|
218
|
+
'modules/art-pipeline/iterations/_families/',
|
|
219
|
+
'modules/art-pipeline/iterations/_autotile/',
|
|
220
|
+
'modules/art-pipeline/generated/',
|
|
221
|
+
'modules/art-pipeline/references/',
|
|
222
|
+
'public/assets/tiles/',
|
|
223
|
+
'public/assets/sprites/',
|
|
224
|
+
'docs/recipes/pixel-art',
|
|
225
|
+
];
|
|
226
|
+
const IDEATOR_PATH_PREFIXES = ['docs/', 'limitations/', 'generative-ideas'];
|
|
227
|
+
// UI-design touches (mig 176 / task 1376): the front-end surfaces a UI-design
|
|
228
|
+
// task edits. The status/hall UIs and the game's HTML/CSS chrome are where
|
|
229
|
+
// interface-design work lands.
|
|
230
|
+
const UI_PATH_PREFIXES = [
|
|
231
|
+
'modules/status-ui/',
|
|
232
|
+
'modules/hall-ui/',
|
|
233
|
+
'public/game/ui/',
|
|
234
|
+
'docs/design/',
|
|
235
|
+
];
|
|
236
|
+
|
|
237
|
+
// Split a 'creative' verdict into 'artist' | 'ideator' | 'ui' | 'unclassified'.
|
|
238
|
+
// Three sub-lanes are scored by distinct-rule hit count + touches[] hits; the
|
|
239
|
+
// strongest single lane wins. A tie at the top (including 0-0-0) → hand-triage.
|
|
240
|
+
function splitCreativeDiscipline(title, description, touches) {
|
|
241
|
+
const text = `${title || ''} ${description || ''}`;
|
|
242
|
+
const artist = ARTIST_SIGNALS.filter((re) => re.test(text)).length
|
|
243
|
+
+ countTouchesHits(touches, ARTIST_PATH_PREFIXES);
|
|
244
|
+
const ideator = IDEATOR_SIGNALS.filter((re) => re.test(text)).length
|
|
245
|
+
+ countTouchesHits(touches, IDEATOR_PATH_PREFIXES);
|
|
246
|
+
const ui = UI_SIGNALS.filter((re) => re.test(text)).length
|
|
247
|
+
+ countTouchesHits(touches, UI_PATH_PREFIXES);
|
|
248
|
+
const ranked = [
|
|
249
|
+
{ d: 'artist', n: artist },
|
|
250
|
+
{ d: 'ideator', n: ideator },
|
|
251
|
+
{ d: 'ui', n: ui },
|
|
252
|
+
].sort((a, b) => b.n - a.n);
|
|
253
|
+
// No signal anywhere, or the top two are tied → hand-triage.
|
|
254
|
+
if (ranked[0].n === 0 || ranked[0].n === ranked[1].n) return 'unclassified';
|
|
255
|
+
return ranked[0].d;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Title/description text rules. Many of these are deliberately specific
|
|
259
|
+
// (e.g. "world snapshot", "family migration") — pure single-word keywords
|
|
260
|
+
// like "art" are too noisy to ever be a reliable signal.
|
|
261
|
+
const CREATIVE_TEXT_RULES = [
|
|
262
|
+
// Naming a visual artifact being produced or shipped.
|
|
263
|
+
{ re: /\b(art\s+completion|asset\s+completion|art\s+done)\b/i, weight: 0.85 },
|
|
264
|
+
{ re: /\b(generated\s+(tile|sprite|atlas)|deploy\s+art|push\s+(tile|sprite)sheet|ship\s+art)\b/i,weight: 0.85 },
|
|
265
|
+
{ re: /\b(daily\s+PNG|world\s+snapshot|snapshot\s+pipeline|world\s+screenshot)\b/i, weight: 0.85 },
|
|
266
|
+
{ re: /\b(visual\s+redesign|senate-library|themed\s+redesign|aesthetic\s+pass)\b/i, weight: 0.85 },
|
|
267
|
+
// Higher weight so "family migration" (asset re-generation) beats the
|
|
268
|
+
// generic eng "migration" keyword on the same word.
|
|
269
|
+
{ re: /\b(family\s+migration|(sprite|character|player)\s+family|4[-\s]direction\s+family)\b/i, weight: 0.95 },
|
|
270
|
+
{ re: /\b(autotile\s+family|family\s+pipeline|spritesheet)\b/i, weight: 0.75 },
|
|
271
|
+
{ re: /\b(regen(erate)?\b|color\s+profile|hue\s+gate)\b/i, weight: 0.75 },
|
|
272
|
+
{ re: /\b(pixel\s*art|pixel-art|tilesheet|tile-?sheets?)\b/i, weight: 0.7 },
|
|
273
|
+
// Generic terms — lower weight, lots of overlap with engineering.
|
|
274
|
+
// Plural variants matter ("8 sprites, single family" in walk-anim titles).
|
|
275
|
+
{ re: /\b(sprites?|palettes?|paint(ing)?|illustrations?)\b/i, weight: 0.6 },
|
|
276
|
+
// Walk-cycle / animation frame work — character sprite generation.
|
|
277
|
+
{ re: /\b(walk\s+animation|animation\s+frames?|walk\s+(cycle|frames?))\b/i, weight: 0.75 },
|
|
278
|
+
{ re: /\b(quest|narrative|story|dialog(ue)?|NPC)\b/i, weight: 0.65 },
|
|
279
|
+
{ re: /\b(scene\s+design|level\s+design|world\s+design|map\s+design)\b/i, weight: 0.75 },
|
|
280
|
+
{ re: /\b(rubric(?!\s+(fixture|test))|style\s+guide|reviewer)\b/i, weight: 0.65 },
|
|
281
|
+
{ re: /\b(figma|design\s+template|design\s+system|design\s+token)\b/i, weight: 0.6 },
|
|
282
|
+
// UI/interface DESIGN cues (mig 176 / task 1376) — route the creative verdict
|
|
283
|
+
// to the `ui` sub-lane via splitCreativeDiscipline. Kept here (not engineering)
|
|
284
|
+
// so "UI redesign of the hall" / "wireframe the checkout" land creative-first;
|
|
285
|
+
// splitCreativeDiscipline then picks `ui` over `artist`/`ideator`.
|
|
286
|
+
{ re: /\b(UI|UX)\s+(design|redesign|pass|polish|refresh|overhaul)\b/i, weight: 0.8 },
|
|
287
|
+
{ re: /\b(user\s+(interface|experience)|interface\s+design|wireframes?|mock-?ups?)\b/i, weight: 0.8 },
|
|
288
|
+
{ re: /\b(figma|claude[-\s]?design)\b.*\b(redesign|design|layout|screen|mock-?up|wireframe)\b/i, weight: 0.8 },
|
|
289
|
+
];
|
|
290
|
+
|
|
291
|
+
const ENGINEERING_TEXT_RULES = [
|
|
292
|
+
// Algorithm / data-structure work on art (the "tools that operate on art"
|
|
293
|
+
// bucket — these match in art-pipeline tasks and should beat creative
|
|
294
|
+
// path signals from the same task).
|
|
295
|
+
{ re: /\b(renderer|compositor|rasterizer)\b/i, weight: 0.85 },
|
|
296
|
+
{ re: /\b(BFS|DFS|FFT|autocorrelation|algorithm(?:ic)?|connectivity(?:\s+check)?)\b/i, weight: 0.85 },
|
|
297
|
+
{ re: /\b(harness|fixtures?|test\s+suite|evaluator|validator|regression\s+test)\b/i, weight: 0.75 },
|
|
298
|
+
{ re: /\b(edge[-\s]variant|seam[-\s]compat|boundary\s+(tile|match))\b/i, weight: 0.7 },
|
|
299
|
+
{ re: /\b(inventory\s+index|searchable\s+metadata|index\s+(es|ed|file)|lookup)\b/i, weight: 0.7 },
|
|
300
|
+
{ re: /\b(CLI(?:\b|\s)|entry\s+point|command[-\s]line\b)/i, weight: 0.7 },
|
|
301
|
+
// Tool-noun pattern (Lars's heuristic: "who's prompting?"). Words like
|
|
302
|
+
// "scorer", "packer", "loader" name a tool the engineer builds — even
|
|
303
|
+
// when the tool operates on visual assets. These OUT-rank generic
|
|
304
|
+
// creative keywords ("sprite", "tile") in the same title.
|
|
305
|
+
{ re: /\b(scorer|packer|loader|detector|inspector|profiler|sweeper)\b/i, weight: 0.8 },
|
|
306
|
+
{ re: /\b((generator|loader|packer|scorer|detector)\s+module|biome\s+generator|AI\s+(generator|biome))\b/i, weight: 0.85 },
|
|
307
|
+
{ re: /\b(perceptual\s+hash|hash\s+diff|score\s+delta|auto[-\s]revert|regression\s+detection)\b/i, weight: 0.85 },
|
|
308
|
+
// Building rubric / gate machinery (vs. running it to make art).
|
|
309
|
+
// Split into separate rules so a title with two of these phrases (e.g.
|
|
310
|
+
// "rubric criterion + hue-range gate") scores ENGINEERING twice.
|
|
311
|
+
{ re: /\b(rubric\s+(criterion|gate|rule))\b/i, weight: 0.85 },
|
|
312
|
+
{ re: /\b(enforcement\s+(audit|gate)|rule\s+enforcement)\b/i, weight: 0.8 },
|
|
313
|
+
{ re: /\b(hue[-\s]range\s+gates?|color\s+profile\s+(gates?|checks?))\b/i, weight: 0.8 },
|
|
314
|
+
// Image-processing standardization is engineering.
|
|
315
|
+
{ re: /\b(BG\s+keying|background\s+keying|magenta[-\s]key(?:ing)?|key(?:ing)?\s+(standardization|fix|bug))\b/i, weight: 0.85 },
|
|
316
|
+
// Asset wiring / pipeline plumbing.
|
|
317
|
+
{ re: /\b(wire(?:d|s)?\s+\S+\s+(?:into|up|in)\b|atlas\s+(pack(?:er)?|loader)|phaser\s+(loader|atlas))\b/i, weight: 0.8 },
|
|
318
|
+
// Game-engine + framework names — mentioning Phaser / Colyseus / Express
|
|
319
|
+
// is a strong engineering signal regardless of surrounding art vocabulary.
|
|
320
|
+
{ re: /\b(Phaser|Colyseus|Express(?:\.js)?|systemd|sharp|Chart\.js)\b/i, weight: 0.8 },
|
|
321
|
+
{ re: /\b(directory\s+restructure|asset\s+(directory|naming)|naming\s+standardization)\b/i, weight: 0.75 },
|
|
322
|
+
{ re: /\b(retry\s+loop|retry\s+chain|screenshot\s+(scorer|regression|check))\b/i, weight: 0.75 },
|
|
323
|
+
// Status-page / dashboard content is engineering doc work, not art.
|
|
324
|
+
{ re: /\b(version\s+block|page\s+description|status\s+page|paint[-\s]the[-\s]picture)\b/i, weight: 0.7 },
|
|
325
|
+
// Architecture / dispatch terms.
|
|
326
|
+
{ re: /\b(dispatch|object\s+overlay|overlays?(?:\s+(architecture|dispatch|system))?|ADR\b)\b/i, weight: 0.7 },
|
|
327
|
+
// Canvas / image-data bug-fix vocabulary.
|
|
328
|
+
{ re: /\b(canvas|key\s+mismatch|opaque\s+(tile|background|pixel)|RGBA?\b|transparency)\b/i, weight: 0.65 },
|
|
329
|
+
// Data audit / dedup / canonicalization.
|
|
330
|
+
{ re: /\b(audit\b(?!\s+(routine|cadence))|de[-\s]?dup(?:e|licate|lication)?|canonical(?:ize)?|schema\s+(audit|cleanup))\b/i, weight: 0.7 },
|
|
331
|
+
// Infra / dev tooling.
|
|
332
|
+
{ re: /\b(content[-\s]hash|cloudflare|cache(?:\s+bust|[-\s]bust|d|s)?|TTL|atlas\.json)\b/i, weight: 0.75 },
|
|
333
|
+
{ re: /\b(dev\s+shortcut|hard[-\s]reload|Shift\+R)\b/i, weight: 0.85 },
|
|
334
|
+
{ re: /\b(migration|schema|postgres|SQL|index|VIEW|trigger|FK|foreign\s+key)\b/i, weight: 0.9 },
|
|
335
|
+
{ re: /\b(API|endpoint|route|HTTP|cookie|auth|session|webhook|broadcast|integration)\b/i, weight: 0.75 },
|
|
336
|
+
{ re: /\b(infra|deploy(?:ment)?|systemd|caddy|nginx|cron|cert|TLS|host\s+routing)\b/i, weight: 0.85 },
|
|
337
|
+
{ re: /\b(scanner|smoke\s+test|preflight|CI|CD)\b/i, weight: 0.75 },
|
|
338
|
+
{ re: /\b(refactor|cleanup|dead\s+code|lint|unused)\b/i, weight: 0.6 },
|
|
339
|
+
// GDS surface — claims, leaderboard, achievements, learnings, backfills.
|
|
340
|
+
{ re: /\b(GDS|claim|claims|builder(?:s)?|leaderboard|achievements?|streak|learnings?)\b/i, weight: 0.75 },
|
|
341
|
+
{ re: /\b(evaluator|backfill|seed|import\s+|reconcile)\b/i, weight: 0.7 },
|
|
342
|
+
// Server / wire protocol.
|
|
343
|
+
{ re: /\b(server|client|websocket|colyseus|protocol|state\s+sync)\b/i, weight: 0.7 },
|
|
344
|
+
{ re: /\b(parser|parse|serialize|encode|decode)\b/i, weight: 0.6 },
|
|
345
|
+
{ re: /\b(scope\s+file|decoder\s+ring|taxonomy|categorization|labeling)\b/i, weight: 0.6 },
|
|
346
|
+
{ re: /\b(merge|rebase|conflict|fast-forward|fast\s+forward)\b/i, weight: 0.55 },
|
|
347
|
+
];
|
|
348
|
+
|
|
349
|
+
// touches[] prefixes that signal one discipline. Note: modules/art-pipeline/ is
|
|
350
|
+
// NOT in CREATIVE_PATH_PREFIXES — that directory holds engineering work on
|
|
351
|
+
// art tools (validators, anti-grid eval, content-hash atlas). The actual
|
|
352
|
+
// creative output lives in modules/art-pipeline/template/, modules/art-pipeline/iterations/_families/,
|
|
353
|
+
// modules/art-pipeline/iterations/_autotile/, modules/art-pipeline/generated/, and public/assets/.
|
|
354
|
+
const CREATIVE_PATH_PREFIXES = [
|
|
355
|
+
'modules/art-pipeline/template/',
|
|
356
|
+
'modules/art-pipeline/iterations/_families/',
|
|
357
|
+
'modules/art-pipeline/iterations/_autotile/',
|
|
358
|
+
'modules/art-pipeline/generated/',
|
|
359
|
+
'modules/art-pipeline/references/',
|
|
360
|
+
'public/assets/tiles/',
|
|
361
|
+
'public/assets/sprites/',
|
|
362
|
+
'docs/recipes/pixel-art',
|
|
363
|
+
];
|
|
364
|
+
|
|
365
|
+
const ENGINEERING_PATH_PREFIXES = [
|
|
366
|
+
'migrations/',
|
|
367
|
+
'src/bongos/',
|
|
368
|
+
'src/db.js',
|
|
369
|
+
'src/seats.js',
|
|
370
|
+
'src/rooms/',
|
|
371
|
+
'src/world/',
|
|
372
|
+
'scripts/gds/',
|
|
373
|
+
'scripts/migrate',
|
|
374
|
+
'scripts/snapshots/',
|
|
375
|
+
'infra/',
|
|
376
|
+
'tests/',
|
|
377
|
+
'server.js',
|
|
378
|
+
'modules/art-pipeline/',
|
|
379
|
+
'.claude/skills/builder-',
|
|
380
|
+
'.claude/skills/merge-',
|
|
381
|
+
'.claude/skills/blocker-',
|
|
382
|
+
'.claude/skills/idea-',
|
|
383
|
+
'.claude/skills/otb-builder-',
|
|
384
|
+
'modules/hall-ui/',
|
|
385
|
+
'modules/status-ui/',
|
|
386
|
+
'public/game/net/',
|
|
387
|
+
'public/game/scenes/',
|
|
388
|
+
'public/game/player/',
|
|
389
|
+
'public/game/npcs/',
|
|
390
|
+
'public/game/ui/',
|
|
391
|
+
'limitations/',
|
|
392
|
+
'docs/adr/',
|
|
393
|
+
'CLAUDE.md',
|
|
394
|
+
];
|
|
395
|
+
|
|
396
|
+
const PATH_HIT_WEIGHT = 0.45;
|
|
397
|
+
const PATH_HIT_CAP = 0.95;
|
|
398
|
+
const DESC_WEIGHT = 0.3;
|
|
399
|
+
// Use 0.05 (not 0.10) so float quirks like 0.75 - 0.65 = 0.0999... don't
|
|
400
|
+
// flip a meaningful asymmetry into a tie.
|
|
401
|
+
const TITLE_DECISIVE_MARGIN = 0.05;
|
|
402
|
+
const PHASE2_MIN_STRENGTH = 0.3;
|
|
403
|
+
const PHASE2_MIN_MARGIN = 0.15;
|
|
404
|
+
|
|
405
|
+
// Returns { max, count } where max is the highest matched rule weight and
|
|
406
|
+
// count is the number of distinct rules that fired.
|
|
407
|
+
//
|
|
408
|
+
// Lars's heuristic ("who's prompting?") asks for the strongest single
|
|
409
|
+
// signal in the title. We use `max` as the primary decision input, with
|
|
410
|
+
// `count` as a tiebreaker when both sides have a single strong match
|
|
411
|
+
// (e.g. "Push generated tilesheet to droplet (deploy art)" — both sides
|
|
412
|
+
// max at 0.85, but creative has 3 distinct rule hits vs eng's 1).
|
|
413
|
+
function scoreText(text, rules) {
|
|
414
|
+
if (!text) return { max: 0, count: 0 };
|
|
415
|
+
let max = 0;
|
|
416
|
+
let count = 0;
|
|
417
|
+
for (const rule of rules) {
|
|
418
|
+
if (rule.re.test(text)) {
|
|
419
|
+
count++;
|
|
420
|
+
if (rule.weight > max) max = rule.weight;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return { max, count };
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
function countTouchesHits(touches, prefixes) {
|
|
427
|
+
if (!Array.isArray(touches) || touches.length === 0) return 0;
|
|
428
|
+
let hits = 0;
|
|
429
|
+
for (const t of touches) {
|
|
430
|
+
if (typeof t !== 'string') continue;
|
|
431
|
+
if (prefixes.some((p) => t.startsWith(p))) hits++;
|
|
432
|
+
}
|
|
433
|
+
return hits;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
function scoreTouches(touches, prefixes) {
|
|
437
|
+
const hits = countTouchesHits(touches, prefixes);
|
|
438
|
+
if (hits === 0) return 0;
|
|
439
|
+
return Math.min(PATH_HIT_CAP, hits * PATH_HIT_WEIGHT);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
function classifyTaskDiscipline(title, description, touches) {
|
|
443
|
+
const titleText = title || '';
|
|
444
|
+
const descText = description || '';
|
|
445
|
+
|
|
446
|
+
// Phase 1 — title-first decision via three progressive tiebreakers:
|
|
447
|
+
// (a) max-rule-weight — strongest single signal wins if margin ≥ 0.04
|
|
448
|
+
// (b) match-count — more distinct rule hits wins if margin ≥ 2
|
|
449
|
+
// (c) touches hit-count — more path-prefix hits wins if margin ≥ 2
|
|
450
|
+
// Falls to phase 2 only if max-weight signal is too weak to act on.
|
|
451
|
+
const cT = scoreText(titleText, CREATIVE_TEXT_RULES);
|
|
452
|
+
const eT = scoreText(titleText, ENGINEERING_TEXT_RULES);
|
|
453
|
+
|
|
454
|
+
if (Math.max(cT.max, eT.max) >= 0.5) {
|
|
455
|
+
// (a) Max-weight margin — use 0.04 to absorb float quirks like
|
|
456
|
+
// 0.95 - 0.9 = 0.04999999999999993.
|
|
457
|
+
if (Math.abs(cT.max - eT.max) >= 0.04) {
|
|
458
|
+
if (cT.max > eT.max) {
|
|
459
|
+
const d = splitCreativeDiscipline(titleText, descText, touches);
|
|
460
|
+
return { discipline: d, confidence: d === 'unclassified' ? 0 : cT.max };
|
|
461
|
+
}
|
|
462
|
+
return { discipline: 'engineer', confidence: eT.max };
|
|
463
|
+
}
|
|
464
|
+
// (b) Same max-weight (e.g. both 0.85). Combine title-rule count and
|
|
465
|
+
// touches[] hit count into a single asymmetry score — a side that
|
|
466
|
+
// dominates both surfaces wins even if neither margin is decisive
|
|
467
|
+
// alone (e.g. #5: 2-vs-1 rule hits AND 1-vs-0 path hits → creative).
|
|
468
|
+
const cHits = countTouchesHits(touches, CREATIVE_PATH_PREFIXES);
|
|
469
|
+
const eHits = countTouchesHits(touches, ENGINEERING_PATH_PREFIXES);
|
|
470
|
+
const cAsym = (cT.count - eT.count) + (cHits - eHits);
|
|
471
|
+
if (Math.abs(cAsym) >= 2) {
|
|
472
|
+
if (cAsym > 0) {
|
|
473
|
+
const d = splitCreativeDiscipline(titleText, descText, touches);
|
|
474
|
+
return { discipline: d, confidence: d === 'unclassified' ? 0 : 0.6 + Math.min(0.3, cAsym * 0.05) };
|
|
475
|
+
}
|
|
476
|
+
return { discipline: 'engineer', confidence: 0.6 + Math.min(0.3, -cAsym * 0.05) };
|
|
477
|
+
}
|
|
478
|
+
return { discipline: 'unclassified', confidence: 0 };
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
// Phase 2 — title was weak. Pull in description + touches.
|
|
482
|
+
const cDescR = scoreText(descText, CREATIVE_TEXT_RULES);
|
|
483
|
+
const eDescR = scoreText(descText, ENGINEERING_TEXT_RULES);
|
|
484
|
+
const cPath = scoreTouches(touches, CREATIVE_PATH_PREFIXES);
|
|
485
|
+
const ePath = scoreTouches(touches, ENGINEERING_PATH_PREFIXES);
|
|
486
|
+
|
|
487
|
+
const creative = Math.min(1.0, cT.max + cDescR.max * DESC_WEIGHT + cPath * 0.7);
|
|
488
|
+
const engineering = Math.min(1.0, eT.max + eDescR.max * DESC_WEIGHT + ePath * 0.7);
|
|
489
|
+
|
|
490
|
+
if (Math.max(creative, engineering) < PHASE2_MIN_STRENGTH) {
|
|
491
|
+
return { discipline: 'unclassified', confidence: 0 };
|
|
492
|
+
}
|
|
493
|
+
if (Math.abs(creative - engineering) < PHASE2_MIN_MARGIN) {
|
|
494
|
+
return { discipline: 'unclassified', confidence: 0 };
|
|
495
|
+
}
|
|
496
|
+
if (creative > engineering) {
|
|
497
|
+
const d = splitCreativeDiscipline(titleText, descText, touches);
|
|
498
|
+
return { discipline: d, confidence: d === 'unclassified' ? 0 : creative };
|
|
499
|
+
}
|
|
500
|
+
return { discipline: 'engineer', confidence: engineering };
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
module.exports = {
|
|
504
|
+
classifyTaskKind,
|
|
505
|
+
classifyTaskDiscipline,
|
|
506
|
+
buildBlockerVendorRe,
|
|
507
|
+
_resetVendorCacheForTests,
|
|
508
|
+
VALID_KINDS,
|
|
509
|
+
VALID_DISCIPLINES,
|
|
510
|
+
VOTABLE_TASK_STATUSES,
|
|
511
|
+
TASK_FIELD_BOUNDS,
|
|
512
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// GDS version-close gate logic (PMS-V2 task #42, bucket E2).
|
|
2
|
+
//
|
|
3
|
+
// A version is "ready to close" iff BOTH:
|
|
4
|
+
// (a) version_progress.percent_complete >= 80
|
|
5
|
+
// (b) every done_when_criteria row for the version is satisfied
|
|
6
|
+
// Both required, per Lars's planning decision (limitations/pms-v2.md
|
|
7
|
+
// "Open questions resolved" — Auto-versioning gate).
|
|
8
|
+
//
|
|
9
|
+
// This module ONLY evaluates the gate and prepares a suggestion. It does
|
|
10
|
+
// not close anything. Operator action lives in /builder-version-close
|
|
11
|
+
// (separate task #43).
|
|
12
|
+
|
|
13
|
+
const { pool } = require('../../src/module-api');
|
|
14
|
+
|
|
15
|
+
const PERCENT_GATE = 80;
|
|
16
|
+
|
|
17
|
+
async function getProgressRow(versionId) {
|
|
18
|
+
const { rows } = await pool.query(
|
|
19
|
+
`SELECT shipped_count, total_count, shipped_weight, total_weight
|
|
20
|
+
FROM version_progress
|
|
21
|
+
WHERE version_id = $1`,
|
|
22
|
+
[versionId]
|
|
23
|
+
);
|
|
24
|
+
if (rows.length === 0) return null;
|
|
25
|
+
const r = rows[0];
|
|
26
|
+
const total = Number(r.total_weight);
|
|
27
|
+
const shipped = Number(r.shipped_weight);
|
|
28
|
+
return {
|
|
29
|
+
shippedCount: Number(r.shipped_count),
|
|
30
|
+
totalCount: Number(r.total_count),
|
|
31
|
+
percentComplete: total > 0 ? Math.round((shipped / total) * 100) : 0,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function getCriteriaCounts(versionId) {
|
|
36
|
+
const { rows } = await pool.query(
|
|
37
|
+
`SELECT count(*) FILTER (WHERE satisfied) AS satisfied,
|
|
38
|
+
count(*) AS total
|
|
39
|
+
FROM done_when_criteria
|
|
40
|
+
WHERE version_id = $1`,
|
|
41
|
+
[versionId]
|
|
42
|
+
);
|
|
43
|
+
return {
|
|
44
|
+
satisfied: Number(rows[0].satisfied),
|
|
45
|
+
total: Number(rows[0].total),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function getCarryOverCount(versionId) {
|
|
50
|
+
// Mirrors the version_progress filter (migration 017): abandoned is a
|
|
51
|
+
// terminal state, not carry-over. Counting it would re-introduce the same
|
|
52
|
+
// overcounting the view fixes.
|
|
53
|
+
const { rows } = await pool.query(
|
|
54
|
+
`SELECT count(*) AS n
|
|
55
|
+
FROM tasks
|
|
56
|
+
WHERE version_id = $1
|
|
57
|
+
AND status NOT IN ('shipped', 'abandoned')
|
|
58
|
+
AND title NOT LIKE '\\_\\_smoke\\_\\_%' ESCAPE '\\'`,
|
|
59
|
+
[versionId]
|
|
60
|
+
);
|
|
61
|
+
return Number(rows[0].n);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Rich object for the close-flow planner. Always returns the same shape
|
|
65
|
+
// even when nothing matches, so callers can render the same template.
|
|
66
|
+
async function suggestClose(versionId) {
|
|
67
|
+
const progress = (await getProgressRow(versionId)) || {
|
|
68
|
+
shippedCount: 0,
|
|
69
|
+
totalCount: 0,
|
|
70
|
+
percentComplete: 0,
|
|
71
|
+
};
|
|
72
|
+
const criteria = await getCriteriaCounts(versionId);
|
|
73
|
+
const carryOver = await getCarryOverCount(versionId);
|
|
74
|
+
const ready =
|
|
75
|
+
progress.percentComplete >= PERCENT_GATE &&
|
|
76
|
+
criteria.total > 0 &&
|
|
77
|
+
criteria.satisfied === criteria.total;
|
|
78
|
+
return {
|
|
79
|
+
versionId,
|
|
80
|
+
percentComplete: progress.percentComplete,
|
|
81
|
+
criteriaTotal: criteria.total,
|
|
82
|
+
criteriaSatisfied: criteria.satisfied,
|
|
83
|
+
tasksShipped: progress.shippedCount,
|
|
84
|
+
tasksCarryOver: carryOver,
|
|
85
|
+
ready,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Suggestions for every version still in 'building' status.
|
|
90
|
+
// Used by GET /api/gds/versions/close-suggestions and by /builder-start.
|
|
91
|
+
async function getCloseSuggestionsForBuildingVersions() {
|
|
92
|
+
const { rows: versions } = await pool.query(
|
|
93
|
+
`SELECT id FROM versions WHERE status = 'building' ORDER BY started_at, id`
|
|
94
|
+
);
|
|
95
|
+
const out = [];
|
|
96
|
+
for (const v of versions) {
|
|
97
|
+
out.push(await suggestClose(v.id));
|
|
98
|
+
}
|
|
99
|
+
return out;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
module.exports = {
|
|
103
|
+
PERCENT_GATE,
|
|
104
|
+
suggestClose,
|
|
105
|
+
getCloseSuggestionsForBuildingVersions,
|
|
106
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# `memory` module — builder memory, recall/search, learnings
|
|
2
|
+
|
|
3
|
+
> The **first CORE-domain** carved into a module (BV1.R72, [ADR 0091](../../docs/adr/<redacted>.md) §2) — not an optional feature like dev-box/discord/art/game, but a core methodology domain extracted to prove the kernel↔core-domain boundary. It is the reference every later core-domain carve (grading R73, …) copies.
|
|
4
|
+
|
|
5
|
+
Owns per-builder session **memory** (the BFG-scoped store the hall syncs), the lexical **recall/search** retrieval layer ([ADR 0060](../../docs/adr/0060-gds-retrieval-layer.md): Postgres FTS + trigram/RRF), and durable **learnings**. `default: true` in `module.json` — the build system's memory ships to **every** instance (unlike the default-off feature modules), so it mounts unconditionally unless an instance explicitly disables it.
|
|
6
|
+
|
|
7
|
+
## The boundary (the one rule)
|
|
8
|
+
|
|
9
|
+
This module reaches core **only** through the published doorway `../../src/module-api.js` (`coreVersion ^1.5.0`). It must **never** `require()` a core internal (`../../src/bongos/db`, `../../src/bongos/auth`, `../../src/bongos/pool`, …) directly, and never another module. Core, in turn, must never `require()` a file in here — the route mounts left `src/bongos/routes.js`; `moduleLoader.mountModuleRoutes` discovers + mounts them now. Both directions are enforced by the BV1.R44/R45 fitness checks; R70's `kernel-imports-no-domain` check additionally keeps the kernel from reaching back in.
|
|
10
|
+
|
|
11
|
+
## Files
|
|
12
|
+
|
|
13
|
+
| File | What |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `memory.js` | per-builder memory store (quotas, BFG namespace, store/fetch/list). Manages its own transactions via the doorway `pool`. |
|
|
16
|
+
| `search.js` | the recall query engine — FTS + trigram, RRF fusion, rank-scoped (ADR 0060). |
|
|
17
|
+
| `search-chunker.js` | pure markdown→chunk splitter (no DB). Also used by the `search-ingest-*` CLIs (memory-owned scripts). |
|
|
18
|
+
| `learnings.js` | durable paid-once knowledge capture (the `learnings` table). |
|
|
19
|
+
| `routes/memory.js` | `/memory/*` — sync/read/forensic. Carries its own larger `express.json` for `/memory/sync` (1 MB batches); core `routes.js` still skips the global parser for that path. |
|
|
20
|
+
| `routes/search.js` | `/search` (recall) + `/search/mark` (the ADR 0095 C3 usefulness vote — `POST {chunk_id, useful?}`, session-scoped). |
|
|
21
|
+
| `routes/learnings.js` | `/learnings` (POST capture + GET). |
|
|
22
|
+
|
|
23
|
+
All four lib files reach Postgres through the doorway `pool`; the routes reach auth gates + the kernel db helpers (`getBuilderById`, `insertAuditLog`) + the shared request validators (`validateOrRespond`/`LIMITS`) off the doorway `api`, and the lib files via intra-module relative requires.
|
|
24
|
+
|
|
25
|
+
## Tables (owned, not moved)
|
|
26
|
+
|
|
27
|
+
`builder_memory`, `memory_search_chunks`, `learnings` (+ their migrations) were created before the module system and stay in core `migrations/` (the schema-migrations stem-key makes a later relocation a no-op). The module owns the *queries*; any **new** memory migration belongs in `modules/memory/migrations/` namespaced `memory_*` (the additive rule).
|
|
28
|
+
|
|
29
|
+
## Seams
|
|
30
|
+
|
|
31
|
+
None yet — memory neither provides nor consumes a port/event. Core reads memory only through its HTTP routes (the hall's sync/recall), never a direct import.
|
|
32
|
+
|
|
33
|
+
## NOT in this module
|
|
34
|
+
|
|
35
|
+
- **`bfg.js`** — the BFG memory-hygiene evaluator stays core (it scores memory quality across builders); it touches memory through the routes/store contract, not a sibling import.
|
|
36
|
+
- **`migrations/`** — the memory tables' creating migrations stay in core `migrations/` (pre-module-system; see Tables above).
|
|
37
|
+
|
|
38
|
+
## Tests
|
|
39
|
+
|
|
40
|
+
`tests/memory_isolation.mjs`, `tests/bfg*.mjs`, `tests/search_*.mjs`, `tests/search_chunker.mjs`, `tests/diff_derived_signals.mjs`, `tests/recall_*.mjs` import from `modules/memory/…`. The ADR 0095 C3 mark/rank loop's DB-backed cases live in the `tests/search_isolation.mjs` Layer C class (integration gate); the pure ranker-factor + scope logic is exercised by the in-module assertions in `markChunkUsefulness`.
|