@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.
Files changed (1142) hide show
  1. package/.bongos-core.json +5727 -0
  2. package/.claude/skills/blocker-review/SKILL.md +91 -0
  3. package/.claude/skills/blocker-solve/SKILL.md +96 -0
  4. package/.claude/skills/builder-backup/SKILL.md +54 -0
  5. package/.claude/skills/builder-box/SKILL.md +45 -0
  6. package/.claude/skills/builder-claim/SKILL.md +76 -0
  7. package/.claude/skills/builder-connect/SKILL.md +59 -0
  8. package/.claude/skills/builder-cost/SKILL.md +47 -0
  9. package/.claude/skills/builder-end/SKILL.md +81 -0
  10. package/.claude/skills/builder-exit/SKILL.md +88 -0
  11. package/.claude/skills/builder-key/SKILL.md +40 -0
  12. package/.claude/skills/builder-reauth/SKILL.md +50 -0
  13. package/.claude/skills/builder-redteam/SKILL.md +109 -0
  14. package/.claude/skills/builder-release/SKILL.md +41 -0
  15. package/.claude/skills/builder-setup/SKILL.md +62 -0
  16. package/.claude/skills/builder-ship/SKILL.md +79 -0
  17. package/.claude/skills/builder-stage/SKILL.md +51 -0
  18. package/.claude/skills/builder-start/SKILL.md +46 -0
  19. package/.claude/skills/close-box/SKILL.md +43 -0
  20. package/.claude/skills/design-sync/SKILL.md +69 -0
  21. package/.claude/skills/dev/SKILL.md +49 -0
  22. package/.claude/skills/feedback/SKILL.md +32 -0
  23. package/.claude/skills/figma-design-sync/SKILL.md +74 -0
  24. package/.claude/skills/goal-review/SKILL.md +89 -0
  25. package/.claude/skills/idea-triage/SKILL.md +144 -0
  26. package/.claude/skills/ideate/SKILL.md +82 -0
  27. package/.claude/skills/merge-mode/SKILL.md +169 -0
  28. package/.claude/skills/new-project/SKILL.md +108 -0
  29. package/.claude/skills/otb-character-review/SKILL.md +71 -0
  30. package/.claude/skills/otb-design-review/SKILL.md +47 -0
  31. package/.claude/skills/otb-feedback-capture/SKILL.md +45 -0
  32. package/.claude/skills/otb-figma-sync/SKILL.md +54 -0
  33. package/.claude/skills/otb-tile-generate/SKILL.md +45 -0
  34. package/.claude/skills/paint/SKILL.md +70 -0
  35. package/.claude/skills/planning-session/SKILL.md +299 -0
  36. package/.claude/skills/priority-session/SKILL.md +134 -0
  37. package/.claude/skills/read-session-export/SKILL.md +58 -0
  38. package/.claude/skills/recall/SKILL.md +52 -0
  39. package/.claude/skills/session-handoff/SKILL.md +46 -0
  40. package/.claude/skills/status/SKILL.md +33 -0
  41. package/.devcontainer/Dockerfile +69 -0
  42. package/.devcontainer/README.md +73 -0
  43. package/.devcontainer/devcontainer-lock.json +19 -0
  44. package/.devcontainer/devcontainer.json +93 -0
  45. package/.devcontainer/healthcheck.sh +84 -0
  46. package/.devcontainer/init-firewall.sh +198 -0
  47. package/.devcontainer/post-create.sh +153 -0
  48. package/.dockerignore +36 -0
  49. package/.env.local.example +32 -0
  50. package/.gitattributes +83 -0
  51. package/.gitignore +91 -0
  52. package/CLAUDE.md +242 -0
  53. package/CODE_OF_CONDUCT.md +46 -0
  54. package/CONTRIBUTING.md +51 -0
  55. package/Dockerfile +46 -0
  56. package/GOVERNANCE.md +44 -0
  57. package/LICENSE +661 -0
  58. package/README.md +88 -0
  59. package/bin/bongos.js +222 -0
  60. package/clients/bongos-client/README.md +48 -0
  61. package/clients/bongos-client/bongos-client.global.js +617 -0
  62. package/clients/bongos-client/examples/hello-world.mjs +62 -0
  63. package/clients/bongos-client/index.cjs +619 -0
  64. package/clients/bongos-client/index.d.ts +793 -0
  65. package/clients/bongos-client/index.mjs +614 -0
  66. package/clients/bongos-client/package.json +32 -0
  67. package/config/branding.neutral.json +60 -0
  68. package/config/design-tokens.neutral.json +51 -0
  69. package/config/design-tokens.schema.json +96 -0
  70. package/config/modules.neutral.json +9 -0
  71. package/docker-compose.yml +52 -0
  72. package/docker-entrypoint.sh +30 -0
  73. package/docs/adr/0001-stack-choice-single-vps.md +45 -0
  74. package/docs/adr/0002-digitalocean-over-hetzner.md +27 -0
  75. package/docs/adr/0003-cloudflare-origin-cert-over-letsencrypt.md +35 -0
  76. package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +45 -0
  77. package/docs/adr/0005-invisible-other-players-in-v1.md +37 -0
  78. package/docs/adr/0006-singleton-worldroom-plus-queueroom.md +30 -0
  79. package/docs/adr/0007-persistent-identity-via-localstorage-uuid.md +31 -0
  80. package/docs/adr/0008-family-based-tile-generation.md +86 -0
  81. package/docs/adr/0008-google-chat-oauth-user-auth.md +37 -0
  82. package/docs/adr/0009-autotile-architecture.md +181 -0
  83. package/docs/adr/0010-pms-architecture.md +70 -0
  84. package/docs/adr/0011-terrain-id-rendering-model.md +174 -0
  85. package/docs/adr/0012-ground-object-cell-split.md +208 -0
  86. package/docs/adr/0013-paths-as-object-overlays-with-autotile-dispatch.md +158 -0
  87. package/docs/adr/0014-families-canonical-over-vocabulary.md +103 -0
  88. package/docs/adr/0015-task-dependencies-and-auto-promotion.md +125 -0
  89. package/docs/adr/0016-trust-boundary-server-enforced-permissions.md +132 -0
  90. package/docs/adr/0017-code-simplification-and-repo-cleanliness.md +74 -0
  91. package/docs/adr/0018-three-rank-model-goes-live.md +97 -0
  92. package/docs/adr/0019-red-team-bounty-payout-table.md +52 -0
  93. package/docs/adr/0020-security-model-public-stub.md +70 -0
  94. package/docs/adr/0021-per-builder-skill-model-preferences.md +99 -0
  95. package/docs/adr/0022-secrets-policy.md +124 -0
  96. package/docs/adr/0023-kind-multipliers-and-idea-bonus.md +118 -0
  97. package/docs/adr/0024-cloneable-repo-local-first-memory.md +277 -0
  98. package/docs/adr/0024-multi-agent-system-architecture.md +125 -0
  99. package/docs/adr/0025-offsite-backup-vendor-digitalocean-spaces.md +59 -0
  100. package/docs/adr/0025-structured-criterion-task-link.md +44 -0
  101. package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +117 -0
  102. package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +170 -0
  103. package/docs/adr/0028-honest-llm-spend-accounting.md +109 -0
  104. package/docs/adr/0029-status-page-outage-resilience.md +59 -0
  105. package/docs/adr/0030-builders-hall-live-updates.md +59 -0
  106. package/docs/adr/0031-cloud-dev-environments-for-builders.md +222 -0
  107. package/docs/adr/0032-discord-mirror-of-gds.md +50 -0
  108. package/docs/adr/0033-discord-bot-service-principal.md +82 -0
  109. package/docs/adr/0034-thetes-graduated-newcomer-rank.md +53 -0
  110. package/docs/adr/0035-builder-onboarding-three-paths.md +128 -0
  111. package/docs/adr/0036-builders-subdomain-and-ui-reorg.md +40 -0
  112. package/docs/adr/0037-discord-channel-management.md +51 -0
  113. package/docs/adr/0038-chromebook-ttyd-cloudflare-tunnel.md +111 -0
  114. package/docs/adr/0039-setup-first-onboarding-ux.md +49 -0
  115. package/docs/adr/0040-remote-control-default-browser-onramp.md +47 -0
  116. package/docs/adr/0041-temporary-grader-bypass-killswitch.md +40 -0
  117. package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +82 -0
  118. package/docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md +74 -0
  119. package/docs/adr/0044-mediterranean-palette-replacement.md +73 -0
  120. package/docs/adr/0044-per-box-live-game-preview.md +57 -0
  121. package/docs/adr/0045-devbox-desktop-app.md +133 -0
  122. package/docs/adr/0046-sandbox-first-review-gate.md +72 -0
  123. package/docs/adr/0047-discord-bugs-intake-anti-abuse.md +36 -0
  124. package/docs/adr/0048-works-in-progress-ia-split.md +32 -0
  125. package/docs/adr/0049-split-parallel-safety-contract.md +46 -0
  126. package/docs/adr/0050-device-flow-admission-invite-gated-by-default.md +43 -0
  127. package/docs/adr/0051-full-session-transcript-corpus.md +57 -0
  128. package/docs/adr/0052-sandbox-for-everyone-game-only-preview.md +70 -0
  129. package/docs/adr/0053-scoped-dev-box-session.md +55 -0
  130. package/docs/adr/0054-session-token-reward-cost-plus.md +63 -0
  131. package/docs/adr/0055-server-mediated-branch-publish.md +47 -0
  132. package/docs/adr/0056-prod-deploy-script-mirror-and-healthcheck-retry.md +62 -0
  133. package/docs/adr/0057-container-cost-ledger.md +28 -0
  134. package/docs/adr/0057-discord-archon-approval-channels.md +64 -0
  135. package/docs/adr/0058-automatic-gate-surface-gatekeeper.md +64 -0
  136. package/docs/adr/0059-single-approval-remove-devbox-approval-gate.md +37 -0
  137. package/docs/adr/0060-gds-retrieval-layer.md +97 -0
  138. package/docs/adr/0061-context-layer-decomposition.md +61 -0
  139. package/docs/adr/0062-medusa-instance-model-decoupling.md +107 -0
  140. package/docs/adr/0063-generated-repo-map-symbol-skeleton.md +44 -0
  141. package/docs/adr/0064-rename-medusa-to-cloud-bongos.md +49 -0
  142. package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +69 -0
  143. package/docs/adr/0066-generated-file-map-sections.md +51 -0
  144. package/docs/adr/0067-session-start-fast-forward-pull.md +43 -0
  145. package/docs/adr/0068-shared-art-key-for-newcomers.md +38 -0
  146. package/docs/adr/0069-hall-live-channel-sse-decouple.md +35 -0
  147. package/docs/adr/0070-deterministic-session-card-delivery.md +44 -0
  148. package/docs/adr/0071-box-confirm-before-destroyed-and-drift-reconcile.md +59 -0
  149. package/docs/adr/0072-bongos-app-mac-signed-first-windows-deferred.md +35 -0
  150. package/docs/adr/0072-dev-box-code-staleness-visibility.md +39 -0
  151. package/docs/adr/0073-builder-needs-signal-and-byok-gemini-key.md +64 -0
  152. package/docs/adr/0073-secrets-scan-exclude-uri-detector.md +37 -0
  153. package/docs/adr/0074-memory-map-stays-light.md +32 -0
  154. package/docs/adr/0075-per-system-cost-attribution.md +37 -0
  155. package/docs/adr/0076-in-session-deterministic-compaction.md +58 -0
  156. package/docs/adr/0077-content-addressed-llm-cache.md +32 -0
  157. package/docs/adr/0078-deterministic-first-cron.md +48 -0
  158. package/docs/adr/0079-value-gated-autonomous-engagement.md +39 -0
  159. package/docs/adr/0080-llm-cache-api-transport-and-trust-model.md +46 -0
  160. package/docs/adr/0081-tool-agnostic-design-layer.md +62 -0
  161. package/docs/adr/0082-productized-key-storage-provisioning.md +32 -0
  162. package/docs/adr/0082-server-side-merge-conflict-auto-resolution.md +55 -0
  163. package/docs/adr/0083-modular-architecture-strangler-build-plan.md +143 -0
  164. package/docs/adr/0084-auto-derived-per-task-rank-floor.md +86 -0
  165. package/docs/adr/0085-remove-default-per-builder-spend-cap.md +39 -0
  166. package/docs/adr/0086-goal-scoped-work-hierarchy.md +123 -0
  167. package/docs/adr/0087-bongos-app-architecture-and-handoff-contract.md +49 -0
  168. package/docs/adr/0087-compete-on-governance-not-tooling-cursor.md +65 -0
  169. package/docs/adr/0088-consistent-character-generative-animation.md +169 -0
  170. package/docs/adr/0089-modular-multi-model-adversarial-grader.md +179 -0
  171. package/docs/adr/0090-metic-task-authoring.md +73 -0
  172. package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +106 -0
  173. package/docs/adr/0092-hosting-module-and-on-prem-target.md +117 -0
  174. package/docs/adr/0093-tranche-2-core-carve-sequence.md +72 -0
  175. package/docs/adr/0094-repo-atlas-self-drawing-codebase-map.md +49 -0
  176. package/docs/adr/0095-borrowed-memory-and-retrieval-concepts.md +65 -0
  177. package/docs/adr/0095-cross-agent-context-management.md +58 -0
  178. package/docs/adr/0096-require-reward-before-workable.md +209 -0
  179. package/docs/adr/0097-one-active-claim-per-session-and-worktree-binding.md +46 -0
  180. package/docs/adr/0097-retroactive-reward-backfill.md +124 -0
  181. package/docs/adr/0098-public-mirror-publish-manifest.md +92 -0
  182. package/docs/adr/0099-delayed-redacted-mirror-export.md +55 -0
  183. package/docs/adr/0100-two-repo-instance-model.md +60 -0
  184. package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +90 -0
  185. package/docs/adr/0102-finish-bounding-the-kernel.md +36 -0
  186. package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +70 -0
  187. package/docs/adr/0103-gdsv4-bongos-consolidation.md +28 -0
  188. package/docs/adr/0104-trust-gds-api-channel-in-auto-mode.md +42 -0
  189. package/docs/adr/0105-instance-seed-migrations-out-of-core.md +47 -0
  190. package/docs/adr/0106-goal-owner-manager-authority.md +84 -0
  191. package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +83 -0
  192. package/docs/adr/0108-instance-composition-configurable-root.md +87 -0
  193. package/docs/adr/0109-self-describing-openapi-and-hosted-docs.md +44 -0
  194. package/docs/adr/0110-untrack-whole-file-generated-nav-docs.md +49 -0
  195. package/docs/adr/0111-instance-hosting-provisioning-module.md +135 -0
  196. package/docs/adr/0112-private-goals-invitations-join-requests.md +72 -0
  197. package/docs/adr/0113-sandbox-studio-descope-superseded-by-0044-0052.md +41 -0
  198. package/docs/adr/0114-instance-docs-discovery-contract.md +32 -0
  199. package/docs/adr/0115-scheduled-routines-portability.md +31 -0
  200. package/docs/adr/0116-api-error-envelope-and-code-taxonomy.md +62 -0
  201. package/docs/adr/0117-api-versioning-and-deprecation-policy.md +50 -0
  202. package/docs/adr/0118-api-contract-source-of-truth-code-first.md +47 -0
  203. package/docs/adr/0119-api-pagination-contract.md +34 -0
  204. package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +108 -0
  205. package/docs/adr/0121-greenfield-vs-brownfield-onboarding-adopt-existing-repo.md +97 -0
  206. package/docs/adr/0122-onboarding-diagram-renders-deploy-rendered-off-git.md +43 -0
  207. package/docs/adr/0123-box-idle-sweep-autosave-before-destroy.md +36 -0
  208. package/docs/adr/0124-typed-api-response-bodies.md +37 -0
  209. package/docs/adr/0125-control-plane-scaffolds-standalone-instance-repo.md +36 -0
  210. package/docs/adr/0126-dedicated-cloudbongos-control-plane-droplet.md +30 -0
  211. package/docs/adr/0127-cross-box-fleet-observability.md +64 -0
  212. package/docs/adr/0128-provisioning-runner-privilege-and-db-auth-model.md +46 -0
  213. package/docs/adr/0129-cloudbongos-control-plane-pull-deploy.md +34 -0
  214. package/docs/adr/0130-provision-remote-exec-over-ssh.md +61 -0
  215. package/docs/adr/0131-rank-scoped-skill-visibility.md +47 -0
  216. package/docs/adr/0132-cohost-fleet-control-plane-migration.md +54 -0
  217. package/docs/adr/0133-github-app-manifest-onboarding-signin.md +42 -0
  218. package/docs/adr/0134-private-first-npm-distribution.md +38 -0
  219. package/docs/adr/README.md +208 -0
  220. package/docs/api/openapi.json +13720 -0
  221. package/docs/api-reference.md +437 -0
  222. package/docs/architecture.md +244 -0
  223. package/docs/branding-contract.md +66 -0
  224. package/docs/branding-fill-prompt.md +25 -0
  225. package/docs/canonical-permissions.md +241 -0
  226. package/docs/design/container-exterior-tiles.md +49 -0
  227. package/docs/design/container-exterior.md +81 -0
  228. package/docs/design/container-interior.md +77 -0
  229. package/docs/design/modular-architecture/00-research-report.md +107 -0
  230. package/docs/design/modular-architecture/01-architecture.md +125 -0
  231. package/docs/design/modular-architecture/02-module-map.md +116 -0
  232. package/docs/design/modular-architecture/03-builder-flows.md +104 -0
  233. package/docs/design/modular-architecture/04-module-lifecycle.md +62 -0
  234. package/docs/design/modular-architecture/README.md +27 -0
  235. package/docs/design/vanilla-hall-ui-redesign-scope.md +284 -0
  236. package/docs/design/world-map-scroll.md +41 -0
  237. package/docs/design-contract.md +320 -0
  238. package/docs/file-map.md +418 -0
  239. package/docs/handoff-template.md +92 -0
  240. package/docs/modules-contract.md +293 -0
  241. package/docs/onboarding/browser-terminal-guide.md +73 -0
  242. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +28 -0
  243. package/docs/onboarding/diagrams/02-rank-ladder.mmd +54 -0
  244. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +37 -0
  245. package/docs/onboarding/diagrams/04-architecture.mmd +51 -0
  246. package/docs/onboarding/diagrams/05-versioning.mmd +29 -0
  247. package/docs/onboarding/diagrams/README.md +94 -0
  248. package/docs/onboarding/diagrams/assertions.json +170 -0
  249. package/docs/onboarding/diagrams/puppeteer-config.json +1 -0
  250. package/docs/onboarding/diagrams/render-config.json +9 -0
  251. package/docs/onboarding/drachmae-and-karma.md +178 -0
  252. package/docs/onboarding/primer.md +202 -0
  253. package/docs/project-context.template.md +67 -0
  254. package/docs/recipes/README.md +35 -0
  255. package/docs/recipes/audit-replay.md +100 -0
  256. package/docs/recipes/bongos-cli-release.md +66 -0
  257. package/docs/recipes/builder-box-lifecycle.md +152 -0
  258. package/docs/recipes/claude-design-loop.md +143 -0
  259. package/docs/recipes/claude-gemini-bongos-doors.md +155 -0
  260. package/docs/recipes/cloudbongos-staging-gate.md +139 -0
  261. package/docs/recipes/cloudbongos-standup.md +111 -0
  262. package/docs/recipes/devbox-app-release.md +93 -0
  263. package/docs/recipes/devbox-app-windows-test.md +128 -0
  264. package/docs/recipes/failed-ship-recovery-proof.md +102 -0
  265. package/docs/recipes/figma-design-loop.md +129 -0
  266. package/docs/recipes/gds-db-backup.md +255 -0
  267. package/docs/recipes/instance-deploy.md +37 -0
  268. package/docs/recipes/managed-settings-remote-control.md +416 -0
  269. package/docs/recipes/memory-backup.md +71 -0
  270. package/docs/recipes/memory-sync-conflicts.md +98 -0
  271. package/docs/recipes/multi-builder-merge.md +78 -0
  272. package/docs/recipes/ops-gotchas.md +212 -0
  273. package/docs/recipes/overnight-builder.md +53 -0
  274. package/docs/recipes/packaging-the-core.md +49 -0
  275. package/docs/recipes/parallel-load-results-2026-05-30.md +63 -0
  276. package/docs/recipes/parallel-load-test.md +32 -0
  277. package/docs/recipes/pixel-art-pipeline.md +411 -0
  278. package/docs/recipes/private-npm-distribution.md +79 -0
  279. package/docs/recipes/search-index-ingestion.md +67 -0
  280. package/docs/recipes/self-host.md +60 -0
  281. package/docs/recipes/ship-and-regrade.md +72 -0
  282. package/docs/recipes/staging-data.md +50 -0
  283. package/docs/recipes/staging-environment.md +215 -0
  284. package/docs/recipes/upgrading-the-core.md +58 -0
  285. package/docs/research/cursor-competitive-analysis.md +255 -0
  286. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +227 -0
  287. package/migrations/003_pms.sql +284 -0
  288. package/migrations/004_pms_cost_idempotency.sql +13 -0
  289. package/migrations/005_pms_smoke_filter.sql +44 -0
  290. package/migrations/006_pms_v2.sql +378 -0
  291. package/migrations/007_pms_v2_hierarchy_trigger.sql +59 -0
  292. package/migrations/008_pms_v2_migration_allocator.sql +27 -0
  293. package/migrations/009_pms_v2_blockers_table.sql +68 -0
  294. package/migrations/010_uptime.sql +29 -0
  295. package/migrations/011_backfill_v2_v3_done_when.sql +20 -0
  296. package/migrations/012_pms_v2_task_lifecycle_states.sql +82 -0
  297. package/migrations/013_claim_locking.sql +22 -0
  298. package/migrations/014_pms_task_discipline.sql +86 -0
  299. package/migrations/015_pms_estimation_calibration.sql +140 -0
  300. package/migrations/016_pms_task_grades.sql +60 -0
  301. package/migrations/017_version_progress_exclude_abandoned.sql +49 -0
  302. package/migrations/019_rename_pms_v3_to_gds_v3.sql +65 -0
  303. package/migrations/020_task_dependencies.sql +99 -0
  304. package/migrations/021_v3_renumber_and_deps.sql +224 -0
  305. package/migrations/022_v3_reconcile_dep_gated_status.sql +41 -0
  306. package/migrations/023_pms_rank.sql +30 -0
  307. package/migrations/025_builder_exit_status.sql +15 -0
  308. package/migrations/027_builders_preferred_disciplines.sql +46 -0
  309. package/migrations/028_tasks_parallel_safe.sql +71 -0
  310. package/migrations/029_rank_three_live.sql +32 -0
  311. package/migrations/030_vulnerability_reports.sql +61 -0
  312. package/migrations/031_reward_simplification.sql +57 -0
  313. package/migrations/032_repo_health_snapshots.sql +56 -0
  314. package/migrations/033_audit_log.sql +64 -0
  315. package/migrations/034_lifecycle_breakdown_leaf_only.sql +62 -0
  316. package/migrations/035_auth_token_hygiene.sql +66 -0
  317. package/migrations/037_builder_skill_model_prefs.sql +44 -0
  318. package/migrations/038_task_override_requests.sql +51 -0
  319. package/migrations/039_newcomer_friendly_column.sql +124 -0
  320. package/migrations/040_builder_karma.sql +58 -0
  321. package/migrations/041_kind_multipliers_and_idea_bonus.sql +42 -0
  322. package/migrations/042_criterion_proposal_workflow.sql +78 -0
  323. package/migrations/043_builder_onboarding_observability.sql +66 -0
  324. package/migrations/044_tasks_requires_rank.sql +97 -0
  325. package/migrations/045_builder_onboarding_state.sql +147 -0
  326. package/migrations/046_cost_log_builder_attribution.sql +42 -0
  327. package/migrations/054_builder_memory.sql +108 -0
  328. package/migrations/055_task_criteria.sql +90 -0
  329. package/migrations/058_peer_votes.sql +41 -0
  330. package/migrations/059_onboarding_pick_disciplines.sql +59 -0
  331. package/migrations/060_access_requests.sql +46 -0
  332. package/migrations/061_backfill_override_ship_attribution.sql +29 -0
  333. package/migrations/062_session_records.sql +34 -0
  334. package/migrations/063_session_records_tool_errors_idx.sql +11 -0
  335. package/migrations/064_grade_attempts.sql +18 -0
  336. package/migrations/065_bfg_principal.sql +58 -0
  337. package/migrations/066_live_notify_triggers.sql +69 -0
  338. package/migrations/067_builder_boxes.sql +117 -0
  339. package/migrations/067_discord_bot_foundation.sql +69 -0
  340. package/migrations/068_thetes_requires_rank.sql +27 -0
  341. package/migrations/069_builder_ssh_keys.sql +66 -0
  342. package/migrations/070_box_intents.sql +101 -0
  343. package/migrations/071_box_first_provision_approval.sql +46 -0
  344. package/migrations/072_onboarding_ship_three_remove_primer.sql +80 -0
  345. package/migrations/073_box_terminal_access.sql +46 -0
  346. package/migrations/075_builder_sound_prefs.sql +28 -0
  347. package/migrations/078_box_claude_active.sql +22 -0
  348. package/migrations/079_box_first_connected_at.sql +20 -0
  349. package/migrations/081_tasks_needs_migration.sql +34 -0
  350. package/migrations/084_tasks_security_sensitive.sql +24 -0
  351. package/migrations/085_security_engagement_docs.sql +34 -0
  352. package/migrations/086_rename_disciplines.sql +125 -0
  353. package/migrations/088_builders_anthropic_link.sql +28 -0
  354. package/migrations/089_builders_monthly_budget.sql +19 -0
  355. package/migrations/090_box_scoped_sessions.sql +38 -0
  356. package/migrations/091_session_token_reward.sql +44 -0
  357. package/migrations/093_tasks_sandbox_review.sql +22 -0
  358. package/migrations/102_remove_box_first_provision_approval.sql +58 -0
  359. package/migrations/103_search_chunks.sql +90 -0
  360. package/migrations/104_builder_box_blocked.sql +34 -0
  361. package/migrations/105_box_host_keys.sql +35 -0
  362. package/migrations/111_medusa_customer0_framing.sql +35 -0
  363. package/migrations/112_drop_track_check.sql +25 -0
  364. package/migrations/113_merge_lease.sql +16 -0
  365. package/migrations/114_cloudbongos_rename_live_strings.sql +32 -0
  366. package/migrations/118_currency_label_decoupling.sql +23 -0
  367. package/migrations/119_builder_behavior_prefs.sql +31 -0
  368. package/migrations/121_box_code_version.sql +37 -0
  369. package/migrations/122_builder_gemini_key.sql +30 -0
  370. package/migrations/123_cost_log_tiers.sql +33 -0
  371. package/migrations/124_cost_baseline.sql +45 -0
  372. package/migrations/125_llm_cache.sql +54 -0
  373. package/migrations/126_autonomy_runs.sql +33 -0
  374. package/migrations/143_cost_calibration.sql +63 -0
  375. package/migrations/145_backfill_task_requires_rank.sql +84 -0
  376. package/migrations/160_goal_tier.sql +88 -0
  377. package/migrations/163_polymorphic_dependencies.sql +187 -0
  378. package/migrations/164_event_sound_prefs.sql +20 -0
  379. package/migrations/165_task_module_key.sql +15 -0
  380. package/migrations/171_claims_published_head_sha.sql +24 -0
  381. package/migrations/174_close_orphaned_claims_on_terminal_tasks.sql +30 -0
  382. package/migrations/175_task_grades_diff_hash.sql +9 -0
  383. package/migrations/176_promotion_respects_open_blockers.sql +58 -0
  384. package/migrations/176_ui_discipline.sql +40 -0
  385. package/migrations/177_require_reward_before_workable.sql +76 -0
  386. package/migrations/178_reward_gate_auto_assign_revert_autopromote.sql +61 -0
  387. package/migrations/179_search_chunk_usefulness.sql +33 -0
  388. package/migrations/180_one_active_claim_per_session.sql +54 -0
  389. package/migrations/181_cost_log_skill_name.sql +33 -0
  390. package/migrations/184_claim_release_requested.sql +25 -0
  391. package/migrations/185_module_upstreaming_goal_wiring.sql +59 -0
  392. package/migrations/187_goal_sort_order.sql +30 -0
  393. package/migrations/187_tasks_kind_check_add_verify.sql +21 -0
  394. package/migrations/README.md +88 -0
  395. package/migrations/core_188_goal_visibility_and_membership_requests.sql +71 -0
  396. package/migrations/core_189_core_upgrades_ledger.sql +37 -0
  397. package/migrations/core_189_credit_log_task_id_index.sql +19 -0
  398. package/migrations/core_190_rebuild_claimable_task_views.sql +71 -0
  399. package/migrations/instance/018_pms_v3_planning_seed.sql +131 -0
  400. package/migrations/instance/080_gds_v4_planning_seed.sql +75 -0
  401. package/migrations/instance/110_medusa_planning_seed.sql +70 -0
  402. package/migrations/instance/120_bongos_v1_planning_seed.sql +69 -0
  403. package/migrations/instance/144_bongos_v1_module_system_criterion.sql +26 -0
  404. package/migrations/instance/159_bongos_v1_goal_hierarchy_criterion.sql +29 -0
  405. package/migrations/instance/172_v2_world_planning_seed.sql +163 -0
  406. package/migrations/instance/173_bongos_v1_c7_core_modularized.sql +33 -0
  407. package/migrations/instance/182_gdsv4_bongos_consolidation.sql +132 -0
  408. package/migrations/instance/183_gdsv4_carryover_themed_goals.sql +116 -0
  409. package/migrations/instance/186_bongos_v1_governance_planning_seed.sql +69 -0
  410. package/modules/autonomy/CLAUDE.md +49 -0
  411. package/modules/autonomy/db.js +50 -0
  412. package/modules/autonomy/module.json +13 -0
  413. package/modules/autonomy/pollers/routine-timers.js +146 -0
  414. package/modules/autonomy/routes/autonomy.js +37 -0
  415. package/modules/builder-settings/CLAUDE.md +58 -0
  416. package/modules/builder-settings/builder-needs.js +115 -0
  417. package/modules/builder-settings/db.js +168 -0
  418. package/modules/builder-settings/display-name.js +84 -0
  419. package/modules/builder-settings/event-sound-prefs.js +169 -0
  420. package/modules/builder-settings/interaction-prefs.js +201 -0
  421. package/modules/builder-settings/model-alloc-prefs.js +147 -0
  422. package/modules/builder-settings/module.json +10 -0
  423. package/modules/builder-settings/render-prefs.js +103 -0
  424. package/modules/builder-settings/routes/settings.js +417 -0
  425. package/modules/builder-settings/settings.js +52 -0
  426. package/modules/builder-settings/skill-prefs.js +196 -0
  427. package/modules/builder-settings/sound-prefs.js +178 -0
  428. package/modules/builder-settings/wandering-prefs.js +282 -0
  429. package/modules/dev-box/CLAUDE.md +38 -0
  430. package/modules/dev-box/box-access.js +275 -0
  431. package/modules/dev-box/box-credential.js +94 -0
  432. package/modules/dev-box/box-onboard.js +486 -0
  433. package/modules/dev-box/boxes.js +842 -0
  434. package/modules/dev-box/db.js +39 -0
  435. package/modules/dev-box/module.json +14 -0
  436. package/modules/dev-box/routes/box.js +977 -0
  437. package/modules/discord/CLAUDE.md +50 -0
  438. package/modules/discord/auth.js +54 -0
  439. package/modules/discord/bug-attachments.js +210 -0
  440. package/modules/discord/db.js +96 -0
  441. package/modules/discord/discord-approvals.js +145 -0
  442. package/modules/discord/discord-audit.js +29 -0
  443. package/modules/discord/discord-bot.js +545 -0
  444. package/modules/discord/discord-bugs.js +257 -0
  445. package/modules/discord/discord-channels.js +412 -0
  446. package/modules/discord/discord-inbound.js +147 -0
  447. package/modules/discord/discord-message-buffer.js +54 -0
  448. package/modules/discord/discord-reaction.js +186 -0
  449. package/modules/discord/discord-role-sync.js +318 -0
  450. package/modules/discord/module.json +14 -0
  451. package/modules/discord/pollers/discord-bot.js +19 -0
  452. package/modules/discord/routes/bug-attachments.js +44 -0
  453. package/modules/discord/routes/discord.js +102 -0
  454. package/modules/discord/ship-broadcast.js +78 -0
  455. package/modules/discord/webhook.js +74 -0
  456. package/modules/economy/CLAUDE.md +48 -0
  457. package/modules/economy/achievements.js +594 -0
  458. package/modules/economy/cost-classify.js +331 -0
  459. package/modules/economy/cost-summary-shape.js +90 -0
  460. package/modules/economy/cost.js +438 -0
  461. package/modules/economy/credits.js +430 -0
  462. package/modules/economy/migrations/economy_001_fix_gds_shipper_description.sql +91 -0
  463. package/modules/economy/module.json +10 -0
  464. package/modules/economy/reward.js +61 -0
  465. package/modules/economy/routes/cost.js +97 -0
  466. package/modules/economy/routes/leaderboard.js +26 -0
  467. package/modules/economy/routes/reward.js +42 -0
  468. package/modules/economy/streak.js +285 -0
  469. package/modules/grading/CLAUDE.md +42 -0
  470. package/modules/grading/db.js +39 -0
  471. package/modules/grading/grader-rubric.json +151 -0
  472. package/modules/grading/grader-workers/efficiency.js +213 -0
  473. package/modules/grading/grader-workers/extract-json.js +80 -0
  474. package/modules/grading/grader-workers/fence.js +100 -0
  475. package/modules/grading/grader-workers/hacker.js +239 -0
  476. package/modules/grading/grader-workers/index.js +183 -0
  477. package/modules/grading/grader-workers/narc.js +207 -0
  478. package/modules/grading/grader-workers/quality.js +198 -0
  479. package/modules/grading/grader-workers/rubric.js +20 -0
  480. package/modules/grading/grader-workers/worker-prompt.js +89 -0
  481. package/modules/grading/grader-workers/worker-verdict.js +50 -0
  482. package/modules/grading/grader.js +1790 -0
  483. package/modules/grading/module.json +12 -0
  484. package/modules/grading/routes/grade.js +51 -0
  485. package/modules/hall-ui/CLAUDE.md +61 -0
  486. package/modules/hall-ui/module.json +14 -0
  487. package/modules/hall-ui/public/atlas.html +180 -0
  488. package/modules/hall-ui/public/atlas.js +336 -0
  489. package/modules/hall-ui/public/box-panel.js +423 -0
  490. package/modules/hall-ui/public/brand-apply.js +117 -0
  491. package/modules/hall-ui/public/builders.js +3028 -0
  492. package/modules/hall-ui/public/chime.wav +0 -0
  493. package/modules/hall-ui/public/copy-on-click.js +174 -0
  494. package/modules/hall-ui/public/cursors/arrow.png +0 -0
  495. package/modules/hall-ui/public/cursors/hand-pointer.png +0 -0
  496. package/modules/hall-ui/public/cursors/magnifier-out.png +0 -0
  497. package/modules/hall-ui/public/cursors/magnifier.png +0 -0
  498. package/modules/hall-ui/public/diagram-viewer.css +125 -0
  499. package/modules/hall-ui/public/diagram-viewer.js +330 -0
  500. package/modules/hall-ui/public/diagrams.html +113 -0
  501. package/modules/hall-ui/public/dom-utils.js +212 -0
  502. package/modules/hall-ui/public/drachmae.html +68 -0
  503. package/modules/hall-ui/public/drachmae.js +136 -0
  504. package/modules/hall-ui/public/gate.html +143 -0
  505. package/modules/hall-ui/public/gate.js +228 -0
  506. package/modules/hall-ui/public/goals-page.js +1297 -0
  507. package/modules/hall-ui/public/goals.html +376 -0
  508. package/modules/hall-ui/public/goals.js +119 -0
  509. package/modules/hall-ui/public/hall-widgets.js +189 -0
  510. package/modules/hall-ui/public/harbor.html +167 -0
  511. package/modules/hall-ui/public/harbor.js +335 -0
  512. package/modules/hall-ui/public/index.html +116 -0
  513. package/modules/hall-ui/public/instances-panel.js +172 -0
  514. package/modules/hall-ui/public/md-reader.js +234 -0
  515. package/modules/hall-ui/public/modules.html +119 -0
  516. package/modules/hall-ui/public/modules.js +154 -0
  517. package/modules/hall-ui/public/new-project-wizard.js +186 -0
  518. package/modules/hall-ui/public/not-ready.html +48 -0
  519. package/modules/hall-ui/public/pair.html +119 -0
  520. package/modules/hall-ui/public/pair.js +132 -0
  521. package/modules/hall-ui/public/primer.css +404 -0
  522. package/modules/hall-ui/public/primer.html +85 -0
  523. package/modules/hall-ui/public/primer.js +641 -0
  524. package/modules/hall-ui/public/profile.html +85 -0
  525. package/modules/hall-ui/public/profile.js +236 -0
  526. package/modules/hall-ui/public/ranks.html +69 -0
  527. package/modules/hall-ui/public/ranks.js +206 -0
  528. package/modules/hall-ui/public/roadmap.html +209 -0
  529. package/modules/hall-ui/public/roadmap.js +375 -0
  530. package/modules/hall-ui/public/sessions.html +92 -0
  531. package/modules/hall-ui/public/sessions.js +222 -0
  532. package/modules/hall-ui/public/settings.html +640 -0
  533. package/modules/hall-ui/public/settings.js +1219 -0
  534. package/modules/hall-ui/public/shell.js +495 -0
  535. package/modules/hall-ui/public/style.css +1748 -0
  536. package/modules/hall-ui/public/task-detail.js +253 -0
  537. package/modules/hall-ui/public/task.html +83 -0
  538. package/modules/hall-ui/public/task.js +326 -0
  539. package/modules/hall-ui/public/watch.html +333 -0
  540. package/modules/hall-ui/public/watch.js +859 -0
  541. package/modules/hall-ui/public/work.html +469 -0
  542. package/modules/hall-ui/public/work.js +1292 -0
  543. package/modules/ideas/CLAUDE.md +37 -0
  544. package/modules/ideas/blockers.js +100 -0
  545. package/modules/ideas/inbox.js +459 -0
  546. package/modules/ideas/module.json +10 -0
  547. package/modules/ideas/routes/blockers.js +120 -0
  548. package/modules/ideas/routes/inbox.js +230 -0
  549. package/modules/lifecycle/CLAUDE.md +63 -0
  550. package/modules/lifecycle/conflict-resolve.js +436 -0
  551. package/modules/lifecycle/db.js +4970 -0
  552. package/modules/lifecycle/done-when.js +355 -0
  553. package/modules/lifecycle/github-push.js +969 -0
  554. package/modules/lifecycle/goal-conflicts.js +133 -0
  555. package/modules/lifecycle/hierarchy.js +104 -0
  556. package/modules/lifecycle/lifecycle.js +58 -0
  557. package/modules/lifecycle/merge-lock.js +261 -0
  558. package/modules/lifecycle/migrations/lifecycle_001_goal_first_leads.sql +28 -0
  559. package/modules/lifecycle/migrations/lifecycle_002_backfill_orphan_task_goals.sql +36 -0
  560. package/modules/lifecycle/module.json +13 -0
  561. package/modules/lifecycle/pollers/publish-reconciler.js +20 -0
  562. package/modules/lifecycle/publish-reconciler.js +418 -0
  563. package/modules/lifecycle/routes/analytics.js +63 -0
  564. package/modules/lifecycle/routes/claims.js +506 -0
  565. package/modules/lifecycle/routes/dependencies.js +82 -0
  566. package/modules/lifecycle/routes/done-when.js +136 -0
  567. package/modules/lifecycle/routes/gate-approvals.js +197 -0
  568. package/modules/lifecycle/routes/goals.js +1419 -0
  569. package/modules/lifecycle/routes/lifecycle.js +43 -0
  570. package/modules/lifecycle/routes/tasks.js +1703 -0
  571. package/modules/lifecycle/routes/versions.js +128 -0
  572. package/modules/lifecycle/ship-card.js +505 -0
  573. package/modules/lifecycle/ship-preflight.js +225 -0
  574. package/modules/lifecycle/task-classifier.js +512 -0
  575. package/modules/lifecycle/version-close.js +106 -0
  576. package/modules/memory/CLAUDE.md +40 -0
  577. package/modules/memory/learnings.js +275 -0
  578. package/modules/memory/memory.js +572 -0
  579. package/modules/memory/module.json +12 -0
  580. package/modules/memory/routes/learnings.js +90 -0
  581. package/modules/memory/routes/memory.js +916 -0
  582. package/modules/memory/routes/search.js +188 -0
  583. package/modules/memory/search-chunker.js +252 -0
  584. package/modules/memory/search.js +320 -0
  585. package/modules/onboarding/CLAUDE.md +55 -0
  586. package/modules/onboarding/approval-broadcast.js +59 -0
  587. package/modules/onboarding/db.js +54 -0
  588. package/modules/onboarding/module.json +10 -0
  589. package/modules/onboarding/newcomer-restock.js +212 -0
  590. package/modules/onboarding/onboarding-state.js +532 -0
  591. package/modules/onboarding/onboarding.js +508 -0
  592. package/modules/onboarding/port.js +63 -0
  593. package/modules/onboarding/routes/access-requests.js +208 -0
  594. package/modules/onboarding/routes/onboarding.js +54 -0
  595. package/modules/security/CLAUDE.md +44 -0
  596. package/modules/security/module.json +10 -0
  597. package/modules/security/routes/reports.js +251 -0
  598. package/modules/security/secret-scrub.js +201 -0
  599. package/modules/security/security.js +294 -0
  600. package/modules/sessions/CLAUDE.md +39 -0
  601. package/modules/sessions/bfg.js +357 -0
  602. package/modules/sessions/db.js +326 -0
  603. package/modules/sessions/module.json +10 -0
  604. package/modules/sessions/pulse.js +149 -0
  605. package/modules/sessions/routes/sessions.js +331 -0
  606. package/modules/status-ui/CLAUDE.md +47 -0
  607. package/modules/status-ui/module.json +14 -0
  608. package/modules/status-ui/public/README.md +29 -0
  609. package/modules/status-ui/public/cursors/arrow.png +0 -0
  610. package/modules/status-ui/public/cursors/hand-pointer.png +0 -0
  611. package/modules/status-ui/public/index.html +363 -0
  612. package/modules/status-ui/public/snapshots/.gitkeep +0 -0
  613. package/modules/status-ui/public/status.js +1375 -0
  614. package/modules/status-ui/public/style.css +1342 -0
  615. package/package-lock.json +975 -0
  616. package/package.json +28 -0
  617. package/public-docs/index.html +35 -0
  618. package/public-docs/redoc.standalone.js +1838 -0
  619. package/public-docs/redoc.standalone.js.LICENSE.txt +102 -0
  620. package/public-landing/buddha.png +0 -0
  621. package/public-landing/create.html +868 -0
  622. package/public-landing/index.html +168 -0
  623. package/scripts/bongos-mcp.js +28 -0
  624. package/scripts/cron/style_guide_audit.sh +134 -0
  625. package/scripts/discord/README.md +52 -0
  626. package/scripts/discord/lib.js +80 -0
  627. package/scripts/discord/post.js +51 -0
  628. package/scripts/gds/CLAUDE.md +144 -0
  629. package/scripts/gds/abandon.js +58 -0
  630. package/scripts/gds/adopt-detect.js +123 -0
  631. package/scripts/gds/adopt-import.js +111 -0
  632. package/scripts/gds/adopt-preflight.js +121 -0
  633. package/scripts/gds/api.js +78 -0
  634. package/scripts/gds/architect-audit.js +288 -0
  635. package/scripts/gds/art-stage.js +152 -0
  636. package/scripts/gds/audit-authorship.sh +243 -0
  637. package/scripts/gds/audit-deps.js +121 -0
  638. package/scripts/gds/audit-exports.js +128 -0
  639. package/scripts/gds/audit-replay.sh +161 -0
  640. package/scripts/gds/audit-ships.js +251 -0
  641. package/scripts/gds/autonomy-gate.js +135 -0
  642. package/scripts/gds/backfill-cost.js +165 -0
  643. package/scripts/gds/backfill-sessions.js +351 -0
  644. package/scripts/gds/backfill-task-rewards.js +408 -0
  645. package/scripts/gds/backup.js +94 -0
  646. package/scripts/gds/bfg-principal-token.js +65 -0
  647. package/scripts/gds/box-auth-check.js +160 -0
  648. package/scripts/gds/box-connect-lib.js +453 -0
  649. package/scripts/gds/box.js +1258 -0
  650. package/scripts/gds/build-bongos.js +94 -0
  651. package/scripts/gds/capture.js +123 -0
  652. package/scripts/gds/cf-tunnel.js +419 -0
  653. package/scripts/gds/ci-grade.js +82 -0
  654. package/scripts/gds/claim-recall.js +112 -0
  655. package/scripts/gds/claim.js +333 -0
  656. package/scripts/gds/classify-discipline.js +153 -0
  657. package/scripts/gds/claude-materialize.js +176 -0
  658. package/scripts/gds/cleanup-orphans.js +74 -0
  659. package/scripts/gds/cli-lib.js +518 -0
  660. package/scripts/gds/code.js +101 -0
  661. package/scripts/gds/codemod-rename-src-gds.js +145 -0
  662. package/scripts/gds/conductor-dispatch.js +426 -0
  663. package/scripts/gds/context-pack.js +228 -0
  664. package/scripts/gds/coreB-carve-proof.sh +716 -0
  665. package/scripts/gds/cost.js +47 -0
  666. package/scripts/gds/db-backup-nightly.sh +160 -0
  667. package/scripts/gds/db-backup-offsite.sh +152 -0
  668. package/scripts/gds/demote.js +40 -0
  669. package/scripts/gds/design-sync.js +62 -0
  670. package/scripts/gds/diagnose-achievements.js +118 -0
  671. package/scripts/gds/diagram-facts.js +319 -0
  672. package/scripts/gds/discipline-modes.json +25 -0
  673. package/scripts/gds/discord-channels.js +66 -0
  674. package/scripts/gds/do-api.js +176 -0
  675. package/scripts/gds/docs-entropy.js +403 -0
  676. package/scripts/gds/doctor.js +389 -0
  677. package/scripts/gds/feedback-latest.js +94 -0
  678. package/scripts/gds/fetch-art-key.js +106 -0
  679. package/scripts/gds/fetch-sound-prefs.js +88 -0
  680. package/scripts/gds/figma-design-sync.js +61 -0
  681. package/scripts/gds/fitness.js +1446 -0
  682. package/scripts/gds/gate-review.js +322 -0
  683. package/scripts/gds/gating.js +325 -0
  684. package/scripts/gds/gds-db-backup.service +24 -0
  685. package/scripts/gds/gds-db-backup.timer +20 -0
  686. package/scripts/gds/gds-db-offsite.service +29 -0
  687. package/scripts/gds/gds-db-offsite.timer +18 -0
  688. package/scripts/gds/gen-api-client.js +508 -0
  689. package/scripts/gds/gen-api-docs.js +1037 -0
  690. package/scripts/gds/gen-atlas.js +366 -0
  691. package/scripts/gds/gen-diagrams.js +608 -0
  692. package/scripts/gds/gen-file-map.js +196 -0
  693. package/scripts/gds/gen-repo-map.js +519 -0
  694. package/scripts/gds/gen-session-index.js +210 -0
  695. package/scripts/gds/git-merge-regen.js +147 -0
  696. package/scripts/gds/grade-smoke.js +205 -0
  697. package/scripts/gds/hooks/pre-push.js +169 -0
  698. package/scripts/gds/http-api-client.js +88 -0
  699. package/scripts/gds/init.js +903 -0
  700. package/scripts/gds/install-git-hooks.js +114 -0
  701. package/scripts/gds/key-card.js +213 -0
  702. package/scripts/gds/key-status.js +126 -0
  703. package/scripts/gds/land-watch.js +168 -0
  704. package/scripts/gds/learning-capture.js +145 -0
  705. package/scripts/gds/lib.sh +44 -0
  706. package/scripts/gds/linkify-refs.js +473 -0
  707. package/scripts/gds/local-preview-lib.js +159 -0
  708. package/scripts/gds/local-preview.js +95 -0
  709. package/scripts/gds/login.js +225 -0
  710. package/scripts/gds/main-audit.js +279 -0
  711. package/scripts/gds/me.js +88 -0
  712. package/scripts/gds/memory-map.js +174 -0
  713. package/scripts/gds/merge-lock.js +71 -0
  714. package/scripts/gds/migration-namespace.js +200 -0
  715. package/scripts/gds/mirror-lineage-check.js +319 -0
  716. package/scripts/gds/mirror-redact.js +305 -0
  717. package/scripts/gds/module.js +482 -0
  718. package/scripts/gds/newcomer-floor.config.json +13 -0
  719. package/scripts/gds/newcomer-floor.js +415 -0
  720. package/scripts/gds/newcomer-floor.templates.json +86 -0
  721. package/scripts/gds/newcomer-floor.test.js +235 -0
  722. package/scripts/gds/next-number.js +163 -0
  723. package/scripts/gds/oauth-secret.js +197 -0
  724. package/scripts/gds/onboard.js +217 -0
  725. package/scripts/gds/onboarding-analyze.js +226 -0
  726. package/scripts/gds/onboarding-config.js +178 -0
  727. package/scripts/gds/onboarding-ship.js +92 -0
  728. package/scripts/gds/package-core.js +684 -0
  729. package/scripts/gds/paste-token.js +131 -0
  730. package/scripts/gds/portability-smoke-art.sh +85 -0
  731. package/scripts/gds/portability-smoke-memory.sh +147 -0
  732. package/scripts/gds/provision.js +1324 -0
  733. package/scripts/gds/publish-manifest.js +307 -0
  734. package/scripts/gds/pulse.js +309 -0
  735. package/scripts/gds/push-main.js +45 -0
  736. package/scripts/gds/read-session-export.js +359 -0
  737. package/scripts/gds/reauth.js +149 -0
  738. package/scripts/gds/recall.js +135 -0
  739. package/scripts/gds/release.js +71 -0
  740. package/scripts/gds/render-ideas.js +173 -0
  741. package/scripts/gds/repo-metrics.js +363 -0
  742. package/scripts/gds/resolve-skill-model.js +57 -0
  743. package/scripts/gds/run-routine.js +197 -0
  744. package/scripts/gds/run-unit-tests.js +178 -0
  745. package/scripts/gds/sandbox-stage.js +653 -0
  746. package/scripts/gds/search-ingest-db.js +209 -0
  747. package/scripts/gds/search-ingest-md.js +225 -0
  748. package/scripts/gds/security-baseline-check.sh +180 -0
  749. package/scripts/gds/seed-adopt-tasks.js +75 -0
  750. package/scripts/gds/seed-api-contract-goal-tasks.js +141 -0
  751. package/scripts/gds/seed-bongos-app-tasks.js +294 -0
  752. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +81 -0
  753. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +100 -0
  754. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +307 -0
  755. package/scripts/gds/seed-bongos-module-system-tasks.js +346 -0
  756. package/scripts/gds/seed-bongos-tasks.js +214 -0
  757. package/scripts/gds/seed-gds-v4-tasks.js +624 -0
  758. package/scripts/gds/seed-governance-tasks.js +340 -0
  759. package/scripts/gds/seed-medusa-tasks.js +440 -0
  760. package/scripts/gds/seed-module-upstreaming.js +219 -0
  761. package/scripts/gds/seed-productization-tasks.js +235 -0
  762. package/scripts/gds/seed-provisioning-tasks.js +83 -0
  763. package/scripts/gds/seed-staging.sh +104 -0
  764. package/scripts/gds/seed-v2-world-tasks.js +283 -0
  765. package/scripts/gds/seed-v3-tasks.js +1981 -0
  766. package/scripts/gds/session-cost.js +393 -0
  767. package/scripts/gds/session-digest.js +179 -0
  768. package/scripts/gds/session-eval.js +576 -0
  769. package/scripts/gds/session.js +404 -0
  770. package/scripts/gds/setup.js +504 -0
  771. package/scripts/gds/shell.js +100 -0
  772. package/scripts/gds/ship.js +3618 -0
  773. package/scripts/gds/smoke-batch-claim.sh +213 -0
  774. package/scripts/gds/smoke-batch-release.sh +296 -0
  775. package/scripts/gds/smoke-box.sh +150 -0
  776. package/scripts/gds/smoke-claim-consistency.sh +212 -0
  777. package/scripts/gds/smoke-dependencies.sh +84 -0
  778. package/scripts/gds/smoke-gds.js +125 -0
  779. package/scripts/gds/smoke-write.sh +168 -0
  780. package/scripts/gds/start.js +782 -0
  781. package/scripts/gds/status.js +365 -0
  782. package/scripts/gds/triage.js +366 -0
  783. package/scripts/gds/upgrade.js +421 -0
  784. package/scripts/gds/validate-design.js +254 -0
  785. package/scripts/gds/version-close.js +549 -0
  786. package/scripts/migrate.sh +183 -0
  787. package/scripts/migrate_cost_ledger.sh +178 -0
  788. package/scripts/public-mirror-export.js +291 -0
  789. package/scripts/render-diagrams.sh +88 -0
  790. package/scripts/security/dep-audit.js +276 -0
  791. package/scripts/setup-builder.js +274 -0
  792. package/scripts/setup-builder.sh +28 -0
  793. package/scripts/snapshots/backfill-history.mjs +292 -0
  794. package/scripts/snapshots/maybe-render-on-deploy.sh +66 -0
  795. package/scripts/snapshots/render-pre-art-eras.mjs +329 -0
  796. package/scripts/snapshots/render-world.mjs +322 -0
  797. package/scripts/status-mirror-sync.js +192 -0
  798. package/scripts/status-probe.mjs +185 -0
  799. package/server.js +212 -0
  800. package/src/asset-version.js +71 -0
  801. package/src/bongos/CLAUDE.md +64 -0
  802. package/src/bongos/api-errors.js +281 -0
  803. package/src/bongos/api-path-404.js +67 -0
  804. package/src/bongos/api-prefix.js +38 -0
  805. package/src/bongos/app-pair.js +172 -0
  806. package/src/bongos/auth.js +979 -0
  807. package/src/bongos/cascade-dispatch.js +123 -0
  808. package/src/bongos/db-kernel.js +252 -0
  809. package/src/bongos/db.js +911 -0
  810. package/src/bongos/goal-scope-check.js +120 -0
  811. package/src/bongos/hierarchy-config.js +189 -0
  812. package/src/bongos/live-channel.js +145 -0
  813. package/src/bongos/llm-cache.js +260 -0
  814. package/src/bongos/llm-pricing.js +220 -0
  815. package/src/bongos/metrics.js +286 -0
  816. package/src/bongos/middleware/audit.js +274 -0
  817. package/src/bongos/middleware/error-envelope.js +93 -0
  818. package/src/bongos/middleware/rate-limit.js +195 -0
  819. package/src/bongos/module-scope-map.js +271 -0
  820. package/src/bongos/optimizer.js +166 -0
  821. package/src/bongos/path-match.js +47 -0
  822. package/src/bongos/permission-path-check.js +248 -0
  823. package/src/bongos/pool.js +55 -0
  824. package/src/bongos/repo-info.js +91 -0
  825. package/src/bongos/route-rank-check.js +420 -0
  826. package/src/bongos/routes/CLAUDE.md +43 -0
  827. package/src/bongos/routes/_helpers.js +369 -0
  828. package/src/bongos/routes/audit-log.js +59 -0
  829. package/src/bongos/routes/auth.js +755 -0
  830. package/src/bongos/routes/backup.js +104 -0
  831. package/src/bongos/routes/builders.js +526 -0
  832. package/src/bongos/routes/healthz.js +16 -0
  833. package/src/bongos/routes/instance.js +129 -0
  834. package/src/bongos/routes/live.js +125 -0
  835. package/src/bongos/routes/llm-cache.js +119 -0
  836. package/src/bongos/routes/me.js +380 -0
  837. package/src/bongos/routes/modules.js +131 -0
  838. package/src/bongos/routes/optimizer.js +54 -0
  839. package/src/bongos/routes/public.js +476 -0
  840. package/src/bongos/routes/security.js +207 -0
  841. package/src/bongos/routes.js +166 -0
  842. package/src/bongos/secret-box.js +177 -0
  843. package/src/bongos/sensitive-surfaces.js +30 -0
  844. package/src/bongos/serve-internal.js +889 -0
  845. package/src/bongos/uptime-poller.js +90 -0
  846. package/src/bongos-downloads.js +70 -0
  847. package/src/branding.js +182 -0
  848. package/src/build-info.js +77 -0
  849. package/src/devbox-downloads.js +67 -0
  850. package/src/instance-config.js +200 -0
  851. package/src/module-api.js +366 -0
  852. package/src/module-loader/loader.js +268 -0
  853. package/src/module-loader/manifest-schema.js +140 -0
  854. package/src/module-loader/provenance.js +28 -0
  855. package/src/module-loader/semver.js +100 -0
  856. package/src/module-seams.js +291 -0
  857. package/src/modules.js +254 -0
  858. package/src/platform-server.js +135 -0
  859. package/src/ui/adapters/claude-design/index.js +333 -0
  860. package/src/ui/adapters/figma/index.js +328 -0
  861. package/tests/abandon_task.mjs +138 -0
  862. package/tests/achievements_reconcile.mjs +167 -0
  863. package/tests/adopt_detect.mjs +141 -0
  864. package/tests/adopt_import.mjs +132 -0
  865. package/tests/adopt_preflight.mjs +105 -0
  866. package/tests/anti_grid.mjs +89 -0
  867. package/tests/api_client.mjs +231 -0
  868. package/tests/api_docs.mjs +283 -0
  869. package/tests/api_error_envelope_buildcheck.mjs +56 -0
  870. package/tests/api_error_envelope_middleware.mjs +99 -0
  871. package/tests/api_error_registry.mjs +108 -0
  872. package/tests/api_pagination_contract.mjs +51 -0
  873. package/tests/api_path_404.mjs +96 -0
  874. package/tests/app_pair.mjs +168 -0
  875. package/tests/architect.mjs +140 -0
  876. package/tests/art_key.mjs +121 -0
  877. package/tests/art_stage.mjs +121 -0
  878. package/tests/asset_version.mjs +94 -0
  879. package/tests/atlas.mjs +69 -0
  880. package/tests/audit_deps.mjs +74 -0
  881. package/tests/audit_middleware.mjs +385 -0
  882. package/tests/auth_admission_gate.mjs +164 -0
  883. package/tests/auth_anthropic_identity.mjs +95 -0
  884. package/tests/auth_duplicate_cookie.mjs +56 -0
  885. package/tests/auth_error_brand.mjs +77 -0
  886. package/tests/auth_flow_slice1.mjs +223 -0
  887. package/tests/auth_inactive_builder.mjs +94 -0
  888. package/tests/auth_page_gate.mjs +92 -0
  889. package/tests/auth_session_ttl.mjs +155 -0
  890. package/tests/autonomous_fit_protected_paths.mjs +115 -0
  891. package/tests/autonomy_gate.mjs +85 -0
  892. package/tests/autotile_variants.mjs +256 -0
  893. package/tests/autotile_xverify.mjs +133 -0
  894. package/tests/backfill_sessions.mjs +101 -0
  895. package/tests/backfill_task_rewards.mjs +152 -0
  896. package/tests/backup_cli.mjs +104 -0
  897. package/tests/bfg.mjs +327 -0
  898. package/tests/bfg_write.mjs +423 -0
  899. package/tests/bongos_box_connect.mjs +89 -0
  900. package/tests/bongos_dispatch.mjs +74 -0
  901. package/tests/bongos_downloads.mjs +118 -0
  902. package/tests/bongos_login.mjs +34 -0
  903. package/tests/box_access.mjs +186 -0
  904. package/tests/box_auth_check.mjs +114 -0
  905. package/tests/box_code_staleness.mjs +116 -0
  906. package/tests/box_connect_e2e.mjs +196 -0
  907. package/tests/box_cost.mjs +70 -0
  908. package/tests/box_dns_repoint.mjs +151 -0
  909. package/tests/box_host_keys.mjs +102 -0
  910. package/tests/box_onboard.mjs +317 -0
  911. package/tests/box_scope_session.mjs +115 -0
  912. package/tests/box_ship_permissions.mjs +71 -0
  913. package/tests/box_terminal_ssrf.mjs +90 -0
  914. package/tests/boxes.mjs +1255 -0
  915. package/tests/branding.mjs +88 -0
  916. package/tests/bug_attachments.mjs +189 -0
  917. package/tests/build_info.mjs +88 -0
  918. package/tests/builder_needs.mjs +99 -0
  919. package/tests/cap_newcomer_tasks.mjs +114 -0
  920. package/tests/cascade-dispatch.mjs +95 -0
  921. package/tests/cf_tunnel.mjs +459 -0
  922. package/tests/claim_recall.mjs +150 -0
  923. package/tests/claims_bind_session.mjs +47 -0
  924. package/tests/claude_materialize.mjs +148 -0
  925. package/tests/cli_box_scope.mjs +52 -0
  926. package/tests/cli_lib_formatters.mjs +87 -0
  927. package/tests/cli_token_reissue.mjs +147 -0
  928. package/tests/client_bundle_route.mjs +47 -0
  929. package/tests/cloud_bongos_pack.mjs +85 -0
  930. package/tests/conductor.mjs +496 -0
  931. package/tests/confirm_attribution.mjs +156 -0
  932. package/tests/conflict_resolve.mjs +462 -0
  933. package/tests/context_pack.mjs +240 -0
  934. package/tests/cost.mjs +94 -0
  935. package/tests/cost_audit.mjs +122 -0
  936. package/tests/cost_budget_status.mjs +78 -0
  937. package/tests/cost_reconcile.mjs +102 -0
  938. package/tests/cost_summary_shape.mjs +94 -0
  939. package/tests/credit_grant.mjs +376 -0
  940. package/tests/criterion_progress.mjs +220 -0
  941. package/tests/criterion_proposal.mjs +109 -0
  942. package/tests/criterion_ref_parse.mjs +53 -0
  943. package/tests/currency_label.mjs +119 -0
  944. package/tests/day_cycle.mjs +197 -0
  945. package/tests/dependencies_migration.mjs +77 -0
  946. package/tests/dependencies_polymorphic.mjs +212 -0
  947. package/tests/deploy_instance.mjs +78 -0
  948. package/tests/devbox_downloads.mjs +122 -0
  949. package/tests/diff_derived_signals.mjs +115 -0
  950. package/tests/discord_approvals.mjs +174 -0
  951. package/tests/discord_autojoin.mjs +158 -0
  952. package/tests/discord_bot.mjs +94 -0
  953. package/tests/discord_bugs.mjs +297 -0
  954. package/tests/discord_channels.mjs +337 -0
  955. package/tests/discord_foundation.mjs +76 -0
  956. package/tests/discord_inbound.mjs +190 -0
  957. package/tests/discord_message_buffer.mjs +87 -0
  958. package/tests/discord_oauth.mjs +55 -0
  959. package/tests/discord_reaction.mjs +170 -0
  960. package/tests/discord_role_sync.mjs +151 -0
  961. package/tests/display_name.mjs +123 -0
  962. package/tests/dns_preflight.mjs +74 -0
  963. package/tests/event_sound_prefs.mjs +194 -0
  964. package/tests/eviction_policy.mjs +279 -0
  965. package/tests/figma_adapter.mjs +199 -0
  966. package/tests/file_map.mjs +91 -0
  967. package/tests/first_admin_bootstrap.mjs +40 -0
  968. package/tests/fitness.mjs +435 -0
  969. package/tests/fitness_two_root.mjs +104 -0
  970. package/tests/fixtures/session-506-digest.json +34 -0
  971. package/tests/gate_approvals.mjs +451 -0
  972. package/tests/gate_review.mjs +152 -0
  973. package/tests/git_merge_regen.mjs +151 -0
  974. package/tests/github_push_ancestry.mjs +119 -0
  975. package/tests/github_push_land_proof.mjs +127 -0
  976. package/tests/github_push_merge_driver.mjs +175 -0
  977. package/tests/goal_abuse_matrix.mjs +187 -0
  978. package/tests/goal_achievement.mjs +146 -0
  979. package/tests/goal_conflicts.mjs +305 -0
  980. package/tests/goal_dependencies_read.mjs +73 -0
  981. package/tests/goal_member_roles.mjs +420 -0
  982. package/tests/goal_membership_requests.mjs +332 -0
  983. package/tests/goal_routes.mjs +203 -0
  984. package/tests/goal_scope_check.mjs +167 -0
  985. package/tests/goal_tier.mjs +312 -0
  986. package/tests/goal_wall_proof.mjs +112 -0
  987. package/tests/grade_attempts.mjs +73 -0
  988. package/tests/grade_attribution.mjs +117 -0
  989. package/tests/grade_diff_hash.mjs +191 -0
  990. package/tests/grade_server_authoritative.mjs +305 -0
  991. package/tests/grade_unavailable_display.mjs +66 -0
  992. package/tests/grader.mjs +1960 -0
  993. package/tests/grader_bypass.mjs +57 -0
  994. package/tests/grader_panel.mjs +252 -0
  995. package/tests/grader_prompt_fencing.mjs +192 -0
  996. package/tests/helpers.mjs +52 -0
  997. package/tests/hierarchy-config.mjs +81 -0
  998. package/tests/init.mjs +463 -0
  999. package/tests/instance_config.mjs +76 -0
  1000. package/tests/instance_manifest.mjs +110 -0
  1001. package/tests/interaction_prefs.mjs +72 -0
  1002. package/tests/key-card.mjs +110 -0
  1003. package/tests/key-status.mjs +45 -0
  1004. package/tests/land_watch.mjs +115 -0
  1005. package/tests/lifecycle-card.mjs +145 -0
  1006. package/tests/lifecycle_breakdown_view.mjs +236 -0
  1007. package/tests/linkify_refs.mjs +264 -0
  1008. package/tests/live_channel.mjs +128 -0
  1009. package/tests/live_sse.mjs +122 -0
  1010. package/tests/llm-cache-route.mjs +110 -0
  1011. package/tests/llm-cache.mjs +140 -0
  1012. package/tests/llm-pricing.mjs +152 -0
  1013. package/tests/local_preview.mjs +136 -0
  1014. package/tests/main_audit.mjs +137 -0
  1015. package/tests/memory_isolation.mjs +431 -0
  1016. package/tests/memory_map.mjs +107 -0
  1017. package/tests/memory_pull.mjs +429 -0
  1018. package/tests/merge_lease.mjs +100 -0
  1019. package/tests/merge_lock.mjs +312 -0
  1020. package/tests/metrics.mjs +147 -0
  1021. package/tests/migration_allocation.mjs +146 -0
  1022. package/tests/migration_namespace.mjs +185 -0
  1023. package/tests/migrations_fresh_replay_guard.mjs +38 -0
  1024. package/tests/mirror_lineage_fulltree.mjs +45 -0
  1025. package/tests/mirror_lineage_proof.mjs +72 -0
  1026. package/tests/mirror_redact.mjs +193 -0
  1027. package/tests/model_alloc_prefs.mjs +63 -0
  1028. package/tests/module-scope-map.mjs +88 -0
  1029. package/tests/module_api.mjs +110 -0
  1030. package/tests/module_cli.mjs +292 -0
  1031. package/tests/module_contributions.mjs +148 -0
  1032. package/tests/module_loader.mjs +286 -0
  1033. package/tests/module_manifest.mjs +194 -0
  1034. package/tests/module_owned_tests.mjs +105 -0
  1035. package/tests/module_provenance.mjs +34 -0
  1036. package/tests/module_route_rank.mjs +147 -0
  1037. package/tests/module_seams.mjs +68 -0
  1038. package/tests/modules.mjs +156 -0
  1039. package/tests/modules_route.mjs +38 -0
  1040. package/tests/newcomer_floor.mjs +17 -0
  1041. package/tests/newcomer_restock.mjs +80 -0
  1042. package/tests/next_number.mjs +154 -0
  1043. package/tests/oauth_secret.mjs +60 -0
  1044. package/tests/onboard.mjs +70 -0
  1045. package/tests/onboarding_gate.mjs +267 -0
  1046. package/tests/onboarding_observability.mjs +344 -0
  1047. package/tests/onboarding_route_signals.mjs +175 -0
  1048. package/tests/onboarding_state.mjs +346 -0
  1049. package/tests/one_active_claim_per_session.mjs +111 -0
  1050. package/tests/orphaned_claim_ship.mjs +135 -0
  1051. package/tests/override_attribution.mjs +142 -0
  1052. package/tests/override_request_ownership.mjs +235 -0
  1053. package/tests/package_core.mjs +435 -0
  1054. package/tests/parallel-load.mjs +402 -0
  1055. package/tests/path_match.mjs +62 -0
  1056. package/tests/permission_path.mjs +151 -0
  1057. package/tests/platform_boot.mjs +167 -0
  1058. package/tests/pre_compact.mjs +60 -0
  1059. package/tests/preview_server.mjs +127 -0
  1060. package/tests/profile_route.mjs +197 -0
  1061. package/tests/provision.mjs +805 -0
  1062. package/tests/provisioning_github_app_routes.mjs +98 -0
  1063. package/tests/public_mirror_export.mjs +124 -0
  1064. package/tests/public_task_resolver.mjs +112 -0
  1065. package/tests/publish_branch_route.mjs +422 -0
  1066. package/tests/publish_manifest.mjs +184 -0
  1067. package/tests/publish_reconciler.mjs +728 -0
  1068. package/tests/rank_gate.mjs +463 -0
  1069. package/tests/rate_limit_public.mjs +217 -0
  1070. package/tests/read_session_export.mjs +89 -0
  1071. package/tests/recall_cli.mjs +82 -0
  1072. package/tests/recall_hints.mjs +119 -0
  1073. package/tests/recent_shipped_window.mjs +80 -0
  1074. package/tests/regrade_eligibility.mjs +202 -0
  1075. package/tests/render_prefs.mjs +122 -0
  1076. package/tests/repo_map.mjs +92 -0
  1077. package/tests/reward_gate.mjs +284 -0
  1078. package/tests/route_rank_check.mjs +243 -0
  1079. package/tests/route_validation.mjs +490 -0
  1080. package/tests/routine_timers.mjs +72 -0
  1081. package/tests/rubric_fixtures.mjs +140 -0
  1082. package/tests/run_routine.mjs +69 -0
  1083. package/tests/sandbox_stage.mjs +582 -0
  1084. package/tests/scrubber_corpus.mjs +257 -0
  1085. package/tests/search_chunker.mjs +209 -0
  1086. package/tests/search_ingest.mjs +96 -0
  1087. package/tests/search_ingest_db.mjs +88 -0
  1088. package/tests/search_isolation.mjs +204 -0
  1089. package/tests/search_route.mjs +95 -0
  1090. package/tests/secret_box.mjs +189 -0
  1091. package/tests/security_docs.mjs +186 -0
  1092. package/tests/security_route.mjs +108 -0
  1093. package/tests/served_paths_shipped.mjs +118 -0
  1094. package/tests/session-cards.mjs +142 -0
  1095. package/tests/session_506_regression.mjs +69 -0
  1096. package/tests/session_caps.mjs +238 -0
  1097. package/tests/session_cost.mjs +133 -0
  1098. package/tests/session_digest.mjs +73 -0
  1099. package/tests/session_eval.mjs +386 -0
  1100. package/tests/session_index.mjs +105 -0
  1101. package/tests/session_records.mjs +369 -0
  1102. package/tests/session_search.mjs +78 -0
  1103. package/tests/session_start_freshness.mjs +123 -0
  1104. package/tests/setup_smoke.mjs +154 -0
  1105. package/tests/ship_autolinkify.mjs +60 -0
  1106. package/tests/ship_automerge_injection.mjs +174 -0
  1107. package/tests/ship_broadcast_routing.mjs +125 -0
  1108. package/tests/ship_broadcast_server.mjs +175 -0
  1109. package/tests/ship_card.mjs +280 -0
  1110. package/tests/ship_ci_deploy.mjs +374 -0
  1111. package/tests/ship_preflight.mjs +368 -0
  1112. package/tests/ship_premerge.mjs +75 -0
  1113. package/tests/ship_resume.mjs +129 -0
  1114. package/tests/ship_upload_skip.mjs +89 -0
  1115. package/tests/ship_zero_commit.mjs +60 -0
  1116. package/tests/single_host_hall.mjs +98 -0
  1117. package/tests/skill_prefs.mjs +150 -0
  1118. package/tests/smoke_preflight.mjs +66 -0
  1119. package/tests/snapshot_picker.mjs +233 -0
  1120. package/tests/sound_prefs.mjs +198 -0
  1121. package/tests/sprite_facing.mjs +35 -0
  1122. package/tests/status-probe.mjs +89 -0
  1123. package/tests/status_backfill.mjs +94 -0
  1124. package/tests/stop_refcheck.mjs +127 -0
  1125. package/tests/streak.mjs +175 -0
  1126. package/tests/subdomain_auth.mjs +58 -0
  1127. package/tests/task_classifier_vocab.mjs +41 -0
  1128. package/tests/task_create_idempotency.mjs +96 -0
  1129. package/tests/task_goal_link.mjs +93 -0
  1130. package/tests/task_ownership_gate.mjs +125 -0
  1131. package/tests/terrain_picker.mjs +298 -0
  1132. package/tests/touches_overlap.mjs +75 -0
  1133. package/tests/triage_development.mjs +140 -0
  1134. package/tests/turn_in_place.mjs +280 -0
  1135. package/tests/upgrade.mjs +357 -0
  1136. package/tests/verify_task_guard.mjs +64 -0
  1137. package/tests/version_close.mjs +76 -0
  1138. package/tests/versions_route.mjs +93 -0
  1139. package/tests/walkability.mjs +188 -0
  1140. package/tests/wandering_prefs.mjs +176 -0
  1141. package/tests/worktree_disambiguation.mjs +105 -0
  1142. package/tests/worktree_guard.mjs +90 -0
@@ -0,0 +1,65 @@
1
+ # ADR 0087 — Compete with Cursor on governance, not tooling
2
+
3
+ **Status:** Accepted (2026-06-24) · task [#1505](https://example.com/builders#/task/1505) · **companion to** [ADR 0083](<redacted>.md) (modular-architecture strangler build plan); builds on [ADR 0016](<redacted>.md) (server-enforced trust boundary), [ADR 0043](<redacted>.md) (rank floor on permission paths), [ADR 0061](<redacted>.md) (context-layer decomposition), [ADR 0081](<redacted>.md) (tool-agnostic design layer), [ADR 0024](<redacted>.md) (MAS). **Red-teams** [`docs/design/modular-architecture/`](../design/modular-architecture/).
4
+
5
+ ## Context
6
+
7
+ Cursor (Anysphere) is Cloud Bongos's primary competitor. The owner's strategic frame: *"We are moving from collaboration into tooling; Cursor is moving from tooling into collaboration. They have a ~$60B headstart."* This ADR records the decisions that came out of a competitive analysis of Cursor's public domain (a 17-agent research workflow — 7 angles, ~250 web fetches, key claims adversarially re-verified against primary sources) run against our modular-architecture design.
8
+
9
+ **Verified competitor facts (2026-06-24 — fast-moving; re-verify before quoting):**
10
+
11
+ - **$60B is an acquisition price, not a valuation.** SpaceX agreed to acquire Anysphere all-stock at **$60B**, announced **2026-06-16**, pending a Q3-2026 close, folding Cursor under the xAI umbrella. It superseded a ~$50B April-2026 private round.
12
+ - **Scale:** ~$2–4B ARR, ~50,000 enterprise teams, ~64–67% of the Fortune 500, 1M+ daily users.
13
+ - **Their real moat is the usage-data → RL flywheel**, *not* model access (which is commoditized — analysts quote "burning $1 to make 90¢"; Anthropic throttled Cursor's Claude access in June 2025). Composer is RL-post-trained on their own users' coding trajectories atop an open base (Kimi K2.5); they are now training a from-scratch model on SpaceX/xAI compute. Plus enterprise switching costs.
14
+ - **They explicitly framed their own trajectory** as "from individual tool to org-wide platform" (Oct 2025) and shipped the collaboration layer: Organizations, Team Rules, Slack/GitHub/Linear-triggered agents, Bugbot-in-the-PR-loop, SOC2/SSO/SCIM/RBAC/audit/CMEK.
15
+
16
+ **The design under review** ([`docs/design/modular-architecture/`](../design/modular-architecture/), now built as ADR 0083) is sound engineering. But it frames **"scope the agent to a module" as the AI-quality *centerpiece*** ([00 §6](../design/modular-architecture/00-research-report.md)). Cursor ran the opposite experiment and has the data: learned, agent-driven retrieval over the *whole* indexed repo (custom embeddings + Merkle sync + chained semantic/grep) measured **+12.5% answer accuracy vs grep alone**, larger on 1,000+ file repos — and their guidance tells users *not* to pin context manually unless they already know what's relevant. That contradicts the design's framing and forces a correction.
17
+
18
+ ## Decision
19
+
20
+ ### 1. Module-affinity is a *boundary*, not a context-quality lever
21
+
22
+ Module scope answers **where a task's code may land** (ship-time diff⊆module + per-claim worktree). Retrieval answers **what the agent sees**. They are different axes and they *compose* — not compete.
23
+
24
+ - Treat the module as the agent's **default starting context, not a wall.** Adopt Cursor-style agentic retrieval *within and across* it (chain grep + `/recall` + the generated repo-map). This is consistent with our own [03-builder-flows.md](../design/modular-architecture/03-builder-flows.md): read-access is unwalled; only the *ship-time diff* is enforced.
25
+ - **Amends the design docs:** module-affinity is retained as an integrity/confidentiality boundary; its "centerpiece / smaller-context-is-higher-quality" framing is withdrawn.
26
+
27
+ ### 2. Compete on governance, not tooling
28
+
29
+ Do **not** chase parity on the axes where Cursor is structurally ahead — editing UX (Tab, Fast Apply), model quality (Composer), distribution, scale, or capital. **Concede all of them.** Trying to out-tool a $60B incumbent on a $5k budget is the wrong axis of effort.
30
+
31
+ Compete where the **platform-native design is structurally ahead and Cursor is *retrofitting* onto client-trust**:
32
+
33
+ - the **server-enforced rank ladder** (ADR 0016) — authority lives in the DB, re-checked per request; local edits grant zero authority;
34
+ - the **immutable GDS ledger** (every claim → grade → ship is a permanent, attributable record);
35
+ - **per-claim worktree isolation** (treat it as a *trust-boundary control*, not just a parallelism mechanism);
36
+ - **accumulated org memory** (learnings, BFG, per-builder memory/karma).
37
+
38
+ Modularity itself is **not** a moat — it is commodity hygiene (VS Code, Backstage, Fastify all do it). The **trust + governance substrate is the hard-to-copy asset.** When pitching the self-hostable Cloud Bongos product, lead with *"the audit trail, rank governance, and org memory are yours and hard to leave"* — not the AI features, which any competitor can match.
39
+
40
+ ### 3. Harden the trust boundary against Cursor's CVE classes — during the reorg
41
+
42
+ Cursor's 2025 RCE record is the canonical failure mode of putting enforcement on a client the agent controls — CurXecute (CVE-2025-54135, RCE via the agent *creating* `.cursor/mcp.json` because creation wasn't gated like editing), MCPoison (CVE-2025-54136, swapping an already-approved command), a case-sensitivity bypass (CVE-2025-59944), a `.cursorignore` bypass (CVE-2025-64110), and the invisible-Unicode "Rules File Backdoor." Our architecture is designed against this (the DB is king; CLAUDE.md is descriptive-only), but the specific bypasses are subtle. Pre-empt the equivalents:
43
+
44
+ - **Gate file *creation* as strictly as edits** on the permission core, `migrations/`, `infra/`, `.github/workflows/`, `settings.json`, and hook files (a not-yet-existing protected file must not be a creation loophole).
45
+ - **Path matching must be case-insensitive AND Unicode-normalized** so a `settings.JSON` or a homoglyph can't slip past the protected-path glob.
46
+ - **A fitness check** asserting no agent-authored diff touches a permission-core file without a recorded Gate approval (extends the post-push main-audit, ADR 0043).
47
+
48
+ Bake these into the **loader + `fitness.js`** while ADR 0083 Phase 0–1 is already touching them — cheapest possible moment, and it defends the one real moat.
49
+
50
+ ## Alternatives considered
51
+
52
+ - **Out-tool Cursor (chase editing/model/scale parity).** Rejected — we lose on every one of those axes and it spends scarce effort where the headstart is largest.
53
+ - **Keep module-scoping as the AI-quality mechanism.** Rejected on Cursor's A/B evidence; retained as a *boundary* only, with retrieval layered on top.
54
+ - **Defer CVE-hardening to a later security pass.** Rejected — it is cheapest to fold into the reorg that is already rewiring the loader/fitness, and it protects the differentiator.
55
+
56
+ ## Consequences
57
+
58
+ - ADR 0083's build plan proceeds unchanged; only the **framing** of module-scoping in the design docs is amended (boundary, not quality lever).
59
+ - **Follow-on work (cheap-first), to be filed as tasks under BONGOS-V1:** (a) agentic retrieval within the module default (grep + `/recall` + repo-map chaining); (b) the three trust-boundary hardenings above; (c) a four-way rule-attachment taxonomy (always / glob / agent-requested / manual) on nested module docs, kept as plain markdown (Cursor found *structured* nested rules silently break). Further candidates: a tiered autonomy dial (allowlist + sandbox + cheap-Haiku intent classifier), a pre-push grader review + best-of-N, and worktree-as-shadow-workspace in-turn validation.
60
+ - **Strategic messaging** for the self-host/standalone product pivots to governance / audit / org-memory.
61
+ - All competitor numbers are dated **2026-06-24**; Cursor ships weekly — treat ARR/valuation/release facts as perishable and re-verify before reuse.
62
+
63
+ ## Provenance
64
+
65
+ 17-agent workflow · 7 research angles (indexing/retrieval, agent capabilities, the teams/collaboration push, rules & context-scoping, security/trust, business & moat, engineering-blog lessons) · ~250 web fetches · riskiest claims adversarially re-verified against primary sources (cursor.com docs/blog, Turbopuffer, Bloomberg/CNBC/TechCrunch, GHSA advisories). The full dimension-by-dimension scorecard and the ranked "what to learn from Cursor" list live in the session log for this task.
@@ -0,0 +1,169 @@
1
+ # 0088 — Consistent-character generative animation (grade-and-audit, on the family pipeline)
2
+
3
+ - **Status:** Accepted; **amended 2026-06-30** — generation mechanism revised **again** to **Veo image-to-video → keyed transparent sprite** (the owner rejected *both* the per-frame edit-the-hero redraw *and* the 2026-06-27 rig; see the 2026-06-30 Amendment at the end). The grade-and-audit philosophy and the **sprite + manifest output contract** still stand; the *generator* is now a video model, not the family/edit/rig path. (Prior amendment 2026-06-27: edit-the-hero + reference-kit + surgical loop + rigged motion — now itself superseded as the mechanism.)
4
+ - **Date:** 2026-06-26
5
+ - **Deciders:** Lars (Archon), Claude
6
+
7
+ **Builds on:** [ADR 0008](<redacted>.md) (family-based multi-frame generation — the grader/loop we extend), [ADR 0083](<redacted>.md) (modular architecture — this ships as a module), [ADR 0062](<redacted>.md) / [ADR 0081](<redacted>.md) (neutral-contract adapter pattern — the pluggable generator backend), [ADR 0024](<redacted>.md) (grade-before-ship pattern).
8
+
9
+ **Track:** `internal` (a Cloud Bongos platform capability — the art pipeline).
10
+
11
+ ---
12
+
13
+ ## Context
14
+
15
+ We need **animation**: many frames of the *same* character in *different* poses, frame-to-frame consistent. Building the Bongo Buddha mascot widget ([#1523](https://example.com/builders#/task/1523)) we hit the wall that defines this ADR — **generative image models drift between independent generations.** Concretely observed this session:
16
+
17
+ - **Identity/proportion drift** between frames.
18
+ - **Anatomy failures** — a frame with *four hands* when asked to raise both arms.
19
+ - **Spurious auras/rings** the model adds despite "no glow," which the matte keeps.
20
+ - **Size + framing variance** — the same pose drawn at different scales / zoom.
21
+ - **Sparse motion** — a still-image model packs "12 frames" into one sheet as ~6 distinct poses then near-duplicates; it does not understand motion.
22
+
23
+ External practice confirms the cause: plain reference-prompting (what closed Gemini offers) **biases attention but does not lock identity, so it drifts after a few shots**. The gold standard for a recurring character is a trained **LoRA** (85–95% feature retention), but that requires GPU training and an **open** model — not closed Gemini. Automated consistency is a measurable thing (subject embedding similarity, vision-judge, geometric checks).
24
+
25
+ Two empirical wins this session shaped the decision: (1) a **recursive "draw the frame halfway between these two" inbetween** request *does* produce a coherent intermediate pose with Gemini; (2) **the platform already has the right machinery** — the family pipeline.
26
+
27
+ **The key finding:** the existing **family pipeline** ([ADR 0008](<redacted>.md); `art/pipeline/family_*.py` + `art/template/families.json`) is already a consistent-character, multi-frame **grade-and-audit loop**. `family_orchestrator.run_family()` generates N frames of one individual in a single sheet, slices them, runs **cross-frame deterministic coherence** (`family_checks.run_all` — silhouette area/height variance = "same size", palette/luminance coherence = "same look"), then a **Gemini family review** that already scores a **`character_identity`** criterion ("do ALL frames depict the SAME individual?"), and **loops with `t5_anchor_refine`** which re-feeds the strongest prior cell as a locked anchor. Walk cycles (`player_walk`, 6 frames) and a peck cycle (`chickens`) already ship through it. It is tuned for **32×32 pixel-art tiles** (palette-snap, fixed size) — not our full-res painterly mascot — but the *architecture, loop, cost-ledger, regression-guard, and Gemini-review flow* are exactly what we need.
28
+
29
+ The owner's directive (2026-06-26): **don't reinvent the loop — use existing infrastructure and flows; keep the per-frame grader criteria proposed below.** And build it **correctly, as a reusable Cloud Bongos module**, since consistent generative animation is a general platform capability, not a one-off.
30
+
31
+ ---
32
+
33
+ ## Decision
34
+
35
+ **Produce frame-consistent character animation with a `generate → grade → audit → regenerate` loop, implemented by *extending the existing family pipeline* (not building a new grader or loop), with a *pluggable* generator backend. Ship it as a Cloud Bongos module. Use Gemini now; the durable asset is the grader/audit, which is backend-agnostic.**
36
+
37
+ ### 1. Approach: Gemini + grade-and-audit, pluggable backend (option A)
38
+
39
+ Closed Gemini caps raw consistency at "reference-conditioning" (it drifts). We compensate with the **grader/audit loop**: every candidate frame is scored against the character's model sheet, and failures are regenerated with the failure fed back as a fix-hint, escalating only when stuck. The **generator backend is an adapter** (the [ADR 0062](<redacted>.md)/[0081](<redacted>.md) neutral-contract pattern): Gemini today; a future **LoRA-on-open-model** ("level 2") or an **image-to-video** model can slot in *without touching the grader*. LoRA is explicitly **deferred**, not chosen — it needs training infra and an open model; we adopt it only if the Gemini pass-rate proves too low.
40
+
41
+ ### 2. Reuse the family pipeline as the grader + loop
42
+
43
+ The grade-and-audit loop **is** `family_orchestrator.run_family()`. We reuse, verbatim where possible: the attempt loop, `t5_anchor_refine` (lock-the-character-and-re-pose), `family_checks.run_all` (deterministic gate before spending a Gemini call), `family_review.review_family` (the vision grader, including `character_identity`), `cost_ledger` gating, and `regression_detector` (don't overwrite a better existing frame). Animation frames are **family members**.
44
+
45
+ ### 3. A painterly `character_anim` family kind
46
+
47
+ Add a new family `kind` (and `slice_strategy`) for **full-res painterly characters**, configured in `families.json` like any other family. It **drops the pixel-art-specific deterministic checks** (palette-snap to `palette.json`, 32×32 size, anti-grid) which do not apply to painterly art, and **keeps** the size-coherence check (`silhouette_area`/`silhouette_height` variance). Identity, for now, leans on the existing **`character_identity` vision criterion** + perceptual-hash/anchor similarity (`regression_detector` pHash/dHash) + palette/luminance coherence — **no new heavy ML dependency** (the pipeline deliberately avoids even `imagehash`). A learned **embedding** identity scorer (DINOv2/CLIP) is captured as an optional future enhancement, not core.
48
+
49
+ ### 4. Close the genuine gaps: pose-match + transition coherence
50
+
51
+ The existing family checks enforce **sameness** (low variance across the set) and are **order-agnostic** — they would pass a *shuffled* animation. Animation needs the opposite-but-complementary checks:
52
+
53
+ - **`pose_match`** (vision criterion) — does each frame match its *intended* pose? (controlled difference)
54
+ - **transition coherence** (deterministic, order-aware) — is frame *N+1* a plausible small step from frame *N*? (neighbor-delta within a band → catches both jumps *and* dead/duplicate frames)
55
+
56
+ These are the only genuinely new grader criteria; everything else is reuse.
57
+
58
+ ### 5. A recursive inbetween layer (for smoothness)
59
+
60
+ A single sheet reliably yields only ~4–6 *distinct* keyframes. Animation wants ~12–24 drawings (anime/ATLA convention: "on twos" ≈ 12/sec, "on ones" ≈ 24/sec). So: the family pipeline produces the consistent **keyframes**; a new **inbetween step** generates the frames between them by feeding two adjacent (approved) frames and asking Gemini for the midpoint, **recursively halving** to any target count. Each generated inbetween is graded by the same per-frame criteria; failures regenerate. (If/when a video/interpolation backend is plugged in per §1, it replaces this step behind the same contract.)
61
+
62
+ ### 6. Painterly cutout + registration post-process
63
+
64
+ A non-pixel-art post-process: background removal (`rembg`) + warm-fringe despill + magenta/halo cleanup + **registration** (scale to a locked body size, align the seat/anchor) so frames composite over the separately-rendered glow/cloud and never change size. This is distinct from the tile `post_process.process` (which palette-snaps + downscales) and was prototyped this session.
65
+
66
+ ### 7. Package as a Cloud Bongos module
67
+
68
+ Per [ADR 0083](<redacted>.md) + [`docs/modules-contract.md`](../modules-contract.md). **Contract — input:** a character *model sheet* (canonical reference image(s) + identity prose + style + size/anchor spec + per-criterion tolerances) + an *action spec* (key poses + frame budget + fps). **Output:** a graded, consistent, registered frame set + a manifest (frame order, fps, anchors). The rubric/tolerances and the generator backend are **config-driven** so any instance can animate its own characters.
69
+
70
+ ### 8. The grader criteria (owner-approved)
71
+
72
+ Per frame, scored within the reused grader machinery (reusing the existing `pass / retry / escalate_tier` + `fix_hint` verdict shape):
73
+
74
+ | Criterion | Mechanism | Status |
75
+ |---|---|---|
76
+ | Same character | `character_identity` (vision) + pHash/dHash + palette/luminance coherence | **reuse** |
77
+ | Correct anatomy (exactly 2 hands, no malformations) | vision judge | new criterion (reuse machinery) |
78
+ | Right size + framing | `silhouette_area`/`silhouette_height` variance + registration | **reuse** |
79
+ | Clean (no aura/ring/bg-bleed) | alpha/halo analysis + vision | new deterministic + vision |
80
+ | Matches intended pose | vision judge (`pose_match`) | **new** |
81
+ | No flicker / smooth transition | order-aware neighbor-delta | **new** |
82
+
83
+ ---
84
+
85
+ ## Consequences
86
+
87
+ - **Minimal net-new code.** The loop, cost-ledger, anchor-refine, regression-guard, and the `character_identity` grader already exist. Net-new ≈ a painterly family kind, two criteria (`pose_match` + transition), the inbetween layer, and the painterly post-process.
88
+ - **Cheap.** Gemini image gen ≈ $0.04/frame; a full action ≈ <$1 even with retries.
89
+ - **Pluggable + reusable.** The grader is the durable asset; backends swap behind a contract; any Cloud Bongos instance can animate its characters.
90
+ - **Accepted limitation.** Gemini drift means some frames take multiple attempts (cost/time); the audit loop is what makes that acceptable. If the pass-rate is too low, escalate to the deferred LoRA "level 2."
91
+ - **Two deterministic-check sets** to maintain (pixel-art vs painterly) — contained behind the family `kind` dispatch.
92
+ - **No blocking.** The widget ([#1523](https://example.com/builders#/task/1523)) interactions (tickle, scruff-pickup, drop, whale-catch) ship now with the static poses; smooth animation swaps in per-action as this module delivers.
93
+
94
+ ## Alternatives considered
95
+
96
+ - **Per-character LoRA on an open model (B).** Gold-standard consistency, but GPU training infra + off-Gemini. **Deferred** as "level 2" behind the pluggable backend.
97
+ - **Build a new grader + loop.** Rejected — the family pipeline already does it; reuse per the owner's directive.
98
+ - **Image-to-video / interpolation model for motion.** Orthogonal and promising; slots in later as a generator backend replacing the inbetween layer (§5) behind the same contract.
99
+ - **One dense sprite sheet for all frames.** Rejected — empirically caps at ~6 distinct frames then degenerates to near-duplicates (a still model has no motion model).
100
+
101
+ ---
102
+
103
+ ## Implementation — the engineering epic
104
+
105
+ Created as GDS tasks under **BONGOS-V1**, in the **"Cloud Bongos animation module" goal** (goal [#9](https://example.com/builders#/task/9), scope `art-pipeline`) — the platform-version home for this module. Task IDs: 1 = [#1548](https://example.com/builders#/task/1548) (this ADR/scope), 2 = [#1549](https://example.com/builders#/task/1549), 3 = [#1550](https://example.com/builders#/task/1550), 4 = [#1552](https://example.com/builders#/task/1552), 5 = [#1553](https://example.com/builders#/task/1553), 6 = [#1555](https://example.com/builders#/task/1555), 7 = [#1554](https://example.com/builders#/task/1554), 8 = [#1556](https://example.com/builders#/task/1556), 9 = [#1558](https://example.com/builders#/task/1558), 10 = [#1559](https://example.com/builders#/task/1559), 11 = [#1557](https://example.com/builders#/task/1557), 12 = [#1551](https://example.com/builders#/task/1551). Dependencies in parentheses:
106
+
107
+ 1. **(this ADR)** decision + scope — `0088`.
108
+ 2. **Painterly cutout/register post-process** — `rembg` + despill + halo-zap + registration; the non-tile cutout path (productionize this session's prototype).
109
+ 3. **`character_anim` family kind** — `slice_strategy` + `families.json` config + `family_loader`; painterly (no palette-snap/32×32).
110
+ 4. **Painterly cross-frame deterministic checks** — adapt `family_checks.run_all` for the new kind: reuse silhouette-size coherence; add clean-edge/halo; pHash/anchor identity *(dep 3)*.
111
+ 5. **Character vision criteria** — extend `family_review._criteria_for`: reuse `character_identity`; add `anatomy_correct` + `pose_match` *(dep 3)*.
112
+ 6. **Pose-match + transition coherence** — order-aware neighbor-delta deterministic check + the `pose_match` criterion (the genuine gap) *(dep 4, 5)*.
113
+ 7. **Recursive inbetween layer** — keyframes → recursive Gemini midpoints to target count; each graded by the per-frame checks *(dep 2, 3)*.
114
+ 8. **Sequence assembly + manifest** — order, fps (on twos/ones), anchors → sprite set + manifest *(dep 7)*.
115
+ 9. **Package as a Cloud Bongos module** — manifest/seam per [ADR 0083](<redacted>.md); config-driven rubric + pluggable backend *(dep 4, 5, 6, 8)*.
116
+ 10. **First consumer: Bongo Buddha — 8 actions** — produce idle/laugh/yawn/sleep/kick/docile/reach/fall via the module; finish widget [#1523](https://example.com/builders#/task/1523) *(dep 9)*.
117
+ 11. **`character-review` skill** — human wrapper over `run_family` for the painterly path (sibling to `otb-design-review`) *(dep 5)*.
118
+ 12. **(future / spike)** learned-embedding identity scorer (DINOv2/CLIP) — "level 2" if vision-identity + pHash prove insufficient.
119
+
120
+ ---
121
+
122
+ ## Amendment — generation strategy: reference-kit + edit-the-hero + surgical loop + rigged motion (2026-06-27)
123
+
124
+ - **Date:** 2026-06-27 · **Deciders:** Lars (Archon), Claude · **Tasks:** [#1559](https://example.com/builders#/task/1559) (acceptance trial) + [#1622](https://example.com/builders#/task/1622)–[#1626](https://example.com/builders#/task/1626) (this fix). Supersedes the §3/§6 *generation* mechanism only; the grade-and-audit loop, the family pipeline, and the criteria (§4/§8) stand.
125
+
126
+ **What we hit.** Per-frame painterly generation (task [#1616](https://example.com/builders#/task/1616)) fixed the *structural* problem (still-image models ignore an N×M sheet grid — learning `#102`) but the live Bongo Buddha idle still **drifted** frame-to-frame (vision grader `character_identity=2`, `pose_match=1`); the owner rejected it. **Root cause:** each keyframe was drawn *independently from one reference*. A reference biases attention but does **not lock** identity, so every fresh draw reinterprets the character. (HANDOFF: [`docs/handoffs/character-anim-1559/HANDOFF.md`](../handoffs/character-anim-1559/HANDOFF.md).)
127
+
128
+ **The strategy evolution:** single sheet → per-frame → **edit-the-hero from a locked reference kit**, with motion split off to a rig.
129
+
130
+ 1. **Reference kit + a locked hero (the closed-model substitute for a trained character model).** A small, locked model sheet — `brand/cloud-bongos/assets/mascot/kit/` (`kit.json` + hero + component crops) built deterministically by `kit_build.py`. Everything downstream conditions on it. (Owner-approved layer model: the animated frames are **figure + bongos only**; the cloud and the golden glow are **separate static composited layers**, not in the frames.)
131
+ 2. **Edit-the-hero generation.** nano-banana (`gemini-2.5-flash-image`) is fundamentally an **edit** model: editing the locked hero's *pixels* preserves identity far better than redraw-from-reference. Each keyframe is an EDIT of the hero into the target pose, **multi-shot** conditioned on the kit (hero first = edit base; face + bongos crops = detail refs) + the nearest approved neighbour. `family_generator.build_frame_prompt` emits EDIT framing (lock identity / change only pose+expression) using the kit's identity prose. **Result: `character_identity` 2 → 9–10.**
132
+ 3. **Surgical per-frame loop + chaining.** `run_family_painterly` keeps the frames that pass and regenerates **only** the failures, feeding each the grader's **per-frame** complaint (`family_review` now returns `per_frame`); frames chain from the nearest *approved* neighbour so drift can't accumulate; a **plateau early-stop** halts a systemic miss instead of burning attempts.
133
+ 4. **Per-action edit-base (`kit_hero`).** Identity-lock is so strong that editing the *grinning* hero keeps the grin — `pose_match` stayed low because the idle's calm closed-eye expression never appeared. Fix: a **calm-faced hero** (`gen_idle_hero.py`, one edit) that the idle family selects via a `kit_hero` override; action families keep the grinning hero. **Result: expression fixed, total 8.0.**
134
+ 5. **Rigged motion for subtle/repetitive actions (the new fallback, replacing "level 2 = LoRA" as the *first* fallback).** Generative editing locks identity + expression but **cannot calibrate subtle, repetitive idle motion** (the grader read taps as either a dead frame or a "wave"). A **2D puppet rig** (`puppet_rig.py`) animates *one approved hero* by geometric transforms (breath squash/stretch + alternating hand-tap layer moves) — identity perfect by construction, clears the deterministic gate 8/8, **zero per-frame model spend**. **Decision: generative for identity + expression (and expressive one-shots like laugh/fall); rig for simple repetitive motion (idle breathe/tap).** Per action, pick generative vs rigged.
135
+
136
+ **Consequences / guidance.**
137
+ - The durable asset is still the grader/audit; the *generator* is now "edit the locked hero," and **motion may be rigged rather than generated** for simple cycles.
138
+ - **Spend:** identity+expression cost ~$1.64 across the idle trials; the rig is free per frame. Every live run is owner-approved per round (≈$0.04/frame).
139
+ - **Known check limitation (learning):** `transition_no_dead` via coarse dHash can't see sub-perceptual motion (real in pixels, invisible to the hash) — rig amplitudes are tuned above that floor; a pixel-MAD motion signal is a candidate improvement.
140
+ - **Open:** the LoRA "level 2" (§"Alternatives") remains the deferred path *only if* identity ever proves insufficient — edit-the-hero made it unnecessary for now. Remaining [#1559](https://example.com/builders#/task/1559) scope (widget wiring + the other 7 actions, applying generative-or-rig per action) is released to `ready`.
141
+
142
+ ---
143
+
144
+ ## Amendment — generation mechanism: Veo image-to-video → keyed transparent sprite (2026-06-30)
145
+
146
+ - **Date:** 2026-06-30 · **Deciders:** Lars (Archon), Claude · **Task:** [#1559](https://example.com/builders#/task/1559). Supersedes the *generation mechanism* of both the original (§3/§6, per-frame) and the 2026-06-27 amendment (edit-the-hero + rig). **What still stands:** the grade-and-audit philosophy, and the **registered sprite + `manifest.json` output contract** a consumer plays (§7) — unchanged; the widget doesn't care how the frames were made.
147
+
148
+ **What we hit (the owner rejected both prior mechanisms on sight).**
149
+ - **The 2026-06-27 rig** — "the bongos play themselves" (a translated region dragged the drums with the hand) and "the buddha squeezes in and out" (whole-image vertical scale). A rig distorts one flat image; it cannot pose a hand or hold the drums still.
150
+ - **Per-frame edit-the-hero** — identity held (9–10), but in motion the **outline and ears boil** frame-to-frame, because every frame is still an *independent redraw*. A still-image model cannot hold an exact silhouette across frames.
151
+
152
+ **The insight.** A **video model maintains temporal consistency for free** — the one thing neither a rig nor per-frame redraw can give. So use video as the **motion source**, then convert its frames into a transparent sprite we own (which restores interactivity + lets every action share one background).
153
+
154
+ **The method (committed: [`brand/cloud-bongos/anim/`](../../brand/cloud-bongos/anim/README.md)).**
155
+ 1. **Shoot on a PLAIN background** (`shoot.py`) — a flat-grey "green screen" seed from the locked hero → **Veo 3** (`veo-3.0-generate-001`) image-to-video. Veo bakes its background into the clip, so shooting figure-only is what lets rembg key cleanly **and** what keeps all 8 actions on one consistent (our) background. ~$3/clip on the owner's Gemini key.
156
+ 2. **Spritify** (`spritify.py`) — decode → **auto-detect the zoom-free stretch** → pick the latest clean loop → **rembg** key each frame → align on **one union crop** → webp sprite + `manifest.json`.
157
+ 3. **Build the widget** (`build_widget.py`) — composite the transparent sprite on **our** cloud + golden glow; drag / scrub / poke / play. Seed of the full interactive widget ([#1523](https://example.com/builders#/task/1523)).
158
+
159
+ **Gotchas (each cost real iteration on the idle — captured as a learning).**
160
+ - **Veo dollies in** even when told "static camera" → `spritify` auto-trims the zoomed tail by watching the figure's head-to-base height (the zoom was a *sampling* problem, not a registration one).
161
+ - **Use the whole stable stretch, not the first cycle** — the second hand only acts later in the clip, so a short loop reads as "one hand."
162
+ - **Align on ONE fixed crop, never per-frame** — a raised hand fools per-frame centering and slides the body; the body is static, only the hands move.
163
+ - **Veo under-animates calm prompts** → prompt for energetic, clearly two-handed motion; re-roll (~$3) if thin. **This is the method's main cost/reliability tax.**
164
+ - **Motion blur** on fast hands is baked into Veo frames — sharpened, not fully removable (the one cosmetic compromise).
165
+
166
+ **Consequences.**
167
+ - The durable asset is the **keyed sprite + manifest** (contract unchanged); the *generator* is now a video model. The family painterly generator + the puppet rig stay in the repo but are **off the mascot path**.
168
+ - **Spend:** ~$3/action (Veo) + free keying; the idle proof ran **~$6.31** total (2 Veo clips + early image trials).
169
+ - **idle delivered** ([`brand/cloud-bongos/assets/anim/idle/`](../../brand/cloud-bongos/assets/anim/idle/)); blocker [#51](https://example.com/builders#/blocker/51) cleared (spend approved, mascot reviewed, path built). The other 7 actions + the full interactive widget are the follow-up.
@@ -0,0 +1,179 @@
1
+ # 0089 — Modular, multi-model adversarial grader (open-weight ensemble)
2
+
3
+ - **Status:** Accepted (direction decided with the owner 2026-06-26; build is task-pending — see Implementation)
4
+ - **Date:** 2026-06-26
5
+ - **Deciders:** Lars (Archon), Claude
6
+
7
+ **Builds on:** [ADR 0024](<redacted>.md) (the MAS grader — the worker-panel we extend), [ADR 0083](<redacted>.md) (modular architecture — graders register through the module seam), [ADR 0081](<redacted>.md) (one grader parameterized by work-type), [ADR 0088](<redacted>.md) (the first module-owned specialized grader — the `character_anim` family review), [ADR 0062](<redacted>.md) (neutral-contract adapter pattern — applied here to the *model provider*), [ADR 0016](<redacted>.md) / [ADR 0043](<redacted>.md) (server-enforced trust boundary the gate must not weaken), [ADR 0080](<redacted>.md) (an external model result that gates a ship is a content-injection surface).
8
+
9
+ **Track:** `internal` (a Cloud Bongos platform capability — the build pipeline's quality gate).
10
+
11
+ ---
12
+
13
+ ## Context
14
+
15
+ Every shipped task passes a **grader** before it lands: the MAS worker-panel ([ADR 0024](<redacted>.md)) for code (`src/bongos/grader.js` + `src/bongos/grader-workers/`), the Gemini vision review for pixel-art ([ADR 0008](<redacted>.md); `art/pipeline/family_review.py`), and now a module-specific review for animation ([ADR 0088](<redacted>.md)). The gate works and is the backbone of letting AI agents ship unattended. But four limits are now in the way:
16
+
17
+ 1. **The grader is single-vendor.** Both the code panel and the vision review run on a model from the same lab that *built* the work (Claude grades Claude; Gemini grades Gemini-generated art). Today's only mitigation is *cross-family within Anthropic* — Opus author → Sonnet grader (`selectGraderModel`, `src/bongos/grader.js`). The research below shows that an author and a judge from the **same family share correlated blind spots** and the judge **inflates its own family's work by 10–25%**. An independent reviewer from a *different* lineage is the single highest-leverage quality lever we have.
18
+
19
+ 2. **All grading spend rides the Claude bill.** Every worker in the panel is an Opus/Sonnet call. Grading is *additive* to the build spend (the builder already paid Claude to write the code; we pay Claude again to grade it). On a bootstrapped <$5K/yr budget that doubling is real, and it's the wrong place to spend — review is a verification task a cheaper independent model can do well.
20
+
21
+ 3. **There is no clean way for a module to own its grader.** [ADR 0088](<redacted>.md) added an animation grader by *extending the art pipeline in place*; the DINOv2 identity scorer is wired as a Python-only `families.json` flag. Each new work-type bolts its grader on by hand. [ADR 0081](<redacted>.md) already called for "one grader parameterized by type," and [ADR 0083](<redacted>.md) gives us the mechanism (the module seam) — but nothing yet routes grading through it. The owner asked the right question directly: *should a work-type's grader live in that module, or in a general grader module?*
22
+
23
+ 4. **The grader is hard-wired to two work-types (code, vision).** A third (`ui`, [ADR 0081](<redacted>.md)) and a fourth (animation, [ADR 0088](<redacted>.md)) are arriving. A new module (say, audio, or 3D) has no path to grading at all.
24
+
25
+ ### What the research says (mid-2026)
26
+
27
+ A thorough literature + market sweep this session (sources at the foot of this ADR) produced findings that shape every decision below:
28
+
29
+ - **Self-preference is real and large.** GPT-4 inflates its own win rate ~10%, Claude-v1 ~25%; the effect is causally tied to a model *recognizing its own outputs* (Zheng 2023; Panickssery 2024). **Use a judge from a different family than the author** — the core argument for open-weight adversaries.
30
+ - **A small diverse jury beats one big judge, and is cheaper** (PoLL, Verga 2024: 3 small judges, >7× cheaper, higher human-correlation than a single GPT-4). **But** the 2026 counter-finding matters: *"Nine Judges, Two Effective Votes"* shows panels buy far less independence than their size implies (9 judges ≈ 2 effective votes; returns saturate by ~5), and **family-diversity alone does not guarantee uncorrelated errors** — you must *audit* error-correlation, and aggregation cannot rescue a correlated panel. So: **a small (2–3), deliberately heterogeneous panel, audited for low error-correlation — not a big one.**
31
+ - **Aggregating heterogeneous judges needs normalization.** Naively averaging judges on different scales lets a harsh or score-compressed judge silently dominate; **z-score or rank-normalize before combining**, and prefer median / reliability-weighting over naive mean (LLMs-as-Judges survey 2024).
32
+ - **Adversarial "find the flaw" framing beats holistic scoring.** Judges prompted to *refute* (and debate setups) surface flaws a rubber-stamp misses (Khan 2024). Our existing default-fail worker prompts already lean this way — we keep and extend it.
33
+ - **Binary pass/fail + a forced written critique beats 1–5 Likert.** Judges can't reliably tell a 3 from a 4; scores cluster at 6–7. Our panel already uses a 6.0 threshold + per-worker verdicts — consistent with best practice.
34
+ - **Open-weight models are now genuinely good critics.** For code: DeepSeek V3.2/V4 (MIT), Qwen3-Coder (Apache-2.0), GLM-4.6/5 (MIT) score 70–80%+ on SWE-bench Verified; purpose-built judges (Atla Selene, Prometheus 2) are trained specifically for rubric scoring. For vision: Qwen2.5-VL / Qwen3-VL and InternVL3.5 (Apache/MIT) have native-resolution encoders (the key feature for reading small sprites) and rival closed VLMs on MMMU/OCRBench. *Caveat:* several headline 2026 numbers are vendor-reported; treat them as provisional and pin/evaluate the exact checkpoint we adopt.
35
+ - **Hosting math is decisive.** A few-thousand-grades/month workload costs **~$1–5/mo** on a pay-per-call API (DeepInfra is consistently cheapest; e.g. Llama-class 70B ≈ $0.10/$0.32 per 1M tokens; DeepSeek/Qwen comparable, with near-free prompt-caching on the fixed rubric). Self-hosting a GPU is **~$200+/mo idle** and never breaks even at our volume. The grader prompt is mostly a *fixed rubric* sent every call — **cheap cached input crushes the bill.**
36
+ - **Off-the-shelf frameworks exist but don't fit.** `promptfoo` is the closest (MIT, Node-native, built-in panel voting, vision, points at any open endpoint) — but it was acquired by OpenAI in March 2026, and we already have a sophisticated worker-panel grader of exactly this shape. We **extend our own**, borrowing `promptfoo`'s patterns, rather than adopt a vendor-owned framework against an AGPL/non-profit posture ([ADR 0065](<redacted>.md)).
37
+
38
+ ### Owner decisions (2026-06-26)
39
+
40
+ Three forks were put to the owner; all three are settled and are the spine of this ADR:
41
+
42
+ 1. **Grader placement:** a **central grading engine** in core; **each module plugs in its own grader** (rubric + critic + evidence-gatherer) through the existing module seam. *Not* a full grader re-implemented per module.
43
+ 2. **Open-model role:** **ensemble vote** — Claude + one or two open-weight models from different families grade independently and their verdicts combine. *Not* replace-Claude, *not* cascade.
44
+ 3. **How to run it:** **hosted open-model API** (pay-per-call, e.g. DeepInfra or OpenRouter). *Not* self-hosted GPU, *not* free-tiers-only.
45
+
46
+ ---
47
+
48
+ ## Decision
49
+
50
+ **Refactor the grader into a central, work-type-parameterized engine that runs an adversarial ensemble of judges drawn from different model families — Claude plus hosted open-weight models — where each module contributes the rubric, critic, and evidence-gatherer for its own work-type through the module seam. Verdicts from heterogeneous judges are normalized and aggregated with a median-plus-hard-veto policy; the panel is kept small and audited for error-independence; deterministic pre-passes remain the authoritative, zero-LLM security gate.**
51
+
52
+ ### 1. A central grading engine; module-contributed graders (placement — owner decision 1)
53
+
54
+ The **engine lives in core** (`src/bongos/grader.js`, generalized). It owns the invariant loop, which is identical for every work-type:
55
+
56
+ ```
57
+ select work-type grader → gather evidence → run deterministic pre-passes (zero-LLM, authoritative)
58
+ → run the judge ensemble (each judge scores independently, adversarial posture)
59
+ → normalize + aggregate verdicts → apply the gate (median + hard-veto)
60
+ → persist grade + per-judge signals + cost → promote / fall-through
61
+ ```
62
+
63
+ A **module contributes only the three things that are specific to its work-type**, registered through the seam (`api.seams.registerProvider`, [ADR 0083](<redacted>.md)):
64
+
65
+ - a **rubric** — the named criteria + thresholds for this work-type (the data the art pipeline keeps in `rubric.json`, the code panel in `grader-rubric.json`);
66
+ - an **evidence-gatherer** — what the judges see (a git diff for code; a rendered screenshot for `ui`; a sliced frame-set + model sheet for animation);
67
+ - optional **specialized critics** — deterministic checks (palette-snap, transition-coherence, DINOv2 identity) or a custom LLM worker, when the generic rubric judge isn't enough.
68
+
69
+ So the answer to the owner's question — *"under each module, or in a general grader module?"* — is **both, split by concern**: the **orchestration, ensemble, aggregation, gate, persistence, and security pre-passes are central** (write once, consistent everywhere); the **rubric + evidence + specialist critics are module-owned** (the part that genuinely differs). Enable the animation module → its `character_anim` grader is automatically available; disable it → the engine simply has one fewer registered work-type. This is exactly the seam [ADR 0088](<redacted>.md)'s grader and the DINOv2 scorer already want; we are formalizing it as `grader.workType.<key>` providers rather than hand-wiring.
70
+
71
+ A **grader registry** in core resolves `task.kind` / `discipline` → the registered work-type grader (falling back to the code grader), mirroring the dispatch the art pipeline already does on family `kind`. There is no separate "general grader module" — the generic machinery *is* the core engine; modules register against it.
72
+
73
+ ### 2. An adversarial multi-model ensemble (owner decision 2)
74
+
75
+ A grade runs a **small panel of independent judges from different model families**, each given the **same rubric and evidence** and an **adversarial "find what's wrong; default to fail if unsure" posture** (extending today's default-fail worker prompts). The panel composition is **config-driven per work-type**, with a default of:
76
+
77
+ - **Claude** (the incumbent quality bar — kept, never the sole judge).
78
+ - **One or two open-weight models from a *different lineage*** — e.g. for code, a DeepSeek (MIT) or Qwen3-Coder (Apache) judge; for vision, a Qwen-VL / InternVL judge independent of Gemini.
79
+
80
+ Crucially (per the *"Nine Judges"* finding): **the panel is small (2–3 judges) and its members are chosen and *audited* to fail differently** — not maximally large, and not "different vendor" assumed-independent. We add an **error-correlation audit** (§5) so the panel composition is evidence-based, not faith-based.
81
+
82
+ This generalizes the existing worker panel two ways: the four *lenses* (narc / quality / hacker / efficiency) become *rubric criteria* a judge scores, and the *judges* become a cross-family set. A judge may still be lens-specialized where it pays (e.g. keep a dedicated security worker), but the default is "N cross-family judges over one rubric."
83
+
84
+ ### 3. The model provider is an adapter; run open models via a hosted API (owner decision 3)
85
+
86
+ Following the [ADR 0062](<redacted>.md)/[ADR 0081](<redacted>.md) neutral-contract pattern, **how a judge's model is called is an adapter behind a `ModelProvider` port**, not hard-coded. `selectGraderModel()` (today a Claude-only `if/else` in `src/bongos/grader.js`) is replaced by a small provider registry:
87
+
88
+ - **`anthropic`** — the existing Claude path (Anthropic API).
89
+ - **`openai-compatible`** — a single adapter that speaks the OpenAI chat-completions shape, which covers **DeepInfra, OpenRouter, Together, Fireworks, Groq, vLLM, and Ollama** by base-URL + key alone. This is the open-weight path.
90
+
91
+ Default open-model transport: a **hosted pay-per-call API (DeepInfra or OpenRouter)** — no box to run, ~$1–5/mo at our volume (§Cost). The same adapter could point at a self-hosted endpoint later without code change, but self-hosting is explicitly *not* adopted now. **Model choice, provider, base-URL, and panel composition are instance config** (the [ADR 0062](<redacted>.md) host-owned pattern), so any Cloud Bongos instance picks its own judges; this also pre-positions for GDS-V4's per-builder model preferences ([idea #30](https://example.com/builders#/idea/30)).
92
+
93
+ The open-model key is a new secret (BYOK, like the Gemini art key — [ADR 0073](<redacted>.md)). **Requires the owner's spend go-ahead** before any live call (CLAUDE.md §4).
94
+
95
+ ### 4. Aggregating heterogeneous judges: normalize, then median-plus-hard-veto
96
+
97
+ Judges on different scales cannot be naively averaged (a harsh or score-compressed judge would silently dominate). The engine:
98
+
99
+ 1. **Normalizes** each judge's per-criterion scores before combining — **z-score or rank-normalize** against that judge's own observed distribution (research finding F42–F44).
100
+ 2. **Aggregates** with **median** of normalized scores (robust to one outlier judge) for the soft score, and a **hard veto** for safety-critical findings: *any* judge raising a critical/blocker finding fails the gate — preserving today's any-fail-vetoes behavior for the things that must never slip (security, completion). This keeps the gate *strict* (a single credible "this is broken" stops a ship) while making the *soft* score robust.
101
+ 3. **Position/order mitigations** are applied where a judge compares options (randomize criterion order; for any pairwise step, run both orders and average).
102
+
103
+ The exact policy (veto thresholds, weights, whether to reliability-weight a judge down after it proves unreliable) is **config in the rubric**, so it tunes per work-type without code change.
104
+
105
+ ### 5. Error-correlation auditing (the panel must fail *differently*)
106
+
107
+ Because aggregation cannot manufacture independence the panel doesn't have, we **measure it**. A periodic offline job (a new scheduled routine) replays a labeled set of past grades through each candidate judge and computes **pairwise error-correlation + per-judge Cohen's κ against the human/owner ground truth** (the confirm/reject decisions already in `grade_attempts` + owner overrides). Output: which judges add real independent signal, which are redundant, which are miscalibrated. **Panel composition is chosen from this evidence**, not assumed. This is the structural answer to *"Nine Judges, Two Effective Votes."*
108
+
109
+ ### 6. Deterministic pre-passes stay authoritative and zero-LLM (security)
110
+
111
+ The two deterministic server-side guards — route-rank ([ADR 0016](<redacted>.md)) and permission-path ([ADR 0043](<redacted>.md)) — **remain exactly as they are**: zero-LLM, server-re-run on authoritative data, downgrade-only. **No LLM verdict — Claude or open — can ever upgrade a deterministic fail to pass.** The ensemble grades *quality*; the deterministic gate enforces the *trust boundary*. An external model's verdict that gates a ship is a content-injection surface ([ADR 0080](<redacted>.md)): so open-model verdicts are (a) advisory-plus-veto only, never sole authority over a protected path; (b) logged with model id + provider + raw response in `signals` for audit; (c) subject to the same server-side re-verification envelope as the Claude panel. For pixel-exact properties (palette, grid, dimensions) the **deterministic checks remain the authority** — VLMs are documented to misread fine detail; the vision judge is for aesthetic/semantic critique only ([ADR 0088](<redacted>.md) already draws this line).
112
+
113
+ ### 7. Reuse, don't rebuild
114
+
115
+ The worker-contract (`buildPrompt` / `extractJson` / `computeVerdict`), the `runWorker` parallel runner, the `task_grades` + `grade_attempts` schema, the trivial-diff fast-path, and the server-side guard envelope are **kept**. This ADR generalizes their *inputs* (which model, which rubric, which evidence) — it does not throw them away. The content-addressed LLM cache ([ADR 0077](<redacted>.md)) applies unchanged and now memoizes open-model calls too.
116
+
117
+ ---
118
+
119
+ ## Consequences
120
+
121
+ **Positive**
122
+
123
+ - **Genuinely independent review.** A different-lineage judge removes the self-preference inflation (10–25%) that same-family grading can't — the owner's primary goal.
124
+ - **Cheaper, better-placed spend.** Open judges at ~pennies/grade move verification off the Claude bill; caching the fixed rubric makes it nearly free. Net grading cost likely *drops* while robustness *rises*.
125
+ - **A clean module story.** New work-types (audio, 3D, copy) register a rubric + evidence + critic and get the full ensemble gate for free. Animation/UI/DINOv2 stop being hand-wired special cases.
126
+ - **Vendor-independent and portable.** The `ModelProvider` + per-instance config means no lock-in; any instance picks its own judges; aligns with the AGPL/non-profit posture.
127
+ - **Evidence-based panel.** The error-correlation audit keeps the jury honest instead of assuming diversity.
128
+
129
+ **Negative / risks**
130
+
131
+ - **More moving parts.** A model registry, an aggregation layer, and a new provider are net new surface. Mitigated by reusing the existing panel machinery and shipping behind a flag.
132
+ - **Open-model reliability + drift.** Hosted endpoints can rate-limit, deprecate a model, or change behavior; vendor benchmark numbers are provisional. Mitigated by: Claude always in the panel (a hard floor on quality), the error-correlation audit catching a judge that degrades, and graceful-degrade (an unreachable open judge drops to a logged note, never a false pass).
133
+ - **A new external trust surface.** An open-model verdict influences shipping. Bounded by §6 (advisory+veto, never sole authority over protected paths; deterministic gate unchanged; full logging).
134
+ - **Calibration work.** Heterogeneous normalization + thresholds need tuning against the labeled set before the open judges get vote weight. Mitigated by rolling out **advisory-only first** (open judges grade and log, but don't yet gate), then promoting to voting once the audit shows they agree with the owner.
135
+
136
+ ---
137
+
138
+ ## Alternatives considered
139
+
140
+ - **Replace Claude with open models entirely** (cheapest). Rejected by the owner — loses Claude's review quality and leans wholly on provisional open-model numbers. Claude stays as the quality floor.
141
+ - **Cascade (cheap open model first, Claude only on disagreement).** Rejected by the owner for the default — more moving parts and harder-to-predict behavior than a flat small ensemble. (It remains a possible *future* cost optimization behind the same provider abstraction.)
142
+ - **Self-host the open models on a GPU box.** Rejected — ~$200+/mo idle, never breaks even at our volume; competes with the game server. The adapter leaves the door open if privacy ever demands it.
143
+ - **Adopt `promptfoo` (or another framework) wholesale.** Rejected — we already have a worker-panel grader of this exact shape; `promptfoo` is now OpenAI-owned, against our governance posture. We borrow its patterns (panel voting, open-endpoint judges) and extend our own.
144
+ - **A separate top-level "grader module."** Rejected — it would either re-implement the core loop (duplication) or *be* the core loop (then it's just core). The split in §1 (central engine + module-contributed rubric/evidence/critic) is cleaner and matches [ADR 0083](<redacted>.md).
145
+ - **A big jury (5–9 judges) for maximum robustness.** Rejected on the *"Nine Judges"* evidence — returns saturate by ~5 and correlated errors gut large panels; a small audited panel is both cheaper and more honest.
146
+
147
+ ---
148
+
149
+ ## Cost analysis
150
+
151
+ Grading volume is roughly one panel per shipped task. At a few thousand grades/month, with each grade ~3K input (mostly the fixed, cacheable rubric) + ~1K output per open judge:
152
+
153
+ - **DeepInfra**, Llama/Qwen/DeepSeek-class judge: ≈ $0.0006/call → **~$1–3/mo** for the open-judge leg, with prompt-caching driving input cost toward zero.
154
+ - **Claude leg** is the existing spend (unchanged, or *reduced* if some lenses move to the cheaper open judge).
155
+ - **Self-host** would be **~$200+/mo** — rejected.
156
+
157
+ Net: the new capability is **additive single-digit dollars/month**, well inside the budget, and likely net-neutral-to-negative on total grading spend once open judges absorb load Claude carries today. One new secret (open-model API key); owner spend approval required before the first live call.
158
+
159
+ ---
160
+
161
+ ## Implementation (task-pending)
162
+
163
+ A build cluster under GDS-V4 (or its successor), staged so nothing destabilizes the live gate:
164
+
165
+ 1. **`ModelProvider` port + `openai-compatible` adapter** — generalize `selectGraderModel`; add provider registry + per-instance config; BYOK open-model key. (No behavior change; Claude still the only judge.)
166
+ 2. **Heterogeneous aggregation layer** — z-score/rank normalization + median + hard-veto, config-driven in the rubric. (Still Claude-only; proves the math.)
167
+ 3. **Grader registry + work-type seam** — `grader.workType.<key>` providers; route `task.kind` → rubric + evidence-gatherer + critics; migrate the code panel, the art/vision review ([ADR 0008](<redacted>.md)/[ADR 0088](<redacted>.md)), and the `ui` path ([ADR 0081](<redacted>.md)) onto it.
168
+ 4. **Add the first open judge — advisory only** — it grades and logs to `signals`, but does not gate. Pick the checkpoint by live evaluation, not vendor numbers.
169
+ 5. **Error-correlation audit routine** — replay labeled grades; report κ + pairwise error-correlation; choose panel composition.
170
+ 6. **Promote open judges to voting** — once the audit shows agreement with owner decisions; tune veto thresholds.
171
+ 7. **Vision ensemble** — add an open VLM (Qwen-VL / InternVL) as an independent second opinion to Gemini for art/animation, deterministic checks still authoritative.
172
+
173
+ Roll out behind a flag (the [ADR 0079](<redacted>.md) "build disabled, arm later" pattern); the deterministic security gate is never flagged off.
174
+
175
+ ---
176
+
177
+ ## Sources
178
+
179
+ Open-weight code models & licenses: DeepSeek V3.2/V4 (MIT, ~70–80% SWE-bench), Qwen3-Coder-Next (Apache-2.0), GLM-4.6/5 (MIT), Devstral Small 2 (Apache-2.0), purpose-built judges Atla Selene 1 / Prometheus 2 — HF model cards, mistral.ai, swebench.com, livecodebench.github.io. Hosting/pricing: deepinfra.com/pricing, openrouter.ai/pricing, together.ai/pricing, api-docs.deepseek.com (cached-input ~98% off); self-host break-even via runpod.io/pricing. LLM-as-judge: Zheng 2023 (arXiv 2306.05685), Wang 2023 position bias (2305.17926), Panickssery 2024 self-recognition (2404.13076), G-Eval (2303.16634), PoLL/Verga 2024 (2404.18796), *Nine Judges, Two Effective Votes* 2026 (2605.29800), LLMs-as-Judges survey (2412.05579), Khan 2024 debate (2402.06782), Hamel Husain (hamel.dev/blog/posts/llm-judge). Open VLMs: Qwen2.5-VL/Qwen3-VL (Apache), InternVL3.5 (Apache/MIT, ~77.7% MMMU), Pixtral (Apache) — native-resolution encoders the key feature for small sprites; VLM-judges rank better than they score (Multimodal RewardBench ~70–76% ceiling). Frameworks: promptfoo (MIT, OpenAI-acquired 03/2026), Opik (Apache), Inspect AI (MIT) — none fit better than extending our own panel.
@@ -0,0 +1,73 @@
1
+ # 0090 — Metic gains task authoring: create / promote / edit + dependency & criteria shaping
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-26
5
+ - **Deciders:** Lars (Archon), Claude
6
+
7
+ **Builds on / amends:** [ADR 0016](<redacted>.md) (server-enforced rank boundary — unchanged), [ADR 0018](<redacted>.md) (three-rank model — this ADR re-ranks one row of its table), [ADR 0034](<redacted>.md) (Thetes graduated-newcomer rank), [ADR 0086](<redacted>.md) (goal-scoped work hierarchy — the safer, scope-bounded path this ADR sits beside).
8
+
9
+ **Track:** `internal` (GDS / methodology — a Cloud Bongos platform capability).
10
+
11
+ ---
12
+
13
+ ## Context
14
+
15
+ Under the three-rank model ([ADR 0018](<redacted>.md)), **task authoring was Archon-only**: `POST /tasks`, `PATCH /tasks/:id`, `POST /tasks/:id/promote`, and the task↔dependency / task↔criterion CRUD all carried `requireRank('archon')`. A Metic — the Archon-approved *working* rank — could already do the higher-trust judgment work of **idea triage** (`PATCH /inbox/:id`), **blocker review**, and **planning/priority sessions**, but could not turn the ideas they triaged into the tasks those ideas became. They had to hand each one back to the Archon to author.
16
+
17
+ That is an incoherent trust line. A rank trusted to decide *which ideas become work* (triage) but not trusted to *write the work down* (author a task) creates a bottleneck precisely at the Archon, for no security gain — the Metic already directs the plan; they just can't record it.
18
+
19
+ Lars's directive (2026-06-26): **"If a Metic can run idea triage, they should be able to seed tasks."** Allow Metics to create, promote, and edit tasks now; setting rank and closing versions stay Archon. Explicitly: *"we can tighten up security later."*
20
+
21
+ This is deliberately broader and simpler than [ADR 0086](<redacted>.md), which solves the *lower-rank* (xenos/thetes) version of the same problem with a tightly scoped, module-bounded `POST /goals/:id/tasks` grant. ADR 0086's careful scope-subset wall is the right tool for letting an *untrusted* builder author within a fence; for the *trusted* Metic, the owner chose the blunt grant: full task authoring, no fence.
22
+
23
+ ## Decision
24
+
25
+ Re-rank these `src/bongos/routes/tasks.js` gates from `requireRank('archon')` to `requireRank('metic', 'archon')`:
26
+
27
+ | Route | Was | Now |
28
+ |---|---|---|
29
+ | `POST /tasks` (create) | archon | **metic+** |
30
+ | `PATCH /tasks/:id` (edit, incl. `newcomer_friendly`) | archon | **metic+** |
31
+ | `POST /tasks/:id/promote` (backlog→ready) | archon | **metic+** |
32
+ | `POST /tasks/:id/dependencies` (add edge) | archon | **metic+** |
33
+ | `DELETE /tasks/:id/dependencies/:depId` | archon | **metic+** |
34
+ | `PUT /tasks/:id/dependencies` (replace set) | archon | **metic+** |
35
+ | `POST /tasks/:id/criteria` (link criterion) | archon | **metic+** |
36
+ | `DELETE /tasks/:id/criteria/:criterionId` | archon | **metic+** |
37
+
38
+ The dependency + criteria CRUD move alongside create/edit so a Metic can fully **shape** a task they author — without them, a Metic could mint a task but not order it (deps gate claiming) or make it count toward a version (`/status` rolls up via criterion links). "Full task shaping" was Lars's chosen scope when offered create/edit/promote-only vs. the broader set.
39
+
40
+ `requireRank('metic', 'archon')` uses the existing threshold semantics ([#591](https://example.com/builders#/task/591)): the floor is `metic`, so `metic`, `archon`, and the divine tiers above pass; `thetes`/`xenos` and everything below the floor are denied (fail-closed). Thetes/Xenos still author nothing directly — they file ideas, and (per ADR 0086) may author goal-scoped tasks only within a module fence.
41
+
42
+ ### Two `PATCH /tasks/:id` fields are security controls, not planning fields
43
+
44
+ Opening `PATCH /tasks/:id` to Metic also exposes two fields that were previously gated *only* by the route being Archon-only — neither had a field-level check. We split them by what they actually are:
45
+
46
+ - **`requires_rank`** stays open to Metic. `db.updateTaskRequiresRank` clamps the value **up** to the auto-derived floor ([ADR 0084](<redacted>.md)), so a Metic can only *raise* who may claim a task — never open a sensitive task to a lower rank. Raising a claim floor grants the Metic nothing; it is genuine task-shaping ("this needs a higher rank").
47
+ - **`security_sensitive`** stays **Archon-only**, enforced by a new in-handler `rankMeetsThreshold(rank, ['archon'])` check in the PATCH handler. It is a security control, not a planning field: it suppresses the ship→Discord broadcast (routes it to the Archon-only `#security-ship-feed`, task 990) and feeds the auto-derived rank floor. Letting a Metic flip an existing task to `security_sensitive: false` would lower a flag-only-sensitive task's floor and un-suppress its broadcast — a weakening of an existing control, outside "author/shape a task." Setting it at **create** time (`POST /tasks`) is left open to Metic: a brand-new task has no existing sensitivity to clear, and setting the flag *on* only ratchets restriction up.
48
+
49
+ ### What stays Archon-only
50
+
51
+ - **Setting rank** (`PATCH /builders/:id/rank`) and **closing versions** — the two authorities Lars named as never-delegated.
52
+ - `POST /tasks/:id/abandon` (terminal scope removal — the inverse of promote; a destructive lifecycle kill).
53
+ - `POST /tasks/:id/confirm` (grader-bypass — must not let a builder push their own work past a failed grade — [#231](https://example.com/builders#/task/231)).
54
+ - The **cross-tier polymorphic** `POST|DELETE /dependencies` and goal-scope edges ([ADR 0086](<redacted>.md) §5) — reshaping `{task,goal,criterion}` order across shared workspaces is a wider blast radius than wiring one task's own deps, and stays pinned Archon.
55
+ - `POST /versions`, peer-vote tally, override-request adjudication, newcomer-restock.
56
+
57
+ ### Downgrade protection
58
+
59
+ `POST /tasks` and `POST /tasks/:id/promote` are pinned in `EXPECTED_RANKS` (`src/bongos/route-rank-check.js`); both pins move to `metic+archon` in lockstep. A *silent further downgrade* (e.g. to any-builder) on either remains a hard CI fail. The route's `// rank:` annotation is updated to match the middleware, keeping the route-rank audit (`tests/route_rank_check.mjs`, the `unit` gate's fitness check) green.
60
+
61
+ ## Consequences
62
+
63
+ - **Metics can now run the full triage→author loop** — promote an idea to a task and shape it — without the Archon. The delegation bottleneck at the owner is removed for the trusted working rank.
64
+ - **Larger trusted surface.** A Metic is now a `requireRank('metic')` away from authoring any task in any open version (subject to the per-task `requires_rank` floor on *claiming*, [ADR 0084](<redacted>.md), which is unaffected). This is the "tighten later" debt Lars accepted: there is no per-version, per-module, or per-goal fence on a Metic's authoring the way ADR 0086 fences a lower rank. A future ADR can narrow this (e.g. fold Metic authoring into the goal-scope model) without re-litigating the principle.
65
+ - **ADR 0018's table changes.** Its row *"Create / promote / edit tasks, deps, confirm, done-when scope — Metic ❌ / Archon ✅"* is now split: create/promote/edit/deps are ✅ for Metic; confirm and version-scope stay ❌. The ADR 0018 file is annotated with a pointer here rather than rewritten (ADRs are append-only history).
66
+ - **ADR 0086 still stands** for xenos/thetes — its module-scoped `POST /goals/:id/tasks` grant is the only authoring path for sub-Metic ranks, and its scope-subset + protected-path walls are untouched. This ADR only widens the *Metic* line.
67
+ - **Trust boundary intact** ([ADR 0016](<redacted>.md)): enforcement is still server-side, per-request, no cache. Editing a doc or `CLAUDE.md` grants nothing; the route's `requireRank('metic','archon')` is the authority.
68
+
69
+ ## Alternatives considered
70
+
71
+ - **Create/edit/promote only, leave deps + criteria Archon.** Rejected (Lars chose full shaping): a Metic who can create a task but not wire its dependencies or criterion links produces half-formed tasks the Archon must finish — re-introducing the bottleneck one level down.
72
+ - **Use the ADR 0086 goal-scoped path for Metics too.** Sound, and the likely "tighten later" destination, but heavier than the owner wanted now: it requires a goal to exist and a module scope to be set before a Metic can author. Lars opted for the direct grant and explicit deferral.
73
+ - **Promote the relevant builders to Archon instead.** Rejected: Archon also carries rank-setting, version-close, grader-bypass, and infra — far more than "author tasks." The whole point of Metic is breadth-of-work without those keys.