@bongos/core 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.bongos-core.json +5727 -0
- package/.claude/skills/blocker-review/SKILL.md +91 -0
- package/.claude/skills/blocker-solve/SKILL.md +96 -0
- package/.claude/skills/builder-backup/SKILL.md +54 -0
- package/.claude/skills/builder-box/SKILL.md +45 -0
- package/.claude/skills/builder-claim/SKILL.md +76 -0
- package/.claude/skills/builder-connect/SKILL.md +59 -0
- package/.claude/skills/builder-cost/SKILL.md +47 -0
- package/.claude/skills/builder-end/SKILL.md +81 -0
- package/.claude/skills/builder-exit/SKILL.md +88 -0
- package/.claude/skills/builder-key/SKILL.md +40 -0
- package/.claude/skills/builder-reauth/SKILL.md +50 -0
- package/.claude/skills/builder-redteam/SKILL.md +109 -0
- package/.claude/skills/builder-release/SKILL.md +41 -0
- package/.claude/skills/builder-setup/SKILL.md +62 -0
- package/.claude/skills/builder-ship/SKILL.md +79 -0
- package/.claude/skills/builder-stage/SKILL.md +51 -0
- package/.claude/skills/builder-start/SKILL.md +46 -0
- package/.claude/skills/close-box/SKILL.md +43 -0
- package/.claude/skills/design-sync/SKILL.md +69 -0
- package/.claude/skills/dev/SKILL.md +49 -0
- package/.claude/skills/feedback/SKILL.md +32 -0
- package/.claude/skills/figma-design-sync/SKILL.md +74 -0
- package/.claude/skills/goal-review/SKILL.md +89 -0
- package/.claude/skills/idea-triage/SKILL.md +144 -0
- package/.claude/skills/ideate/SKILL.md +82 -0
- package/.claude/skills/merge-mode/SKILL.md +169 -0
- package/.claude/skills/new-project/SKILL.md +108 -0
- package/.claude/skills/otb-character-review/SKILL.md +71 -0
- package/.claude/skills/otb-design-review/SKILL.md +47 -0
- package/.claude/skills/otb-feedback-capture/SKILL.md +45 -0
- package/.claude/skills/otb-figma-sync/SKILL.md +54 -0
- package/.claude/skills/otb-tile-generate/SKILL.md +45 -0
- package/.claude/skills/paint/SKILL.md +70 -0
- package/.claude/skills/planning-session/SKILL.md +299 -0
- package/.claude/skills/priority-session/SKILL.md +134 -0
- package/.claude/skills/read-session-export/SKILL.md +58 -0
- package/.claude/skills/recall/SKILL.md +52 -0
- package/.claude/skills/session-handoff/SKILL.md +46 -0
- package/.claude/skills/status/SKILL.md +33 -0
- package/.devcontainer/Dockerfile +69 -0
- package/.devcontainer/README.md +73 -0
- package/.devcontainer/devcontainer-lock.json +19 -0
- package/.devcontainer/devcontainer.json +93 -0
- package/.devcontainer/healthcheck.sh +84 -0
- package/.devcontainer/init-firewall.sh +198 -0
- package/.devcontainer/post-create.sh +153 -0
- package/.dockerignore +36 -0
- package/.env.local.example +32 -0
- package/.gitattributes +83 -0
- package/.gitignore +91 -0
- package/CLAUDE.md +242 -0
- package/CODE_OF_CONDUCT.md +46 -0
- package/CONTRIBUTING.md +51 -0
- package/Dockerfile +46 -0
- package/GOVERNANCE.md +44 -0
- package/LICENSE +661 -0
- package/README.md +88 -0
- package/bin/bongos.js +222 -0
- package/clients/bongos-client/README.md +48 -0
- package/clients/bongos-client/bongos-client.global.js +617 -0
- package/clients/bongos-client/examples/hello-world.mjs +62 -0
- package/clients/bongos-client/index.cjs +619 -0
- package/clients/bongos-client/index.d.ts +793 -0
- package/clients/bongos-client/index.mjs +614 -0
- package/clients/bongos-client/package.json +32 -0
- package/config/branding.neutral.json +60 -0
- package/config/design-tokens.neutral.json +51 -0
- package/config/design-tokens.schema.json +96 -0
- package/config/modules.neutral.json +9 -0
- package/docker-compose.yml +52 -0
- package/docker-entrypoint.sh +30 -0
- package/docs/adr/0001-stack-choice-single-vps.md +45 -0
- package/docs/adr/0002-digitalocean-over-hetzner.md +27 -0
- package/docs/adr/0003-cloudflare-origin-cert-over-letsencrypt.md +35 -0
- package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +45 -0
- package/docs/adr/0005-invisible-other-players-in-v1.md +37 -0
- package/docs/adr/0006-singleton-worldroom-plus-queueroom.md +30 -0
- package/docs/adr/0007-persistent-identity-via-localstorage-uuid.md +31 -0
- package/docs/adr/0008-family-based-tile-generation.md +86 -0
- package/docs/adr/0008-google-chat-oauth-user-auth.md +37 -0
- package/docs/adr/0009-autotile-architecture.md +181 -0
- package/docs/adr/0010-pms-architecture.md +70 -0
- package/docs/adr/0011-terrain-id-rendering-model.md +174 -0
- package/docs/adr/0012-ground-object-cell-split.md +208 -0
- package/docs/adr/0013-paths-as-object-overlays-with-autotile-dispatch.md +158 -0
- package/docs/adr/0014-families-canonical-over-vocabulary.md +103 -0
- package/docs/adr/0015-task-dependencies-and-auto-promotion.md +125 -0
- package/docs/adr/0016-trust-boundary-server-enforced-permissions.md +132 -0
- package/docs/adr/0017-code-simplification-and-repo-cleanliness.md +74 -0
- package/docs/adr/0018-three-rank-model-goes-live.md +97 -0
- package/docs/adr/0019-red-team-bounty-payout-table.md +52 -0
- package/docs/adr/0020-security-model-public-stub.md +70 -0
- package/docs/adr/0021-per-builder-skill-model-preferences.md +99 -0
- package/docs/adr/0022-secrets-policy.md +124 -0
- package/docs/adr/0023-kind-multipliers-and-idea-bonus.md +118 -0
- package/docs/adr/0024-cloneable-repo-local-first-memory.md +277 -0
- package/docs/adr/0024-multi-agent-system-architecture.md +125 -0
- package/docs/adr/0025-offsite-backup-vendor-digitalocean-spaces.md +59 -0
- package/docs/adr/0025-structured-criterion-task-link.md +44 -0
- package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +117 -0
- package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +170 -0
- package/docs/adr/0028-honest-llm-spend-accounting.md +109 -0
- package/docs/adr/0029-status-page-outage-resilience.md +59 -0
- package/docs/adr/0030-builders-hall-live-updates.md +59 -0
- package/docs/adr/0031-cloud-dev-environments-for-builders.md +222 -0
- package/docs/adr/0032-discord-mirror-of-gds.md +50 -0
- package/docs/adr/0033-discord-bot-service-principal.md +82 -0
- package/docs/adr/0034-thetes-graduated-newcomer-rank.md +53 -0
- package/docs/adr/0035-builder-onboarding-three-paths.md +128 -0
- package/docs/adr/0036-builders-subdomain-and-ui-reorg.md +40 -0
- package/docs/adr/0037-discord-channel-management.md +51 -0
- package/docs/adr/0038-chromebook-ttyd-cloudflare-tunnel.md +111 -0
- package/docs/adr/0039-setup-first-onboarding-ux.md +49 -0
- package/docs/adr/0040-remote-control-default-browser-onramp.md +47 -0
- package/docs/adr/0041-temporary-grader-bypass-killswitch.md +40 -0
- package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +82 -0
- package/docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md +74 -0
- package/docs/adr/0044-mediterranean-palette-replacement.md +73 -0
- package/docs/adr/0044-per-box-live-game-preview.md +57 -0
- package/docs/adr/0045-devbox-desktop-app.md +133 -0
- package/docs/adr/0046-sandbox-first-review-gate.md +72 -0
- package/docs/adr/0047-discord-bugs-intake-anti-abuse.md +36 -0
- package/docs/adr/0048-works-in-progress-ia-split.md +32 -0
- package/docs/adr/0049-split-parallel-safety-contract.md +46 -0
- package/docs/adr/0050-device-flow-admission-invite-gated-by-default.md +43 -0
- package/docs/adr/0051-full-session-transcript-corpus.md +57 -0
- package/docs/adr/0052-sandbox-for-everyone-game-only-preview.md +70 -0
- package/docs/adr/0053-scoped-dev-box-session.md +55 -0
- package/docs/adr/0054-session-token-reward-cost-plus.md +63 -0
- package/docs/adr/0055-server-mediated-branch-publish.md +47 -0
- package/docs/adr/0056-prod-deploy-script-mirror-and-healthcheck-retry.md +62 -0
- package/docs/adr/0057-container-cost-ledger.md +28 -0
- package/docs/adr/0057-discord-archon-approval-channels.md +64 -0
- package/docs/adr/0058-automatic-gate-surface-gatekeeper.md +64 -0
- package/docs/adr/0059-single-approval-remove-devbox-approval-gate.md +37 -0
- package/docs/adr/0060-gds-retrieval-layer.md +97 -0
- package/docs/adr/0061-context-layer-decomposition.md +61 -0
- package/docs/adr/0062-medusa-instance-model-decoupling.md +107 -0
- package/docs/adr/0063-generated-repo-map-symbol-skeleton.md +44 -0
- package/docs/adr/0064-rename-medusa-to-cloud-bongos.md +49 -0
- package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +69 -0
- package/docs/adr/0066-generated-file-map-sections.md +51 -0
- package/docs/adr/0067-session-start-fast-forward-pull.md +43 -0
- package/docs/adr/0068-shared-art-key-for-newcomers.md +38 -0
- package/docs/adr/0069-hall-live-channel-sse-decouple.md +35 -0
- package/docs/adr/0070-deterministic-session-card-delivery.md +44 -0
- package/docs/adr/0071-box-confirm-before-destroyed-and-drift-reconcile.md +59 -0
- package/docs/adr/0072-bongos-app-mac-signed-first-windows-deferred.md +35 -0
- package/docs/adr/0072-dev-box-code-staleness-visibility.md +39 -0
- package/docs/adr/0073-builder-needs-signal-and-byok-gemini-key.md +64 -0
- package/docs/adr/0073-secrets-scan-exclude-uri-detector.md +37 -0
- package/docs/adr/0074-memory-map-stays-light.md +32 -0
- package/docs/adr/0075-per-system-cost-attribution.md +37 -0
- package/docs/adr/0076-in-session-deterministic-compaction.md +58 -0
- package/docs/adr/0077-content-addressed-llm-cache.md +32 -0
- package/docs/adr/0078-deterministic-first-cron.md +48 -0
- package/docs/adr/0079-value-gated-autonomous-engagement.md +39 -0
- package/docs/adr/0080-llm-cache-api-transport-and-trust-model.md +46 -0
- package/docs/adr/0081-tool-agnostic-design-layer.md +62 -0
- package/docs/adr/0082-productized-key-storage-provisioning.md +32 -0
- package/docs/adr/0082-server-side-merge-conflict-auto-resolution.md +55 -0
- package/docs/adr/0083-modular-architecture-strangler-build-plan.md +143 -0
- package/docs/adr/0084-auto-derived-per-task-rank-floor.md +86 -0
- package/docs/adr/0085-remove-default-per-builder-spend-cap.md +39 -0
- package/docs/adr/0086-goal-scoped-work-hierarchy.md +123 -0
- package/docs/adr/0087-bongos-app-architecture-and-handoff-contract.md +49 -0
- package/docs/adr/0087-compete-on-governance-not-tooling-cursor.md +65 -0
- package/docs/adr/0088-consistent-character-generative-animation.md +169 -0
- package/docs/adr/0089-modular-multi-model-adversarial-grader.md +179 -0
- package/docs/adr/0090-metic-task-authoring.md +73 -0
- package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +106 -0
- package/docs/adr/0092-hosting-module-and-on-prem-target.md +117 -0
- package/docs/adr/0093-tranche-2-core-carve-sequence.md +72 -0
- package/docs/adr/0094-repo-atlas-self-drawing-codebase-map.md +49 -0
- package/docs/adr/0095-borrowed-memory-and-retrieval-concepts.md +65 -0
- package/docs/adr/0095-cross-agent-context-management.md +58 -0
- package/docs/adr/0096-require-reward-before-workable.md +209 -0
- package/docs/adr/0097-one-active-claim-per-session-and-worktree-binding.md +46 -0
- package/docs/adr/0097-retroactive-reward-backfill.md +124 -0
- package/docs/adr/0098-public-mirror-publish-manifest.md +92 -0
- package/docs/adr/0099-delayed-redacted-mirror-export.md +55 -0
- package/docs/adr/0100-two-repo-instance-model.md +60 -0
- package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +90 -0
- package/docs/adr/0102-finish-bounding-the-kernel.md +36 -0
- package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +70 -0
- package/docs/adr/0103-gdsv4-bongos-consolidation.md +28 -0
- package/docs/adr/0104-trust-gds-api-channel-in-auto-mode.md +42 -0
- package/docs/adr/0105-instance-seed-migrations-out-of-core.md +47 -0
- package/docs/adr/0106-goal-owner-manager-authority.md +84 -0
- package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +83 -0
- package/docs/adr/0108-instance-composition-configurable-root.md +87 -0
- package/docs/adr/0109-self-describing-openapi-and-hosted-docs.md +44 -0
- package/docs/adr/0110-untrack-whole-file-generated-nav-docs.md +49 -0
- package/docs/adr/0111-instance-hosting-provisioning-module.md +135 -0
- package/docs/adr/0112-private-goals-invitations-join-requests.md +72 -0
- package/docs/adr/0113-sandbox-studio-descope-superseded-by-0044-0052.md +41 -0
- package/docs/adr/0114-instance-docs-discovery-contract.md +32 -0
- package/docs/adr/0115-scheduled-routines-portability.md +31 -0
- package/docs/adr/0116-api-error-envelope-and-code-taxonomy.md +62 -0
- package/docs/adr/0117-api-versioning-and-deprecation-policy.md +50 -0
- package/docs/adr/0118-api-contract-source-of-truth-code-first.md +47 -0
- package/docs/adr/0119-api-pagination-contract.md +34 -0
- package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +108 -0
- package/docs/adr/0121-greenfield-vs-brownfield-onboarding-adopt-existing-repo.md +97 -0
- package/docs/adr/0122-onboarding-diagram-renders-deploy-rendered-off-git.md +43 -0
- package/docs/adr/0123-box-idle-sweep-autosave-before-destroy.md +36 -0
- package/docs/adr/0124-typed-api-response-bodies.md +37 -0
- package/docs/adr/0125-control-plane-scaffolds-standalone-instance-repo.md +36 -0
- package/docs/adr/0126-dedicated-cloudbongos-control-plane-droplet.md +30 -0
- package/docs/adr/0127-cross-box-fleet-observability.md +64 -0
- package/docs/adr/0128-provisioning-runner-privilege-and-db-auth-model.md +46 -0
- package/docs/adr/0129-cloudbongos-control-plane-pull-deploy.md +34 -0
- package/docs/adr/0130-provision-remote-exec-over-ssh.md +61 -0
- package/docs/adr/0131-rank-scoped-skill-visibility.md +47 -0
- package/docs/adr/0132-cohost-fleet-control-plane-migration.md +54 -0
- package/docs/adr/0133-github-app-manifest-onboarding-signin.md +42 -0
- package/docs/adr/0134-private-first-npm-distribution.md +38 -0
- package/docs/adr/README.md +208 -0
- package/docs/api/openapi.json +13720 -0
- package/docs/api-reference.md +437 -0
- package/docs/architecture.md +244 -0
- package/docs/branding-contract.md +66 -0
- package/docs/branding-fill-prompt.md +25 -0
- package/docs/canonical-permissions.md +241 -0
- package/docs/design/container-exterior-tiles.md +49 -0
- package/docs/design/container-exterior.md +81 -0
- package/docs/design/container-interior.md +77 -0
- package/docs/design/modular-architecture/00-research-report.md +107 -0
- package/docs/design/modular-architecture/01-architecture.md +125 -0
- package/docs/design/modular-architecture/02-module-map.md +116 -0
- package/docs/design/modular-architecture/03-builder-flows.md +104 -0
- package/docs/design/modular-architecture/04-module-lifecycle.md +62 -0
- package/docs/design/modular-architecture/README.md +27 -0
- package/docs/design/vanilla-hall-ui-redesign-scope.md +284 -0
- package/docs/design/world-map-scroll.md +41 -0
- package/docs/design-contract.md +320 -0
- package/docs/file-map.md +418 -0
- package/docs/handoff-template.md +92 -0
- package/docs/modules-contract.md +293 -0
- package/docs/onboarding/browser-terminal-guide.md +73 -0
- package/docs/onboarding/diagrams/01-task-lifecycle.mmd +28 -0
- package/docs/onboarding/diagrams/02-rank-ladder.mmd +54 -0
- package/docs/onboarding/diagrams/03-drachmae-karma.mmd +37 -0
- package/docs/onboarding/diagrams/04-architecture.mmd +51 -0
- package/docs/onboarding/diagrams/05-versioning.mmd +29 -0
- package/docs/onboarding/diagrams/README.md +94 -0
- package/docs/onboarding/diagrams/assertions.json +170 -0
- package/docs/onboarding/diagrams/puppeteer-config.json +1 -0
- package/docs/onboarding/diagrams/render-config.json +9 -0
- package/docs/onboarding/drachmae-and-karma.md +178 -0
- package/docs/onboarding/primer.md +202 -0
- package/docs/project-context.template.md +67 -0
- package/docs/recipes/README.md +35 -0
- package/docs/recipes/audit-replay.md +100 -0
- package/docs/recipes/bongos-cli-release.md +66 -0
- package/docs/recipes/builder-box-lifecycle.md +152 -0
- package/docs/recipes/claude-design-loop.md +143 -0
- package/docs/recipes/claude-gemini-bongos-doors.md +155 -0
- package/docs/recipes/cloudbongos-staging-gate.md +139 -0
- package/docs/recipes/cloudbongos-standup.md +111 -0
- package/docs/recipes/devbox-app-release.md +93 -0
- package/docs/recipes/devbox-app-windows-test.md +128 -0
- package/docs/recipes/failed-ship-recovery-proof.md +102 -0
- package/docs/recipes/figma-design-loop.md +129 -0
- package/docs/recipes/gds-db-backup.md +255 -0
- package/docs/recipes/instance-deploy.md +37 -0
- package/docs/recipes/managed-settings-remote-control.md +416 -0
- package/docs/recipes/memory-backup.md +71 -0
- package/docs/recipes/memory-sync-conflicts.md +98 -0
- package/docs/recipes/multi-builder-merge.md +78 -0
- package/docs/recipes/ops-gotchas.md +212 -0
- package/docs/recipes/overnight-builder.md +53 -0
- package/docs/recipes/packaging-the-core.md +49 -0
- package/docs/recipes/parallel-load-results-2026-05-30.md +63 -0
- package/docs/recipes/parallel-load-test.md +32 -0
- package/docs/recipes/pixel-art-pipeline.md +411 -0
- package/docs/recipes/private-npm-distribution.md +79 -0
- package/docs/recipes/search-index-ingestion.md +67 -0
- package/docs/recipes/self-host.md +60 -0
- package/docs/recipes/ship-and-regrade.md +72 -0
- package/docs/recipes/staging-data.md +50 -0
- package/docs/recipes/staging-environment.md +215 -0
- package/docs/recipes/upgrading-the-core.md +58 -0
- package/docs/research/cursor-competitive-analysis.md +255 -0
- package/docs/research/llm-model-agnostic-and-cheaper-grader.md +227 -0
- package/migrations/003_pms.sql +284 -0
- package/migrations/004_pms_cost_idempotency.sql +13 -0
- package/migrations/005_pms_smoke_filter.sql +44 -0
- package/migrations/006_pms_v2.sql +378 -0
- package/migrations/007_pms_v2_hierarchy_trigger.sql +59 -0
- package/migrations/008_pms_v2_migration_allocator.sql +27 -0
- package/migrations/009_pms_v2_blockers_table.sql +68 -0
- package/migrations/010_uptime.sql +29 -0
- package/migrations/011_backfill_v2_v3_done_when.sql +20 -0
- package/migrations/012_pms_v2_task_lifecycle_states.sql +82 -0
- package/migrations/013_claim_locking.sql +22 -0
- package/migrations/014_pms_task_discipline.sql +86 -0
- package/migrations/015_pms_estimation_calibration.sql +140 -0
- package/migrations/016_pms_task_grades.sql +60 -0
- package/migrations/017_version_progress_exclude_abandoned.sql +49 -0
- package/migrations/019_rename_pms_v3_to_gds_v3.sql +65 -0
- package/migrations/020_task_dependencies.sql +99 -0
- package/migrations/021_v3_renumber_and_deps.sql +224 -0
- package/migrations/022_v3_reconcile_dep_gated_status.sql +41 -0
- package/migrations/023_pms_rank.sql +30 -0
- package/migrations/025_builder_exit_status.sql +15 -0
- package/migrations/027_builders_preferred_disciplines.sql +46 -0
- package/migrations/028_tasks_parallel_safe.sql +71 -0
- package/migrations/029_rank_three_live.sql +32 -0
- package/migrations/030_vulnerability_reports.sql +61 -0
- package/migrations/031_reward_simplification.sql +57 -0
- package/migrations/032_repo_health_snapshots.sql +56 -0
- package/migrations/033_audit_log.sql +64 -0
- package/migrations/034_lifecycle_breakdown_leaf_only.sql +62 -0
- package/migrations/035_auth_token_hygiene.sql +66 -0
- package/migrations/037_builder_skill_model_prefs.sql +44 -0
- package/migrations/038_task_override_requests.sql +51 -0
- package/migrations/039_newcomer_friendly_column.sql +124 -0
- package/migrations/040_builder_karma.sql +58 -0
- package/migrations/041_kind_multipliers_and_idea_bonus.sql +42 -0
- package/migrations/042_criterion_proposal_workflow.sql +78 -0
- package/migrations/043_builder_onboarding_observability.sql +66 -0
- package/migrations/044_tasks_requires_rank.sql +97 -0
- package/migrations/045_builder_onboarding_state.sql +147 -0
- package/migrations/046_cost_log_builder_attribution.sql +42 -0
- package/migrations/054_builder_memory.sql +108 -0
- package/migrations/055_task_criteria.sql +90 -0
- package/migrations/058_peer_votes.sql +41 -0
- package/migrations/059_onboarding_pick_disciplines.sql +59 -0
- package/migrations/060_access_requests.sql +46 -0
- package/migrations/061_backfill_override_ship_attribution.sql +29 -0
- package/migrations/062_session_records.sql +34 -0
- package/migrations/063_session_records_tool_errors_idx.sql +11 -0
- package/migrations/064_grade_attempts.sql +18 -0
- package/migrations/065_bfg_principal.sql +58 -0
- package/migrations/066_live_notify_triggers.sql +69 -0
- package/migrations/067_builder_boxes.sql +117 -0
- package/migrations/067_discord_bot_foundation.sql +69 -0
- package/migrations/068_thetes_requires_rank.sql +27 -0
- package/migrations/069_builder_ssh_keys.sql +66 -0
- package/migrations/070_box_intents.sql +101 -0
- package/migrations/071_box_first_provision_approval.sql +46 -0
- package/migrations/072_onboarding_ship_three_remove_primer.sql +80 -0
- package/migrations/073_box_terminal_access.sql +46 -0
- package/migrations/075_builder_sound_prefs.sql +28 -0
- package/migrations/078_box_claude_active.sql +22 -0
- package/migrations/079_box_first_connected_at.sql +20 -0
- package/migrations/081_tasks_needs_migration.sql +34 -0
- package/migrations/084_tasks_security_sensitive.sql +24 -0
- package/migrations/085_security_engagement_docs.sql +34 -0
- package/migrations/086_rename_disciplines.sql +125 -0
- package/migrations/088_builders_anthropic_link.sql +28 -0
- package/migrations/089_builders_monthly_budget.sql +19 -0
- package/migrations/090_box_scoped_sessions.sql +38 -0
- package/migrations/091_session_token_reward.sql +44 -0
- package/migrations/093_tasks_sandbox_review.sql +22 -0
- package/migrations/102_remove_box_first_provision_approval.sql +58 -0
- package/migrations/103_search_chunks.sql +90 -0
- package/migrations/104_builder_box_blocked.sql +34 -0
- package/migrations/105_box_host_keys.sql +35 -0
- package/migrations/111_medusa_customer0_framing.sql +35 -0
- package/migrations/112_drop_track_check.sql +25 -0
- package/migrations/113_merge_lease.sql +16 -0
- package/migrations/114_cloudbongos_rename_live_strings.sql +32 -0
- package/migrations/118_currency_label_decoupling.sql +23 -0
- package/migrations/119_builder_behavior_prefs.sql +31 -0
- package/migrations/121_box_code_version.sql +37 -0
- package/migrations/122_builder_gemini_key.sql +30 -0
- package/migrations/123_cost_log_tiers.sql +33 -0
- package/migrations/124_cost_baseline.sql +45 -0
- package/migrations/125_llm_cache.sql +54 -0
- package/migrations/126_autonomy_runs.sql +33 -0
- package/migrations/143_cost_calibration.sql +63 -0
- package/migrations/145_backfill_task_requires_rank.sql +84 -0
- package/migrations/160_goal_tier.sql +88 -0
- package/migrations/163_polymorphic_dependencies.sql +187 -0
- package/migrations/164_event_sound_prefs.sql +20 -0
- package/migrations/165_task_module_key.sql +15 -0
- package/migrations/171_claims_published_head_sha.sql +24 -0
- package/migrations/174_close_orphaned_claims_on_terminal_tasks.sql +30 -0
- package/migrations/175_task_grades_diff_hash.sql +9 -0
- package/migrations/176_promotion_respects_open_blockers.sql +58 -0
- package/migrations/176_ui_discipline.sql +40 -0
- package/migrations/177_require_reward_before_workable.sql +76 -0
- package/migrations/178_reward_gate_auto_assign_revert_autopromote.sql +61 -0
- package/migrations/179_search_chunk_usefulness.sql +33 -0
- package/migrations/180_one_active_claim_per_session.sql +54 -0
- package/migrations/181_cost_log_skill_name.sql +33 -0
- package/migrations/184_claim_release_requested.sql +25 -0
- package/migrations/185_module_upstreaming_goal_wiring.sql +59 -0
- package/migrations/187_goal_sort_order.sql +30 -0
- package/migrations/187_tasks_kind_check_add_verify.sql +21 -0
- package/migrations/README.md +88 -0
- package/migrations/core_188_goal_visibility_and_membership_requests.sql +71 -0
- package/migrations/core_189_core_upgrades_ledger.sql +37 -0
- package/migrations/core_189_credit_log_task_id_index.sql +19 -0
- package/migrations/core_190_rebuild_claimable_task_views.sql +71 -0
- package/migrations/instance/018_pms_v3_planning_seed.sql +131 -0
- package/migrations/instance/080_gds_v4_planning_seed.sql +75 -0
- package/migrations/instance/110_medusa_planning_seed.sql +70 -0
- package/migrations/instance/120_bongos_v1_planning_seed.sql +69 -0
- package/migrations/instance/144_bongos_v1_module_system_criterion.sql +26 -0
- package/migrations/instance/159_bongos_v1_goal_hierarchy_criterion.sql +29 -0
- package/migrations/instance/172_v2_world_planning_seed.sql +163 -0
- package/migrations/instance/173_bongos_v1_c7_core_modularized.sql +33 -0
- package/migrations/instance/182_gdsv4_bongos_consolidation.sql +132 -0
- package/migrations/instance/183_gdsv4_carryover_themed_goals.sql +116 -0
- package/migrations/instance/186_bongos_v1_governance_planning_seed.sql +69 -0
- package/modules/autonomy/CLAUDE.md +49 -0
- package/modules/autonomy/db.js +50 -0
- package/modules/autonomy/module.json +13 -0
- package/modules/autonomy/pollers/routine-timers.js +146 -0
- package/modules/autonomy/routes/autonomy.js +37 -0
- package/modules/builder-settings/CLAUDE.md +58 -0
- package/modules/builder-settings/builder-needs.js +115 -0
- package/modules/builder-settings/db.js +168 -0
- package/modules/builder-settings/display-name.js +84 -0
- package/modules/builder-settings/event-sound-prefs.js +169 -0
- package/modules/builder-settings/interaction-prefs.js +201 -0
- package/modules/builder-settings/model-alloc-prefs.js +147 -0
- package/modules/builder-settings/module.json +10 -0
- package/modules/builder-settings/render-prefs.js +103 -0
- package/modules/builder-settings/routes/settings.js +417 -0
- package/modules/builder-settings/settings.js +52 -0
- package/modules/builder-settings/skill-prefs.js +196 -0
- package/modules/builder-settings/sound-prefs.js +178 -0
- package/modules/builder-settings/wandering-prefs.js +282 -0
- package/modules/dev-box/CLAUDE.md +38 -0
- package/modules/dev-box/box-access.js +275 -0
- package/modules/dev-box/box-credential.js +94 -0
- package/modules/dev-box/box-onboard.js +486 -0
- package/modules/dev-box/boxes.js +842 -0
- package/modules/dev-box/db.js +39 -0
- package/modules/dev-box/module.json +14 -0
- package/modules/dev-box/routes/box.js +977 -0
- package/modules/discord/CLAUDE.md +50 -0
- package/modules/discord/auth.js +54 -0
- package/modules/discord/bug-attachments.js +210 -0
- package/modules/discord/db.js +96 -0
- package/modules/discord/discord-approvals.js +145 -0
- package/modules/discord/discord-audit.js +29 -0
- package/modules/discord/discord-bot.js +545 -0
- package/modules/discord/discord-bugs.js +257 -0
- package/modules/discord/discord-channels.js +412 -0
- package/modules/discord/discord-inbound.js +147 -0
- package/modules/discord/discord-message-buffer.js +54 -0
- package/modules/discord/discord-reaction.js +186 -0
- package/modules/discord/discord-role-sync.js +318 -0
- package/modules/discord/module.json +14 -0
- package/modules/discord/pollers/discord-bot.js +19 -0
- package/modules/discord/routes/bug-attachments.js +44 -0
- package/modules/discord/routes/discord.js +102 -0
- package/modules/discord/ship-broadcast.js +78 -0
- package/modules/discord/webhook.js +74 -0
- package/modules/economy/CLAUDE.md +48 -0
- package/modules/economy/achievements.js +594 -0
- package/modules/economy/cost-classify.js +331 -0
- package/modules/economy/cost-summary-shape.js +90 -0
- package/modules/economy/cost.js +438 -0
- package/modules/economy/credits.js +430 -0
- package/modules/economy/migrations/economy_001_fix_gds_shipper_description.sql +91 -0
- package/modules/economy/module.json +10 -0
- package/modules/economy/reward.js +61 -0
- package/modules/economy/routes/cost.js +97 -0
- package/modules/economy/routes/leaderboard.js +26 -0
- package/modules/economy/routes/reward.js +42 -0
- package/modules/economy/streak.js +285 -0
- package/modules/grading/CLAUDE.md +42 -0
- package/modules/grading/db.js +39 -0
- package/modules/grading/grader-rubric.json +151 -0
- package/modules/grading/grader-workers/efficiency.js +213 -0
- package/modules/grading/grader-workers/extract-json.js +80 -0
- package/modules/grading/grader-workers/fence.js +100 -0
- package/modules/grading/grader-workers/hacker.js +239 -0
- package/modules/grading/grader-workers/index.js +183 -0
- package/modules/grading/grader-workers/narc.js +207 -0
- package/modules/grading/grader-workers/quality.js +198 -0
- package/modules/grading/grader-workers/rubric.js +20 -0
- package/modules/grading/grader-workers/worker-prompt.js +89 -0
- package/modules/grading/grader-workers/worker-verdict.js +50 -0
- package/modules/grading/grader.js +1790 -0
- package/modules/grading/module.json +12 -0
- package/modules/grading/routes/grade.js +51 -0
- package/modules/hall-ui/CLAUDE.md +61 -0
- package/modules/hall-ui/module.json +14 -0
- package/modules/hall-ui/public/atlas.html +180 -0
- package/modules/hall-ui/public/atlas.js +336 -0
- package/modules/hall-ui/public/box-panel.js +423 -0
- package/modules/hall-ui/public/brand-apply.js +117 -0
- package/modules/hall-ui/public/builders.js +3028 -0
- package/modules/hall-ui/public/chime.wav +0 -0
- package/modules/hall-ui/public/copy-on-click.js +174 -0
- package/modules/hall-ui/public/cursors/arrow.png +0 -0
- package/modules/hall-ui/public/cursors/hand-pointer.png +0 -0
- package/modules/hall-ui/public/cursors/magnifier-out.png +0 -0
- package/modules/hall-ui/public/cursors/magnifier.png +0 -0
- package/modules/hall-ui/public/diagram-viewer.css +125 -0
- package/modules/hall-ui/public/diagram-viewer.js +330 -0
- package/modules/hall-ui/public/diagrams.html +113 -0
- package/modules/hall-ui/public/dom-utils.js +212 -0
- package/modules/hall-ui/public/drachmae.html +68 -0
- package/modules/hall-ui/public/drachmae.js +136 -0
- package/modules/hall-ui/public/gate.html +143 -0
- package/modules/hall-ui/public/gate.js +228 -0
- package/modules/hall-ui/public/goals-page.js +1297 -0
- package/modules/hall-ui/public/goals.html +376 -0
- package/modules/hall-ui/public/goals.js +119 -0
- package/modules/hall-ui/public/hall-widgets.js +189 -0
- package/modules/hall-ui/public/harbor.html +167 -0
- package/modules/hall-ui/public/harbor.js +335 -0
- package/modules/hall-ui/public/index.html +116 -0
- package/modules/hall-ui/public/instances-panel.js +172 -0
- package/modules/hall-ui/public/md-reader.js +234 -0
- package/modules/hall-ui/public/modules.html +119 -0
- package/modules/hall-ui/public/modules.js +154 -0
- package/modules/hall-ui/public/new-project-wizard.js +186 -0
- package/modules/hall-ui/public/not-ready.html +48 -0
- package/modules/hall-ui/public/pair.html +119 -0
- package/modules/hall-ui/public/pair.js +132 -0
- package/modules/hall-ui/public/primer.css +404 -0
- package/modules/hall-ui/public/primer.html +85 -0
- package/modules/hall-ui/public/primer.js +641 -0
- package/modules/hall-ui/public/profile.html +85 -0
- package/modules/hall-ui/public/profile.js +236 -0
- package/modules/hall-ui/public/ranks.html +69 -0
- package/modules/hall-ui/public/ranks.js +206 -0
- package/modules/hall-ui/public/roadmap.html +209 -0
- package/modules/hall-ui/public/roadmap.js +375 -0
- package/modules/hall-ui/public/sessions.html +92 -0
- package/modules/hall-ui/public/sessions.js +222 -0
- package/modules/hall-ui/public/settings.html +640 -0
- package/modules/hall-ui/public/settings.js +1219 -0
- package/modules/hall-ui/public/shell.js +495 -0
- package/modules/hall-ui/public/style.css +1748 -0
- package/modules/hall-ui/public/task-detail.js +253 -0
- package/modules/hall-ui/public/task.html +83 -0
- package/modules/hall-ui/public/task.js +326 -0
- package/modules/hall-ui/public/watch.html +333 -0
- package/modules/hall-ui/public/watch.js +859 -0
- package/modules/hall-ui/public/work.html +469 -0
- package/modules/hall-ui/public/work.js +1292 -0
- package/modules/ideas/CLAUDE.md +37 -0
- package/modules/ideas/blockers.js +100 -0
- package/modules/ideas/inbox.js +459 -0
- package/modules/ideas/module.json +10 -0
- package/modules/ideas/routes/blockers.js +120 -0
- package/modules/ideas/routes/inbox.js +230 -0
- package/modules/lifecycle/CLAUDE.md +63 -0
- package/modules/lifecycle/conflict-resolve.js +436 -0
- package/modules/lifecycle/db.js +4970 -0
- package/modules/lifecycle/done-when.js +355 -0
- package/modules/lifecycle/github-push.js +969 -0
- package/modules/lifecycle/goal-conflicts.js +133 -0
- package/modules/lifecycle/hierarchy.js +104 -0
- package/modules/lifecycle/lifecycle.js +58 -0
- package/modules/lifecycle/merge-lock.js +261 -0
- package/modules/lifecycle/migrations/lifecycle_001_goal_first_leads.sql +28 -0
- package/modules/lifecycle/migrations/lifecycle_002_backfill_orphan_task_goals.sql +36 -0
- package/modules/lifecycle/module.json +13 -0
- package/modules/lifecycle/pollers/publish-reconciler.js +20 -0
- package/modules/lifecycle/publish-reconciler.js +418 -0
- package/modules/lifecycle/routes/analytics.js +63 -0
- package/modules/lifecycle/routes/claims.js +506 -0
- package/modules/lifecycle/routes/dependencies.js +82 -0
- package/modules/lifecycle/routes/done-when.js +136 -0
- package/modules/lifecycle/routes/gate-approvals.js +197 -0
- package/modules/lifecycle/routes/goals.js +1419 -0
- package/modules/lifecycle/routes/lifecycle.js +43 -0
- package/modules/lifecycle/routes/tasks.js +1703 -0
- package/modules/lifecycle/routes/versions.js +128 -0
- package/modules/lifecycle/ship-card.js +505 -0
- package/modules/lifecycle/ship-preflight.js +225 -0
- package/modules/lifecycle/task-classifier.js +512 -0
- package/modules/lifecycle/version-close.js +106 -0
- package/modules/memory/CLAUDE.md +40 -0
- package/modules/memory/learnings.js +275 -0
- package/modules/memory/memory.js +572 -0
- package/modules/memory/module.json +12 -0
- package/modules/memory/routes/learnings.js +90 -0
- package/modules/memory/routes/memory.js +916 -0
- package/modules/memory/routes/search.js +188 -0
- package/modules/memory/search-chunker.js +252 -0
- package/modules/memory/search.js +320 -0
- package/modules/onboarding/CLAUDE.md +55 -0
- package/modules/onboarding/approval-broadcast.js +59 -0
- package/modules/onboarding/db.js +54 -0
- package/modules/onboarding/module.json +10 -0
- package/modules/onboarding/newcomer-restock.js +212 -0
- package/modules/onboarding/onboarding-state.js +532 -0
- package/modules/onboarding/onboarding.js +508 -0
- package/modules/onboarding/port.js +63 -0
- package/modules/onboarding/routes/access-requests.js +208 -0
- package/modules/onboarding/routes/onboarding.js +54 -0
- package/modules/security/CLAUDE.md +44 -0
- package/modules/security/module.json +10 -0
- package/modules/security/routes/reports.js +251 -0
- package/modules/security/secret-scrub.js +201 -0
- package/modules/security/security.js +294 -0
- package/modules/sessions/CLAUDE.md +39 -0
- package/modules/sessions/bfg.js +357 -0
- package/modules/sessions/db.js +326 -0
- package/modules/sessions/module.json +10 -0
- package/modules/sessions/pulse.js +149 -0
- package/modules/sessions/routes/sessions.js +331 -0
- package/modules/status-ui/CLAUDE.md +47 -0
- package/modules/status-ui/module.json +14 -0
- package/modules/status-ui/public/README.md +29 -0
- package/modules/status-ui/public/cursors/arrow.png +0 -0
- package/modules/status-ui/public/cursors/hand-pointer.png +0 -0
- package/modules/status-ui/public/index.html +363 -0
- package/modules/status-ui/public/snapshots/.gitkeep +0 -0
- package/modules/status-ui/public/status.js +1375 -0
- package/modules/status-ui/public/style.css +1342 -0
- package/package-lock.json +975 -0
- package/package.json +28 -0
- package/public-docs/index.html +35 -0
- package/public-docs/redoc.standalone.js +1838 -0
- package/public-docs/redoc.standalone.js.LICENSE.txt +102 -0
- package/public-landing/buddha.png +0 -0
- package/public-landing/create.html +868 -0
- package/public-landing/index.html +168 -0
- package/scripts/bongos-mcp.js +28 -0
- package/scripts/cron/style_guide_audit.sh +134 -0
- package/scripts/discord/README.md +52 -0
- package/scripts/discord/lib.js +80 -0
- package/scripts/discord/post.js +51 -0
- package/scripts/gds/CLAUDE.md +144 -0
- package/scripts/gds/abandon.js +58 -0
- package/scripts/gds/adopt-detect.js +123 -0
- package/scripts/gds/adopt-import.js +111 -0
- package/scripts/gds/adopt-preflight.js +121 -0
- package/scripts/gds/api.js +78 -0
- package/scripts/gds/architect-audit.js +288 -0
- package/scripts/gds/art-stage.js +152 -0
- package/scripts/gds/audit-authorship.sh +243 -0
- package/scripts/gds/audit-deps.js +121 -0
- package/scripts/gds/audit-exports.js +128 -0
- package/scripts/gds/audit-replay.sh +161 -0
- package/scripts/gds/audit-ships.js +251 -0
- package/scripts/gds/autonomy-gate.js +135 -0
- package/scripts/gds/backfill-cost.js +165 -0
- package/scripts/gds/backfill-sessions.js +351 -0
- package/scripts/gds/backfill-task-rewards.js +408 -0
- package/scripts/gds/backup.js +94 -0
- package/scripts/gds/bfg-principal-token.js +65 -0
- package/scripts/gds/box-auth-check.js +160 -0
- package/scripts/gds/box-connect-lib.js +453 -0
- package/scripts/gds/box.js +1258 -0
- package/scripts/gds/build-bongos.js +94 -0
- package/scripts/gds/capture.js +123 -0
- package/scripts/gds/cf-tunnel.js +419 -0
- package/scripts/gds/ci-grade.js +82 -0
- package/scripts/gds/claim-recall.js +112 -0
- package/scripts/gds/claim.js +333 -0
- package/scripts/gds/classify-discipline.js +153 -0
- package/scripts/gds/claude-materialize.js +176 -0
- package/scripts/gds/cleanup-orphans.js +74 -0
- package/scripts/gds/cli-lib.js +518 -0
- package/scripts/gds/code.js +101 -0
- package/scripts/gds/codemod-rename-src-gds.js +145 -0
- package/scripts/gds/conductor-dispatch.js +426 -0
- package/scripts/gds/context-pack.js +228 -0
- package/scripts/gds/coreB-carve-proof.sh +716 -0
- package/scripts/gds/cost.js +47 -0
- package/scripts/gds/db-backup-nightly.sh +160 -0
- package/scripts/gds/db-backup-offsite.sh +152 -0
- package/scripts/gds/demote.js +40 -0
- package/scripts/gds/design-sync.js +62 -0
- package/scripts/gds/diagnose-achievements.js +118 -0
- package/scripts/gds/diagram-facts.js +319 -0
- package/scripts/gds/discipline-modes.json +25 -0
- package/scripts/gds/discord-channels.js +66 -0
- package/scripts/gds/do-api.js +176 -0
- package/scripts/gds/docs-entropy.js +403 -0
- package/scripts/gds/doctor.js +389 -0
- package/scripts/gds/feedback-latest.js +94 -0
- package/scripts/gds/fetch-art-key.js +106 -0
- package/scripts/gds/fetch-sound-prefs.js +88 -0
- package/scripts/gds/figma-design-sync.js +61 -0
- package/scripts/gds/fitness.js +1446 -0
- package/scripts/gds/gate-review.js +322 -0
- package/scripts/gds/gating.js +325 -0
- package/scripts/gds/gds-db-backup.service +24 -0
- package/scripts/gds/gds-db-backup.timer +20 -0
- package/scripts/gds/gds-db-offsite.service +29 -0
- package/scripts/gds/gds-db-offsite.timer +18 -0
- package/scripts/gds/gen-api-client.js +508 -0
- package/scripts/gds/gen-api-docs.js +1037 -0
- package/scripts/gds/gen-atlas.js +366 -0
- package/scripts/gds/gen-diagrams.js +608 -0
- package/scripts/gds/gen-file-map.js +196 -0
- package/scripts/gds/gen-repo-map.js +519 -0
- package/scripts/gds/gen-session-index.js +210 -0
- package/scripts/gds/git-merge-regen.js +147 -0
- package/scripts/gds/grade-smoke.js +205 -0
- package/scripts/gds/hooks/pre-push.js +169 -0
- package/scripts/gds/http-api-client.js +88 -0
- package/scripts/gds/init.js +903 -0
- package/scripts/gds/install-git-hooks.js +114 -0
- package/scripts/gds/key-card.js +213 -0
- package/scripts/gds/key-status.js +126 -0
- package/scripts/gds/land-watch.js +168 -0
- package/scripts/gds/learning-capture.js +145 -0
- package/scripts/gds/lib.sh +44 -0
- package/scripts/gds/linkify-refs.js +473 -0
- package/scripts/gds/local-preview-lib.js +159 -0
- package/scripts/gds/local-preview.js +95 -0
- package/scripts/gds/login.js +225 -0
- package/scripts/gds/main-audit.js +279 -0
- package/scripts/gds/me.js +88 -0
- package/scripts/gds/memory-map.js +174 -0
- package/scripts/gds/merge-lock.js +71 -0
- package/scripts/gds/migration-namespace.js +200 -0
- package/scripts/gds/mirror-lineage-check.js +319 -0
- package/scripts/gds/mirror-redact.js +305 -0
- package/scripts/gds/module.js +482 -0
- package/scripts/gds/newcomer-floor.config.json +13 -0
- package/scripts/gds/newcomer-floor.js +415 -0
- package/scripts/gds/newcomer-floor.templates.json +86 -0
- package/scripts/gds/newcomer-floor.test.js +235 -0
- package/scripts/gds/next-number.js +163 -0
- package/scripts/gds/oauth-secret.js +197 -0
- package/scripts/gds/onboard.js +217 -0
- package/scripts/gds/onboarding-analyze.js +226 -0
- package/scripts/gds/onboarding-config.js +178 -0
- package/scripts/gds/onboarding-ship.js +92 -0
- package/scripts/gds/package-core.js +684 -0
- package/scripts/gds/paste-token.js +131 -0
- package/scripts/gds/portability-smoke-art.sh +85 -0
- package/scripts/gds/portability-smoke-memory.sh +147 -0
- package/scripts/gds/provision.js +1324 -0
- package/scripts/gds/publish-manifest.js +307 -0
- package/scripts/gds/pulse.js +309 -0
- package/scripts/gds/push-main.js +45 -0
- package/scripts/gds/read-session-export.js +359 -0
- package/scripts/gds/reauth.js +149 -0
- package/scripts/gds/recall.js +135 -0
- package/scripts/gds/release.js +71 -0
- package/scripts/gds/render-ideas.js +173 -0
- package/scripts/gds/repo-metrics.js +363 -0
- package/scripts/gds/resolve-skill-model.js +57 -0
- package/scripts/gds/run-routine.js +197 -0
- package/scripts/gds/run-unit-tests.js +178 -0
- package/scripts/gds/sandbox-stage.js +653 -0
- package/scripts/gds/search-ingest-db.js +209 -0
- package/scripts/gds/search-ingest-md.js +225 -0
- package/scripts/gds/security-baseline-check.sh +180 -0
- package/scripts/gds/seed-adopt-tasks.js +75 -0
- package/scripts/gds/seed-api-contract-goal-tasks.js +141 -0
- package/scripts/gds/seed-bongos-app-tasks.js +294 -0
- package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +81 -0
- package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +100 -0
- package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +307 -0
- package/scripts/gds/seed-bongos-module-system-tasks.js +346 -0
- package/scripts/gds/seed-bongos-tasks.js +214 -0
- package/scripts/gds/seed-gds-v4-tasks.js +624 -0
- package/scripts/gds/seed-governance-tasks.js +340 -0
- package/scripts/gds/seed-medusa-tasks.js +440 -0
- package/scripts/gds/seed-module-upstreaming.js +219 -0
- package/scripts/gds/seed-productization-tasks.js +235 -0
- package/scripts/gds/seed-provisioning-tasks.js +83 -0
- package/scripts/gds/seed-staging.sh +104 -0
- package/scripts/gds/seed-v2-world-tasks.js +283 -0
- package/scripts/gds/seed-v3-tasks.js +1981 -0
- package/scripts/gds/session-cost.js +393 -0
- package/scripts/gds/session-digest.js +179 -0
- package/scripts/gds/session-eval.js +576 -0
- package/scripts/gds/session.js +404 -0
- package/scripts/gds/setup.js +504 -0
- package/scripts/gds/shell.js +100 -0
- package/scripts/gds/ship.js +3618 -0
- package/scripts/gds/smoke-batch-claim.sh +213 -0
- package/scripts/gds/smoke-batch-release.sh +296 -0
- package/scripts/gds/smoke-box.sh +150 -0
- package/scripts/gds/smoke-claim-consistency.sh +212 -0
- package/scripts/gds/smoke-dependencies.sh +84 -0
- package/scripts/gds/smoke-gds.js +125 -0
- package/scripts/gds/smoke-write.sh +168 -0
- package/scripts/gds/start.js +782 -0
- package/scripts/gds/status.js +365 -0
- package/scripts/gds/triage.js +366 -0
- package/scripts/gds/upgrade.js +421 -0
- package/scripts/gds/validate-design.js +254 -0
- package/scripts/gds/version-close.js +549 -0
- package/scripts/migrate.sh +183 -0
- package/scripts/migrate_cost_ledger.sh +178 -0
- package/scripts/public-mirror-export.js +291 -0
- package/scripts/render-diagrams.sh +88 -0
- package/scripts/security/dep-audit.js +276 -0
- package/scripts/setup-builder.js +274 -0
- package/scripts/setup-builder.sh +28 -0
- package/scripts/snapshots/backfill-history.mjs +292 -0
- package/scripts/snapshots/maybe-render-on-deploy.sh +66 -0
- package/scripts/snapshots/render-pre-art-eras.mjs +329 -0
- package/scripts/snapshots/render-world.mjs +322 -0
- package/scripts/status-mirror-sync.js +192 -0
- package/scripts/status-probe.mjs +185 -0
- package/server.js +212 -0
- package/src/asset-version.js +71 -0
- package/src/bongos/CLAUDE.md +64 -0
- package/src/bongos/api-errors.js +281 -0
- package/src/bongos/api-path-404.js +67 -0
- package/src/bongos/api-prefix.js +38 -0
- package/src/bongos/app-pair.js +172 -0
- package/src/bongos/auth.js +979 -0
- package/src/bongos/cascade-dispatch.js +123 -0
- package/src/bongos/db-kernel.js +252 -0
- package/src/bongos/db.js +911 -0
- package/src/bongos/goal-scope-check.js +120 -0
- package/src/bongos/hierarchy-config.js +189 -0
- package/src/bongos/live-channel.js +145 -0
- package/src/bongos/llm-cache.js +260 -0
- package/src/bongos/llm-pricing.js +220 -0
- package/src/bongos/metrics.js +286 -0
- package/src/bongos/middleware/audit.js +274 -0
- package/src/bongos/middleware/error-envelope.js +93 -0
- package/src/bongos/middleware/rate-limit.js +195 -0
- package/src/bongos/module-scope-map.js +271 -0
- package/src/bongos/optimizer.js +166 -0
- package/src/bongos/path-match.js +47 -0
- package/src/bongos/permission-path-check.js +248 -0
- package/src/bongos/pool.js +55 -0
- package/src/bongos/repo-info.js +91 -0
- package/src/bongos/route-rank-check.js +420 -0
- package/src/bongos/routes/CLAUDE.md +43 -0
- package/src/bongos/routes/_helpers.js +369 -0
- package/src/bongos/routes/audit-log.js +59 -0
- package/src/bongos/routes/auth.js +755 -0
- package/src/bongos/routes/backup.js +104 -0
- package/src/bongos/routes/builders.js +526 -0
- package/src/bongos/routes/healthz.js +16 -0
- package/src/bongos/routes/instance.js +129 -0
- package/src/bongos/routes/live.js +125 -0
- package/src/bongos/routes/llm-cache.js +119 -0
- package/src/bongos/routes/me.js +380 -0
- package/src/bongos/routes/modules.js +131 -0
- package/src/bongos/routes/optimizer.js +54 -0
- package/src/bongos/routes/public.js +476 -0
- package/src/bongos/routes/security.js +207 -0
- package/src/bongos/routes.js +166 -0
- package/src/bongos/secret-box.js +177 -0
- package/src/bongos/sensitive-surfaces.js +30 -0
- package/src/bongos/serve-internal.js +889 -0
- package/src/bongos/uptime-poller.js +90 -0
- package/src/bongos-downloads.js +70 -0
- package/src/branding.js +182 -0
- package/src/build-info.js +77 -0
- package/src/devbox-downloads.js +67 -0
- package/src/instance-config.js +200 -0
- package/src/module-api.js +366 -0
- package/src/module-loader/loader.js +268 -0
- package/src/module-loader/manifest-schema.js +140 -0
- package/src/module-loader/provenance.js +28 -0
- package/src/module-loader/semver.js +100 -0
- package/src/module-seams.js +291 -0
- package/src/modules.js +254 -0
- package/src/platform-server.js +135 -0
- package/src/ui/adapters/claude-design/index.js +333 -0
- package/src/ui/adapters/figma/index.js +328 -0
- package/tests/abandon_task.mjs +138 -0
- package/tests/achievements_reconcile.mjs +167 -0
- package/tests/adopt_detect.mjs +141 -0
- package/tests/adopt_import.mjs +132 -0
- package/tests/adopt_preflight.mjs +105 -0
- package/tests/anti_grid.mjs +89 -0
- package/tests/api_client.mjs +231 -0
- package/tests/api_docs.mjs +283 -0
- package/tests/api_error_envelope_buildcheck.mjs +56 -0
- package/tests/api_error_envelope_middleware.mjs +99 -0
- package/tests/api_error_registry.mjs +108 -0
- package/tests/api_pagination_contract.mjs +51 -0
- package/tests/api_path_404.mjs +96 -0
- package/tests/app_pair.mjs +168 -0
- package/tests/architect.mjs +140 -0
- package/tests/art_key.mjs +121 -0
- package/tests/art_stage.mjs +121 -0
- package/tests/asset_version.mjs +94 -0
- package/tests/atlas.mjs +69 -0
- package/tests/audit_deps.mjs +74 -0
- package/tests/audit_middleware.mjs +385 -0
- package/tests/auth_admission_gate.mjs +164 -0
- package/tests/auth_anthropic_identity.mjs +95 -0
- package/tests/auth_duplicate_cookie.mjs +56 -0
- package/tests/auth_error_brand.mjs +77 -0
- package/tests/auth_flow_slice1.mjs +223 -0
- package/tests/auth_inactive_builder.mjs +94 -0
- package/tests/auth_page_gate.mjs +92 -0
- package/tests/auth_session_ttl.mjs +155 -0
- package/tests/autonomous_fit_protected_paths.mjs +115 -0
- package/tests/autonomy_gate.mjs +85 -0
- package/tests/autotile_variants.mjs +256 -0
- package/tests/autotile_xverify.mjs +133 -0
- package/tests/backfill_sessions.mjs +101 -0
- package/tests/backfill_task_rewards.mjs +152 -0
- package/tests/backup_cli.mjs +104 -0
- package/tests/bfg.mjs +327 -0
- package/tests/bfg_write.mjs +423 -0
- package/tests/bongos_box_connect.mjs +89 -0
- package/tests/bongos_dispatch.mjs +74 -0
- package/tests/bongos_downloads.mjs +118 -0
- package/tests/bongos_login.mjs +34 -0
- package/tests/box_access.mjs +186 -0
- package/tests/box_auth_check.mjs +114 -0
- package/tests/box_code_staleness.mjs +116 -0
- package/tests/box_connect_e2e.mjs +196 -0
- package/tests/box_cost.mjs +70 -0
- package/tests/box_dns_repoint.mjs +151 -0
- package/tests/box_host_keys.mjs +102 -0
- package/tests/box_onboard.mjs +317 -0
- package/tests/box_scope_session.mjs +115 -0
- package/tests/box_ship_permissions.mjs +71 -0
- package/tests/box_terminal_ssrf.mjs +90 -0
- package/tests/boxes.mjs +1255 -0
- package/tests/branding.mjs +88 -0
- package/tests/bug_attachments.mjs +189 -0
- package/tests/build_info.mjs +88 -0
- package/tests/builder_needs.mjs +99 -0
- package/tests/cap_newcomer_tasks.mjs +114 -0
- package/tests/cascade-dispatch.mjs +95 -0
- package/tests/cf_tunnel.mjs +459 -0
- package/tests/claim_recall.mjs +150 -0
- package/tests/claims_bind_session.mjs +47 -0
- package/tests/claude_materialize.mjs +148 -0
- package/tests/cli_box_scope.mjs +52 -0
- package/tests/cli_lib_formatters.mjs +87 -0
- package/tests/cli_token_reissue.mjs +147 -0
- package/tests/client_bundle_route.mjs +47 -0
- package/tests/cloud_bongos_pack.mjs +85 -0
- package/tests/conductor.mjs +496 -0
- package/tests/confirm_attribution.mjs +156 -0
- package/tests/conflict_resolve.mjs +462 -0
- package/tests/context_pack.mjs +240 -0
- package/tests/cost.mjs +94 -0
- package/tests/cost_audit.mjs +122 -0
- package/tests/cost_budget_status.mjs +78 -0
- package/tests/cost_reconcile.mjs +102 -0
- package/tests/cost_summary_shape.mjs +94 -0
- package/tests/credit_grant.mjs +376 -0
- package/tests/criterion_progress.mjs +220 -0
- package/tests/criterion_proposal.mjs +109 -0
- package/tests/criterion_ref_parse.mjs +53 -0
- package/tests/currency_label.mjs +119 -0
- package/tests/day_cycle.mjs +197 -0
- package/tests/dependencies_migration.mjs +77 -0
- package/tests/dependencies_polymorphic.mjs +212 -0
- package/tests/deploy_instance.mjs +78 -0
- package/tests/devbox_downloads.mjs +122 -0
- package/tests/diff_derived_signals.mjs +115 -0
- package/tests/discord_approvals.mjs +174 -0
- package/tests/discord_autojoin.mjs +158 -0
- package/tests/discord_bot.mjs +94 -0
- package/tests/discord_bugs.mjs +297 -0
- package/tests/discord_channels.mjs +337 -0
- package/tests/discord_foundation.mjs +76 -0
- package/tests/discord_inbound.mjs +190 -0
- package/tests/discord_message_buffer.mjs +87 -0
- package/tests/discord_oauth.mjs +55 -0
- package/tests/discord_reaction.mjs +170 -0
- package/tests/discord_role_sync.mjs +151 -0
- package/tests/display_name.mjs +123 -0
- package/tests/dns_preflight.mjs +74 -0
- package/tests/event_sound_prefs.mjs +194 -0
- package/tests/eviction_policy.mjs +279 -0
- package/tests/figma_adapter.mjs +199 -0
- package/tests/file_map.mjs +91 -0
- package/tests/first_admin_bootstrap.mjs +40 -0
- package/tests/fitness.mjs +435 -0
- package/tests/fitness_two_root.mjs +104 -0
- package/tests/fixtures/session-506-digest.json +34 -0
- package/tests/gate_approvals.mjs +451 -0
- package/tests/gate_review.mjs +152 -0
- package/tests/git_merge_regen.mjs +151 -0
- package/tests/github_push_ancestry.mjs +119 -0
- package/tests/github_push_land_proof.mjs +127 -0
- package/tests/github_push_merge_driver.mjs +175 -0
- package/tests/goal_abuse_matrix.mjs +187 -0
- package/tests/goal_achievement.mjs +146 -0
- package/tests/goal_conflicts.mjs +305 -0
- package/tests/goal_dependencies_read.mjs +73 -0
- package/tests/goal_member_roles.mjs +420 -0
- package/tests/goal_membership_requests.mjs +332 -0
- package/tests/goal_routes.mjs +203 -0
- package/tests/goal_scope_check.mjs +167 -0
- package/tests/goal_tier.mjs +312 -0
- package/tests/goal_wall_proof.mjs +112 -0
- package/tests/grade_attempts.mjs +73 -0
- package/tests/grade_attribution.mjs +117 -0
- package/tests/grade_diff_hash.mjs +191 -0
- package/tests/grade_server_authoritative.mjs +305 -0
- package/tests/grade_unavailable_display.mjs +66 -0
- package/tests/grader.mjs +1960 -0
- package/tests/grader_bypass.mjs +57 -0
- package/tests/grader_panel.mjs +252 -0
- package/tests/grader_prompt_fencing.mjs +192 -0
- package/tests/helpers.mjs +52 -0
- package/tests/hierarchy-config.mjs +81 -0
- package/tests/init.mjs +463 -0
- package/tests/instance_config.mjs +76 -0
- package/tests/instance_manifest.mjs +110 -0
- package/tests/interaction_prefs.mjs +72 -0
- package/tests/key-card.mjs +110 -0
- package/tests/key-status.mjs +45 -0
- package/tests/land_watch.mjs +115 -0
- package/tests/lifecycle-card.mjs +145 -0
- package/tests/lifecycle_breakdown_view.mjs +236 -0
- package/tests/linkify_refs.mjs +264 -0
- package/tests/live_channel.mjs +128 -0
- package/tests/live_sse.mjs +122 -0
- package/tests/llm-cache-route.mjs +110 -0
- package/tests/llm-cache.mjs +140 -0
- package/tests/llm-pricing.mjs +152 -0
- package/tests/local_preview.mjs +136 -0
- package/tests/main_audit.mjs +137 -0
- package/tests/memory_isolation.mjs +431 -0
- package/tests/memory_map.mjs +107 -0
- package/tests/memory_pull.mjs +429 -0
- package/tests/merge_lease.mjs +100 -0
- package/tests/merge_lock.mjs +312 -0
- package/tests/metrics.mjs +147 -0
- package/tests/migration_allocation.mjs +146 -0
- package/tests/migration_namespace.mjs +185 -0
- package/tests/migrations_fresh_replay_guard.mjs +38 -0
- package/tests/mirror_lineage_fulltree.mjs +45 -0
- package/tests/mirror_lineage_proof.mjs +72 -0
- package/tests/mirror_redact.mjs +193 -0
- package/tests/model_alloc_prefs.mjs +63 -0
- package/tests/module-scope-map.mjs +88 -0
- package/tests/module_api.mjs +110 -0
- package/tests/module_cli.mjs +292 -0
- package/tests/module_contributions.mjs +148 -0
- package/tests/module_loader.mjs +286 -0
- package/tests/module_manifest.mjs +194 -0
- package/tests/module_owned_tests.mjs +105 -0
- package/tests/module_provenance.mjs +34 -0
- package/tests/module_route_rank.mjs +147 -0
- package/tests/module_seams.mjs +68 -0
- package/tests/modules.mjs +156 -0
- package/tests/modules_route.mjs +38 -0
- package/tests/newcomer_floor.mjs +17 -0
- package/tests/newcomer_restock.mjs +80 -0
- package/tests/next_number.mjs +154 -0
- package/tests/oauth_secret.mjs +60 -0
- package/tests/onboard.mjs +70 -0
- package/tests/onboarding_gate.mjs +267 -0
- package/tests/onboarding_observability.mjs +344 -0
- package/tests/onboarding_route_signals.mjs +175 -0
- package/tests/onboarding_state.mjs +346 -0
- package/tests/one_active_claim_per_session.mjs +111 -0
- package/tests/orphaned_claim_ship.mjs +135 -0
- package/tests/override_attribution.mjs +142 -0
- package/tests/override_request_ownership.mjs +235 -0
- package/tests/package_core.mjs +435 -0
- package/tests/parallel-load.mjs +402 -0
- package/tests/path_match.mjs +62 -0
- package/tests/permission_path.mjs +151 -0
- package/tests/platform_boot.mjs +167 -0
- package/tests/pre_compact.mjs +60 -0
- package/tests/preview_server.mjs +127 -0
- package/tests/profile_route.mjs +197 -0
- package/tests/provision.mjs +805 -0
- package/tests/provisioning_github_app_routes.mjs +98 -0
- package/tests/public_mirror_export.mjs +124 -0
- package/tests/public_task_resolver.mjs +112 -0
- package/tests/publish_branch_route.mjs +422 -0
- package/tests/publish_manifest.mjs +184 -0
- package/tests/publish_reconciler.mjs +728 -0
- package/tests/rank_gate.mjs +463 -0
- package/tests/rate_limit_public.mjs +217 -0
- package/tests/read_session_export.mjs +89 -0
- package/tests/recall_cli.mjs +82 -0
- package/tests/recall_hints.mjs +119 -0
- package/tests/recent_shipped_window.mjs +80 -0
- package/tests/regrade_eligibility.mjs +202 -0
- package/tests/render_prefs.mjs +122 -0
- package/tests/repo_map.mjs +92 -0
- package/tests/reward_gate.mjs +284 -0
- package/tests/route_rank_check.mjs +243 -0
- package/tests/route_validation.mjs +490 -0
- package/tests/routine_timers.mjs +72 -0
- package/tests/rubric_fixtures.mjs +140 -0
- package/tests/run_routine.mjs +69 -0
- package/tests/sandbox_stage.mjs +582 -0
- package/tests/scrubber_corpus.mjs +257 -0
- package/tests/search_chunker.mjs +209 -0
- package/tests/search_ingest.mjs +96 -0
- package/tests/search_ingest_db.mjs +88 -0
- package/tests/search_isolation.mjs +204 -0
- package/tests/search_route.mjs +95 -0
- package/tests/secret_box.mjs +189 -0
- package/tests/security_docs.mjs +186 -0
- package/tests/security_route.mjs +108 -0
- package/tests/served_paths_shipped.mjs +118 -0
- package/tests/session-cards.mjs +142 -0
- package/tests/session_506_regression.mjs +69 -0
- package/tests/session_caps.mjs +238 -0
- package/tests/session_cost.mjs +133 -0
- package/tests/session_digest.mjs +73 -0
- package/tests/session_eval.mjs +386 -0
- package/tests/session_index.mjs +105 -0
- package/tests/session_records.mjs +369 -0
- package/tests/session_search.mjs +78 -0
- package/tests/session_start_freshness.mjs +123 -0
- package/tests/setup_smoke.mjs +154 -0
- package/tests/ship_autolinkify.mjs +60 -0
- package/tests/ship_automerge_injection.mjs +174 -0
- package/tests/ship_broadcast_routing.mjs +125 -0
- package/tests/ship_broadcast_server.mjs +175 -0
- package/tests/ship_card.mjs +280 -0
- package/tests/ship_ci_deploy.mjs +374 -0
- package/tests/ship_preflight.mjs +368 -0
- package/tests/ship_premerge.mjs +75 -0
- package/tests/ship_resume.mjs +129 -0
- package/tests/ship_upload_skip.mjs +89 -0
- package/tests/ship_zero_commit.mjs +60 -0
- package/tests/single_host_hall.mjs +98 -0
- package/tests/skill_prefs.mjs +150 -0
- package/tests/smoke_preflight.mjs +66 -0
- package/tests/snapshot_picker.mjs +233 -0
- package/tests/sound_prefs.mjs +198 -0
- package/tests/sprite_facing.mjs +35 -0
- package/tests/status-probe.mjs +89 -0
- package/tests/status_backfill.mjs +94 -0
- package/tests/stop_refcheck.mjs +127 -0
- package/tests/streak.mjs +175 -0
- package/tests/subdomain_auth.mjs +58 -0
- package/tests/task_classifier_vocab.mjs +41 -0
- package/tests/task_create_idempotency.mjs +96 -0
- package/tests/task_goal_link.mjs +93 -0
- package/tests/task_ownership_gate.mjs +125 -0
- package/tests/terrain_picker.mjs +298 -0
- package/tests/touches_overlap.mjs +75 -0
- package/tests/triage_development.mjs +140 -0
- package/tests/turn_in_place.mjs +280 -0
- package/tests/upgrade.mjs +357 -0
- package/tests/verify_task_guard.mjs +64 -0
- package/tests/version_close.mjs +76 -0
- package/tests/versions_route.mjs +93 -0
- package/tests/walkability.mjs +188 -0
- package/tests/wandering_prefs.mjs +176 -0
- package/tests/worktree_disambiguation.mjs +105 -0
- package/tests/worktree_guard.mjs +90 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: merge-mode
|
|
3
|
+
description: Manual fallback for the auto-merge in /builder-ship. Walks every task at status='confirmed' (= verified but not yet on main) and runs the merge + smoke + deploy chain. Triggers when the user says "/merge-mode", "merge the queue", "land confirmed tasks", "land the queue", "do a merge run", or after a /builder-ship reported the auto-merge bailed.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are running the manual merge-mode session for Off the Boats. **`/merge-mode` is a rare last resort, not a routine sweep — and not something to push on other builders.** The server lands merges on its own: `/builder-ship` chains into auto-merge, green PRs auto-merge, a 5-min reconciler flips `confirmed → shipped`, and the [ADR 0082](../../../docs/adr/<redacted>.md) resolver self-heals generated-file conflicts. **Before running this skill, confirm the task is genuinely stuck** — still at `confirmed` more than ~5 minutes after its ship because of a conflict or regression the server couldn't auto-resolve. If you haven't waited for the sweep yet, stop and wait. This skill is for the strand that survives all of that — usually a cross-branch / non-generated-file conflict, a smoke regression, or a `--no-merge` ship.
|
|
7
|
+
|
|
8
|
+
The queue this skill works against is **tasks at status='confirmed'**. Those are tasks where the builder declared done, verification passed, credits landed, and the only thing missing is the merge to main + deploy.
|
|
9
|
+
|
|
10
|
+
## What this skill does
|
|
11
|
+
|
|
12
|
+
1. Lists tasks at status='confirmed' via the API (or falls back to inventorying every `claude/*` branch ahead of main).
|
|
13
|
+
2. For each, finds the branch (`claude/<worktree_name>` from the claim).
|
|
14
|
+
3. Merges in order (independent first, then conflict-prone), resolves conflicts manually with the user. **The `git merge` is itself the collision detector** — the predictive touches[] drift scanner was deleted (touches[] cleanup [4/8], task 879); a real conflict surfaces here, at the authoritative moment, not as an up-front prediction.
|
|
15
|
+
4. After all merges: smoke + push + deploy.
|
|
16
|
+
5. For each merged task, calls `POST /api/gds/tasks/:id/ship` to flip the task from `confirmed` → `shipped`.
|
|
17
|
+
|
|
18
|
+
## How to use
|
|
19
|
+
|
|
20
|
+
> **Environment note:** merge-mode is an **ops procedure** — it mutates the single
|
|
21
|
+
> main worktree and deploys to the Linux droplet (owner-gated SSH). The git /
|
|
22
|
+
> `ssh` / `deploy.sh` / branch-inventory steps below assume a bash environment
|
|
23
|
+
> (the Archon's Mac/Linux or the droplet) by design and are NOT a Windows-builder
|
|
24
|
+
> concern. The GDS *API* calls, however, go through the cross-platform
|
|
25
|
+
> `node scripts/gds/api.js` helper so they work regardless of shell.
|
|
26
|
+
|
|
27
|
+
**Step 1 — list the queue: tasks at confirmed.**
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
node scripts/gds/api.js GET "/api/gds/tasks?status=confirmed"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
If the list is empty, print "no tasks at confirmed — auto-merge in /builder-ship handled them all" and exit.
|
|
34
|
+
|
|
35
|
+
**Step 2 — acquire the shared merge lock, then sync main and inventory the relevant branches.**
|
|
36
|
+
|
|
37
|
+
⚠️ **Acquire the merge lock FIRST** (V3.R50 / #269, criterion C6). `/builder-ship`'s auto-merge and this skill both mutate the *same* main worktree; they share one mutex so a ship in another session can't collide with your hand-merge. If `acquire` reports the lock is held, a ship is mid-merge — wait and retry, or run `status` to inspect the holder. **You MUST release it in Step 6 (and on any abort).**
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Anchor to the main checkout root regardless of which worktree this skill was invoked from.
|
|
41
|
+
# `git rev-parse --git-common-dir` returns the shared `.git` path; its parent is the main checkout.
|
|
42
|
+
# (Rename-proof — survives Desktop folder renames, unlike a hardcoded absolute path.)
|
|
43
|
+
REPO_ROOT="$(dirname "$(git rev-parse --git-common-dir)")"
|
|
44
|
+
cd "$REPO_ROOT"
|
|
45
|
+
|
|
46
|
+
node scripts/gds/merge-lock.js acquire # blocks up to 30s; exit 3 if a ship/merge holds it — then STOP and retry later
|
|
47
|
+
# (exit 0 = you hold the lock; proceed. exit 3 = held by another run; do not force past this.)
|
|
48
|
+
|
|
49
|
+
find .git -name "* 2" -delete # macOS Finder iCloud duplicates — known recurring snag
|
|
50
|
+
git fetch --all --prune
|
|
51
|
+
git checkout main
|
|
52
|
+
git pull --ff-only origin main
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The branch for each confirmed task is named `claude/<worktree_name>` — the claim row carries the worktree_name. List branches with unmerged work to cross-reference:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
for b in $(git for-each-ref --format='%(refname:short)' refs/heads/claude/); do
|
|
59
|
+
count=$(git rev-list --count main..$b 2>/dev/null)
|
|
60
|
+
if [ "$count" != "0" ] && [ -n "$count" ]; then
|
|
61
|
+
echo "$count commits | $b"
|
|
62
|
+
fi
|
|
63
|
+
done
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Step 3 — (removed.)** No separate scan step: the `git merge` in Step 4 is the authoritative collision detector (the predictive touches[] drift scanner was deleted, task 879).
|
|
67
|
+
|
|
68
|
+
**Step 4 — merge each confirmed task.**
|
|
69
|
+
|
|
70
|
+
For each confirmed task, take its branch name (`claude/<worktree_name>` from the claim) and merge.
|
|
71
|
+
|
|
72
|
+
⚠️ **The task `value_summary` is untrusted, DB-sourced text — never paste it into a shell command.** A `value_summary` containing `$(...)` or backticks would execute as a command the moment the shell parses your command line — even inside double quotes, even as a `printf` argument (the shell expands it *before* the program runs). This is the #681 injection class, which `ship.js`'s auto-merge fixes by dropping the shell entirely. So: **use the Write/editor tool (not a heredoc or `echo`/`printf`) to write the merge message to a file**, then merge with `-F` so the summary never touches the shell:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Write /tmp/otb-merge-msg.txt with the Write tool — content is literally:
|
|
76
|
+
# Merge <branch-name>: <task value_summary>
|
|
77
|
+
# …but first rewrite any "#NNN" in the summary to "task NNN" (task 916): commit
|
|
78
|
+
# messages are GitHub-rendered and a bare "#NNN" autolinks to a dead GitHub
|
|
79
|
+
# issue number, not the GDS task.
|
|
80
|
+
git merge --no-ff <branch-name> -F /tmp/otb-merge-msg.txt
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
If conflicts: resolve manually (typically "keep both blocks" for independent route additions, but post-Phase-1 sub-router refactor these should be rare), `node -c <file>` to syntax-check, `git add <file>`, `git commit --no-edit`.
|
|
84
|
+
|
|
85
|
+
Group branches into:
|
|
86
|
+
- **Independent files** (no overlap with any other queued branch) → merge first
|
|
87
|
+
- **Shared-file branches** → merge in sequence, expect light conflicts
|
|
88
|
+
|
|
89
|
+
**Step 4b — refresh the auto-generated diagrams (task #357).**
|
|
90
|
+
|
|
91
|
+
After all merges, on `main`, regenerate the 3 mechanical onboarding diagrams from live facts so `/builders/diagrams` stays current. If anything changed, commit it onto main before pushing:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
node scripts/gds/gen-diagrams.js # regenerate + render (no-op if already current)
|
|
95
|
+
git -C "$REPO_ROOT" add docs/onboarding/diagrams
|
|
96
|
+
git -C "$REPO_ROOT" diff --cached --quiet || \
|
|
97
|
+
git -C "$REPO_ROOT" commit -m "chore(diagrams): auto-regenerate mechanical diagrams from live facts (task 357)"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
This mirrors what `ship.js` does automatically; it's here because /merge-mode deploys without going through ship.js's auto-merge.
|
|
101
|
+
|
|
102
|
+
**Step 5 — smoke tests, push, deploy.**
|
|
103
|
+
|
|
104
|
+
> **Deploy mode (#679 / [ADR 0042](../../../docs/adr/<redacted>.md)).** `config/deploy.json` is now `mode: ci` (CI cutover landed 2026-06-13), so the **`ci`** path is current: there is no laptop merge and no SSH at all — landing happens via PR auto-merge and [`.github/workflows/deploy-prod.yml`](../../../.github/workflows/deploy-prod.yml) deploys `main`→prod from Actions. In `ci` mode, do NOT run the `git push origin main` + `ssh … ~/deploy.sh` lines below — instead confirm the PR auto-merged and the `deploy-prod` Actions run went green. The block below is the **legacy `laptop`** deploy mode (the operator's machine pushes `main` and SSHes the droplet) — it is the fallback path and only applies if `config/deploy.json` is reverted to `mode: laptop`. Check the active mode with `node -e "const s=require('./scripts/gds/ship.js'),fs=require('fs');let c=null;try{c=fs.readFileSync('config/deploy.json','utf8')}catch{}console.log(s.parseDeployMode(process.env.OTB_DEPLOY_MODE,c))"`.
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
node scripts/gds/smoke-gds.js # 16/16 expected (cross-platform; replaces smoke-gds.sh)
|
|
108
|
+
bash scripts/gds/smoke-write.sh # 4/4 expected
|
|
109
|
+
node scripts/gds/push-main.js # SEC #863: the sanctioned gated main-push (NOT raw `git push origin main`)
|
|
110
|
+
ssh -o ConnectTimeout=10 lars@REDACTED_IP "~/deploy.sh"
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
> **SEC #863 (ADR 0043):** push `main` only via `node scripts/gds/push-main.js`. A raw `git push origin main` is now blocked by the pre-push permission gate — that block is the friction that stops an ad-hoc bypass like the Builder 25 incident. `push-main.js` carries the `OTB_ALLOW_MAIN_PUSH` override because /merge-mode only ever lands tasks that already passed the grader + the Archon confirm gate. The post-push main audit (`node scripts/gds/main-audit.js`) re-checks regardless.
|
|
114
|
+
|
|
115
|
+
The deploy script applies any new migrations, restarts the service, and curls /healthz.
|
|
116
|
+
|
|
117
|
+
**Step 5b — delete the merged branches on origin (standard practice).**
|
|
118
|
+
|
|
119
|
+
After main is updated AND the deploy verified, every branch that just landed is permanently in main's history (—no-ff merge commits). Delete each on origin so GitHub stops offering empty PRs and so the builder UI stays clean:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
for b in <branch-1> <branch-2> ...; do
|
|
123
|
+
git push origin --delete "$b" || echo "warn: $b already gone"
|
|
124
|
+
done
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Non-blocking — a "branch already deleted" warning is fine. The local `refs/heads/<branch>` and `refs/remotes/origin/<branch>` clean up on next `git fetch --prune`. The worktree directories themselves stay — only the branch refs are deleted.
|
|
128
|
+
|
|
129
|
+
**Step 5c — release the merge lock.**
|
|
130
|
+
|
|
131
|
+
Now that the merge + deploy is done (or if you're aborting), release the lock acquired in Step 2 so the next ship/merge can proceed:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
node scripts/gds/merge-lock.js release
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
This is mandatory on every exit path — including aborts and conflicts you decide not to resolve. A manual hold left behind is reclaimed automatically after 30 minutes, but releasing promptly keeps the queue flowing.
|
|
138
|
+
|
|
139
|
+
**Step 6 — flip each merged task from confirmed → shipped.**
|
|
140
|
+
|
|
141
|
+
For each task that successfully merged + deployed:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
node scripts/gds/api.js POST /api/gds/tasks/<task-id>/ship
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
The `POST /tasks/:id/ship` endpoint flips the task to `shipped`, stamps `shipped_at`. No credit implication — credits already landed at confirmed.
|
|
148
|
+
|
|
149
|
+
**Step 7 — surface a summary.**
|
|
150
|
+
|
|
151
|
+
Report to the user:
|
|
152
|
+
- Confirmed tasks reviewed (count)
|
|
153
|
+
- Tasks shipped this run (count + ids + value summaries)
|
|
154
|
+
- Tasks blocked by drift or merge conflicts (count + ids + what's blocking)
|
|
155
|
+
- Smoke test results
|
|
156
|
+
- Deploy result
|
|
157
|
+
|
|
158
|
+
If anything is blocked or failed, name what specifically needs to happen next (amend touches[], resolve conflict, fix smoke regression). Tasks that bailed stay at `confirmed` for the next /merge-mode pass.
|
|
159
|
+
|
|
160
|
+
## When to skip a step
|
|
161
|
+
|
|
162
|
+
- **No tasks at confirmed?** Print "queue clean — auto-merge in /builder-ship handled them all" and exit.
|
|
163
|
+
- **A confirmed task has no matching branch?** Either the branch was already deleted or the worktree_name on the claim doesn't match a real branch. Surface this — usually means the auto-merge in /builder-ship succeeded but the task didn't transition to shipped (look for a stuck state). Manual `POST /tasks/:id/ship` may be needed.
|
|
164
|
+
- **Conflict resolution ambiguous?** Stop and ask the user before guessing — destructive actions like `git reset` or `--no-verify` are NOT allowed without explicit confirmation. **Release the merge lock (`node scripts/gds/merge-lock.js release`) before pausing** so a queued ship isn't blocked while you wait on the user.
|
|
165
|
+
- **Lock held when you try to acquire (exit 3)?** A ship or another merge run is actively mutating main. Do NOT force past it — wait and retry, or run `node scripts/gds/merge-lock.js status` to see the holder's age (it auto-reclaims if stale).
|
|
166
|
+
|
|
167
|
+
## When to run
|
|
168
|
+
|
|
169
|
+
The auto-merge in `/builder-ship` handles ~95% of cases; run this on demand for the rest — when `/builder-ship` reports "auto-merge: bailed; task stays at confirmed", or `/builder-start` shows tasks stuck at `confirmed`.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: new-project
|
|
3
|
+
description: The agent-guided runbook that takes a new owner from zero to a live, owned STANDALONE Cloud Bongos instance (own repo + pinned @cloudbongos/core, ADR 0108) through ONE canonical step sequence — decide name+address, bongos init, scaffold the standalone repo, provision core+DB+address+service, GitHub OAuth app + verified secret + first sign-in, verify, brand. Triggers when the user says "/new-project", "start a new project", "stand up a new instance", "onboard a new Cloud Bongos instance", "create a new project", or "spin up a new instance". This skill IS the canonical sequence; the `bongos onboard` CLI (task 1982) and the hall "start a project" wizard (task 1983) are forms over it. Standalone model only.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are guiding a new owner from **zero to a live, owned Cloud Bongos instance**. This skill is the **canonical step sequence** (goal 35). The `bongos onboard` CLI and the hall wizard are just other front-ends over these same steps — keep them in lockstep by keeping the sequence here.
|
|
7
|
+
|
|
8
|
+
## The model (read first)
|
|
9
|
+
|
|
10
|
+
A new instance is **standalone** (ADR 0108): it runs from its **own git repo** with `@cloudbongos/core` installed as a **pinned npm dependency**, not a fork of this monorepo. Central updates are a `bongos upgrade` version-pin bump, not a merge. Every step below assumes this shape (`hosting_shape=standalone`).
|
|
11
|
+
|
|
12
|
+
Four steps are **irreducibly human** and must be rendered as **precise, UI-first, copy-paste-safe prompts** (a non-technical owner does them with browser clicks, no terminal guessing): (1) create the GitHub repo, (2) approve the pre-filled **GitHub App** for sign-in (ONE click — the App Manifest flow, task 2080; no secret to paste), (3) own a domain, (4) the first sign-in. Everything else is automated. Never ask the owner to do in a terminal what they can do with a click.
|
|
13
|
+
|
|
14
|
+
## The canonical sequence
|
|
15
|
+
|
|
16
|
+
### 1. Decide name + address
|
|
17
|
+
|
|
18
|
+
Interview the owner for: product name, world name, company; the **GitHub repo** (`owner/name`); the **domain** they will use (bring-your-own — ADR 0111 §4); and a DNS/db-safe **instance slug** (lowercase `[a-z0-9-]`, e.g. `mercury`).
|
|
19
|
+
|
|
20
|
+
**Human-only (UI-first):** have them create an **empty** GitHub repository — github.com → **New repository** → name it, leave it empty (no README), Create. That repo is where the instance's own code will live.
|
|
21
|
+
|
|
22
|
+
### 2. DNS token preflight — BEFORE you commit the address (task 1980)
|
|
23
|
+
|
|
24
|
+
Before anything is provisioned, verify the control-plane's Cloudflare token can actually manage the domain's zone (a mismatched-zone token is exactly what broke the Emersonian standup mid-flow):
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
node scripts/gds/provision.js dns-check <domain>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
- ✓ reachable → continue.
|
|
31
|
+
- ✗ not reachable → **STOP and resolve it now**, don't push past it. The command prints the fix; usually: widen the Cloudflare API token to include the domain's zone (CF dashboard → My Profile → API Tokens → edit → Zone Resources → Include → the zone), then re-run `dns-check` until green. Only then proceed.
|
|
32
|
+
|
|
33
|
+
### 3. `bongos init` — scaffold (greenfield) **or** `--adopt` (brownfield)
|
|
34
|
+
|
|
35
|
+
**This is the one leg that branches** (ADR 0121 §Decision 1). Pick the mode that matches the repo:
|
|
36
|
+
|
|
37
|
+
- **Greenfield** — a NEW, empty repo. The default below.
|
|
38
|
+
- **Brownfield / adopt** — an EXISTING repo (code, history, a backlog). Run `node bin/bongos.js init --adopt` instead. It DETECTS the repo's stack, runs a conflict **pre-flight** (migration-namespace / fitness-boundary / protected-path / CI-check collisions) and writes **nothing until you accept** (interactive y/N, or `--accept`); a genuine BLOCK (e.g. a `core_`-prefixed migration) is a hard stop, not accept-able. On accept it LAYERS the lean config + the pinned `@cloudbongos/core` dep + `.claude/` **additively** (merges-or-leaves-and-reports; never clobbers, never the `--force` path), captures the repo's **REAL** current version/goal, and imports its existing backlog (open GitHub issues via `GITHUB_TOKEN`/`GH_TOKEN`, else a `TODO`/`ROADMAP`/`BACKLOG` file). Then **skip step 4** — adopt layered onto the existing repo, there is no empty repo to scaffold — and continue from step 5 (provision). Every other leg is identical.
|
|
39
|
+
|
|
40
|
+
Greenfield:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
node bin/bongos.js init # interview (or: init --from spec.json for non-interactive)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
It writes lean `config/branding.json` / `config/modules.json` / `config/hierarchy.json`, seeds the first version + its done-when goal, files the human-only kickoff tasks, and — when you opt into hosting — files a **provisioning request** (`POST /provisioning/instances`). Choose **hosting shape `standalone`**. Enable the `provisioning` module on the target so the request is honored (`config/modules.json` → `"provisioning": true`).
|
|
47
|
+
|
|
48
|
+
### 4. Scaffold the standalone repo
|
|
49
|
+
|
|
50
|
+
Materialize the instance's own repo (ADR 0108): clone the empty GitHub repo to the standalone root (`${PROVISION_STANDALONE_BASE:-/srv/cloudbongos}/<slug>` on the control plane), drop in the `config/` + `.claude/` from step 3, and pin the core as a dependency (`@cloudbongos/core` in the instance `package.json`). Commit + push. This checkout is what the standalone service will run from.
|
|
51
|
+
|
|
52
|
+
### 5. Provision — core + DB + address + service (task 1978)
|
|
53
|
+
|
|
54
|
+
The web tier only **enqueued** the request; the **control-plane runner** does the real work (it alone holds the DO/Cloudflare tokens):
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
node scripts/gds/provision.js run-intents --apply # drains the queue
|
|
58
|
+
# or, for one instance: node scripts/gds/provision.js provision <slug> --apply
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
For `standalone` this composes: allocate a port → `git pull` + `npm ci --omit=dev` (installs the pinned core) → `createdb` + **instance-root** migrate (`node_modules/@cloudbongos/core/scripts/migrate.sh`) → per-instance `/etc/<slug>/web.env` → a **standalone systemd unit** (runs the core package's `platform-server.js` from the instance repo) → DNS A-record UPSERT → per-instance Caddy snippet (on-demand TLS) → `/healthz`. It is idempotent + dry-run-by-default (omit `--apply` to preview). It **fail-fasts on the step-2 DNS preflight** if step 2's token check was skipped.
|
|
62
|
+
|
|
63
|
+
### 6. GitHub sign-in — ONE click (App Manifest flow), or a manual OAuth app + first sign-in
|
|
64
|
+
|
|
65
|
+
**Recommended — one click (task 2080, ADR 0133).** GitHub has no create-an-OAuth-App API, but it *does* let us pre-fill a **GitHub App Manifest**: the owner clicks one link, approves on GitHub, and GitHub hands the control plane the credentials automatically — **no OAuth app to hand-create, no secret to copy-paste ever.** From the control-plane hall, **Start a project → “Set up GitHub sign-in”** (the button appears once the instance is requested; it needs the instance's **domain** set). Under the hood it:
|
|
66
|
+
|
|
67
|
+
1. mints a one-time `state` + a pre-filled manifest via `POST /provisioning/instances/:id/github-app`;
|
|
68
|
+
2. the browser POSTs the manifest to GitHub; the owner approves; GitHub redirects to the **mothership** callback `…/api/bongos/provisioning/github-app/callback` with a temporary code;
|
|
69
|
+
3. the **control-plane runner** (`provision.js run-intents --apply`, the sole token-holder) exchanges the code for `client_id`/`client_secret`, writes them into `/etc/<slug>/web.env`, restarts the unit, and verifies `/healthz` reports `auth_configured:true`. The secret never touches the browser, chat, or the web tier (trust boundary, ADR 0111 §2).
|
|
70
|
+
|
|
71
|
+
The instance's sign-in code is **unchanged** — a GitHub App's user token hits the same `GET /user` the OAuth-app flow did; GitHub simply ignores the extra `scope` param for Apps.
|
|
72
|
+
|
|
73
|
+
**Fallback — create an OAuth app by hand.** If there's no control-plane hall (a lone standalone box) or you prefer manual: GitHub → **your account's** Settings → **Developer settings** → **OAuth Apps** → **New OAuth App**.
|
|
74
|
+
> **Guidance the standup learned:** *Developer settings is under your **account**, not the repository* — this is the #1 place owners get stuck.
|
|
75
|
+
- **Homepage URL:** `https://<domain>`
|
|
76
|
+
- **Authorization callback URL:** `https://<domain>/api/gds/auth/web/callback` (PINNED — `auth.js` `WEB_REDIRECT_ORIGIN`; a sign-in begun on a `builders.` subdomain still calls back to the apex).
|
|
77
|
+
- Copy the **Client ID**; click **Generate a new client secret** and copy it (GitHub shows it **once**). Then place it **VERIFIED, never by hand (task 1979)**:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
node scripts/gds/oauth-secret.js place <slug> --client-id <id> --client-secret <secret> --apply
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
> **Guidance the standup learned:** do **NOT** hand-edit `web.env` with a shell `read -s` — during the Emersonian standup that silently left a 26-char truncated secret that broke sign-in with no obvious cause. `oauth-secret` validates the length/format (catching that truncation), rewrites the env line via Node, restarts the service, then **probes `/healthz` for `auth_configured:true`** before it reports success. If it refuses, the creds are wrong — recheck them; do not proceed.
|
|
84
|
+
|
|
85
|
+
**Human-only — first sign-in.** The owner opens `https://<domain>` and signs in with GitHub **once**. This seats the **founding Archon** — config alone seats no one, so this step is inherent and cannot be automated.
|
|
86
|
+
|
|
87
|
+
### 7. Verify
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
curl -s https://<domain>/healthz # → {"ok":true,"auth_configured":true}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Confirm the owner is **Archon** (their profile / the hall roster). If `auth_configured` is `false`, re-run the `oauth-secret place` step and recheck the OAuth app values.
|
|
94
|
+
|
|
95
|
+
### 8. Brand
|
|
96
|
+
|
|
97
|
+
Fill the instance **look** — theme / palette / fonts in `config/branding.json` (see `docs/branding-fill-prompt.md`). The identity strings were set at init; this is the visual layer. "Brand with your own LLM."
|
|
98
|
+
|
|
99
|
+
## Done-when
|
|
100
|
+
|
|
101
|
+
A new owner has gone zero → live: their own standalone repo on a pinned core, provisioned with no hand-editing of servers, the four human-only steps done UI-first + verified, and they are signed in as the founding Archon on their own domain. That is goal 35's `project-creation-flow` criterion.
|
|
102
|
+
|
|
103
|
+
## Constraints
|
|
104
|
+
|
|
105
|
+
- **This skill is the source of truth for the sequence.** If a step changes, change it here; `bongos onboard` (task 1982) and the hall wizard (task 1983) must render the same sequence.
|
|
106
|
+
- **Standalone only** (ADR 0108) — do not fall back to editing this monorepo's checkout for a new project.
|
|
107
|
+
- **Never weaken the trust boundary** — the web tier enqueues; only the control-plane runner (`provision.js`) touches cloud tokens (ADR 0016 / 0111 §2).
|
|
108
|
+
- **Adopting an EXISTING repo** (brownfield) is the other branch of the scaffold leg (step 3) — `bongos init --adopt` ([ADR 0121](../../../docs/adr/<redacted>.md)): detect → accept-gated conflict pre-flight → additive layering (never clobbers) → real version/goal + backlog import. Built; the `bongos onboard` CLI and the hall "start a project" wizard offer the same greenfield-vs-adopt choice.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: otb-character-review
|
|
3
|
+
description: Review a painterly character ANIMATION (a character_anim family — many frames of one character in different poses) against the ADR 0088 animation criteria. Triggers when the user says "review this animation", "score the bongo idle", "check the character animation", "is this animation consistent", "rate these frames", or asks how a generated character/mascot animation holds up. Sibling to otb-design-review (which scores a single pixel-art tile). Returns a plain-language verdict per frame and for the sequence: same character throughout, correct anatomy, each frame on its intended pose, clean edges, and smooth in-order motion. Wraps family_orchestrator.run_family + family_review for the painterly path.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are reviewing a painterly **character animation** — a `character_anim` family: many frames of the *same* character in *different* poses (e.g. the Bongo Buddha idle-breathing cycle). This is the animation sibling of `otb-design-review` (which scores one pixel-art tile). Do NOT judge it as pixel art — there is no palette to match, no FireRed reference, no 32×32 grid.
|
|
7
|
+
|
|
8
|
+
## What this skill does
|
|
9
|
+
|
|
10
|
+
It runs the existing family pipeline (ADR 0088) on a painterly character family and translates the result into a plain-language verdict. Two layers, same as the tile pipeline:
|
|
11
|
+
|
|
12
|
+
- **Deterministic checks** (`modules/art-pipeline/pipeline/family_checks.py`, free, no API) — the primary gate:
|
|
13
|
+
- `silhouette_area` / `silhouette_height` — the character is the same size in every frame.
|
|
14
|
+
- `dominant_overlap` / `luminance_emd` — same colours and lighting across frames.
|
|
15
|
+
- `edge_halo` — no glow ring / aura / magenta fringe on any frame.
|
|
16
|
+
- `perceptual_identity` — no frame is a grossly different individual (dHash-to-anchor backstop).
|
|
17
|
+
- `transition_no_jump` / `transition_no_dead` — read in order, the motion neither teleports nor stalls on a duplicate frame.
|
|
18
|
+
- **AI vision review** (`modules/art-pipeline/pipeline/family_review.py`, Gemini 2.5 Flash) — the subjective criteria:
|
|
19
|
+
- `family_consistency` — all frames read as one set.
|
|
20
|
+
- `character_identity` — every frame is the SAME individual.
|
|
21
|
+
- `anatomy_correct` — exactly two hands/feet, no extra/fused/melted limbs, no warped faces.
|
|
22
|
+
- `pose_match` — each frame hits its intended pose AND the frames form a smooth motion arc in order.
|
|
23
|
+
|
|
24
|
+
## How to use
|
|
25
|
+
|
|
26
|
+
1. **Review existing frames** (the common case — frames already sliced into a dir):
|
|
27
|
+
```
|
|
28
|
+
python3 modules/art-pipeline/pipeline/family_review.py <family_id> <frames_dir> <raw_sheet.png>
|
|
29
|
+
```
|
|
30
|
+
This prints the deterministic report + the Gemini review JSON. For a fast,
|
|
31
|
+
free deterministic-only pass (no Gemini call), use:
|
|
32
|
+
```
|
|
33
|
+
python3 modules/art-pipeline/pipeline/family_checks.py <family_id> <frames_dir>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
2. **Generate + grade from scratch** (the full generate→grade→audit→regenerate loop):
|
|
37
|
+
```
|
|
38
|
+
python3 modules/art-pipeline/pipeline/family_orchestrator.py <family_id> [--max-attempts N] [--publish]
|
|
39
|
+
```
|
|
40
|
+
The orchestrator calls the same checks + review internally and retries with the
|
|
41
|
+
fix-hints. Frames live under `modules/art-pipeline/iterations/_families/<family_id>/`.
|
|
42
|
+
|
|
43
|
+
3. **Fill to a full frame count + package** (after the keyframes pass): the
|
|
44
|
+
recursive inbetween layer (`modules/art-pipeline/pipeline/inbetween.py`) generates the in-between
|
|
45
|
+
poses and `modules/art-pipeline/pipeline/sequence_assembly.py` writes the sprite set + strip +
|
|
46
|
+
`manifest.json`. (The one-call module entry point is the `character_anim`
|
|
47
|
+
Cloud Bongos module.)
|
|
48
|
+
|
|
49
|
+
## Interpret the verdict
|
|
50
|
+
|
|
51
|
+
The review returns `verdict` + per-criterion scores + a `fix_hint`:
|
|
52
|
+
- **`pass`** (total ≥ the family's `pass_threshold`, no criterion under its hard-fail min) → accept; proceed to inbetweening / assembly.
|
|
53
|
+
- **`retry`** (some scores below threshold but salvageable) → regenerate with the `fix_hint`.
|
|
54
|
+
- **`escalate_tier`** (deeply wrong) → the current approach isn't working; escalate (different tier / the deferred LoRA "level 2").
|
|
55
|
+
|
|
56
|
+
A failing **deterministic** check blocks the Gemini review entirely (it saves the credit) — fix the mechanical issue first; its `fix_hints` are specific and numeric.
|
|
57
|
+
|
|
58
|
+
## Surface to the user in plain language
|
|
59
|
+
|
|
60
|
+
Don't dump raw JSON. Translate, **per frame and for the sequence**:
|
|
61
|
+
- Which frames (by id) are the problem and why — e.g. "frame `idle_f3` has a faint glow ring", "`idle_f2→idle_f3` barely moves (a dead frame)", "frame 4 drifted to a different robe colour".
|
|
62
|
+
- The overall verdict + the single most important next change (the `fix_hint`).
|
|
63
|
+
- Whether the motion reads as smooth and on-model, or where it breaks.
|
|
64
|
+
|
|
65
|
+
## Cost
|
|
66
|
+
|
|
67
|
+
Deterministic checks: free. One Gemini family review: ~negligible (a few thousand tokens). Generation (if you run the orchestrator): ~$0.04/frame on Gemini image, so a full action is well under $1 even with retries. Always run the free deterministic pass first.
|
|
68
|
+
|
|
69
|
+
## When to use this directly vs. via orchestrator
|
|
70
|
+
|
|
71
|
+
Use this skill **directly** to score frames Lars already has (a finished action, a spot-check, an asset dropped in). Use the **orchestrator** (which calls the same review internally) when generating an action from scratch.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: otb-design-review
|
|
3
|
+
description: Score an existing pixel-art tile against the Example rubric. Triggers when user says "review this tile", "score X", "rate Y", or asks how a generated asset stacks up. Returns per-criterion scores, a critique, a verdict (pass/retry/escalate_tier), and a fix_hint. Uses Gemini 2.5 Flash vision plus deterministic palette/grid checks.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are scoring a generated tile against the Example quality rubric. Do NOT critique freelance — use the rubric in `modules/art-pipeline/template/rubric.json`.
|
|
7
|
+
|
|
8
|
+
## What this skill does
|
|
9
|
+
|
|
10
|
+
Wraps `modules/art-pipeline/pipeline/review.review()`. It runs:
|
|
11
|
+
- **Deterministic checks**: dimensions, palette compliance, color count, mode.
|
|
12
|
+
- **AI vision review** (Gemini 2.5 Flash): the 9 rubric criteria with per-criterion 0-10 scores and short critiques.
|
|
13
|
+
|
|
14
|
+
Returns structured JSON with scores, verdict, and a fix_hint for the next attempt.
|
|
15
|
+
|
|
16
|
+
## How to use
|
|
17
|
+
|
|
18
|
+
1. Identify the tile PNG path and its vocab id.
|
|
19
|
+
|
|
20
|
+
2. Run:
|
|
21
|
+
```
|
|
22
|
+
python3 modules/art-pipeline/pipeline/review.py path/to/tile.png <vocab_id>
|
|
23
|
+
```
|
|
24
|
+
This prints the JSON result.
|
|
25
|
+
|
|
26
|
+
3. **Interpret the verdict**:
|
|
27
|
+
- `pass` (total ≥ 9.0, no hard fails) → accept, wire into game.
|
|
28
|
+
- `retry` (some scores below threshold but salvageable) → regenerate with the fix_hint.
|
|
29
|
+
- `escalate_tier` (deeply wrong) → next tier in orchestrator (image-to-image, model swap, procedural fallback).
|
|
30
|
+
|
|
31
|
+
4. **Surface to the user** in plain language: which criteria scored low, the verdict, and the recommended next step. Don't dump raw JSON — translate.
|
|
32
|
+
|
|
33
|
+
5. **Cost**: ~$0.0001 per review (Gemini 2.5 Flash, ~1k tokens). Negligible vs. generation.
|
|
34
|
+
|
|
35
|
+
## What "good" looks like
|
|
36
|
+
|
|
37
|
+
The rubric is in `modules/art-pipeline/template/rubric.json`. Pass requires total ≥ 9.0 AND no individual criterion below its hard-fail threshold. The hard-fail thresholds are tighter on objective criteria (grid, no_aa, palette: <7) than subjective ones (firered_match, mythic_greek, brand_feel: <5).
|
|
38
|
+
|
|
39
|
+
## When to use this directly vs. via orchestrator
|
|
40
|
+
|
|
41
|
+
Use this skill **directly** when:
|
|
42
|
+
- Reviewing a one-off asset Lars dropped in.
|
|
43
|
+
- Scoring a final tile before wiring it into the game.
|
|
44
|
+
- Spot-checking iteration outputs after a run.
|
|
45
|
+
|
|
46
|
+
Use the **orchestrator** (which calls this internally) when:
|
|
47
|
+
- Generating a new tile from scratch (it loops generate→review).
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: otb-feedback-capture
|
|
3
|
+
description: Convert verbal design feedback into a durable rule appended to the Example style guide. Triggers when Lars gives directional notes ("trees too modern", "saturation too high", "containers should look weathered"). Updates modules/art-pipeline/template/style_guide.md with a dated rule so future generations automatically respect it. This is how the system gets better over time.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are turning a one-time piece of feedback into a permanent guardrail. The whole point of this skill is that **Lars should not have to repeat himself**. If he tells you trees should be more gnarled, every future tree generation should bake that in.
|
|
7
|
+
|
|
8
|
+
## What this skill does
|
|
9
|
+
|
|
10
|
+
1. Reads the verbal feedback from the conversation.
|
|
11
|
+
2. Distills it to one rule: short, actionable, scoped to the right tile category.
|
|
12
|
+
3. Appends it to **§ Visual rules** in `modules/art-pipeline/template/style_guide.md` with today's date.
|
|
13
|
+
4. **Optionally** updates the rubric (`modules/art-pipeline/template/rubric.json`) if the feedback warrants a new criterion or stricter threshold — this is rarer; ask if unsure.
|
|
14
|
+
5. **Optionally** updates the prompt rules (per-tile descriptions in `modules/art-pipeline/template/vocabulary.json`) if the feedback is tile-specific.
|
|
15
|
+
|
|
16
|
+
## How to use
|
|
17
|
+
|
|
18
|
+
1. **Distill** the feedback. Examples:
|
|
19
|
+
- "trees too modern, more gnarled" → *Olive trees: gnarled trunk implication should always be visible at canopy base; canopy is silver-green not bright green.*
|
|
20
|
+
- "container looks too new" → *Container exterior: must always include rust streaks and faded paint patches; never pristine metal.*
|
|
21
|
+
- "saturation too high overall" → *Global: saturation cap at ~70% — anything more reads cartoonish, breaks "secret discovery" brand feel.*
|
|
22
|
+
|
|
23
|
+
2. **Pick the scope**:
|
|
24
|
+
- **Global** → append to § Visual rules in `style_guide.md`.
|
|
25
|
+
- **Tile-specific** → also update the `desc` field for that tile in `vocabulary.json`.
|
|
26
|
+
- **Rubric-changing** → propose a new criterion or threshold change; do not silently edit the rubric.
|
|
27
|
+
|
|
28
|
+
3. **Append with a date stamp**, never overwrite or delete. Format:
|
|
29
|
+
```
|
|
30
|
+
- **[YYYY-MM-DD]** <one-sentence rule>. (Source: Lars feedback on <tile_id> attempt <N>.)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
4. **Confirm to Lars** what rule you saved, in one line. He should know what's now baked in.
|
|
34
|
+
|
|
35
|
+
5. **Update the relevant memory** at the end of the session. The style guide IS the memory — but if the feedback is meta-level (e.g. about the workflow, not the art), capture it as a feedback memory in `~/.claude/projects/.../memory/`.
|
|
36
|
+
|
|
37
|
+
## What NOT to do
|
|
38
|
+
|
|
39
|
+
- Don't delete or overwrite prior rules. The guide grows; conflicts get resolved by adding a stricter rule on top, not erasing the older one.
|
|
40
|
+
- Don't auto-broaden tile-specific feedback into a global rule. If Lars says "this *one* sand tile looks wrong," only update sand_base — not the global guide.
|
|
41
|
+
- Don't capture aesthetic preferences as hard rubric criteria unless Lars explicitly asks for them in the rubric.
|
|
42
|
+
|
|
43
|
+
## Files this skill touches
|
|
44
|
+
|
|
45
|
+
- WRITES: `modules/art-pipeline/template/style_guide.md` (always), `modules/art-pipeline/template/vocabulary.json` (sometimes), `modules/art-pipeline/template/rubric.json` (rarely)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: otb-figma-sync
|
|
3
|
+
description: Push generated tiles into the Example Figma file as a visual review canvas. Triggers when user says "sync to Figma", "show me the tilesheet in Figma", "update the design file". Hard-coded to file ID <redacted>. Refuses to touch any other Figma file. Repo remains the source of truth — Figma is a viewer.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
**Script skill (authoritative).** The core action is the `use_figma` MCP tool call. Execute it with the determined parameters and do not paraphrase or reformat the Figma response — relay the frame name and link verbatim.
|
|
7
|
+
|
|
8
|
+
You are pushing finished pixel art into the Example Figma file so Lars can review at a glance. Repo PNGs remain authoritative; Figma is for VISUAL REVIEW ONLY.
|
|
9
|
+
|
|
10
|
+
## Hard constraint
|
|
11
|
+
|
|
12
|
+
The only Figma file this skill is allowed to read or write is **`<redacted>`** ("example"). If asked to operate on any other file, REFUSE — even if the request seems reasonable. This is a Lars-set guardrail.
|
|
13
|
+
|
|
14
|
+
## Session capability check
|
|
15
|
+
|
|
16
|
+
This skill needs the **`use_figma`** MCP tool (write capability). The read-only `mcp__figma__*` tools alone are not enough.
|
|
17
|
+
|
|
18
|
+
If `use_figma` is not available in the current session, do NOT attempt to fake the sync. Surface the gap to Lars: "Figma write capability not exposed in this session — only read tools are available." He can re-enable it via the Figma desktop app's MCP settings or by re-authorizing the connector. Until then, the repo PNGs are the source of truth and the `modules/art-pipeline/generated/preview.html` standalone preview serves the visual-review need.
|
|
19
|
+
|
|
20
|
+
## What this skill does
|
|
21
|
+
|
|
22
|
+
1. Reads finished tiles from `modules/art-pipeline/generated/tiles/`.
|
|
23
|
+
2. Builds a "Tilesheet vN" frame in the example Figma file containing:
|
|
24
|
+
- Each tile rendered at native 32×32 plus a 8x-zoomed inspection thumbnail.
|
|
25
|
+
- The tile's vocab id and current best score.
|
|
26
|
+
- A small palette swatch sheet derived from `modules/art-pipeline/template/palette.json`.
|
|
27
|
+
3. Each sync creates a NEW frame named `Tilesheet v{N+1} {YYYY-MM-DD}` — never overwrites prior frames. History stays.
|
|
28
|
+
|
|
29
|
+
## How to use
|
|
30
|
+
|
|
31
|
+
1. **Verify the file ID**. Before any Figma write, confirm the target is `<redacted>`. If not, halt.
|
|
32
|
+
|
|
33
|
+
2. **Use the figma-use skill** for the actual writes. (See `figma:figma-use` for the JS context and the `use_figma` MCP tool.) The plan: build a Figma frame programmatically, paste the PNGs, label them.
|
|
34
|
+
|
|
35
|
+
3. **Read tiles** from `modules/art-pipeline/generated/tiles/*.png`. Read scores from `modules/art-pipeline/iterations/<tile_id>/summary.json`.
|
|
36
|
+
|
|
37
|
+
4. **Render in Figma** at two sizes: native 32×32 (so you can see the actual tile) and 8x zoomed (256×256, so the pixel art is human-readable).
|
|
38
|
+
|
|
39
|
+
5. **Add metadata** below each tile: id, score, attempt count, tier reached.
|
|
40
|
+
|
|
41
|
+
6. **Create a separate "Palette" frame** showing the 64-color swatches from `modules/art-pipeline/template/palette.png`.
|
|
42
|
+
|
|
43
|
+
7. **Confirm to Lars** with the frame name and a Figma link.
|
|
44
|
+
|
|
45
|
+
## What NOT to do
|
|
46
|
+
|
|
47
|
+
- Don't modify the canonical PNGs based on Figma edits. Figma is read-only-by-Lars; if he wants changes, he gives feedback verbally, captured by `otb-feedback-capture`.
|
|
48
|
+
- Don't create a new Figma file even if it would seem cleaner. One file, growing frames.
|
|
49
|
+
- Don't paste anything from another Figma project into example, and don't paste from example anywhere else.
|
|
50
|
+
|
|
51
|
+
## Files this skill touches
|
|
52
|
+
|
|
53
|
+
- READS: `modules/art-pipeline/generated/tiles/*.png`, `modules/art-pipeline/iterations/*/summary.json`, `modules/art-pipeline/template/palette.png`
|
|
54
|
+
- WRITES (in Figma only): a new frame in file `<redacted>`
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: otb-tile-generate
|
|
3
|
+
description: Generate one or more pixel-art tiles for the Example world. Triggers when user says "generate a tile", "make a sprite for X", "regenerate Y", or asks for new world art. Reads the design template, runs the full generate→post-process→review→retry orchestrator, saves results into modules/art-pipeline/generated/tiles/, logs cost. Always reuses the locked palette and rubric in modules/art-pipeline/template/.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are operating the Example pixel-art generation pipeline. The user has asked you to produce one or more tiles. Do NOT freelance — use the existing pipeline.
|
|
7
|
+
|
|
8
|
+
## What this skill does
|
|
9
|
+
|
|
10
|
+
Runs `modules/art-pipeline/pipeline/orchestrator.py` for the requested tiles. The orchestrator does generate → post-process to 32×32 → score against rubric → retry/escalate up to 5 tiers → save final PNG. All cost is logged to `modules/art-pipeline/iterations/cost_ledger.jsonl`.
|
|
11
|
+
|
|
12
|
+
## How to use
|
|
13
|
+
|
|
14
|
+
1. **Identify the tile(s)** the user wants. They may name an existing vocab id (`grass_base`, `sea_shallow`, etc.) or describe something new.
|
|
15
|
+
|
|
16
|
+
2. **If new**, append the new entry to `modules/art-pipeline/template/vocabulary.json` with id, kind (`tile` | `edge` | `sprite`), priority (A/B/C), description, and ref_clusters (best-fit cluster ids from `modules/art-pipeline/template/cluster_overview.png`). Then proceed.
|
|
17
|
+
|
|
18
|
+
3. **Check the budget** before running:
|
|
19
|
+
```
|
|
20
|
+
python3 modules/art-pipeline/pipeline/cost_ledger.py status
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
4. **Run the orchestrator** for the tile(s). Either by priority letter:
|
|
24
|
+
```
|
|
25
|
+
python3 modules/art-pipeline/pipeline/orchestrator.py A
|
|
26
|
+
```
|
|
27
|
+
or write a one-line wrapper that calls `run_tile(item)` for the specific id. The orchestrator exits with a summary.
|
|
28
|
+
|
|
29
|
+
5. **Inspect the result** at `modules/art-pipeline/generated/tiles/<id>.png` (final accepted) or `modules/art-pipeline/iterations/<id>/log.jsonl` (full attempt history). If the tile passed, the corresponding entry in `modules/art-pipeline/iterations/run_summary.json` will show `status: "pass"`. If best-effort, scoreboard the gap and decide whether to retry.
|
|
30
|
+
|
|
31
|
+
**View it on your sandbox without placing it in-game** (#1262): every tile you've generated — native + zoomed, with its score and critique — is served at **`https://sandbox-<login>.example.com/art`** (locally: `http://localhost:<port>/art`). This is the generated-art *gallery* (`modules/art-pipeline/generated/preview.html`), so you can show the builder what they made even when the tile isn't placed in the world yet. The atlas-rebuild in-game step below is only needed once you actually want it *in the playable world*.
|
|
32
|
+
|
|
33
|
+
6. **See it in-game on your sandbox** (#1067): run `node scripts/gds/art-stage.js` — it rebuilds the atlas the client loads, surfaces it on your sandbox live preview (`sandbox-<login>.example.com`, ADR 0044), and prints the URL + affected tiles. With the auto-reload (task 1065) an already-open tab refreshes itself. (The family/refresh runs also accept `--stage` to do this automatically: `family_orchestrator.py <id> --publish --stage`, `refresh_all.py --stage`.) Only a genuinely NEW base-tile *type* still needs a `public/game/world/tilePalette.js` mapping edit; an updated existing tile just needs the atlas rebuild above.
|
|
34
|
+
|
|
35
|
+
## Constraints
|
|
36
|
+
|
|
37
|
+
- Never bypass the review step. If a tile passes deterministic checks but fails AI review, regenerate with the fix_hint — do not paper over.
|
|
38
|
+
- Never modify the locked palette (`modules/art-pipeline/template/palette.json`) without an ADR. Theme drift = palette drift = whole-world drift.
|
|
39
|
+
- Hard stop at $80 in the cost ledger. If approaching, stop generating, surface remaining budget to the user.
|
|
40
|
+
|
|
41
|
+
## Files this skill touches
|
|
42
|
+
|
|
43
|
+
- READS: `modules/art-pipeline/template/{vocabulary.json,style_guide.md,rubric.json,palette.json,cluster_overview.png,ref_clusters/*}`
|
|
44
|
+
- WRITES: `modules/art-pipeline/iterations/<tile_id>/`, `modules/art-pipeline/generated/tiles/<tile_id>.png`, `modules/art-pipeline/iterations/cost_ledger.jsonl`
|
|
45
|
+
- Optionally edits: `modules/art-pipeline/template/vocabulary.json` (add new entries), `public/game/world/tilePalette.js` (wire up)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: paint
|
|
3
|
+
description: The art session — the operating playbook for artist-discipline work. Triggers when the user says "/paint", "let's make art", "I want to work on a tile/sprite", "start an art session", or when a claimed task's discipline routes here (claim.js prints a directive to invoke /paint for artist tasks). Show-first, low-text: Claude communicates in pictures, not prose, and drives the existing pixel-art pipeline underneath.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are running an **art session** for Off the Boats. This is not the engineer's text-heavy build loop. Read this whole file before acting — it changes how you *communicate* for the rest of the session.
|
|
7
|
+
|
|
8
|
+
## The one rule that makes this different: communicate in pictures, not prose
|
|
9
|
+
|
|
10
|
+
In every other discipline, Claude narrates — diffs, logs, paragraphs of what it's doing. **Here that is the failure mode.** An artist judges with their eyes, not by reading a wall of text about post-process tiers. So:
|
|
11
|
+
|
|
12
|
+
> **Show, then briefly caption. Never narrate the pipeline at length.** Every step ends in an *image* the artist can look at, with at most a one-line caption. The text-heavy plumbing still runs — it just runs quietly.
|
|
13
|
+
|
|
14
|
+
Concretely:
|
|
15
|
+
|
|
16
|
+
- **End every step with something visual.** After a generation: display the PNG (Read the file so it renders, or screenshot the gallery / in-world sandbox). After a rubric check: show the scorecard, not a prose summary. The artist should *see* the result before they read a single word.
|
|
17
|
+
- **Collapse the plumbing to one-liners.** Budget checks, `vocabulary.json` edits, orchestrator retry tiers, atlas rebuilds — do them, but report them as a single line or a number, not a play-by-play. "Generated, rubric 0.91, on-palette, staged ✓" beats three paragraphs.
|
|
18
|
+
- **Verification = look, not read.** Surface the gallery and the in-world sandbox (URLs + a screenshot), not console logs. Logs are for when something *breaks*, not for routine success.
|
|
19
|
+
- **The artist owns the look; you own the rendering.** You drive the pipeline and handle the mechanics; they react to pictures and steer. You are their hands, not their art director.
|
|
20
|
+
|
|
21
|
+
## Step 0 — detect the mode
|
|
22
|
+
|
|
23
|
+
**Is an artist present in this session?**
|
|
24
|
+
|
|
25
|
+
- Normal interactive session (someone is here to look and react) → **Interactive mode**.
|
|
26
|
+
- Autonomous / bypass-permissions / scheduled run (no one is watching the images) → **Autonomous mode**.
|
|
27
|
+
|
|
28
|
+
If unsure, ask once; if no answer, treat it as autonomous.
|
|
29
|
+
|
|
30
|
+
## Step 1 (both modes) — load the look before you make anything
|
|
31
|
+
|
|
32
|
+
Ground every asset in the locked theme so nothing drifts:
|
|
33
|
+
|
|
34
|
+
- `modules/art-pipeline/template/style_guide.md`, `modules/art-pipeline/template/rubric.json`, `modules/art-pipeline/template/palette.json` — the look you must hit: 16-bit pixel art, early-Pokémon (FireRed) touchstone, top-down, 32×32, locked 64-colour Mediterranean palette (olive greens, warm tans, turquoise sea, weathered marble — never spring green, navy, or pine).
|
|
35
|
+
- `modules/art-pipeline/template/vocabulary.json` + `modules/art-pipeline/template/cluster_overview.png` — what exists and the reference clusters.
|
|
36
|
+
- **The palette and rubric are non-negotiable.** Never edit `palette.json` or `rubric.json` without an ADR — palette drift is whole-world drift.
|
|
37
|
+
|
|
38
|
+
## Interactive mode — show, react, iterate
|
|
39
|
+
|
|
40
|
+
1. **Establish the visual target first, not in prose.** Confirm the subject (an existing vocab id, or a new in-world prop/plant/animal/accessory) and, if helpful, show the reference cluster it should sit beside. One or two lines, then move to making.
|
|
41
|
+
2. **Generate via the pipeline — never freelance.** Drive `/otb-tile-generate` (which runs `modules/art-pipeline/pipeline/orchestrator.py`: generate → post-process to 32×32 → score against rubric → retry up to 5 tiers → save to `modules/art-pipeline/generated/tiles/<id>.png`, logging cost). Check the budget first (`python3 modules/art-pipeline/pipeline/cost_ledger.py status`; hard stop at $80) — but report it as one line.
|
|
42
|
+
3. **SHOW the result.** Display the final accepted PNG and its rubric score. The gallery serves every tile (native + zoomed, with score + critique) at `sandbox-<login>.example.com/art` — point them there and/or render the image inline. **Default visibility: show the final accepted asset and any failures. Show the intermediate retry attempts only if the artist asks ("show me the attempts").**
|
|
43
|
+
4. **See it in the world.** When they want it placed, run `node scripts/gds/art-stage.js` — it rebuilds the atlas and surfaces the asset live in the game on their sandbox (auto-reloads an open tab). Screenshot/point at the in-world view. (A genuinely new base-tile *type* also needs a `public/game/world/tilePalette.js` mapping edit; an updated existing tile just needs the rebuild.)
|
|
44
|
+
5. **Feedback is visual → a durable rule.** When the artist reacts ("too saturated", "trees too modern", "weather the marble"), don't just tweak once — run `/otb-feedback-capture` to write the note into `modules/art-pipeline/template/style_guide.md` as a dated rule, then regenerate and **show the new result**. The loop is see → react → see again, and the style guide gets smarter each pass.
|
|
45
|
+
6. **Use `/otb-design-review`** when you want a rubric-grounded second opinion on whether an asset truly hits the bar — surface its numbers, not a paragraph.
|
|
46
|
+
|
|
47
|
+
## Autonomous mode — make it, gate it, park the pictures
|
|
48
|
+
|
|
49
|
+
No one is watching the images, so do not narrate into the void and do not lower the bar.
|
|
50
|
+
|
|
51
|
+
1. **Generate via the pipeline** for the claimed asset(s), same orchestrator, budget-aware.
|
|
52
|
+
2. **Rubric-gate hard.** Ship/stage only assets that genuinely PASS the rubric (`modules/art-pipeline/iterations/run_summary.json` status `pass`). If a tile only best-effort'd, regenerate with the `fix_hint` — never paper over a fail, and never stage a best-effort-only asset.
|
|
53
|
+
3. **Stage to the gallery and PARK for human review.** Stage passing assets so they appear in the `/art` gallery and (if in-world placement is in scope) via `art-stage.js`, then leave them for a human to eyeball. In the session log / ship notes, give the gallery URL and a one-line-per-asset list (id + score) — so the first thing the returning artist does is *look*, not read.
|
|
54
|
+
|
|
55
|
+
## How art TASKS should be framed (target-and-rubric, not prose-and-procedure)
|
|
56
|
+
|
|
57
|
+
When you scope or present an art task, factor in the visual background:
|
|
58
|
+
|
|
59
|
+
- **Lead with the visual target**, not paragraphs — the subject, the reference cluster it belongs beside, an example image if one exists. "Make this," shown.
|
|
60
|
+
- **Express `done_when` in visual / rubric terms** — "passes the rubric, reads as weathered marble in-world, every pixel on the locked palette" — not procedural step lists.
|
|
61
|
+
- **Keep procedure out of the task; the skill carries the how.** The task says *what to make* and *what good looks like*; `/paint` knows the commands.
|
|
62
|
+
|
|
63
|
+
## How sessions reach this skill
|
|
64
|
+
|
|
65
|
+
- **Standalone:** the user invokes `/paint` directly (e.g. "let's make a tile") — no claimed task required to explore.
|
|
66
|
+
- **From a claim:** when a builder claims an `artist`-discipline task, `claim.js` reads `scripts/gds/discipline-modes.json` and prints a directive to invoke `/paint`. Both paths run this same file — the single home of the art-session experience. (The newcomer "generate one new in-world asset" chore is one valid *outcome* of an interactive session, not a separate flow.)
|
|
67
|
+
|
|
68
|
+
## Stay clear of (READ-ONLY)
|
|
69
|
+
|
|
70
|
+
Never modify the locked palette (`modules/art-pipeline/template/palette.json`) or rubric (`modules/art-pipeline/template/rubric.json`) without an ADR. Touch only art assets / `vocabulary.json` under `art/` (and, at most, the `public/game/world/tilePalette.js` wiring for a genuinely new base-tile type). Do not touch permission, pipeline-core, migration, or infra files.
|