@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,125 @@
|
|
|
1
|
+
# 0024 — Multi-Agent System (MAS) architecture
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted — all phases shipped (Phase 4.5, autonomous background dispatch, shipped [#458](https://example.com/builders#/task/458); INERT until `OTB_AUTONOMY_ENABLED=1`). See *Phase plan & implementation history* below.
|
|
4
|
+
- **Date:** 2026-05-29 (Phases 1–3); 2026-05-30 (Phases 4–5); Phase 6 + C7 followed.
|
|
5
|
+
- **Deciders:** Lars Kristensen (Archon), Claude
|
|
6
|
+
- **Track:** `internal` (GDS)
|
|
7
|
+
- **Supersedes:** none. Extends [ADR 0010](0010-pms-architecture.md) (GDS architecture), [ADR 0016](<redacted>.md) (trust boundary), [ADR 0017](<redacted>.md) (economy lens — the first piece of the Grader's worker decomposition).
|
|
8
|
+
|
|
9
|
+
## Context
|
|
10
|
+
|
|
11
|
+
As the GDS opens to multiple builders, three structural risks scale faster than headcount:
|
|
12
|
+
|
|
13
|
+
1. **The ship-time grader is lenient by construction.** [`src/bongos/grader.js`](../../src/bongos/grader.js) v2 (V3.R18 / [#209](https://example.com/builders#/task/209)) runs a *single* Opus subagent against the diff. Opus wrote the code; Opus grades it. Academic LLM-as-judge work (Zheng et al. 2023, Chiang & Lee 2023) consistently documents ~10–15% same-family inflation. The prompt asks "what score?" rather than "find what's wrong, then decide if it passes" — the default-to-pass framing is the bias. The recorded 14-day passing rate (65/75 = 87%) is suspiciously high for un-calibrated work.
|
|
14
|
+
|
|
15
|
+
2. **Methodology hygiene is reactive.** Documentation drift, dead code, and architectural sprawl are caught (if at all) by `overnight-code-review` and `repo-simplify-sweep` — both downstream of merge, both advisory, both already overfilling. No upstream gate looks at the *system* the way the grader looks at the diff.
|
|
16
|
+
|
|
17
|
+
3. **No standing entity watches the symphony.** Cron routines fire on a clock; skills fire when a builder remembers to invoke them. Nothing watches a builder's session in flight and dispatches the right specialist at the right moment.
|
|
18
|
+
|
|
19
|
+
The user-proposed agent hierarchy (Conductor → Delegators → Workers) is a 3-tier orchestrator that names these gaps. The research literature (Anthropic's multi-agent research system, "Building Effective Agents" patterns, MetaGPT post-mortems) consistently shows 2-tier orchestration beats 3-tier in practice: deeper hierarchies amplify intent-loss between layers. The decision below collapses the proposal to 2 tiers while keeping the user's specialization intent.
|
|
20
|
+
|
|
21
|
+
## Decision
|
|
22
|
+
|
|
23
|
+
Adopt a **2-tier multi-agent architecture** with one persistent agent and three on-demand roles, building incrementally over six phases.
|
|
24
|
+
|
|
25
|
+
### The cast
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
┌──────────────────┐
|
|
29
|
+
│ CONDUCTOR │ persistent · Opus
|
|
30
|
+
│ (UserPromptSubmit hook)
|
|
31
|
+
│ watches triggers, suggests / dispatches
|
|
32
|
+
└────────┬─────────┘
|
|
33
|
+
│ proposes — never disposes (no new permissions; inherits builder rank)
|
|
34
|
+
┌───────────────────────┼───────────────────────┐
|
|
35
|
+
▼ ▼ ▼
|
|
36
|
+
╔══════════╗ ╔══════════╗ ╔══════════╗
|
|
37
|
+
║ GRADER ║ ║ ARCHITECT║ ║ BFG ║
|
|
38
|
+
║ on /ship ║ ║quarterly ║ ║post-ship │
|
|
39
|
+
╚════╤═════╝ ╚════╤═════╝ ╚════╤═════╝
|
|
40
|
+
│ │ │
|
|
41
|
+
┌────┴────┬─────────────┐ audits → idea_inbox CLAUDE.md ↔ reality
|
|
42
|
+
▼ ▼ ▼ memory graph hygiene
|
|
43
|
+
HACKER NARC EFFICIENCY (no workers yet)
|
|
44
|
+
red-team completion MONGER
|
|
45
|
+
cost/perf
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**One persistent agent: the Conductor.** Implemented as a `UserPromptSubmit` hook in `.claude/settings.json`. Runs per builder turn. Inherits the builder's rank — no new authority. Output is advisory: it suggests `/builder-redteam` on security-sensitive edits, suggests Grader pre-flight before `/builder-ship`, dispatches BFG after doc edits, and so on. **Conductor proposes; the builder confirms.** Anything that touches a rank-gated route still goes through the existing DB-enforced check ([ADR 0016](<redacted>.md)) — the Conductor cannot grant or bypass authority.
|
|
49
|
+
|
|
50
|
+
**Three invoked roles, summoned by trigger, not persistent:**
|
|
51
|
+
|
|
52
|
+
- **Grader** (on `/builder-ship`). The ship-time gate. Phase 1 makes it strict (default-fail framing + cross-family Sonnet grading Opus's work + 3-shot unanimous-PASS); Phase 2 decomposes it into a worker panel: *Narc* (semantic completion — task description vs diff), *Quality* (code quality + advisory economy), *Hacker* (security red-team — wraps `/builder-redteam` as a CI gate), *Efficiency Monger* (runtime cost / hot-path performance). Unanimous-PASS gate; non-unanimous falls through to the manual-confirm release valve. Plus a deterministic route-rank pre-pass (C7).
|
|
53
|
+
- **Architect** (quarterly cadence + Conductor nudge). Bounded-scope audits feed `docs/audits/<scope>-<date>.md` + `idea_inbox` seeds. Each quarterly audit becomes the foundational input for the next version's planning session. *No workers yet* — the Architect does its own work flexibly per the user's "delegators without workers do the work themselves" rule.
|
|
54
|
+
- **BFG** (post-ship + pre-cron). Memory + index hygiene at its root — audits CLAUDE.md claims against DB reality, prunes stale references, verifies `[[links]]` resolve. **Widened in [ADR 0026](<redacted>.md) and now shipped (Phase 6 complete):** it also adds DB counter-vs-ledger drift checks (6A.2), scores builders + propagates transferable practice (6B), and operates the audited cross-builder memory WRITE path for dreams + transparent corrections (6C). *No grader-style workers — it does its own work (the "delegators without workers do the work themselves" rule).* Vector-store retrieval still deferred — the MEMORY.md graph + frontmatter suffices.
|
|
55
|
+
|
|
56
|
+
### Why 2 tiers, not 3
|
|
57
|
+
|
|
58
|
+
The user's original proposal had Conductor → Delegator → Worker. Three reasons to collapse:
|
|
59
|
+
|
|
60
|
+
1. **Empirical.** Anthropic's multi-agent research system is deliberately 2-tier; their published numbers (90% improvement on breadth-first research, 15× tokens) are for that shape. No published multi-agent system the team has read about achieves better-than-2-tier coordination at scale.
|
|
61
|
+
2. **Information loss.** Every hand-off between agents is a lossy translation of intent. Three hops compound. The Conductor → Worker direct path keeps intent intact.
|
|
62
|
+
3. **The middle tier was a category error.** A "Delegator that has no workers does the work itself" is just a *Specialist* with a fancier name. Reifying the middle creates a permissions question (can a Delegator grant Workers powers it doesn't have?) and an attribution question (who gets the credit / blame?) that 2-tier sidesteps.
|
|
63
|
+
|
|
64
|
+
The user's specialization intent is preserved: the Grader runs a worker panel; the Architect and the BFG do their own work (no grader-style workers) and can grow them if the "do it repeatedly → codify as worker" rule ever fires.
|
|
65
|
+
|
|
66
|
+
### The Musk algorithm applied to the proposal
|
|
67
|
+
|
|
68
|
+
Musk's 5-step engineering algorithm: (1) make requirements less dumb, (2) delete, (3) simplify, (4) accelerate, (5) automate — "if you're not adding 10% back, you didn't delete enough." Applied to the original proposal:
|
|
69
|
+
|
|
70
|
+
- **Project Manager (deleted):** what the Conductor does. Reprioritization *is* conducting. Splitting it doubles the surface for no specialization.
|
|
71
|
+
- **Janitor (deleted as standalone, merged into Architect):** cleanup is downstream of an architecture decision ("delete X"). The existing `repo-simplify-sweep` + `overnight-code-review` crons already cover the autonomous cleanup loop; the Architect's audit work *feeds* them.
|
|
72
|
+
- **BFG vs Architect (kept separate):** boundary sharpened. BFG owns *current truth* (memory hygiene, live state). Architect owns *future structure* (forward-looking design, version-foundation audits). Distinct enough they won't fight over files.
|
|
73
|
+
|
|
74
|
+
Reduced cast: **4 agents, not 6** (1 persistent + 3 invoked).
|
|
75
|
+
|
|
76
|
+
**Grader strictness — strict-first, loosen-later.** The grader is the load-bearing first change (its output is consumed by every shipped task). It does not relax during calibration; if it stalls genuine work we tune the prompt, not the gate, with the manual-confirm endpoint (`POST /tasks/:id/confirm`) as the emergency release valve. New grader signals (`shots[]`, `grader_model`, per-worker scores) land in the jsonb `task_grades.signals` column with no migration; top-level `rubric_scores` get the median across shots. This mirrors how the economy lens earned its teeth ([ADR 0017](<redacted>.md)): advisory → calibrate → gate.
|
|
77
|
+
|
|
78
|
+
## Phase plan & implementation history
|
|
79
|
+
|
|
80
|
+
Built incrementally over six phases, each independently shippable and required to earn its keep before the next ("is this earning its tokens?" — delete the phase if not). **All shipped:**
|
|
81
|
+
|
|
82
|
+
- **1** — strict grader: default-fail framing + cross-family Sonnet + 3-shot unanimous.
|
|
83
|
+
- **2** — the grader's 4-worker panel (Narc · Quality · Hacker · Efficiency Monger) replacing the 3-shot generalist, unanimous-PASS gate; + server audit-trail forwarding of `security_score`/`efficiency_score`.
|
|
84
|
+
- **3** — Conductor as a deterministic (zero-LLM) `UserPromptSubmit` hook, advisory only.
|
|
85
|
+
- **4** — Conductor **session-mediated** dispatch (`scripts/gds/conductor-dispatch.js` runs any specialist on the working diff, reusing the grader-workers machinery).
|
|
86
|
+
- **4.5** — Conductor **autonomous background** dispatch (`conductor-dispatch.js auto-dispatch`): selects the next claimable autonomous task *without a human prompt* and emits its `/builder-claim` directive for a runner to execute. It **proposes, never disposes** in the autonomous path too — the selector emits the directive; the runner + ship pipeline (where ADR 0016's DB gates and the grader still bite) is what claims, builds, and lands. Gated by the same `scripts/gds/autonomy-gate.js` precheck the nightly routines use (master kill-switch + MTD spend brake + no-signal skip), so it is **INERT until `OTB_AUTONOMY_ENABLED=1`**. The candidate feed is the protected-path-filtered `fit:'autonomous'` view (SR-12) — the permission/methodology/deploy core can never be auto-selected.
|
|
87
|
+
- **5** — Architect role + first audit (`scripts/gds/architect-audit.js --scope` → `docs/audits/` + idea_inbox seeds; on-demand, not cron'd).
|
|
88
|
+
- **6** — BFG built out well past bootstrap (doc/index + per-builder memory hygiene, DB counter-vs-ledger drift, cross-builder read + interaction-quality scoring, and the first audited cross-builder memory WRITE path — identity-gated, kill-switched, builder-reversible). Charter: [ADR 0026](<redacted>.md); session-inefficiency evaluator (cluster 6D): [ADR 0027](<redacted>.md).
|
|
89
|
+
- **C7** — the grader's deterministic **route-rank pre-pass** (`src/bongos/route-rank-check.js`, shared via `grader.routeRankPrePass()` by the ship-time panel and `conductor-dispatch.js`): every route must classify to a known rank; write-route `unknown` → hard fail. The deterministic-first → LLM-on-demand pattern; C7's periodic auditor, in-context at ship time.
|
|
90
|
+
|
|
91
|
+
Per-phase scope, rationale, "out of scope", and ship detail (incl. the Phase-1 first-ship calibration data + the `Number(null)=0` self-ship learning) live in the shipping tasks + the session logs — this ADR is the decision record, not the changelog. Phase tasks: [#395](https://example.com/builders#/task/395) (1) · [#410](https://example.com/builders#/task/410)/[#413](https://example.com/builders#/task/413)/[#416](https://example.com/builders#/task/416)/[#421](https://example.com/builders#/task/421)/[#423](https://example.com/builders#/task/423) (2) · [#427](https://example.com/builders#/task/427) (3) · [#439](https://example.com/builders#/task/439) (4) · [#459](https://example.com/builders#/task/459) (5) · [#442](https://example.com/builders#/task/442)–[#448](https://example.com/builders#/task/448) (6) · [#475](https://example.com/builders#/task/475) (C7) · [#458](https://example.com/builders#/task/458) (4.5).
|
|
92
|
+
|
|
93
|
+
## Consequences
|
|
94
|
+
|
|
95
|
+
**Good:**
|
|
96
|
+
|
|
97
|
+
- The trust gate at `/builder-ship` actually bites. Calibration data — not vibes — drives future tightening.
|
|
98
|
+
- Cost is ~neutral: 3× Sonnet ≈ 1× Opus (prior). Grader cost-per-shipped-task does not balloon.
|
|
99
|
+
- Architecture-ready for per-builder model preferences ([ADR 0021](<redacted>.md)): when GDS-V4 ships builder-configurable model allocation, the `selectGraderModel(builderModel)` function becomes the obvious extension point.
|
|
100
|
+
- Trust boundary preserved: nothing here grants new permissions; the Conductor (Phase 3+) inherits builder rank and proposes, never disposes ([ADR 0016](<redacted>.md) stays load-bearing).
|
|
101
|
+
- The original Delegators (Project Manager, Janitor) are *deleted* rather than built — the Musk rule applied to ourselves.
|
|
102
|
+
|
|
103
|
+
**Bad / accepted:**
|
|
104
|
+
|
|
105
|
+
- <redacted> will likely stall at `completed`. Builders need to know this; the deploy banner should warn.
|
|
106
|
+
- Sonnet may grade Sonnet builders same-family (when those exist). The cross-family premise assumes Opus builders. Phase 2's per-builder model-selection logic fixes this; Phase 1 accepts the assumption.
|
|
107
|
+
- Three concurrent Sonnet subprocess invocations slow ship by ~1.5× the longest single shot (parallel, not serial — but the slowest shot still gates). Acceptable trade vs the leniency cost.
|
|
108
|
+
- If 3 Sonnets agree too much (insufficient disagreement signal), the unanimous gate is theatrical. Calibration window will reveal this; Phase 1.5 mixes Opus into the panel if needed.
|
|
109
|
+
|
|
110
|
+
**Reversibility:**
|
|
111
|
+
|
|
112
|
+
- Phase 1 can be reverted by setting the rubric's `v3` entry's `shots: 1` and `default_model: claude-opus-4-7` (the field is `default_model`, not `model` — the latter is the v2 field name). The shot-aggregation code stays; the policy reverts. No migration needed.
|
|
113
|
+
- The MAS hierarchy as a whole is reversible up through Phase 6. The persistent Conductor hook is the only piece that, once wired, will create dependency on its trigger taxonomy; deleting the hook restores prior behavior.
|
|
114
|
+
|
|
115
|
+
## References
|
|
116
|
+
|
|
117
|
+
- [ADR 0010](0010-pms-architecture.md) — GDS (then PMS) architecture
|
|
118
|
+
- [ADR 0016](<redacted>.md) — trust boundary (Conductor must not bypass)
|
|
119
|
+
- [ADR 0017](<redacted>.md) — economy lens (first Grader worker, retroactively)
|
|
120
|
+
- [ADR 0021](<redacted>.md) — per-builder model preferences (Phase 1's hardcoded Sonnet generalizes here)
|
|
121
|
+
- Anthropic, "Building Effective Agents" (Schluntz & Zhang, Dec 2024) — orchestrator-workers and evaluator-optimizer patterns
|
|
122
|
+
- Anthropic, "How we built our multi-agent research system" (Engineering blog, 2025) — empirical 2-tier orchestration, ~15× token cost
|
|
123
|
+
- Zheng et al., "Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena" (NeurIPS 2023) — same-family judge inflation
|
|
124
|
+
- Chiang & Lee, "Can Large Language Models Be an Alternative to Human Evaluations?" (ACL 2023) — LLM-judge sycophancy
|
|
125
|
+
- Musk's 5-step engineering algorithm — applied to the proposal itself, not just to its outputs
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# ADR 0025 — Offsite backup vendor: DigitalOcean Spaces
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-05-30
|
|
4
|
+
**Context:** Task [#415](https://example.com/builders#/task/415) (V3.R62-offsite), claim `#338`, GDS-V3 criterion C8 ("memory is local-first, server-canonical on ship" — which depends on the GDS DB surviving whole-droplet loss). Companion to the local nightly backup filed by [#412](https://example.com/builders#/task/412) (V3.R62-precondition, [`docs/recipes/gds-db-backup.md`](../recipes/gds-db-backup.md)) and the secrets policy in [ADR 0022](0022-secrets-policy.md). Sits under [ADR 0024 §5](<redacted>.md) (backup cadence).
|
|
5
|
+
**Status:** Accepted.
|
|
6
|
+
|
|
7
|
+
## Problem
|
|
8
|
+
|
|
9
|
+
The local nightly `pg_dump` ([#412](https://example.com/builders#/task/412)) writes gzipped dumps to `/var/backups/gds/` — on the **same physical disk** (`/dev/vda1`) as the live database. That protects against the likely failures (bad migration, accidental `DROP`, schema corruption, an LLM writing a row it shouldn't) but **not** whole-droplet loss: provider failure, accidental droplet termination, or disk destruction takes the dumps with the database.
|
|
10
|
+
|
|
11
|
+
C8 makes builder memory server-canonical on ship — so the GDS DB is now the single home for every builder's synced memory, not just work-tracking state. Losing it loses that too. We need a copy that lives somewhere the droplet's disk dying cannot reach.
|
|
12
|
+
|
|
13
|
+
We must pick an off-droplet storage target. The budget posture (CLAUDE.md §4) is "cheapest viable; document the trade-off in an ADR when the more expensive option is chosen." We chose the more expensive option, so this ADR records why.
|
|
14
|
+
|
|
15
|
+
## Options considered
|
|
16
|
+
|
|
17
|
+
| Option | Cost | Notes |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| **Backblaze B2** | ~$0/mo at our volume (10 GB free; dumps are sub-1 MB) | Cheapest. Separate vendor, separate account, separate billing, separate credential lifecycle. S3-compatible API. |
|
|
20
|
+
| **DigitalOcean Spaces** ✅ | $5/mo flat (250 GB + 1 TB transfer included) | Same vendor as the droplet — one console, one bill, one support relationship, one place to reason about region/latency. S3-compatible API. |
|
|
21
|
+
| AWS S3 | ~$0 at our size but per-request + egress pricing | Third vendor, IAM complexity, surprise-bill risk. Rejected. |
|
|
22
|
+
|
|
23
|
+
## Decision
|
|
24
|
+
|
|
25
|
+
**Use DigitalOcean Spaces, in the NYC3 region** (same region as the droplet).
|
|
26
|
+
|
|
27
|
+
Rationale for accepting the $5/mo over B2's ~$0:
|
|
28
|
+
|
|
29
|
+
1. **One vendor.** The droplet, DNS-adjacent infra, and now backups all live in one DigitalOcean account. A non-software-engineer operator (the prompter — CLAUDE.md §2) manages one console and one bill, not two. The operational simplicity is worth $60/year on a $5,000 project budget.
|
|
30
|
+
2. **Same region as the droplet (NYC3).** Lowest-latency upload path; no cross-provider egress to reason about.
|
|
31
|
+
3. **Flat, predictable price.** $5/mo with generous included transfer — no per-request or surprise-egress billing to monitor. Predictability matters more than absolute floor at this scale.
|
|
32
|
+
4. **The scaffolding already pointed here.** The retired task-[#7](https://example.com/builders#/task/7) backup (see below) was already written against the `SPACES_*` env shape, so DO Spaces is the lowest-friction path to a *working* offsite copy.
|
|
33
|
+
|
|
34
|
+
B2 remains the obvious fallback if the $5/mo ever needs trimming — the uploader is plain S3 (`boto3` + `endpoint_url`), so re-pointing it at B2 is a credentials + endpoint change, nothing structural.
|
|
35
|
+
|
|
36
|
+
## What this replaces — the retired [#7](https://example.com/builders#/task/7) backup
|
|
37
|
+
|
|
38
|
+
A previous task ([#7](https://example.com/builders#/task/7), V1 era) shipped `scripts/backup.sh` + `/etc/cron.d/otb-backup`: a daily `pg_dump → DO Spaces` cron. By the time [#412](https://example.com/builders#/task/412)/[#415](https://example.com/builders#/task/415) were planned it had been **forgotten** — which is why [#415](https://example.com/builders#/task/415) was filed "vendor TBD." On inspection (2026-05-30) it was **deployed but dead**: `~/.config/otb/spaces.env` held all-empty credentials, no Space was ever created, and `/var/log/otb-backup.log` did not exist (it had never successfully run).
|
|
39
|
+
|
|
40
|
+
Rather than leave two competing, half-broken backup systems, [#415](https://example.com/builders#/task/415) **retires** the [#7](https://example.com/builders#/task/7) setup and replaces it with one clean story:
|
|
41
|
+
|
|
42
|
+
- **Local daily** — `gds-db-backup.timer` ([#412](https://example.com/builders#/task/412)), `pg_dump` → `/var/backups/gds/`, 30-day retention.
|
|
43
|
+
- **Offsite weekly** — `gds-db-offsite.timer` ([#415](https://example.com/builders#/task/415)), copies the *latest existing* local dump → DO Spaces, 4-week retention. It does **not** take its own `pg_dump`; it archives what [#412](https://example.com/builders#/task/412) already produced.
|
|
44
|
+
|
|
45
|
+
Removed by [#415](https://example.com/builders#/task/415): `scripts/backup.sh`, `infra/backup/otb-backup.cron`, the droplet's `/etc/cron.d/otb-backup`, and the empty `~/.config/otb/spaces.env` stub.
|
|
46
|
+
|
|
47
|
+
## Mechanics
|
|
48
|
+
|
|
49
|
+
- **Credentials** live at `/etc/example/spaces.env` (chmod 600, owned by `lars`), never in the repo — per [ADR 0022](0022-secrets-policy.md). Vars: `SPACES_KEY`, `SPACES_SECRET`, `SPACES_BUCKET`, `SPACES_REGION`, `SPACES_ENDPOINT`. systemd injects them via `EnvironmentFile`; manual runs source the same file.
|
|
50
|
+
- **Cadence:** Sunday 05:00 UTC, one hour after the 04:00 UTC local dump, so the offsite copy is always same-day-fresh.
|
|
51
|
+
- **Retention:** 4 weekly copies in the Space (`GDS_OFFSITE_KEEP=4`), pruned oldest-first under the `gds-offsite/` key prefix. ~1 month of offsite snapshots. Sub-1 MB each, so storage is a rounding error against the 250 GB tier.
|
|
52
|
+
- **Restore drill:** quarterly download-and-restore from the Space, documented in [`docs/recipes/gds-db-backup.md`](../recipes/gds-db-backup.md).
|
|
53
|
+
|
|
54
|
+
## Consequences
|
|
55
|
+
|
|
56
|
+
- **+$5/mo** recurring (~$60/yr) against the project budget. Acceptable and documented.
|
|
57
|
+
- Whole-droplet loss now costs at most ~1 week of writes (last weekly offsite copy), down from "everything." Combined with the daily local dump, the day-to-day exposure is still ≤24h.
|
|
58
|
+
- One credential to rotate (the Spaces key) per [ADR 0022](0022-secrets-policy.md) rotation procedure.
|
|
59
|
+
- A second vendor relationship is avoided; if cost pressure appears later, re-pointing the uploader at Backblaze B2 is a config change, not a rewrite.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# ADR 0025 — Structured criterion↔task link (`task_criteria`)
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-05-30
|
|
4
|
+
**Context:** GDS-V3, task [#435](https://example.com/builders#/task/435) (Project status queryability — structured criterion↔task link + /status skill + Conductor nudge).
|
|
5
|
+
**Status:** Accepted.
|
|
6
|
+
|
|
7
|
+
## Problem
|
|
8
|
+
|
|
9
|
+
Answering a routine question — "what's left to satisfy criterion C8?" — took ~10 sequential GDS calls. The reason: the relationship between a done-when criterion and the tasks that satisfy it existed **only as prose** inside each task's `description`:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
**Criterion:** C8 — cloneable repo, local-first memory, server-canonical on ship.
|
|
13
|
+
…
|
|
14
|
+
**Cross-refs:** Gates V3.R55–V3.R63 (the C8 implementation tasks).
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
To answer the question a session had to: read `done_when_criteria` to find C8, grep `scripts/gds/seed-v3-tasks.js` to discover which tasks claim that criterion, eyeball a "Gates R55–R63" sentence, then re-query each task's live status. That is archaeology, not a query — slow, error-prone, and impossible to surface on the public status dashboard.
|
|
18
|
+
|
|
19
|
+
There was already a link, but the wrong one: `done_when_criteria.satisfied_by_task_id` is a **single, reverse** pointer — the one ship-task that *closed* a criterion. We needed the **forward, many** relation: the many tasks that *gate* a criterion, before it's closed.
|
|
20
|
+
|
|
21
|
+
## Decision
|
|
22
|
+
|
|
23
|
+
Add a dedicated **many-to-many join table** `task_criteria(task_id, criterion_id)` (migration 055), referencing `tasks(id)` and `done_when_criteria(id)`. A new read helper `criterionProgress(versionId)` joins it to roll up, per criterion: the gating tasks, their live statuses, and what remains. Surfaced as the public `GET /api/gds/versions/:id/progress`, consumed by `scripts/gds/status.js` + the `/status` skill, and routed to by a Conductor nudge.
|
|
24
|
+
|
|
25
|
+
### Why many-to-many (rejected alternatives)
|
|
26
|
+
|
|
27
|
+
- **A `criterion_id` column on `tasks`** — rejected: tasks routinely contribute to *multiple* criteria (prose like "C2, C7"). A single FK column can't represent that without a delimiter hack.
|
|
28
|
+
- **Reusing `satisfied_by_task_id`** — rejected: it's singular and semantically the *closing* task, not the *gating* set. Overloading it would conflate "this task finished the criterion" with "this task is one of several that build toward it."
|
|
29
|
+
- **Keep parsing prose at read time** — rejected: that's the status quo whose cost we're removing. Every consumer (CLI, dashboard, future agents) would re-implement a fragile parser.
|
|
30
|
+
|
|
31
|
+
### The backfill is positional — and that fragility is the point
|
|
32
|
+
|
|
33
|
+
Migration 055 backfills the table from the existing prose. The catch: the prose says "C8" but a criterion's `criterion_id` is a semantic slug (`cloneable-local-memory-server-sync`). **"Cn" is the 1-based position** by `(sort_order, criterion_id)` within the version. So the backfill ranks each version's criteria with `ROW_NUMBER()` and joins prose "Cn" → the n-th criterion of the *same* version.
|
|
34
|
+
|
|
35
|
+
This positional decode is brittle — reorder the criteria and old prose references drift. That brittleness is exactly why the structured link must exist: **after this backfill, `task_criteria` is canonical**, and prose `Cn` references are legacy. New tasks should populate the join table directly rather than relying on the decode being re-run (it is not — it's a one-time historical migration).
|
|
36
|
+
|
|
37
|
+
`cnum` is recomputed live (same `ROW_NUMBER()` ordering) in `criterionProgress`, so the "C8" label the user sees stays correct even if criteria are added or reordered later. Tasks whose Criterion line carries no "Cn" token (e.g. "cross-cutting (identity)") are left unlinked and counted as `unattributed_tasks` — the rollup reports coverage honestly rather than guessing.
|
|
38
|
+
|
|
39
|
+
## Consequences
|
|
40
|
+
|
|
41
|
+
- **One-call status.** `/status C8` answers in a single request what previously took ~10. The public dashboard can adopt the same endpoint.
|
|
42
|
+
- **The Conductor stays advisory + zero-cost.** It gains one regex trigger that *routes* status-intent prompts to `/status` (proposes, never disposes; no LLM call) — it does not answer questions itself. Consistent with [ADR 0024 (MAS)](<redacted>.md) Phase 3.
|
|
43
|
+
- **Follow-up needed:** task creation does not yet populate `task_criteria`, so tasks created after the backfill are unlinked until a manage endpoint / planning-flow wire-up lands. Filed as a follow-up task at ship time. Until then `/status` under-counts new work, which `unattributed_tasks` makes visible.
|
|
44
|
+
- **No authority change.** The endpoint is public read-only (same posture as `/versions/:id/done-when`); the join table carries no permission semantics. ADR 0016 trust boundary is untouched.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# 0026 — The BFG: documentation/memory hygiene + cross-builder learning + transparent correction
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted + Shipped. Phase 6 of the MAS is **built** — implemented in [`modules/sessions/bfg.js`](../../modules/sessions/bfg.js) (`scoreMemoryQuality`, `extractTransferablePatterns`, `buildCorrection`, …; carved into the `sessions` module at BV1.R82 / ADR 0093 §1).
|
|
4
|
+
- **Date:** 2026-05-30
|
|
5
|
+
- **Deciders:** Lars Kristensen (Archon), Claude
|
|
6
|
+
- **Track:** `internal` (GDS)
|
|
7
|
+
- **Context task:** GDS-V3 [#441](https://example.com/builders#/task/441) (this design task — ADR + task breakdown only; no implementation).
|
|
8
|
+
|
|
9
|
+
> **Numbering note:** this ADR was authored as `0025` but renumbered to **0026** on the same day, after a merge from `main` surfaced an already-shipped [`0025` — Offsite backup vendor](<redacted>.md) (task [#415](https://example.com/builders#/task/415)). The shipped ADR keeps `0025`; this one moves. The backlog implementation tasks **[#442](https://example.com/builders#/task/442)–[#448](https://example.com/builders#/task/448)** were filed *before* the renumber and so reference this ADR as "ADR 0025" in their descriptions (the GDS has no description-edit endpoint and there was no DB access to correct them in-session). The sub-phase labels (**6A.1 … 6C.3**) are stable and unambiguous — when a task says "ADR 0025 section 6A.1", read **this** ADR (0026), section 6A.1.
|
|
10
|
+
- **Extends:** [ADR 0024 — Multi-Agent System architecture](<redacted>.md) (the BFG is its Phase 6); [ADR 0024 — Cloneable repo + local-first memory](<redacted>.md) (the `builder_memory` store this operates on); [ADR 0016 — Trust boundary](<redacted>.md) (this ADR deliberately and narrowly *punctures* the no-cross-builder-write rule — recorded here as a conscious exception). Touches the karma model ([migration 040](../../migrations/040_builder_karma.sql)) and the memory schema ([migration 054](../../migrations/054_builder_memory.sql)).
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
The **BFG** is the post-ship / pre-cron role in the MAS ([ADR 0024-mas](<redacted>.md)). Its Phase-6 charter there was deliberately narrow: *"memory hygiene — audit CLAUDE.md claims against DB reality, prune stale references, verify `[[links]]` resolve."* No code has been written yet.
|
|
15
|
+
|
|
16
|
+
On 2026-05-30 Lars expanded the BFG's remit to **two standing objectives**:
|
|
17
|
+
|
|
18
|
+
1. **Cleanliness of all documentation** — `*.md`, memory files, and anything doc-shaped that lives in the DB. The index must not drift from reality.
|
|
19
|
+
2. **The best, most "creative/intelligent" building experience for builders.** The mechanism Lars named: read every builder's memory, evaluate *how* they interact with the system, and when a builder is performing well, study their memory and propose to other builders what they should adopt. The BFG may also **plant "dreams"** — write a memory directly into another builder's store when it's an obvious improvement — and apply **corrections** to misbehaving builders.
|
|
20
|
+
|
|
21
|
+
This ADR records the architecture and, critically, the **boundaries** that turn that intent into something safe to build.
|
|
22
|
+
|
|
23
|
+
### What the substrate already gives us
|
|
24
|
+
|
|
25
|
+
- **Builder memory is server-canonical and per-builder isolated** — [`builder_memory`](../../src/bongos/routes/memory.js), `PRIMARY KEY (builder_id, path)`. The *only* cross-builder access that exists today is an **Archon-only, audit-logged, read-only** forensic path. **There is no cross-builder *write* path at all** — that was a conscious decision ([ADR 0016](<redacted>.md), [ADR 0024-memory](<redacted>.md) §4).
|
|
26
|
+
- **Karma** ([`karma_log`](../../migrations/040_builder_karma.sql)) is the existing good-citizenship reputation ledger (append-only, `granted_by` records who drove a delta, `NULL` = system).
|
|
27
|
+
- **Cron roles** live as `SKILL.md` files under [`.claude/scheduled-tasks/`](../../.claude/scheduled-tasks/); the read-only `overnight-code-review` routine is the closest existing pattern.
|
|
28
|
+
|
|
29
|
+
## Decision
|
|
30
|
+
|
|
31
|
+
The BFG gains three capability clusters (6A / 6B / 6C), built as independently-shippable sub-phases. Two cross-cutting rules govern all of them:
|
|
32
|
+
|
|
33
|
+
- **The BFG is a privileged *system* agent, not a rank bypass.** Its cross-builder powers are the existing Archon-forensic-read posture, extended to a narrow audited write. They are bound to a dedicated **BFG service principal** (a `builders` row flagged as system: cannot claim work, cannot earn drachmae) and are reachable *only* by that principal — never exposed on a self-serve route. No human or agent builder can ask the system to "read/write another builder's memory." **This is an enforcement requirement, not prose intent:** 6C.1's write endpoint must gate on the *exact principal identity*, not on rank — an Archon token (or any rank-escalated / stolen token) must be rejected at the write endpoint, and that refusal must be covered by a test. "Never exposed on a self-serve route" is a property the implementation has to encode, not a promise the ADR can keep on its own.
|
|
34
|
+
- **Every cross-builder operation — read *and* write — writes an `audit_log` row.** Writes are additionally **namespaced and attributed** so a builder can always see, and delete, exactly what the BFG put there. Nothing the BFG writes ever masquerades as the builder's own note.
|
|
35
|
+
|
|
36
|
+
### 6A — Hygiene (the original charter, widened)
|
|
37
|
+
|
|
38
|
+
Read-only auditor. Findings land as `idea_inbox` rows (one per finding, like `overnight-code-review`) plus a `docs/audits/bfg-<date>.md` report. The BFG **never** auto-mutates code or DB state — it reports.
|
|
39
|
+
|
|
40
|
+
- **Doc ↔ reality:** CLAUDE.md claims vs DB (`shipped` task IDs cited, version statuses, the rank enum, drachmae/karma model), `[[link]]` resolution, ADR cross-reference integrity + numbering gaps, `docs/file-map.md` vs the actual tree, onboarding-diagram `assertions.json` vs live facts.
|
|
41
|
+
- **Memory hygiene:** within each builder's *own* memory dir — dangling `[[links]]`, stale frontmatter, internal contradictions, duplicate facts (the same discipline the `consolidate-memory` skill applies, but agent-driven rather than human-invoked).
|
|
42
|
+
- **DB cleanliness:** cached-counter vs ledger drift (`builders.karma` vs `karma_log`, `total_credits` vs `credit_log`), orphaned rows, long-stale `idea_inbox` / `blockers`. Reported, never silently "fixed."
|
|
43
|
+
|
|
44
|
+
### 6B — Cross-builder learning ("read the room")
|
|
45
|
+
|
|
46
|
+
- **Read all builders' memory** through a BFG-principal-only, per-read audit-logged endpoint (same shape as the Archon forensic read).
|
|
47
|
+
- **Score interaction quality** by blending objective GDS signals (ships, grader pass rate, rework/abandon rate, karma, drachmae, methodology adherence visible in `audit_log` + conductor traces) with memory-quality heuristics.
|
|
48
|
+
- **Extract *transferable* patterns** from top performers — working habits and durable lessons, **not** builder-specific secrets, PII, or anything that only makes sense in that builder's context.
|
|
49
|
+
- **Propagate** as adoption suggestions to other builders (delivered via the 6C write path as clearly-marked BFG entries, or surfaced in the audit report).
|
|
50
|
+
|
|
51
|
+
### 6C — Dreams & correction (the write path — the load-bearing part)
|
|
52
|
+
|
|
53
|
+
This sub-phase creates the **first cross-builder memory write capability** in the system. It is the deliberate, bounded exception to [ADR 0016](<redacted>.md).
|
|
54
|
+
|
|
55
|
+
**Dreams (beneficial writes).** Lars chose **direct write** (audited + visible) over propose-only, for immediacy. The BFG writes the entry directly into the target builder's memory, constrained by:
|
|
56
|
+
- a dedicated, clearly-marked location — e.g. `bfg/dream-<slug>.md` (or a fenced `## BFG dreams` block) — never overwriting a builder's own files;
|
|
57
|
+
- frontmatter `type: bfg-dream`, `author: BFG`, `source_builder`, `date`, `rationale`;
|
|
58
|
+
- an `audit_log` row per write (`action: 'bfg_dream_write'`, target builder, path, rationale);
|
|
59
|
+
- self-announcing content — the builder always sees it is BFG-authored and can delete it.
|
|
60
|
+
|
|
61
|
+
**Correction (misbehaving builders).** Lars's explicit call: **transparent, attributed correction — NOT covert sabotage.** A correction is:
|
|
62
|
+
- a **visible BFG-authored corrective note** (`type: bfg-correction`) stating the observed behavior, the rule it broke, and the expected change; plus
|
|
63
|
+
- a **negative `karma_log` delta** with `reason: 'bfg_correction'`, `granted_by` = the BFG principal.
|
|
64
|
+
|
|
65
|
+
> **Explicit non-goal — "nightmares" are rejected.** The original framing imagined the BFG planting *false or harmful* memories to covertly *worsen* a builder's experience. The system will **never** write deceptive or deliberately-degrading content into anyone's memory. A tool whose purpose is to sabotage a builder through deception is out of scope by design; "documenting it" does not make covert sabotage acceptable. Correction is honest, visible, and reversible — same steering effect, no deception. This clause is the durable record of *why* the capability stops here.
|
|
66
|
+
|
|
67
|
+
### Identity & invocation
|
|
68
|
+
|
|
69
|
+
The BFG runs as a `SKILL.md` scheduled routine (post-ship / pre-cron cadence) and can be nudged by the Phase-4 Conductor on index-doc edits. The cross-builder endpoints (6B read, 6C write) are gated to the BFG service principal server-side. The Phase-4 dispatch path treats the BFG as a read-mostly agent; only the 6C routine, running as the principal, may write.
|
|
70
|
+
|
|
71
|
+
### Phase plan (created as backlog tasks by [#441](https://example.com/builders#/task/441))
|
|
72
|
+
|
|
73
|
+
| Sub-phase | Scope | Earns it |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| **6A.1** | Read-only hygiene auditor: doc↔reality + `[[link]]`/ADR/file-map checks → `idea_inbox` + `docs/audits/bfg-<date>.md`. As a `SKILL.md` routine. | The index stops drifting; zero new write surface. Ship this first. |
|
|
76
|
+
| **6A.2** | Extend the auditor with memory-hygiene + DB cached-vs-ledger drift checks (still report-only). | Hygiene covers all three artifact classes. |
|
|
77
|
+
| **6B.1** | BFG-principal-only, audit-logged cross-builder memory **read** endpoint + interaction-quality scorer. | "Read the room" exists; reuses the forensic-read audit pattern. |
|
|
78
|
+
| **6B.2** | Transferable-pattern extraction from top performers + adoption-suggestion generation. | Good practice propagates; the "most creative experience" objective gets teeth. |
|
|
79
|
+
| **6C.1** | Migration: BFG service principal (system builder, no-claim/no-drachmae) + cross-builder memory **write** endpoint (audited, namespaced, attributed) + `karma_log` reason `bfg_correction`. | The write substrate + trust-boundary exception land in one reviewable unit. |
|
|
80
|
+
| **6C.2** | Wire dream-writes + transparent corrections into the BFG routine; kill-switch; builder-visible attribution; delete affordance. | Dreams + correction work end-to-end, safely. |
|
|
81
|
+
| **6C.3** | Update [ADR 0024-mas](<redacted>.md) Phase-6 row + CLAUDE.md MAS index line. (Deferred out of [#441](https://example.com/builders#/task/441) — `CLAUDE.md` / `0024` are held by the active Phase-4 claim `#439`.) | The index reflects the shipped BFG. |
|
|
82
|
+
|
|
83
|
+
Each sub-phase must answer "is this earning its tokens?" before the next is built — the Musk gate, same as [ADR 0024-mas](<redacted>.md).
|
|
84
|
+
|
|
85
|
+
> **Sibling capability cluster — 6D (session-inefficiency evaluator), recorded in [ADR 0027](<redacted>.md).** The 6A/6B/6C clusters above cover the BFG's *hygiene* and *cross-builder memory learning* objectives. A later, separately-chartered cluster — **6D** — serves the same "best building experience" objective from a different angle: it ingests uploaded session transcripts and auto-runs the #506-style post-mortem across all sessions to surface systemic build-process waste (and mine top performers for good practice). It reuses this charter's §6C transparent-note path to deliver per-builder findings. See [ADR 0027](<redacted>.md); build tasks GDS-V4 [#540](https://example.com/builders#/task/540)–[#545](https://example.com/builders#/task/545).
|
|
86
|
+
|
|
87
|
+
## Alternatives considered
|
|
88
|
+
|
|
89
|
+
- **Covert "nightmares" (rejected).** The original ask imagined planting *false or harmful* memories to covertly worsen a misbehaving builder. Rejected outright: it is deception that causes real harm (wasted work, decisions seeded by lies), it has no consent, and an audit trail does not redeem it. Transparent correction (a visible, attributed note + a karma dock) achieves the same steering with none of that. This is the load-bearing rejection of this ADR.
|
|
90
|
+
- **Propose-only writes vs direct writes.** Propose-only (the BFG drops a clearly-marked *suggestion* the builder must accept) best preserves the isolation/consent spirit. Lars chose **direct write** for immediacy on "obvious improvements." We keep the consent spirit alive through visible attribution + namespaced files + delete-ability + per-write audit, and accept the residual risk (memory changing between sessions) in §Consequences.
|
|
91
|
+
- **Karma-only correction (no memory write).** Considered: never touch a misbehaving builder's memory, only dock karma + flag for Archon. Rejected as the *default* because a karma delta alone doesn't tell the builder *what* to change; the visible corrective note carries the actionable feedback. (Karma-only remains the right move when there's nothing constructive to write.)
|
|
92
|
+
- **Amend ADR 0024 vs a standalone ADR.** The BFG is Phase 6 of [ADR 0024-mas](<redacted>.md), so amending it was the obvious option. Chosen instead to write a standalone ADR because the new **cross-builder write path is a trust-boundary decision** that extends [ADR 0016](<redacted>.md) — significant enough to deserve its own record rather than a table-row footnote.
|
|
93
|
+
- **Vector store / semantic memory for hygiene + 6B scoring.** Deferred, consistent with [ADR 0024-mas](<redacted>.md)'s own "vector-store implementation deferred" call. The current markdown `MEMORY.md` graph + frontmatter is sufficient for 6A/6B; revisit only if manual + heuristic analysis proves insufficient.
|
|
94
|
+
|
|
95
|
+
## Consequences
|
|
96
|
+
|
|
97
|
+
**Good:**
|
|
98
|
+
- The index, memory, and DB stop drifting — a standing agent watches *current truth*, complementing the Architect's *future structure* (the boundary ADR 0024-mas drew).
|
|
99
|
+
- Good practice propagates across builders instead of dying in one builder's memory.
|
|
100
|
+
- The trust boundary stays *legible*: there is exactly one new cross-builder write path, bound to one system principal, fully audited and builder-visible.
|
|
101
|
+
|
|
102
|
+
**Bad / accepted:**
|
|
103
|
+
- **The isolation invariant is no longer absolute.** A builder's memory can change between sessions without their action. Mitigation: visible attribution + namespaced files + delete-ability + per-write audit. This residual risk is accepted in exchange for the immediacy Lars chose; revisit if it bites.
|
|
104
|
+
- A BFG service principal is a new privileged identity — a new thing to secure. It must never be claimable or loginable as a normal builder.
|
|
105
|
+
- Cross-builder reads touch every builder's memory; the audit trail is the only thing making that legible. The auditor must not leak one builder's private memory into another's via 6B extraction (the "transferable, not specific" rule is load-bearing, not advisory).
|
|
106
|
+
|
|
107
|
+
**Reversibility:**
|
|
108
|
+
- 6A is pure addition (a read-only routine) — delete the skill to revert.
|
|
109
|
+
- 6C is reversible by disabling the write endpoint (kill-switch) and deleting BFG-namespaced memory files; the `audit_log` makes every write enumerable for cleanup.
|
|
110
|
+
|
|
111
|
+
## References
|
|
112
|
+
|
|
113
|
+
- [ADR 0024 — Multi-Agent System architecture](<redacted>.md) — the BFG is Phase 6
|
|
114
|
+
- [ADR 0024 — Cloneable repo + local-first memory](<redacted>.md) — the `builder_memory` store + §4 isolation
|
|
115
|
+
- [ADR 0016 — Trust boundary](<redacted>.md) — the rule this ADR narrowly excepts
|
|
116
|
+
- [migration 040](../../migrations/040_builder_karma.sql) — karma ledger (correction deltas)
|
|
117
|
+
- [migration 054](../../migrations/054_builder_memory.sql) — memory schema (read + write target)
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# 0027 — The BFG session-inefficiency evaluator (auto-post-mortem of builder sessions)
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted + Shipped. The build (tasks **6D.1–6D.6**) was completed end-to-end — see the [2026-06-02 session log](../session-logs/<redacted>.md); this ADR is the charter it followed.
|
|
4
|
+
- **Date:** 2026-06-02
|
|
5
|
+
- **Deciders:** Lars Kristensen (Archon), Claude
|
|
6
|
+
- **Track:** `internal` (GDS)
|
|
7
|
+
- **Context tasks:** GDS-V4 **[#515](https://example.com/builders#/task/515)** (the capability umbrella) · **[#539](https://example.com/builders#/task/539)** (this design task — ADR + task breakdown only, no implementation; mirrors the design-only shape of [#441](<redacted>.md)).
|
|
8
|
+
- **Extends:** [ADR 0024 — Multi-Agent System architecture](<redacted>.md) (the BFG is its Phase 6) · [ADR 0026 — The BFG charter](<redacted>.md) (this adds a **new capability cluster, 6D**, to the BFG's "best building experience" objective) · [ADR 0016 — Trust boundary](<redacted>.md) (narrowly extended — session detail now lives server-side and is BFG-readable across builders) · [ADR 0022 — Secrets policy](0022-secrets-policy.md) (scrubbing on upload). Touches `credit_log` (drachmae), `karma_log`, `builders` (rank + tenure), `task_grades` (the upsert-unique gap), `session_logs`.
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
|
|
12
|
+
On **2026-06-01** Lars asked for a manual evaluation of the **[#506](https://example.com/builders#/task/506)** session — a one-line welcome-copy fix that burned ~90% of its tokens on process ceremony + footgun recovery rather than the actual change. The post-mortem ([session log](../session-logs/<redacted>.md)) produced three concrete systemic fixes — **[#513](https://example.com/builders#/task/513)** (trivial-diff fast-path for the grader), **[#514](https://example.com/builders#/task/514)** (self-explaining API error hints), **[#468](https://example.com/builders#/task/468)** (a stale smoke assertion) — plus a security finding (`#526`).
|
|
13
|
+
|
|
14
|
+
Lars wants that analysis **automated and run across every session**, to surface systemic build-process waste — and, as the inverse, to mine *top performers'* sessions for transferable good practice (the [ADR 0026](<redacted>.md) §6B objective). This ADR is the design; [#506](https://example.com/builders#/task/506) is the **hand-labeled seed/validation corpus**.
|
|
15
|
+
|
|
16
|
+
### The substrate problem (and the decision that resolves it)
|
|
17
|
+
|
|
18
|
+
The two candidate data sources don't overlap:
|
|
19
|
+
|
|
20
|
+
- **Claude Code transcripts** (`~/.claude/projects/.../*.jsonl`) carry the rich signal — per-turn token usage, tool calls, `is_error` flags, timings — exactly what the manual [#506](https://example.com/builders#/task/506) read. But they live **local, per-builder**, never on the server.
|
|
21
|
+
- **The GDS DB trail** (`session_logs`, `claims`, `task_grades`, `cost_log`) is **cross-builder** but coarse: wall-clock, outcomes, final grade — **no token-level detail**.
|
|
22
|
+
|
|
23
|
+
Two earlier framings were put to Lars and rejected (see Alternatives): a local-only `/session-review` slash command, and a server-side analyzer. **Lars's decision** resolves the substrate problem directly:
|
|
24
|
+
|
|
25
|
+
> **At ship time, upload the session's details to the server.** The BFG then runs as a **local Claude Code instance** (as it already does for hygiene, [ADR 0026](<redacted>.md) §6A.1) that **calls the server** to search across *all* sessions and deep-dive the interesting ones. The builder never runs anything — findings come to them.
|
|
26
|
+
|
|
27
|
+
This is the load-bearing choice: the rich data stops being local, so one cross-builder corpus serves both the waste-hunt and the good-practice mine, and the analysis stays where the BFG already lives (a Claude Code routine), not on the always-on $14/mo droplet.
|
|
28
|
+
|
|
29
|
+
## Decision
|
|
30
|
+
|
|
31
|
+
A **new BFG capability cluster — 6D** — built as independently-shippable sub-phases. Four parts to the flow; the builder only ever sees part 4.
|
|
32
|
+
|
|
33
|
+
### 1. Upload on ship (the keystone — 6D.1)
|
|
34
|
+
|
|
35
|
+
When `/builder-ship` lands a task, `ship.js` locates the active Claude Code session transcript, **scrubs secrets** ([ADR 0022](0022-secrets-policy.md)), and uploads it to a new server-side `session_records` table. Each record carries the fields Lars named, denormalized for query:
|
|
36
|
+
|
|
37
|
+
| Field | Source |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `session_id` | the Claude Code `sessionId` |
|
|
40
|
+
| `builder_id` | the shipping builder |
|
|
41
|
+
| `task_ids[]` | task(s) shipped from this session |
|
|
42
|
+
| `drachmae_earned` | the session's `credit_log` delta |
|
|
43
|
+
| `total_tokens` | summed transcript `usage` (input + output + cache) |
|
|
44
|
+
| `duration_seconds` | transcript first→last timestamp (or `session_logs`) |
|
|
45
|
+
| `started_at` / `ended_at` / `uploaded_at` | timestamps |
|
|
46
|
+
| `detail` | the **scrubbed** transcript payload (for deep-dive) |
|
|
47
|
+
| `metrics` (jsonb) | derived signals (overhead ratio, tool-error count, footgun flags) — computed at upload or lazily |
|
|
48
|
+
|
|
49
|
+
**Deduped per `session_id`** (a session that ships multiple tasks uploads once; `task_ids` accumulates). The upload is **fail-safe and non-blocking** — a failed or absent upload must *never* block a ship.
|
|
50
|
+
|
|
51
|
+
### 2. Store + serve — the query surface (6D.2)
|
|
52
|
+
|
|
53
|
+
The server stores and serves; it does **no analysis**. Two endpoints over `session_records`:
|
|
54
|
+
|
|
55
|
+
- **Search/filter** by *session* fields (`drachmae_earned`, `total_tokens`, `duration`, the derived metrics) **and joined `builders` fields** — **tenure** (`now − created_at`), **rank**, **karma**, **drachmae** (`total_credits`). So queries like *"rank = Xenos AND tenure < 7d AND overhead > 0.7"* (onboarding friction) or *"karma top-decile"* (good-practice mining) are expressible against one corpus.
|
|
56
|
+
- **Fetch one session's** full scrubbed detail for deep-dive.
|
|
57
|
+
|
|
58
|
+
Cross-builder reads are gated to the **BFG service principal** ([ADR 0026](<redacted>.md) §6B posture — the *exact principal identity*, not rank) and write an **`audit_log` row per read**. A builder may always read their *own* sessions self-serve. Filtering is plain SQL/keyword **for now** (semantic/vector deferred, consistent with [ADR 0024](<redacted>.md)/[0026](<redacted>.md)).
|
|
59
|
+
|
|
60
|
+
### 3. The BFG routine — local Claude Code, search → deep-dive → reason (6D.3)
|
|
61
|
+
|
|
62
|
+
A new BFG sub-routine, running as a **local Claude Code instance** (the [`architect-audit.js`](../../scripts/gds/architect-audit.js) / §6A.1 pattern — read-only subagent + deterministic side-effects). It:
|
|
63
|
+
|
|
64
|
+
1. calls the 6D.2 search to rank **interesting** sessions — high ceremony-vs-work ratio, dense tool-errors, ran-over-estimate, failed-grade, re-claim thrash (and the inverse: high-karma top performers worth learning from);
|
|
65
|
+
2. fetches + deep-dives them, computing the two analyses below;
|
|
66
|
+
3. writes a `docs/audits/bfg-session-eval-<date>.md` report. **Read-only — it proposes, never mutates.**
|
|
67
|
+
|
|
68
|
+
**The ceremony-vs-work ratio.** Each assistant turn / tool-call classifies into:
|
|
69
|
+
- **work** — edits to files that ended up in the shipped diff; problem-solving toward that diff;
|
|
70
|
+
- **ceremony** — GDS claim/ship/release/status/grade plumbing; reading methodology; session-log writing;
|
|
71
|
+
- **recovery** — tool errors + the turns spent recovering; retries; re-grades; guess-and-retry.
|
|
72
|
+
|
|
73
|
+
Ratio = work tokens ÷ total (with a parallel turn-based ratio). [#506](https://example.com/builders#/task/506) ≈ **10 / 90**.
|
|
74
|
+
|
|
75
|
+
**The footgun taxonomy** (the detector set):
|
|
76
|
+
1. repeated tool failures (same tool + error class, ≥2×);
|
|
77
|
+
2. empty/trivial-diff grade (panel spawned on no/near-no diff);
|
|
78
|
+
3. claim-consumed-on-fail (claim released/abandoned after a failed grade);
|
|
79
|
+
4. stale-test red herring (a test/smoke failure whose *fix edits the test*, not the feature);
|
|
80
|
+
5. **guess-and-retry on API enums/routes** (GDS API 4xx → retry with changed params) → produced **[#514](https://example.com/builders#/task/514)**;
|
|
81
|
+
6. **heavyweight-pipeline-on-trivial-change** (full grader panel on a sub-N-line / copy-only diff) → produced **[#513](https://example.com/builders#/task/513)**.
|
|
82
|
+
|
|
83
|
+
### 4. Findings to the builder (6D.4)
|
|
84
|
+
|
|
85
|
+
- **Systemic** build-process fixes → `idea_inbox` rows / backlog tasks (conservative grouping, like §6A.1 and the manual [#506](https://example.com/builders#/task/506) → [#513](https://example.com/builders#/task/513)/[#514](https://example.com/builders#/task/514)/[#468](https://example.com/builders#/task/468)).
|
|
86
|
+
- **Per-builder** process findings → delivered to *that* builder via the [ADR 0026](<redacted>.md) **§6C transparent, BFG-authored, attributed note** path (builder-visible, deletable, audit-logged) — for the builder to **evaluate and act on**. The §6C write path is built by 0026's 6C.1/6C.2; 6D.4 wires session findings *into* it and degrades to inbox-only until 6C exists.
|
|
87
|
+
|
|
88
|
+
The builder-field querying does double duty: it powers the **waste hunt** *and* the charter's **6B good-practice mining** — one corpus, both objectives.
|
|
89
|
+
|
|
90
|
+
### Trust & privacy (load-bearing)
|
|
91
|
+
|
|
92
|
+
Uploading session detail means transcripts **now live server-side and are BFG-readable across builders** — today they are local-only. This is a deliberate, narrow extension of [ADR 0016](<redacted>.md), in the same family as [ADR 0026](<redacted>.md)'s cross-builder paths. The safeguards are **enforcement requirements, not prose**:
|
|
93
|
+
|
|
94
|
+
- **Secrets scrubbed on upload** ([ADR 0022](0022-secrets-policy.md)) — known secret patterns + the builder's own env values redacted *before* the transcript leaves the machine; covered by a test.
|
|
95
|
+
- **BFG-principal-only** cross-builder reads (a builder reads only their own self-serve); **`audit_log` row per cross-builder read**.
|
|
96
|
+
- **Retention window** — sessions are pruned after a bounded period; the corpus is not hoarded forever.
|
|
97
|
+
- **Builder-visible** — a builder can see, and request deletion of, their uploaded sessions.
|
|
98
|
+
|
|
99
|
+
> **Non-goal — not covert surveillance.** This is not a tool for secretly ranking or punishing builders. Findings are transparent and attributed (the §6C posture). This mirrors [ADR 0026](<redacted>.md)'s explicit rejection of covert "nightmares": the steering is honest, visible, and reversible.
|
|
100
|
+
|
|
101
|
+
### Validation — the [#506](https://example.com/builders#/task/506) regression gate (6D.5)
|
|
102
|
+
|
|
103
|
+
The design must reproduce the hand-labeled [#506](https://example.com/builders#/task/506) findings. A scrubbed excerpt of the 2026-06-01 transcript is checked in as a seed fixture; the evaluator must surface:
|
|
104
|
+
|
|
105
|
+
| [#506](https://example.com/builders#/task/506) manual finding | Detector |
|
|
106
|
+
|---|---|
|
|
107
|
+
| heavyweight pipeline on a trivial change | footgun [#6](https://example.com/builders#/task/6) → **[#513](https://example.com/builders#/task/513)** |
|
|
108
|
+
| guessing at API errors + retrying | footgun [#5](https://example.com/builders#/task/5) → **[#514](https://example.com/builders#/task/514)** |
|
|
109
|
+
| stale test sent diagnosis down a rabbit hole | footgun `#4` → **[#468](https://example.com/builders#/task/468)** |
|
|
110
|
+
| ~90% of tokens on ceremony | the ceremony-vs-work ratio |
|
|
111
|
+
|
|
112
|
+
This is the regression gate: classifier/detector changes must keep finding the known issues.
|
|
113
|
+
|
|
114
|
+
### Phase plan (created as backlog tasks by [#539](https://example.com/builders#/task/539), children of [#515](https://example.com/builders#/task/515))
|
|
115
|
+
|
|
116
|
+
| Sub-phase | GDS task | Scope | Earns it |
|
|
117
|
+
|---|---|---|---|
|
|
118
|
+
| **6D.1** | [#540](https://example.com/builders#/task/540) | Upload-on-ship: `session_records` table + POST route + secret-scrub + `ship.js` wiring | The corpus exists; everything depends on it. Ship first. |
|
|
119
|
+
| **6D.2** | [#541](https://example.com/builders#/task/541) | Search/query API (session + joined builder fields) + fetch-detail; principal-gated + audited | The corpus is queryable along both waste and good-practice axes. |
|
|
120
|
+
| **6D.3** | [#542](https://example.com/builders#/task/542) | BFG local routine: search → deep-dive → ceremony-vs-work + footguns → report | The [#506](https://example.com/builders#/task/506) post-mortem becomes a standing, automatic capability. |
|
|
121
|
+
| **6D.4** | [#543](https://example.com/builders#/task/543) | Findings delivery: `idea_inbox` (systemic) + §6C note (per-builder) | Findings reach the builder transparently; loop closes. |
|
|
122
|
+
| **6D.5** | [#544](https://example.com/builders#/task/544) | [#506](https://example.com/builders#/task/506) validation/regression harness (seed fixture) | The evaluator provably reproduces the hand-labeled case. |
|
|
123
|
+
| **6D.6** | [#545](https://example.com/builders#/task/545) | *(optional)* append-only grade-attempt logging | Re-grade thrash becomes countable — *only if the signal earns its keep.* |
|
|
124
|
+
|
|
125
|
+
Each sub-phase answers "is this earning its tokens?" before the next — the Musk gate, same as [ADR 0024](<redacted>.md)/[0026](<redacted>.md).
|
|
126
|
+
|
|
127
|
+
## Alternatives considered
|
|
128
|
+
|
|
129
|
+
- **Local-only `/session-review` slash command (rejected by Lars).** The first proposal kept the rich data local and had the builder run the review on demand. Rejected: *"I want the average builder to not think about this"* — and a local tool can never see cross-builder sessions. Upload-on-ship + a server corpus replaces it.
|
|
130
|
+
- **Server-side analyzer (rejected by Lars).** The second proposal ran the analysis on the server. Rejected: the BFG **runs as a local Claude Code instance**; the server only *stores and serves*. This keeps expensive LLM reasoning off the always-on droplet and matches the BFG's existing identity (a `SKILL.md` routine).
|
|
131
|
+
- **Digest-only upload (deferred).** Store just the computed metrics, not the transcript. Rejected for now because the BFG must be able to deep-dive with *new* criteria later — a digest freezes the analysis. Full (scrubbed) transcript chosen, bounded by a retention window. Revisit if storage cost bites.
|
|
132
|
+
- **Vector / semantic search over the corpus (deferred).** Consistent with [ADR 0024](<redacted>.md)/[0026](<redacted>.md)'s "vector store deferred." Plain SQL + keyword "for now" (Lars's word).
|
|
133
|
+
- **Counting re-grade thrash from `task_grades` (not possible).** `task_grades.task_id` is `UNIQUE` — only the *final* grade survives, so the number of grade attempts isn't persisted. 6D.6 optionally adds append-only grade-attempt logging if that signal proves wanted.
|
|
134
|
+
|
|
135
|
+
## Consequences
|
|
136
|
+
|
|
137
|
+
**Good:**
|
|
138
|
+
- The [#506](https://example.com/builders#/task/506) post-mortem becomes a **standing, automatic** capability; systemic waste surfaces as `idea_inbox`/tasks without anyone asking.
|
|
139
|
+
- **One queryable corpus** serves both the waste hunt and [ADR 0026](<redacted>.md) §6B good-practice propagation.
|
|
140
|
+
- Analysis stays a local Claude Code routine — **no new always-on cost** on the droplet.
|
|
141
|
+
|
|
142
|
+
**Bad / accepted:**
|
|
143
|
+
- **Session transcripts now live server-side** — a new sensitive store to secure, scrub, and retain. Mitigated by upload-time scrubbing + principal-gating + audit + retention + builder visibility.
|
|
144
|
+
- **The BFG can read across builders' sessions** — the audit trail is what keeps that legible (same residual risk [ADR 0026](<redacted>.md) accepted for memory).
|
|
145
|
+
- **`ship.js` gains an upload step** — it must be fast, non-blocking, and fail-safe; a broken upload can never block a ship.
|
|
146
|
+
|
|
147
|
+
**Reversibility:**
|
|
148
|
+
- 6D.1 is additive — stop uploading and drop `session_records` to revert.
|
|
149
|
+
- The BFG routine is a deletable `SKILL.md`.
|
|
150
|
+
- The retention window auto-prunes the corpus.
|
|
151
|
+
|
|
152
|
+
## Lineage — GDS-V4 measurement-honesty amendments
|
|
153
|
+
|
|
154
|
+
The 2026-06-12 friction analysis (1,349 session records, V4.R00) showed the
|
|
155
|
+
evaluator's numbers did not reflect real friction. Three GDS-V4 fixes correct it
|
|
156
|
+
(criterion `bfg-measures-what-hurts`):
|
|
157
|
+
|
|
158
|
+
- **Harness-retry split ([#959](https://example.com/builders#/task/959)).** Harness guardrail rejections — an Edit/Write before the file was Read (`File has not been read yet`) or a foreground `Blocked: sleep` — were counted in `tool_error_count`, inflating it and letting benign retries top the `order=tool_errors` ranking. `buildSessionDigest` now classifies them into a separate `harness_retry_count`, leaving `tool_error_count` NET. Because `sessions/search` orders on `metrics->>'tool_error_count'`, the ranking uses the net figure with no route change.
|
|
159
|
+
- **Wrong-path / worktree footgun ([#960](https://example.com/builders#/task/960)).** `detectFootguns` gained `wrong_path_worktree` (the corpus's [#1](https://example.com/builders#/task/1) error class, 84 hits) + a `FINDING_TEMPLATES` entry, so the worktree↔main-checkout split surfaces as an actionable idea_inbox finding.
|
|
160
|
+
- **Turn-weighted overhead ([#961](https://example.com/builders#/task/961)).** Token weighting scored 150M-token cache-heavy marathons as 97–99% "work" while the turn sequence was hours of ceremony. `computeOverhead` now also reports a turn-weighted ratio, and the verdict is driven off it.
|
|
161
|
+
|
|
162
|
+
## References
|
|
163
|
+
|
|
164
|
+
- [ADR 0024 — Multi-Agent System architecture](<redacted>.md) — the BFG is Phase 6
|
|
165
|
+
- [ADR 0026 — The BFG charter](<redacted>.md) — 6D extends the "best building experience" objective; §6C is the findings-delivery path
|
|
166
|
+
- [ADR 0016 — Trust boundary](<redacted>.md) — the rule this narrowly extends
|
|
167
|
+
- [ADR 0022 — Secrets policy](0022-secrets-policy.md) — upload-time scrubbing
|
|
168
|
+
- [2026-06-01 #506 post-mortem session log](../session-logs/<redacted>.md) — the hand-labeled seed corpus
|
|
169
|
+
- `migrations/003_pms.sql` (`credit_log`, `session_logs`, `claims`), `migrations/016_pms_task_grades.sql` (the upsert-unique grade), `migrations/040_builder_karma.sql` (karma)
|
|
170
|
+
- GDS tasks: **[#515](https://example.com/builders#/task/515)** (umbrella) · **[#539](https://example.com/builders#/task/539)** (this design) · **[#540](https://example.com/builders#/task/540)–[#545](https://example.com/builders#/task/545)** (6D.1–6D.6)
|