@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,210 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
// gen-session-index.js — session-log index, generated (Cloud Bongos portable core; ADR 0062 §8, task 1226).
|
|
4
|
+
//
|
|
5
|
+
// WHY. The old CLAUDE.md §13 was a HAND-MAINTAINED index of every session: it bloated the
|
|
6
|
+
// always-loaded context file, drifted, and its links recurrently dangled when a session file was
|
|
7
|
+
// renamed/mis-slugged (the bug recurs as idea 57, BFG F2, task 580). The fix (ADR 0062 §8): the
|
|
8
|
+
// session-log PROSE is canonical in docs/session-logs/*.md (older entries compressed into
|
|
9
|
+
// docs/session-log-archive.md) + the DB session corpus (session_logs / the BFG session_records);
|
|
10
|
+
// the index is GENERATED from those files so no instance hand-maintains it and a link can NEVER
|
|
11
|
+
// dangle (the generator only ever links files that exist on disk).
|
|
12
|
+
//
|
|
13
|
+
// It writes two artifacts, the gen-diagrams.js / gen-repo-map.js pattern (ADR 0063):
|
|
14
|
+
// (1) docs/session-log-index.md — the FULL index (every session file, newest first). The
|
|
15
|
+
// browseable full history (renders on GitHub / the hall).
|
|
16
|
+
// (2) a BOUNDED "recent sessions" snippet injected between markers in CLAUDE.md §13 — the only
|
|
17
|
+
// session-log content the always-loaded context file carries.
|
|
18
|
+
//
|
|
19
|
+
// Zero-dependency, deterministic (sorts by date desc then filename; no timestamps) — so `--check`
|
|
20
|
+
// is a clean idempotent CI gate, wired into scripts/gds/fitness.js (Path C) and auto-regenerated +
|
|
21
|
+
// committed at ship by ship.js (regenerateSessionIndex), exactly like the repo map.
|
|
22
|
+
//
|
|
23
|
+
// Usage:
|
|
24
|
+
// node scripts/gds/gen-session-index.js # regenerate the index + CLAUDE.md snippet
|
|
25
|
+
// node scripts/gds/gen-session-index.js --check # write nothing; exit 2 if EITHER bucket would change
|
|
26
|
+
// node scripts/gds/gen-session-index.js --check-block # exit 2 only if the tracked CLAUDE.md §13 snippet drifts (CI gate)
|
|
27
|
+
// node scripts/gds/gen-session-index.js --check-whole # exit 2 only if docs/session-log-index.md drifts
|
|
28
|
+
// docs/session-log-index.md is GITIGNORED + regenerated at deploy/box-fetch since ADR 0110 (task 1926).
|
|
29
|
+
// node scripts/gds/gen-session-index.js --json # print the parsed entries as JSON (debug)
|
|
30
|
+
|
|
31
|
+
const fs = require('node:fs');
|
|
32
|
+
const path = require('node:path');
|
|
33
|
+
|
|
34
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
35
|
+
const LOGS_DIR = path.join(REPO_ROOT, 'docs', 'session-logs');
|
|
36
|
+
const INDEX_PATH = path.join(REPO_ROOT, 'docs', 'session-log-index.md');
|
|
37
|
+
const CLAUDE_PATH = path.join(REPO_ROOT, 'CLAUDE.md');
|
|
38
|
+
|
|
39
|
+
// How many of the most-recent sessions the always-loaded CLAUDE.md snippet carries. The rest live
|
|
40
|
+
// in the generated full index. Bounded on purpose (ADR 0062 §8) — the context file must stay lean.
|
|
41
|
+
const SNIPPET_COUNT = 10;
|
|
42
|
+
|
|
43
|
+
// Only dated session-log files are entries — a date-prefixed slug is the naming contract (§12).
|
|
44
|
+
// This excludes any stray README / the index itself / non-session markdown in the directory.
|
|
45
|
+
const SESSION_FILE_RE = /^(\d{4}-\d{2}-\d{2})-.*\.md$/;
|
|
46
|
+
|
|
47
|
+
const BEGIN = '<!-- BEGIN GENERATED SESSION-LOG SNIPPET (scripts/gds/gen-session-index.js — do not hand-edit) -->';
|
|
48
|
+
const END = '<!-- END GENERATED SESSION-LOG SNIPPET -->';
|
|
49
|
+
|
|
50
|
+
// Turn a raw H1/H3 heading into clean link TEXT: strip heading markers + backticks, de-linkify
|
|
51
|
+
// embedded markdown links (so the entry — itself a link — has no broken NESTED links), and de-hash
|
|
52
|
+
// bare `#NNN` task refs to plain numbers (committed markdown must pass the linkify-refs CI gate; a
|
|
53
|
+
// bare #NNN auto-links to a GitHub issue and 404s). Genuine `PR #N` / `issue #N` keep their `#`.
|
|
54
|
+
function cleanTitle(rawHeading) {
|
|
55
|
+
let t = String(rawHeading || '');
|
|
56
|
+
t = t.replace(/^#{1,6}\s+/, ''); // drop leading heading markers
|
|
57
|
+
t = t.replace(/`/g, ''); // code spans add nothing as link text and can hide a #NNN
|
|
58
|
+
t = t.replace(/\[([^\]]*)\]\([^)]*\)/g, '$1'); // de-linkify [text](url) -> text (no nested links)
|
|
59
|
+
// de-hash bare #NNN -> NNN, but leave real GitHub refs (PR/issue/pull request #N) alone
|
|
60
|
+
t = t.replace(/(\bPR\b|\bpull request\b|\bissue\b)?(\s*)#(\d{1,7})\b/gi, (m, kw, sp, n) =>
|
|
61
|
+
kw ? `${kw}${sp}#${n}` : `${sp}${n}`
|
|
62
|
+
);
|
|
63
|
+
return t.replace(/\s+/g, ' ').trim();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Parse one session-log file into { date, file, title }. date comes from the filename (the reliable
|
|
67
|
+
// contract); title from the first heading, prefixed with the date if the heading doesn't already
|
|
68
|
+
// lead with it, so every rendered entry reads uniformly `YYYY-MM-DD — title`.
|
|
69
|
+
function parseEntry(filename, content) {
|
|
70
|
+
const m = SESSION_FILE_RE.exec(filename);
|
|
71
|
+
if (!m) return null;
|
|
72
|
+
const date = m[1];
|
|
73
|
+
const slug = filename.replace(/^\d{4}-\d{2}-\d{2}-/, '').replace(/\.md$/, '');
|
|
74
|
+
const headingLine = (content.split('\n').find((l) => /^#{1,6}\s+\S/.test(l)) || '').trim();
|
|
75
|
+
let title = cleanTitle(headingLine) || slug.replace(/-/g, ' ');
|
|
76
|
+
if (!title.startsWith(date)) title = `${date} — ${title}`;
|
|
77
|
+
return { date, file: filename, title };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Read + parse every dated session-log file, newest first (date desc, then filename desc so a
|
|
81
|
+
// same-day tiebreak is stable — deterministic for the --check gate).
|
|
82
|
+
function collectEntries(dir = LOGS_DIR) {
|
|
83
|
+
let names = [];
|
|
84
|
+
try { names = fs.readdirSync(dir); } catch { return []; }
|
|
85
|
+
const entries = [];
|
|
86
|
+
for (const name of names) {
|
|
87
|
+
if (!SESSION_FILE_RE.test(name)) continue;
|
|
88
|
+
const content = fs.readFileSync(path.join(dir, name), 'utf8');
|
|
89
|
+
const e = parseEntry(name, content);
|
|
90
|
+
if (e) entries.push(e);
|
|
91
|
+
}
|
|
92
|
+
entries.sort((a, b) => (a.date < b.date ? 1 : a.date > b.date ? -1 : a.file < b.file ? 1 : -1));
|
|
93
|
+
return entries;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const line = (e, prefix) => `- [${e.title}](${prefix}${e.file})`;
|
|
97
|
+
|
|
98
|
+
// docs/session-log-index.md — the full generated index (links relative to docs/).
|
|
99
|
+
function renderIndex(entries) {
|
|
100
|
+
const L = [];
|
|
101
|
+
L.push('# Session log — index');
|
|
102
|
+
L.push('');
|
|
103
|
+
L.push('> **AUTO-GENERATED — do not hand-edit.** Regenerate with `node scripts/gds/gen-session-index.js` (auto-regenerated + committed at ship, like `gen-repo-map.js`). Generated from the files in [`session-logs/`](session-logs/) so a link can never dangle (retires the recurring §13 drift: idea 57, [#580](https://amazonprimea.com/builders#/task/580)). The session PROSE is canonical in those files (older entries compressed into [`session-log-archive.md`](session-log-archive.md)); the DB session corpus (`session_logs` + the BFG `session_records`) is the structured record. See [ADR 0062](adr/0062-medusa-instance-model-decoupling.md) §8 · [ADR 0063](adr/0063-generated-repo-map-symbol-skeleton.md).');
|
|
104
|
+
L.push('');
|
|
105
|
+
L.push(`**${entries.length} sessions**, newest first.`);
|
|
106
|
+
L.push('');
|
|
107
|
+
for (const e of entries) L.push(line(e, 'session-logs/'));
|
|
108
|
+
L.push('');
|
|
109
|
+
L.push('---');
|
|
110
|
+
L.push('');
|
|
111
|
+
L.push('Older prose compressed for context budget: [`session-log-archive.md`](session-log-archive.md).');
|
|
112
|
+
return L.join('\n').replace(/\n+$/, '') + '\n';
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// The bounded snippet injected into CLAUDE.md §13 (links relative to repo root).
|
|
116
|
+
function renderSnippet(entries, count = SNIPPET_COUNT) {
|
|
117
|
+
const recent = entries.slice(0, count);
|
|
118
|
+
const L = [];
|
|
119
|
+
L.push(BEGIN);
|
|
120
|
+
L.push(`**Recent sessions** (newest ${recent.length} — full history in [\`docs/session-log-index.md\`](docs/session-log-index.md)):`);
|
|
121
|
+
L.push('');
|
|
122
|
+
for (const e of recent) L.push(line(e, 'docs/session-logs/'));
|
|
123
|
+
L.push(END);
|
|
124
|
+
return L.join('\n');
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Replace the marked snippet region in CLAUDE.md (mirrors gen-repo-map.injectBlock).
|
|
128
|
+
function injectSnippet(existing, snippet) {
|
|
129
|
+
const b = existing.indexOf(BEGIN);
|
|
130
|
+
const e = existing.indexOf(END);
|
|
131
|
+
if (b !== -1 && e !== -1 && e > b) {
|
|
132
|
+
return existing.slice(0, b) + snippet + existing.slice(e + END.length);
|
|
133
|
+
}
|
|
134
|
+
return existing; // markers absent → leave the file untouched (the §13 section seeds them)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function computeWrites() {
|
|
138
|
+
const entries = collectEntries();
|
|
139
|
+
const writes = [];
|
|
140
|
+
|
|
141
|
+
// Two buckets (ADR 0110, task 1926): 'whole' = docs/session-log-index.md, now
|
|
142
|
+
// GITIGNORED + regenerated at deploy/box-fetch (no committed copy → no branch
|
|
143
|
+
// collisions); 'block' = the bounded CLAUDE.md §13 snippet, still tracked, so it
|
|
144
|
+
// stays a HARD CI gate. main() gates them separately (--check-block vs --check-whole).
|
|
145
|
+
const idxNext = renderIndex(entries);
|
|
146
|
+
const idxCur = fs.existsSync(INDEX_PATH) ? fs.readFileSync(INDEX_PATH, 'utf8') : '';
|
|
147
|
+
if (idxCur !== idxNext) writes.push({ full: INDEX_PATH, content: idxNext, rel: 'docs/session-log-index.md', bucket: 'whole' });
|
|
148
|
+
|
|
149
|
+
if (fs.existsSync(CLAUDE_PATH)) {
|
|
150
|
+
const cur = fs.readFileSync(CLAUDE_PATH, 'utf8');
|
|
151
|
+
const next = injectSnippet(cur, renderSnippet(entries));
|
|
152
|
+
if (cur !== next) {
|
|
153
|
+
if (next === cur && cur.indexOf(BEGIN) === -1) {
|
|
154
|
+
console.error('gen-session-index: WARN CLAUDE.md has no snippet markers — skipping snippet injection.');
|
|
155
|
+
} else {
|
|
156
|
+
writes.push({ full: CLAUDE_PATH, content: next, rel: 'CLAUDE.md', bucket: 'block' });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return { entries, writes };
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function main() {
|
|
164
|
+
// `--check` = both buckets; `--check-block` = only the tracked CLAUDE.md §13 snippet
|
|
165
|
+
// (the HARD CI gate); `--check-whole` = only the gitignored docs/session-log-index.md
|
|
166
|
+
// (deploy owns its freshness). See computeWrites() + ADR 0110.
|
|
167
|
+
const checkAll = process.argv.includes('--check');
|
|
168
|
+
const checkWhole = process.argv.includes('--check-whole');
|
|
169
|
+
const checkBlock = process.argv.includes('--check-block');
|
|
170
|
+
if (process.argv.includes('--json')) {
|
|
171
|
+
process.stdout.write(JSON.stringify(collectEntries(), null, 2) + '\n');
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const { writes } = computeWrites();
|
|
175
|
+
if (checkAll || checkWhole || checkBlock) {
|
|
176
|
+
const wantBlock = checkAll || checkBlock;
|
|
177
|
+
const wantWhole = checkAll || checkWhole;
|
|
178
|
+
const stale = writes.filter((w) => (w.bucket === 'block' && wantBlock) || (w.bucket === 'whole' && wantWhole));
|
|
179
|
+
const mode = checkBlock ? '--check-block' : checkWhole ? '--check-whole' : '--check';
|
|
180
|
+
if (stale.length) {
|
|
181
|
+
console.error(`gen-session-index ${mode}: STALE — would update ${stale.map((w) => w.rel).join(', ')}`);
|
|
182
|
+
console.error(' run: node scripts/gds/gen-session-index.js (and commit any TRACKED files it changes)');
|
|
183
|
+
process.exit(2);
|
|
184
|
+
}
|
|
185
|
+
console.log(`gen-session-index ${mode}: up to date.`);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (!writes.length) {
|
|
189
|
+
console.log('gen-session-index: index + snippet already current — no changes.');
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
for (const w of writes) fs.writeFileSync(w.full, w.content);
|
|
193
|
+
console.log(`gen-session-index: wrote ${writes.length} file(s): ${writes.map((w) => w.rel).join(', ')}`);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (require.main === module) main();
|
|
197
|
+
|
|
198
|
+
module.exports = {
|
|
199
|
+
cleanTitle,
|
|
200
|
+
parseEntry,
|
|
201
|
+
collectEntries,
|
|
202
|
+
renderIndex,
|
|
203
|
+
renderSnippet,
|
|
204
|
+
injectSnippet,
|
|
205
|
+
computeWrites,
|
|
206
|
+
SNIPPET_COUNT,
|
|
207
|
+
BEGIN,
|
|
208
|
+
END,
|
|
209
|
+
SESSION_FILE_RE,
|
|
210
|
+
};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/gds/git-merge-regen.js — auto-heal merge conflicts in GENERATED files
|
|
3
|
+
// (task 1243; the prevention for the task 1234 / PR #167 stall).
|
|
4
|
+
//
|
|
5
|
+
// docs/repo-map.md is a 100%-generated index (ADR 0063); the nested CLAUDE.md docs
|
|
6
|
+
// (NESTED_DIRS) carry a generated symbol-skeleton BLOCK between markers. Two
|
|
7
|
+
// parallel branches regenerate them differently, so they CONFLICT on every merge
|
|
8
|
+
// with main — and a `merge=union`/`ours` attribute can't fix it because the
|
|
9
|
+
// committed file must equal the MERGED code or CI's `repo_map --check` fails STALE.
|
|
10
|
+
// The only correct resolution is to REGENERATE from the merged tree. This module is
|
|
11
|
+
// both:
|
|
12
|
+
// • a git merge driver (registered by install-git-hooks.js, declared in
|
|
13
|
+
// .gitattributes) — invoked as `git-merge-regen.js %O %A %B %P` during any
|
|
14
|
+
// `git merge` (manual, /merge-mode, ship's pre-stage); and
|
|
15
|
+
// • a library (regenerateResolved / resolveInWorktree) reused by ship.js's
|
|
16
|
+
// mergeMainIntoBranch self-heal so the heal runs even where the driver isn't
|
|
17
|
+
// installed per-clone.
|
|
18
|
+
//
|
|
19
|
+
// SAFETY: it regenerates the GENERATED content and 3-way-merges the hand-written
|
|
20
|
+
// parts of nested docs; it succeeds ONLY if no conflict markers remain. A genuine
|
|
21
|
+
// hand-written conflict falls through to a normal git conflict — it never invents a
|
|
22
|
+
// resolution or clobbers a real edit.
|
|
23
|
+
|
|
24
|
+
const fs = require('node:fs');
|
|
25
|
+
const os = require('node:os');
|
|
26
|
+
const path = require('node:path');
|
|
27
|
+
const { spawnSync } = require('node:child_process');
|
|
28
|
+
const G = require('./gen-repo-map');
|
|
29
|
+
const FM = require('./gen-file-map');
|
|
30
|
+
const SI = require('./gen-session-index');
|
|
31
|
+
|
|
32
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
33
|
+
|
|
34
|
+
// The files this driver knows how to regenerate. docs/repo-map.md and
|
|
35
|
+
// docs/session-log-index.md are whole-file; each NESTED_DIRS CLAUDE.md is
|
|
36
|
+
// hand-written prose with one generated block; docs/file-map.md is hand-written
|
|
37
|
+
// prose with TWO generated section blocks (ADR 0066). (task 1385: session-log-index
|
|
38
|
+
// joined so a confirmed PR that only conflicts on it self-heals like the rest.)
|
|
39
|
+
const REGENERABLE = new Set([
|
|
40
|
+
'docs/repo-map.md',
|
|
41
|
+
'docs/file-map.md',
|
|
42
|
+
'docs/session-log-index.md',
|
|
43
|
+
...G.NESTED_DIRS.map((d) => `${d}/CLAUDE.md`),
|
|
44
|
+
]);
|
|
45
|
+
|
|
46
|
+
// A line that begins with a git conflict marker. If any survives our resolution,
|
|
47
|
+
// the conflict is in hand-written content and we must NOT auto-resolve.
|
|
48
|
+
const MARKER_RE = /^(<{7}|={7}|>{7})/m;
|
|
49
|
+
|
|
50
|
+
function hasMarkers(s) {
|
|
51
|
+
return MARKER_RE.test(s);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// 3-way merge three content strings via `git merge-file` (writes conflict markers
|
|
55
|
+
// where ours/theirs truly diverge). Returns the merged text (markers and all).
|
|
56
|
+
function threeWayMerge(base, ours, theirs) {
|
|
57
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'otb-merge-'));
|
|
58
|
+
try {
|
|
59
|
+
const o = path.join(dir, 'ours');
|
|
60
|
+
const b = path.join(dir, 'base');
|
|
61
|
+
const t = path.join(dir, 'theirs');
|
|
62
|
+
fs.writeFileSync(o, ours);
|
|
63
|
+
fs.writeFileSync(b, base);
|
|
64
|
+
fs.writeFileSync(t, theirs);
|
|
65
|
+
// `git merge-file -p OURS BASE THEIRS` → merged result to stdout. Exit code is
|
|
66
|
+
// the conflict count (>0) or <0 on error; we want the body either way, so read
|
|
67
|
+
// stdout regardless of status.
|
|
68
|
+
const r = spawnSync('git', ['merge-file', '-p', o, b, t], { encoding: 'utf8' });
|
|
69
|
+
return typeof r.stdout === 'string' ? r.stdout : ours;
|
|
70
|
+
} finally {
|
|
71
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Produce the resolved content for one generated file from its three merge inputs.
|
|
76
|
+
// Returns { content, ok }: ok=false means a real (hand-written) conflict remains —
|
|
77
|
+
// the caller must leave it for a human.
|
|
78
|
+
function regenerateResolved(relpath, { base = '', ours = '', theirs = '' } = {}) {
|
|
79
|
+
if (!REGENERABLE.has(relpath)) return { content: null, ok: false };
|
|
80
|
+
|
|
81
|
+
// docs/session-log-index.md is fully generated from the session-log files
|
|
82
|
+
// (gen-session-index.js, ADR 0062 §8) — like docs/repo-map.md it ignores all
|
|
83
|
+
// three merge sides and rebuilds from the merged tree. Handled before
|
|
84
|
+
// buildModel() since it needs none of the code-symbol model.
|
|
85
|
+
if (relpath === 'docs/session-log-index.md') {
|
|
86
|
+
return { content: SI.renderIndex(SI.collectEntries()), ok: true };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const model = G.buildModel();
|
|
90
|
+
|
|
91
|
+
// docs/repo-map.md is fully generated — ignore all three sides, rebuild it.
|
|
92
|
+
if (relpath === 'docs/repo-map.md') {
|
|
93
|
+
return { content: G.renderRepoMap(model), ok: true };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// docs/file-map.md: hand-written prose with TWO generated section blocks (ADR 0066). 3-way-merge
|
|
97
|
+
// the prose, then overwrite each generated block with a fresh render from disk (the same dirs +
|
|
98
|
+
// notes sidecar gen-file-map reads). Two parallel branches that each add a skill conflict only in
|
|
99
|
+
// those blocks; regenerating from the merged tree is the one correct resolution.
|
|
100
|
+
if (relpath === 'docs/file-map.md') {
|
|
101
|
+
const merged = threeWayMerge(base, ours, theirs);
|
|
102
|
+
let out = merged;
|
|
103
|
+
for (const m of FM.buildModel()) out = FM.injectSection(out, m);
|
|
104
|
+
return { content: out, ok: !hasMarkers(out) };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Nested CLAUDE.md: 3-way-merge the hand-written prose, then overwrite the
|
|
108
|
+
// generated block with a fresh render from the merged code.
|
|
109
|
+
const dir = relpath.replace(/\/CLAUDE\.md$/, '');
|
|
110
|
+
const merged = threeWayMerge(base, ours, theirs);
|
|
111
|
+
const out = G.injectBlock(merged, G.renderNestedBlock(model, dir));
|
|
112
|
+
return { content: out, ok: !hasMarkers(out) };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Reused by ship.js mergeMainIntoBranch: resolve a conflicted file straight from the
|
|
116
|
+
// index stages (:1 base, :2 ours, :3 theirs) of an in-progress `git merge`, writing
|
|
117
|
+
// the result into the working tree. Returns true iff fully resolved.
|
|
118
|
+
function resolveInWorktree(relpath) {
|
|
119
|
+
if (!REGENERABLE.has(relpath)) return false;
|
|
120
|
+
const stage = (n) => {
|
|
121
|
+
const r = spawnSync('git', ['show', `:${n}:${relpath}`], { cwd: REPO_ROOT, encoding: 'utf8' });
|
|
122
|
+
return r.status === 0 && typeof r.stdout === 'string' ? r.stdout : '';
|
|
123
|
+
};
|
|
124
|
+
const { content, ok } = regenerateResolved(relpath, { base: stage(1), ours: stage(2), theirs: stage(3) });
|
|
125
|
+
if (content == null || !ok) return false;
|
|
126
|
+
fs.writeFileSync(path.join(REPO_ROOT, relpath), content);
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// git merge-driver entrypoint: `git-merge-regen.js %O %A %B %P`. Writes the resolved
|
|
131
|
+
// content into %A (git takes %A as the merge result) and exits 0; exits 1 to signal
|
|
132
|
+
// an unresolved conflict (git then leaves the normal conflict for a human).
|
|
133
|
+
function runDriver(argv) {
|
|
134
|
+
const [O, A, B, P] = argv;
|
|
135
|
+
if (!A || !P) {
|
|
136
|
+
process.stderr.write('git-merge-regen: usage as a merge driver: %O %A %B %P\n');
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
const read = (p) => { try { return fs.readFileSync(p, 'utf8'); } catch { return ''; } };
|
|
140
|
+
const { content, ok } = regenerateResolved(P, { base: read(O), ours: read(A), theirs: read(B) });
|
|
141
|
+
if (content != null) fs.writeFileSync(A, content);
|
|
142
|
+
process.exit(ok ? 0 : 1);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (require.main === module) runDriver(process.argv.slice(2));
|
|
146
|
+
|
|
147
|
+
module.exports = { REGENERABLE, MARKER_RE, hasMarkers, threeWayMerge, regenerateResolved, resolveInWorktree };
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Subagent grader smoke test — GDS-V3 task V3.R18 (#209) → MAS Phase 1 #395.
|
|
3
|
+
//
|
|
4
|
+
// Runs two synthetic ship scenarios end-to-end through the v3 multi-shot
|
|
5
|
+
// subagent grader (DEFAULT_SHOTS × cross-family model, unanimous-PASS gate).
|
|
6
|
+
// Asserts:
|
|
7
|
+
//
|
|
8
|
+
// - Known-GOOD ship: a tiny, complete change → grade passes (unanimous
|
|
9
|
+
// across all shots), both axes >= threshold, zero blockers.
|
|
10
|
+
// - Known-BAD ship: a deliberately half-finished change with a TODO and
|
|
11
|
+
// a value_summary that overpromises → grade fails,
|
|
12
|
+
// issues[] is non-empty and names the gap.
|
|
13
|
+
//
|
|
14
|
+
// Hits the real Claude API at the v3-default model (Sonnet 4.6) × shots.
|
|
15
|
+
// NOT run in CI. Run manually after grader changes:
|
|
16
|
+
//
|
|
17
|
+
// node scripts/gds/grade-smoke.js
|
|
18
|
+
//
|
|
19
|
+
// Expected wall time: 60-180 seconds per scenario (shots run in parallel; the
|
|
20
|
+
// slowest shot gates). Cost ~$0.30-$0.90 total against the subscription.
|
|
21
|
+
|
|
22
|
+
const grader = require('../../modules/grading/grader');
|
|
23
|
+
|
|
24
|
+
// -------- Scenarios --------
|
|
25
|
+
|
|
26
|
+
const GOOD_TASK = {
|
|
27
|
+
id: 99001,
|
|
28
|
+
title: 'Add a tiny pure helper: hoursBetween(start, end)',
|
|
29
|
+
description: `Add a single pure helper to src/util/time.js that returns the
|
|
30
|
+
number of hours between two Date instances, rounded to one decimal place.
|
|
31
|
+
Acceptance:
|
|
32
|
+
- Function is exported.
|
|
33
|
+
- Returns a number, NOT a Date or a string.
|
|
34
|
+
- Negative differences are returned negative (end < start → negative result).
|
|
35
|
+
- One unit test in tests/util.mjs covers two cases (positive + negative).
|
|
36
|
+
Out of scope: anything to do with timezones; calendar-aware durations.`,
|
|
37
|
+
kind: 'feature',
|
|
38
|
+
discipline: 'engineer',
|
|
39
|
+
version_id: 'GDS-V3',
|
|
40
|
+
};
|
|
41
|
+
const GOOD_VALUE_SUMMARY =
|
|
42
|
+
'Added hoursBetween(start, end) helper that returns one-decimal hours between two Dates, with tests covering positive and negative diffs.';
|
|
43
|
+
const GOOD_CHANGED_FILES = ['src/util/time.js', 'tests/util.mjs'];
|
|
44
|
+
const GOOD_DIFF = `diff --git a/src/util/time.js b/src/util/time.js
|
|
45
|
+
new file mode 100644
|
|
46
|
+
--- /dev/null
|
|
47
|
+
+++ b/src/util/time.js
|
|
48
|
+
@@ -0,0 +1,8 @@
|
|
49
|
+
+// Pure helper — no timezone awareness, no calendar math.
|
|
50
|
+
+function hoursBetween(start, end) {
|
|
51
|
+
+ const ms = end.getTime() - start.getTime();
|
|
52
|
+
+ return Math.round((ms / 36e5) * 10) / 10;
|
|
53
|
+
+}
|
|
54
|
+
+
|
|
55
|
+
+module.exports = { hoursBetween };
|
|
56
|
+
diff --git a/tests/util.mjs b/tests/util.mjs
|
|
57
|
+
new file mode 100644
|
|
58
|
+
--- /dev/null
|
|
59
|
+
+++ b/tests/util.mjs
|
|
60
|
+
@@ -0,0 +1,12 @@
|
|
61
|
+
+import { strict as assert } from 'node:assert';
|
|
62
|
+
+import { createRequire } from 'node:module';
|
|
63
|
+
+const require = createRequire(import.meta.url);
|
|
64
|
+
+const { hoursBetween } = require('../src/util/time.js');
|
|
65
|
+
+
|
|
66
|
+
+const a = new Date('2026-05-13T10:00:00Z');
|
|
67
|
+
+const b = new Date('2026-05-13T13:30:00Z');
|
|
68
|
+
+assert.equal(hoursBetween(a, b), 3.5);
|
|
69
|
+
+assert.equal(hoursBetween(b, a), -3.5);
|
|
70
|
+
+
|
|
71
|
+
+console.log('time helper ok');
|
|
72
|
+
`;
|
|
73
|
+
|
|
74
|
+
const BAD_TASK = {
|
|
75
|
+
id: 99002,
|
|
76
|
+
title: 'Wire up real cost-allocation for art-pipeline tasks (Stripe-backed billing)',
|
|
77
|
+
description: `Replace the placeholder cost ledger with a real Stripe-backed billing flow.
|
|
78
|
+
Acceptance:
|
|
79
|
+
- New table billing_charges captures one row per art-pipeline ship with
|
|
80
|
+
stripe_charge_id, amount_cents, currency, status.
|
|
81
|
+
- POST /api/gds/cost on art-pipeline tasks creates a Stripe charge against
|
|
82
|
+
the configured Hermeslines customer and writes the billing_charges row.
|
|
83
|
+
- A failure to charge rolls the cost-log insert back so we never claim a
|
|
84
|
+
charge that didn't happen.
|
|
85
|
+
- One smoke test that exercises the charge → row → rollback paths.
|
|
86
|
+
Out of scope: refund flow.`,
|
|
87
|
+
kind: 'feature',
|
|
88
|
+
discipline: 'engineer',
|
|
89
|
+
version_id: 'GDS-V3',
|
|
90
|
+
};
|
|
91
|
+
const BAD_VALUE_SUMMARY =
|
|
92
|
+
'Wired up real Stripe-backed billing for art-pipeline cost allocation.';
|
|
93
|
+
const BAD_CHANGED_FILES = ['src/bongos/billing.js'];
|
|
94
|
+
const BAD_DIFF = `diff --git a/src/bongos/billing.js b/src/bongos/billing.js
|
|
95
|
+
new file mode 100644
|
|
96
|
+
--- /dev/null
|
|
97
|
+
+++ b/src/bongos/billing.js
|
|
98
|
+
@@ -0,0 +1,15 @@
|
|
99
|
+
+// TODO(V3.R18 smoke): hook up the Stripe SDK.
|
|
100
|
+
+// For now this is a stub so the ship can land — the actual Stripe call,
|
|
101
|
+
+// the billing_charges table, the smoke test, and the rollback path are
|
|
102
|
+
+// all still to do.
|
|
103
|
+
+
|
|
104
|
+
+async function chargeForArtShip(taskId, amountCents) {
|
|
105
|
+
+ // FIXME: doesn't actually charge anything.
|
|
106
|
+
+ console.log('would charge', taskId, amountCents);
|
|
107
|
+
+ return { stripe_charge_id: 'demo_' + taskId, status: 'demo' };
|
|
108
|
+
+}
|
|
109
|
+
+
|
|
110
|
+
+module.exports = { chargeForArtShip };
|
|
111
|
+
`;
|
|
112
|
+
|
|
113
|
+
// -------- Helpers --------
|
|
114
|
+
|
|
115
|
+
function summarize(result, label) {
|
|
116
|
+
console.log('');
|
|
117
|
+
console.log('===========================================================');
|
|
118
|
+
console.log(`${label}`);
|
|
119
|
+
console.log('===========================================================');
|
|
120
|
+
console.log(`passed: ${result.passed}`);
|
|
121
|
+
console.log(`score: ${result.score}/10 (threshold ${result.threshold})`);
|
|
122
|
+
console.log(`functional_fidelity: ${result.rubric_scores?.functional_fidelity ?? '-'}/10`);
|
|
123
|
+
console.log(`code_quality: ${result.rubric_scores?.code_quality ?? '-'}/10`);
|
|
124
|
+
console.log(`confidence: ${result.signals?.confidence ?? '-'}`);
|
|
125
|
+
// v3 multi-shot aggregated result exposes total_ms (wall time across N
|
|
126
|
+
// parallel shots); v2 single-shot exposed run_ms. Prefer total_ms; fall
|
|
127
|
+
// back to run_ms so single-shot diagnostics still print something.
|
|
128
|
+
console.log(`wall_ms: ${result.signals?.total_ms ?? result.signals?.run_ms ?? '-'}`);
|
|
129
|
+
if (result.signals?.shot_count) {
|
|
130
|
+
console.log(`shots: ${result.signals.shot_count}× (aggregation: ${result.signals.shot_aggregation ?? '?'})`);
|
|
131
|
+
}
|
|
132
|
+
if (result.issues?.length) {
|
|
133
|
+
console.log(`issues (${result.issues.length}):`);
|
|
134
|
+
for (const it of result.issues) {
|
|
135
|
+
console.log(` [${it.severity || '?'}] ${it.file || '?'} — ${it.summary || ''}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (result.signals?.parse_error || result.signals?.schema_error || result.signals?.subprocess_error) {
|
|
139
|
+
console.log(`signals.parse_error: ${result.signals.parse_error ?? false}`);
|
|
140
|
+
console.log(`signals.schema_error: ${result.signals.schema_error ?? false}`);
|
|
141
|
+
console.log(`signals.subprocess_error: ${result.signals.subprocess_error ?? null}`);
|
|
142
|
+
}
|
|
143
|
+
console.log('');
|
|
144
|
+
console.log('--- notes_md ---');
|
|
145
|
+
console.log(result.notes_md);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// -------- Main --------
|
|
149
|
+
|
|
150
|
+
(async () => {
|
|
151
|
+
console.log(`Running subagent grader smoke (v${grader.VERSION}, model=${grader.DEFAULT_GRADER_MODEL}, ${grader.DEFAULT_SHOTS}× shots, threshold=${grader.THRESHOLD})`);
|
|
152
|
+
console.log('Two scenarios will run sequentially. Each spawns 3 parallel shots.');
|
|
153
|
+
|
|
154
|
+
let assertFailures = 0;
|
|
155
|
+
|
|
156
|
+
// Scenario 1: known-GOOD ship
|
|
157
|
+
console.log('\n>>> Scenario 1: known-GOOD ship (tiny, complete change)');
|
|
158
|
+
const good = await grader.gradeSubagent({
|
|
159
|
+
task: GOOD_TASK,
|
|
160
|
+
valueSummary: GOOD_VALUE_SUMMARY,
|
|
161
|
+
diff: GOOD_DIFF,
|
|
162
|
+
changedFiles: GOOD_CHANGED_FILES,
|
|
163
|
+
});
|
|
164
|
+
summarize(good, 'Scenario 1: known-GOOD');
|
|
165
|
+
if (!good.passed) {
|
|
166
|
+
console.error('ASSERT FAIL: known-GOOD ship did not pass the grader.');
|
|
167
|
+
assertFailures++;
|
|
168
|
+
}
|
|
169
|
+
const goodBlockers = (good.issues || []).filter((i) => i.severity === 'blocker').length;
|
|
170
|
+
if (goodBlockers > 0) {
|
|
171
|
+
console.error(`ASSERT FAIL: known-GOOD ship has ${goodBlockers} blocker issues.`);
|
|
172
|
+
assertFailures++;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Scenario 2: known-BAD ship
|
|
176
|
+
console.log('\n>>> Scenario 2: known-BAD ship (TODO/FIXME, value_summary overpromises)');
|
|
177
|
+
const bad = await grader.gradeSubagent({
|
|
178
|
+
task: BAD_TASK,
|
|
179
|
+
valueSummary: BAD_VALUE_SUMMARY,
|
|
180
|
+
diff: BAD_DIFF,
|
|
181
|
+
changedFiles: BAD_CHANGED_FILES,
|
|
182
|
+
});
|
|
183
|
+
summarize(bad, 'Scenario 2: known-BAD');
|
|
184
|
+
if (bad.passed) {
|
|
185
|
+
console.error('ASSERT FAIL: known-BAD ship passed the grader (it should not).');
|
|
186
|
+
assertFailures++;
|
|
187
|
+
}
|
|
188
|
+
if ((bad.issues || []).length === 0) {
|
|
189
|
+
console.error('ASSERT FAIL: known-BAD ship produced zero issues — expected at least one.');
|
|
190
|
+
assertFailures++;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
console.log('');
|
|
194
|
+
console.log('===========================================================');
|
|
195
|
+
if (assertFailures === 0) {
|
|
196
|
+
console.log('Smoke OK — grader gate works as expected (good passes, bad fails with issues).');
|
|
197
|
+
process.exit(0);
|
|
198
|
+
} else {
|
|
199
|
+
console.error(`Smoke FAILED — ${assertFailures} assertion(s) did not hold.`);
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
})().catch((err) => {
|
|
203
|
+
console.error('Smoke crashed:', err);
|
|
204
|
+
process.exit(2);
|
|
205
|
+
});
|