@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,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blocker-review
|
|
3
|
+
description: Daily review of open GDS blockers — surface each, prompt the user to resolve, escalate, or note continued blockage. Resolving a blocker auto-promotes any linked tasks from blocked → ready (DB trigger). Triggers when the user says "/blocker-review", "review blockers", "what's stuck on me", "what's stuck on Lars", "check blockers", or runs as a scheduled daily task. Metic+ rank only (Metic and Archon; not Xenos).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are running the daily blocker-review session for Off the Boats. Open blockers in the GDS `blockers` table get surfaced one-at-a-time, with prompts for the user to take action — resolve, escalate, or confirm still-blocked.
|
|
7
|
+
|
|
8
|
+
This is the structural cure for the old "task #3 sat in `blocked` for days because nobody flipped it after the blocker was resolved" pattern. Phase 2a's BEFORE-UPDATE trigger auto-promotes linked tasks the moment a blocker is marked resolved. This skill is what makes sure resolutions actually get marked.
|
|
9
|
+
|
|
10
|
+
## Rank gate — Metic+ only
|
|
11
|
+
|
|
12
|
+
This skill is **gated to Metic and above** (Metic, Archon). It is **not** available to Xenos, the lowest rank. Resolving a blocker auto-promotes every linked task from `blocked` → `ready` via the BEFORE-UPDATE trigger — that's a write that reshapes what the whole team can claim next, so it's a trusted-builder operation. A Xenos can still **file** a blocker (`POST /api/gds/blockers`) — that path stays open to any authenticated builder — they just can't resolve or link them.
|
|
13
|
+
|
|
14
|
+
This mirrors GDS-V3 criterion C2 (`three-ranks-gate-everything`), which names "blocker review" explicitly as a Metic privilege alongside full claim/ship, idea triage, and planning/priority sessions (see [`docs/canonical-permissions.md`](../../../docs/canonical-permissions.md) and [ADR 0018](../../../docs/adr/<redacted>.md)).
|
|
15
|
+
|
|
16
|
+
**Enforce the gate at the very top of the session, before reading anything else:**
|
|
17
|
+
|
|
18
|
+
1. Call `GET /api/gds/me` and read `builder.rank`. Compare case-insensitively (lowercase it before testing).
|
|
19
|
+
2. **If `rank` is present and lowercases to `xenos`** → stop immediately. Tell the builder: *"Blocker review is a Metic+ operation — resolving a blocker auto-promotes every task linked to it, which reshapes the whole team's ready queue. You're currently Xenos. You can still file a new blocker via `POST /api/gds/blockers`; ask an Archon to promote you if you need to resolve them."* Do not list open blockers, do not propose resolutions.
|
|
20
|
+
3. **If `rank` lowercases to `metic` or `archon`** → proceed with the steps below.
|
|
21
|
+
4. **If `rank` is absent** (the GET /me response has no `rank` field — only possible against a deployment where the three-rank model hasn't shipped yet): treat the session as available, exactly as `/planning-session` and `/priority-session` do in their pre-rank passthrough mode. Note in the session log that the gate ran in pre-rank passthrough mode.
|
|
22
|
+
|
|
23
|
+
> The gate is **belt-and-braces**: the server already rejects `/blockers/:id/resolve` and `/blockers/:id/link` with `403 rank_forbidden` for any non-Metic+ caller (#360 / ADR 0018), and markdown never grants authority (criterion C7). This frontmatter + check is the *intent surfaced to the operator*; the server is the *enforcement*. The skill stops early so a Xenos doesn't read the whole open-blocker list and walk through verdicts only to hit a 403 on every POST.
|
|
24
|
+
|
|
25
|
+
## What this skill does
|
|
26
|
+
|
|
27
|
+
1. Lists open blockers via `GET /api/gds/blockers`.
|
|
28
|
+
2. For each, prompts: **resolved**, **still blocked** (with brief status update), or **escalate** (surface to Lars or generate an external ask).
|
|
29
|
+
3. Resolves accordingly via `POST /api/gds/blockers/:id/resolve`. The trigger handles the linked-task flip.
|
|
30
|
+
|
|
31
|
+
## How to use
|
|
32
|
+
|
|
33
|
+
**Step 1 — fetch open blockers.**
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
node scripts/gds/api.js GET /api/gds/blockers
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
(No auth needed — `/blockers` is read-public so the build dashboard can show what's stuck on Lars. `api.js` is the cross-platform GDS API helper — runs on Windows/macOS/Linux, unlike the old `curl | python3` form.)
|
|
40
|
+
|
|
41
|
+
If the list is empty, print "no open blockers — nothing to review today" and exit.
|
|
42
|
+
|
|
43
|
+
**Step 2 — walk the list, blocker by blocker.**
|
|
44
|
+
|
|
45
|
+
Present each blocker with:
|
|
46
|
+
- id + title
|
|
47
|
+
- body_md (full)
|
|
48
|
+
- created_at
|
|
49
|
+
- blocking_task_ids[] — the tasks that auto-promote on resolution
|
|
50
|
+
|
|
51
|
+
Then ask the user (concise, plain-language; Lars is the prompter — frame around the product outcome):
|
|
52
|
+
|
|
53
|
+
> Blocker #N: "{title}". This is blocking {N} task(s): {task titles}. Status today — **resolved, still blocked, or escalate**?
|
|
54
|
+
|
|
55
|
+
**Step 3 — apply the verdict.**
|
|
56
|
+
|
|
57
|
+
**Resolved** → ask for a one-line resolution note (what unblocked it), then post
|
|
58
|
+
(api.js signs the request with your session token automatically):
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
node scripts/gds/api.js POST /api/gds/blockers/<id>/resolve --body '{"resolution_note":"<one-line summary>"}'
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
(If the note has characters awkward to quote in your shell, write the JSON to a temp file and use `--body-file <path>` instead.)
|
|
65
|
+
|
|
66
|
+
The response includes `promoted_tasks` — the tasks the trigger just flipped from `blocked` → `ready`. Surface these to the user so they know what's now claimable.
|
|
67
|
+
|
|
68
|
+
**Still blocked** → ask the user for a one-line "what's the latest" status. Don't write it to the DB (no field for that today — flag for a future column if useful). Just note it for the session log.
|
|
69
|
+
|
|
70
|
+
**Escalate** → ask whether the right move is:
|
|
71
|
+
- A team Discord broadcast via `node scripts/discord/post.js` (Discord replaced Google Chat in both directions — outbound per ADR 0032 / #607, inbound per ADR 0033 F6; `scripts/chat/` was removed 2026-06-05)
|
|
72
|
+
- An email/Slack/etc. that needs Lars's identity to send (in which case write a one-line ask the user can copy)
|
|
73
|
+
- An ADR if the blocker reflects an architectural decision someone needs to make
|
|
74
|
+
|
|
75
|
+
**Step 4 — surface a summary.**
|
|
76
|
+
|
|
77
|
+
Report to the user:
|
|
78
|
+
- Total reviewed
|
|
79
|
+
- Resolved (count + ids + the tasks each unblocked)
|
|
80
|
+
- Still blocked (count + brief status notes)
|
|
81
|
+
- Escalated (count + ids + the action being taken)
|
|
82
|
+
|
|
83
|
+
If anything was resolved, encourage the user to consider claiming one of the now-`ready` tasks if they have time today (`/builder-start` to see them).
|
|
84
|
+
|
|
85
|
+
## Why we run this daily
|
|
86
|
+
|
|
87
|
+
A blocker that resolves silently and never gets propagated keeps multiple tasks artificially stuck. Phase 2a's trigger fixes the propagation, but only IF resolutions get recorded. Daily cadence is the keep-honest mechanism — even when the answer is "still blocked," the user has a fresh data point that the situation hasn't changed (which sometimes turns into "this has been blocked too long, time to escalate").
|
|
88
|
+
|
|
89
|
+
## Tone for the user
|
|
90
|
+
|
|
91
|
+
Lars is the prompter (see CLAUDE.md §2). Some blockers are external (Stripe creds from a lawyer, fulfillment intake from Example partners). Don't pressure. The skill's job is to ask cleanly, record the answer, and surface what would unlock if Lars decided to push on a particular item today.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blocker-solve
|
|
3
|
+
description: Start a blocker-scoped working session that drives ONE GDS blocker to done and auto-closes it. Unlike /blocker-review (which walks the whole list to record status), this points at a single blocker, gathers its context, does the parts it can itself, hands the owner-only parts back as precise step-by-step instructions, verifies the fix actually landed, then auto-resolves — which auto-promotes any task waiting on it (DB trigger). Triggers when the user says "/blocker-solve N", "solve blocker N", "work blocker N", "drive blocker N to done", "let's clear blocker N", or "fix the thing blocking task M". Metic+ rank only (Metic and Archon; not Xenos).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are running a **blocker-solve session** — a session scoped to exactly one GDS blocker, whose goal is to drive that blocker to resolution and close the loop automatically. Where `/blocker-review` is a daily list-walk that records status, this is a *working* session that actually moves one blocker toward done and, when the fix is verified, resolves it — which promotes every linked task `blocked → ready` via the migration-009 trigger.
|
|
7
|
+
|
|
8
|
+
The session **always works the same way**, whether the fix is something you can do or something only the owner can do:
|
|
9
|
+
|
|
10
|
+
> **gather context → do what you can / guide the rest → verify → auto-resolve → report.**
|
|
11
|
+
|
|
12
|
+
A blocker that "needs the owner's hands" (a Cloudflare login, a billing change, a payment, a yes/no decision) is **not a different mode** — the human action is just a *pause inside this same flow*. You produce exact instructions, the owner performs the step, you verify it landed, and you resolve. The point is to kill the gap that bites today: the owner finishes the real-world action but the GDS never hears about it, so the blocker sits open forever and its tasks stay stuck.
|
|
13
|
+
|
|
14
|
+
## Rank gate — Metic+ only
|
|
15
|
+
|
|
16
|
+
Resolving a blocker auto-promotes every task linked to it — a write that reshapes the whole team's `ready` queue — so this is a trusted-builder operation, gated to **Metic and Archon** (not Xenos). Enforce it at the very top, before reading anything else:
|
|
17
|
+
|
|
18
|
+
1. Call `node scripts/gds/api.js GET /api/gds/me` and read `builder.rank`. Lowercase before testing.
|
|
19
|
+
2. **If `rank` lowercases to `xenos`** → stop immediately: *"Blocker-solve is a Metic+ operation — resolving a blocker auto-promotes every task linked to it. You're currently Xenos. You can still **file** a blocker (`POST /api/gds/blockers`); ask an Archon to promote you if you need to solve them."* Do not read the blocker or propose a fix.
|
|
20
|
+
3. **If `rank` lowercases to `metic` or `archon`** → proceed.
|
|
21
|
+
4. **If `rank` is absent** (pre-rank deployment) → proceed in passthrough mode, exactly as `/blocker-review` does, and note it.
|
|
22
|
+
|
|
23
|
+
> Belt-and-braces only: the server already rejects `/blockers/:id/resolve` with `403` for non-Metic+ ([ADR 0018](../../../docs/adr/<redacted>.md), [`docs/canonical-permissions.md`](../../../docs/canonical-permissions.md)). Markdown never grants authority (criterion C7) — this check just stops a Xenos before they walk a whole solve only to 403 on the resolve.
|
|
24
|
+
|
|
25
|
+
## Guardrails — read before you touch anything
|
|
26
|
+
|
|
27
|
+
These are what keep a "solve" honest. Violating them turns a helpful session into a lying ledger or an untracked change.
|
|
28
|
+
|
|
29
|
+
- **Verify before you resolve. Never resolve on assumption.** Resolve **only** when either (a) a programmatic probe confirms the fix is live, or (b) the item is genuinely un-probeable and the owner explicitly attests it's done. Write *how* you verified into the `resolution_note`. If you can't verify, the blocker stays **open** — say so plainly. Resolving something to look productive is the one unforgivable move here.
|
|
30
|
+
- **Don't smuggle code through a blocker-solve.** Performing **operator / external / config actions** to clear a blocker (set a repo secret, flip a prod env var, add a Cloudflare rule, change a non-code setting, record a decision) *is* the blocker's purpose and is in-scope for this cadence, claim-free — same standing as `/blocker-review` resolving a blocker. **But if clearing the blocker requires net-new _code_, stop** and route that through a normal claimed task (`/builder-start` → claim → `/builder-ship`). Every code change is backed by a claimed task — there is no blocker-solve loophole.
|
|
31
|
+
- **Sensitive or outward-facing actions need the owner's explicit go-ahead in this session before you execute them** — SSH to the prod droplet, `git push`, rotating a credential, anything that spends money or is hard to reverse. Present the exact command and wait for "yes."
|
|
32
|
+
- **Server enforces rank, not this skill.** You only ever *call* the rank-gated endpoints; you never reimplement or bypass the gate.
|
|
33
|
+
|
|
34
|
+
## The flow
|
|
35
|
+
|
|
36
|
+
### 1. Gather context
|
|
37
|
+
Read the blocker fully, then enrich it:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
node scripts/gds/api.js GET /api/gds/blockers/<id>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Fields: `title`, `body_md` (often already contains a numbered "Steps (owner): …" plan — lean on it), `source`, `source_ref`, `status`, plus `blocking_task_ids` from the list view (`GET /api/gds/blockers`). These linked tasks are exactly what will auto-promote when you resolve.
|
|
44
|
+
|
|
45
|
+
- Read any linked task's notes (`GET /api/gds/tasks/<task-id>`) — the source task usually explains what "done" means.
|
|
46
|
+
- Pull project knowledge so you're not re-deriving: `node scripts/gds/recall.js "<the blocker's topic>"` (add `--kind doc` for ADRs/recipes). This surfaces the ADR, recipe, or past session that already documents how to do this thing.
|
|
47
|
+
|
|
48
|
+
If the blocker is already `status: resolved`, stop — there's nothing to solve; tell the user and exit.
|
|
49
|
+
|
|
50
|
+
### 2. Plan and split the steps
|
|
51
|
+
Turn the blocker into a concrete checklist, and label every step **[I can do]** or **[needs you]**:
|
|
52
|
+
|
|
53
|
+
- **[I can do]** — anything reachable from this session: a repo secret via `gh`, a prod env flip via SSH (with go-ahead), a config/DNS/Cloudflare change via an available API token, regenerating a doc, running a script.
|
|
54
|
+
- **[needs you]** — anything that only the owner can perform: logging into a third-party dashboard, a billing/plan change, a payment, granting an API-token scope, or a business/architectural decision.
|
|
55
|
+
|
|
56
|
+
Present the checklist to the user before acting, so they see what you're about to do and what you'll need from them.
|
|
57
|
+
|
|
58
|
+
### 3. Execute or guide
|
|
59
|
+
- For each **[I can do]** step: do it. For sensitive/outward steps, show the exact command and get the explicit go-ahead first (see guardrails).
|
|
60
|
+
- For each **[needs you]** step: write **precise, click-by-click** instructions (Lars is non-technical — name the dashboard, the menu, the exact field; see CLAUDE.md §2). Then **pause** and wait. This pause is the whole point of "needs manual attention" — the flow is identical, you just don't perform that one step.
|
|
61
|
+
|
|
62
|
+
### 4. Verify the fix actually landed
|
|
63
|
+
Pick the cheapest real check for the step's kind — examples:
|
|
64
|
+
|
|
65
|
+
| Blocker kind | How to verify |
|
|
66
|
+
|---|---|
|
|
67
|
+
| Repo secret / branch protection / Actions | `gh secret list`, `gh api repos/:owner/:repo/branches/main/protection`, or confirm the relevant workflow run went green |
|
|
68
|
+
| Cloudflare rule / token scope | probe the live behavior — `curl` the affected URL and assert the header/cookie/cache behaves; or read it back via the CF API if a token is in env |
|
|
69
|
+
| Prod env var / service config | with go-ahead, SSH the droplet and `grep` the EnvironmentFile, or hit a health/echo endpoint that reflects the setting |
|
|
70
|
+
| DNS / domain | `dig`/`curl` the host and confirm it resolves/serves as expected |
|
|
71
|
+
| Business or architectural decision | not probeable — take the owner's explicit attestation, and if it's an architectural call, capture it in an ADR or the source task's notes |
|
|
72
|
+
|
|
73
|
+
If verification **fails or is impossible and the owner won't attest**, do **not** resolve. Leave it open, and report exactly what's still needed.
|
|
74
|
+
|
|
75
|
+
### 5. Auto-resolve and report
|
|
76
|
+
Once verified, resolve it. Write the note as *what unblocked it + how you verified* — that's the durable audit trail. Use a temp file to dodge shell-quoting:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
node scripts/gds/api.js POST /api/gds/blockers/<id>/resolve --body-file <path-to-note.json>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
where the file is `{ "resolution_note": "<what was done> — verified via <how>." }`.
|
|
83
|
+
|
|
84
|
+
The response includes `promoted_tasks` — the tasks the trigger just flipped `blocked → ready`. **Surface them**: tell the user what's now claimable (and offer `/builder-start` if they have time). If `promoted_tasks` is empty, say so — it means nothing downstream was waiting, the blocker was just cluttering the "stuck on you" list.
|
|
85
|
+
|
|
86
|
+
## Tone for the user
|
|
87
|
+
|
|
88
|
+
Lars is the prompter (CLAUDE.md §2). Frame around the outcome, not the plumbing. For **[needs you]** steps, be a precise guide — exact clicks, no jargon — never a nag. Some blockers are genuinely external and may stay open; that's fine. Your job is to do everything you can, make the rest a clean one-step ask, verify honestly, and close the loop the moment it's real.
|
|
89
|
+
|
|
90
|
+
## Where this fits
|
|
91
|
+
|
|
92
|
+
This skill is the **reusable core** of the blocker-solve idea. Future entry points call into this same flow rather than reinventing it:
|
|
93
|
+
- a hall **"Solve this"** button on the Archon blocker card (records an intent), and
|
|
94
|
+
- a **cloud / autonomous runner** that spins the session up server-side (mirroring the `box_intents` control-plane pattern, [ADR 0031](../../../docs/adr/<redacted>.md)), pinging the owner only for the **[needs you]** steps.
|
|
95
|
+
|
|
96
|
+
Both reuse the gather → do/guide → verify → auto-resolve loop above. (Filed under GDS-V4; see the task that shipped this skill.)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: builder-backup
|
|
3
|
+
description: Check the status of GDS database backups or trigger a fresh one. Use before risky changes (migrations, destructive SQL, large refactors) to ensure a recent restore point exists. Triggers when the user says "/builder-backup", "take a backup", "check backup status", "trigger a backup", "backup before migrating", or asks about the last backup.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are helping the builder interact with the GDS database backup system.
|
|
7
|
+
|
|
8
|
+
## What this skill does
|
|
9
|
+
|
|
10
|
+
Runs `node scripts/gds/backup.js` (status check) or `node scripts/gds/backup.js --trigger` (fire a fresh dump + wait for it to land).
|
|
11
|
+
|
|
12
|
+
The backup infrastructure runs on the production droplet:
|
|
13
|
+
- **Nightly local dump** — `pg_dump` to `/var/backups/gds/` as `<db>-<timestamp>.sql.gz`, 30-day retention (task [#412](https://example.com/builders#/task/412))
|
|
14
|
+
- **Weekly offsite copy** — latest local dump uploaded to DigitalOcean Spaces, 4-week retention (task [#415](https://example.com/builders#/task/415), ADR 0025)
|
|
15
|
+
|
|
16
|
+
This skill lets a Metic+ builder check on backups and take a fresh one — no SSH, no systemctl, no server access.
|
|
17
|
+
|
|
18
|
+
## When to use
|
|
19
|
+
|
|
20
|
+
- **Before a risky change** — before running a DB migration, writing destructive SQL, or shipping a large schema change. `--trigger` gives you a restore point dated seconds ago instead of up to ~24 hours ago (nightly window).
|
|
21
|
+
- **Restore readiness check** — after a trigger, confirm the dump landed and looks sane (filename, size, timestamp) before proceeding.
|
|
22
|
+
|
|
23
|
+
## How to use
|
|
24
|
+
|
|
25
|
+
### Check status (no action, just info)
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
node scripts/gds/backup.js
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Outputs the latest dump filename, timestamp, size, and count of retained dumps.
|
|
32
|
+
|
|
33
|
+
### Trigger a fresh backup
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
node scripts/gds/backup.js --trigger
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Fires a fresh local dump on the server. Polls until the new dump lands (up to ~60 s) and prints its details on success.
|
|
40
|
+
|
|
41
|
+
## Rank gate
|
|
42
|
+
|
|
43
|
+
Both commands require **Metic or Archon** rank. The server enforces this per-request.
|
|
44
|
+
|
|
45
|
+
## Restore
|
|
46
|
+
|
|
47
|
+
If you need to restore from a backup, follow the restore drill in `docs/recipes/gds-db-backup.md`. Restore is a destructive Archon-only operation — do NOT attempt it without Lars's explicit sign-off.
|
|
48
|
+
|
|
49
|
+
## After using this skill
|
|
50
|
+
|
|
51
|
+
If you triggered a backup before a migration:
|
|
52
|
+
1. Confirm the new dump landed (skill prints this on success).
|
|
53
|
+
2. Note the dump filename in your session log so the restore point is traceable.
|
|
54
|
+
3. Proceed with the risky operation.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: builder-box
|
|
3
|
+
description: Show the builder their own dev box — state, IP/hostname, cost, and their registered SSH keys — and help them get (back) on it: (re)connect, queue a hands-off auto-provision/wake (POST /box/ensure, #701), fetch the browser-terminal URL + password for a Chromebook (ADR 0038, #760), or find their live game-preview "sandbox" URL (ADR 0044, #898). Triggers when the user says "/builder-box", "what's my box doing", "is my box up", "my dev box status", "show my box", "list my ssh keys", "wake my box", "create my box", "how do I get back on my box", "what's my sandbox URL", or "preview my game". Own-scoped — the only mutation it may trigger is queuing an auto-provision/wake of the caller's OWN box; it never parks or destroys (that is the operator's `node scripts/gds/box.js`).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are showing a builder the status of **their own** dev box and helping them get (back) onto it. This is a read-only, own-scoped helper — it never mutates infrastructure (provision / park / wake / deprovision live on the operator control plane, `node scripts/gds/box.js`, gated by rank).
|
|
7
|
+
|
|
8
|
+
## Background
|
|
9
|
+
|
|
10
|
+
The per-builder box lifecycle (ADR 0031 §2) auto-suspends when idle (snapshot-and-park) and recreates on demand, so a builder's box is often `parked` between sessions — that's normal and cheap, not a problem. The read API:
|
|
11
|
+
- `GET /api/gds/box/me` → the caller's box: `state`, `scope`, `ip`, `hostname`, cost, activity timestamps.
|
|
12
|
+
- `GET /api/gds/box/ssh-key` → the caller's registered SSH keys (fingerprints + labels).
|
|
13
|
+
- `GET /api/gds/box/terminal` → the caller's active box's browser-terminal `url` + basic-auth `credential` (the Chromebook/browser on-ramp, ADR 0038), once the box has published them.
|
|
14
|
+
|
|
15
|
+
**The hands-off on-ramp (#701).** A builder no longer needs an operator to get or wake a box. `POST /api/gds/box/ensure` is the "make my box ready" button: it **auto-provisions** if they have no box, or **wakes** a parked one — by queuing a request the control plane runs within ~1 min (the web server never touches DigitalOcean directly). For a Chromebook, after `ensure` reports `active`, `GET /box/terminal` returns the terminal `url` + `credential` (ADR 0038) to open in the browser.
|
|
16
|
+
|
|
17
|
+
## How to use
|
|
18
|
+
|
|
19
|
+
1. **Fetch the box + keys** (own-scoped; uses the builder's session token):
|
|
20
|
+
```bash
|
|
21
|
+
node -e 'const{apiCall}=require("./scripts/gds/cli-lib");(async()=>{for(const p of ["/api/gds/box/me","/api/gds/box/ssh-key"]){const r=await apiCall("GET",p);console.log(p,r.status,JSON.stringify(r.data));}})()'
|
|
22
|
+
```
|
|
23
|
+
(If the script returns "no GDS session", run `/builder-setup` first.)
|
|
24
|
+
|
|
25
|
+
2. **Relay it in plain language:**
|
|
26
|
+
- **state = `none`** → they have no box yet. On a Mac/Windows: run `/builder-connect` (registers their SSH key + installs the Desktop file). To actually create the box hands-off, `POST /api/gds/box/ensure` queues the auto-provision (no operator CLI needed). *(The old path — ask an operator to `box.js onboard <login>` — still works but is no longer required.)*
|
|
27
|
+
- **state = `active`** → box is up at `hostname` (`ip`). They can connect from Claude Desktop → Code → Environment → "Example Dev Box". For a browser/Chromebook (ADR 0038), the terminal comes from the web: `GET /api/gds/box/terminal` returns a `url` + a basic-auth `credential` (username `otb`, password = <redacted>; open the url, enter them, then type `claude` in the terminal. No SSH needed.
|
|
28
|
+
- **Live game preview — the sandbox (ADR 0044).** If `/box/terminal` returns a `url` (i.e. the box is on the named tunnel), the builder also has a private live preview of the game running on their own box, at the **same hostname with `term-` swapped for `sandbox-`** — e.g. terminal `https://term-<login>.example.com` → preview `https://sandbox-<login>.example.com`. It serves their working copy of the game (degraded — fully playable, no saved state), so they can review changes in a browser **without shipping to prod**. The loop: edit in the terminal → run **`/builder-stage`** (or `box-preview restart`) → refresh the preview tab. Staging via `/builder-stage` also records the review marker that `/builder-ship`'s sandbox-first gate checks (#927, ADR 0046) — on a dev box, game changes are staged + reviewed on the sandbox before they ship to the main game. `box-preview status` shows whether it's up + the URL; `box-preview logs` tails the server. (No preview on a quick-tunnel box — that path can't carry the game port; it needs the named tunnel.)
|
|
29
|
+
- **state = `parked`** → idle-suspended (cheap, expected). It wakes on demand: `POST /api/gds/box/ensure` queues the wake and it's back in ~1 min (no operator needed). Reassure them their data is safe in the snapshot.
|
|
30
|
+
- **state = `provisioning` / `waking`** → in flight; check back in a minute.
|
|
31
|
+
- **state = `error`** → flag it to an operator (don't try to fix infra from here).
|
|
32
|
+
- **SSH keys** → list the fingerprints + labels. If empty, they haven't connected yet → `/builder-connect`. They can remove a stale key with `DELETE /api/gds/box/ssh-key/:id` (own-scoped).
|
|
33
|
+
|
|
34
|
+
3. **Cost framing (if asked):** a box only bills compute while `active`; parked costs ~$0.30/mo (just the snapshot). The number in `compute_cost_usd` is their box's running total.
|
|
35
|
+
|
|
36
|
+
## Constraints
|
|
37
|
+
|
|
38
|
+
- **`POST /box/ensure` is the only mutation a builder may trigger** — and it only *queues* an auto-provision/wake of their **own** box (rank-gated, one open request at a time); the web server never touches DigitalOcean. Never call provision/park/wake/**deprovision** directly — those are operator control-plane commands (`node scripts/gds/box.js`), rank-gated. If the builder wants their box destroyed, that's an operator action.
|
|
39
|
+
- **Own resource only.** `/box/me` and `/box/ssh-key` are scoped to the caller. The full roster (`GET /api/gds/boxes`) is Archon-only — don't try it for a regular builder.
|
|
40
|
+
- **Don't print the SSH private key** — these endpoints only ever return public fingerprints, never private material. Keep it that way.
|
|
41
|
+
|
|
42
|
+
## Files this skill touches
|
|
43
|
+
|
|
44
|
+
- Calls: `/api/gds/box/me`, `/api/gds/box/ssh-key` (read), `/api/gds/box/terminal` (read), optionally `POST /api/gds/box/ensure` (queue auto-provision/wake) or `DELETE /api/gds/box/ssh-key/:id`
|
|
45
|
+
- Reads: `~/.config/otb/gds-session.json` (the session token, via cli-lib)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: builder-claim
|
|
3
|
+
description: Atomically claim a GDS task by id so this session has exclusive control over it. Triggers when the user says "/builder-claim N", "claim task N", "I'll work on N", or after `/builder-start` when the user picks one. Refuses if the task is already claimed, not ready, or has unshipped dependencies. (touches[] overlap with another active claim is ADVISORY for an interactive claim — it warns, it does not refuse; task 880.)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
**Script skill (authoritative).** The core action is `node scripts/gds/claim.js <task-id> [--worktree NAME]`. Once the args are determined, run it and relay its output verbatim — do not paraphrase error messages or reformat the claimed card.
|
|
7
|
+
|
|
8
|
+
You are claiming a task on behalf of the current builder. The claim is atomic — either it succeeds (and the task is locked to this session) or it fails with a clear reason and the user picks differently.
|
|
9
|
+
|
|
10
|
+
## What this skill does
|
|
11
|
+
|
|
12
|
+
Runs `node scripts/gds/claim.js <task-id> [--worktree NAME]`. The CLI hits `POST /api/gds/claims`, which transactionally:
|
|
13
|
+
|
|
14
|
+
1. Verifies the task exists and is `ready`.
|
|
15
|
+
2. Verifies all declared `dependencies[]` are in `shipped` status (V3.R02 / migration 020).
|
|
16
|
+
3. Checks `touches[]` overlap (prefix-aware) against active claims. This is **advisory** for an interactive claim — it returns an `overlap_warning` and the claim still succeeds. It is a hard `TOUCHES_CONFLICT` refusal **only** when `--enforce-touches` is passed (the autonomous `--parallel` runner). (task 880)
|
|
17
|
+
4. Inserts the claim row (the unique partial index gates concurrent attempts on the *same* task).
|
|
18
|
+
5. Flips the task to `active`.
|
|
19
|
+
|
|
20
|
+
Any failure mode comes back as a JSON error code (`TASK_NOT_FOUND`, `TASK_NOT_READY`, `DEPS_NOT_SHIPPED`, `TOUCHES_CONFLICT`, `ALREADY_CLAIMED`, the session-scoped one-claim guard `session_already_has_active_claim` (task 1642), plus V3.R13 #237's newcomer gates: `stage_required`, `newcomer_must_ship_first`). The CLI surfaces these clearly.
|
|
21
|
+
|
|
22
|
+
## One claim per session / one worktree per claim (task 1642)
|
|
23
|
+
|
|
24
|
+
A CLI session may hold **at most one active claim at a time**, and that claim should run in its **own dedicated worktree**. This is structural, not a style preference: working two tasks from one worktree lands every commit on the single branch that worktree owns, so `/builder-ship` publishes the whole branch and drags the other task's commits into the wrong ship (a *commingled ship*). One claim → one worktree → one clean branch keeps every ship isolated.
|
|
25
|
+
|
|
26
|
+
The server now **enforces** the one-claim half (task 1642): `POST /api/gds/claims` refuses a second claim when the **same session** already holds an active one, returning `409 session_already_has_active_claim` (the body names the in-flight task id + title). This is session-scoped (a builder may still run several sessions in parallel, each with its own worktree and its own single claim) and fail-closed. So the **default claim flow must put the task in a fresh worktree** — never reuse a worktree that already owns a claim.
|
|
27
|
+
|
|
28
|
+
**Default flow — claim into a dedicated worktree:**
|
|
29
|
+
|
|
30
|
+
1. **Ensure a dedicated worktree for this task** before claiming. If the harness exposes a worktree primitive (e.g. `EnterWorktree` named `task-N`), enter a worktree named for the task id so this claim gets its own branch and never reuses a busy worktree. If you are already in a clean, claim-free worktree dedicated to this task, stay in it. If the current worktree already holds another active claim, do **not** claim here — open a new worktree/session first (the server will refuse otherwise).
|
|
31
|
+
|
|
32
|
+
2. **Then claim** following the steps below, passing the worktree's leaf-folder name via `--worktree`.
|
|
33
|
+
|
|
34
|
+
## How to use
|
|
35
|
+
|
|
36
|
+
1. **Confirm the task id with the user** if they didn't give a number directly.
|
|
37
|
+
|
|
38
|
+
2. **Determine the worktree name** (cross-platform). If we're inside a worktree, the worktree name is the leaf folder of the current path. Resolve it portably with node (works on Windows/macOS/Linux — no `basename`/`$PWD` shell-isms):
|
|
39
|
+
```
|
|
40
|
+
node -e "console.log(require('path').basename(process.cwd()))"
|
|
41
|
+
```
|
|
42
|
+
Then pass it via `--worktree`.
|
|
43
|
+
|
|
44
|
+
3. **Run**:
|
|
45
|
+
```
|
|
46
|
+
node scripts/gds/claim.js <task-id> --worktree <worktree-name>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
4. **On success**, relay the claim id, task title, version, priority, credit reward, and the `touches[]` to the user. Treat `touches[]` as an **advisory hint** at the expected blast radius — NOT an editing fence. Code legitimately wanders into files nobody predicted; that is fine and no longer ship-blocking (the grader reads the real committed diff, and `git merge` is the authoritative collision detector). If the claim returned an `overlap_warning`, relay it too — it just means another active claim declares overlapping files; the user self-serializes only if it's genuinely the same code.
|
|
50
|
+
|
|
51
|
+
**Render the claimed card (task 1275).** _As of task 1288 the lifecycle-card `PostToolUse` hook (`.claude/hooks/lifecycle-card.js`) reads this card and injects a one-step render directive right after `claim.js` runs — normally just follow that injected directive and render **once**; the detail below is the fallback if no directive appears._ `claim.js` prints the deterministic lifecycle card for the `claimed` stage — a monospace card plus, when the builder has widgets on (the default), an `[otb-card-html] <path>` marker. If that marker is present **and** an in-feed visualization tool is available (e.g. `show_widget`), **Read that file and pass its exact contents** to the tool as `widget_code` (title like `task_<id>_claimed`); it shows the scope (priority / estimate / touches), the brief in its dropdown, and an "Open the work" action routed to the task's discipline session. **Author nothing yourself and don't restate the claim in prose** — the card is the summary. If instead you see an `[otb-card] widgets are off …` line (the builder disabled widgets via Settings → Rendering, task 1279) — or no visualization tool is available — the monospace card already printed IS the summary; relay it as-is and do not call show_widget.
|
|
52
|
+
|
|
53
|
+
5. **On `ALREADY_CLAIMED`**: another session beat us to it. Run `/builder-start` again to get a fresh list and let the user pick something else.
|
|
54
|
+
|
|
55
|
+
6. **On `TOUCHES_CONFLICT`** (only when `--enforce-touches` was passed — the autonomous `--parallel` path): the API tells us which task titles are conflicting. For a parallel run, drop this task and take the next disjoint one. (An interactive claim never hits this — it gets an `overlap_warning` and succeeds.)
|
|
56
|
+
|
|
57
|
+
7. **On `TASK_NOT_READY`**: the task has been moved to a different status. Surface the current status. The user may need to `promote` it or pick a different task.
|
|
58
|
+
|
|
59
|
+
8. **On `DEPS_NOT_SHIPPED`**: the API returns the list of unshipped deps. Surface them and tell the user to ship those first (or pick a different task whose deps are clear). Do NOT promote the dep or override — the dep system exists precisely to gate this case.
|
|
60
|
+
|
|
61
|
+
9. **On `stage_required`**: a generic onboarding-stage gate (no specific stage gates claims today — the primer gate was removed in #766). Surface `what_to_do` verbatim; don't try to force the claim.
|
|
62
|
+
|
|
63
|
+
10. **On `newcomer_must_ship_first`** (#766 newcomer focus rule): the builder is a Xenos who already holds one active claim and is trying to open a second. They must ship (or release) the current work before claiming again. The API response includes the active claim's task id and title — surface them and suggest `/builder-ship N` (or `/builder-release N` to abandon). The rule lifts automatically once they graduate to Thetes (after their 3rd shipped task).
|
|
64
|
+
|
|
65
|
+
11. **On `session_already_has_active_claim`** (task 1642 — applies to **all ranks**): this *session* already holds an active claim, and a session may hold only one (one worktree → one branch → no commingled ships). The body names `active_task_id` + `active_task_title`. Surface them with `what_to_do`: either `/builder-ship N` (or `/builder-release N`) the in-flight task first, **or** open a fresh worktree/session for this new task and claim there. Do not retry in the same worktree — the refusal is the guard working. (`session_claim_check_failed` is the rare fail-closed variant when the server couldn't verify the session state; same remedy — retry, or use a fresh session/worktree.)
|
|
66
|
+
|
|
67
|
+
## Constraints
|
|
68
|
+
|
|
69
|
+
- **Don't retry on conflict.** Failures here are intentional — they protect us from race conditions.
|
|
70
|
+
- **Don't claim multiple tasks in one go.** A **session** holds at most one active claim at a time (task 1642, server-enforced). If this session already has one, surface it and either ship/release it first or open a fresh worktree/session for the new task.
|
|
71
|
+
- **Don't bypass the API.** Direct DB writes would skip the touches-conflict check.
|
|
72
|
+
|
|
73
|
+
## Files this skill touches
|
|
74
|
+
|
|
75
|
+
- Reads: `~/.config/otb/gds-session.json`
|
|
76
|
+
- Calls: `POST /api/gds/claims`
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: builder-connect
|
|
3
|
+
description: One-command connect of the builder's Claude Desktop to their Example dev box (ADR 0031, #685). Triggers when the user says "/builder-connect", "connect me to the dev box", "set up my dev box", "connect Claude Desktop to the box", or "onboard me to the box". Runs the self-contained bootstrap that signs the builder in with GitHub, creates + registers their SSH key, and installs the Claude Desktop connection file — then tells them to restart Desktop and pick "Example Dev Box". This is the BUILDER side; the OPERATOR side is `node scripts/gds/box.js onboard <login>`.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are guiding a builder through connecting their **own machine's** Claude Desktop to their org dev box. The audience is often non-technical — narrate each step in plain language, and never make them hand-edit files or paste keys around. One command does everything.
|
|
7
|
+
|
|
8
|
+
## Background (the mental model — ADR 0031)
|
|
9
|
+
|
|
10
|
+
Claude Code is three pieces: the **screen** (their device — always local), the **worker** (the dev box — where the repo + work live), and the **brain** (Anthropic's servers). This skill wires the screen to the box. The box itself is provisioned by an operator with `node scripts/gds/box.js onboard <login>`; this skill is the builder's half — it registers their SSH key and installs the Desktop connection file so the box shows up as a one-click "Environment".
|
|
11
|
+
|
|
12
|
+
What the bootstrap does, in order:
|
|
13
|
+
1. **GitHub sign-in** (device flow against the GDS — it prints a short code + a URL to open).
|
|
14
|
+
2. **Creates an SSH key** at `~/.ssh/otb_builder` if absent (the private half never leaves their machine).
|
|
15
|
+
3. **Registers the public key** with the GDS (`POST /box/ssh-key`). The box pulls it into `authorized_keys` itself — no operator SSH round-trip.
|
|
16
|
+
4. **Downloads + installs** the Claude Desktop connection file (`managed-settings.json`) at the OS path.
|
|
17
|
+
|
|
18
|
+
## How to use
|
|
19
|
+
|
|
20
|
+
1. **Decide which command to run.** Both do the same thing; pick by where you're running:
|
|
21
|
+
- **Repo is present locally** (you can see `infra/box-connect.sh`): run the local copy —
|
|
22
|
+
```bash
|
|
23
|
+
bash infra/box-connect.sh
|
|
24
|
+
```
|
|
25
|
+
- **No repo** (a bare laptop with only Claude Desktop): run the hosted bootstrap —
|
|
26
|
+
- macOS / Linux:
|
|
27
|
+
```bash
|
|
28
|
+
curl -fsSL https://example.com/api/gds/box/connect.sh | bash
|
|
29
|
+
```
|
|
30
|
+
- Windows (PowerShell):
|
|
31
|
+
```powershell
|
|
32
|
+
irm https://example.com/api/gds/box/connect.ps1 | iex
|
|
33
|
+
```
|
|
34
|
+
(For staging, swap the host — or set `GDS_API_BASE` before the local script.)
|
|
35
|
+
|
|
36
|
+
2. **Relay the GitHub code + URL verbatim.** The script prints a short user code and a `https://github.com/login/device` URL. The builder must open the URL and enter the code. Do not summarize — they need the literal values. The script also tries to pop the URL open automatically.
|
|
37
|
+
|
|
38
|
+
3. **Wait while it polls.** After they approve in the browser, the script registers the key and installs the connection file. On macOS the install step needs **one `sudo` prompt** (the file lives under `/Library/Application Support/ClaudeCode` — the dir Claude Code actually reads managed settings from; `…/Claude/` is silently ignored).
|
|
39
|
+
|
|
40
|
+
4. **Confirm the finish state and give the next steps:**
|
|
41
|
+
- Tell their operator they're registered (so the operator runs `box.js onboard <login>` to provision the box, if not already done).
|
|
42
|
+
- **Restart Claude Desktop.**
|
|
43
|
+
- Open **Code → Environment → "Example Dev Box"** to connect.
|
|
44
|
+
|
|
45
|
+
5. **Once they're on the box**, the first thing to do there is authenticate the GDS CLI (`/builder-setup` or `node scripts/gds/setup.js`) so the box can pull rank-scoped source and keep their SSH keys in sync.
|
|
46
|
+
|
|
47
|
+
## Constraints
|
|
48
|
+
|
|
49
|
+
- **Never print or save the SSH private key or the GDS token anywhere except where the script puts them.** The private key stays at `~/.ssh/otb_builder`; the token is held only in memory on the laptop for the two authenticated calls (it is NOT persisted there — the box gets its own session when they authenticate Claude Code on it).
|
|
50
|
+
- **Don't re-generate a key if `~/.ssh/otb_builder` already exists** — the script reuses it. Overwriting would break an existing box connection. (The script handles this; don't override it.)
|
|
51
|
+
- **If `auth_not_configured` comes back**, the GDS has no GitHub OAuth app — stop and point them to an Archon (`blockers/blockers.md#github-oauth-app`). Don't loop.
|
|
52
|
+
- **Memory + credits are server-side** (ADR 0024) — reassure the builder that nothing about which box they land on affects their history.
|
|
53
|
+
|
|
54
|
+
## Files this skill touches
|
|
55
|
+
|
|
56
|
+
- Runs: `infra/box-connect.sh` (or the hosted `GET /api/gds/box/connect.sh` / `.ps1`)
|
|
57
|
+
- Reads/creates: `~/.ssh/otb_builder` (+ `.pub`)
|
|
58
|
+
- Writes (macOS): `/Library/Application Support/ClaudeCode/managed-settings.json`; (Windows): `%ProgramFiles%\ClaudeCode\managed-settings.json` — the dir Claude Code reads managed settings from. **Not** `…/Claude/` or `%ProgramData%\Claude\`, which the app ignores (the box then never appears in the Environment picker).
|
|
59
|
+
- Calls: `/api/gds/auth/device/{start,poll}`, `/api/gds/box/ssh-key`, `/api/gds/box/managed-settings`
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: builder-cost
|
|
3
|
+
description: Log a cost entry to the GDS — API spend, infra cost, art-pipeline credits, etc. Triggers when the user says "/builder-cost", "log cost", "I just spent X on Y", or after a session that consumed billable credits. Categories are api | compute | infra | domain | art | other.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
**Script skill (authoritative).** The core action is `node scripts/gds/cost.js <amount-usd> <category> [--task-id N] [--description "..."] [--skill <name>]`. Once the args are determined, run it and print its output verbatim.
|
|
7
|
+
|
|
8
|
+
You are logging a cost entry on behalf of the current builder. The GDS keeps a running ledger that powers the cost-vs-value charts on `status.example.com`.
|
|
9
|
+
|
|
10
|
+
## What this skill does
|
|
11
|
+
|
|
12
|
+
Runs `node scripts/gds/cost.js <amount-usd> <category> [--task-id N] [--description "..."] [--source "..."] [--skill <name>]`.
|
|
13
|
+
|
|
14
|
+
The CLI hits `POST /api/gds/cost`, which inserts a `cost_log` row.
|
|
15
|
+
|
|
16
|
+
## How to use
|
|
17
|
+
|
|
18
|
+
1. **Determine the amount in USD.** Round to four decimals (the column accepts numeric(10,4)). For Anthropic API spend, use the API response's `usage` block × the model's pricing.
|
|
19
|
+
|
|
20
|
+
2. **Pick a category**:
|
|
21
|
+
- `api` — Anthropic API, Google AI Studio, GitHub paid features, etc.
|
|
22
|
+
- `compute` — droplet upgrades, ad-hoc cloud spend
|
|
23
|
+
- `infra` — backups, monitoring, CDN paid plans
|
|
24
|
+
- `domain` — Cloudflare Registrar renewals
|
|
25
|
+
- `art` — direct art commissions or stock-asset purchases
|
|
26
|
+
- `other` — when none fit, with a clear description
|
|
27
|
+
|
|
28
|
+
3. **Attach to a task if one applies** — `--task-id <N>`. This is what makes the cost-vs-value chart per-task accurate.
|
|
29
|
+
|
|
30
|
+
4. **Attach to a skill if this cost was incurred by a skill invocation** — `--skill <skill-name>` (e.g. `--skill idea-triage`). This populates the `skill_name` column for per-skill spend measurement (ADR #304).
|
|
31
|
+
|
|
32
|
+
5. **Run** and print the output verbatim:
|
|
33
|
+
```bash
|
|
34
|
+
node scripts/gds/cost.js 0.42 api --task-id 12 --description "Anthropic API: 4.2k input + 1.1k output"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Constraints
|
|
38
|
+
|
|
39
|
+
- **Don't log speculative cost.** Only log spend that has actually been incurred (or is committed and irreversible).
|
|
40
|
+
- **Don't log Lars's personal time** — credits are how that's accounted for, not USD.
|
|
41
|
+
- **Don't double-count.** Before logging an art-pipeline cost manually, verify it isn't already in the DB from the one-time cost-ledger backfill (those rows use `source: 'art-cost-ledger'`).
|
|
42
|
+
- **Don't log without a description for `other` category.**
|
|
43
|
+
|
|
44
|
+
## Files this skill touches
|
|
45
|
+
|
|
46
|
+
- Reads: `~/.config/otb/gds-session.json`
|
|
47
|
+
- Calls: `POST /api/gds/cost`
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: builder-end
|
|
3
|
+
description: One command to safely close out a Claude Code session — resolve the active claim (ship or release), verify the git tree is clean so nothing is lost, tear down this session's worktree, and (on a dev box) offer to shut the box down. Triggers when the user says "/builder-end", "close out my session", "close out my online terminal session", "end my session", "sign off", "wrap up and clean up", "I'm done for now, clean up", or "ship/release this and tear down the worktree". This is the session close-out a builder reaches for via /builder-exit — that one offboards a whole builder and is Archon-only; this is the everyday own-scoped close-out. Own-scoped: only this session's own claim + own worktree + own box.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are closing out the current Claude Code **session** safely: resolve the held claim, confirm no work is stranded uncommitted, and clean up the session's git worktree. It is the bookend to `/builder-start` — one command so a session ends in a known-clean state instead of leaving a half-shipped claim and an orphaned worktree behind.
|
|
7
|
+
|
|
8
|
+
This is **not** `/builder-exit` — that deactivates an entire builder (releases all claims, drops rank to Xenos). `/builder-end` is the everyday "I'm done with this session" close-out for one session's one claim.
|
|
9
|
+
|
|
10
|
+
## What this skill does
|
|
11
|
+
|
|
12
|
+
Composes operations that already exist, in a safe order, with the destructive ones gated last:
|
|
13
|
+
|
|
14
|
+
1. **Resolve the claim** — `/builder-ship` when there's committed, shippable work; `/builder-release` when there isn't. (It calls the sibling skills; it does not re-implement shipping.)
|
|
15
|
+
2. **Clean-git verify** — refuse to go further if any *tracked* file is uncommitted. This is the same guard `scripts/gds/ship.js` enforces (`trackedDirty` in [`src/bongos/ship-preflight.js`](../../../src/bongos/ship-preflight.js)): untracked scratch is ignored, but a modified/staged/deleted tracked file means real work isn't committed — stop before anything is lost.
|
|
16
|
+
3. **Worktree teardown** — from the main checkout, `git worktree remove` this session's linked worktree, `prune`, and delete the now-merged `claude/<name>` branch.
|
|
17
|
+
4. **Box close-out (dev box only)** — if running on a dev box (`/etc/otb/box.env` exists), offer to `close-box` so the box stops billing. Optional and gated on a yes; declining just lets the box idle-park. On a laptop this step is skipped — there's no box to close.
|
|
18
|
+
|
|
19
|
+
It never pushes to `main`, never `ssh`-es, never runs a deploy — landing is `/builder-ship`'s job (server-mediated). It only ever touches the caller's **own** claim, **own** worktree, and **own** box.
|
|
20
|
+
|
|
21
|
+
## How to use
|
|
22
|
+
|
|
23
|
+
### 0. Snapshot the session state — read, don't mutate yet
|
|
24
|
+
|
|
25
|
+
- **Held claim(s):** `node scripts/gds/api.js GET /api/gds/me` → `active_claims`. (A builder can hold parallel claims across sessions; resolve only the one this session worked.)
|
|
26
|
+
- **Are we in a linked worktree?** `git rev-parse --git-dir` differs from `git rev-parse --git-common-dir` ⇒ yes (`--git-dir` is the per-worktree `<main>/.git/worktrees/<name>`; `--git-common-dir` is the shared `<main>/.git`); they're equal ⇒ main checkout (skip step 3). Test `--git-dir`, **not** `--git-common-dir` — the latter always returns the shared `<main>/.git` even inside a worktree, so checking *it* for `/worktrees/` never matches.
|
|
27
|
+
- **Are we on a dev box?** `/etc/otb/box.env` exists ⇒ yes. This is the codebase's canonical "am I on a box?" marker — written by `box.js provision`, the same presence-check `scripts/gds/sandbox-stage.js` (`isDevBox`) uses. On a box the close-out has an extra step: the box keeps billing until it's shut down or idle-parks (step 4). On a laptop there's no box — skip step 4.
|
|
28
|
+
- **Working-tree state:** `git status --porcelain`.
|
|
29
|
+
- **Commits ahead of main:** `git rev-list --count main..HEAD` (fall back to `origin/main..HEAD`). Real commits ⇒ likely shippable; zero ⇒ likely a release.
|
|
30
|
+
|
|
31
|
+
### 1. Resolve the claim
|
|
32
|
+
|
|
33
|
+
- **Commits ahead AND clean tree ⇒ shippable.** Confirm with the user, then run the **`builder-ship`** skill with honest handoff `--notes` and a one-line non-jargon `--summary`. Don't fabricate the summary — if you can't state the value plainly, it isn't shippable; release instead.
|
|
34
|
+
- **No commits / no shippable progress ⇒** run the **`builder-release`** skill with a one-phrase reason.
|
|
35
|
+
- **No active claim ⇒** nothing to resolve; go to step 2.
|
|
36
|
+
- **Ship strands at `confirmed`** (merge conflict or a failing check — the box ships, the merge doesn't): **stop here.** The branch still needs to land via `/merge-mode`. Surface that and do NOT tear down the worktree — its branch isn't merged yet (step 3's `git branch -d` would correctly refuse it).
|
|
37
|
+
|
|
38
|
+
### 2. Clean-git verify
|
|
39
|
+
|
|
40
|
+
Re-run `git status --porcelain`. Apply the `trackedDirty` rule: ignore `??` untracked lines, but if **any** tracked file is modified/staged/deleted/renamed/unmerged, **stop** and surface those files so the user can commit or discard them. Never tear down a worktree that still holds uncommitted tracked work — that is exactly how work gets lost.
|
|
41
|
+
|
|
42
|
+
### 3. Worktree teardown — gated, and last
|
|
43
|
+
|
|
44
|
+
Proceed only when **all** hold: we're in a linked worktree, the claim is resolved, the tree is clean, and (for a ship) the branch is merged into `main`.
|
|
45
|
+
|
|
46
|
+
You can't remove the worktree you're standing in, so run the removal **from the main checkout** — resolve its path the way `ship.js` does (`findMainWorktree`: parse `git worktree list --porcelain` for the block whose `branch` is `main`). From there:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
git worktree remove <this-worktree-path> # refuses if dirty — that's the safety net; do not --force
|
|
50
|
+
git worktree prune
|
|
51
|
+
git branch -d claude/<worktree-name> # -d (not -D): git refuses an unmerged branch, by design
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Removing this session's worktree ends its filesystem — do it last, and tell the user the session is closed and they can start fresh from `/builder-start` anytime. **On a dev box, settle step 4 first:** if the builder is going to `close-box`, skip teardown entirely — deprovisioning destroys the whole `/workspace` disk, so removing one worktree first is wasted effort. Only tear the worktree down if they're keeping the box.
|
|
55
|
+
|
|
56
|
+
**On the main checkout (not a worktree):** skip the teardown above — there's nothing to remove. On a **laptop** that means resolving the claim + clean-git verify is the whole close-out. On a **dev box** (step 0 found `/etc/otb/box.env`) the box itself is still up — continue to step 4.
|
|
57
|
+
|
|
58
|
+
### 4. Box close-out — dev box only, gated, after the claim is resolved
|
|
59
|
+
|
|
60
|
+
Skip this entirely if step 0 found no `/etc/otb/box.env` (a laptop — there's no box to close). On a box, resolving the claim does **not** stop the box billing; only closing it (or the idle-suspend sweep) does. Once the claim is resolved and the tree is clean, ask plainly:
|
|
61
|
+
|
|
62
|
+
> *"Close the box down too? `close-box` deprovisions it — anything in `/workspace` you haven't shipped is gone. Or leave it: closing the tab keeps your session, and the box idle-parks on its own (cheap)."*
|
|
63
|
+
|
|
64
|
+
- **Yes, shut it down** → run the **`close-box`** skill (`node scripts/gds/api.js POST /api/gds/box/close`). It enqueues a deprovision that runs within ~a minute. This **subsumes** worktree teardown — the whole box disk is going away, so step 3 was moot.
|
|
65
|
+
- **No, keep the box** → leave it; it idle-parks automatically. The close-out is complete (claim resolved, worktree torn down in step 3 if applicable). Tell them they can reopen the terminal to resume, or `/builder-box` to check/wake it later.
|
|
66
|
+
|
|
67
|
+
`close-box` is **own-scoped** — it only ever deprovisions the caller's own box. Never another builder's.
|
|
68
|
+
|
|
69
|
+
## Constraints
|
|
70
|
+
|
|
71
|
+
- **Own-scoped.** Only this session's claim, this session's worktree, and the caller's own box — never another builder's claim, never another worktree, never `git worktree remove` a path you didn't create, never another builder's box.
|
|
72
|
+
- **Never destroy uncommitted work.** The clean-git verify gates teardown; `git worktree remove` (no `--force`) and `git branch -d` (not `-D`) are the load-bearing safety nets — keep them as written.
|
|
73
|
+
- **Box close is opt-in and destructive.** On a box, never `close-box` without an explicit yes — it deprovisions the box and any unshipped `/workspace` work is gone. Declining is always fine; the box idle-parks on its own.
|
|
74
|
+
- **Never push / ssh / deploy.** Landing goes through `/builder-ship` (server-mediated); this skill stays local to the builder's machine (its one possible API write is the opt-in own-scoped `close-box`).
|
|
75
|
+
- **The destructive steps (teardown, box-close) never run unattended without a clear go.** Ship vs. release can be inferred from state (commits ⇒ ship, none ⇒ release) and proceed; removing the worktree ends the session and closing the box destroys it, so wait for an explicit yes before steps 3 and 4.
|
|
76
|
+
- **Don't tear down a branch that isn't merged.** A released task or a ship stuck at `confirmed` still has an un-landed `claude/*` branch — `git branch -d` will refuse it; respect that and leave the worktree for `/merge-mode`.
|
|
77
|
+
|
|
78
|
+
## Files this skill touches
|
|
79
|
+
|
|
80
|
+
- Reads: `~/.config/otb/gds-session.json`; `/etc/otb/box.env` (presence check only — "am I on a box?")
|
|
81
|
+
- Runs: the `builder-ship` / `builder-release` skills (`scripts/gds/ship.js` · `release.js`), `node scripts/gds/api.js GET /api/gds/me`, and local `git worktree` / `git status` / `git branch` commands. On a dev box, if the builder opts in, it runs the `close-box` skill (`POST /api/gds/box/close`) — the one own-scoped API write it can make; otherwise it makes no API writes of its own.
|