@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,255 @@
|
|
|
1
|
+
# Cursor (Anysphere) — Competitive-Threat Analysis for Cloud Bongos
|
|
2
|
+
|
|
3
|
+
**A competitor-research document for Cloud Bongos / Off the Boats**
|
|
4
|
+
Prepared 2026-06-22 · the **first committed competitor doc** in this repo · companion to the (uncommitted) `component-based-dev-research.md` deep-research doc · task [#1403](https://example.com/builders#/task/1403)
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 0. How to read this document (provenance)
|
|
9
|
+
|
|
10
|
+
This was produced by the project's deep-research harness (fan-out web search → fetch 22 sources → 99 extracted claims → 3-vote adversarial verification), **then completed by a main-loop verification round**, and synthesized here against our own positioning docs. As with the prior research doc, **the harness itself was cut off by the org's monthly Claude spend limit** at the *verify + synthesize* step — 13 claims had finished adversarial verification; the rest abstained. After it stopped, I re-fetched the key funding and economics sources **directly in the main loop** (which was *not* subject to the subagent spend cutoff) and firmed up most of the abstained claims. Every claim carries an explicit confidence mark:
|
|
11
|
+
|
|
12
|
+
- **✅ Verified** — passed 3-0 / 2-1 adversarial verification in the harness, **or** I confirmed it against a named primary/reputable source in the 2026-06-22 main-loop round.
|
|
13
|
+
- **📄 Sourced** — from a reputable source, but single-pass (not adversarially cross-checked). Cite with normal care.
|
|
14
|
+
- **🔧 Synthesis** — my analysis, framing, or mapping to Cloud Bongos. Not a cited external fact.
|
|
15
|
+
- **⚠️ Contested** — a claim that *failed* verification, or where sources disagree. Flagged so it is never repeated as fact.
|
|
16
|
+
|
|
17
|
+
> **Operational note for the owner:** this is the **second** harness run in a row truncated by the org's monthly Claude spend limit (the module-system doc was the first). The *subagents* die on it; the *main loop* still works, which is how the verification round below got done. To get full unattended verification + auto-synthesis on the next deep dive, raise the limit at `claude.ai/admin-settings/usage`.
|
|
18
|
+
|
|
19
|
+
Full bibliography in [§10](#10-bibliography). Our positioning is from a direct read of [`docs/adr/<redacted>.md`](../adr/<redacted>.md), [`docs/adr/<redacted>.md`](../adr/<redacted>.md), and [`GOVERNANCE.md`](../../GOVERNANCE.md).
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 1. Executive summary
|
|
24
|
+
|
|
25
|
+
**Your premise — "Cursor is our largest competitor" — is half right, and the half that's wrong is the important half.** Cursor is the biggest, best-funded, most-recognized *brand* in the adjacent space, so as a mindshare/narrative rival it is unquestionably the giant in the room. But as a **direct product competitor to Cloud Bongos, aiming at "Cursor the editor" is aiming at the wrong thing** — *and* the company is sprinting away from being just an editor. Three findings frame everything below:
|
|
26
|
+
|
|
27
|
+
1. **Today you are on different layers of the stack.** Cursor *was* a per-seat, human-in-the-loop AI code **editor** (a VS Code fork: autocomplete/Tab, chat). Cloud Bongos is an agent-authored orchestration / project-management **layer** (claim→build→ship→grade, multi-builder, instance-model, BYO-LLM). A free tool where you bring your own API key does **not** remove the reasons people pay Cursor — bundled model access, the polished editor, enterprise compliance. At the *editor* layer, direct revenue threat in either direction is near zero. 🔧
|
|
28
|
+
|
|
29
|
+
2. **But the overlap is no longer hypothetical — it is shipping.** ✅ **Cursor 3 (April 2026) was "built from scratch rather than extending Cursor's VS Code fork," prioritizing *agent orchestration over direct code editing*** — a unified view of all running agents (local + cloud), **parallel agents across repos**, local↔cloud handoff, and **private team plugin/skill marketplaces "addressing governance needs for organizational deployment"** ([InfoQ](https://www.infoq.com/news/2026/04/cursor-3-agent-first-interface/)). Usage has **inverted**: as of March 2025 tab-completion dominated; now "twice as many users run autonomous agents." This is Cursor walking directly onto the orchestration layer. The gap is closing, not theoretical. 🔧
|
|
30
|
+
|
|
31
|
+
3. **Cursor's economics both fund the threat and define the weakness you should exploit.** ✅ Cursor ran **negative gross margins** — ~$0.40–0.70 of model-inference cost per revenue dollar, ~30–50% structural gross margin vs 80%+ for normal software. Its owned model (Composer, a fine-tune of the open Kimi K2.5) + cheaper models pushed it to *slightly* positive — but **positive only on enterprise; still loss-making on individual developers.** And its COGS is **rented from the very suppliers (Anthropic, OpenAI) who now compete with it** — vividly, in Jan 2026 Anthropic *blocked third-party tools (including header-spoofing for favorable pricing) and cut off xAI's use of Claude via the Cursor IDE.* Cloud Bongos is BYO-key, takes no markup, and is model-agnostic — so the structural squeeze that pins Cursor's pricing **does not exist for you.** 🔧
|
|
32
|
+
|
|
33
|
+
**The crisp bottom line** (full version in [§9](#<redacted>)): treat **Anthropic Claude Code, OpenAI Codex, GitHub Copilot's coding agent, Devin, and Replit Agent** as the *direct* product threats to an orchestration platform, and treat **Cursor as the dominant adjacent brand that is now actively entering your layer (Cursor 3).** Don't fight on Cursor's axes (editor UX, model quality, distribution, enterprise polish). Compete on the axes its funding + margin structure *forbid* it to match: open/AGPL, no lock-in, self-host + data control, model-agnostic/BYO, and the governance/methodology layer.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 2. What Cursor is — and the "same layer?" question
|
|
38
|
+
|
|
39
|
+
| | **Cursor** | **Cloud Bongos** |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| **What it is** | AI code **editor** → now an **agent-orchestration workspace** (Cursor 3) | AI-first build **platform / orchestration + PM layer** |
|
|
42
|
+
| **Primary user** | A human developer supervising agents | AI agents authoring under a human owner's gates |
|
|
43
|
+
| **Unit of work** | A keystroke / chat turn / a supervised agent run | A *task*: claim → build → ship → grade → credit |
|
|
44
|
+
| **Monetization** | Per-seat subscription + usage-based inference + enterprise | **Free, non-profit, AGPL-3.0**; instance owner brings their own LLM spend |
|
|
45
|
+
| **Distribution** | Download the app; SaaS account | Self-host an instance (Docker); instance-model, not multi-tenant SaaS |
|
|
46
|
+
| **Model relationship** | Resells Anthropic/OpenAI/Google + building its own (Composer) | Model-agnostic, bring-your-own-key; takes no markup |
|
|
47
|
+
| **Lock-in** | Editor habit, team admin, codebase index, bundled credits, team marketplaces | By design *none* (AGPL §13 forbids the hosted-closed-fork) |
|
|
48
|
+
|
|
49
|
+
🔧 **The layer distinction is the whole analysis — but the layers are converging.** An editor sells *a better way for a human to write code*; an orchestration platform sells *a way to run, govern, and account for AI agents that write the code*. These were complementary in 2024–25. As of Cursor 3 (April 2026), Cursor is explicitly repositioning as "a unified workspace for building software with agents" where "autonomous agent fleets independently ship changes" — i.e., it is moving *onto* the orchestration layer. So "different layers" is the right frame for *legacy Cursor*, and a *narrowing* frame going forward.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 3. Business model — how Cursor makes money
|
|
54
|
+
|
|
55
|
+
### Pricing tiers (current)
|
|
56
|
+
|
|
57
|
+
✅ **Verified, primary source [cursor.com/docs/models-and-pricing](https://cursor.com/docs/models-and-pricing) + [cloudzero.com](https://www.cloudzero.com/blog/cursor-ai-pricing/):**
|
|
58
|
+
|
|
59
|
+
| Tier | Price | Bundled usage / notes |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| **Hobby** | Free | Free forever, no card required |
|
|
62
|
+
| **Pro** | **$20/mo** (~$16/mo billed annually) | Includes **$20** of API usage |
|
|
63
|
+
| **Pro+** | **$60/mo** | Includes **$70** of API usage |
|
|
64
|
+
| **Ultra** | **$200/mo** | Includes **$400** of API usage |
|
|
65
|
+
| **Teams (Standard)** | **$40/user/mo** (~$32 annual) | Team admin |
|
|
66
|
+
| **Teams (Premium)** | **$120/user/mo** | |
|
|
67
|
+
| **Enterprise** | Custom (annual) | Compliance, SSO, privacy |
|
|
68
|
+
|
|
69
|
+
### The June 2025 pricing earthquake
|
|
70
|
+
|
|
71
|
+
- ✅ **On June 16, 2025, Cursor moved Pro from request-based to usage-based pricing.** Before: "500 fast responses … then unlimited responses at a slower rate." After: "**$20 worth of usage per month, billed at API rates**" ([TechCrunch](https://techcrunch.com/2025/07/07/cursor-apologizes-for-unclear-pricing-changes-that-upset-users/), 3-0).
|
|
72
|
+
- ✅ **Pricing is now token/usage-based** ("per million tokens"); the docs mark older request-based plans **legacy** ([cursor.com/docs](https://cursor.com/docs/models-and-pricing), 3-0).
|
|
73
|
+
- ✅ **It triggered widespread backlash** — users were "unexpectedly charged additional costs" beyond the $20 cap; Cursor issued a **public apology on July 4, 2025 and offered refunds** for charges between June 16 and July 4 ([TechCrunch](https://techcrunch.com/2025/07/07/cursor-apologizes-for-unclear-pricing-changes-that-upset-users/) + [cloudzero.com](https://www.cloudzero.com/blog/cursor-ai-pricing/), 3-0).
|
|
74
|
+
|
|
75
|
+
🔧 **Why this matters to you:** the pricing blow-up is the visible symptom of the inference-margin problem below. When you resell someone else's metered compute you either eat the overage (margin pain) or pass it on (trust pain). Cursor hit the trust wall publicly. **A BYO-key tool never has this problem** — the user's bill goes straight to the model provider; there is no markup to defend and no surprise overage to apologize for.
|
|
76
|
+
|
|
77
|
+
### Inference economics & margin — the heart of the model ✅ (main-loop round, 2026-06-22)
|
|
78
|
+
|
|
79
|
+
This is the most important section for understanding why Cursor does what it does. The picture is now well-sourced (no longer contested):
|
|
80
|
+
|
|
81
|
+
- **Inference is largely a pass-through.** When a user selects a specific frontier model, "usage is drawn from the API pool at that model's API rate" ([cursor.com/docs](https://cursor.com/docs/models-and-pricing), ✅ 2-1) — so the $20 Pro sub roughly *buys $20 of model usage*. Margin can't come from reselling tokens.
|
|
82
|
+
- **Cursor ran negative gross margins.** Through 2025 it spent an estimated **$0.40–$0.70 of model-inference cost per $1 of revenue** (Anthropic + OpenAI API costs), making structural gross margin **~30–50% vs the 80%+ of normal software** — the "token tax" that "locks AI-agent gross margins ~30 points below the SaaS baseline" ([Contrary Research](https://research.contrary.com/company/cursor); [TechTimes](https://www.techtimes.com/articles/317542/20260601/<redacted>.htm); [Yahoo Finance — "high costs and thin margins threatening AI coding startups"](https://finance.yahoo.com/news/<redacted>.html)). Contrary quotes the criticism directly: Cursor charges "lower or equivalent pricing to Anysphere's own costs of accessing foundation models."
|
|
83
|
+
- **The owned model is the margin fix — and it's partly working.** Composer (Nov 2025) + cheaper models like Kimi moved Cursor to **slight gross-margin profitability — positive on large enterprise, but still losing money on individual developer accounts** ([market reporting via search, 2026](https://mktclarity.com/blogs/news/is-cursor-profitable)). Internal telemetry reportedly showed Composer handling **~half of autocomplete requests** while matching Claude Sonnet on common tasks. 📄
|
|
84
|
+
- **Forward pressure:** Cursor reportedly forecasts ending **2026 at a >$6B annualized run-rate** ([letsdatascience](https://letsdatascience.com/blog/<redacted>)) — i.e., it expects to roughly triple again. 📄 (forecast; treat as a target, not a fact.)
|
|
85
|
+
|
|
86
|
+
### Revenue & ARR trajectory ✅
|
|
87
|
+
|
|
88
|
+
- ✅ **ARR path:** ~**$100M** (Jan 2025) → ~**$300M** (mid-April 2025) → **$500M+** (June 2025, "doubling ~every two months") → **$1B** (Nov 2025) ([TechCrunch June 2025](https://techcrunch.com/2025/06/05/<redacted>/); [cursor.com/blog/series-d](https://cursor.com/blog/series-d); [Contrary](https://research.contrary.com/company/cursor)).
|
|
89
|
+
- ⚠️ **Contested — do not state as fact:** "$2B ARR / 1M+ subscribers by Feb 2026" was **refuted (1-2)** in the harness; some 2026 outlets assert ~$2B but they are speculative. The last firmly-verified figure is **$1B (Nov 2025).**
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 4. Funding, valuation & investor incentives
|
|
94
|
+
|
|
95
|
+
✅ Full history (Contrary Research + the round announcements; Series C/D cross-checked):
|
|
96
|
+
|
|
97
|
+
| Round | Amount | Valuation | When | Lead / notable investors | Confidence |
|
|
98
|
+
|---|---|---|---|---|---|
|
|
99
|
+
| Pre-seed | $400K | — | Apr 2022 | — | 📄 |
|
|
100
|
+
| Seed | $8M | — | Oct 2023 | **OpenAI Startup Fund** | 📄 |
|
|
101
|
+
| Series B | $100M | **$2.5B** | Dec 2024 | a16z, Thrive | 📄 |
|
|
102
|
+
| Series C | **$900M** | **$9.9B** | **June 5, 2025** | **Thrive** (lead); a16z, Accel, DST Global | ✅ ([TechCrunch](https://techcrunch.com/2025/06/05/<redacted>/)) |
|
|
103
|
+
| **Series D** | **$2.3B** | **$29.3B** post-money | **Nov 2025** | Coatue, **NVIDIA**, **Google** (new); Accel, Thrive, a16z | ✅ 3-0 ([cursor.com/blog/series-d](https://cursor.com/blog/series-d), [CNBC](https://www.cnbc.com/2025/11/13/cursor-ai-startup-funding-round-valuation.html)) |
|
|
104
|
+
| In talks | ~$2B+ | ~**$50B** | ~April 2026 | a16z / Thrive, NVIDIA strategic | 📄 ([TechCrunch 2026-04-17](https://techcrunch.com/2026/04/17/<redacted>/) — *"as enterprise growth surges"*) |
|
|
105
|
+
|
|
106
|
+
Total raised through end-2025: **~$3.5B across seven rounds.**
|
|
107
|
+
|
|
108
|
+
> ⚠️ A "$60B valuation / SpaceX-xAI acquisition" claim surfaced from low-quality sources and I'm **excluding it as not credible.** The credible April-2026 datapoint is the *TechCrunch "$2B at ~$50B, in talks, enterprise-driven"* line above.
|
|
109
|
+
|
|
110
|
+
🔧 **What the valuation demands, and why it drives everything:** $29.3B on ~$1B ARR is **~29× revenue**; the rumored ~$50B raise pushes the multiple higher still. Growing into that means **5–10×-ing revenue** — and you can't do that on $20 consumer seats at pass-through (or negative) margin. So every move points the same way: **(1) go upmarket to enterprise** (where margin is *actually* positive), **(2) repair COGS via owned models**, **(3) lock in teams.** Tellingly, the rumored 2026 raise is explicitly framed around **enterprise growth** — the consumer base that built the brand is now the *loss-leader*. None of these imperatives points at "go fight a free non-profit tool."
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 5. Moat & strategic position
|
|
115
|
+
|
|
116
|
+
### What actually locks customers in 🔧/📄
|
|
117
|
+
|
|
118
|
+
1. **The Tab / autocomplete model** (their own Fusion/Composer model) — fast, habit-forming; the genuine moat, and now ~half-served by their cheaper owned model.
|
|
119
|
+
2. **Editor UX + muscle memory** — low cost to adopt (VS Code fork), higher cost to leave once a team's workflow lives there.
|
|
120
|
+
3. **Agent mode, background/parallel agents, Bugbot** (automated PR review), whole-repo indexing — and, with Cursor 3, **team plugin/skill marketplaces** with governance for org deployment.
|
|
121
|
+
4. **Enterprise: admin, SSO, privacy mode, compliance** — where the margin *and* the stickiness actually are, and where the company is steering.
|
|
122
|
+
|
|
123
|
+
### The contrarian core — supplier-disintermediation risk ✅ (vivid, now well-sourced)
|
|
124
|
+
|
|
125
|
+
This is the most strategically important thing about Cursor, and it is the inverse of a moat:
|
|
126
|
+
|
|
127
|
+
- **Cursor's cost of goods is rented from its own competitors.** It pays Anthropic and OpenAI for the inference it resells. Those suppliers now ship **first-party coding agents** — **Claude Code**, **OpenAI Codex** — that don't pay the markup, get model improvements *first*, and can price below Cursor indefinitely.
|
|
128
|
+
- ✅ **The supplier can simply cut you off — and did.** In **January 2026 Anthropic added safeguards blocking third-party tools** (e.g. OpenCode, and tools spoofing the Claude Code client's headers) from accessing Claude at favorable Pro/Max pricing, and **specifically blocked xAI staff who were using Claude *via the Cursor IDE*** ([VentureBeat](https://venturebeat.com/technology/<redacted>); [The Register, 2026-02-20](https://www.theregister.com/2026/02/20/anthropic_clarifies_ban_third_party_claude_access/); [WinBuzzer, 2026-01-10](https://winbuzzer.com/2026/01/10/<redacted>/)). The economics behind the crackdown: a **$200/mo Claude Max sub ≈ $1,000+ of the same usage at API rates** — so reselling/spoofing that access is exactly what a model owner will shut down.
|
|
129
|
+
- **This is precisely *why* Cursor is building owned models** (Composer on Kimi K2.5, [§3](#<redacted>)): simultaneously a **margin play** (escape the markup) and a **disintermediation hedge** (reduce dependence on suppliers-turned-rivals).
|
|
130
|
+
|
|
131
|
+
🔧 **Read against Cloud Bongos:** the dependency that constrains Cursor's pricing and leaves it at a supplier's discretion **does not exist for you.** Cloud Bongos is BYO-key, takes no markup, and is model-agnostic — it can route to whatever model is best/cheapest (including the very first-party agents that threaten Cursor) with no business-model conflict.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 6. Direct threat assessment vs a free / AGPL / self-hosted orchestration platform
|
|
136
|
+
|
|
137
|
+
This is the heart of your question. The honest answer has three parts.
|
|
138
|
+
|
|
139
|
+
### A. Where a free BYO-key tool does **not** threaten Cursor 🔧
|
|
140
|
+
|
|
141
|
+
A free, self-hostable, non-profit tool does **not remove any reason people pay Cursor**:
|
|
142
|
+
- **Bundled frontier access** — "free" doesn't make the model free; BYO-key just *moves the bill* to the provider. For most buyers, one Cursor invoice is *less* friction.
|
|
143
|
+
- **The editor + Tab UX** — the daily value; an orchestration layer doesn't replace it.
|
|
144
|
+
- **Enterprise compliance/admin** — procurement buys a vendor with SOC2, SSO, an MSA, a throat to choke. A self-hosted non-profit OSS project is the *opposite* of that for a risk-averse buyer.
|
|
145
|
+
- **Self-host is more work, not less,** for the median Cursor user.
|
|
146
|
+
|
|
147
|
+
→ **At the editor / per-seat layer, the direct revenue threat in either direction is near zero.**
|
|
148
|
+
|
|
149
|
+
### B. Where the overlap is real — and now actively shipping 🔧
|
|
150
|
+
|
|
151
|
+
The axis where the layers collide is **autonomous / multi-agent orchestration** — "the agent owns the task; the human sets gates." That is Cloud Bongos's core, and **Cursor 3 (April 2026) is Cursor moving onto exactly this axis**: built from scratch as an agent-first workspace, a unified view of all running agents (local + cloud), **parallel agents across repos**, local↔cloud handoff, **private team plugin/skill marketplaces with governance**, and usage that has **inverted** from autocomplete to autonomous agents ([InfoQ](https://www.infoq.com/news/2026/04/cursor-3-agent-first-interface/)). This is no longer a "future roadmap" caveat — it is the product direction *today*. The remaining differences from Cloud Bongos are real but narrowing: Cursor's orchestration is still **developer-supervised, per-seat, SaaS, and closed**, whereas Cloud Bongos is **agent-authored, multi-builder, self-hosted, open, with a formal claim→ship→grade + rank/permission governance model.**
|
|
152
|
+
|
|
153
|
+
### C. Verdict on "Cursor is our largest competitor" 🔧
|
|
154
|
+
|
|
155
|
+
**Calibrate it on two scoreboards:**
|
|
156
|
+
|
|
157
|
+
- **As a *product* competitor to an orchestration platform *today*:** Cursor is *not* the most direct threat. The closer ones are the **first-party autonomous agents** (Claude Code, Codex, Copilot coding agent) and **autonomous-SWE platforms** (Devin/Cognition, Replit Agent) — see [§8](#<redacted>). Those *are* orchestration-shaped.
|
|
158
|
+
- **As a *brand / trajectory* competitor:** Cursor is the **heavyweight** — the category-defining name, ~$29–50B of capital, and (with Cursor 3) an explicit push onto the orchestration layer. On *that* axis your instinct is right, and the trajectory makes Cursor a *rising* threat, not a static adjacent one.
|
|
159
|
+
|
|
160
|
+
And the reframe that matters most: **Cloud Bongos is free and non-profit, so it isn't competing for Cursor's *revenue* at all.** The contest is for **developer attention** and the **narrative of how teams *should* build with AI** — winnable for a credible open alternative, but a community/distribution game, not a feature-for-feature fight.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 7. Likely competitive responses & incentives
|
|
165
|
+
|
|
166
|
+
🔧 **Would Cursor bother competing with a free non-profit tool? Almost certainly not, directly.** Their incentives ([§4](#<redacted>)) point entirely at enterprise revenue and margin repair; fighting free OSS yields no ARR and burns goodwill. Expect them to **ignore** a non-profit tool as a revenue threat.
|
|
167
|
+
|
|
168
|
+
**What they *will* do — each of which incidentally crowds your space:**
|
|
169
|
+
1. **Move upmarket to enterprise** (the dominant motion; the only segment where their margin is positive).
|
|
170
|
+
2. **Lock in teams** — admin, shared context, team marketplaces, seat-based billing that compounds.
|
|
171
|
+
3. **Push autonomous / background / parallel agents** (Cursor 3) — the vector that directly encroaches on orchestration.
|
|
172
|
+
4. **Build owned models** (Composer line) — to escape the inference markup and the supplier squeeze; already shifting enterprise margin positive.
|
|
173
|
+
|
|
174
|
+
🔧 **If forced to compete on an axis, it would be on** distribution, brand, model/Tab quality, polish, enterprise trust — *all of which a bootstrapped non-profit cannot win head-on.* So **don't fight there.** Your defensible axes are the inverse, and they map onto things Cursor's funding + margin structure *forbid* it to match:
|
|
175
|
+
|
|
176
|
+
| Cloud Bongos's defensible axis | Why Cursor structurally can't match it |
|
|
177
|
+
|---|---|
|
|
178
|
+
| **Open / AGPL-3.0, no lock-in** ([ADR 0065](../adr/<redacted>.md)) | A $29B+ venture co. *sells* lock-in; AGPL §13 anti-capture is antithetical to its model |
|
|
179
|
+
| **Self-host + full data control** ([ADR 0062](../adr/<redacted>.md) instance model) | SaaS multi-tenant is how it gets margin + telemetry; self-host canonical is the opposite |
|
|
180
|
+
| **Model-agnostic / BYO-key, zero markup** | Its economics *depend* on the inference relationship; BYO-key removes the revenue and the supplier risk |
|
|
181
|
+
| **Governance / methodology layer** (claim→ship→grade, multi-builder, trust boundary) | Cursor 3 is *starting* on team governance — but for closed, per-seat, supervised use, not agent-authored multi-builder accountability |
|
|
182
|
+
| **Non-profit** | Investors require the opposite; it can't credibly be "not monetizing you" |
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 8. Calibrating the field — the broader competitive set
|
|
187
|
+
|
|
188
|
+
For an AI-first **orchestration** platform, rank threats by *"does it manage autonomous agents doing whole tasks?"* — not *"is it a popular AI tool?"* 🔧
|
|
189
|
+
|
|
190
|
+
| Competitor | What it is | Threat to an *orchestration* platform vs Cursor |
|
|
191
|
+
|---|---|---|
|
|
192
|
+
| **GitHub Copilot coding agent** | Issue→PR autonomous agent inside the dominant SCM ([docs](https://docs.github.com/copilot/concepts/agents/coding-agent/about-coding-agent), [noqta.tn](https://noqta.tn/en/blog/<redacted>)) | **MORE.** Autonomous, task-scoped, lands a PR through review gates — orchestration-shaped *and* riding GitHub's distribution + enterprise relationships. |
|
|
193
|
+
| **Anthropic Claude Code** | Terminal-native autonomous coding agent ([mindstudio](https://www.mindstudio.ai/blog/claude-code-vs-openai-codex-comparison)) | **MORE — and special.** Closest to "agents author the code," *and it is Cloud Bongos's own substrate.* The most-competitive system is the one you're built on. It also showed (Jan 2026) it will police who resells its access. |
|
|
194
|
+
| **OpenAI Codex** | Cloud autonomous agent, parallel tasks | **MORE / EQUAL.** Same orchestration encroachment from the other frontier lab. |
|
|
195
|
+
| **Devin / Cognition** | Autonomous "AI software engineer" + agent-management UI | **MORE.** The most direct *conceptual* competitor to "agents own tasks end-to-end," with its own session/management layer. |
|
|
196
|
+
| **Replit Agent** | Full build+host platform with built-in agents | **EQUAL / MORE.** Closest "platform where you don't bring your own editor"; prosumer/education skew vs your team-governance angle. |
|
|
197
|
+
| **Windsurf** | Cursor-like AI editor (post-2025 acquisition turmoil) | **LESS / EQUAL.** Same *layer* as legacy Cursor (an editor) → near-zero direct overlap, plus organizational disruption. |
|
|
198
|
+
| **Lovable / v0 / Bolt** | Prompt-to-app generators (web UI / prototypes) | **LESS.** Different buyer, different output (ship a small app/UI from a prompt). Overlap only at "describe → app." |
|
|
199
|
+
|
|
200
|
+
🔧 **Takeaway:** the orchestration-layer threats are the **first-party autonomous agents** (Claude Code, Codex, Copilot's agent) and the **autonomous-SWE platforms** (Devin, Replit) — *not* the editors (legacy Cursor, Windsurf). The irony worth sitting with: the system most competitive with an AI-first orchestration platform is **Claude Code**, which is *also what Cloud Bongos runs on.* Your relationship to the frontier labs is simultaneously **dependency, substrate, and competitor** — the same position Cursor is in, except you don't resell their tokens, so you don't carry the margin risk *or* the cut-off risk that hit Cursor in Jan 2026.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## 9. Strategic bottom line for the owner
|
|
205
|
+
|
|
206
|
+
1. **Re-rank the threat board.** Cursor = biggest *brand* in the adjacent space and now *entering your layer* (Cursor 3), but the most *direct product* threats to an orchestration platform are the **first-party autonomous agents** (Claude Code, Codex, Copilot coding agent) and **autonomous-SWE platforms** (Devin, Replit Agent). Plan against *those*; watch Cursor as the well-funded incumbent crossing over from the editor side.
|
|
207
|
+
|
|
208
|
+
2. **Never compete on Cursor's axes** (editor UX, Tab quality, model performance, distribution, enterprise polish). A bootstrapped non-profit loses every one. Compete on the axes their funding + margin structure *forbid* them to match: **open/AGPL, no lock-in, self-host + data control, model-agnostic/BYO, and the governance/methodology layer** ([§7 table](#<redacted>)).
|
|
209
|
+
|
|
210
|
+
3. **The inference-markup squeeze is their structural weakness and your structural strength — and it's now proven, not theoretical.** Cursor ran negative margins, rents COGS from suppliers who compete with it, and got *cut off* by Anthropic in Jan 2026. Cloud Bongos rents nothing, takes no markup, and is model-agnostic. Make "no markup, no lock-in, no model captivity, no supplier can switch you off" an explicit part of the pitch.
|
|
211
|
+
|
|
212
|
+
4. **The agent-first pivot is happening now — Cursor 3 is the entry point.** This is the one place adjacency is becoming competition. Re-assess hard if Cursor (or Copilot/Devin) ships **team-level *agent-authored* orchestration with real governance** (dispatch control, approval gates, accounting across many agents) — Cursor 3's team marketplaces are the first step in that direction.
|
|
213
|
+
|
|
214
|
+
5. **You're not competing for their revenue — so they won't fight you.** Free + non-profit means the contest is for **developer attention** and the **"right way to build with AI" narrative.** That's winnable for a credible open alternative, but it's a **community + distribution game**, not a feature war. Invest in proof, dogfooding, openness, and ecosystem rather than chasing editor or agent-UX parity.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 10. Bibliography
|
|
219
|
+
|
|
220
|
+
**Verified (✅ — adversarially confirmed in-harness and/or confirmed against a named source in the 2026-06-22 main-loop round):**
|
|
221
|
+
- Cursor — Models & Pricing (primary): https://cursor.com/docs/models-and-pricing
|
|
222
|
+
- Cursor — Series D announcement (primary): https://cursor.com/blog/series-d
|
|
223
|
+
- TechCrunch — Cursor apologizes for unclear pricing changes (2025-07-07): https://techcrunch.com/2025/07/07/cursor-apologizes-for-unclear-pricing-changes-that-upset-users/
|
|
224
|
+
- TechCrunch — Anysphere nabs $9.9B valuation, past $500M ARR (2025-06-05): https://techcrunch.com/2025/06/05/<redacted>/
|
|
225
|
+
- CloudZero — Cursor AI pricing breakdown: https://www.cloudzero.com/blog/cursor-ai-pricing/
|
|
226
|
+
- the-decoder — Cursor Composer 2, code-only model built on Kimi K2.5: https://the-decoder.com/<redacted>/
|
|
227
|
+
- CNBC — Cursor funding round / valuation (2025-11-13): https://www.cnbc.com/2025/11/13/cursor-ai-startup-funding-round-valuation.html
|
|
228
|
+
- Contrary Research — Cursor profile (ARR trajectory, funding history, margin criticism): https://research.contrary.com/company/cursor
|
|
229
|
+
- InfoQ — Cursor 3 agent-first interface (2026-04): https://www.infoq.com/news/2026/04/cursor-3-agent-first-interface/
|
|
230
|
+
- VentureBeat / The Register / WinBuzzer — Anthropic crackdown on third-party Claude harnesses & xAI (Jan–Feb 2026): https://venturebeat.com/technology/<redacted> · https://www.theregister.com/2026/02/20/anthropic_clarifies_ban_third_party_claude_access/ · https://winbuzzer.com/2026/01/10/<redacted>/
|
|
231
|
+
- TechCrunch — Cursor in talks to raise $2B at $50B as enterprise growth surges (2026-04-17): https://techcrunch.com/2026/04/17/<redacted>/
|
|
232
|
+
|
|
233
|
+
**Sourced (📄 — reputable, single-pass; cite with care):**
|
|
234
|
+
- TechTimes — AI-agent economics / token-tax 30 points below SaaS: https://www.techtimes.com/articles/317542/20260601/<redacted>.htm
|
|
235
|
+
- Yahoo Finance — high costs and thin margins threatening AI coding startups: https://finance.yahoo.com/news/<redacted>.html
|
|
236
|
+
- Market Clarity — is Cursor profitable (enterprise-positive / individual-negative margins): https://mktclarity.com/blogs/news/is-cursor-profitable
|
|
237
|
+
- TheRouter — Cursor Bugbot, Composer 2.5, model block-list governance: https://therouter.ai/news/<redacted>/
|
|
238
|
+
- ValueAdd VC — how a code editor became a $9B company: https://valueaddvc.com/blog/<redacted>
|
|
239
|
+
- GetPanto — Cursor AI statistics 2026: https://www.getpanto.ai/blog/cursor-ai-statistics
|
|
240
|
+
- Wikipedia — Anysphere / Cursor (company): https://en.wikipedia.org/wiki/Anysphere · https://en.wikipedia.org/wiki/Cursor_(company)
|
|
241
|
+
- MindStudio — Claude Code vs OpenAI Codex: https://www.mindstudio.ai/blog/claude-code-vs-openai-codex-comparison
|
|
242
|
+
- GitHub — About Copilot coding agent: https://docs.github.com/copilot/concepts/agents/coding-agent/about-coding-agent · noqta.tn (autonomous PR): https://noqta.tn/en/blog/<redacted>
|
|
243
|
+
- Coder — Compare Cursor / "is the IDE dead": https://coder.com/solutions/agents/compare-cursor · https://coder.com/blog/is-the-ide-dead-the-rise-of-agentic-ai-in-software-development
|
|
244
|
+
- MarkTechPost — AI coding agents & dev platforms 2026: https://www.marktechpost.com/2026/06/10/<redacted>/
|
|
245
|
+
|
|
246
|
+
**Contested (⚠️ — failed verification or excluded):**
|
|
247
|
+
- "$2B ARR + 1M paying subscribers by Feb 2026" — **refuted 1-2** (verified figure: $1B, Nov 2025); some 2026 outlets assert ~$2B speculatively.
|
|
248
|
+
- "$60B valuation / SpaceX-xAI acquisition (2026)" — **excluded as not credible** (low-quality sources). The credible April-2026 datapoint is the TechCrunch "$2B at ~$50B, in talks" line.
|
|
249
|
+
- "$200/mo plan ≈ $5,000 in real compute" — abstained; directionally consistent with negative-margin reporting, specific figure unverified.
|
|
250
|
+
|
|
251
|
+
**Internal (our positioning, read 2026-06-22):** [ADR 0065](../adr/<redacted>.md) (AGPL / non-profit / AI-first), [ADR 0062](../adr/<redacted>.md) (instance model, core↔host split), [`GOVERNANCE.md`](../../GOVERNANCE.md) (anti-capture principles); companion deep-research doc `component-based-dev-research.md` (uncommitted, module-system research, 2026-06-21).
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
*Harness stats: 5 angles · 22 sources fetched · 99 claims extracted · 25 verified (13 confirmed 3-0/2-1, 1 refuted 1-2, 11 abstained at the org spend-limit cutoff). Main-loop verification round (2026-06-22): 6 sources re-fetched/searched after the harness stopped, firming up funding history, the negative-margin/owned-model economics, the Anthropic supplier crackdown, and the Cursor 3 agent-orchestration pivot. Synthesis, threat-framing, and Cloud Bongos mapping by Claude (Opus 4.8).*
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# LLM Model-Agnostic Platform + Cheaper Grader — Tools Audit & Architecture Path
|
|
2
|
+
|
|
3
|
+
**A research/architecture spike for Cloud Bongos / Off the Boats**
|
|
4
|
+
Prepared 2026-06-28 · task [#1069](https://example.com/builders#/task/1069) · GDS-V4 · track `internal`
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 0. How to read this document (provenance)
|
|
9
|
+
|
|
10
|
+
This is a **doc-only research spike** — no code, migration, or config changed under it. It is grounded in a direct read of the live repo on 2026-06-28 (every coupling cited below was located with `grep` and a file read; line references are approximate and decorative — the file + function names are the load-bearing part). It does **two** things the task asked for:
|
|
11
|
+
|
|
12
|
+
- **Phase 1 — Tools/coupling audit.** A concrete inventory of *where* the platform is hard-wired to Anthropic/Claude today, file by file, so a build cluster knows exactly what to touch.
|
|
13
|
+
- **Phase 2 — Architecture path.** A recommended sequence to (a) a `ModelProvider` abstraction layer and (b) a cheaper grader, with trade-offs.
|
|
14
|
+
|
|
15
|
+
**Relationship to [ADR 0089](../adr/<redacted>.md).** The *direction* for both goals was already decided with the owner on 2026-06-26 and recorded in ADR 0089 (Accepted; build task-pending): a central work-type-parameterized grading engine, a cross-family ensemble (Claude + hosted open-weight judges), a `ModelProvider` adapter, and a hosted pay-per-call API for the open leg. **This spike does not re-decide any of that** — it supplies the missing input ADR 0089's "Implementation (task-pending)" section presumes: the *grounded coupling map* of the current codebase. Where this doc and ADR 0089 touch the same ground, ADR 0089 is the decision and this doc is the implementation reconnaissance feeding it.
|
|
16
|
+
|
|
17
|
+
> **Confidence marks:** ✅ verified against the live file this session · 🔧 my synthesis / recommendation · ⚠️ caveat or open question for the owner/build cluster.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 1. Executive summary
|
|
22
|
+
|
|
23
|
+
**Today the platform is Anthropic-specific in exactly two ways, and they are cleanly separable.** 🔧
|
|
24
|
+
|
|
25
|
+
1. **The spawn shape** — every LLM call the *platform* makes (grader workers, architect audit, scheduled routines, onboarding analysis, the dispatch ladder) shells out to the **`claude` CLI binary** with `claude -p --model <id> --output-format json`. There is no SDK, no HTTP client, no provider seam — the coupling is "we spawn a specific CLI and parse its JSON envelope."
|
|
26
|
+
2. **The model vocabulary** — model identity is a **three-token family string** (`opus` / `sonnet` / `haiku`) threaded through `selectGraderModel`, `llm-pricing`, `cascade-dispatch`, and `skill-prefs`. Cross-family adversariality is *within Anthropic only* (Opus author → Sonnet grader).
|
|
27
|
+
|
|
28
|
+
The good news for the build: **there is one chokepoint.** Almost every platform LLM call funnels through `grader.runSubagent({prompt, opts})` (and its cached sibling `runSubagentCached`). Architect-audit and the routine runner reuse it; the only spawns that *don't* go through it are a couple of CLI scripts that call `spawn('claude', …)` directly. So a `ModelProvider` port introduced **at `runSubagent`** captures the overwhelming majority of the surface in one place. ✅
|
|
29
|
+
|
|
30
|
+
**The cheaper grader is the same lever pulled differently.** Grading is purely *additive* spend (we pay Claude to write the code, then pay Claude again — Opus/Sonnet — to grade it). The grader prompt is mostly a **fixed rubric sent every call**, which makes it the ideal candidate for (a) a cheaper open-weight judge via the same `openai-compatible` adapter and (b) prompt-cache amortization (already partly handled by the content-addressed LLM cache, [ADR 0077](../adr/<redacted>.md)). 🔧
|
|
31
|
+
|
|
32
|
+
**Recommended sequence (detail in §6):** introduce the `ModelProvider` port at `runSubagent` with the existing Claude path as the only registered provider (zero behavior change) → add an `openai-compatible` adapter (DeepInfra/OpenRouter, BYOK, owner spend approval) → generalize `selectGraderModel` into a provider+model registry → run one open judge **advisory-only** (logs, does not gate) → promote to voting once the error-correlation audit ([ADR 0089](../adr/<redacted>.md) §5) shows agreement. This is exactly ADR 0089's staging; this doc just pins each stage to the real files.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 2. Phase 1 — The coupling audit (where Anthropic/Claude is wired in)
|
|
37
|
+
|
|
38
|
+
### 2.1 The single chokepoint: `runSubagent` (the CLI spawn)
|
|
39
|
+
|
|
40
|
+
The load-bearing coupling lives in **`modules/grading/grader.js` → `runSubagent({prompt, opts})`** (≈ line 902). ✅ It:
|
|
41
|
+
|
|
42
|
+
- spawns a binary resolved as `opts.claudeBin ?? process.env.OTB_CLAUDE_BIN ?? process.env.CLAUDE_BIN ?? 'claude'`;
|
|
43
|
+
- with args `['-p', '--print', '--model', model, '--output-format', 'json', '--tools', 'Read', '--disable-slash-commands', '--permission-mode', 'bypassPermissions']`;
|
|
44
|
+
- writes the prompt to the child's **stdin**, reads JSON from **stdout**;
|
|
45
|
+
- pulls the dollar cost out of the **Claude-specific `total_cost_usd` envelope field** (`extractCostUsd`, ≈ line 1012) and the result out of `env.result` (`extractAssistantResult`, ≈ line 1022).
|
|
46
|
+
|
|
47
|
+
Every assumption here is <redacted>: the binary name, the flag set (`--tools`, `--disable-slash-commands`, `--permission-mode`), the JSON envelope, and the cost field. **This is the function a `ModelProvider` port must wrap.** 🔧
|
|
48
|
+
|
|
49
|
+
There is already a thin escape hatch (`OTB_CLAUDE_BIN`/`CLAUDE_BIN`) and a cached wrapper `runSubagentCached` (≈ line 997) that routes through `api.llmCache`. The cache wrapper is provider-agnostic in shape (it keys on `{prompt, model, …}`) and will memoize an open-model call unchanged — confirmed by ADR 0077/0089. ✅
|
|
50
|
+
|
|
51
|
+
### 2.2 The model vocabulary: the `opus`/`sonnet`/`haiku` family triple
|
|
52
|
+
|
|
53
|
+
Model identity is a **substring-on-the-id** convention repeated in four places. None of them know about a *provider*; all assume the id contains one of three Anthropic family tokens:
|
|
54
|
+
|
|
55
|
+
| File | Function | Coupling | Mark |
|
|
56
|
+
|---|---|---|---|
|
|
57
|
+
| `modules/grading/grader.js` | `selectGraderModel({builderModel})` (≈ line 219) | Maps builder family → grader family, **Claude-only**: opus→`claude-sonnet-4-6`, sonnet/haiku→`claude-opus-4-7`. **Throws** on an id without opus/sonnet/haiku (intentional #117 guard — but it makes the function reject *any* non-Claude id outright). | ✅ |
|
|
58
|
+
| `modules/grading/grader.js` | constants `ASSUMED_BUILDER_MODEL='claude-opus-4-7'`, `DEFAULT_GRADER_MODEL='claude-sonnet-4-6'` (≈ lines 99–100, sourced from `grader-rubric.json`) | Hard-coded Claude default ids. | ✅ |
|
|
59
|
+
| `src/bongos/llm-pricing.js` | `familyFor(model)` + `PRICES` table (≈ lines 40–55) | USD/1M-token table keyed by the three Anthropic families; cache multipliers follow **Anthropic's** published 1.25×/2.0×/0.1× model. Unknown model → priced at opus rate + flagged. | ✅ |
|
|
60
|
+
| `src/bongos/cascade-dispatch.js` | `LADDER=['haiku','sonnet','opus']`, `rungIndex`, `startRungForKind` (≈ lines 28–50) | The (dormant, `OTB_AUTONOMY_ENABLED`-gated) cost-tier escalation ladder is three Anthropic rungs. | ✅ |
|
|
61
|
+
| `modules/builder-settings/skill-prefs.js` | `ALLOWED_MODELS = ['opus','sonnet','haiku','script']` (≈ line 29) | Per-builder model-ceiling vocabulary (migration 037) is the same three families + `script`. | ✅ |
|
|
62
|
+
|
|
63
|
+
**Implication:** "model-agnostic" requires generalizing this triple into a `{provider, model}` pair (or a model id the provider registry resolves), and `selectGraderModel`'s Claude-only branch + throw is the function ADR 0089 §3 calls out to replace with a provider registry. ✅
|
|
64
|
+
|
|
65
|
+
### 2.3 Other direct `claude` spawns (the scripts that bypass `runSubagent`)
|
|
66
|
+
|
|
67
|
+
Not everything goes through `runSubagent`. A `grep` for direct `claude` spawns / `CLAUDE_BIN` turned up these additional sites — each is a *second* spawn shape to bring under the port (or to leave as-is if it stays Claude-only): ✅
|
|
68
|
+
|
|
69
|
+
- **`scripts/gds/architect-audit.js`** — *reuses* `grader.runSubagentCached` (so it inherits the port for free) but hard-codes `ARCHITECT_MODEL = 'claude-opus-4-7'` (≈ line 55). One constant to parameterize.
|
|
70
|
+
- **`scripts/gds/run-routine.js`** — the scheduled-routine runner; `judgment`/`hybrid` modes "spawn `claude -p`" over a skill body (≈ lines 11–14, 140). Its own spawn helper.
|
|
71
|
+
- **`modules/autonomy/pollers/routine-timers.js`** — drives routine spawns (autonomy module).
|
|
72
|
+
- **`scripts/gds/onboarding-analyze.js`**, **`scripts/gds/newcomer-floor.js`**, **`scripts/gds/doctor.js`** — each references the `claude` binary directly (onboarding analysis, newcomer-floor classification, env doctor checks).
|
|
73
|
+
- **`scripts/gds/session-cost.js`** — does **not** spawn; it *parses* Claude Code's transcript layout: `~/.claude/projects/<encoded-cwd>/*.jsonl`, per-turn `message.usage` token blocks, and excludes grader-worker subprocess transcripts (≈ lines 32–86, `priceTranscript` ≈ line 140). This is a coupling to the **Claude Code interactive harness's on-disk format**, not to the model — see §2.4.
|
|
74
|
+
|
|
75
|
+
### 2.4 The interactive session is coupled to the harness, not just the model
|
|
76
|
+
|
|
77
|
+
The main builder session runs inside the **Claude Code CLI harness** itself, which is a deeper coupling than the model id:
|
|
78
|
+
|
|
79
|
+
- **`session-cost.js`** reads the harness's JSONL transcript format and prices it with `llm-pricing` (the interactive session has no `total_cost_usd` envelope, only token counts — that's the whole reason `llm-pricing.js` exists, per its header). ✅
|
|
80
|
+
- The **subagent model-routing policy** lives in `CLAUDE.md §2` as prose ("main session = Opus 4.8 (1M); subagents set `model` explicitly; Haiku for plumbing, Opus for everything else"). It is a *human/agent instruction*, not code — so "model-agnostic" at the interactive tier is partly a **docs/policy** change, not only a code change. ⚠️
|
|
81
|
+
- `scripts/gds/cli-lib.js`, `setup.js`, `me.js`, `auth.js`, `db.js`, `db-kernel.js` matched the grep but on inspection reference Claude only in **comments / `~/.config/otb/` paths / the `claude`-CLI auth story**, not in a model call. Low-priority for a provider port; relevant only if the platform ever wants the *interactive* tier on a non-Claude harness (out of scope for ADR 0089, which targets the **grader/platform** calls, not the human's editor). ✅🔧
|
|
82
|
+
|
|
83
|
+
### 2.5 What is NOT coupled (already abstracted, leave alone)
|
|
84
|
+
|
|
85
|
+
- **The content-addressed LLM cache** ([ADR 0077](../adr/<redacted>.md), `api.llmCache`) — provider-agnostic by shape; memoizes any `{prompt, model}` call. No change needed; it's a free win for the open leg. ✅
|
|
86
|
+
- **The worker contract** (`buildPrompt`/`extractJson`/`computeVerdict` in `modules/grading/grader-workers/`) — model-independent; it builds a prompt and parses JSON. A different model that returns the same JSON schema slots in with no worker change. ✅
|
|
87
|
+
- **The deterministic pre-passes** (route-rank, permission-path — `routeRankCheck`/`permissionPathCheck`) — zero-LLM, no model coupling, and per ADR 0089 §6 they **must stay** the authoritative security gate regardless of which model grades quality. ✅
|
|
88
|
+
- **The art/vision pipeline** (`modules/art-pipeline/`, Gemini) — a *separate* provider coupling (Google, not Anthropic). ADR 0089 §7 folds it into the same work-type seam later; out of scope for *this* spike's Anthropic-focused audit but flagged so the build cluster knows the second provider exists. ⚠️
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 3. The coupling map at a glance
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
┌────────────────────────────────────────────┐
|
|
96
|
+
PLATFORM LLM CALLS │ selectGraderModel() ── Claude-only if/else │ ← §2.2 vocabulary
|
|
97
|
+
│ (opus/sonnet/haiku family triple) │
|
|
98
|
+
└───────────────────┬──────────────────────────┘
|
|
99
|
+
│ model id (claude-*)
|
|
100
|
+
┌─────────────────────────┐ ▼
|
|
101
|
+
│ grader workers (panel) │──┐ ┌───────────────────────┐
|
|
102
|
+
│ architect-audit.js │──┼──▶│ grader.runSubagent() │ ← §2.1 THE CHOKEPOINT
|
|
103
|
+
│ (via runSubagentCached) │ │ │ spawn('claude', …) │ (CLI binary + JSON envelope
|
|
104
|
+
└─────────────────────────┘ │ │ parse total_cost_usd │ + total_cost_usd cost field)
|
|
105
|
+
│ └───────────────────────┘
|
|
106
|
+
┌─────────────────────────┐ │
|
|
107
|
+
│ run-routine.js │──┘ (own spawn — §2.3, bring under port)
|
|
108
|
+
│ onboarding-analyze.js │
|
|
109
|
+
│ newcomer-floor / doctor │
|
|
110
|
+
└─────────────────────────┘
|
|
111
|
+
|
|
112
|
+
┌─────────────────────────┐ reads ~/.claude/projects/*.jsonl ← §2.4 harness coupling
|
|
113
|
+
│ session-cost.js │──▶ prices via llm-pricing.familyFor() ← §2.2 vocabulary
|
|
114
|
+
└─────────────────────────┘ (interactive tier; no envelope)
|
|
115
|
+
|
|
116
|
+
ZERO-LLM, NO COUPLING (leave): route-rank · permission-path · llm-cache · worker contract
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 4. Phase 2 — Architecture path: the `ModelProvider` abstraction
|
|
122
|
+
|
|
123
|
+
### 4.1 The seam: a `ModelProvider` port wrapping `runSubagent`
|
|
124
|
+
|
|
125
|
+
🔧 Introduce a small port whose single method is "given a prompt + model spec, return `{ text, costUsd, raw }`". The current `runSubagent` becomes the **`anthropic-cli` provider** — the only one registered at first, so behavior is identical.
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
ModelProvider (port)
|
|
129
|
+
.complete({ prompt, model, tools, timeoutMs, cwd, cache }) -> { text, costUsd, raw, runMs }
|
|
130
|
+
|
|
131
|
+
providers:
|
|
132
|
+
anthropic-cli (today's runSubagent: spawn `claude -p`, parse total_cost_usd) [default]
|
|
133
|
+
openai-compatible (HTTP POST to a base-URL chat/completions endpoint; one adapter
|
|
134
|
+
covers DeepInfra / OpenRouter / Together / Fireworks / Groq /
|
|
135
|
+
vLLM / Ollama by base-URL + key) [later]
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
This matches ADR 0089 §3's `ModelProvider` decision exactly. The cost field abstracts the Anthropic-specific `total_cost_usd`: the `anthropic-cli` provider reads the envelope; the `openai-compatible` provider derives cost from `usage` tokens × a price table (reusing/extending `llm-pricing.js`, which is already a pure tokens→USD function — see §4.3). ✅🔧
|
|
139
|
+
|
|
140
|
+
**Why wrap at `runSubagent` and not higher (e.g. `gradeSubagent`):** `runSubagent` is the lowest common point every platform call already reaches (workers, architect-audit). Wrapping there is the minimal-diff seam — `gradeSubagent`, the worker runner, and architect-audit need no change beyond passing a `{provider, model}` instead of a bare model string. 🔧
|
|
141
|
+
|
|
142
|
+
### 4.2 Generalizing the model vocabulary
|
|
143
|
+
|
|
144
|
+
🔧 Replace the bare `opus`/`sonnet`/`haiku` substring convention with a `{ provider, model }` descriptor (or a registry that resolves an id → provider). Concretely:
|
|
145
|
+
|
|
146
|
+
- **`selectGraderModel`** → a **panel-composition resolver**: given the author's model, return the *list* of `{provider, model}` judges (today: one Claude judge of a different family; later: Claude + one open-weight judge). Its current `throw` on a non-Claude id (#117 guard) becomes a registry lookup miss instead of a hard throw. ✅🔧
|
|
147
|
+
- **`skill-prefs.ALLOWED_MODELS`** and **`cascade-dispatch.LADDER`** → extend the vocabulary to admit provider-qualified models. ⚠️ This touches `modules/builder-settings/` (migration 037 jsonb) — a **separate task** from the grader work; flag it as a dependency, do not bundle.
|
|
148
|
+
- Keep the three-family **price** semantics in `llm-pricing.js` for Claude, and **add open-model price rows** behind `familyFor` (or a provider-keyed table). ✅
|
|
149
|
+
|
|
150
|
+
### 4.3 Cost accounting for a non-Claude provider
|
|
151
|
+
|
|
152
|
+
✅ `llm-pricing.js` is already a clean, pure `priceUsage(model, usage)` → USD function (it exists precisely because the interactive session has token counts but no envelope). The `openai-compatible` adapter returns `usage` (input/output tokens), so the cost path is: **adapter `usage` → `llm-pricing.priceUsage` → cost_log**, mirroring how `session-cost.js` already prices the interactive tier. The only additions are open-model price rows + (optionally) a provider key so a Llama/Qwen/DeepSeek id doesn't fall through `familyFor`'s unknown→opus-rate path and over-price itself. ⚠️ The cache-multiplier model (1.25×/2.0×/0.1×) is Anthropic-specific; open providers have their own (often near-free) cached-input pricing — add a per-provider multiplier set rather than reusing Anthropic's.
|
|
153
|
+
|
|
154
|
+
### 4.4 Trust boundary (non-negotiable, from ADR 0089 §6)
|
|
155
|
+
|
|
156
|
+
An open-model verdict that gates a ship is a **content-injection surface** ([ADR 0080](../adr/<redacted>.md)). The abstraction must preserve:
|
|
157
|
+
|
|
158
|
+
- **Deterministic pre-passes stay authoritative + zero-LLM.** No LLM verdict (Claude or open) can upgrade a route-rank / permission-path fail to pass. The provider port grades *quality* only. ✅
|
|
159
|
+
- **Server-side guards (`serverSideGuards`) stay downgrade-only.** The existing envelope (re-run deterministic checks server-side, implausible-pass plausibility bound) is provider-independent and must wrap an open judge's verdict identically. ✅
|
|
160
|
+
- **Full audit logging.** Each judge's `{provider, model, raw response}` lands in `signals` so a bad/poisoned verdict is traceable. 🔧
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 5. Phase 2 — The cheaper grader (the second goal, same lever)
|
|
165
|
+
|
|
166
|
+
The grader is the **single best place to spend a cheaper model**, for three reasons grounded in the current code: 🔧
|
|
167
|
+
|
|
168
|
+
1. **It's additive spend on a fixed prompt.** The worker prompts are a large *fixed rubric* (`grader-rubric.json` + the default-fail `PROMPT_HEADER`) prepended to a per-task diff. A fixed prefix is the ideal cached-input shape — and the LLM cache already memoizes identical `{prompt, model}` grades (§2.5). An open provider's near-free cached input compounds this.
|
|
169
|
+
2. **Verification ≠ authorship.** ADR 0089's research finding: a small cross-*lineage* panel correlates *better* with human/owner judgment than one big same-family judge, and is >7× cheaper (PoLL/Verga 2024). The cheaper model isn't a quality compromise — for *judging*, independence is the quality.
|
|
170
|
+
3. **The worker contract is already model-independent.** A judge that returns the same `{functional_fidelity, code_quality, economy, confidence, issues}` JSON slots in with zero worker-code change (§2.5).
|
|
171
|
+
|
|
172
|
+
**Cost shape (from ADR 0089's analysis, not re-verified here):** ⚠️ a few-thousand-grades/month workload on a hosted open API (DeepInfra/OpenRouter) is ~$1–5/mo, with prompt-caching pushing input cost toward zero; self-hosting a GPU (~$200+/mo idle) never breaks even at this volume and is rejected. Treat the specific per-token numbers as provisional vendor figures to confirm at adoption.
|
|
173
|
+
|
|
174
|
+
**Concrete cheaper-grader moves, in dependency order:** 🔧
|
|
175
|
+
|
|
176
|
+
1. Land the `openai-compatible` provider (§4.1) — prerequisite.
|
|
177
|
+
2. Add **one** open-weight code judge (e.g. a DeepSeek/Qwen-class model) **advisory-only**: it grades and logs to `signals.workers[]`, its verdict does **not** gate. (Pick the checkpoint by live eval against `grade_attempts`, not vendor benchmarks.)
|
|
178
|
+
3. Run the **error-correlation audit** (ADR 0089 §5) — replay labeled past grades, compute per-judge Cohen's κ vs owner confirm/reject + pairwise error-correlation.
|
|
179
|
+
4. **Only then** promote the open judge to a voting member and (optionally) move one *lens* (e.g. the lighter Hacker/Efficiency workers) off Claude to the open judge to actually *reduce* the Claude bill — keeping Claude as the quality floor.
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 6. Recommended sequence (what to build, in order)
|
|
184
|
+
|
|
185
|
+
🔧 This mirrors ADR 0089's "Implementation (task-pending)" staging, pinned to the files this audit found. Each step is a candidate GDS task; each is behind a flag and ships without destabilizing the live gate.
|
|
186
|
+
|
|
187
|
+
| # | Step | Primary files | Behavior change | Owner cost ask |
|
|
188
|
+
|---|---|---|---|---|
|
|
189
|
+
| 1 | **`ModelProvider` port at `runSubagent`** | `modules/grading/grader.js` (`runSubagent`, `runSubagentCached`, `extractCostUsd`) | None — Claude is the only registered provider | none |
|
|
190
|
+
| 2 | **`openai-compatible` adapter** (base-URL + key; cost via `usage`) | new adapter + `src/bongos/llm-pricing.js` (open-model rows) | None until called | **BYOK open-model key; spend go-ahead** |
|
|
191
|
+
| 3 | **Generalize `selectGraderModel` → panel-composition resolver** ({provider, model} list) | `modules/grading/grader.js`; `grader-rubric.json` (panel config) | None — still resolves to one Claude judge by default | none |
|
|
192
|
+
| 4 | **Open judge, advisory-only** (grades + logs, does not gate) | `modules/grading/grader-workers/`, `grader.js` aggregation | Open verdict logged in `signals`; gate unchanged | the first live open-model spend |
|
|
193
|
+
| 5 | **Error-correlation audit routine** | new `.claude/scheduled-tasks/` routine + read `grade_attempts` | none (offline) | negligible |
|
|
194
|
+
| 6 | **Promote open judge to voting; move a lens off Claude** | `grader.js` aggregation (normalize + median + hard-veto) | Gate composition changes (flagged) | net-neutral/negative |
|
|
195
|
+
| 7 | **(Adjacent) generalize `skill-prefs`/`cascade-dispatch` vocabulary** | `modules/builder-settings/skill-prefs.js`, `src/bongos/cascade-dispatch.js` | per-builder model picks admit providers | none |
|
|
196
|
+
|
|
197
|
+
**Sequencing rationale:** steps 1–3 are pure-refactor / zero-behavior-change groundwork that can land safely under the live gate; the first real spend (and the first owner approval) is step 2's key + step 4's first call. The cheaper-grader payoff (step 6) is deliberately *last*, gated on the audit (step 5) proving the open judge agrees with the owner — never trade quality for cost on faith. Step 7 is adjacent vocabulary work that should be its **own** task (it touches `modules/builder-settings/` + a jsonb column) and is *not* a blocker for the grader path.
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 7. Open questions for the owner / build cluster
|
|
202
|
+
|
|
203
|
+
- ⚠️ **Provider + checkpoint.** ADR 0089 names DeepInfra/OpenRouter as transport and DeepSeek/Qwen-class as the open code judge, but says to pick the exact checkpoint by *live evaluation*, not vendor numbers. The error-correlation audit (step 5) is the decision instrument — build it before committing to a specific model.
|
|
204
|
+
- ⚠️ **Interactive-tier scope.** This spike (and ADR 0089) target the **platform/grader** calls. Making the *human's interactive session* model-agnostic (a different harness than Claude Code) is a much larger, separate question — `session-cost.js`'s transcript-format coupling (§2.4) and the `CLAUDE.md §2` routing policy would both move. Recommend explicitly **deferring** it; GDS-V4's per-builder model preferences ([idea #30](https://example.com/builders#/idea/30)) is the place that conversation belongs.
|
|
205
|
+
- ⚠️ **The Gemini/vision provider** is a second, parallel coupling (Google, in `modules/art-pipeline/`). ADR 0089 §7 folds it into the same work-type seam; if the build cluster wants one provider abstraction to cover *both* Anthropic and Google, the port in §4.1 should be designed with the vision path in mind from step 1 (a `complete` that can carry image evidence), not retrofitted.
|
|
206
|
+
- ⚠️ **`selectGraderModel`'s #117 throw.** It deliberately throws on an unrecognized model id to avoid silently grading on a wrong cross-family assumption. The provider-registry refactor must preserve that loud-failure intent (a misconfigured provider/model should fail loudly, not default silently) — don't regress the #117 guard into a silent fallback.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## 8. Follow-up code tasks (recommendations — not created by this spike)
|
|
211
|
+
|
|
212
|
+
Per the task's instruction, this doc lists recommended follow-ups rather than creating them. Each maps to a row in §6:
|
|
213
|
+
|
|
214
|
+
1. **`ModelProvider` port + `anthropic-cli` provider** (refactor `runSubagent`; no behavior change). [§6 step 1]
|
|
215
|
+
2. **`openai-compatible` provider adapter** + open-model price rows in `llm-pricing.js` (BYOK key; owner spend approval). [§6 steps 2–3]
|
|
216
|
+
3. **Open code judge, advisory-only** — log to `signals`, do not gate. [§6 step 4]
|
|
217
|
+
4. **Error-correlation audit routine** — κ + pairwise correlation over `grade_attempts`. [§6 step 5]
|
|
218
|
+
5. **Promote open judge to voting** + heterogeneous aggregation (z-score/rank normalize → median + hard-veto). [§6 step 6]
|
|
219
|
+
6. **Generalize per-builder model vocabulary** (`skill-prefs`, `cascade-dispatch`) to admit providers — separate, non-blocking. [§6 step 7]
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 9. Sources
|
|
224
|
+
|
|
225
|
+
- The live repo, read 2026-06-28: `modules/grading/grader.js`, `modules/grading/grader-workers/index.js`, `modules/grading/CLAUDE.md`, `src/bongos/llm-pricing.js`, `src/bongos/cascade-dispatch.js`, `modules/builder-settings/skill-prefs.js`, `scripts/gds/ci-grade.js`, `scripts/gds/architect-audit.js`, `scripts/gds/session-cost.js`, `scripts/gds/run-routine.js`.
|
|
226
|
+
- [ADR 0089 — Modular, multi-model adversarial grader](../adr/<redacted>.md) (the accepted direction this spike grounds; includes the external literature + market sweep — self-preference, PoLL, *Nine Judges*, open-weight model licenses, hosting math).
|
|
227
|
+
- [ADR 0028 — Honest LLM spend accounting](../adr/<redacted>.md), [ADR 0077 — Content-addressed LLM cache](../adr/<redacted>.md), [ADR 0080 — LLM cache API transport & trust model](../adr/<redacted>.md), [ADR 0062 — Instance-model decoupling](../adr/<redacted>.md), [ADR 0021 — Per-builder skill model preferences](../adr/<redacted>.md).
|