@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,243 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# scripts/gds/audit-authorship.sh — V3.R12 (#236).
|
|
3
|
+
#
|
|
4
|
+
# Audits the repo for hardcoded references to the original Archon's identity
|
|
5
|
+
# in IMPLEMENTATION code. The point: a second builder's commits, scripts,
|
|
6
|
+
# error messages, and skill outputs must NOT silently impersonate or
|
|
7
|
+
# hardcode-credit the founding builder.
|
|
8
|
+
#
|
|
9
|
+
# What counts as a violation here:
|
|
10
|
+
# * `/Users/larskristensen/...` paths in code or skill instructions.
|
|
11
|
+
# (Use `$HOME` / `os.path.expanduser('~')` instead.)
|
|
12
|
+
# * `builder_id = 1` / `shipped_by = 1` hardcodes in code paths that run
|
|
13
|
+
# during a builder's session. (Use `req.builder.id` / the active claim.)
|
|
14
|
+
# * `lars589` / `larskristensen` literals in setup-path code or test data
|
|
15
|
+
# that would mis-attribute a second builder's work.
|
|
16
|
+
#
|
|
17
|
+
# What is INTENTIONAL and allow-listed (NOT a violation):
|
|
18
|
+
# * Archived shipping docs in `limitations/*-shipped.md` — historical record.
|
|
19
|
+
# * ADRs, session logs, and the chat-broadcast plan — historical / decision
|
|
20
|
+
# records that name the founder by intent.
|
|
21
|
+
# * `CLAUDE.md` — §2 is explicitly about working with Lars as the prompter
|
|
22
|
+
# and project owner; that framing IS the point.
|
|
23
|
+
# * Droplet operational identity (`User=lars`, `lars@104.236.254.243`,
|
|
24
|
+
# `/home/lars/amazonprimea`, `lars@hermeslines.com`) — that's the actual
|
|
25
|
+
# unix user / SSH target / ACME contact on the production server. It's
|
|
26
|
+
# infra config, not impersonation of a builder identity.
|
|
27
|
+
# * The seed script that ORIGINALLY created the V3 tasks
|
|
28
|
+
# (`scripts/gds/seed-v3-tasks.js`) — a frozen migration-style snapshot.
|
|
29
|
+
# Names appear in task descriptions by historical necessity.
|
|
30
|
+
# (The earlier `seed-v2-tasks.js` + `import-backlog.js` seeds were
|
|
31
|
+
# deleted as dead code in task 1079.)
|
|
32
|
+
# * Self-references in this audit script and in the V3.R09 / V3.R12 task
|
|
33
|
+
# descriptions captured in `seed-v3-tasks.js`.
|
|
34
|
+
# * GitHub remote `lars589/amazonprimea` — actual repo owner; cloning
|
|
35
|
+
# anything else would clone a different project.
|
|
36
|
+
# * Comments that document who decided something or who originally ran a
|
|
37
|
+
# one-time backfill — historical decision-attribution.
|
|
38
|
+
#
|
|
39
|
+
# Usage:
|
|
40
|
+
# bash scripts/gds/audit-authorship.sh # check, exit 1 on new hits
|
|
41
|
+
# bash scripts/gds/audit-authorship.sh --verbose # print every hit (incl.
|
|
42
|
+
# # allowlisted) for review
|
|
43
|
+
#
|
|
44
|
+
# Hookable from CI / pre-commit. No writes, no network.
|
|
45
|
+
|
|
46
|
+
set -uo pipefail
|
|
47
|
+
|
|
48
|
+
# Anchor to repo root regardless of where the script was invoked from.
|
|
49
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
50
|
+
cd "$REPO_ROOT"
|
|
51
|
+
|
|
52
|
+
VERBOSE=0
|
|
53
|
+
for arg in "$@"; do
|
|
54
|
+
case "$arg" in
|
|
55
|
+
--verbose|-v) VERBOSE=1 ;;
|
|
56
|
+
-h|--help)
|
|
57
|
+
sed -n '2,50p' "$0" | sed 's/^# \{0,1\}//'
|
|
58
|
+
exit 0
|
|
59
|
+
;;
|
|
60
|
+
esac
|
|
61
|
+
done
|
|
62
|
+
|
|
63
|
+
# Uses plain `grep -RE` so the script runs on any machine — including CI
|
|
64
|
+
# images that don't bundle ripgrep — and on the bare droplet. Exclude paths
|
|
65
|
+
# are passed via the standard --exclude / --exclude-dir flags.
|
|
66
|
+
|
|
67
|
+
# ----------------------------------------------------------------------------
|
|
68
|
+
# 1. Path-exclusion args — paths where hits NEVER count (frozen archives,
|
|
69
|
+
# generated content, dot-git, third-party deps). Filtered at the grep
|
|
70
|
+
# level so they never even enter the candidate set.
|
|
71
|
+
# ----------------------------------------------------------------------------
|
|
72
|
+
EXCLUDE_DIRS=(
|
|
73
|
+
--exclude-dir=node_modules
|
|
74
|
+
--exclude-dir=.git
|
|
75
|
+
--exclude-dir=iterations # under art/, historical cost ledger
|
|
76
|
+
--exclude-dir=generated # under art/, generated PNGs / metadata
|
|
77
|
+
--exclude-dir=docs # human prose: ADRs, recipes, plans,
|
|
78
|
+
# session logs, architecture notes —
|
|
79
|
+
# naming the founder by intent
|
|
80
|
+
--exclude-dir=blockers # blockers ARE the things stuck on Lars
|
|
81
|
+
--exclude-dir=limitations # archives + scope-truth docs
|
|
82
|
+
--exclude-dir=worktrees # .claude/worktrees/ holds N full repo
|
|
83
|
+
# copies (one per builder worktree); from
|
|
84
|
+
# the main checkout, recursing them is slow
|
|
85
|
+
# AND produces 100s of duplicate self-hits
|
|
86
|
+
# (#558). Each worktree audits its own tree.
|
|
87
|
+
)
|
|
88
|
+
EXCLUDE_FILES=(
|
|
89
|
+
--exclude=session-log-archive.md
|
|
90
|
+
--exclude='*-shipped.md' # frozen version archives in limitations/
|
|
91
|
+
--exclude='*.sql' # migrations ran AS lars at migration time
|
|
92
|
+
--exclude=CLAUDE.md # §2 is about the prompter by intent
|
|
93
|
+
--exclude=README.md # README credits / examples
|
|
94
|
+
--exclude=chat-inbox.md # framing references
|
|
95
|
+
--exclude=generative-ideas.md # historical idea capture
|
|
96
|
+
--exclude=.git # in a worktree, .git is a file (gitdir
|
|
97
|
+
# pointer to main repo) — skip it
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# ----------------------------------------------------------------------------
|
|
101
|
+
# 2. The regex — what we're scanning for.
|
|
102
|
+
# Three families:
|
|
103
|
+
# a) /Users/larskristensen/... — runtime hardcoded home-dir paths
|
|
104
|
+
# b) builder_id = 1 / shipped_by = 1 — hardcoded primary key references
|
|
105
|
+
# c) literal lars589 / larskristensen identifiers in code surface
|
|
106
|
+
# ----------------------------------------------------------------------------
|
|
107
|
+
PATTERN='(/Users/larskristensen)|(\bbuilder_id\s*=\s*1\b)|(\bshipped_by\s*=\s*1\b)|(\blars589\b)|(\blarskristensen\b)'
|
|
108
|
+
|
|
109
|
+
# ----------------------------------------------------------------------------
|
|
110
|
+
# 3. The allowlist — file:line tokens where the regex IS expected to match.
|
|
111
|
+
# Each entry is a substring match against "file:line: <captured-text>"
|
|
112
|
+
# style records. Add a new allowlist entry only with a justification
|
|
113
|
+
# comment.
|
|
114
|
+
# ----------------------------------------------------------------------------
|
|
115
|
+
ALLOWLIST=(
|
|
116
|
+
# Frozen seed scripts — the V3 plan literally contains the strings being
|
|
117
|
+
# audited because the task DESCRIPTION (#234/V3.R09 and #236/V3.R12) names
|
|
118
|
+
# them. Stripping them would lose the task history.
|
|
119
|
+
'scripts/gds/seed-v3-tasks.js'
|
|
120
|
+
|
|
121
|
+
# Audit-replay docs the builders table example "1 for lars589" — that's
|
|
122
|
+
# the actual row in the prod DB; renaming the example breaks the doc.
|
|
123
|
+
'scripts/gds/audit-replay.sh'
|
|
124
|
+
|
|
125
|
+
# provision-staging.sh clones the actual GitHub repo owned by lars589.
|
|
126
|
+
# That's the GitHub org/user that owns the repo; not a builder identity.
|
|
127
|
+
'scripts/deploy/provision-staging.sh'
|
|
128
|
+
|
|
129
|
+
# Dev Box app distribution (#904, ADR 0044): the PUBLIC releases repo lives
|
|
130
|
+
# under the same GitHub account that owns the main repo — repo-hosting
|
|
131
|
+
# identity (same nature as provision-staging.sh above), not a builder
|
|
132
|
+
# identity. The test pins the committed config's repo string.
|
|
133
|
+
'config/devbox-app.json'
|
|
134
|
+
'tests/devbox_downloads.mjs'
|
|
135
|
+
|
|
136
|
+
# This audit script's own self-reference (it documents what it's looking for).
|
|
137
|
+
'scripts/gds/audit-authorship.sh'
|
|
138
|
+
|
|
139
|
+
# skill-usage-review explains how Claude Code encodes cwd into the
|
|
140
|
+
# transcripts directory name — explanatory text describing why the glob
|
|
141
|
+
# is now builder-agnostic. Not a runtime hardcode.
|
|
142
|
+
'.claude/scheduled-tasks/skill-usage-review/SKILL.md'
|
|
143
|
+
|
|
144
|
+
# setup_smoke explicitly asserts the ABSENCE of /Users/larskristensen
|
|
145
|
+
# leaks in setup.js — the string appearing in the comment IS the
|
|
146
|
+
# specification of what's forbidden in implementation code.
|
|
147
|
+
'tests/setup_smoke.mjs'
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# ----------------------------------------------------------------------------
|
|
151
|
+
# 4. Operational-identity allowlist — these patterns reference the droplet's
|
|
152
|
+
# unix user / SSH target / ACME contact / cron user / DB role. They are
|
|
153
|
+
# legitimate operational configuration, not impersonation of a builder.
|
|
154
|
+
# ----------------------------------------------------------------------------
|
|
155
|
+
OPS_ALLOWLIST_PATTERN='(^User=lars$|/home/lars/|lars@104\.236\.254\.243|lars@hermeslines\.com|^DROPLET=.*lars@|sudo -u postgres .*-O lars\b|PGUSER=lars\b|createdb -O lars\b|"-U" "?lars"?|-U lars\b|runs as user .lars.|service .* lars\b|cron .*lars\b)'
|
|
156
|
+
|
|
157
|
+
# ----------------------------------------------------------------------------
|
|
158
|
+
# 4b. Spec-string allowlist — content patterns where the literal "lars589"
|
|
159
|
+
# (etc.) appears precisely because it is the THING THE AUDIT FORBIDS,
|
|
160
|
+
# quoted inside a prompt/comment that instructs a reader (human or the LLM
|
|
161
|
+
# grader) to hunt for it. The grader workers' prompts say `Look for literal
|
|
162
|
+
# "lars", "lars589", absolute /Users paths ...` — that's the audit's own
|
|
163
|
+
# specification embedded in a prompt, not a runtime hardcode that
|
|
164
|
+
# mis-attributes a builder. Matched on line content (not file path) so the
|
|
165
|
+
# rest of grader.js stays auditable for a genuine hardcode.
|
|
166
|
+
#
|
|
167
|
+
# The pattern is the FULL exact prompt phrase, not just `Look for literal`,
|
|
168
|
+
# so the suppression can't double as a smuggling channel: a contributor
|
|
169
|
+
# can't sneak a real hardcode past the audit by appending a short comment,
|
|
170
|
+
# because escaping requires reproducing this whole sentence verbatim — at
|
|
171
|
+
# which point the line is self-evidently a prompt-spec, not plausible cover
|
|
172
|
+
# for `builder_id = "lars589"`.
|
|
173
|
+
# ----------------------------------------------------------------------------
|
|
174
|
+
SPEC_ALLOWLIST_PATTERN='[Ll]ook for literal "lars", "lars589", absolute /Users paths'
|
|
175
|
+
|
|
176
|
+
# ----------------------------------------------------------------------------
|
|
177
|
+
# 5. Scan, filter, report.
|
|
178
|
+
# ----------------------------------------------------------------------------
|
|
179
|
+
TMP_RAW="$(mktemp)"
|
|
180
|
+
TMP_HITS="$(mktemp)"
|
|
181
|
+
TMP_FILTERED="$(mktemp)"
|
|
182
|
+
trap 'rm -f "$TMP_RAW" "$TMP_HITS" "$TMP_FILTERED"' EXIT
|
|
183
|
+
|
|
184
|
+
# Walk every file under repo root (excluding the path-level exclusions above).
|
|
185
|
+
# grep -R recurses into hidden subdirs by default (including .claude/, which
|
|
186
|
+
# absolutely DOES need auditing since skill prompts live there). The
|
|
187
|
+
# --exclude-dir entries below cull the dirs we don't care about.
|
|
188
|
+
grep -RIn -E "${EXCLUDE_DIRS[@]}" "${EXCLUDE_FILES[@]}" -e "$PATTERN" . 2>/dev/null \
|
|
189
|
+
| sed 's|^\./||' \
|
|
190
|
+
| sort -u \
|
|
191
|
+
> "$TMP_RAW" || true
|
|
192
|
+
|
|
193
|
+
# Apply file-level allowlist (entry is a path prefix match against "file:" portion).
|
|
194
|
+
ALLOWLIST_RE=''
|
|
195
|
+
for e in "${ALLOWLIST[@]}"; do
|
|
196
|
+
# Escape regex metachars conservatively (just dots — paths only have those).
|
|
197
|
+
esc="${e//./\\.}"
|
|
198
|
+
ALLOWLIST_RE+="^${esc}:|"
|
|
199
|
+
done
|
|
200
|
+
ALLOWLIST_RE="${ALLOWLIST_RE%|}"
|
|
201
|
+
|
|
202
|
+
if [ -n "$ALLOWLIST_RE" ]; then
|
|
203
|
+
grep -vE "$ALLOWLIST_RE" "$TMP_RAW" > "$TMP_HITS" || true
|
|
204
|
+
else
|
|
205
|
+
cp "$TMP_RAW" "$TMP_HITS"
|
|
206
|
+
fi
|
|
207
|
+
|
|
208
|
+
# Apply operational-identity + spec-string pattern allowlists (both match on
|
|
209
|
+
# line content, not file path).
|
|
210
|
+
grep -vE "$OPS_ALLOWLIST_PATTERN" "$TMP_HITS" \
|
|
211
|
+
| grep -vE "$SPEC_ALLOWLIST_PATTERN" > "$TMP_FILTERED" || true
|
|
212
|
+
|
|
213
|
+
HIT_COUNT=$(wc -l < "$TMP_FILTERED" | tr -d ' ')
|
|
214
|
+
|
|
215
|
+
if [ "$VERBOSE" = "1" ]; then
|
|
216
|
+
TOTAL=$(wc -l < "$TMP_RAW" | tr -d ' ')
|
|
217
|
+
AFTER_FILE=$(wc -l < "$TMP_HITS" | tr -d ' ')
|
|
218
|
+
echo "audit-authorship: scan summary"
|
|
219
|
+
echo " raw hits (post path-exclude): $TOTAL"
|
|
220
|
+
echo " after file allowlist: $AFTER_FILE"
|
|
221
|
+
echo " after ops + spec allowlists: $HIT_COUNT"
|
|
222
|
+
echo ""
|
|
223
|
+
fi
|
|
224
|
+
|
|
225
|
+
if [ "$HIT_COUNT" -eq 0 ]; then
|
|
226
|
+
echo "audit-authorship: PASS — no hardcoded Archon-identity references in implementation code."
|
|
227
|
+
exit 0
|
|
228
|
+
fi
|
|
229
|
+
|
|
230
|
+
echo "audit-authorship: FAIL — found $HIT_COUNT hardcoded reference(s) to the original Archon in implementation code."
|
|
231
|
+
echo ""
|
|
232
|
+
echo "Hits:"
|
|
233
|
+
cat "$TMP_FILTERED"
|
|
234
|
+
echo ""
|
|
235
|
+
echo "Remediation:"
|
|
236
|
+
echo " * Paths like /Users/larskristensen/... -> use \$HOME or os.path.expanduser('~')"
|
|
237
|
+
echo " * builder_id = 1 / shipped_by = 1 -> use req.builder.id / the active claim"
|
|
238
|
+
echo " * lars589 / larskristensen literals -> use the current builder's github_login"
|
|
239
|
+
echo ""
|
|
240
|
+
echo "If a hit IS intentional (historical doc, droplet operational identity,"
|
|
241
|
+
echo "or a frozen seed/import script), add it to the ALLOWLIST or"
|
|
242
|
+
echo "OPS_ALLOWLIST_PATTERN in this script with a one-line justification."
|
|
243
|
+
exit 1
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/gds/audit-deps.js — likely-missing-dependency detector (task 349).
|
|
3
|
+
//
|
|
4
|
+
// WHY: an under-specified dependencies[] lets work start before the task it
|
|
5
|
+
// implicitly builds on has shipped, racing already-built work (the original
|
|
6
|
+
// motivation: task 307 was claimable before the rank system it needed had
|
|
7
|
+
// shipped). This surfaces OPEN tasks whose touches[] overlap an UNSHIPPED task
|
|
8
|
+
// they do NOT already depend on — candidate missing edges for a human to triage.
|
|
9
|
+
//
|
|
10
|
+
// THIS IS ADVISORY. Most touches[] overlaps are PARALLEL work on a shared surface
|
|
11
|
+
// (src/bongos/db.js, migrations/, CLAUDE.md, …), NOT a build-order dependency.
|
|
12
|
+
// Backfilling a wrong edge GATES the dependent (POST /claims → 409
|
|
13
|
+
// DEPS_NOT_SHIPPED) until the named blocker ships. So: act only on `high`
|
|
14
|
+
// confidence, by hand, after reading both task descriptions. The detector reuses
|
|
15
|
+
// the ONE canonical overlap matcher (src/bongos/path-match.touchesOverlap) — the
|
|
16
|
+
// same one tests/touches_overlap.mjs covers — so it can't drift from the claim
|
|
17
|
+
// gate's notion of "overlap".
|
|
18
|
+
//
|
|
19
|
+
// node scripts/gds/audit-deps.js [--version GDS-V3] [--min high|medium|low] [--json]
|
|
20
|
+
|
|
21
|
+
const { touchesOverlap } = require('../../src/bongos/path-match.js');
|
|
22
|
+
const { cliClient } = require('./cli-lib');
|
|
23
|
+
|
|
24
|
+
// Lifecycle statuses that count as "open" (auditable) vs "an unshipped blocker".
|
|
25
|
+
const OPEN = new Set(['ready', 'backlog', 'active', 'blocked']);
|
|
26
|
+
const isUnshippedBlocker = (s) => s !== 'shipped' && s !== 'abandoned';
|
|
27
|
+
|
|
28
|
+
// Shared collaboration surfaces: an overlap here is a parallel-safety (touches[])
|
|
29
|
+
// signal, not a dependency. A candidate whose ONLY overlap is one of these (or a
|
|
30
|
+
// bare directory) is demoted to `low`. Deliberately broad; tune as the repo moves.
|
|
31
|
+
const HOTSPOTS = [
|
|
32
|
+
'src/bongos/db.js', 'src/bongos/routes.js', 'server.js', 'migrations/', 'CLAUDE.md',
|
|
33
|
+
'modules/hall-ui/', 'tests/', 'scripts/gds/', 'src/bongos/', 'src/bongos/routes/',
|
|
34
|
+
'scripts/gds/ship.js', 'scripts/gds/api.js', 'scripts/gds/cli-lib.js',
|
|
35
|
+
'modules/grading/grader.js', 'docs/', 'docs/adr/', 'docs/adr/README.md', 'docs/recipes/',
|
|
36
|
+
'docs/architecture.md', 'docs/file-map.md', '.claude/skills/', '.claude/hooks/',
|
|
37
|
+
'infra/', 'public/assets/tiles/',
|
|
38
|
+
];
|
|
39
|
+
const isHotspot = (p) => HOTSPOTS.includes(p);
|
|
40
|
+
|
|
41
|
+
// Confidence heuristic (advisory; a human decides):
|
|
42
|
+
// high — an exact SAME non-hotspot, non-bare-dir FILE both tasks name.
|
|
43
|
+
// medium — a narrow (non-hotspot, non-bare-dir) overlap exists.
|
|
44
|
+
// low — overlap only on a shared hotspot / bare directory.
|
|
45
|
+
function classify(tTouches, oTouches) {
|
|
46
|
+
const pairs = [];
|
|
47
|
+
for (const a of tTouches) for (const b of oTouches) {
|
|
48
|
+
if (touchesOverlap([a], [b])) pairs.push({ a, b, exact: a === b });
|
|
49
|
+
}
|
|
50
|
+
if (!pairs.length) return null;
|
|
51
|
+
const narrow = pairs.filter((p) => !isHotspot(p.a) && !isHotspot(p.b) && !p.a.endsWith('/') && !p.b.endsWith('/'));
|
|
52
|
+
const confidence = narrow.some((p) => p.exact) ? 'high' : narrow.length ? 'medium' : 'low';
|
|
53
|
+
const paths = [...new Set(pairs.map((p) => (p.exact ? p.a : `${p.a} ~ ${p.b}`)))];
|
|
54
|
+
return { confidence, paths };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Pure core — unit-tested with fixtures (no API). `tasks` is an array of
|
|
58
|
+
// { id, status, touches:[], dependencies:[ids] }. Returns candidate edges
|
|
59
|
+
// { task_id, dep_id, dep_status, confidence, paths }.
|
|
60
|
+
function findMissingDeps(tasks, { open = OPEN, isBlocker = isUnshippedBlocker } = {}) {
|
|
61
|
+
const out = [];
|
|
62
|
+
for (const t of tasks) {
|
|
63
|
+
if (!open.has(t.status)) continue;
|
|
64
|
+
if (!Array.isArray(t.touches) || !t.touches.length) continue;
|
|
65
|
+
const declared = new Set((t.dependencies || []).map(String));
|
|
66
|
+
for (const o of tasks) {
|
|
67
|
+
if (String(o.id) === String(t.id)) continue;
|
|
68
|
+
if (!isBlocker(o.status)) continue;
|
|
69
|
+
if (!Array.isArray(o.touches) || !o.touches.length) continue;
|
|
70
|
+
if (declared.has(String(o.id))) continue;
|
|
71
|
+
if (!touchesOverlap(t.touches, o.touches)) continue;
|
|
72
|
+
const c = classify(t.touches, o.touches);
|
|
73
|
+
if (c) out.push({ task_id: t.id, dep_id: o.id, dep_status: o.status, ...c });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function main() {
|
|
80
|
+
const argv = process.argv.slice(2);
|
|
81
|
+
const ver = argv.includes('--version') ? argv[argv.indexOf('--version') + 1] : 'GDS-V3';
|
|
82
|
+
const minRank = argv.includes('--min') ? argv[argv.indexOf('--min') + 1] : 'low';
|
|
83
|
+
const asJson = argv.includes('--json');
|
|
84
|
+
const order = { high: 3, medium: 2, low: 1 };
|
|
85
|
+
|
|
86
|
+
const api = await cliClient();
|
|
87
|
+
const r = await api.tasks.getTasks({ query: { version: ver } });
|
|
88
|
+
if (!r.ok) { console.error(`audit-deps: could not list tasks (${r.status})`); process.exit(1); }
|
|
89
|
+
const all = r.data.tasks || [];
|
|
90
|
+
const openTasks = all.filter((t) => OPEN.has(t.status) && Array.isArray(t.touches) && t.touches.length);
|
|
91
|
+
|
|
92
|
+
// dependencies[] lives in a join table, not the task row — hydrate per open task.
|
|
93
|
+
for (const t of openTasks) {
|
|
94
|
+
const dr = await api.tasks.getTasksIdDependencies({ id: t.id });
|
|
95
|
+
t.dependencies = dr.ok ? (dr.data.dependencies || []).map((d) => String(d.id)) : [];
|
|
96
|
+
}
|
|
97
|
+
const byId = new Map(all.map((t) => [String(t.id), t]));
|
|
98
|
+
// Feed the FULL task set (open + others) so blockers in any status are visible.
|
|
99
|
+
const edges = findMissingDeps([...openTasks, ...all.filter((t) => !OPEN.has(t.status))])
|
|
100
|
+
.filter((e) => order[e.confidence] >= (order[minRank] || 1))
|
|
101
|
+
.sort((a, b) => order[b.confidence] - order[a.confidence]);
|
|
102
|
+
|
|
103
|
+
if (asJson) { console.log(JSON.stringify(edges, null, 2)); return; }
|
|
104
|
+
console.log(`audit-deps: ${ver} — ${openTasks.length} open task(s) audited, ${edges.length} candidate edge(s) >= ${minRank}\n`);
|
|
105
|
+
for (const e of edges) {
|
|
106
|
+
const t = byId.get(String(e.task_id)) || {};
|
|
107
|
+
const o = byId.get(String(e.dep_id)) || {};
|
|
108
|
+
console.log(`[${e.confidence.toUpperCase().padEnd(6)}] #${e.task_id} should-maybe-depend-on #${e.dep_id} [${e.dep_status}]`);
|
|
109
|
+
console.log(` from: ${(t.title || '').slice(0, 70)}`);
|
|
110
|
+
console.log(` dep : ${(o.title || '').slice(0, 70)}`);
|
|
111
|
+
console.log(` on : ${e.paths.join(', ')}\n`);
|
|
112
|
+
}
|
|
113
|
+
if (!edges.length) console.log('No candidate missing dependencies at this confidence — the graph is clean here.');
|
|
114
|
+
console.log('NB: advisory only. Backfill `high` edges by hand (POST /tasks/:id/dependencies) after reading both tasks; a wrong edge gates the dependent.');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
module.exports = { findMissingDeps, classify, OPEN, isUnshippedBlocker, HOTSPOTS };
|
|
118
|
+
|
|
119
|
+
if (require.main === module) {
|
|
120
|
+
main().catch((e) => { console.error('audit-deps:', e.message); process.exit(1); });
|
|
121
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// audit-exports.js — V3.R?? (#467). Dead-export checker for the grader modules.
|
|
3
|
+
//
|
|
4
|
+
// The MAS grader accreted v1/v2/v3 code; some exported symbols outlived their
|
|
5
|
+
// only consumer (the dead exports #466 deletes). This script is the cheap,
|
|
6
|
+
// greppable, CI-hookable guard that catches that class — same spirit as
|
|
7
|
+
// audit-authorship.sh (V3.R12): require the target modules, read their actual
|
|
8
|
+
// export keys, then scan the repo for a real consumer of each.
|
|
9
|
+
//
|
|
10
|
+
// Classification per exported symbol:
|
|
11
|
+
// consumed — referenced in src/ or scripts/ outside the defining file
|
|
12
|
+
// test-only — referenced ONLY under tests/ (a warning: exported for tests)
|
|
13
|
+
// DEAD — no word-boundary reference anywhere outside the defining file
|
|
14
|
+
//
|
|
15
|
+
// Exit 1 if any DEAD export (nothing imports it). test-only is reported but
|
|
16
|
+
// does not fail. --json prints the raw classification.
|
|
17
|
+
//
|
|
18
|
+
// Usage: node scripts/gds/audit-exports.js [--json]
|
|
19
|
+
|
|
20
|
+
const fs = require('node:fs');
|
|
21
|
+
const path = require('node:path');
|
|
22
|
+
|
|
23
|
+
const REPO_ROOT = path.resolve(__dirname, '../..');
|
|
24
|
+
|
|
25
|
+
// Modules whose export surface we police. Add more as the grader grows.
|
|
26
|
+
const TARGETS = [
|
|
27
|
+
'modules/grading/grader.js',
|
|
28
|
+
'modules/grading/grader-workers/index.js',
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
// Dirs scanned for consumers.
|
|
32
|
+
const SCAN_DIRS = ['src', 'scripts', 'tests'];
|
|
33
|
+
const CODE_EXT = new Set(['.js', '.mjs', '.cjs']);
|
|
34
|
+
|
|
35
|
+
// Walk a dir collecting code files (skip node_modules / .git).
|
|
36
|
+
function collectFiles(dir, out) {
|
|
37
|
+
let entries;
|
|
38
|
+
try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return out; }
|
|
39
|
+
for (const e of entries) {
|
|
40
|
+
if (e.name === 'node_modules' || e.name === '.git') continue;
|
|
41
|
+
const full = path.join(dir, e.name);
|
|
42
|
+
if (e.isDirectory()) collectFiles(full, out);
|
|
43
|
+
else if (CODE_EXT.has(path.extname(e.name))) out.push(full);
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Build { absPath: content } for the whole scan corpus.
|
|
49
|
+
function buildCorpus() {
|
|
50
|
+
const files = [];
|
|
51
|
+
for (const d of SCAN_DIRS) collectFiles(path.join(REPO_ROOT, d), files);
|
|
52
|
+
const corpus = {};
|
|
53
|
+
for (const f of files) {
|
|
54
|
+
try { corpus[f] = fs.readFileSync(f, 'utf8'); } catch { /* skip unreadable */ }
|
|
55
|
+
}
|
|
56
|
+
return corpus;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Pure core: given a target's absolute path + its exported symbol names + the
|
|
60
|
+
// corpus ({absPath: content}), classify each export. A reference is a
|
|
61
|
+
// word-boundary match of the symbol in any corpus file OTHER than the defining
|
|
62
|
+
// file. Exported under tests/ only → test-only; nowhere → DEAD.
|
|
63
|
+
function classifyExports(targetAbsPath, exportNames, corpus) {
|
|
64
|
+
const results = [];
|
|
65
|
+
for (const name of exportNames) {
|
|
66
|
+
const re = new RegExp(`\\b${name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`);
|
|
67
|
+
let inSrcOrScripts = false;
|
|
68
|
+
let inTests = false;
|
|
69
|
+
for (const [file, content] of Object.entries(corpus)) {
|
|
70
|
+
if (file === targetAbsPath) continue; // self-references don't count
|
|
71
|
+
if (!re.test(content)) continue;
|
|
72
|
+
// A file is a test by virtue of living under a tests/ segment — checked
|
|
73
|
+
// on the raw path (not REPO_ROOT-relative) so the core stays pure +
|
|
74
|
+
// unit-testable with synthetic paths.
|
|
75
|
+
const isTest = /(^|[\\/])tests[\\/]/.test(file);
|
|
76
|
+
if (isTest) inTests = true;
|
|
77
|
+
else inSrcOrScripts = true;
|
|
78
|
+
}
|
|
79
|
+
const status = inSrcOrScripts ? 'consumed' : inTests ? 'test-only' : 'DEAD';
|
|
80
|
+
results.push({ name, status });
|
|
81
|
+
}
|
|
82
|
+
return results;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function run({ json = false } = {}) {
|
|
86
|
+
const corpus = buildCorpus();
|
|
87
|
+
const all = [];
|
|
88
|
+
for (const rel of TARGETS) {
|
|
89
|
+
const abs = path.join(REPO_ROOT, rel);
|
|
90
|
+
let mod;
|
|
91
|
+
try { mod = require(abs); } catch (err) {
|
|
92
|
+
console.error(`audit-exports: could not require ${rel}: ${err.message}`);
|
|
93
|
+
process.exitCode = 1;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const names = Object.keys(mod);
|
|
97
|
+
for (const r of classifyExports(abs, names, corpus)) {
|
|
98
|
+
all.push({ module: rel, ...r });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const dead = all.filter((r) => r.status === 'DEAD');
|
|
103
|
+
const testOnly = all.filter((r) => r.status === 'test-only');
|
|
104
|
+
|
|
105
|
+
if (json) {
|
|
106
|
+
console.log(JSON.stringify({ dead, test_only: testOnly, all }, null, 2));
|
|
107
|
+
} else {
|
|
108
|
+
console.log(`audit-exports: ${all.length} exported symbol(s) across ${TARGETS.length} module(s)`);
|
|
109
|
+
if (dead.length) {
|
|
110
|
+
console.log(`\n DEAD (no consumer anywhere — un-export or delete):`);
|
|
111
|
+
for (const r of dead) console.log(` ✗ ${r.module} → ${r.name}`);
|
|
112
|
+
}
|
|
113
|
+
if (testOnly.length) {
|
|
114
|
+
console.log(`\n test-only (exported but used only by tests):`);
|
|
115
|
+
for (const r of testOnly) console.log(` • ${r.module} → ${r.name}`);
|
|
116
|
+
}
|
|
117
|
+
if (!dead.length) console.log(' no dead exports — every exported symbol has a consumer ✓');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (dead.length) process.exitCode = 1;
|
|
121
|
+
return { dead, testOnly, all };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (require.main === module) {
|
|
125
|
+
run({ json: process.argv.includes('--json') });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
module.exports = { classifyExports, buildCorpus, run, TARGETS };
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# scripts/gds/audit-replay.sh — V3.R52 (#271).
|
|
3
|
+
#
|
|
4
|
+
# Given a builder_id and a date range, reconstruct chronologically EVERY
|
|
5
|
+
# trace of what that builder did against the city. The point is the
|
|
6
|
+
# forensic question: "If someone went rogue, can we tell?"
|
|
7
|
+
#
|
|
8
|
+
# Tables walked (each contributes timestamped rows):
|
|
9
|
+
# - claims (CLAIM + CLAIM_END events per task; outcome carries
|
|
10
|
+
# the disposition: shipped / abandoned / partial / expired)
|
|
11
|
+
# - credit_log (drachmae awards / debits)
|
|
12
|
+
# - cost_log (API + infra spend they logged)
|
|
13
|
+
# - session_logs (claim-scoped session boundaries + outcome)
|
|
14
|
+
# - audit_log (HTTP writes — V3.R35 #256)
|
|
15
|
+
#
|
|
16
|
+
# Two modes:
|
|
17
|
+
# 1. ON THE DROPLET (psql against the local Unix socket — fast, no auth).
|
|
18
|
+
# 2. FROM A LAPTOP via SSH (the script self-hops; you need lars@<droplet>).
|
|
19
|
+
# Triggered if the local PG socket isn't reachable.
|
|
20
|
+
#
|
|
21
|
+
# Usage:
|
|
22
|
+
# bash scripts/gds/audit-replay.sh <builder_id> <start_iso> <end_iso>
|
|
23
|
+
#
|
|
24
|
+
# Example:
|
|
25
|
+
# bash scripts/gds/audit-replay.sh 1 2026-05-20T00:00:00Z 2026-05-28T23:59:59Z
|
|
26
|
+
#
|
|
27
|
+
# Output: TSV columns: when_utc, kind, detail. Sorted chronologically.
|
|
28
|
+
# See docs/recipes/audit-replay.md for the recipe + how to extend.
|
|
29
|
+
|
|
30
|
+
set -euo pipefail
|
|
31
|
+
|
|
32
|
+
BUILDER_ID="${1:-}"
|
|
33
|
+
START="${2:-}"
|
|
34
|
+
END="${3:-}"
|
|
35
|
+
|
|
36
|
+
if [ -z "$BUILDER_ID" ] || [ -z "$START" ] || [ -z "$END" ]; then
|
|
37
|
+
cat <<USAGE >&2
|
|
38
|
+
usage: $0 <builder_id> <start_iso> <end_iso>
|
|
39
|
+
|
|
40
|
+
builder_id the id from the builders table (e.g. 1 for lars589)
|
|
41
|
+
start_iso inclusive lower bound, RFC3339/ISO 8601 (e.g. 2026-05-20T00:00:00Z)
|
|
42
|
+
end_iso inclusive upper bound, same shape
|
|
43
|
+
|
|
44
|
+
example:
|
|
45
|
+
$0 1 2026-05-20T00:00:00Z 2026-05-28T23:59:59Z
|
|
46
|
+
|
|
47
|
+
see docs/recipes/audit-replay.md
|
|
48
|
+
USAGE
|
|
49
|
+
exit 2
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
# Decide local vs remote. The droplet's Postgres listens on a Unix socket
|
|
53
|
+
# under /var/run/postgresql; if we can stat it, we're already on the droplet.
|
|
54
|
+
DROPLET="lars@104.236.254.243"
|
|
55
|
+
PG_SOCKET="/var/run/postgresql"
|
|
56
|
+
|
|
57
|
+
if [ ! -S "$PG_SOCKET/.s.PGSQL.5432" ]; then
|
|
58
|
+
# Re-invoke ourselves on the droplet. The script doesn't depend on any
|
|
59
|
+
# repo file at runtime, so we ship the script body over stdin to avoid a
|
|
60
|
+
# rsync step. Quoting on the SSH side preserves the timestamp args.
|
|
61
|
+
exec ssh -o ConnectTimeout=10 "$DROPLET" \
|
|
62
|
+
"bash -s -- '$BUILDER_ID' '$START' '$END'" < "$0"
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# From here down: running where Postgres is reachable on the Unix socket.
|
|
66
|
+
|
|
67
|
+
PSQL_ARGS=(-h "$PG_SOCKET" -d amazonprimea -U lars -t -A -F $'\t' --no-psqlrc)
|
|
68
|
+
|
|
69
|
+
q() {
|
|
70
|
+
PGOPTIONS='--client-min-messages=warning' psql "${PSQL_ARGS[@]}" -c "$1"
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Single UNION ALL so the chronological sort is one operation. The leading
|
|
74
|
+
# timestamp column normalises to ISO-8601 UTC so the textual sort is the
|
|
75
|
+
# chronological sort.
|
|
76
|
+
SQL=$(cat <<SQL
|
|
77
|
+
WITH range AS (
|
|
78
|
+
SELECT '${START}'::timestamptz AS lo, '${END}'::timestamptz AS hi
|
|
79
|
+
),
|
|
80
|
+
all_events AS (
|
|
81
|
+
-- CLAIM (claim row born)
|
|
82
|
+
SELECT to_char(c.claimed_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AS when_utc,
|
|
83
|
+
'CLAIM' AS kind,
|
|
84
|
+
('task=' || c.task_id || ' claim_id=' || c.id ||
|
|
85
|
+
' worktree=' || COALESCE(c.worktree_name, '-')) AS detail
|
|
86
|
+
FROM claims c, range
|
|
87
|
+
WHERE c.builder_id = ${BUILDER_ID}
|
|
88
|
+
AND c.claimed_at BETWEEN range.lo AND range.hi
|
|
89
|
+
|
|
90
|
+
UNION ALL
|
|
91
|
+
-- CLAIM_END (released — outcome distinguishes shipped vs abandoned, etc.)
|
|
92
|
+
SELECT to_char(c.released_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AS when_utc,
|
|
93
|
+
'CLAIM_END' AS kind,
|
|
94
|
+
('task=' || c.task_id || ' claim_id=' || c.id ||
|
|
95
|
+
' outcome=' || COALESCE(c.outcome, '-')) AS detail
|
|
96
|
+
FROM claims c, range
|
|
97
|
+
WHERE c.builder_id = ${BUILDER_ID}
|
|
98
|
+
AND c.released_at IS NOT NULL
|
|
99
|
+
AND c.released_at BETWEEN range.lo AND range.hi
|
|
100
|
+
|
|
101
|
+
UNION ALL
|
|
102
|
+
-- CREDIT (drachmae movement)
|
|
103
|
+
SELECT to_char(cl.recorded_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AS when_utc,
|
|
104
|
+
'CREDIT' AS kind,
|
|
105
|
+
('delta=' || cl.delta || ' reason=' || cl.reason ||
|
|
106
|
+
' task=' || COALESCE(cl.task_id::text, '-')) AS detail
|
|
107
|
+
FROM credit_log cl, range
|
|
108
|
+
WHERE cl.builder_id = ${BUILDER_ID}
|
|
109
|
+
AND cl.recorded_at BETWEEN range.lo AND range.hi
|
|
110
|
+
|
|
111
|
+
UNION ALL
|
|
112
|
+
-- COST (spend they logged; co.task_id may be NULL for infra-level entries)
|
|
113
|
+
SELECT to_char(co.recorded_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AS when_utc,
|
|
114
|
+
'COST' AS kind,
|
|
115
|
+
('category=' || co.category || ' usd=' || co.amount_usd ||
|
|
116
|
+
' source=' || COALESCE(co.source, '-') ||
|
|
117
|
+
' task=' || COALESCE(co.task_id::text, '-')) AS detail
|
|
118
|
+
FROM cost_log co
|
|
119
|
+
JOIN claims c2 ON c2.task_id = co.task_id AND c2.builder_id = ${BUILDER_ID}
|
|
120
|
+
, range
|
|
121
|
+
WHERE co.recorded_at BETWEEN range.lo AND range.hi
|
|
122
|
+
GROUP BY co.id, co.recorded_at, co.category, co.amount_usd, co.source, co.task_id
|
|
123
|
+
|
|
124
|
+
UNION ALL
|
|
125
|
+
-- SESSION_START
|
|
126
|
+
SELECT to_char(sl.started_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AS when_utc,
|
|
127
|
+
'SESSION_START' AS kind,
|
|
128
|
+
('claim_id=' || COALESCE(sl.claim_id::text, '-') ||
|
|
129
|
+
' task=' || COALESCE(sl.task_id::text, '-')) AS detail
|
|
130
|
+
FROM session_logs sl, range
|
|
131
|
+
WHERE sl.builder_id = ${BUILDER_ID}
|
|
132
|
+
AND sl.started_at BETWEEN range.lo AND range.hi
|
|
133
|
+
|
|
134
|
+
UNION ALL
|
|
135
|
+
-- SESSION_END
|
|
136
|
+
SELECT to_char(sl.ended_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AS when_utc,
|
|
137
|
+
'SESSION_END' AS kind,
|
|
138
|
+
('claim_id=' || COALESCE(sl.claim_id::text, '-') ||
|
|
139
|
+
' outcome=' || COALESCE(sl.outcome, '-')) AS detail
|
|
140
|
+
FROM session_logs sl, range
|
|
141
|
+
WHERE sl.builder_id = ${BUILDER_ID}
|
|
142
|
+
AND sl.ended_at BETWEEN range.lo AND range.hi
|
|
143
|
+
|
|
144
|
+
UNION ALL
|
|
145
|
+
-- HTTP write
|
|
146
|
+
SELECT to_char(al.recorded_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AS when_utc,
|
|
147
|
+
'HTTP_' || al.method AS kind,
|
|
148
|
+
('route=' || al.route ||
|
|
149
|
+
' status=' || al.response_status ||
|
|
150
|
+
' ip=' || COALESCE(al.ip, '-')) AS detail
|
|
151
|
+
FROM audit_log al, range
|
|
152
|
+
WHERE al.builder_id = ${BUILDER_ID}
|
|
153
|
+
AND al.recorded_at BETWEEN range.lo AND range.hi
|
|
154
|
+
)
|
|
155
|
+
SELECT when_utc, kind, detail
|
|
156
|
+
FROM all_events
|
|
157
|
+
ORDER BY when_utc, kind;
|
|
158
|
+
SQL
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
q "$SQL"
|