@bongos/core 1.23.21 → 1.24.1
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 +983 -428
- package/.claude/skills/blocker-review/SKILL.md +9 -1
- package/.claude/skills/blocker-solve/SKILL.md +1 -1
- package/.claude/skills/builder-claim/SKILL.md +1 -1
- package/.claude/skills/builder-reauth/SKILL.md +1 -1
- package/.claude/skills/builder-redteam/SKILL.md +1 -1
- package/.claude/skills/builder-sequence/SKILL.md +1 -1
- package/.claude/skills/builder-setup/SKILL.md +1 -1
- package/.claude/skills/builder-ship/SKILL.md +1 -1
- package/.claude/skills/collab-review/SKILL.md +5 -2
- package/.claude/skills/design/SKILL.md +1 -1
- package/.claude/skills/goal-create/SKILL.md +6 -3
- package/.claude/skills/grade-recover/SKILL.md +1 -1
- package/.claude/skills/merge-mode/SKILL.md +1 -1
- package/.claude/skills/owner-review/SKILL.md +1 -1
- package/.claude/skills/planning-session/SKILL.md +11 -11
- package/.claude/skills/read-session-export/SKILL.md +1 -1
- package/.claude/skills/recall/SKILL.md +1 -1
- package/.claude/skills/scan-before-install/SKILL.md +1 -1
- package/.claude/skills/session-handoff/SKILL.md +1 -1
- package/.claude/skills/strand-fix/SKILL.md +13 -0
- package/.claude/skills/worktree-clean/SKILL.md +1 -1
- package/AGENTS.md +15 -0
- package/GEMINI.md +5 -0
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +94 -0
- package/clients/bongos-client/index.cjs +94 -0
- package/clients/bongos-client/index.d.ts +154 -4
- package/clients/bongos-client/index.mjs +94 -0
- package/docs/adr/0054-session-token-reward-cost-plus.md +3 -1
- package/docs/adr/0055-server-mediated-branch-publish.md +1 -1
- package/docs/adr/0385-money-lives-with-a-processor-credits-stay-a-project-meter.md +87 -0
- package/docs/adr/0386-the-funding-wall-is-a-per-project-rule-claim-time-hold-by-default.md +37 -0
- package/docs/adr/0387-two-ledgers-credits-measure-work-money-stays-with-the-processor.md +39 -0
- package/docs/adr/0388-a-module-sale-is-split-by-the-project-the-buyer-pays-the-platform-fee.md +42 -0
- package/docs/adr/0392-ai-generation-runs-on-a-processor-held-balance-and-the-builders-own-keys.md +33 -0
- package/docs/adr/0393-a-platform-account-is-a-person-and-github-is-one-way-in.md +37 -0
- package/docs/adr/0394-market-watch-searches-through-the-messages-api-on-the-projects-key-and-runs-from-its-own-poller.md +102 -0
- package/docs/adr/0395-a-task-says-what-it-needs-and-lists-show-only-what-you-can-do.md +36 -0
- package/docs/adr/0396-google-sign-in-a-stand-in-login-and-a-browser-approved-cli-sign-in.md +41 -0
- package/docs/adr/README.md +10 -1
- package/docs/api/openapi.json +8619 -5885
- package/docs/api-reference.md +68 -9
- package/docs/architecture.md +37 -1
- package/docs/canonical-permissions.md +1 -1
- package/docs/copy-inventory.md +420 -337
- package/docs/copy-registry.json +1321 -500
- package/docs/file-map.md +4 -0
- package/docs/module-api-changelog.md +7 -0
- package/docs/onboarding/diagrams/03-drachmae-karma.mmd +3 -3
- package/docs/onboarding/diagrams/README.md +1 -1
- package/docs/onboarding/drachmae-and-karma.md +15 -15
- package/docs/onboarding/primer.md +2 -2
- package/docs/page-inventory.json +55 -6
- package/docs/page-readings.json +1185 -1011
- package/docs/recipes/google-sign-in.md +60 -0
- package/docs/recipes/ops-gotchas.md +1 -1
- package/migrations/core_282_builders_lower_login_idx.sql +33 -0
- package/migrations/core_283_claimable_ignores_page_markers.sql +53 -0
- package/migrations/core_283_payout_approvals.sql +183 -0
- package/migrations/core_284_payout_gates.sql +179 -0
- package/migrations/core_285_task_needs.sql +74 -0
- package/modules/ai-studio/CLAUDE.md +15 -0
- package/modules/ai-studio/billing.js +67 -0
- package/modules/ai-studio/context.js +29 -0
- package/modules/ai-studio/db.js +172 -0
- package/modules/ai-studio/gemini.js +75 -0
- package/modules/ai-studio/generate.js +119 -0
- package/modules/ai-studio/keys.js +73 -0
- package/modules/ai-studio/migrations/ai_studio_001_keys.sql +22 -0
- package/modules/ai-studio/migrations/ai_studio_002_ledger.sql +48 -0
- package/modules/ai-studio/migrations/ai_studio_003_requests.sql +55 -0
- package/modules/ai-studio/module.json +26 -0
- package/modules/ai-studio/openrouter.js +90 -0
- package/modules/ai-studio/payments.js +105 -0
- package/modules/ai-studio/pricing.js +92 -0
- package/modules/ai-studio/routes/ai-studio.js +252 -0
- package/modules/ai-studio/studio.js +121 -0
- package/modules/autonomy/fence.js +64 -1
- package/modules/builder-settings/builder-needs.js +27 -1
- package/modules/copy-desk/routes/copy-desk.js +5 -0
- package/modules/economy/achievements.js +22 -10
- package/modules/economy/cost-classify.js +9 -0
- package/modules/economy/cost-write-guard.js +52 -0
- package/modules/economy/cost.js +2 -1
- package/modules/economy/credits.js +18 -15
- package/modules/economy/goal-reward.js +161 -0
- package/modules/economy/reward.js +4 -0
- package/modules/economy/routes/cost.js +33 -7
- package/modules/government/catalog.js +6 -0
- package/modules/government/db.js +108 -0
- package/modules/government/docket.js +36 -0
- package/modules/government/migrations/government_035_payout_approve.sql +29 -0
- package/modules/government/pollers/board-expiry.js +108 -20
- package/modules/government/protected-surfaces.json +1 -0
- package/modules/government/routes/government.js +50 -18
- package/modules/government/routing.js +39 -5
- package/modules/government/waiting.js +74 -0
- package/modules/grading/grader-subagent.js +30 -11
- package/modules/hall-ui/public/ai-studio-lib.js +268 -0
- package/modules/hall-ui/public/ai-studio.css +193 -0
- package/modules/hall-ui/public/ai-studio.html +98 -0
- package/modules/hall-ui/public/ai-studio.js +556 -0
- package/modules/hall-ui/public/ai-studio.states.json +94 -0
- package/modules/hall-ui/public/blockers-by-person.js +156 -0
- package/modules/hall-ui/public/blockers-lib.js +15 -1
- package/modules/hall-ui/public/blockers.html +8 -0
- package/modules/hall-ui/public/blockers.js +1 -1
- package/modules/hall-ui/public/city.html +15 -15
- package/modules/hall-ui/public/claim-action.js +3 -0
- package/modules/hall-ui/public/collab.html +12 -0
- package/modules/hall-ui/public/craft-mode.js +4 -1
- package/modules/hall-ui/public/criterion-uat-ui.js +4 -1
- package/modules/hall-ui/public/drachmae.html +1 -1
- package/modules/hall-ui/public/genesis/r5-life-1-primordial-sea.jpg +0 -0
- package/modules/hall-ui/public/genesis/r5-life-2-first-cells-cut.webp +0 -0
- package/modules/hall-ui/public/genesis/r5-life-2-first-cells.jpg +0 -0
- package/modules/hall-ui/public/genesis/r5-life-3-genome-cut.webp +0 -0
- package/modules/hall-ui/public/genesis/r5-life-3-genome.jpg +0 -0
- package/modules/hall-ui/public/genesis/r5-life-4-membrane-cut.webp +0 -0
- package/modules/hall-ui/public/genesis/r5-life-4-membrane.jpg +0 -0
- package/modules/hall-ui/public/genesis/r5-life-5-nervous-system-cut.webp +0 -0
- package/modules/hall-ui/public/genesis/r5-life-5-nervous-system.jpg +0 -0
- package/modules/hall-ui/public/goal-inbox.js +1 -1
- package/modules/hall-ui/public/goals-render.js +4 -0
- package/modules/hall-ui/public/goals.html +8 -0
- package/modules/hall-ui/public/gov-living.js +6 -2
- package/modules/hall-ui/public/hall-ask.css +5 -0
- package/modules/hall-ui/public/hall-ask.js +39 -3
- package/modules/hall-ui/public/notes-panel.css +20 -0
- package/modules/hall-ui/public/notes-panel.js +146 -0
- package/modules/hall-ui/public/project-settings.html +1 -1
- package/modules/hall-ui/public/project-settings.js +7 -5
- package/modules/hall-ui/public/settings-ai-keys.js +124 -0
- package/modules/hall-ui/public/settings.html +15 -0
- package/modules/hall-ui/public/street-deck.js +12 -3
- package/modules/hall-ui/public/studio.css +90 -8
- package/modules/hall-ui/public/studio.html +39 -10
- package/modules/hall-ui/public/studio.js +148 -18
- package/modules/hall-ui/public/task.html +2 -0
- package/modules/hall-ui/public/task.js +4 -0
- package/modules/hall-ui/public/tweak-editor.js +12 -3
- package/modules/hall-ui/public/welcome-boot.css +42 -6
- package/modules/hall-ui/public/welcome-boot.js +20 -6
- package/modules/hall-ui/public/work.js +20 -0
- package/modules/hall-ui/records/ai-studio.md +36 -0
- package/modules/hall-ui/records/blockers-people.md +24 -0
- package/modules/lifecycle/db-analytics.js +10 -3
- package/modules/lifecycle/db-claims.js +32 -4
- package/modules/lifecycle/db-goals.js +48 -18
- package/modules/lifecycle/db-shared.js +9 -0
- package/modules/lifecycle/db-tasks.js +15 -6
- package/modules/lifecycle/db-versions.js +21 -8
- package/modules/lifecycle/done-when.js +23 -1
- package/modules/lifecycle/lifecycle.js +5 -0
- package/modules/lifecycle/migrations/lifecycle_017_notes.sql +46 -0
- package/modules/lifecycle/module.json +2 -1
- package/modules/lifecycle/notes.js +219 -0
- package/modules/lifecycle/page-notice.js +124 -0
- package/modules/lifecycle/page-tweak-artist.js +18 -1
- package/modules/lifecycle/publish-reconciler.js +67 -20
- package/modules/lifecycle/routes/claims.js +5 -2
- package/modules/lifecycle/routes/goals.js +3 -1
- package/modules/lifecycle/routes/notes.js +91 -0
- package/modules/lifecycle/routes/project-settings.js +43 -35
- package/modules/lifecycle/routes/task-route-helpers.js +21 -0
- package/modules/lifecycle/routes/task-write-routes.js +21 -3
- package/modules/lifecycle/routes/tasks.js +12 -12
- package/modules/lifecycle/ship-assurance.js +4 -1
- package/modules/lifecycle/ship-card.js +8 -2
- package/modules/lifecycle/task-needs-gate.js +70 -0
- package/modules/market-watch/CLAUDE.md +15 -0
- package/modules/market-watch/db.js +340 -0
- package/modules/market-watch/key.js +58 -0
- package/modules/market-watch/migrations/market_watch_001_tables.sql +249 -0
- package/modules/market-watch/migrations/market_watch_002_run.sql +46 -0
- package/modules/market-watch/module.json +26 -0
- package/modules/market-watch/pollers/hub-seed.js +54 -0
- package/modules/market-watch/pollers/weekly-run.js +100 -0
- package/modules/market-watch/research.js +350 -0
- package/modules/market-watch/run.js +245 -0
- package/modules/market-watch/seed/market-data.json +38 -0
- package/modules/market-watch/seed/partners-data.json +497 -0
- package/modules/market-watch/seed.js +252 -0
- package/modules/market-watch/store.js +230 -0
- package/modules/memory/routes/memory.js +14 -2
- package/modules/memory/routes/search.js +8 -2
- package/modules/onboarding/howto-moments.js +8 -1
- package/modules/platform-identity/account-logins.js +192 -0
- package/modules/platform-identity/migrations/platform_identity_034_account_logins.sql +96 -0
- package/modules/platform-identity/platform-identity.js +5 -4
- package/modules/platform-identity/routes/my-projects.js +6 -0
- package/modules/platform-identity/routes/profile.js +18 -0
- package/modules/platform-identity/routes/public-profile.js +10 -1
- package/modules/platform-identity/routes/sso.js +26 -1
- package/modules/platform-identity/tests/platform-identity.mjs +2 -1
- package/modules/provisioning/credential-preflight.js +13 -3
- package/modules/provisioning/pollers/app-liveness.js +25 -5
- package/modules/provisioning/routes/provisioning.js +1 -1
- package/modules/provisioning/starter-bundles.js +8 -2
- package/modules/public-landing/public/account.html +10 -2
- package/modules/public-landing/public/assets/world/r2-bongos-chrome-b.jpg +0 -0
- package/modules/public-landing/public/assets/world/r2-bongos-chrome-b.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r2-bongos-chrome-b.webp +0 -0
- package/modules/public-landing/public/assets/world/r2-bongos-chrome-b.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r2-chrome-blob-one-cut.webp +0 -0
- package/modules/public-landing/public/assets/world/r2-chrome-blob-one-cut.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg +0 -0
- package/modules/public-landing/public/assets/world/r2-chrome-blob-one.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r2-chrome-blob-one.webp +0 -0
- package/modules/public-landing/public/assets/world/r2-chrome-blob-one.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r2-chrome-blobs-set.jpg +0 -0
- package/modules/public-landing/public/assets/world/r2-chrome-blobs-set.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r2-chrome-blobs-set.webp +0 -0
- package/modules/public-landing/public/assets/world/r2-chrome-blobs-set.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r3-frost-bead-cut.webp +0 -0
- package/modules/public-landing/public/assets/world/r3-frost-bead-cut.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r3-frost-pair-cut.webp +0 -0
- package/modules/public-landing/public/assets/world/r3-frost-pair-cut.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r3-gold-blob-cut.webp +0 -0
- package/modules/public-landing/public/assets/world/r3-gold-blob-cut.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r3-gold-pair-cut.webp +0 -0
- package/modules/public-landing/public/assets/world/r3-gold-pair-cut.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r3-obsidian-blob-cut.webp +0 -0
- package/modules/public-landing/public/assets/world/r3-obsidian-blob-cut.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r3-obsidian-pair-cut.webp +0 -0
- package/modules/public-landing/public/assets/world/r3-obsidian-pair-cut.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r3-space-nebula.jpg +0 -0
- package/modules/public-landing/public/assets/world/r3-space-nebula.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r4-card-chrome.jpg +0 -0
- package/modules/public-landing/public/assets/world/r4-card-chrome.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r4-card-nebula.jpg +0 -0
- package/modules/public-landing/public/assets/world/r4-card-nebula.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r5-life-1-primordial-sea.jpg +0 -0
- package/modules/public-landing/public/assets/world/r5-life-1-primordial-sea.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r5-life-2-first-cells-cut.webp +0 -0
- package/modules/public-landing/public/assets/world/r5-life-2-first-cells-cut.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r5-life-2-first-cells.jpg +0 -0
- package/modules/public-landing/public/assets/world/r5-life-2-first-cells.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r5-life-3-genome-cut.webp +0 -0
- package/modules/public-landing/public/assets/world/r5-life-3-genome-cut.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r5-life-3-genome.jpg +0 -0
- package/modules/public-landing/public/assets/world/r5-life-3-genome.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r5-life-4-membrane-cut.webp +0 -0
- package/modules/public-landing/public/assets/world/r5-life-4-membrane-cut.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r5-life-4-membrane.jpg +0 -0
- package/modules/public-landing/public/assets/world/r5-life-4-membrane.jpg.json +1 -1
- package/modules/public-landing/public/assets/world/r5-life-5-nervous-system-cut.webp +0 -0
- package/modules/public-landing/public/assets/world/r5-life-5-nervous-system-cut.webp.json +1 -1
- package/modules/public-landing/public/assets/world/r5-life-5-nervous-system.jpg +0 -0
- package/modules/public-landing/public/assets/world/r5-life-5-nervous-system.jpg.json +1 -1
- package/modules/public-landing/public/community.html +1 -1
- package/modules/public-landing/public/connections.html +2 -2
- package/modules/public-landing/public/guild.html +1 -1
- package/modules/public-landing/public/invitations.html +2 -2
- package/modules/public-landing/public/projects.html +5 -5
- package/modules/raise/views/nda.html +2 -0
- package/modules/specialities/db.js +32 -1
- package/modules/specialities/routes/specialities.js +10 -6
- package/modules/status-ui/public/index.html +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +286 -0
- package/scripts/bongos/autobongos-tweak-lane.js +46 -1
- package/scripts/bongos/backfill-subagent-rewards.js +2 -2
- package/scripts/bongos/claim.js +22 -1
- package/scripts/bongos/db-backup-nightly.sh +29 -0
- package/scripts/bongos/deploy-divergence.js +7 -0
- package/scripts/bongos/doc-cli-guard.js +6 -0
- package/scripts/bongos/fitness.js +3 -2
- package/scripts/bongos/gen-diagrams.js +3 -3
- package/scripts/bongos/lib.sh +4 -5
- package/scripts/bongos/migration-namespace.js +13 -1
- package/scripts/bongos/plain-cards.js +4 -0
- package/scripts/bongos/provision-github-setup.js +3 -1
- package/scripts/bongos/provision-units.js +6 -1
- package/scripts/bongos/publish-manifest.js +4 -0
- package/scripts/bongos/release.js +2 -0
- package/scripts/bongos/run-unit-tests.js +268 -82
- package/scripts/bongos/seed-tasks.example.json +56 -0
- package/scripts/bongos/seed-tasks.js +222 -0
- package/scripts/bongos/seed-verify-criteria.js +1 -2
- package/scripts/bongos/ship-finish.js +2 -0
- package/scripts/bongos/ship-resume.js +2 -0
- package/scripts/bongos/strand-lease.js +250 -0
- package/scripts/bongos/strand-watch.js +129 -12
- package/scripts/bongos/version-literal-guard.js +2 -2
- package/scripts/discord/post.js +4 -3
- package/scripts/gds/seed-tasks.js +7 -0
- package/scripts/gds/{build-bongos.js → strand-lease.js} +3 -3
- package/scripts/hall-preview/server.js +21 -0
- package/src/bongos/auth-config.js +29 -1
- package/src/bongos/auth-discord.js +3 -3
- package/src/bongos/auth-github.js +3 -6
- package/src/bongos/auth-google.js +217 -0
- package/src/bongos/device-approval.js +140 -0
- package/src/bongos/llm-pricing.js +17 -1
- package/src/bongos/metrics.js +48 -2
- package/src/bongos/middleware/rate-limit.js +30 -11
- package/src/bongos/module-scope-map.js +16 -1
- package/src/bongos/optimizer.js +15 -1
- package/src/bongos/payout-approvals.js +342 -0
- package/src/bongos/payout-gates.js +364 -0
- package/src/bongos/prelaunch-gate.js +7 -9
- package/src/bongos/prelaunch-switch.js +20 -0
- package/src/bongos/route-rank-check.js +3 -0
- package/src/bongos/routes/auth-google.js +246 -0
- package/src/bongos/routes/auth.js +38 -1
- package/src/bongos/routes/backup.js +33 -9
- package/src/bongos/routes/builders.js +57 -30
- package/src/bongos/routes/github.js +9 -0
- package/src/bongos/routes/me.js +18 -0
- package/src/bongos/routes/my-payouts.js +133 -0
- package/src/bongos/routes/payout-approvals.js +312 -0
- package/src/bongos/routes/payout-gates.js +179 -0
- package/src/bongos/routes.js +15 -1
- package/src/bongos/secret-box.js +18 -3
- package/src/bongos/serve-internal.js +47 -19
- package/src/bongos/sign-in-pages.js +138 -0
- package/src/bongos/task-needs.js +146 -0
- package/src/bongos-downloads.js +18 -1
- package/src/instance-config.js +28 -0
- package/src/module-api.js +14 -1
- package/src/platform-server.js +27 -1
- package/tests/account_logins.mjs +326 -0
- package/tests/account_logins_db.mjs +161 -0
- package/tests/ai_studio_billing.mjs +253 -0
- package/tests/ai_studio_generate.mjs +282 -0
- package/tests/ai_studio_keys.mjs +159 -0
- package/tests/ai_studio_requests.mjs +319 -0
- package/tests/auth_backchannel_logout_route.mjs +201 -0
- package/tests/auto_satisfy_criteria.mjs +10 -1
- package/tests/autobongos_tweak_lane.mjs +144 -0
- package/tests/autobongos_tweak_pin_identity.mjs +137 -0
- package/tests/backfill_subagent_rewards.mjs +17 -1
- package/tests/backup_trigger_lock.mjs +119 -0
- package/tests/batched_writes_parity.mjs +340 -0
- package/tests/blockers_people.mjs +198 -0
- package/tests/bounded_rate_maps.mjs +184 -0
- package/tests/claimable_blocker_status.mjs +1 -1
- package/tests/claims_batch_routes.mjs +421 -0
- package/tests/conductor_main_e2e.mjs +4 -0
- package/tests/config_read_cache.mjs +171 -0
- package/tests/copy_desk_page_editor.mjs +12 -0
- package/tests/cost_write_guard.mjs +200 -0
- package/tests/craft_achievements.mjs +33 -10
- package/tests/criterion_goal_attach.mjs +1 -1
- package/tests/db_backup_nightly.mjs +73 -1
- package/tests/deploy_divergence_line.mjs +7 -0
- package/tests/effective_visibility_predicate.mjs +12 -0
- package/tests/fitness.mjs +19 -0
- package/tests/fixtures/per-row-loops-legacy.cjs +245 -0
- package/tests/fixtures/seed-tasks/bongos-v1-idea-routing.json +256 -0
- package/tests/fixtures/seed-tasks/bv1-profiles.json +592 -0
- package/tests/fixtures/seed-tasks/bv2-ideator-surface.json +373 -0
- package/tests/fixtures/seed-tasks/fake-api.mjs +80 -0
- package/tests/github_one_trip.mjs +34 -0
- package/tests/github_repo_visibility.mjs +20 -0
- package/tests/goal_achievement.mjs +30 -1
- package/tests/goal_achievement_reward.mjs +205 -0
- package/tests/goal_archive_disposition.mjs +5 -5
- package/tests/goal_sort_staleness.mjs +2 -1
- package/tests/goal_tier.mjs +11 -1
- package/tests/google_fonts_nonblocking.mjs +84 -0
- package/tests/google_sign_in.mjs +401 -0
- package/tests/government_board_expiry.mjs +94 -0
- package/tests/government_protected_surfaces.mjs +1 -1
- package/tests/government_routes.mjs +146 -23
- package/tests/grader.mjs +31 -0
- package/tests/hall_ai_studio.mjs +347 -0
- package/tests/hall_city.mjs +8 -0
- package/tests/hall_page_gate_map.mjs +3 -0
- package/tests/hall_studio_home.mjs +61 -2
- package/tests/home_attention_cards.mjs +1 -1
- package/tests/hook_shell_tools.mjs +8 -0
- package/tests/hooks_drain.mjs +1 -1
- package/tests/host_topology_skips.mjs +2 -0
- package/tests/howto_moments.mjs +17 -0
- package/tests/human_signal.mjs +141 -0
- package/tests/install_script_reader.mjs +51 -0
- package/tests/integration_fixture_ids.mjs +82 -0
- package/tests/invite_expiry_db.mjs +13 -1
- package/tests/lib_sh_resolution.mjs +0 -4
- package/tests/market_watch_data.mjs +244 -0
- package/tests/market_watch_data_db.mjs +308 -0
- package/tests/market_watch_module.mjs +114 -0
- package/tests/market_watch_run.mjs +503 -0
- package/tests/metrics.mjs +124 -0
- package/tests/migration_namespace.mjs +14 -0
- package/tests/module_api.mjs +2 -0
- package/tests/module_loader.mjs +1 -1
- package/tests/module_skills_hook.mjs +69 -0
- package/tests/notes.mjs +182 -0
- package/tests/own_scope_guard.mjs +5 -0
- package/tests/page_tweak_marker_sql.mjs +76 -0
- package/tests/page_tweak_no_block.mjs +135 -0
- package/tests/page_tweak_notice.mjs +103 -0
- package/tests/payout_approvals.mjs +253 -0
- package/tests/payout_approvals_db.mjs +106 -0
- package/tests/payout_gates.mjs +322 -0
- package/tests/payout_gates_db.mjs +113 -0
- package/tests/planning_session_skill.mjs +13 -3
- package/tests/project_settings_page.mjs +29 -5
- package/tests/project_settings_spend_cap_route.mjs +235 -0
- package/tests/promotion_sweep.mjs +29 -1
- package/tests/provision.mjs +3 -2
- package/tests/provisioning_app_status.mjs +18 -0
- package/tests/provisioning_credential_preflight.mjs +53 -0
- package/tests/provisioning_env_manifest_edit_delete.mjs +223 -0
- package/tests/public_landing_projects.mjs +37 -0
- package/tests/publish_reconciler_overlap.mjs +60 -0
- package/tests/rank_change_broadcast_port.mjs +151 -0
- package/tests/seed_tasks.mjs +176 -0
- package/tests/seed_verify_criteria.mjs +2 -6
- package/tests/session_start_freshness.mjs +66 -1
- package/tests/shell_hooks.mjs +209 -0
- package/tests/ship_assurance.mjs +28 -0
- package/tests/ship_card.mjs +20 -5
- package/tests/site_classified_once.mjs +142 -0
- package/tests/speciality_db_shape.mjs +23 -0
- package/tests/speciality_session_skills.mjs +48 -2
- package/tests/strand_lease.mjs +249 -0
- package/tests/strand_watch.mjs +58 -0
- package/tests/task_criteria_routes.mjs +275 -0
- package/tests/task_criteria_unlink_db.mjs +123 -0
- package/tests/task_needs.mjs +233 -0
- package/tests/task_needs_db.mjs +110 -0
- package/tests/unit_runner_serial.mjs +266 -43
- package/tests/version_close_route.mjs +1 -1
- package/tests/version_literals.mjs +5 -7
- package/tests/welcome_boot.mjs +16 -5
- package/tests/welcome_boot_browser.mjs +36 -4
- package/docs/recipes/bongos-cli-release.md +0 -66
- package/scripts/bongos/backfill-disciplines.js +0 -144
- package/scripts/bongos/backfill-session-earnings.js +0 -123
- package/scripts/bongos/backfill-session-types.js +0 -87
- package/scripts/bongos/build-bongos.js +0 -94
- package/scripts/bongos/cleanup-orphans.js +0 -74
- package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +0 -152
- package/scripts/bongos/seed-bv1-profiles-tasks.js +0 -135
- package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +0 -390
- package/scripts/bongos/smoke-batch-claim.sh +0 -238
- package/scripts/bongos/smoke-batch-release.sh +0 -316
- package/scripts/bongos/smoke-claim-consistency.sh +0 -222
- package/scripts/bongos/smoke-dependencies.sh +0 -143
- package/scripts/gds/backfill-disciplines.js +0 -7
- package/scripts/gds/backfill-session-earnings.js +0 -7
- package/scripts/gds/backfill-session-types.js +0 -7
- package/scripts/gds/cleanup-orphans.js +0 -7
- package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +0 -6
- package/scripts/gds/seed-bv1-profiles-tasks.js +0 -6
- package/scripts/gds/seed-bv2-ideator-surface-tasks.js +0 -6
- package/scripts/gds/smoke-batch-claim.sh +0 -8
- package/scripts/gds/smoke-batch-release.sh +0 -8
- package/scripts/gds/smoke-claim-consistency.sh +0 -8
- package/scripts/gds/smoke-dependencies.sh +0 -8
- package/tests/smoke_dependencies_witness.mjs +0 -46
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// modules/market-watch/run.js — the weekly Market Watch run (task 1004937, ADR 0394).
|
|
4
|
+
//
|
|
5
|
+
// One call, runDue(), decides and does everything a tick needs for ONE project:
|
|
6
|
+
//
|
|
7
|
+
// 1. An open run whose lease lapsed (a deploy cut it off) is RESUMED: it is claimed
|
|
8
|
+
// again and does only the items with no finished row. An item already done or
|
|
9
|
+
// errored is never researched, or charged, twice.
|
|
10
|
+
// 2. Otherwise, if the newest run is less than a cadence old (minus a 30-minute slack),
|
|
11
|
+
// nothing happens: due by the ledger, never by the boot.
|
|
12
|
+
// 3. Otherwise the pre-checks run, in this order, and the first that fails records a
|
|
13
|
+
// SKIPPED run with its reason — a row on the settings strip, never only a log line:
|
|
14
|
+
// off the owner's switch is off
|
|
15
|
+
// no_key no project key, or one the master key cannot open
|
|
16
|
+
// spend_unreadable this month's spend could not be read (FAIL CLOSED: an unknown
|
|
17
|
+
// spend is never treated as zero; agents/lib/spend-ceiling.js)
|
|
18
|
+
// cap_reached the cap is not a positive number, or this month's spend plus
|
|
19
|
+
// one item's whole ceiling would pass it
|
|
20
|
+
// error no approved (active) watch rules to run
|
|
21
|
+
// 4. A run row is created already leased (one open run per project, by index), and each
|
|
22
|
+
// item is researched in turn. BEFORE EACH ITEM the spend is read again and the cap
|
|
23
|
+
// checked again, so a run stops partway (status 'partial', reason cap_reached or
|
|
24
|
+
// spend_unreadable) rather than run past the cap.
|
|
25
|
+
// 5. Each item's result is written in one transaction, and its cost is mirrored into
|
|
26
|
+
// cost_log through the economy port: source `market-watch:<run id>`, source_ref
|
|
27
|
+
// `item-<item id>`, category 'api'. logCost is insert-once on (source, source_ref)
|
|
28
|
+
// and the mirror only runs when this process is the one that recorded the item, so
|
|
29
|
+
// a retry can never post it twice. Never via HTTP POST /cost.
|
|
30
|
+
//
|
|
31
|
+
// THE ACCOUNTING is market_watch_run_items.cost_usd: it is what the cap sums (db.monthSpend)
|
|
32
|
+
// and it is written in the same transaction as the item's findings. cost_log is the
|
|
33
|
+
// project-wide roll-up the cost dashboard reads, a projection like agents/spawn.js
|
|
34
|
+
// mirrorCostToLedger: best-effort, logged loudly when it fails, because the spend has
|
|
35
|
+
// already happened and the cap does not depend on it.
|
|
36
|
+
//
|
|
37
|
+
// ONE PROJECT. Every project is its own instance and database (ADR 0394 Context); the
|
|
38
|
+
// project key is the instance's own public origin. Every read and write is scoped to it
|
|
39
|
+
// (store.js puts the guard in the SQL), and an item that comes back from a read with any
|
|
40
|
+
// other project is refused here before a cent is spent on it.
|
|
41
|
+
//
|
|
42
|
+
// Everything is injected (store, clock, key reader, client factory, economy), so the
|
|
43
|
+
// whole run is tested with no database and no network.
|
|
44
|
+
|
|
45
|
+
const api = require('../../src/module-api');
|
|
46
|
+
const research = require('./research');
|
|
47
|
+
const { CADENCE_DAYS } = require('./db');
|
|
48
|
+
|
|
49
|
+
const log = api.logger('market-watch');
|
|
50
|
+
|
|
51
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
52
|
+
const DUE_SLACK_MS = 30 * 60_000;
|
|
53
|
+
// Long enough for one item's call (5 min timeout) many times over; renewed before each
|
|
54
|
+
// item, so only a run whose process died lets it lapse.
|
|
55
|
+
const LEASE_MS = 30 * 60_000;
|
|
56
|
+
|
|
57
|
+
function costSourceTag(runId) {
|
|
58
|
+
return `market-watch:${runId}`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// isDue(lastRun, cadence, nowMs) — the weekly clock, by the ledger.
|
|
62
|
+
function isDue(last, cadence, nowMs) {
|
|
63
|
+
if (!last) return true;
|
|
64
|
+
const at = new Date(last.created_at).getTime();
|
|
65
|
+
if (!Number.isFinite(at)) return true;
|
|
66
|
+
const days = CADENCE_DAYS[cadence] || CADENCE_DAYS.weekly;
|
|
67
|
+
return nowMs - at >= days * DAY_MS - DUE_SLACK_MS;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// capAllows(capUsd, spentUsd, ceilingUsd) — true only when one more item, at its whole
|
|
71
|
+
// ceiling, still fits. A cap that is not a positive finite number allows nothing.
|
|
72
|
+
function capAllows(capUsd, spentUsd, ceilingUsd) {
|
|
73
|
+
const cap = Number(capUsd);
|
|
74
|
+
if (!Number.isFinite(cap) || cap <= 0) return false;
|
|
75
|
+
if (!Number.isFinite(spentUsd) || spentUsd < 0) return false;
|
|
76
|
+
return spentUsd + ceilingUsd <= cap;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// readSpend — this month's spend, or null for "I don't know" (which always refuses).
|
|
80
|
+
async function readSpend(store, project, now) {
|
|
81
|
+
try {
|
|
82
|
+
const n = Number(await store.monthSpend(project, now));
|
|
83
|
+
return Number.isFinite(n) && n >= 0 ? n : null;
|
|
84
|
+
} catch (_) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// The pre-checks of step 3. Returns { reason } or { key, cap, spent, rules }.
|
|
90
|
+
async function precheck(deps, project, settings, now) {
|
|
91
|
+
if (!settings || settings.enabled !== true) return { reason: 'off' };
|
|
92
|
+
let key = null;
|
|
93
|
+
try { key = await deps.readKey(project); } catch (_) { key = null; }
|
|
94
|
+
if (!key) return { reason: 'no_key' };
|
|
95
|
+
const cap = Number(settings.monthly_cap_usd);
|
|
96
|
+
const spent = await readSpend(deps.store, project, now);
|
|
97
|
+
if (spent === null) return { reason: 'spend_unreadable', cap };
|
|
98
|
+
if (!capAllows(cap, spent, deps.ceilingUsd)) return { reason: 'cap_reached', cap, spent };
|
|
99
|
+
const rules = await deps.store.activeRules(project);
|
|
100
|
+
if (!rules) return { reason: 'error', cap, spent, note: 'no active watch rules' };
|
|
101
|
+
return { key, cap, spent, rules };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function mirrorCost(deps, project, runId, item, costUsd) {
|
|
105
|
+
if (!(costUsd > 0)) return false;
|
|
106
|
+
const economy = deps.economy
|
|
107
|
+
|| (typeof api.resolveOptional === 'function' ? api.resolveOptional('reward', null) : null);
|
|
108
|
+
if (!economy || typeof economy.logCost !== 'function') {
|
|
109
|
+
deps.warn(`[weekly-run] run ${runId} item ${item.id}: no economy port, cost_log is missing $${costUsd}`);
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
await economy.logCost({
|
|
114
|
+
amountUsd: costUsd,
|
|
115
|
+
category: 'api',
|
|
116
|
+
source: costSourceTag(runId),
|
|
117
|
+
sourceRef: `item-${item.id}`,
|
|
118
|
+
// The project pays (its own key); no builder asked for a weekly run.
|
|
119
|
+
builderId: null,
|
|
120
|
+
description: `Market Watch run ${runId}: ${item.name} (${project})`.slice(0, 1000),
|
|
121
|
+
});
|
|
122
|
+
return true;
|
|
123
|
+
} catch (e) {
|
|
124
|
+
deps.warn(`[weekly-run] run ${runId} item ${item.id}: cost mirror failed (${e && e.message}); run_items still has the cost`);
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Research every remaining item of one claimed run, then finish it.
|
|
130
|
+
async function execute(deps, project, runId, ctx) {
|
|
131
|
+
const { store } = deps;
|
|
132
|
+
const client = deps.createClient(ctx.key);
|
|
133
|
+
const items = await store.remainingItems(project, runId);
|
|
134
|
+
const nowDate = new Date(deps.now());
|
|
135
|
+
const today = nowDate.toISOString().slice(0, 10);
|
|
136
|
+
const out = { runId, done: 0, errors: 0, refused: 0, entries: 0, scores: 0, proposals: 0, costUsd: 0 };
|
|
137
|
+
let stop = null;
|
|
138
|
+
|
|
139
|
+
for (const item of items) {
|
|
140
|
+
// The cross-project guard, before any spend: a row from another project is refused.
|
|
141
|
+
if (!item || item.project !== project) {
|
|
142
|
+
out.refused += 1;
|
|
143
|
+
deps.warn(`[weekly-run] run ${runId}: refused item ${item && item.id} from another project`);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const spent = await readSpend(store, project, new Date(deps.now()));
|
|
147
|
+
if (spent === null) { stop = 'spend_unreadable'; break; }
|
|
148
|
+
if (!capAllows(ctx.cap, spent, deps.ceilingUsd)) { stop = 'cap_reached'; break; }
|
|
149
|
+
if (!(await store.renewLease(project, runId, LEASE_MS))) { stop = 'lease_lost'; break; }
|
|
150
|
+
if (!(await store.startItem(project, runId, item.id))) continue;
|
|
151
|
+
|
|
152
|
+
const res = await deps.researchItem({ client, item, rules: ctx.rules, today });
|
|
153
|
+
let rec;
|
|
154
|
+
try {
|
|
155
|
+
rec = await store.recordItem(project, runId, item.id, res);
|
|
156
|
+
} catch (e) {
|
|
157
|
+
if (e && e.code === 'cross_project') {
|
|
158
|
+
out.refused += 1;
|
|
159
|
+
deps.warn(`[weekly-run] run ${runId}: item ${item.id} is not this project's; nothing written`);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
throw e;
|
|
163
|
+
}
|
|
164
|
+
if (!rec.recorded) continue;
|
|
165
|
+
out.costUsd += res.costUsd || 0;
|
|
166
|
+
await mirrorCost(deps, project, runId, item, res.costUsd);
|
|
167
|
+
if (res.ok) {
|
|
168
|
+
out.done += 1;
|
|
169
|
+
out.entries += rec.counts.entries;
|
|
170
|
+
out.scores += rec.counts.scores;
|
|
171
|
+
out.proposals += rec.counts.proposals;
|
|
172
|
+
} else {
|
|
173
|
+
out.errors += 1;
|
|
174
|
+
deps.warn(`[weekly-run] run ${runId}: ${item.name} ended with ${res.error}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (stop === 'lease_lost') {
|
|
179
|
+
// Another process holds the run now; leave it to them.
|
|
180
|
+
return { outcome: 'lease_lost', ...out };
|
|
181
|
+
}
|
|
182
|
+
let status = 'done';
|
|
183
|
+
let reason = null;
|
|
184
|
+
if (stop) { status = 'partial'; reason = stop; } else if (out.errors > 0 && out.done === 0) { status = 'failed'; reason = 'error'; } else if (out.errors > 0) { status = 'partial'; reason = 'error'; }
|
|
185
|
+
await store.finishRun(project, runId, { status, reason });
|
|
186
|
+
return { outcome: status, reason, ...out };
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function resolveDeps(deps) {
|
|
190
|
+
return {
|
|
191
|
+
store: deps.store,
|
|
192
|
+
now: deps.now || Date.now,
|
|
193
|
+
readKey: deps.readKey,
|
|
194
|
+
createClient: deps.createClient || ((key) => research.createClient(key)),
|
|
195
|
+
researchItem: deps.researchItem || research.researchItem,
|
|
196
|
+
ceilingUsd: deps.ceilingUsd != null ? deps.ceilingUsd : research.itemCeilingUsd(),
|
|
197
|
+
economy: deps.economy || null,
|
|
198
|
+
warn: deps.warn || ((m) => log.warn(m)),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// runDue({ store, project, readKey, ... }) — one tick's worth of work for one project.
|
|
203
|
+
async function runDue(rawDeps = {}) {
|
|
204
|
+
const deps = resolveDeps(rawDeps);
|
|
205
|
+
const { store } = deps;
|
|
206
|
+
const project = rawDeps.project;
|
|
207
|
+
if (typeof project !== 'string' || !project) return { skipped: 'no_project' };
|
|
208
|
+
const nowMs = deps.now();
|
|
209
|
+
const now = new Date(nowMs);
|
|
210
|
+
|
|
211
|
+
const open = await store.openRun(project);
|
|
212
|
+
if (open) {
|
|
213
|
+
if (open.leased) return { skipped: 'in_flight', runId: open.id };
|
|
214
|
+
if (!(await store.claimRun(project, open.id, LEASE_MS))) return { skipped: 'in_flight', runId: open.id };
|
|
215
|
+
const settings = await store.readSettings(project);
|
|
216
|
+
const pre = await precheck(deps, project, settings, now);
|
|
217
|
+
if (pre.reason) {
|
|
218
|
+
await store.finishRun(project, open.id, { status: 'partial', reason: pre.reason });
|
|
219
|
+
return { outcome: 'partial', reason: pre.reason, runId: open.id, resumed: true };
|
|
220
|
+
}
|
|
221
|
+
return { resumed: true, ...(await execute(deps, project, open.id, pre)) };
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const settings = await store.readSettings(project);
|
|
225
|
+
const last = await store.lastRun(project);
|
|
226
|
+
if (!isDue(last, settings.cadence, nowMs)) return { skipped: 'not_due' };
|
|
227
|
+
|
|
228
|
+
const pre = await precheck(deps, project, settings, now);
|
|
229
|
+
if (pre.reason) {
|
|
230
|
+
const runId = await store.insertSkipped(project, {
|
|
231
|
+
reason: pre.reason,
|
|
232
|
+
capUsd: Number.isFinite(pre.cap) ? pre.cap : null,
|
|
233
|
+
spentBeforeUsd: Number.isFinite(pre.spent) ? pre.spent : null,
|
|
234
|
+
});
|
|
235
|
+
if (pre.note) deps.warn(`[weekly-run] run ${runId} skipped: ${pre.note}`);
|
|
236
|
+
return { outcome: 'skipped', reason: pre.reason, runId };
|
|
237
|
+
}
|
|
238
|
+
const runId = await store.createRun(project, {
|
|
239
|
+
ruleVersionId: pre.rules.id, capUsd: pre.cap, spentBeforeUsd: pre.spent, leaseMs: LEASE_MS,
|
|
240
|
+
});
|
|
241
|
+
if (runId === null) return { skipped: 'in_flight' };
|
|
242
|
+
return execute(deps, project, runId, pre);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
module.exports = { runDue, isDue, costSourceTag };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
[
|
|
2
|
+
{"name":"Cognition (Devin)","url":"https://devin.ai","category":"AI software-engineering agent","what":"Autonomous cloud 'AI software engineer' that takes tickets and opens PRs; also owns Windsurf IDE.","open_source_self_host":"No / no","pricing":"Subscription + usage (Agent Compute Units); exact ACU price unverified","funding_size":"$400M at $10.2B (Sep 2025, verified via press); later rounds reported at $26B (May 2026) and $48B (Sep 2026), unverified","scores":{"ai_agents_write_code":10,"human_gates":5,"contributor_economy":0,"open_source_ethos":0,"multi_project_hub":3},"overall_likeness":5,"partner_candidate":false},
|
|
3
|
+
{"name":"Factory","url":"https://factory.ai","category":"AI software-engineering agent","what":"Enterprise 'Droids' that take tasks across the dev lifecycle (code, review, incidents, docs).","open_source_self_host":"No / enterprise deployments","pricing":"Per-seat + usage; ~$40/mo individual tier per aggregator (unverified)","funding_size":"$50M Series B (Sep 2025); $150M Series C at $1.5B (Apr 2026); larger Blackstone round reported, unverified","scores":{"ai_agents_write_code":10,"human_gates":6,"contributor_economy":0,"open_source_ethos":0,"multi_project_hub":3},"overall_likeness":5,"partner_candidate":false},
|
|
4
|
+
{"name":"OpenHands (All Hands AI)","url":"https://openhands.dev","category":"AI software-engineering agent (open source)","what":"Open-source platform for software-engineering agents; cloud, CLI, GitHub/issue resolver, enterprise edition.","open_source_self_host":"Yes (MIT core; enterprise edition source-available) / yes","pricing":"Free OSS; usage-based OpenHands Cloud; enterprise","funding_size":"$5M seed (Menlo, 2024) + $18.8M Series A (Madrona, Nov 2025)","scores":{"ai_agents_write_code":10,"human_gates":5,"contributor_economy":2,"open_source_ethos":9,"multi_project_hub":3},"overall_likeness":6,"partner_candidate":true},
|
|
5
|
+
{"name":"GitHub Copilot coding agent","url":"https://github.com/features/copilot","category":"AI software-engineering agent + forge","what":"Assign an issue to Copilot; it works in Actions and opens a PR gated by branch protection and review, on the largest multi-project hub.","open_source_self_host":"No / GitHub Enterprise Server exists, agent availability there unverified","pricing":"Pro $10, Pro+ $39, Business $19/user; moved to AI Credits ($0.01) June 2026","funding_size":"Microsoft subsidiary","scores":{"ai_agents_write_code":9,"human_gates":7,"contributor_economy":2,"open_source_ethos":2,"multi_project_hub":9},"overall_likeness":6,"partner_candidate":false},
|
|
6
|
+
{"name":"Cursor (Anysphere)","url":"https://cursor.com","category":"AI IDE + background/cloud agents","what":"AI IDE with parallel local and cloud agents that branch, test and push; Automations in its cloud.","open_source_self_host":"No / no","pricing":"Pro $20/mo + usage; Business/Enterprise","funding_size":"~$29.3B (Nov 2025); $50B talks and SpaceX $60B acquisition reported 2026, unverified","scores":{"ai_agents_write_code":9,"human_gates":4,"contributor_economy":0,"open_source_ethos":0,"multi_project_hub":2},"overall_likeness":4,"partner_candidate":false},
|
|
7
|
+
{"name":"Replit (Agent)","url":"https://replit.com","category":"AI app builder + hosting","what":"Browser IDE + hosting where Replit Agent builds and deploys apps; historically ran a paid Bounties marketplace (current status unverified).","open_source_self_host":"No / no","pricing":"Subscription + effort-based agent usage","funding_size":"$400M Series D at $9B (Mar 2026)","scores":{"ai_agents_write_code":9,"human_gates":3,"contributor_economy":3,"open_source_ethos":1,"multi_project_hub":7},"overall_likeness":5,"partner_candidate":false},
|
|
8
|
+
{"name":"Lovable","url":"https://lovable.dev","category":"AI app builder","what":"Prompt-to-full-stack-app builder for non-developers.","open_source_self_host":"No / no","pricing":"Subscription with message credits","funding_size":"Reported $6.6B then $13.3B valuation (2025-2026), conflicting/unverified","scores":{"ai_agents_write_code":9,"human_gates":2,"contributor_economy":1,"open_source_ethos":1,"multi_project_hub":5},"overall_likeness":3,"partner_candidate":false},
|
|
9
|
+
{"name":"Bolt.new (StackBlitz)","url":"https://bolt.new","category":"AI app builder","what":"In-browser prompt-to-app builder on WebContainers; community fork bolt.diy is open source.","open_source_self_host":"Partial (bolt.diy MIT fork) / partial","pricing":"Token-based subscription","funding_size":"~$700M valuation, ~$40M ARR (Feb 2025, Sacra); 2026 unverified","scores":{"ai_agents_write_code":9,"human_gates":2,"contributor_economy":0,"open_source_ethos":4,"multi_project_hub":4},"overall_likeness":3,"partner_candidate":false},
|
|
10
|
+
{"name":"v0 (Vercel)","url":"https://v0.app","category":"AI app builder","what":"Vercel's prompt-to-UI/app agent deploying to Vercel.","open_source_self_host":"No / no","pricing":"Credit-based subscription","funding_size":"Vercel-funded (Vercel valuation ~$9B, 2025, unverified)","scores":{"ai_agents_write_code":8,"human_gates":2,"contributor_economy":1,"open_source_ethos":2,"multi_project_hub":4},"overall_likeness":3,"partner_candidate":false},
|
|
11
|
+
{"name":"Codegen","url":"https://codegen.com","category":"AI software-engineering agent","what":"Agents that work from Slack/Linear/GitHub to write and review code across a team's repos.","open_source_self_host":"No (SDK partly open, unverified) / no","pricing":"Seat + usage (unverified)","funding_size":"~$16M (2023, unverified)","scores":{"ai_agents_write_code":9,"human_gates":4,"contributor_economy":0,"open_source_ethos":2,"multi_project_hub":3},"overall_likeness":4,"partner_candidate":false},
|
|
12
|
+
{"name":"Sweep","url":"https://sweep.dev","category":"AI coding assistant","what":"Began as an open-source issue-to-PR agent; pivoted to a JetBrains IDE assistant.","open_source_self_host":"Formerly / no","pricing":"~$10-60/mo (unverified)","funding_size":"YC-backed; amount unverified","scores":{"ai_agents_write_code":6,"human_gates":3,"contributor_economy":0,"open_source_ethos":3,"multi_project_hub":1},"overall_likeness":2,"partner_candidate":false},
|
|
13
|
+
{"name":"Magic","url":"https://magic.dev","category":"Frontier code model lab","what":"Long-context models aimed at automated software engineering; little shipped product.","open_source_self_host":"No / no","pricing":"Not public","funding_size":"$320M (Aug 2024); ~$1.5B valuation talks","scores":{"ai_agents_write_code":7,"human_gates":1,"contributor_economy":0,"open_source_ethos":0,"multi_project_hub":0},"overall_likeness":1,"partner_candidate":false},
|
|
14
|
+
{"name":"Poolside","url":"https://poolside.ai","category":"Frontier code model lab","what":"Code foundation models + agents sold to enterprises/government, often on-prem.","open_source_self_host":"No / enterprise on-prem","pricing":"Enterprise contracts","funding_size":"$500M Series B (Oct 2024); 2026 round unverified","scores":{"ai_agents_write_code":8,"human_gates":3,"contributor_economy":0,"open_source_ethos":0,"multi_project_hub":1},"overall_likeness":2,"partner_candidate":false},
|
|
15
|
+
{"name":"OpenAI Codex (cloud agent + CLI)","url":"https://openai.com/codex","category":"AI software-engineering agent","what":"Cloud coding agent in ChatGPT plus open-source Codex CLI; parallel tasks producing PRs.","open_source_self_host":"CLI open source (Apache-2.0, unverified) / CLI local","pricing":"Bundled with ChatGPT plans + API usage","funding_size":"OpenAI","scores":{"ai_agents_write_code":10,"human_gates":5,"contributor_economy":0,"open_source_ethos":4,"multi_project_hub":3},"overall_likeness":4,"partner_candidate":false},
|
|
16
|
+
{"name":"Google Jules","url":"https://jules.google","category":"AI software-engineering agent","what":"Asynchronous GitHub coding agent that plans, gets approval, then opens PRs.","open_source_self_host":"No / no","pricing":"Free tier + Google AI plans (unverified)","funding_size":"Google","scores":{"ai_agents_write_code":9,"human_gates":5,"contributor_economy":0,"open_source_ethos":1,"multi_project_hub":3},"overall_likeness":4,"partner_candidate":false},
|
|
17
|
+
{"name":"Cline","url":"https://cline.bot","category":"Open-source coding agent","what":"Open-source IDE agent, bring-your-own-model, human approves each step.","open_source_self_host":"Yes (Apache-2.0) / runs locally","pricing":"Free OSS; enterprise/teams","funding_size":"$32M seed + Series A (2025)","scores":{"ai_agents_write_code":9,"human_gates":7,"contributor_economy":0,"open_source_ethos":8,"multi_project_hub":1},"overall_likeness":4,"partner_candidate":false},
|
|
18
|
+
{"name":"Kilo Code","url":"https://kilo.ai","category":"Open-source coding agent","what":"Open-source agentic coding extension/platform (Cline/Roo lineage).","open_source_self_host":"Yes (Apache-2.0, unverified) / local","pricing":"Free OSS + pay-as-you-go model credits","funding_size":"$8M seed (Dec 2025)","scores":{"ai_agents_write_code":9,"human_gates":5,"contributor_economy":0,"open_source_ethos":8,"multi_project_hub":2},"overall_likeness":4,"partner_candidate":false},
|
|
19
|
+
{"name":"Coder","url":"https://coder.com","category":"Self-hosted dev environments + agents","what":"Self-hosted cloud dev environments; Coder Agents run AI agents on infrastructure the customer controls.","open_source_self_host":"Yes (AGPL-3.0 core) / yes, incl. air-gapped","pricing":"Free OSS; Premium/Enterprise per-seat","funding_size":"~$90M+ raised (unverified)","scores":{"ai_agents_write_code":6,"human_gates":7,"contributor_economy":0,"open_source_ethos":9,"multi_project_hub":5},"overall_likeness":5,"partner_candidate":true},
|
|
20
|
+
{"name":"MetaGPT / Atoms (DeepWisdom)","url":"https://github.com/FoundationAgents/MetaGPT","category":"Multi-agent dev framework","what":"Agents play software-company roles (PM, architect, engineer, QA) under SOPs; commercial product Atoms/MGX.","open_source_self_host":"Yes (MIT) / yes","pricing":"Free framework; commercial app subscription (unverified)","funding_size":"DeepWisdom funding unverified","scores":{"ai_agents_write_code":8,"human_gates":3,"contributor_economy":0,"open_source_ethos":9,"multi_project_hub":2},"overall_likeness":5,"partner_candidate":false},
|
|
21
|
+
{"name":"ChatDev (OpenBMB)","url":"https://github.com/OpenBMB/ChatDev","category":"Multi-agent dev framework (research)","what":"Virtual software company of agents in a waterfall pipeline (design, code, test, document).","open_source_self_host":"Yes (Apache-2.0) / yes","pricing":"Free","funding_size":"Academic (Tsinghua/OpenBMB)","scores":{"ai_agents_write_code":8,"human_gates":2,"contributor_economy":0,"open_source_ethos":9,"multi_project_hub":1},"overall_likeness":4,"partner_candidate":false},
|
|
22
|
+
{"name":"CrewAI","url":"https://crewai.com","category":"Multi-agent orchestration framework","what":"Role-based general multi-agent framework plus enterprise control plane.","open_source_self_host":"Yes (MIT) / yes","pricing":"Free OSS; enterprise platform tiers","funding_size":"~$18M (2024, unverified)","scores":{"ai_agents_write_code":5,"human_gates":5,"contributor_economy":0,"open_source_ethos":8,"multi_project_hub":3},"overall_likeness":3,"partner_candidate":false},
|
|
23
|
+
{"name":"Gitcoin","url":"https://gitcoin.co","category":"Open-source funding / public goods","what":"Quadratic-funding and multi-mechanism grant rounds for open-source and Ethereum public goods.","open_source_self_host":"Yes (open-source protocol/tools) / n/a","pricing":"Round operators fund matching pools; protocol fees vary","funding_size":">$60M distributed; GG24 (Oct 2025) >$1.8M","scores":{"ai_agents_write_code":0,"human_gates":6,"contributor_economy":9,"open_source_ethos":9,"multi_project_hub":8},"overall_likeness":5,"partner_candidate":true},
|
|
24
|
+
{"name":"Algora","url":"https://algora.io","category":"Bounties to hiring","what":"Started as GitHub bounties/tips; homepage now leads with hiring top open-source engineers.","open_source_self_host":"Partly open source (unverified) / no","pricing":"Fee on bounties: 9-20% over time (sources conflict)","funding_size":"Described as bootstrapped / PBC (2023, unverified)","scores":{"ai_agents_write_code":1,"human_gates":2,"contributor_economy":7,"open_source_ethos":6,"multi_project_hub":6},"overall_likeness":4,"partner_candidate":false},
|
|
25
|
+
{"name":"Opire","url":"https://opire.dev","category":"Open-source bounties","what":"Create and claim bounties on GitHub issues via comments.","open_source_self_host":"Unclear (sources conflict) / no","pricing":"Platform fee (unverified)","funding_size":"Small LLC (unverified)","scores":{"ai_agents_write_code":0,"human_gates":2,"contributor_economy":7,"open_source_ethos":4,"multi_project_hub":5},"overall_likeness":3,"partner_candidate":false},
|
|
26
|
+
{"name":"IssueHunt","url":"https://issuehunt.io","category":"Open-source bounties","what":"Crowdfunded bounties on open-source issues.","open_source_self_host":"No / no","pricing":"Platform fee (unverified)","funding_size":"Unverified; 2026 activity unverified","scores":{"ai_agents_write_code":0,"human_gates":2,"contributor_economy":6,"open_source_ethos":3,"multi_project_hub":5},"overall_likeness":3,"partner_candidate":false},
|
|
27
|
+
{"name":"Polar","url":"https://polar.sh","category":"Billing (formerly OSS issue funding)","what":"Pivoted from open-source issue funding to usage/credit billing and merchant of record for AI companies.","open_source_self_host":"Open-source repo (license unverified) / not marketed","pricing":"5% + 50c free tier down to 3.4% + 30c","funding_size":"Seed-stage (amount unverified)","scores":{"ai_agents_write_code":1,"human_gates":1,"contributor_economy":4,"open_source_ethos":6,"multi_project_hub":3},"overall_likeness":2,"partner_candidate":false},
|
|
28
|
+
{"name":"Open Collective / Open Source Collective","url":"https://opencollective.com","category":"Transparent fiscal hosting","what":"Open-source platform and nonprofit fiscal host with public ledgers for thousands of projects.","open_source_self_host":"Yes (open-source code) / possible","pricing":"Host fee ~10% (varies by host, unverified)","funding_size":"OSC is a 501(c)(6) nonprofit","scores":{"ai_agents_write_code":0,"human_gates":6,"contributor_economy":8,"open_source_ethos":9,"multi_project_hub":9},"overall_likeness":5,"partner_candidate":true},
|
|
29
|
+
{"name":"tea.xyz","url":"https://tea.xyz","category":"Crypto rewards for open source","what":"Blockchain protocol rewarding open-source packages by dependency impact; criticised for spam PRs.","open_source_self_host":"Partly / no","pricing":"Token incentives","funding_size":"$8.9M seed","scores":{"ai_agents_write_code":0,"human_gates":2,"contributor_economy":8,"open_source_ethos":6,"multi_project_hub":7},"overall_likeness":4,"partner_candidate":false},
|
|
30
|
+
{"name":"Open Source Pledge","url":"https://opensourcepledge.com","category":"Open-source funding commitment","what":"Companies pledge >$2,000/year per employed developer to maintainers.","open_source_self_host":"n/a","pricing":"Free to join; members pay maintainers directly","funding_size":"Coalition launched by Sentry and 20+ orgs","scores":{"ai_agents_write_code":0,"human_gates":3,"contributor_economy":7,"open_source_ethos":9,"multi_project_hub":3},"overall_likeness":3,"partner_candidate":true},
|
|
31
|
+
{"name":"dOrg","url":"https://www.dorg.tech","category":"Engineer-owned dev cooperative","what":"Web3 and AI development agency owned by its engineers (Vermont blockchain-based LLC).","open_source_self_host":"n/a (services)","pricing":"Client project fees, sometimes in client tokens","funding_size":"Cooperative; size unverified","scores":{"ai_agents_write_code":3,"human_gates":6,"contributor_economy":8,"open_source_ethos":6,"multi_project_hub":5},"overall_likeness":5,"partner_candidate":true},
|
|
32
|
+
{"name":"DAO DAO","url":"https://daodao.zone","category":"DAO governance tooling","what":"Worker-owned team building open-source on-chain governance tools for DAOs (Cosmos).","open_source_self_host":"Yes / yes","pricing":"Free tooling","funding_size":"Unverified","scores":{"ai_agents_write_code":0,"human_gates":8,"contributor_economy":5,"open_source_ethos":8,"multi_project_hub":7},"overall_likeness":4,"partner_candidate":true},
|
|
33
|
+
{"name":"Layer3","url":"https://layer3.xyz","category":"Gamified quest community","what":"Quests that pay XP, tokens and badges for on-chain actions; no-code campaign builder.","open_source_self_host":"No / no","pricing":"Projects pay for campaigns; L3 token","funding_size":"VC-backed + token (amount unverified)","scores":{"ai_agents_write_code":0,"human_gates":1,"contributor_economy":7,"open_source_ethos":2,"multi_project_hub":7},"overall_likeness":3,"partner_candidate":false},
|
|
34
|
+
{"name":"Forgejo / Codeberg e.V.","url":"https://forgejo.org","category":"Self-hosted forge (nonprofit governed)","what":"Community-governed Git forge; Codeberg members voted (Jul 2026) to ban mostly-AI-generated repos.","open_source_self_host":"Yes (GPLv3) / yes","pricing":"Free","funding_size":"Nonprofit, donations/members","scores":{"ai_agents_write_code":0,"human_gates":9,"contributor_economy":1,"open_source_ethos":10,"multi_project_hub":9},"overall_likeness":4,"partner_candidate":false},
|
|
35
|
+
{"name":"Gitea","url":"https://about.gitea.com","category":"Self-hosted forge","what":"Lightweight self-hosted Git forge with a commercial company behind it.","open_source_self_host":"Yes (MIT) / yes","pricing":"Free; Enterprise $9.50-19/user/mo; Gitea Cloud","funding_size":"CommitGo Inc. (unverified)","scores":{"ai_agents_write_code":1,"human_gates":4,"contributor_economy":0,"open_source_ethos":8,"multi_project_hub":8},"overall_likeness":4,"partner_candidate":false},
|
|
36
|
+
{"name":"Coolify","url":"https://coolify.io","category":"Self-hosted PaaS","what":"Self-hostable Heroku/Vercel alternative; deploy apps and databases to your own servers.","open_source_self_host":"Yes (Apache-2.0) / yes","pricing":"Free self-host; Cloud ~$5/mo (third-party source)","funding_size":"Sponsor-funded, small team (unverified)","scores":{"ai_agents_write_code":0,"human_gates":2,"contributor_economy":1,"open_source_ethos":10,"multi_project_hub":6},"overall_likeness":3,"partner_candidate":true},
|
|
37
|
+
{"name":"Plane","url":"https://plane.so","category":"Self-hosted project management","what":"Open-source Jira/Linear alternative with cycles, approvals and Plane AI.","open_source_self_host":"Yes (AGPL-3.0 CE) / yes","pricing":"CE free; Cloud free tier; Commercial from $6/seat/mo","funding_size":"~$4M seed (unverified)","scores":{"ai_agents_write_code":2,"human_gates":5,"contributor_economy":0,"open_source_ethos":9,"multi_project_hub":6},"overall_likeness":4,"partner_candidate":true}
|
|
38
|
+
]
|