@bongos/core 1.21.175 → 1.21.177
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 +3371 -1636
- package/.claude/skills/ask-for-help/SKILL.md +4 -4
- package/.claude/skills/backlog-review/SKILL.md +1 -1
- package/.claude/skills/blocker-review/SKILL.md +2 -2
- package/.claude/skills/blocker-solve/SKILL.md +4 -4
- package/.claude/skills/bongos-feedback/SKILL.md +1 -1
- package/.claude/skills/bug-triage/SKILL.md +8 -8
- package/.claude/skills/builder-backup/SKILL.md +3 -3
- package/.claude/skills/builder-claim/SKILL.md +5 -5
- package/.claude/skills/builder-cost/SKILL.md +5 -5
- package/.claude/skills/builder-end/SKILL.md +6 -6
- package/.claude/skills/builder-exit/SKILL.md +2 -2
- package/.claude/skills/builder-key/SKILL.md +6 -6
- package/.claude/skills/builder-reauth/SKILL.md +4 -4
- package/.claude/skills/builder-redteam/SKILL.md +3 -3
- package/.claude/skills/builder-release/SKILL.md +3 -3
- package/.claude/skills/builder-sequence/SKILL.md +8 -8
- package/.claude/skills/builder-setup/SKILL.md +4 -4
- package/.claude/skills/builder-ship/SKILL.md +7 -7
- package/.claude/skills/builder-stage/SKILL.md +8 -8
- package/.claude/skills/builder-start/SKILL.md +4 -4
- package/.claude/skills/collab-review/SKILL.md +5 -5
- package/.claude/skills/design/SKILL.md +6 -4
- package/.claude/skills/design-sync/SKILL.md +3 -3
- package/.claude/skills/figma-design-sync/SKILL.md +4 -4
- package/.claude/skills/fix-task/SKILL.md +8 -8
- package/.claude/skills/goal-close/SKILL.md +9 -9
- package/.claude/skills/goal-create/SKILL.md +18 -18
- package/.claude/skills/grade-recover/SKILL.md +8 -8
- package/.claude/skills/grade-sweep/SKILL.md +15 -15
- package/.claude/skills/idea-triage/SKILL.md +15 -15
- package/.claude/skills/merge-mode/SKILL.md +14 -14
- package/.claude/skills/new-project/SKILL.md +5 -5
- package/.claude/skills/owner-review/SKILL.md +1 -1
- package/.claude/skills/planning-session/SKILL.md +15 -15
- package/.claude/skills/priority-session/SKILL.md +6 -6
- package/.claude/skills/read-session-export/SKILL.md +3 -3
- package/.claude/skills/recall/SKILL.md +7 -7
- package/.claude/skills/scan-before-install/SKILL.md +3 -3
- package/.claude/skills/session-handoff/SKILL.md +1 -1
- package/.claude/skills/ship-check/SKILL.md +3 -3
- package/.claude/skills/status/SKILL.md +3 -3
- package/.claude/skills/strand-fix/SKILL.md +6 -6
- package/.claude/skills/worktree-clean/SKILL.md +4 -4
- package/.gitattributes +12 -32
- package/GOVERNMENT.md +1 -1
- package/README.md +8 -8
- package/bin/bongos.js +23 -23
- package/clients/bongos-client/README.md +2 -2
- package/clients/bongos-client/bongos-client.global.js +22 -4
- package/clients/bongos-client/index.cjs +22 -4
- package/clients/bongos-client/index.d.ts +33 -4
- package/clients/bongos-client/index.mjs +21 -3
- package/config/branding.neutral.json +1 -1
- package/config/design-tokens.schema.json +1 -1
- package/config/modules.neutral.json +1 -3
- package/config/scheduled-routines.json +3 -8
- package/docs/adr/0029-status-page-outage-resilience.md +6 -6
- package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +1 -1
- package/docs/adr/0093-tranche-2-core-carve-sequence.md +1 -1
- package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
- package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
- package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
- package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
- package/docs/adr/README.md +2 -0
- package/docs/api/openapi.json +606 -44
- package/docs/api-reference.md +25 -12
- package/docs/architecture.md +8 -7
- package/docs/canonical-permissions.md +4 -4
- package/docs/copy-inventory.md +1370 -1411
- package/docs/copy-registry.json +2136 -2536
- package/docs/design/demonolith-plan.md +6 -6
- package/docs/design/modular-architecture/00-research-report.md +1 -1
- package/docs/design/project-startup-direction.md +2 -2
- package/docs/design/projects-hub-direction-v2.md +1 -1
- package/docs/design/reviews/hall-v2/README.md +2 -2
- package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
- package/docs/file-map.md +92 -96
- package/docs/handoff-template.md +5 -5
- package/docs/module-api-changelog.md +7 -3
- package/docs/modules-contract.md +8 -7
- package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
- package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
- package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
- package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
- package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
- package/docs/onboarding/diagrams/README.md +5 -9
- package/docs/onboarding/diagrams/assertions.json +3 -3
- package/docs/onboarding/slash-commands.md +2 -2
- package/docs/packs/artist.md +4 -4
- package/docs/packs/engineer.md +11 -10
- package/docs/packs/ideator.md +7 -7
- package/docs/page-inventory.json +20 -1
- package/docs/page-readings.json +4387 -4603
- package/docs/recipes/README.md +1 -1
- package/docs/recipes/audit-replay.md +4 -4
- package/docs/recipes/autobongos-windows-host.md +6 -6
- package/docs/recipes/bongos-cli-release.md +2 -2
- package/docs/recipes/claude-design-loop.md +7 -7
- package/docs/recipes/core-release-pipeline.md +19 -19
- package/docs/recipes/failed-ship-recovery-proof.md +2 -2
- package/docs/recipes/figma-design-loop.md +6 -6
- package/docs/recipes/gds-db-backup.md +9 -9
- package/docs/recipes/instance-deploy.md +3 -3
- package/docs/recipes/instance-first-run.md +1 -1
- package/docs/recipes/multi-builder-merge.md +2 -2
- package/docs/recipes/ops-gotchas.md +13 -10
- package/docs/recipes/packaging-the-core.md +6 -6
- package/docs/recipes/parallel-goal-waves.md +4 -4
- package/docs/recipes/private-npm-distribution.md +9 -9
- package/docs/recipes/redteam-patrol.md +5 -5
- package/docs/recipes/render-pilot.md +2 -2
- package/docs/recipes/reranking-a-goals-board.md +2 -2
- package/docs/recipes/search-index-ingestion.md +5 -5
- package/docs/recipes/self-host.md +1 -1
- package/docs/recipes/ship-and-regrade.md +4 -4
- package/docs/recipes/staging-environment.md +1 -1
- package/docs/recipes/standalone-live-docs.md +1 -1
- package/docs/recipes/ui-look-before-you-ship.md +2 -2
- package/docs/recipes/upgrading-the-core.md +11 -11
- package/docs/recipes/windows-builders.md +18 -18
- package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
- package/docs/research/task-network-map-readability.md +3 -3
- package/migrations/core_278_builder_tester_tag.sql +18 -0
- package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
- package/modules/agents/lib/answer-hold.js +1 -1
- package/modules/agents/lib/gate.js +1 -1
- package/modules/agents/lib/validate.js +1 -1
- package/modules/autonomy/db.js +9 -0
- package/modules/autonomy/gauge.js +1 -1
- package/modules/autonomy/governor-docket.js +2 -2
- package/modules/autonomy/module.json +2 -2
- package/modules/autonomy/pollers/daily-checks.js +262 -0
- package/modules/autonomy/pollers/routine-timers.js +9 -7
- package/modules/autonomy/rank-roles.js +64 -0
- package/modules/autonomy/routes/autonomy.js +3 -3
- package/modules/autonomy/server-schedule.js +37 -0
- package/modules/builder-settings/interaction-prefs.js +1 -1
- package/modules/builder-settings/render-prefs.js +1 -1
- package/modules/builder-settings/routes/settings.js +1 -1
- package/modules/builder-settings/skill-prefs.js +2 -2
- package/modules/builder-settings/wandering-prefs.js +2 -2
- package/modules/copy-desk/module.json +2 -2
- package/modules/copy-desk/page-data.js +5 -5
- package/modules/copy-desk/page-decisions.js +13 -1
- package/modules/copy-desk/proposals.js +4 -4
- package/modules/copy-desk/registry.js +2 -2
- package/modules/copy-desk/routes/copy-desk-release.js +119 -0
- package/modules/copy-desk/routes/copy-desk.js +3 -12
- package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
- package/modules/copy-desk/tests/copy_flags.mjs +1 -1
- package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
- package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
- package/modules/copy-desk/tests/copy_queue.mjs +1 -1
- package/modules/design-styles/skills/README.md +4 -4
- package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
- package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
- package/modules/discord/bug-attachments.js +1 -1
- package/modules/discord/ship-broadcast.js +1 -1
- package/modules/economy/achievements.js +49 -7
- package/modules/economy/cost-classify.js +6 -6
- package/modules/economy/cost-report.js +1 -1
- package/modules/economy/cost.js +1 -1
- package/modules/economy/credits.js +2 -1
- package/modules/economy/idea-size.js +2 -2
- package/modules/economy/reward.js +2 -0
- package/modules/economy/routes/cost.js +1 -1
- package/modules/economy/streak.js +43 -4
- package/modules/government/asks.js +1 -1
- package/modules/government/board.js +19 -2
- package/modules/government/catalog.js +3 -0
- package/modules/government/migrations/government_033_idea_vote.sql +46 -0
- package/modules/government/protected-surfaces.json +48 -47
- package/modules/government/recommendations.js +6 -2
- package/modules/government/routes/government.js +1 -1
- package/modules/grading/generated-provenance.js +13 -5
- package/modules/grading/grade-engine.js +1 -1
- package/modules/grading/grader-rubric.json +1 -1
- package/modules/grading/grader-score.js +1 -1
- package/modules/grading/grader-workers/index.js +1 -1
- package/modules/grading/grader.js +1 -1
- package/modules/grading/routes/grade.js +1 -1
- package/modules/hall-ui/public/atlas.html +5 -7
- package/modules/hall-ui/public/atlas.js +1 -1
- package/modules/hall-ui/public/atlas.states.json +1 -1
- package/modules/hall-ui/public/blockers.css +9 -0
- package/modules/hall-ui/public/blockers.html +4 -4
- package/modules/hall-ui/public/blockers.js +29 -30
- package/modules/hall-ui/public/board-room.css +5 -17
- package/modules/hall-ui/public/board-room.html +5 -6
- package/modules/hall-ui/public/board-room.js +41 -23
- package/modules/hall-ui/public/board-room.states.json +1 -1
- package/modules/hall-ui/public/brand-apply.js +1 -1
- package/modules/hall-ui/public/brand-holes.js +1 -1
- package/modules/hall-ui/public/builders.js +40 -86
- package/modules/hall-ui/public/city-decide.js +18 -4
- package/modules/hall-ui/public/city.html +1 -1
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/commands.html +6 -9
- package/modules/hall-ui/public/copy-desk.html +1 -1
- package/modules/hall-ui/public/copy-desk.js +2 -2
- package/modules/hall-ui/public/craft-mode.js +4 -0
- package/modules/hall-ui/public/deploy.html +6 -2
- package/modules/hall-ui/public/deploy.js +21 -13
- package/modules/hall-ui/public/diagrams.css +1 -1
- package/modules/hall-ui/public/diagrams.html +5 -8
- package/modules/hall-ui/public/diagrams.states.json +1 -1
- package/modules/hall-ui/public/drachmae.html +3 -7
- package/modules/hall-ui/public/fleet.html +3 -2
- package/modules/hall-ui/public/fleet.js +0 -4
- package/modules/hall-ui/public/gate.html +7 -7
- package/modules/hall-ui/public/gate.js +58 -77
- package/modules/hall-ui/public/goal-map.html +1 -1
- package/modules/hall-ui/public/goals-page.js +5 -5
- package/modules/hall-ui/public/goals-render.js +10 -11
- package/modules/hall-ui/public/goals.css +10 -0
- package/modules/hall-ui/public/goals.html +14 -7
- package/modules/hall-ui/public/government.html +3 -5
- package/modules/hall-ui/public/government.js +1 -5
- package/modules/hall-ui/public/hall-render.js +117 -57
- package/modules/hall-ui/public/hall-widgets.js +11 -11
- package/modules/hall-ui/public/idea.html +1 -1
- package/modules/hall-ui/public/ideas.html +3 -1
- package/modules/hall-ui/public/ideas.js +1 -0
- package/modules/hall-ui/public/index.html +12 -6
- package/modules/hall-ui/public/index.states.json +1 -1
- package/modules/hall-ui/public/mine-lens.js +1 -1
- package/modules/hall-ui/public/modules.html +7 -10
- package/modules/hall-ui/public/modules.js +0 -2
- package/modules/hall-ui/public/my-agents.html +1 -1
- package/modules/hall-ui/public/palette.js +5 -5
- package/modules/hall-ui/public/primer.html +4 -9
- package/modules/hall-ui/public/profile-connections.js +10 -2
- package/modules/hall-ui/public/profile-roles.js +3 -10
- package/modules/hall-ui/public/profile.html +12 -10
- package/modules/hall-ui/public/profile.js +13 -17
- package/modules/hall-ui/public/project-settings.html +3 -4
- package/modules/hall-ui/public/project-settings.js +0 -3
- package/modules/hall-ui/public/ranks.html +5 -11
- package/modules/hall-ui/public/ranks.js +6 -8
- package/modules/hall-ui/public/roadmap.css +0 -2
- package/modules/hall-ui/public/roadmap.html +1 -1
- package/modules/hall-ui/public/roadmap.js +16 -51
- package/modules/hall-ui/public/roster.html +1 -1
- package/modules/hall-ui/public/sessions.html +6 -8
- package/modules/hall-ui/public/sessions.js +7 -7
- package/modules/hall-ui/public/settings.html +1 -1
- package/modules/hall-ui/public/shell-trail.js +1 -1
- package/modules/hall-ui/public/shell.js +17 -17
- package/modules/hall-ui/public/street-deck.css +2 -1
- package/modules/hall-ui/public/street-deck.js +10 -2
- package/modules/hall-ui/public/street-desk.js +16 -5
- package/modules/hall-ui/public/street.html +1 -1
- package/modules/hall-ui/public/studio-lib.js +4 -0
- package/modules/hall-ui/public/studio.css +2 -0
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/studio.js +27 -1
- package/modules/hall-ui/public/style.css +43 -26
- package/modules/hall-ui/public/task-detail.js +10 -7
- package/modules/hall-ui/public/task.css +2 -0
- package/modules/hall-ui/public/task.html +3 -1
- package/modules/hall-ui/public/task.js +23 -7
- package/modules/hall-ui/public/thinking.html +1 -1
- package/modules/hall-ui/public/tweak-editor.html +1 -1
- package/modules/hall-ui/public/vote-control.js +208 -0
- package/modules/hall-ui/public/watch.html +3 -5
- package/modules/hall-ui/public/watch.js +5 -4
- package/modules/hall-ui/public/welcome-boot.css +130 -0
- package/modules/hall-ui/public/welcome-boot.js +334 -0
- package/modules/hall-ui/public/welcome-day.webp +0 -0
- package/modules/hall-ui/public/welcome-night.webp +0 -0
- package/modules/hall-ui/public/work-summary.js +1 -1
- package/modules/hall-ui/public/work.css +1 -0
- package/modules/hall-ui/public/work.html +3 -1
- package/modules/hall-ui/public/work.js +2 -1
- package/modules/hall-ui/records/accomplishments.md +16 -0
- package/modules/hall-ui/records/hall-ask-card.md +9 -0
- package/modules/hall-ui/records/karma-vote-control.md +13 -0
- package/modules/hall-ui/records/oversight-family.md +1 -1
- package/modules/hall-ui/records/profile-connections.md +2 -0
- package/modules/hall-ui/records/profile-roles.md +1 -1
- package/modules/hall-ui/records/reading-rooms.md +1 -1
- package/modules/hall-ui/records/welcome-tower.md +50 -0
- package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
- package/modules/ideas/projection.js +1 -1
- package/modules/ideas/routes/blockers.js +3 -3
- package/modules/ideas/routes/inbox.js +29 -1
- package/modules/ideas/routes/ratify-goal.js +1 -1
- package/modules/ideas/routing.js +1 -1
- package/modules/ideas/templates.js +1 -1
- package/modules/ideas/trail-descent.js +1 -1
- package/modules/ideas/trail-size.js +1 -1
- package/modules/ideas/votes.js +93 -0
- package/modules/lifecycle/abandon-leftovers.js +1 -1
- package/modules/lifecycle/cascade.js +1 -1
- package/modules/lifecycle/conflict-resolve.js +13 -21
- package/modules/lifecycle/criterion-ref.js +1 -1
- package/modules/lifecycle/db-analytics.js +57 -4
- package/modules/lifecycle/db-deps-criteria.js +1 -1
- package/modules/lifecycle/db-ship.js +2 -2
- package/modules/lifecycle/db-tasks.js +2 -2
- package/modules/lifecycle/db-versions.js +1 -1
- package/modules/lifecycle/db.js +2 -0
- package/modules/lifecycle/dead-deps.js +3 -3
- package/modules/lifecycle/dependency-advisory.js +3 -3
- package/modules/lifecycle/goal-category.js +1 -1
- package/modules/lifecycle/goal-forest.js +1 -1
- package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
- package/modules/lifecycle/kickoff-checklist.js +1 -1
- package/modules/lifecycle/kickoff-seed.js +1 -1
- package/modules/lifecycle/lifecycle.js +2 -0
- package/modules/lifecycle/merge-reach.js +29 -15
- package/modules/lifecycle/missing-dep-classify.js +3 -3
- package/modules/lifecycle/module.json +2 -1
- package/modules/lifecycle/page-tweak-approve.js +85 -1
- package/modules/lifecycle/page-tweak-hold.js +1 -1
- package/modules/lifecycle/publish-reconciler.js +1 -2
- package/modules/lifecycle/rot.js +1 -1
- package/modules/lifecycle/routes/artist-gate.js +1 -1
- package/modules/lifecycle/routes/gate-approvals.js +22 -1
- package/modules/lifecycle/routes/goals.js +1 -1
- package/modules/lifecycle/routes/task-route-helpers.js +1 -1
- package/modules/lifecycle/routes/task-votes.js +54 -0
- package/modules/lifecycle/routes/task-write-routes.js +1 -1
- package/modules/lifecycle/routes/tasks.js +2 -2
- package/modules/lifecycle/routes/versions.js +2 -2
- package/modules/lifecycle/ship-card.js +4 -4
- package/modules/lifecycle/ship-preflight.js +1 -1
- package/modules/lifecycle/task-classifier.js +1 -1
- package/modules/lifecycle/task-status.js +1 -1
- package/modules/lifecycle/task-visual-db.js +1 -1
- package/modules/memory/learnings.js +1 -1
- package/modules/memory/pollers/search-index.js +2 -2
- package/modules/memory/routes/learnings.js +1 -1
- package/modules/memory/routes/memory.js +1 -1
- package/modules/memory/search.js +2 -2
- package/modules/npm-release/release.js +1 -1
- package/modules/onboarding/howto-moments.js +1 -1
- package/modules/onboarding/newcomer-restock.js +3 -3
- package/modules/onboarding/onboarding.js +1 -1
- package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
- package/modules/platform-identity/origin-containment.js +1 -1
- package/modules/platform-identity/publish-gate.js +1 -1
- package/modules/platform-identity/tests/platform-identity.mjs +1 -1
- package/modules/provisioning/capacity.js +1 -1
- package/modules/provisioning/core-upgrade.js +15 -9
- package/modules/provisioning/credential-preflight.js +3 -3
- package/modules/provisioning/disconnect.js +1 -1
- package/modules/provisioning/dns-resolves.js +1 -1
- package/modules/provisioning/module.json +1 -1
- package/modules/provisioning/onboard-plan.js +1 -1
- package/modules/provisioning/paid-shape-gate.js +2 -2
- package/modules/provisioning/planet-physics.js +11 -2
- package/modules/provisioning/pollers/liveness-sweep.js +1 -1
- package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
- package/modules/provisioning/provisioning.js +2 -2
- package/modules/provisioning/render-lookup.js +1 -1
- package/modules/provisioning/render-standup.js +3 -3
- package/modules/provisioning/repo-private.js +1 -1
- package/modules/provisioning/routes/callback-page.js +1 -1
- package/modules/provisioning/routes/core-upgrade.js +23 -3
- package/modules/provisioning/routes/provisioning.js +2 -2
- package/modules/provisioning/routes/render-standup.js +1 -1
- package/modules/provisioning/routes/repo-private.js +1 -1
- package/modules/provisioning/soft-limits.js +1 -1
- package/modules/provisioning/starter-bundles.js +4 -2
- package/modules/provisioning/tests/provisioning.mjs +1 -1
- package/modules/public-landing/public/account.html +4 -6
- package/modules/public-landing/public/assets/cosmos.css +13 -6
- package/modules/public-landing/public/connections.html +4 -6
- package/modules/public-landing/public/contact.html +4 -6
- package/modules/public-landing/public/guild.html +4 -6
- package/modules/public-landing/public/index.html +11 -9
- package/modules/public-landing/public/invitations.html +4 -6
- package/modules/public-landing/public/privacy.html +4 -6
- package/modules/public-landing/public/projects.html +168 -46
- package/modules/public-landing/public/terms.html +4 -6
- package/modules/raise/content/copy.json +40 -0
- package/modules/raise/content/nda.html +39 -0
- package/modules/raise/content/settings.json +49 -0
- package/modules/raise/db.js +95 -0
- package/modules/raise/migrations/raise_001_tables.sql +71 -0
- package/modules/raise/module.json +28 -0
- package/modules/raise/page.js +194 -0
- package/modules/raise/public/edit.js +152 -0
- package/modules/raise/public/favicon.svg +1 -0
- package/modules/raise/public/logo-ink.svg +1 -0
- package/modules/raise/public/logo-night.svg +1 -0
- package/modules/raise/public/mode.js +8 -0
- package/modules/raise/public/raise.css +234 -0
- package/modules/raise/public/raise.js +91 -0
- package/modules/raise/raise.js +174 -0
- package/modules/raise/routes/raise.js +152 -0
- package/modules/raise/views/gate.html +39 -0
- package/modules/raise/views/nda.html +21 -0
- package/modules/raise/views/page.html +133 -0
- package/modules/raise/web.js +72 -0
- package/modules/render-deploy/deploys.js +1 -1
- package/modules/render-deploy/render.js +2 -2
- package/modules/security/secret-scrub.js +3 -3
- package/modules/security/security.js +1 -1
- package/modules/security/tests/artifact_scan.mjs +1 -1
- package/modules/security/tests/mirror.mjs +1 -1
- package/modules/security/tests/scan_store.mjs +1 -1
- package/modules/sessions/db.js +2 -2
- package/modules/sessions/pulse.js +2 -2
- package/modules/sessions/routes/sessions.js +1 -1
- package/modules/specialities/specialities.js +1 -1
- package/modules/status-ui/public/README.md +3 -4
- package/modules/status-ui/public/index.html +5 -31
- package/modules/status-ui/public/status.js +6 -174
- package/modules/status-ui/public/style.css +4 -133
- package/modules/ui-design/docs/design-contract.md +3 -3
- package/modules/ui-design/kit/README.md +1 -1
- package/modules/ui-design/kit/serve.js +13 -4
- package/modules/ui-design/scripts/design-sync.js +1 -1
- package/modules/ui-design/scripts/figma-design-sync.js +1 -1
- package/modules/ui-design/scripts/validate-design.js +1 -1
- package/package-lock.json +27 -11
- package/package.json +2 -3
- package/release-notes.json +186 -0
- package/scripts/bongos/CLAUDE.md +15 -0
- package/scripts/bongos/abandon.js +137 -0
- package/scripts/bongos/accessibility-replay.js +195 -0
- package/scripts/bongos/address-park-sweep.sh +91 -0
- package/scripts/bongos/adopt-detect.js +123 -0
- package/scripts/bongos/adopt-import.js +111 -0
- package/scripts/bongos/adopt-preflight.js +187 -0
- package/scripts/bongos/adr-namespace.js +273 -0
- package/scripts/bongos/agent-invoke.js +689 -0
- package/scripts/bongos/agents-sync.js +502 -0
- package/scripts/bongos/api-alias-caller-scan.js +256 -0
- package/scripts/bongos/api-artifacts.js +91 -0
- package/scripts/bongos/api.js +86 -0
- package/scripts/bongos/api.ps1 +26 -0
- package/scripts/bongos/architect-audit.js +294 -0
- package/scripts/bongos/artifact-audit.js +326 -0
- package/scripts/bongos/artifact-format.js +203 -0
- package/scripts/bongos/ask.js +231 -0
- package/scripts/bongos/audit-authorship.sh +324 -0
- package/scripts/bongos/audit-deps.js +189 -0
- package/scripts/bongos/audit-gate.js +121 -0
- package/scripts/bongos/audit-rank-roles.js +131 -0
- package/scripts/bongos/audit-replay.sh +205 -0
- package/scripts/bongos/autobongos-digest.js +123 -0
- package/scripts/bongos/autobongos-grade-cap.js +187 -0
- package/scripts/bongos/autobongos-loop.js +210 -0
- package/scripts/bongos/autobongos-run.js +1361 -0
- package/scripts/bongos/autobongos-service.cmd +50 -0
- package/scripts/bongos/autobongos-service.ps1 +270 -0
- package/scripts/bongos/autobongos-tweak-lane.js +262 -0
- package/scripts/bongos/autobongos-verify.js +618 -0
- package/scripts/bongos/autonomy-gate.js +135 -0
- package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
- package/scripts/bongos/autonomy-gauge.js +84 -0
- package/scripts/bongos/backfill-cost.js +176 -0
- package/scripts/bongos/backfill-disciplines.js +144 -0
- package/scripts/bongos/backfill-session-earnings.js +123 -0
- package/scripts/bongos/backfill-session-types.js +87 -0
- package/scripts/bongos/backfill-sessions.js +411 -0
- package/scripts/bongos/backfill-subagent-rewards.js +485 -0
- package/scripts/bongos/backfill-task-rewards.js +413 -0
- package/scripts/bongos/backlog-review.js +399 -0
- package/scripts/bongos/backup-dropin-sweep.sh +95 -0
- package/scripts/bongos/backup.js +116 -0
- package/scripts/bongos/baseline-staleness.js +217 -0
- package/scripts/bongos/bfg-principal-token.js +65 -0
- package/scripts/bongos/bug-attachment-audit.js +149 -0
- package/scripts/bongos/bug-attachment-recover.js +198 -0
- package/scripts/bongos/bug-triage.js +292 -0
- package/scripts/bongos/build-bongos.js +94 -0
- package/scripts/bongos/bump-version.js +221 -0
- package/scripts/bongos/capture.js +481 -0
- package/scripts/bongos/category-advisory-guard.js +206 -0
- package/scripts/bongos/ci-grade.js +82 -0
- package/scripts/bongos/claim-recall.js +112 -0
- package/scripts/bongos/claim.js +789 -0
- package/scripts/bongos/claude-materialize.js +1200 -0
- package/scripts/bongos/claude-md-template.js +142 -0
- package/scripts/bongos/cleanup-orphans.js +74 -0
- package/scripts/bongos/cli-lib.js +1226 -0
- package/scripts/bongos/client-baseurl-guard.js +116 -0
- package/scripts/bongos/codemod-rename-scripts-gds.js +380 -0
- package/scripts/bongos/conductor-dispatch.js +535 -0
- package/scripts/bongos/context-pack.js +326 -0
- package/scripts/bongos/control-manifest.js +199 -0
- package/scripts/bongos/copy-apply.js +758 -0
- package/scripts/bongos/copy-inventory.js +571 -0
- package/scripts/bongos/core-origin-follow.js +185 -0
- package/scripts/bongos/core-pin-sync.js +260 -0
- package/scripts/bongos/cost-report.js +63 -0
- package/scripts/bongos/cost.js +47 -0
- package/scripts/bongos/credential-presence.js +296 -0
- package/scripts/bongos/cutover-codemod.js +240 -0
- package/scripts/bongos/db-backup-nightly.sh +232 -0
- package/scripts/bongos/db-backup-offsite.sh +267 -0
- package/scripts/bongos/demote.js +45 -0
- package/scripts/bongos/deploy-divergence.js +454 -0
- package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
- package/scripts/bongos/design-sync.js +12 -0
- package/scripts/bongos/dev-box-guard.js +166 -0
- package/scripts/bongos/dev-lib.js +722 -0
- package/scripts/bongos/dev.js +645 -0
- package/scripts/bongos/device-flow-help.js +72 -0
- package/scripts/bongos/diagnose-achievements.js +118 -0
- package/scripts/bongos/diagram-facts.js +355 -0
- package/scripts/bongos/discord-channels.js +77 -0
- package/scripts/bongos/do-api.js +109 -0
- package/scripts/bongos/doc-cli-guard.js +274 -0
- package/scripts/bongos/doc-comment-coverage.js +139 -0
- package/scripts/bongos/doc-control-claims.js +170 -0
- package/scripts/bongos/docs-entropy.js +453 -0
- package/scripts/bongos/doctor.js +493 -0
- package/scripts/bongos/enroll-control-plane.js +101 -0
- package/scripts/bongos/exec-path-guard.js +564 -0
- package/scripts/bongos/feedback-send.js +249 -0
- package/scripts/bongos/fetch-art-key.js +106 -0
- package/scripts/bongos/fetch-sound-prefs.js +126 -0
- package/scripts/bongos/figma-design-sync.js +11 -0
- package/scripts/bongos/find-untested.js +371 -0
- package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
- package/scripts/bongos/fitness-checks-identity.js +332 -0
- package/scripts/bongos/fitness-checks-packaging.js +132 -0
- package/scripts/bongos/fitness-checks-route-pins.js +76 -0
- package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
- package/scripts/bongos/fitness-checks-write-validation.js +157 -0
- package/scripts/bongos/fitness-lib.js +127 -0
- package/scripts/bongos/fitness-migration-contraction.js +50 -0
- package/scripts/bongos/fitness-ratchets.js +594 -0
- package/scripts/bongos/fitness.js +1498 -0
- package/scripts/bongos/forwarder.js +80 -0
- package/scripts/bongos/gate-review.js +330 -0
- package/scripts/bongos/gating.js +348 -0
- package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
- package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
- package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
- package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
- package/scripts/bongos/gds-literal-scan.js +196 -0
- package/scripts/bongos/gen-api-client.js +576 -0
- package/scripts/bongos/gen-api-docs.js +1111 -0
- package/scripts/bongos/gen-atlas.js +366 -0
- package/scripts/bongos/gen-diagrams.js +608 -0
- package/scripts/bongos/gen-file-map.js +337 -0
- package/scripts/bongos/gen-freshness.js +32 -0
- package/scripts/bongos/gen-interaction-posture.js +122 -0
- package/scripts/bongos/gen-repo-map.js +540 -0
- package/scripts/bongos/gen-role-responsibilities.js +134 -0
- package/scripts/bongos/gen-session-index.js +243 -0
- package/scripts/bongos/gen-sounds.js +176 -0
- package/scripts/bongos/git-merge-regen.js +254 -0
- package/scripts/bongos/go-live.js +1071 -0
- package/scripts/bongos/goal.js +272 -0
- package/scripts/bongos/government-walk.js +1477 -0
- package/scripts/bongos/grade-correlation-audit.js +310 -0
- package/scripts/bongos/grade-replay.js +237 -0
- package/scripts/bongos/grade-smoke.js +205 -0
- package/scripts/bongos/home-isolation-guard.js +126 -0
- package/scripts/bongos/hooks/pre-push.js +211 -0
- package/scripts/bongos/howto.js +145 -0
- package/scripts/bongos/http-api-client.js +81 -0
- package/scripts/bongos/identity-strip.js +75 -0
- package/scripts/bongos/init.js +1159 -0
- package/scripts/bongos/install-git-hooks.js +200 -0
- package/scripts/bongos/instance-apex.js +38 -0
- package/scripts/bongos/intent-retry.js +52 -0
- package/scripts/bongos/key-card.js +222 -0
- package/scripts/bongos/key-status.js +126 -0
- package/scripts/bongos/land-watch.js +201 -0
- package/scripts/bongos/leak-scan-allowlist.js +293 -0
- package/scripts/bongos/learning-capture.js +145 -0
- package/scripts/bongos/lib.sh +74 -0
- package/scripts/bongos/linkify-refs.js +655 -0
- package/scripts/bongos/lint-infra-exec.js +70 -0
- package/scripts/bongos/lint-migrations.js +102 -0
- package/scripts/bongos/lint-workflow-exec.js +63 -0
- package/scripts/bongos/local-preview-lib.js +128 -0
- package/scripts/bongos/local-preview.js +82 -0
- package/scripts/bongos/login.js +360 -0
- package/scripts/bongos/main-audit.js +625 -0
- package/scripts/bongos/me.js +97 -0
- package/scripts/bongos/memory-map.js +176 -0
- package/scripts/bongos/merge-lock.js +71 -0
- package/scripts/bongos/migration-namespace.js +313 -0
- package/scripts/bongos/mirror-lineage-check.js +343 -0
- package/scripts/bongos/mirror-redact.js +350 -0
- package/scripts/bongos/module-artifact.js +289 -0
- package/scripts/bongos/module-assess-docs.js +238 -0
- package/scripts/bongos/module-assess-installs.js +228 -0
- package/scripts/bongos/module-assess-score.js +111 -0
- package/scripts/bongos/module-assess-security.js +252 -0
- package/scripts/bongos/module-assess-tests.js +278 -0
- package/scripts/bongos/module-assess-version.js +92 -0
- package/scripts/bongos/module-error-report.js +148 -0
- package/scripts/{gds → bongos}/module-test-runner/README.md +3 -3
- package/scripts/{gds → bongos}/module-test-runner/module-tests.yml +2 -2
- package/scripts/bongos/module-test-runner.js +414 -0
- package/scripts/bongos/module.js +1376 -0
- package/scripts/bongos/move-escalation.js +141 -0
- package/scripts/{gds → bongos}/newcomer-floor.config.json +1 -1
- package/scripts/bongos/newcomer-floor.js +421 -0
- package/scripts/{gds → bongos}/newcomer-floor.templates.json +13 -13
- package/scripts/bongos/newcomer-floor.test.js +235 -0
- package/scripts/bongos/next-number.js +163 -0
- package/scripts/bongos/oauth-secret.js +202 -0
- package/scripts/bongos/onboard.js +267 -0
- package/scripts/bongos/onboarding-analyze.js +226 -0
- package/scripts/bongos/onboarding-config.js +179 -0
- package/scripts/bongos/onboarding-ship.js +92 -0
- package/scripts/bongos/pack-env-prefix.js +73 -0
- package/scripts/bongos/package-core.js +1200 -0
- package/scripts/bongos/page-inventory.js +348 -0
- package/scripts/bongos/page-reader.js +722 -0
- package/scripts/bongos/paste-token.js +212 -0
- package/scripts/bongos/plain-cards.js +351 -0
- package/scripts/bongos/portability-smoke-art.sh +85 -0
- package/scripts/bongos/portability-smoke-memory.sh +176 -0
- package/scripts/bongos/preflight.js +214 -0
- package/scripts/bongos/probe-cache.js +246 -0
- package/scripts/bongos/prove-strict-versioning.js +284 -0
- package/scripts/bongos/provision-auto-upgrade.js +162 -0
- package/scripts/bongos/provision-byo-host.js +68 -0
- package/scripts/bongos/provision-capacity.js +79 -0
- package/scripts/bongos/provision-caps.js +63 -0
- package/scripts/bongos/provision-config.js +233 -0
- package/scripts/bongos/provision-core-upgrade.js +1166 -0
- package/scripts/bongos/provision-disconnect.js +88 -0
- package/scripts/bongos/provision-github-setup.js +168 -0
- package/scripts/bongos/provision-net.js +357 -0
- package/scripts/bongos/provision-pin-key.js +176 -0
- package/scripts/bongos/provision-pin-replay.js +126 -0
- package/scripts/bongos/provision-process.js +170 -0
- package/scripts/bongos/provision-render.js +201 -0
- package/scripts/bongos/provision-repo-auth.js +164 -0
- package/scripts/bongos/provision-repo-private.js +98 -0
- package/scripts/bongos/provision-repo.js +1337 -0
- package/scripts/bongos/provision-teardown.js +106 -0
- package/scripts/bongos/provision-units.js +469 -0
- package/scripts/bongos/provision.js +1479 -0
- package/scripts/bongos/publish-credential-check.js +66 -0
- package/scripts/bongos/publish-integration-gate.js +142 -0
- package/scripts/bongos/publish-manifest.js +440 -0
- package/scripts/bongos/publish-watch.js +268 -0
- package/scripts/bongos/pulse.js +338 -0
- package/scripts/bongos/push-main.js +56 -0
- package/scripts/bongos/push-path-brief.js +100 -0
- package/scripts/bongos/read-session-export.js +359 -0
- package/scripts/bongos/reauth.js +155 -0
- package/scripts/bongos/recall.js +183 -0
- package/scripts/bongos/redteam-patrol.js +437 -0
- package/scripts/bongos/regen-instance-docs.js +47 -0
- package/scripts/bongos/release-core.js +80 -0
- package/scripts/bongos/release-notes.js +271 -0
- package/scripts/bongos/release.js +139 -0
- package/scripts/bongos/rename-history-check.js +369 -0
- package/scripts/bongos/rename-ledger-prose.js +482 -0
- package/scripts/bongos/render-api.js +197 -0
- package/scripts/bongos/render-check.js +206 -0
- package/scripts/bongos/render-ideas.js +226 -0
- package/scripts/bongos/render-payload.js +85 -0
- package/scripts/bongos/repo-metrics.js +363 -0
- package/scripts/bongos/review-sheet.js +108 -0
- package/scripts/bongos/role-pack-guard.js +142 -0
- package/scripts/bongos/route-shadow-guard.js +175 -0
- package/scripts/bongos/routine-schedule.js +318 -0
- package/scripts/bongos/run-routine.js +257 -0
- package/scripts/bongos/run-unit-tests.js +654 -0
- package/scripts/bongos/runner-drift.js +151 -0
- package/scripts/bongos/sandbox-stage.js +459 -0
- package/scripts/bongos/scope-map-guard.js +300 -0
- package/scripts/bongos/scope-roster-guard.js +118 -0
- package/scripts/bongos/seam-wiring-guard.js +275 -0
- package/scripts/bongos/search-ingest-db.js +288 -0
- package/scripts/bongos/search-ingest-md.js +269 -0
- package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
- package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
- package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
- package/scripts/bongos/seed-staging.sh +117 -0
- package/scripts/bongos/seed-verify-criteria.js +124 -0
- package/scripts/bongos/sequence.js +597 -0
- package/scripts/bongos/session-cost.js +430 -0
- package/scripts/bongos/session-digest-build.js +293 -0
- package/scripts/bongos/session-digest.js +200 -0
- package/scripts/bongos/session-eval.js +631 -0
- package/scripts/bongos/session-transcript-build.js +155 -0
- package/scripts/bongos/session-transcript-upload.js +29 -0
- package/scripts/bongos/session.js +404 -0
- package/scripts/bongos/setup.js +646 -0
- package/scripts/bongos/ship-check.js +89 -0
- package/scripts/bongos/ship-deploy-target.js +393 -0
- package/scripts/bongos/ship-escalation.js +167 -0
- package/scripts/bongos/ship-finish.js +420 -0
- package/scripts/bongos/ship-flow.js +1217 -0
- package/scripts/bongos/ship-git.js +100 -0
- package/scripts/bongos/ship-grade-steps.js +547 -0
- package/scripts/bongos/ship-grade.js +426 -0
- package/scripts/bongos/ship-honesty.js +314 -0
- package/scripts/bongos/ship-io.js +139 -0
- package/scripts/bongos/ship-land.js +1130 -0
- package/scripts/bongos/ship-memory-sync.js +249 -0
- package/scripts/bongos/ship-merge-gate.js +225 -0
- package/scripts/bongos/ship-merge.js +466 -0
- package/scripts/bongos/ship-mode-ask.js +138 -0
- package/scripts/bongos/ship-mode-manual.js +54 -0
- package/scripts/bongos/ship-preflight-steps.js +399 -0
- package/scripts/bongos/ship-regen.js +291 -0
- package/scripts/bongos/ship-resume.js +201 -0
- package/scripts/bongos/ship-session-upload.js +313 -0
- package/scripts/bongos/ship-state.js +110 -0
- package/scripts/bongos/ship-surprise.js +84 -0
- package/scripts/bongos/ship-visual.js +75 -0
- package/scripts/bongos/ship.js +382 -0
- package/scripts/bongos/shipping-mode.js +71 -0
- package/scripts/bongos/skill-lint.js +250 -0
- package/scripts/bongos/skill-preflight.js +361 -0
- package/scripts/bongos/smoke-batch-claim.sh +238 -0
- package/scripts/bongos/smoke-batch-release.sh +316 -0
- package/scripts/bongos/smoke-claim-consistency.sh +222 -0
- package/scripts/bongos/smoke-dependencies.sh +143 -0
- package/scripts/bongos/smoke-gds.js +256 -0
- package/scripts/bongos/smoke-write.sh +275 -0
- package/scripts/bongos/source-text-test-scan.js +106 -0
- package/scripts/bongos/spark.js +294 -0
- package/scripts/bongos/stale-worktrees.js +212 -0
- package/scripts/bongos/start-goals.js +102 -0
- package/scripts/bongos/start.js +1090 -0
- package/scripts/bongos/status.js +545 -0
- package/scripts/bongos/strand-watch.js +315 -0
- package/scripts/bongos/stranded-rows.js +200 -0
- package/scripts/bongos/stray-unit-sweep.sh +71 -0
- package/scripts/bongos/surface.js +101 -0
- package/scripts/bongos/task.js +273 -0
- package/scripts/bongos/test-path-guard.js +99 -0
- package/scripts/bongos/triage.js +742 -0
- package/scripts/bongos/turn-end-sound.js +74 -0
- package/scripts/bongos/tweak-halt.js +70 -0
- package/scripts/bongos/tweak-renders.js +200 -0
- package/scripts/bongos/uat.js +120 -0
- package/scripts/bongos/ui-kit-transform.js +43 -0
- package/scripts/bongos/update-channel.js +512 -0
- package/scripts/bongos/update-sweep.js +829 -0
- package/scripts/bongos/upgrade-artist-gate.js +46 -0
- package/scripts/bongos/upgrade-commit-identity.js +32 -0
- package/scripts/bongos/upgrade-migrate.js +224 -0
- package/scripts/bongos/upgrade-operator.js +73 -0
- package/scripts/bongos/upgrade-outcome.js +174 -0
- package/scripts/bongos/upgrade.js +1499 -0
- package/scripts/bongos/validate-design.js +12 -0
- package/scripts/bongos/version-close.js +621 -0
- package/scripts/bongos/version-literal-guard.js +140 -0
- package/scripts/bongos/version-select.js +79 -0
- package/scripts/bongos/visual-review-nudge.js +39 -0
- package/scripts/bongos/wedge-remedy.js +174 -0
- package/scripts/bongos/worktree-claim-guard.js +130 -0
- package/scripts/bongos/worktree.js +449 -0
- package/scripts/discord/post.js +1 -1
- package/scripts/gds/README.md +9 -0
- package/scripts/gds/abandon.js +6 -136
- package/scripts/gds/accessibility-replay.js +5 -194
- package/scripts/gds/address-park-sweep.sh +7 -90
- package/scripts/gds/adopt-detect.js +5 -121
- package/scripts/gds/adopt-import.js +5 -109
- package/scripts/gds/adopt-preflight.js +5 -185
- package/scripts/gds/adr-namespace.js +5 -271
- package/scripts/gds/agent-invoke.js +5 -687
- package/scripts/gds/agents-sync.js +5 -500
- package/scripts/gds/api-alias-caller-scan.js +5 -255
- package/scripts/gds/api-artifacts.js +6 -0
- package/scripts/gds/api.js +6 -85
- package/scripts/gds/api.ps1 +8 -26
- package/scripts/gds/architect-audit.js +6 -293
- package/scripts/gds/artifact-audit.js +5 -324
- package/scripts/gds/artifact-format.js +6 -203
- package/scripts/gds/ask.js +5 -229
- package/scripts/gds/audit-authorship.sh +7 -328
- package/scripts/gds/audit-deps.js +6 -188
- package/scripts/gds/audit-gate.js +5 -119
- package/scripts/gds/audit-rank-roles.js +6 -171
- package/scripts/gds/audit-replay.sh +7 -204
- package/scripts/gds/autobongos-digest.js +5 -121
- package/scripts/gds/autobongos-grade-cap.js +5 -186
- package/scripts/gds/autobongos-loop.js +5 -208
- package/scripts/gds/autobongos-run.js +5 -1359
- package/scripts/gds/autobongos-service.cmd +8 -49
- package/scripts/gds/autobongos-service.ps1 +8 -270
- package/scripts/gds/autobongos-tweak-lane.js +5 -261
- package/scripts/gds/autobongos-verify.js +5 -616
- package/scripts/gds/autonomy-gate.js +5 -133
- package/scripts/gds/autonomy-gauge-statusline.js +5 -122
- package/scripts/gds/autonomy-gauge.js +5 -82
- package/scripts/gds/backfill-cost.js +6 -175
- package/scripts/gds/backfill-disciplines.js +5 -142
- package/scripts/gds/backfill-session-earnings.js +5 -121
- package/scripts/gds/backfill-session-types.js +5 -85
- package/scripts/gds/backfill-sessions.js +5 -409
- package/scripts/gds/backfill-subagent-rewards.js +5 -483
- package/scripts/gds/backfill-task-rewards.js +5 -411
- package/scripts/gds/backlog-review.js +6 -398
- package/scripts/gds/backup-dropin-sweep.sh +7 -94
- package/scripts/gds/backup.js +6 -115
- package/scripts/gds/baseline-staleness.js +5 -215
- package/scripts/gds/bfg-principal-token.js +6 -64
- package/scripts/gds/bug-attachment-audit.js +5 -147
- package/scripts/gds/bug-attachment-recover.js +5 -196
- package/scripts/gds/bug-triage.js +6 -291
- package/scripts/gds/build-bongos.js +5 -92
- package/scripts/gds/bump-version.js +5 -219
- package/scripts/gds/capture.js +6 -480
- package/scripts/gds/category-advisory-guard.js +5 -205
- package/scripts/gds/ci-grade.js +6 -81
- package/scripts/gds/claim-recall.js +6 -111
- package/scripts/gds/claim.js +6 -788
- package/scripts/gds/claude-materialize.js +5 -1198
- package/scripts/gds/claude-md-template.js +5 -140
- package/scripts/gds/cleanup-orphans.js +6 -73
- package/scripts/gds/cli-lib.js +6 -1204
- package/scripts/gds/client-baseurl-guard.js +5 -114
- package/scripts/gds/conductor-dispatch.js +6 -534
- package/scripts/gds/context-pack.js +6 -325
- package/scripts/gds/control-manifest.js +5 -197
- package/scripts/gds/copy-apply.js +5 -756
- package/scripts/gds/copy-inventory.js +5 -569
- package/scripts/gds/core-origin-follow.js +5 -184
- package/scripts/gds/core-pin-sync.js +5 -258
- package/scripts/gds/cost-report.js +6 -62
- package/scripts/gds/cost.js +6 -46
- package/scripts/gds/credential-presence.js +5 -294
- package/scripts/gds/cutover-codemod.js +5 -239
- package/scripts/gds/db-backup-nightly.sh +7 -231
- package/scripts/gds/db-backup-offsite.sh +7 -266
- package/scripts/gds/demote.js +6 -44
- package/scripts/gds/deploy-divergence.js +6 -445
- package/scripts/gds/deploy-main-audit-gate.sh +7 -96
- package/scripts/gds/design-sync.js +5 -10
- package/scripts/gds/dev-box-guard.js +5 -164
- package/scripts/gds/dev-lib.js +5 -721
- package/scripts/gds/dev.js +5 -643
- package/scripts/gds/device-flow-help.js +5 -70
- package/scripts/gds/diagnose-achievements.js +5 -116
- package/scripts/gds/diagram-facts.js +6 -355
- package/scripts/gds/discord-channels.js +5 -75
- package/scripts/gds/do-api.js +6 -109
- package/scripts/gds/doc-cli-guard.js +5 -266
- package/scripts/gds/doc-comment-coverage.js +5 -137
- package/scripts/gds/doc-control-claims.js +5 -166
- package/scripts/gds/docs-entropy.js +5 -443
- package/scripts/gds/doctor.js +6 -492
- package/scripts/gds/enroll-control-plane.js +5 -99
- package/scripts/gds/exec-path-guard.js +5 -562
- package/scripts/gds/feedback-send.js +5 -247
- package/scripts/gds/fetch-art-key.js +5 -104
- package/scripts/gds/fetch-sound-prefs.js +5 -124
- package/scripts/gds/figma-design-sync.js +5 -9
- package/scripts/gds/find-untested.js +5 -369
- package/scripts/gds/fitness-checks-error-envelope.js +5 -133
- package/scripts/gds/fitness-checks-identity.js +5 -342
- package/scripts/gds/fitness-checks-packaging.js +5 -131
- package/scripts/gds/fitness-checks-route-pins.js +5 -75
- package/scripts/gds/fitness-checks-vocabulary.js +5 -391
- package/scripts/gds/fitness-checks-write-validation.js +5 -156
- package/scripts/gds/fitness-lib.js +5 -126
- package/scripts/gds/fitness-migration-contraction.js +5 -49
- package/scripts/gds/fitness-ratchets.js +5 -563
- package/scripts/gds/fitness.js +5 -1493
- package/scripts/gds/gate-review.js +5 -328
- package/scripts/gds/gating.js +5 -346
- package/scripts/gds/gds-literal-scan.js +5 -194
- package/scripts/gds/gen-api-client.js +5 -555
- package/scripts/gds/gen-api-docs.js +5 -1100
- package/scripts/gds/gen-atlas.js +5 -364
- package/scripts/gds/gen-diagrams.js +6 -607
- package/scripts/gds/gen-file-map.js +5 -335
- package/scripts/gds/gen-freshness.js +5 -31
- package/scripts/gds/gen-interaction-posture.js +5 -120
- package/scripts/gds/gen-repo-map.js +5 -538
- package/scripts/gds/gen-role-responsibilities.js +5 -133
- package/scripts/gds/gen-session-index.js +5 -241
- package/scripts/gds/gen-sounds.js +5 -174
- package/scripts/gds/git-merge-regen.js +6 -291
- package/scripts/gds/go-live.js +5 -1069
- package/scripts/gds/goal.js +6 -271
- package/scripts/gds/government-walk.js +5 -1475
- package/scripts/gds/grade-correlation-audit.js +5 -308
- package/scripts/gds/grade-replay.js +5 -235
- package/scripts/gds/grade-smoke.js +6 -204
- package/scripts/gds/home-isolation-guard.js +5 -125
- package/scripts/gds/hooks/pre-push.js +5 -209
- package/scripts/gds/howto.js +5 -143
- package/scripts/gds/http-api-client.js +6 -81
- package/scripts/gds/identity-strip.js +5 -74
- package/scripts/gds/init.js +5 -1157
- package/scripts/gds/install-git-hooks.js +5 -198
- package/scripts/gds/instance-apex.js +5 -37
- package/scripts/gds/intent-retry.js +5 -51
- package/scripts/gds/key-card.js +6 -221
- package/scripts/gds/key-status.js +5 -124
- package/scripts/gds/land-watch.js +5 -199
- package/scripts/gds/leak-scan-allowlist.js +5 -291
- package/scripts/gds/learning-capture.js +6 -144
- package/scripts/gds/lib.sh +7 -73
- package/scripts/gds/linkify-refs.js +6 -654
- package/scripts/gds/lint-infra-exec.js +5 -68
- package/scripts/gds/lint-migrations.js +5 -100
- package/scripts/gds/lint-workflow-exec.js +5 -61
- package/scripts/gds/local-preview-lib.js +6 -128
- package/scripts/gds/local-preview.js +6 -81
- package/scripts/gds/login.js +5 -358
- package/scripts/gds/main-audit.js +5 -623
- package/scripts/gds/me.js +6 -96
- package/scripts/gds/memory-map.js +5 -174
- package/scripts/gds/merge-lock.js +6 -70
- package/scripts/gds/migration-namespace.js +5 -311
- package/scripts/gds/mirror-lineage-check.js +5 -341
- package/scripts/gds/mirror-redact.js +5 -348
- package/scripts/gds/module-artifact.js +6 -289
- package/scripts/gds/module-assess-docs.js +6 -237
- package/scripts/gds/module-assess-installs.js +6 -227
- package/scripts/gds/module-assess-score.js +6 -110
- package/scripts/gds/module-assess-security.js +6 -251
- package/scripts/gds/module-assess-tests.js +6 -277
- package/scripts/gds/module-assess-version.js +6 -91
- package/scripts/gds/module-error-report.js +5 -146
- package/scripts/gds/module-test-runner.js +6 -413
- package/scripts/gds/module.js +5 -1374
- package/scripts/gds/move-escalation.js +5 -140
- package/scripts/gds/newcomer-floor.js +6 -420
- package/scripts/gds/newcomer-floor.test.js +6 -234
- package/scripts/gds/next-number.js +6 -162
- package/scripts/gds/oauth-secret.js +5 -200
- package/scripts/gds/onboard.js +5 -265
- package/scripts/gds/onboarding-analyze.js +6 -225
- package/scripts/gds/onboarding-config.js +6 -179
- package/scripts/gds/onboarding-ship.js +6 -91
- package/scripts/gds/pack-env-prefix.js +5 -72
- package/scripts/gds/package-core.js +5 -1102
- package/scripts/gds/page-inventory.js +5 -346
- package/scripts/gds/page-reader.js +5 -720
- package/scripts/gds/paste-token.js +6 -211
- package/scripts/gds/plain-cards.js +5 -350
- package/scripts/gds/portability-smoke-art.sh +7 -84
- package/scripts/gds/portability-smoke-memory.sh +7 -175
- package/scripts/gds/preflight.js +5 -212
- package/scripts/gds/probe-cache.js +5 -244
- package/scripts/gds/prove-strict-versioning.js +6 -283
- package/scripts/gds/provision-auto-upgrade.js +5 -161
- package/scripts/gds/provision-byo-host.js +5 -67
- package/scripts/gds/provision-capacity.js +5 -78
- package/scripts/gds/provision-caps.js +5 -62
- package/scripts/gds/provision-config.js +5 -232
- package/scripts/gds/provision-core-upgrade.js +5 -1165
- package/scripts/gds/provision-disconnect.js +5 -87
- package/scripts/gds/provision-github-setup.js +5 -167
- package/scripts/gds/provision-net.js +5 -356
- package/scripts/gds/provision-pin-key.js +5 -175
- package/scripts/gds/provision-pin-replay.js +5 -125
- package/scripts/gds/provision-process.js +5 -169
- package/scripts/gds/provision-render.js +5 -200
- package/scripts/gds/provision-repo-auth.js +5 -163
- package/scripts/gds/provision-repo-private.js +5 -97
- package/scripts/gds/provision-repo.js +5 -1336
- package/scripts/gds/provision-teardown.js +5 -105
- package/scripts/gds/provision-units.js +5 -468
- package/scripts/gds/provision.js +5 -1477
- package/scripts/gds/publish-credential-check.js +6 -65
- package/scripts/gds/publish-integration-gate.js +5 -140
- package/scripts/gds/publish-manifest.js +5 -437
- package/scripts/gds/publish-watch.js +5 -266
- package/scripts/gds/pulse.js +6 -335
- package/scripts/gds/push-main.js +5 -54
- package/scripts/gds/push-path-brief.js +5 -98
- package/scripts/gds/read-session-export.js +5 -357
- package/scripts/gds/reauth.js +6 -154
- package/scripts/gds/recall.js +6 -182
- package/scripts/gds/redteam-patrol.js +5 -435
- package/scripts/gds/regen-instance-docs.js +5 -45
- package/scripts/gds/release-core.js +5 -78
- package/scripts/gds/release-notes.js +5 -270
- package/scripts/gds/release.js +6 -138
- package/scripts/gds/rename-history-check.js +5 -367
- package/scripts/gds/rename-ledger-prose.js +5 -480
- package/scripts/gds/render-api.js +5 -196
- package/scripts/gds/render-check.js +5 -204
- package/scripts/gds/render-ideas.js +6 -225
- package/scripts/gds/render-payload.js +5 -84
- package/scripts/gds/repo-metrics.js +6 -362
- package/scripts/gds/review-sheet.js +5 -106
- package/scripts/gds/role-pack-guard.js +5 -141
- package/scripts/gds/route-shadow-guard.js +5 -173
- package/scripts/gds/routine-schedule.js +5 -281
- package/scripts/gds/run-routine.js +5 -255
- package/scripts/gds/run-unit-tests.js +6 -659
- package/scripts/gds/runner-drift.js +5 -149
- package/scripts/gds/sandbox-stage.js +6 -458
- package/scripts/gds/scope-map-guard.js +5 -299
- package/scripts/gds/scope-roster-guard.js +5 -117
- package/scripts/gds/seam-wiring-guard.js +5 -274
- package/scripts/gds/search-ingest-db.js +6 -287
- package/scripts/gds/search-ingest-md.js +6 -268
- package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
- package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
- package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
- package/scripts/gds/seed-staging.sh +7 -116
- package/scripts/gds/seed-verify-criteria.js +6 -124
- package/scripts/gds/sequence.js +6 -596
- package/scripts/gds/session-cost.js +6 -429
- package/scripts/gds/session-digest-build.js +6 -293
- package/scripts/gds/session-digest.js +6 -199
- package/scripts/gds/session-eval.js +6 -630
- package/scripts/gds/session-transcript-build.js +6 -155
- package/scripts/gds/session-transcript-upload.js +6 -29
- package/scripts/gds/session.js +6 -403
- package/scripts/gds/setup.js +6 -645
- package/scripts/gds/ship-check.js +5 -85
- package/scripts/gds/ship-deploy-target.js +5 -392
- package/scripts/gds/ship-escalation.js +5 -166
- package/scripts/gds/ship-finish.js +5 -419
- package/scripts/gds/ship-flow.js +5 -1216
- package/scripts/gds/ship-git.js +5 -99
- package/scripts/gds/ship-grade-steps.js +5 -546
- package/scripts/gds/ship-grade.js +5 -425
- package/scripts/gds/ship-honesty.js +5 -312
- package/scripts/gds/ship-io.js +5 -138
- package/scripts/gds/ship-land.js +5 -1129
- package/scripts/gds/ship-memory-sync.js +5 -248
- package/scripts/gds/ship-merge-gate.js +5 -224
- package/scripts/gds/ship-merge.js +5 -465
- package/scripts/gds/ship-mode-ask.js +5 -137
- package/scripts/gds/ship-mode-manual.js +5 -53
- package/scripts/gds/ship-preflight-steps.js +5 -398
- package/scripts/gds/ship-regen.js +5 -313
- package/scripts/gds/ship-resume.js +5 -200
- package/scripts/gds/ship-session-upload.js +5 -312
- package/scripts/gds/ship-state.js +5 -109
- package/scripts/gds/ship-surprise.js +5 -83
- package/scripts/gds/ship-visual.js +5 -74
- package/scripts/gds/ship.js +5 -380
- package/scripts/gds/shipping-mode.js +5 -69
- package/scripts/gds/skill-lint.js +5 -248
- package/scripts/gds/skill-preflight.js +5 -359
- package/scripts/gds/smoke-batch-claim.sh +7 -237
- package/scripts/gds/smoke-batch-release.sh +7 -315
- package/scripts/gds/smoke-claim-consistency.sh +7 -221
- package/scripts/gds/smoke-dependencies.sh +7 -142
- package/scripts/gds/smoke-gds.js +6 -255
- package/scripts/gds/smoke-write.sh +7 -274
- package/scripts/gds/source-text-test-scan.js +7 -0
- package/scripts/gds/spark.js +6 -293
- package/scripts/gds/stale-worktrees.js +5 -210
- package/scripts/gds/start-goals.js +5 -101
- package/scripts/gds/start.js +6 -1089
- package/scripts/gds/status.js +6 -544
- package/scripts/gds/strand-watch.js +5 -313
- package/scripts/gds/stranded-rows.js +5 -198
- package/scripts/gds/stray-unit-sweep.sh +7 -70
- package/scripts/gds/surface.js +5 -100
- package/scripts/gds/task.js +6 -272
- package/scripts/gds/test-path-guard.js +5 -97
- package/scripts/gds/triage.js +6 -741
- package/scripts/gds/turn-end-sound.js +5 -72
- package/scripts/gds/tweak-halt.js +5 -68
- package/scripts/gds/tweak-renders.js +5 -198
- package/scripts/gds/uat.js +6 -119
- package/scripts/gds/ui-kit-transform.js +5 -41
- package/scripts/gds/update-channel.js +5 -510
- package/scripts/gds/update-sweep.js +5 -827
- package/scripts/gds/upgrade-artist-gate.js +5 -45
- package/scripts/gds/upgrade-commit-identity.js +5 -31
- package/scripts/gds/upgrade-migrate.js +5 -223
- package/scripts/gds/upgrade-operator.js +6 -73
- package/scripts/gds/upgrade-outcome.js +5 -173
- package/scripts/gds/upgrade.js +5 -1497
- package/scripts/gds/validate-design.js +5 -10
- package/scripts/gds/version-close.js +6 -620
- package/scripts/gds/version-literal-guard.js +5 -138
- package/scripts/gds/version-select.js +5 -77
- package/scripts/gds/visual-review-nudge.js +5 -38
- package/scripts/gds/wedge-remedy.js +5 -173
- package/scripts/gds/worktree-claim-guard.js +5 -129
- package/scripts/gds/worktree.js +6 -448
- package/scripts/hall-preview/refresh-fixtures.js +1 -1
- package/scripts/hall-preview/server.js +2 -2
- package/scripts/migrate.sh +3 -3
- package/scripts/public-mirror-export.js +3 -3
- package/scripts/security/dep-audit.js +50 -124
- package/scripts/setup-builder.js +7 -7
- package/src/bongos/api-errors.js +1 -0
- package/src/bongos/api-prefix.js +1 -1
- package/src/bongos/auth-github.js +19 -3
- package/src/bongos/auth-idp.js +7 -0
- package/src/bongos/claim-attribution.js +2 -2
- package/src/bongos/core-moves.js +1 -1
- package/src/bongos/core-update.js +3 -3
- package/src/bongos/craft-mode.js +2 -2
- package/src/bongos/db-kernel.js +15 -3
- package/src/bongos/db.js +30 -4
- package/src/bongos/github-repos.js +1 -1
- package/src/bongos/llm-cache.js +1 -1
- package/src/bongos/llm-pricing.js +1 -1
- package/src/bongos/metrics.js +1 -1
- package/src/bongos/middleware/rate-limit.js +2 -2
- package/src/bongos/module-listing.js +93 -1
- package/src/bongos/module-scope-map.js +90 -85
- package/src/bongos/module-store.js +1 -1
- package/src/bongos/module-submissions.js +1 -1
- package/src/bongos/optimizer.js +1 -1
- package/src/bongos/package-registry.js +1 -1
- package/src/bongos/path-match.js +1 -1
- package/src/bongos/permission-path-check.js +3 -3
- package/src/bongos/platform-visibility-gate.js +3 -5
- package/src/bongos/prelaunch-gate.js +7 -6
- package/src/bongos/route-rank-check.js +2 -2
- package/src/bongos/routes/auth.js +15 -2
- package/src/bongos/routes/backup.js +1 -1
- package/src/bongos/routes/builders.js +29 -1
- package/src/bongos/routes/me.js +49 -18
- package/src/bongos/routes/modules.js +29 -9
- package/src/bongos/routes/public.js +3 -72
- package/src/bongos/schema-lag.js +1 -1
- package/src/bongos/sensitive-surfaces.js +1 -1
- package/src/bongos/serve-internal.js +65 -16
- package/src/bongos/software-update.js +2 -2
- package/src/bongos/upgrade-hold.js +3 -3
- package/src/hall-look.js +6 -5
- package/src/module-api.js +3 -3
- package/src/module-loader/catalog.js +1 -1
- package/src/module-loader/error-tally.js +3 -3
- package/src/module-loader/manifest-schema.js +3 -3
- package/src/platform-server.js +10 -0
- package/src/role-responsibilities.js +1 -1
- package/src/stale-timer.js +2 -2
- package/tests/accessibility_replay.mjs +1 -1
- package/tests/activity_rollup_order_db.mjs +1 -1
- package/tests/activity_snapshots_db.mjs +1 -1
- package/tests/adopt_detect.mjs +1 -1
- package/tests/adopt_import.mjs +1 -1
- package/tests/adopt_preflight.mjs +1 -1
- package/tests/adr_0089_scope.mjs +10 -7
- package/tests/adr_0162_citation.mjs +1 -1
- package/tests/adr_0162_gate_citation.mjs +1 -1
- package/tests/agent_invoke.mjs +1 -1
- package/tests/agent_invoke_live.mjs +3 -3
- package/tests/agents_cron_trigger.mjs +2 -2
- package/tests/agents_roster.mjs +1 -1
- package/tests/agents_sync.mjs +4 -4
- package/tests/allow_rule_guard.mjs +20 -20
- package/tests/api_alias_caller_ratchet.mjs +9 -10
- package/tests/api_alias_exceptions.mjs +7 -6
- package/tests/api_artifacts.mjs +214 -0
- package/tests/api_cli_flags.mjs +3 -3
- package/tests/api_client.mjs +56 -54
- package/tests/api_docs.mjs +30 -9
- package/tests/api_error_envelope_buildcheck.mjs +1 -1
- package/tests/api_msys_path_repair.mjs +2 -2
- package/tests/architect.mjs +1 -1
- package/tests/art_stage.mjs +2 -2
- package/tests/artifact_audit.mjs +2 -2
- package/tests/atlas.mjs +1 -1
- package/tests/audit_deps.mjs +1 -1
- package/tests/audit_gate.mjs +1 -1
- package/tests/auth_flow_slice1.mjs +3 -3
- package/tests/auth_inactive_builder.mjs +43 -5
- package/tests/auth_session_expiry_db.mjs +16 -4
- package/tests/auth_session_ttl.mjs +23 -0
- package/tests/authorship_audit.mjs +2 -2
- package/tests/autobongos_cadence.mjs +1 -1
- package/tests/autobongos_fence.mjs +1 -1
- package/tests/autobongos_grade_cap.mjs +2 -2
- package/tests/autobongos_heartbeat_head.mjs +1 -1
- package/tests/autobongos_host_access.mjs +3 -3
- package/tests/autobongos_loop.mjs +17 -17
- package/tests/autobongos_service_ps1.mjs +3 -3
- package/tests/autobongos_tweak_lane.mjs +2 -2
- package/tests/autobongos_verify.mjs +2 -2
- package/tests/autonomous_fit_protected_paths.mjs +3 -3
- package/tests/autonomy_config_idle.mjs +1 -1
- package/tests/autonomy_daily_checks.mjs +201 -0
- package/tests/autonomy_digest.mjs +1 -1
- package/tests/autonomy_gate.mjs +1 -1
- package/tests/autonomy_gauge.mjs +2 -2
- package/tests/autonomy_runner_identity.mjs +1 -1
- package/tests/backfill_sessions.mjs +8 -8
- package/tests/backfill_subagent_rewards.mjs +1 -1
- package/tests/backfill_task_rewards.mjs +2 -2
- package/tests/backlog_review.mjs +3 -3
- package/tests/baseline_staleness.mjs +2 -2
- package/tests/bfg.mjs +11 -5
- package/tests/bfg_write.mjs +20 -11
- package/tests/blockers_hall.mjs +14 -4
- package/tests/blockers_page_ui.mjs +56 -12
- package/tests/bongos_dispatch.mjs +5 -5
- package/tests/bongos_login.mjs +2 -2
- package/tests/bug_attachment_audit.mjs +1 -1
- package/tests/bug_attachment_recover.mjs +2 -2
- package/tests/bug_triage.mjs +3 -3
- package/tests/build_info.mjs +1 -1
- package/tests/builder_tester_tag.mjs +184 -0
- package/tests/bump_version.mjs +3 -3
- package/tests/canonical_profile_url.mjs +1 -1
- package/tests/capture_error_format.mjs +1 -1
- package/tests/capture_goal_routing.mjs +2 -2
- package/tests/category_advisory_guard.mjs +3 -3
- package/tests/claim_error_surface.mjs +2 -2
- package/tests/claim_from_task_and_home.mjs +1 -1
- package/tests/claim_gate_open_blocker.mjs +7 -4
- package/tests/claim_gate_rebase.mjs +12 -8
- package/tests/claim_recall.mjs +4 -4
- package/tests/claim_resolve_worktree_lock.mjs +1 -1
- package/tests/claude_materialize.mjs +68 -68
- package/tests/clawback_confirmed_backlog.mjs +8 -5
- package/tests/cli_allowlist_permissions.mjs +11 -11
- package/tests/cli_dispatcher.mjs +2 -2
- package/tests/cli_err_code.mjs +6 -6
- package/tests/cli_exit_no_abort.mjs +7 -7
- package/tests/cli_lib_formatters.mjs +2 -2
- package/tests/cli_sessions.mjs +5 -5
- package/tests/cli_surface.mjs +15 -15
- package/tests/cli_token_reissue.mjs +2 -2
- package/tests/client_baseurl_guard.mjs +1 -1
- package/tests/client_bundle_route.mjs +35 -4
- package/tests/cloud_bongos_pack.mjs +1 -1
- package/tests/community_leaderboard_db.mjs +1 -1
- package/tests/conductor.mjs +18 -18
- package/tests/conflict_resolve.mjs +14 -16
- package/tests/consumer_layout_boot.mjs +12 -12
- package/tests/context_pack.mjs +6 -6
- package/tests/control_manifest.mjs +4 -4
- package/tests/copy_desk_page_reads.mjs +1 -1
- package/tests/copy_desk_page_release.mjs +192 -0
- package/tests/copy_inventory.mjs +2 -2
- package/tests/core_auto_upgrade.mjs +1 -1
- package/tests/core_move_notice.mjs +2 -2
- package/tests/core_origin_follow.mjs +7 -7
- package/tests/core_pin_sync.mjs +3 -3
- package/tests/core_upgrade_door.mjs +2 -2
- package/tests/core_upgrade_owner_door.mjs +34 -1
- package/tests/core_upgrade_runner.mjs +19 -19
- package/tests/credential_presence.mjs +2 -2
- package/tests/credit_grant.mjs +3 -3
- package/tests/credit_log_single_writer.mjs +5 -5
- package/tests/criterion_ref_status.mjs +2 -2
- package/tests/cross_discipline_priority_direction.mjs +3 -3
- package/tests/cutover_codemod.mjs +2 -4
- package/tests/db_backup_nightly.mjs +1 -1
- package/tests/db_backup_offsite.mjs +1 -1
- package/tests/db_ownership_handover.mjs +2 -2
- package/tests/dead_deps.mjs +3 -3
- package/tests/dependency_advisory.mjs +1 -1
- package/tests/deploy_audit_gate.mjs +4 -4
- package/tests/deploy_divergence_line.mjs +36 -16
- package/tests/deploy_page_projects.mjs +35 -4
- package/tests/dev_lib.mjs +2 -2
- package/tests/dev_windows.mjs +2 -2
- package/tests/diagram_facts_offset.mjs +1 -1
- package/tests/diagram_repo_slug.mjs +1 -1
- package/tests/diff_derived_signals.mjs +2 -2
- package/tests/dns_preflight.mjs +2 -2
- package/tests/do_api.mjs +3 -3
- package/tests/doc_cli_guard.mjs +28 -28
- package/tests/doc_comment_coverage.mjs +1 -1
- package/tests/doc_control_claims.mjs +11 -11
- package/tests/docs_entropy.mjs +2 -2
- package/tests/docs_openapi_route.mjs +8 -6
- package/tests/doctor_hooks.mjs +1 -1
- package/tests/edit_hints.mjs +3 -2
- package/tests/effective_visibility_predicate.mjs +1 -19
- package/tests/env_knobs_neutral_prefix.mjs +13 -13
- package/tests/exec_path_guard.mjs +4 -4
- package/tests/executed_closure.mjs +18 -12
- package/tests/file_map.mjs +1 -1
- package/tests/find_untested.mjs +13 -13
- package/tests/first_admin_bootstrap.mjs +1 -1
- package/tests/fitness.mjs +16 -16
- package/tests/fitness_gds_ratchet.mjs +2 -2
- package/tests/fitness_installed_core.mjs +3 -3
- package/tests/fitness_no_raw_nul.mjs +1 -1
- package/tests/fitness_ratchets.mjs +3 -3
- package/tests/fitness_scope_roster.mjs +2 -2
- package/tests/fitness_two_root.mjs +8 -8
- package/tests/fixtures/accessibility-replay.json +5 -5
- package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
- package/tests/fixtures/ideator-prefold/README.md +1 -1
- package/tests/fixtures/page-ledger.mjs +22 -0
- package/tests/fixtures/session-506-digest.json +5 -5
- package/tests/gate_approvals.mjs +50 -0
- package/tests/gate_review.mjs +8 -8
- package/tests/gating_review_retired.mjs +2 -2
- package/tests/gen_freshness.mjs +3 -3
- package/tests/git_guard.mjs +3 -3
- package/tests/git_merge_regen.mjs +41 -65
- package/tests/github_one_trip.mjs +4 -4
- package/tests/github_pick_up.mjs +2 -2
- package/tests/github_push_merge_driver.mjs +1 -1
- package/tests/go_live.mjs +3 -2
- package/tests/goal_category.mjs +1 -1
- package/tests/goal_cli.mjs +2 -2
- package/tests/goal_create_spec_entry.mjs +1 -1
- package/tests/goal_invite_consent.mjs +3 -1
- package/tests/goal_move.mjs +1 -1
- package/tests/goal_working_area.mjs +1 -1
- package/tests/government_agent_asks.mjs +7 -7
- package/tests/government_board_room_copy.mjs +6 -1
- package/tests/government_board_view.mjs +39 -0
- package/tests/government_board_vote_ui.mjs +39 -1
- package/tests/government_config.mjs +2 -2
- package/tests/government_live_proof_shape.mjs +1 -1
- package/tests/government_protected_surfaces.mjs +54 -53
- package/tests/government_require_permission.mjs +9 -1
- package/tests/government_vanilla_boot.mjs +1 -1
- package/tests/government_vocabulary.mjs +2 -2
- package/tests/government_walk.mjs +2 -2
- package/tests/grade_body_limit.mjs +6 -4
- package/tests/grade_correlation_audit.mjs +3 -3
- package/tests/grade_diff_hash.mjs +1 -1
- package/tests/grade_engine_replay.mjs +2 -2
- package/tests/grade_server_authoritative.mjs +1 -1
- package/tests/grade_unavailable_display.mjs +1 -1
- package/tests/grader.mjs +8 -24
- package/tests/grader_generated_provenance.mjs +14 -14
- package/tests/grader_no_artifact.mjs +1 -1
- package/tests/grader_prompt_fencing.mjs +1 -1
- package/tests/grader_quality_window_overflow.mjs +1 -1
- package/tests/grader_reader_lens.mjs +3 -3
- package/tests/grader_regrade_delta.mjs +1 -1
- package/tests/grader_unbacked_score.mjs +2 -2
- package/tests/hall_acclaim_vote_control.mjs +113 -0
- package/tests/hall_asset_cache.mjs +127 -0
- package/tests/hall_audit.mjs +63 -0
- package/tests/hall_board_world.mjs +20 -0
- package/tests/hall_city_card_words.mjs +61 -0
- package/tests/hall_client_request_shape.mjs +5 -1
- package/tests/hall_home_ships_bounded.mjs +160 -0
- package/tests/hall_landing_boot.mjs +15 -2
- package/tests/hall_nav.mjs +33 -0
- package/tests/hall_onboarding_bongos_setup.mjs +1 -1
- package/tests/hall_oversight_world.mjs +44 -4
- package/tests/hall_palette.mjs +12 -9
- package/tests/hall_preview_security.mjs +1 -1
- package/tests/hall_profile_world.mjs +17 -0
- package/tests/hall_reading_world.mjs +16 -1
- package/tests/hall_roster_world.mjs +2 -1
- package/tests/hall_studio_world.mjs +4 -1
- package/tests/hall_work_history_id.mjs +39 -0
- package/tests/held_tweak_reporting.mjs +4 -4
- package/tests/helpers.mjs +3 -3
- package/tests/home_bounded_reads.mjs +1 -1
- package/tests/home_isolation_guard.mjs +1 -1
- package/tests/hook_core_resolve.mjs +7 -7
- package/tests/hook_user_agents.mjs +1 -1
- package/tests/hooks_drain.mjs +2 -2
- package/tests/host_topology_skips.mjs +1 -1
- package/tests/howto_guide.mjs +1 -1
- package/tests/howto_moments.mjs +3 -3
- package/tests/hub_account_page.mjs +1 -1
- package/tests/idea_capture_grades.mjs +2 -2
- package/tests/idea_develop_spark.mjs +1 -1
- package/tests/idea_filed_via.mjs +2 -2
- package/tests/idea_ideate_full.mjs +1 -1
- package/tests/idea_spark_mark.mjs +1 -1
- package/tests/idea_spark_queue.mjs +1 -1
- package/tests/idea_triage.mjs +1 -1
- package/tests/idea_triage_grade.mjs +3 -3
- package/tests/idea_vote_permission.mjs +113 -0
- package/tests/idea_votes_fold_db.mjs +123 -0
- package/tests/infra_exec_paths.mjs +12 -12
- package/tests/init.mjs +2 -2
- package/tests/instance_db_migrated_on_code_move.mjs +5 -5
- package/tests/instance_feedback.mjs +9 -9
- package/tests/instance_mismatch_guard.mjs +2 -2
- package/tests/integration_parked_ratchet.mjs +24 -2
- package/tests/intent_retry.mjs +1 -1
- package/tests/interaction_posture.mjs +3 -3
- package/tests/invite_expiry_db.mjs +1 -1
- package/tests/joinability_invite_only.mjs +1 -1
- package/tests/karma_vote_lists.mjs +270 -0
- package/tests/key-card.mjs +2 -2
- package/tests/key-status.mjs +2 -2
- package/tests/knip_ratchet_ambient.mjs +2 -2
- package/tests/known_failing_ratchet.mjs +1 -1
- package/tests/land_watch.mjs +2 -2
- package/tests/landing_legal_pages.mjs +1 -1
- package/tests/landing_page.mjs +2 -2
- package/tests/leaderboard_roles.mjs +4 -1
- package/tests/leak_scan_allowlist.mjs +8 -8
- package/tests/leak_scan_fail_closed.mjs +1 -1
- package/tests/lib_sh_resolution.mjs +9 -9
- package/tests/lifecycle-card.mjs +7 -7
- package/tests/linkify_check.mjs +2 -2
- package/tests/linkify_refs.mjs +1 -1
- package/tests/llm-cache-route.mjs +1 -1
- package/tests/local_preview.mjs +2 -2
- package/tests/main_audit.mjs +3 -3
- package/tests/main_audit_attestation.mjs +1 -1
- package/tests/main_audit_db_roster.mjs +2 -2
- package/tests/main_worktree_busy_reason.mjs +3 -3
- package/tests/markdown_line_endings.mjs +2 -2
- package/tests/me_streak_leaderboard_queries.mjs +193 -0
- package/tests/membership_kind_lockstep.mjs +1 -1
- package/tests/memory_isolation.mjs +16 -8
- package/tests/memory_map.mjs +2 -2
- package/tests/memory_pull.mjs +33 -25
- package/tests/merge_driver_register.mjs +3 -3
- package/tests/migration_allocation.mjs +2 -2
- package/tests/migration_namespace.mjs +1 -1
- package/tests/migrations_forward_safe.mjs +1 -1
- package/tests/mingle.mjs +1 -1
- package/tests/mirror_lineage_fulltree.mjs +3 -3
- package/tests/mirror_lineage_proof.mjs +2 -2
- package/tests/mirror_redact.mjs +4 -4
- package/tests/missing_dep_classify.mjs +3 -3
- package/tests/module-scope-map.mjs +22 -22
- package/tests/module_api_lazy.mjs +1 -1
- package/tests/module_assess_docs.mjs +2 -2
- package/tests/module_assess_installs.mjs +3 -3
- package/tests/module_assess_price_parity.mjs +5 -5
- package/tests/module_assess_score.mjs +5 -5
- package/tests/module_assess_security.mjs +4 -4
- package/tests/module_assess_tests.mjs +3 -3
- package/tests/module_assessments_migration.mjs +1 -1
- package/tests/module_catalog.mjs +2 -2
- package/tests/module_cli.mjs +3 -3
- package/tests/module_entitlements.mjs +1 -1
- package/tests/module_error_counts.mjs +1 -1
- package/tests/module_install.mjs +4 -4
- package/tests/module_loader.mjs +3 -1
- package/tests/module_owned_tests.mjs +1 -1
- package/tests/module_release_channels.mjs +1 -1
- package/tests/module_store_howto.mjs +3 -3
- package/tests/module_store_listing.mjs +139 -2
- package/tests/module_store_publish.mjs +4 -4
- package/tests/module_store_publish_route.mjs +1 -1
- package/tests/module_store_reassess.mjs +1 -1
- package/tests/module_store_registry_migration.mjs +1 -1
- package/tests/module_test_runner.mjs +3 -3
- package/tests/module_update.mjs +4 -4
- package/tests/module_upgrade_updates.mjs +1 -1
- package/tests/move_escalation.mjs +2 -2
- package/tests/nav_permission_atoms.mjs +3 -2
- package/tests/needs_rebase.mjs +7 -3
- package/tests/newcomer_floor.mjs +1 -1
- package/tests/next_number.mjs +1 -1
- package/tests/no_artifact_escalation.mjs +3 -3
- package/tests/npm_release_where.mjs +1 -1
- package/tests/oauth_secret.mjs +2 -2
- package/tests/onboard.mjs +6 -6
- package/tests/onboarding_gate.mjs +2 -2
- package/tests/opt_in_skill_modules.mjs +3 -3
- package/tests/own_scope_guard.mjs +1 -1
- package/tests/own_session_revoke.mjs +4 -1
- package/tests/package_core.mjs +10 -11
- package/tests/page_inventory.mjs +5 -5
- package/tests/page_reader.mjs +7 -7
- package/tests/page_tweak_hold.mjs +6 -6
- package/tests/parallel-load.mjs +1 -1
- package/tests/paste_token_api_base.mjs +1 -1
- package/tests/paste_token_session_store.mjs +2 -2
- package/tests/pending_invite_purge_db.mjs +1 -1
- package/tests/permission_path.mjs +1 -1
- package/tests/pin_replay.mjs +1 -1
- package/tests/pin_write_key.mjs +7 -7
- package/tests/plain_cards.mjs +15 -15
- package/tests/pr_assign.mjs +1 -1
- package/tests/pre_push_hook.mjs +3 -3
- package/tests/preflight_checks.mjs +2 -2
- package/tests/prelaunch_gate.mjs +1 -1
- package/tests/privacy_matrix.mjs +1 -1
- package/tests/probe_cache.mjs +6 -6
- package/tests/profile_connections_ui.mjs +4 -3
- package/tests/profile_fields.mjs +11 -1
- package/tests/profile_privacy_owner_view.mjs +1 -1
- package/tests/profile_role_headline.mjs +10 -9
- package/tests/project_admin_console_model.mjs +1 -1
- package/tests/projects_hub.mjs +1 -1
- package/tests/projects_hub_cloud_hop.mjs +1 -1
- package/tests/promote_goal_id.mjs +6 -6
- package/tests/promotion_sweep.mjs +1 -1
- package/tests/provision.mjs +24 -24
- package/tests/provision_account_identity.mjs +2 -2
- package/tests/provision_byo_host.mjs +1 -1
- package/tests/provision_caddy_wiring.mjs +2 -2
- package/tests/provision_disconnect.mjs +2 -2
- package/tests/provision_dns_first.mjs +1 -1
- package/tests/provision_render.mjs +9 -9
- package/tests/provision_repo_private.mjs +3 -3
- package/tests/provision_resource_caps.mjs +5 -5
- package/tests/provision_restart.mjs +3 -3
- package/tests/provision_settings_apply.mjs +7 -7
- package/tests/provision_teardown_address.mjs +2 -2
- package/tests/provisioning_capacity.mjs +5 -5
- package/tests/provisioning_credential_preflight.mjs +1 -1
- package/tests/provisioning_disconnect.mjs +1 -1
- package/tests/provisioning_error_note_scope.mjs +4 -4
- package/tests/provisioning_paid_shape_gate.mjs +2 -2
- package/tests/provisioning_planet_physics.mjs +16 -0
- package/tests/provisioning_runner_drift_notice.mjs +2 -2
- package/tests/provisioning_settings_env.mjs +1 -1
- package/tests/pruned_lockfile_integrity.mjs +1 -1
- package/tests/public_mirror_export.mjs +1 -1
- package/tests/publish_integration_gate.mjs +2 -2
- package/tests/publish_manifest.mjs +6 -6
- package/tests/publish_watch.mjs +1 -1
- package/tests/push_path_brief.mjs +2 -2
- package/tests/raise.mjs +248 -0
- package/tests/rank_roles_audit.mjs +1 -1
- package/tests/rank_tier_single_source.mjs +2 -2
- package/tests/rate_limit_public.mjs +1 -1
- package/tests/read_default_meter.mjs +2 -2
- package/tests/read_session_export.mjs +1 -1
- package/tests/rebase_gate_set_aside.mjs +1 -1
- package/tests/recall_cli.mjs +1 -1
- package/tests/recall_corpus_health.mjs +3 -2
- package/tests/recall_hints.mjs +1 -1
- package/tests/recruiter_sliver_boundary.mjs +1 -1
- package/tests/redteam_patrol.mjs +2 -2
- package/tests/regrade_actual_minutes.mjs +2 -2
- package/tests/regrade_eligibility.mjs +2 -2
- package/tests/release_core.mjs +2 -2
- package/tests/release_notes.mjs +4 -4
- package/tests/rename_history_restraint.mjs +3 -3
- package/tests/rename_ledger_prose.mjs +6 -6
- package/tests/render_api.mjs +1 -1
- package/tests/render_check.mjs +4 -4
- package/tests/render_deploy.mjs +1 -1
- package/tests/repo_info_binding.mjs +1 -1
- package/tests/repo_map.mjs +5 -5
- package/tests/reward_mode_cost_plus_only.mjs +7 -3
- package/tests/reward_mode_surfacing.mjs +1 -1
- package/tests/role_responsibilities.mjs +1 -1
- package/tests/route_permission_check.mjs +1 -1
- package/tests/route_shadow_guard.mjs +1 -1
- package/tests/route_validation.mjs +1 -1
- package/tests/routine_capture_kind.mjs +24 -13
- package/tests/routine_schedule.mjs +51 -9
- package/tests/run_routine.mjs +5 -5
- package/tests/run_routine_two_root.mjs +5 -5
- package/tests/runner_drift.mjs +17 -17
- package/tests/sandbox_stage.mjs +5 -5
- package/tests/scope_map_guard.mjs +7 -7
- package/tests/scouting_owner_access_and_reach.mjs +1 -1
- package/tests/scripts_gds_forwarders.mjs +224 -0
- package/tests/scrubber_corpus.mjs +2 -2
- package/tests/seam_wiring_guard.mjs +1 -1
- package/tests/search_ingest.mjs +2 -2
- package/tests/search_ingest_db.mjs +1 -1
- package/tests/search_ingest_nul.mjs +6 -6
- package/tests/seed_verify_criteria.mjs +3 -3
- package/tests/sequence.mjs +3 -3
- package/tests/served_paths_shipped.mjs +3 -3
- package/tests/session_506_regression.mjs +1 -1
- package/tests/session_accessibility.mjs +1 -1
- package/tests/session_caps.mjs +1 -1
- package/tests/session_cost.mjs +1 -1
- package/tests/session_digest.mjs +2 -2
- package/tests/session_eval.mjs +6 -6
- package/tests/session_index.mjs +1 -1
- package/tests/session_records.mjs +4 -4
- package/tests/session_rename_fallback.mjs +2 -2
- package/tests/session_reward_on_land.mjs +7 -149
- package/tests/session_reward_on_land_db.mjs +191 -0
- package/tests/session_reward_reconcile.mjs +6 -88
- package/tests/session_reward_reconcile_db.mjs +132 -0
- package/tests/session_transcript.mjs +1 -1
- package/tests/sessions_kit_pager.mjs +2 -1
- package/tests/setup_device_flow_fallback.mjs +2 -2
- package/tests/setup_smoke.mjs +12 -5
- package/tests/setup_status_facts.mjs +54 -12
- package/tests/ship_autolinkify.mjs +2 -2
- package/tests/ship_automerge_injection.mjs +1 -1
- package/tests/ship_base_flag.mjs +1 -1
- package/tests/ship_broadcast_routing.mjs +1 -1
- package/tests/ship_broadcast_server.mjs +2 -2
- package/tests/ship_builder_model.mjs +1 -1
- package/tests/ship_cannot_lie.mjs +9 -9
- package/tests/ship_card.mjs +2 -2
- package/tests/ship_ci_deploy.mjs +7 -7
- package/tests/ship_error_shape.mjs +1 -1
- package/tests/ship_land_ci_not_started.mjs +3 -3
- package/tests/ship_land_conflict.mjs +3 -3
- package/tests/ship_land_proof.mjs +3 -3
- package/tests/ship_land_red_pr.mjs +5 -5
- package/tests/ship_merge_gate.mjs +14 -14
- package/tests/ship_mode.mjs +1 -1
- package/tests/ship_mode_first_ship.mjs +4 -4
- package/tests/ship_mode_hands_off.mjs +8 -8
- package/tests/ship_post_land_verify.mjs +1 -1
- package/tests/ship_preflight.mjs +19 -19
- package/tests/ship_premerge.mjs +1 -1
- package/tests/ship_publish_error.mjs +2 -2
- package/tests/ship_push_diagnosis.mjs +1 -1
- package/tests/ship_regen_copy_inventory.mjs +3 -3
- package/tests/ship_resume.mjs +4 -4
- package/tests/ship_smoke_gate.mjs +1 -1
- package/tests/ship_upload_skip.mjs +1 -1
- package/tests/ship_upstream_deletion.mjs +1 -1
- package/tests/ship_vendored_instance.mjs +8 -8
- package/tests/ship_visual_regrade.mjs +3 -3
- package/tests/ship_zero_commit.mjs +1 -1
- package/tests/skill_docs_unavailable_regrade.mjs +3 -3
- package/tests/skill_friction_kind.mjs +1 -1
- package/tests/skill_grade_recover.mjs +1 -1
- package/tests/skill_grader_health.mjs +1 -1
- package/tests/skill_lint.mjs +1 -1
- package/tests/skill_menu_ruling.mjs +1 -1
- package/tests/skill_preflight.mjs +7 -7
- package/tests/skip_is_not_pass.mjs +22 -1
- package/tests/smoke_dependencies_witness.mjs +2 -2
- package/tests/smoke_preflight.mjs +1 -1
- package/tests/smoke_target.mjs +2 -2
- package/tests/smoke_write_contract.mjs +2 -2
- package/tests/sound_player.mjs +8 -8
- package/tests/source_text_test_ratchet.mjs +97 -0
- package/tests/speciality_corpus_scope.mjs +1 -1
- package/tests/speciality_session_skills.mjs +1 -1
- package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
- package/tests/stale_timer.mjs +3 -3
- package/tests/stale_worktrees.mjs +1 -1
- package/tests/start_env_guard.mjs +1 -1
- package/tests/start_goal_first.mjs +3 -3
- package/tests/start_inbox_count.mjs +1 -1
- package/tests/start_rebase_warning.mjs +1 -1
- package/tests/status_default_version.mjs +3 -3
- package/tests/status_mirror_sync.mjs +1 -1
- package/tests/status_page_no_dead_uptime.mjs +80 -0
- package/tests/stop_refcheck.mjs +1 -1
- package/tests/strand_watch.mjs +1 -1
- package/tests/stranded_rows.mjs +1 -1
- package/tests/stuck_detector.mjs +14 -14
- package/tests/sweep_app_account.mjs +3 -3
- package/tests/task_cli.mjs +2 -2
- package/tests/task_detail_ui.mjs +11 -1
- package/tests/task_discipline_required.mjs +2 -2
- package/tests/task_list_paging.mjs +1 -1
- package/tests/task_visual_slots.mjs +2 -2
- package/tests/terms_acceptance.mjs +1 -1
- package/tests/terms_grandfather_db.mjs +1 -1
- package/tests/test_path_guard.mjs +1 -1
- package/tests/triage_development.mjs +1 -1
- package/tests/tweak_batch_apply.mjs +2 -2
- package/tests/tweak_land_heal.mjs +3 -3
- package/tests/tweak_unattended.mjs +3 -3
- package/tests/ui_design_skills.mjs +2 -2
- package/tests/unit_report_status.mjs +2 -2
- package/tests/unit_runner_serial.mjs +2 -2
- package/tests/unit_runner_teardown_abort.mjs +1 -1
- package/tests/update_channel.mjs +2 -2
- package/tests/update_channel_db.mjs +4 -4
- package/tests/update_subscription_engine.mjs +26 -26
- package/tests/update_sweep_home.mjs +14 -14
- package/tests/upgrade.mjs +11 -11
- package/tests/upgrade_artist_gate.mjs +4 -4
- package/tests/upgrade_commit_identity.mjs +2 -2
- package/tests/upgrade_migrate.mjs +7 -7
- package/tests/upgrade_operator.mjs +2 -2
- package/tests/upgrade_outcome.mjs +2 -2
- package/tests/upgrade_persist_pin.mjs +5 -5
- package/tests/upkeep_home.mjs +1 -1
- package/tests/version_close.mjs +2 -2
- package/tests/version_close_cli.mjs +2 -2
- package/tests/version_close_route.mjs +1 -1
- package/tests/version_literals.mjs +23 -23
- package/tests/visual_review.mjs +5 -5
- package/tests/wedge_remedy.mjs +5 -5
- package/tests/welcome_boot.mjs +116 -0
- package/tests/welcome_boot_browser.mjs +271 -0
- package/tests/wizard_born_first_board.mjs +3 -3
- package/tests/wizard_demo.mjs +1 -1
- package/tests/wizard_one_page.mjs +4 -3
- package/tests/wizard_physics.mjs +3 -1
- package/tests/wizard_physics_more.mjs +42 -3
- package/tests/work_title_wrap.mjs +1 -1
- package/tests/workflow_exec_paths.mjs +6 -6
- package/tests/worktree_claim_guard.mjs +1 -1
- package/tests/worktree_helper.mjs +2 -2
- package/tests/write_validation_gaps.mjs +3 -3
- package/scripts/gds/api.sh +0 -6
- package/scripts/gds/artifact-staleness.js +0 -267
- package/scripts/gds/audit-exports.js +0 -128
- package/scripts/gds/classify-discipline.js +0 -153
- package/scripts/gds/codemod-rename-src-gds.js +0 -145
- package/scripts/gds/coreB-carve-proof.sh +0 -725
- package/scripts/gds/goal-names.js +0 -102
- package/scripts/gds/rename-goals.js +0 -109
- package/scripts/gds/resolve-skill-model.js +0 -57
- package/scripts/gds/security-baseline-check.sh +0 -180
- package/scripts/gds/seed-adopt-tasks.js +0 -75
- package/scripts/gds/seed-api-contract-goal-tasks.js +0 -141
- package/scripts/gds/seed-board-room-tasks.js +0 -196
- package/scripts/gds/seed-bongos-app-tasks.js +0 -294
- package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +0 -81
- package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +0 -100
- package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +0 -307
- package/scripts/gds/seed-bongos-module-system-tasks.js +0 -346
- package/scripts/gds/seed-bongos-tasks.js +0 -214
- package/scripts/gds/seed-bongos-v1-seo-tasks.js +0 -104
- package/scripts/gds/seed-bv1-community-tasks.js +0 -131
- package/scripts/gds/seed-bv1-privacy-invites-tasks.js +0 -133
- package/scripts/gds/seed-bv1-profile-page-tasks.js +0 -161
- package/scripts/gds/seed-bv1-r01-delta-tasks.js +0 -154
- package/scripts/gds/seed-bv2-tweak-mode-tasks.js +0 -277
- package/scripts/gds/seed-gds-v4-tasks.js +0 -624
- package/scripts/gds/seed-governance-tasks.js +0 -340
- package/scripts/gds/seed-medusa-tasks.js +0 -440
- package/scripts/gds/seed-module-upstreaming.js +0 -219
- package/scripts/gds/seed-productization-tasks.js +0 -235
- package/scripts/gds/seed-project-admin-console-tasks.js +0 -88
- package/scripts/gds/seed-provisioning-tasks.js +0 -83
- package/scripts/gds/seed-strict-versioning-tasks.js +0 -275
- package/scripts/gds/seed-v2-world-tasks.js +0 -283
- package/scripts/gds/spike-task-map.js +0 -899
- package/scripts/migrate_cost_ledger.sh +0 -178
- package/scripts/status-probe.mjs +0 -213
- package/src/bongos/uptime-poller.js +0 -93
- package/tests/artifact_staleness.mjs +0 -207
- package/tests/goal_names.mjs +0 -120
- package/tests/government_fold_bench.mjs +0 -50
- package/tests/spike_task_map.mjs +0 -422
- package/tests/status-probe.mjs +0 -89
- /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
- /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
- /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
- /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
|
@@ -0,0 +1,1217 @@
|
|
|
1
|
+
// scripts/bongos/ship-flow.js — the two entry flows — shipMain and regradeMain.
|
|
2
|
+
//
|
|
3
|
+
// Carved out of scripts/bongos/ship.js by task 1003205 (goal 1000079, the R03
|
|
4
|
+
// de-monolith plan) — a STRUCTURAL move, not a rewrite: the code below is the
|
|
5
|
+
// original ship.js lines 3478-4259 unchanged. ship.js remains the facade that
|
|
6
|
+
// re-exports every name and owns the CLI entry point, so the ship contract and
|
|
7
|
+
// every flag are untouched, and the other scripts that import from it are too.
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const { cliClient, requireSession, arg, detectWorktreeName, cardFlagsFromMe, apiCall, cliExit } = require('./cli-lib');
|
|
12
|
+
// task 1004630: the first ship asks for the ship mode once (ADR 0369).
|
|
13
|
+
const { runFirstShipAsk } = require('./ship-mode-ask.js');
|
|
14
|
+
const { resolveProse, markShipProgress, smokeGateMessages, proseFlagPresent, regradeNotesRefusal, staleSummaryNotice } = require('./ship-honesty.js');
|
|
15
|
+
const { plainCardLines } = require('./plain-cards.js');
|
|
16
|
+
const { classifyEmptyShip } = require('../../modules/lifecycle/ship-preflight');
|
|
17
|
+
const { isModuleKey, scopeForModule, moduleDriftFiles: computeModuleDrift } = require('../../src/bongos/module-scope-map');
|
|
18
|
+
const { runShipGate } = require('./sandbox-stage');
|
|
19
|
+
const { captureSurpriseLearning, promptSurprise } = require('./ship-surprise.js');
|
|
20
|
+
// task 1003109: the optional `--visual` leg of a ship (goal 1000072).
|
|
21
|
+
const shipVisual = require('./ship-visual.js');
|
|
22
|
+
const { gitOk } = require('./ship-git.js');
|
|
23
|
+
const { autoLinkifyChangedDocs, mergeMainIntoBranch, preflight, shipInputPaths } = require('./ship-preflight-steps.js');
|
|
24
|
+
const { applyBaseOverride, computeChangedFiles, computeGraderBaseline, runSmokeAsync } = require('./ship-grade.js');
|
|
25
|
+
const { buildPriorRoundContext, computeGradeResult, gradeAndRecord, printCreditsAndAchievements, printGradeOutcome } = require('./ship-grade-steps.js');
|
|
26
|
+
const { apiErrorLine, normalizeApiError, isUnknownFieldRejection } = require('./ship-io.js');
|
|
27
|
+
// task 1003205's carve left pushVia() used at regradeMain but never imported, so
|
|
28
|
+
// EVERY resume of a 'completed' task died with ReferenceError before resolving.
|
|
29
|
+
const { pushVia } = require('./ship-deploy-target.js');
|
|
30
|
+
|
|
31
|
+
const { diffstatFor, finishShip } = require('./ship-finish.js');
|
|
32
|
+
const tweakHold = require('../../modules/lifecycle/page-tweak-hold.js');
|
|
33
|
+
const { evaluateRegradeEligibility, evaluateResumeAction, resumeMerge, shouldConfirmWithoutGrade } = require('./ship-resume.js');
|
|
34
|
+
const { fileNoArtifactEscalation, noArtifactRefusalLines } = require('./ship-escalation.js');
|
|
35
|
+
const { noteServerReward } = require('./ship-state.js');
|
|
36
|
+
// task 1004536: each graded round lands in the autonomous run's ledger (inert
|
|
37
|
+
// without one), so ship.js can refuse a third grade at its entry point.
|
|
38
|
+
const { recordGradeOutcome } = require('./autobongos-grade-cap.js');
|
|
39
|
+
// task 1004631: on a Manual project an AI session asks before it ships (ADR 0369).
|
|
40
|
+
const manualShip = require('./ship-mode-manual.js');
|
|
41
|
+
|
|
42
|
+
// stopForManualApproval(args, taskId) — Manual ship mode (task 1004631, ADR 0369). Every path
|
|
43
|
+
// that can LAND work calls this first: a fresh ship, a resumed merge, and a re-grade (whose pass
|
|
44
|
+
// runs finishShip). When an AI session runs it on a Manual project without the person's yes, it
|
|
45
|
+
// prints the ask, exits 5 and returns true; the caller returns. A mode that cannot be read is
|
|
46
|
+
// Auto and never stops a ship. Who is stopped is ship-mode-manual.js's pure verdict.
|
|
47
|
+
async function stopForManualApproval(args, taskId) {
|
|
48
|
+
let shipMode = null;
|
|
49
|
+
try {
|
|
50
|
+
const r = await apiCall('GET', '/api/bongos/project-settings/ship-mode');
|
|
51
|
+
shipMode = r.ok ? r.data : null;
|
|
52
|
+
} catch (_) { shipMode = null; }
|
|
53
|
+
if (!manualShip.manualShipVerdict({ shipMode, args }).stop) return false;
|
|
54
|
+
for (const line of manualShip.manualAskLines(args, taskId)) console.log(line);
|
|
55
|
+
cliExit(manualShip.MANUAL_ASK_EXIT);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ---------- Main flow ----------
|
|
60
|
+
|
|
61
|
+
async function shipMain() {
|
|
62
|
+
await requireSession();
|
|
63
|
+
const args = process.argv.slice(2);
|
|
64
|
+
const taskId = Number(args[0]);
|
|
65
|
+
if (!Number.isFinite(taskId)) {
|
|
66
|
+
console.error('usage: node scripts/bongos/ship.js <task-id> (--notes-file <path|-> | --notes "...") (--summary-file <path|-> | --summary "...") [--visual <image>] [--visual-alt "caption"] [--surprise "text" | --surprise none | --no-surprise] [--no-merge] [--db-only] [--verified] [--allow-empty] [--allow-smoke-fail] [--base <ref>] [--ship-mode auto|manual]');
|
|
67
|
+
console.error(' prefer the -file forms for prose: a shell command-substitutes backticks in an inline value before node sees it (learning 1000197).');
|
|
68
|
+
process.exit(2);
|
|
69
|
+
}
|
|
70
|
+
// G04: prose from a FILE or inline, never shell-mangled in silence.
|
|
71
|
+
const prose = resolveProse(args, ['notes', 'summary']);
|
|
72
|
+
const notes = prose.notes;
|
|
73
|
+
const summary = prose.summary;
|
|
74
|
+
const skipMerge = args.includes('--no-merge');
|
|
75
|
+
const force = args.includes('--force');
|
|
76
|
+
// task 391 (idea #37): a deliberate zero-commit / direct-SQL ship. Without it,
|
|
77
|
+
// a branch with no commits ahead of main is REFUSED (not silently shipped).
|
|
78
|
+
// task 1002422: --base <ref> also implies db-only — the work is already on main
|
|
79
|
+
// (that's the whole point of --base), so the merge leg has nothing to merge and
|
|
80
|
+
// advances straight to shipped. Unlike --allow-empty it does NOT skip the grade:
|
|
81
|
+
// the pinned baseline gives the grader a real diff (see resolveBaseRef / main).
|
|
82
|
+
const baseRefRaw = arg('--base', args);
|
|
83
|
+
const dbOnly = args.includes('--db-only') || args.includes('--allow-empty') || Boolean(baseRefRaw);
|
|
84
|
+
// task 1053 (F): explicit attestation that a verification task's verify
|
|
85
|
+
// actually passed. Required to confirm a kind='verify' task (the server
|
|
86
|
+
// enforces it too); a no-op for every other task.
|
|
87
|
+
const verified = args.includes('--verified');
|
|
88
|
+
// #853 (ADR 0041): `let` not `const` — when the server has the temporary
|
|
89
|
+
// global grader bypass ON (surfaced as me.grader_bypass below), we force the
|
|
90
|
+
// skip-grade/confirm path for everyone so no builder runs the subagent grader
|
|
91
|
+
// during a grader outage window.
|
|
92
|
+
let skipGrade = args.includes('--skip-grade');
|
|
93
|
+
// task 1365: explicit acknowledgement that this task legitimately has NO
|
|
94
|
+
// committed artifact (a pure DB-only / no-op task). Required for the
|
|
95
|
+
// empty-diff guard below to ALLOW an empty committed diff; without it, an
|
|
96
|
+
// empty diff is refused (it used to slip through under --skip-grade — the
|
|
97
|
+
// task-1363 phantom ship). Never overrides a dirty working tree.
|
|
98
|
+
const allowEmpty = args.includes('--allow-empty');
|
|
99
|
+
// task 1003950: set only when the empty-diff guard below classifies this ship as a
|
|
100
|
+
// deliberate no-artifact close. Gates the auto-escalation at the confirm wall.
|
|
101
|
+
let noArtifactClose = false;
|
|
102
|
+
// task 1004011: this ship has no committed diff, so the grade's subject is the
|
|
103
|
+
// builder's CLAIM (notes + value summary) rather than a diff. Distinct from
|
|
104
|
+
// noArtifactClose, which marks the older "reached the archon gate" case: a ship
|
|
105
|
+
// can now be no-artifact and still fully graded, which is the point.
|
|
106
|
+
let noArtifactGrade = false;
|
|
107
|
+
// task 1002605 (G-18): explicit opt-in to continue past a FAILED production
|
|
108
|
+
// smoke run. Without it a smoke FAIL now ABORTS before the claim resolves
|
|
109
|
+
// (claim intact); with it, the resolve proceeds and the task deliberately
|
|
110
|
+
// parks at 'completed' ungraded — and the ship says so instead of "Done."
|
|
111
|
+
const allowSmokeFail = args.includes('--allow-smoke-fail');
|
|
112
|
+
// Surprise flag handling — see captureSurpriseLearning(). Resolved below
|
|
113
|
+
// once we know which claim is being shipped (so touches[] can become tags).
|
|
114
|
+
const surpriseRaw = arg('--surprise', args);
|
|
115
|
+
const surpriseProvided = surpriseRaw !== null;
|
|
116
|
+
const noSurprise = args.includes('--no-surprise');
|
|
117
|
+
|
|
118
|
+
// task 1002422 (blocker 1000082): resolve + validate --base BEFORE any heavy
|
|
119
|
+
// work so a bad ref aborts with the claim STILL ACTIVE. On success it sets the
|
|
120
|
+
// module-level baseOverrideSha that computeGraderBaseline() reads, so the grader
|
|
121
|
+
// reads <base>...HEAD (a real diff) and the ship takes the rank-open graded path
|
|
122
|
+
// instead of the --allow-empty → skip-grade → Archon-only /confirm dead-end.
|
|
123
|
+
if (baseRefRaw) {
|
|
124
|
+
const res = applyBaseOverride(baseRefRaw);
|
|
125
|
+
if (!res.ok) {
|
|
126
|
+
console.error(`Ship aborted: ${res.reason}. No claim resolved, no credits awarded.`);
|
|
127
|
+
console.error('Omit --base and ship normally — the grader reviews ALL your commits and the merge lands them. Your claim is still active.');
|
|
128
|
+
process.exit(2);
|
|
129
|
+
}
|
|
130
|
+
console.log(`--base: grading ${res.sha.slice(0, 9)}...HEAD — the task's real committed diff (work already on main). Graded via the rank-open path; no --allow-empty needed.`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// task 1003109: screen --visual BEFORE any heavy work, so bad input aborts with
|
|
134
|
+
// the claim STILL ACTIVE (the --base posture above). null when none was asked for.
|
|
135
|
+
const visual = shipVisual.fromArgs(args);
|
|
136
|
+
|
|
137
|
+
const me = noteServerReward(await (await cliClient()).me.getMe());
|
|
138
|
+
if (!me.ok) {
|
|
139
|
+
console.error('failed to load profile:', me.data);
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
// #853 (ADR 0041): honor the server-side global grader bypass. When ON, every
|
|
143
|
+
// builder lands work without the subagent grader (the /tasks/:id/confirm gate
|
|
144
|
+
// is relaxed to any-builder server-side to match). Default OFF.
|
|
145
|
+
if (me.data.grader_bypass && !skipGrade) {
|
|
146
|
+
skipGrade = true;
|
|
147
|
+
console.log('Note: GRADER_BYPASS_ENABLED is on server-side — skipping the subagent grader and confirming directly (temporary outage window).');
|
|
148
|
+
}
|
|
149
|
+
const claims = me.data.active_claims || (me.data.active_claim ? [me.data.active_claim] : []);
|
|
150
|
+
const ac = claims.find((c) => Number(c.task_id) === taskId);
|
|
151
|
+
if (!ac) {
|
|
152
|
+
// task 941 (V4.R03): no active claim in THIS session is NOT automatically a
|
|
153
|
+
// dead-end. The claim is consumed at resolve, so a ship that stalled AFTER it
|
|
154
|
+
// (grade fail → `completed`; merge/deploy fail → `confirmed`, the #1027 case)
|
|
155
|
+
// leaves no claim — but a plain re-run should RESUME the stalled leg, not
|
|
156
|
+
// strand the task. Route on the task's current status + ownership.
|
|
157
|
+
const tRes = await (await cliClient()).tasks.getTasksId({ id: taskId, query: { include: 'last_claim' } });
|
|
158
|
+
const task = tRes.ok ? tRes.data.task : null;
|
|
159
|
+
const lastClaim = tRes.ok ? (tRes.data.last_claim || null) : null;
|
|
160
|
+
const action = evaluateResumeAction({ task, lastClaim, builder: me.data.builder });
|
|
161
|
+
if (action.action === 'resume-grade') {
|
|
162
|
+
console.log(`Task #${taskId} is at 'completed' (grade stalled) and ${action.via === 'owner' ? 'you last held the claim' : 'you are an Archon'} — resuming the grade (no re-claim needed).`);
|
|
163
|
+
return regradeMain({ visual });
|
|
164
|
+
}
|
|
165
|
+
if (action.action === 'resume-merge') {
|
|
166
|
+
console.log(`Task #${taskId} is at 'confirmed' (merge/deploy stalled) and ${action.via === 'owner' ? 'you last held the claim' : 'you are an Archon'} — resuming the merge + deploy (no re-claim needed).`);
|
|
167
|
+
if (await stopForManualApproval(args, taskId)) return; // a resumed land is a ship too (task 1004631)
|
|
168
|
+
return resumeMerge(taskId, { summary, skipMerge, force, task, dbOnly });
|
|
169
|
+
}
|
|
170
|
+
if (action.action === 'done') {
|
|
171
|
+
console.log(action.reason);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
console.error(action.reason || `You don't have an active claim on task #${taskId}.`);
|
|
175
|
+
if (claims.length > 0) {
|
|
176
|
+
console.error(`Your active claims:`);
|
|
177
|
+
for (const c of claims) console.error(` #${c.task_id}: ${c.title}`);
|
|
178
|
+
}
|
|
179
|
+
process.exit(1);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// ---- First ship asks for the ship mode, once (task 1004630, ADR 0369) ----
|
|
183
|
+
// A project that never chose Auto or Manual stops HERE, before anything resolves,
|
|
184
|
+
// so the AI can ask the person; the re-run carries --ship-mode and saves it. Never
|
|
185
|
+
// blocks a ship nobody can answer for (see ship-mode-ask.js).
|
|
186
|
+
const firstShip = await runFirstShipAsk({
|
|
187
|
+
args,
|
|
188
|
+
getShipMode: async () => {
|
|
189
|
+
const r = await apiCall('GET', '/api/bongos/project-settings/ship-mode');
|
|
190
|
+
return r.ok ? r.data : null;
|
|
191
|
+
},
|
|
192
|
+
saveShipMode: (mode) => apiCall('PATCH', '/api/bongos/project-settings/ship-mode', { mode }),
|
|
193
|
+
});
|
|
194
|
+
if (firstShip.stop) {
|
|
195
|
+
for (const line of firstShip.lines) console.log(line);
|
|
196
|
+
cliExit(firstShip.exit);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// ---- Hard cap: refuse to ship over the monthly budget (V3.R84 #302, C3) ----
|
|
201
|
+
// Shipping runs the subagent grader, which spends API $. If this builder is at
|
|
202
|
+
// or over their monthly budget, refuse here — BEFORE the grader runs and BEFORE
|
|
203
|
+
// the claim resolves, so the claim stays active and no cost is incurred. Any
|
|
204
|
+
// Metic+ builder lifts the block by raising the builder's budget
|
|
205
|
+
// (PATCH /builders/:id/budget — builder.budget.set, metic-floored since ADR 0157).
|
|
206
|
+
// Fail-open: a missing/unreadable cost status (e.g. an older server) never blocks a ship.
|
|
207
|
+
const costStatus = me.data.cost;
|
|
208
|
+
if (costStatus && costStatus.level === 'over') {
|
|
209
|
+
console.error('');
|
|
210
|
+
console.error(`Ship refused: monthly budget exceeded — $${costStatus.spend_mtd_usd} of $${costStatus.budget_mtd_usd} spent this month (${costStatus.pct_used}%).`);
|
|
211
|
+
console.error('Shipping runs the quality grader, which spends API budget. No claim resolved, no credits awarded.');
|
|
212
|
+
console.error('Ask any Metic or Archon to raise your monthly budget (PATCH /builders/:id/budget), then re-ship.');
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ---- Manual ship mode: an AI session asks the person first (task 1004631, ADR 0369) ----
|
|
217
|
+
// Before anything resolves, so a "not yet" leaves the claim exactly as it was.
|
|
218
|
+
if (await stopForManualApproval(args, taskId)) return;
|
|
219
|
+
|
|
220
|
+
// ---- Surprise gate: forced "anything surprise you?" prompt ----
|
|
221
|
+
//
|
|
222
|
+
// Resolve the user's intent into a single value: either a non-empty surprise
|
|
223
|
+
// string (capture a learning) or empty (no surprise, ship normally).
|
|
224
|
+
// --surprise "text" → capture
|
|
225
|
+
// --surprise none → no surprise
|
|
226
|
+
// --surprise "" → no surprise
|
|
227
|
+
// --no-surprise → no surprise
|
|
228
|
+
// neither + TTY → prompt
|
|
229
|
+
// neither + non-TTY → no surprise, with stderr warning
|
|
230
|
+
let surpriseText = '';
|
|
231
|
+
if (surpriseProvided) {
|
|
232
|
+
const v = (surpriseRaw || '').trim();
|
|
233
|
+
surpriseText = (v === '' || v.toLowerCase() === 'none') ? '' : v;
|
|
234
|
+
} else if (noSurprise) {
|
|
235
|
+
surpriseText = '';
|
|
236
|
+
} else if (process.stdout.isTTY && process.stdin.isTTY) {
|
|
237
|
+
surpriseText = await promptSurprise();
|
|
238
|
+
if (surpriseText.toLowerCase() === 'none') surpriseText = '';
|
|
239
|
+
} else {
|
|
240
|
+
console.error('warn: no --surprise or --no-surprise provided in non-interactive context; defaulting to no surprise.');
|
|
241
|
+
surpriseText = '';
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// ---- Step 0: preflight (working tree + branch freshness) ----
|
|
245
|
+
console.log(`Verifying claim #${ac.claim_id} on task #${ac.task_id}: ${ac.title}`);
|
|
246
|
+
console.log('Preflight (working tree + branch freshness)...');
|
|
247
|
+
// task 1001436: inputFiles keeps --notes-file/--summary-file/--visual out of the
|
|
248
|
+
// preflight's untracked-file warning — they are this ship's input, not its artifact.
|
|
249
|
+
const pre = preflight(ac, { force, inputFiles: shipInputPaths(args) });
|
|
250
|
+
if (!pre.ok) {
|
|
251
|
+
console.error('');
|
|
252
|
+
console.error(`Ship aborted: ${pre.reason}. No claim resolved, no credits awarded.`);
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// ---- Step 0b: pull origin/main into the branch up front (#1068, gap 2) ----
|
|
257
|
+
// So the tree reviewed on the sandbox == the tree we ship — no post-approval
|
|
258
|
+
// re-stage loop. Skipped under --no-merge (a deliberate "don't touch main"
|
|
259
|
+
// opt-out). Aborts only on a genuine conflict, claim left intact.
|
|
260
|
+
if (!skipMerge) {
|
|
261
|
+
const m = mergeMainIntoBranch();
|
|
262
|
+
if (!m.ok) {
|
|
263
|
+
console.error('');
|
|
264
|
+
console.error(`Ship aborted: ${m.reason}.`);
|
|
265
|
+
console.error('No claim resolved, no credits awarded — your claim is still active.');
|
|
266
|
+
process.exit(1);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ---- Capture surprise learning (if any) ----
|
|
271
|
+
if (surpriseText) {
|
|
272
|
+
console.log('Capturing surprise as a learning...');
|
|
273
|
+
await captureSurpriseLearning(surpriseText, ac, taskId);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// ---- Pre-verify: auto-linkify this ship's own changed docs (#747) ----
|
|
277
|
+
// Fix bare "#NNN" task refs in the docs this ship changed BEFORE the merge,
|
|
278
|
+
// so they never red-X the doc-ref-linkify gate (tests/linkify_check.mjs in
|
|
279
|
+
// the `unit` check). Best-effort.
|
|
280
|
+
autoLinkifyChangedDocs(ac);
|
|
281
|
+
|
|
282
|
+
// ---- Empty-diff / phantom-ship guard (must run BEFORE the review gate + resolve) ----
|
|
283
|
+
// #513 added this check, but at step 2 — AFTER the resolve below already
|
|
284
|
+
// landed the task at `completed` and consumed the claim. A builder who ran
|
|
285
|
+
// /builder-ship before committing then burned the claim and couldn't re-ship
|
|
286
|
+
// ("You don't have an active claim" — the task-595-regrade-gap). Observed
|
|
287
|
+
// live on #662 (Windows). Moving it here means an empty committed diff aborts
|
|
288
|
+
// cleanly with the claim STILL ACTIVE, so the builder can commit and re-run.
|
|
289
|
+
// The grader reads committed history (baseline...HEAD), independent of
|
|
290
|
+
// touches[] (see computeGraderBaseline). The computed list is reused by the
|
|
291
|
+
// grader at step 2 so we don't diff twice.
|
|
292
|
+
//
|
|
293
|
+
// task 1365: this guard now runs REGARDLESS of --skip-grade. The old version
|
|
294
|
+
// was gated on `!skipGrade`, so --skip-grade (and the server-side
|
|
295
|
+
// grader_bypass that forces skipGrade) sailed an empty committed diff straight
|
|
296
|
+
// through to resolve → manual-confirm → the publish reconciler then shipped a
|
|
297
|
+
// task with NO artifact on main (task 1363: a new doc left UNTRACKED, never
|
|
298
|
+
// committed, HEAD never moved — the ledger lied, CLAUDE.md §8). classifyEmptyShip
|
|
299
|
+
// splits the three cases: a dirty/untracked working tree means the deliverable
|
|
300
|
+
// was never committed (refuse, even under --allow-empty); a clean tree with an
|
|
301
|
+
// explicit --allow-empty is a genuine no-artifact/DB-only ship (allow); a clean
|
|
302
|
+
// tree without the flag is nothing-to-ship (refuse). Refusing here leaves the
|
|
303
|
+
// claim ACTIVE so the builder can commit + re-run.
|
|
304
|
+
const graderBaseline = computeGraderBaseline(ac);
|
|
305
|
+
const committedFiles = computeChangedFiles(graderBaseline);
|
|
306
|
+
if (committedFiles.length === 0) {
|
|
307
|
+
const verdict = classifyEmptyShip(gitOk('git status --porcelain'), { allowEmpty });
|
|
308
|
+
if (verdict.reason === 'uncommitted-work') {
|
|
309
|
+
console.error('Ship refused: nothing is committed on this branch, but your working tree has uncommitted changes:');
|
|
310
|
+
for (const f of verdict.uncommitted) console.error(` - ${f}`);
|
|
311
|
+
console.error('');
|
|
312
|
+
console.error('Your work was never committed — shipping now would mark the task "shipped" with NO artifact on main (the ledger would lie).');
|
|
313
|
+
console.error('Stage + commit your work (e.g. `git add -A && git commit`), then re-run /builder-ship. Your claim is still active.');
|
|
314
|
+
for (const line of plainCardLines('uncommitted_work')) console.error(line);
|
|
315
|
+
process.exit(1);
|
|
316
|
+
}
|
|
317
|
+
if (verdict.reason === 'nothing-to-ship') {
|
|
318
|
+
console.error(`Nothing to ship: the committed diff vs ${graderBaseline || 'baseline'} is empty and the working tree is clean.`);
|
|
319
|
+
console.error('The grader reads committed history, not the working tree — commit your work on this branch, then re-run /builder-ship. Your claim is still active.');
|
|
320
|
+
console.error('If this task legitimately has no code/doc artifact (a pure DB-only or no-op task), re-run with --allow-empty.');
|
|
321
|
+
for (const line of plainCardLines('nothing_to_ship')) console.error(line);
|
|
322
|
+
process.exit(1);
|
|
323
|
+
}
|
|
324
|
+
// verdict.reason === 'allow-empty': a deliberate no-artifact / DB-only ship.
|
|
325
|
+
//
|
|
326
|
+
// task 1004011 (ADR 0320): this used to force `skipGrade = true` — no grade at
|
|
327
|
+
// all, then the Archon-only `task.confirm.grade_bypass` gate. Both halves were
|
|
328
|
+
// wrong. An empty diff is not an UNGRADED diff, it is a diff the grader has
|
|
329
|
+
// nothing to say about, so it should not need the key that ratifies past a
|
|
330
|
+
// FAILING grade. And something here does deserve adversarial scrutiny: not the
|
|
331
|
+
// absent diff, but the CLAIM that nothing was needed. "The premise was already
|
|
332
|
+
// fixed", "this was a pure ops verification" are assertions the ledger records
|
|
333
|
+
// and, until now, nothing checked.
|
|
334
|
+
//
|
|
335
|
+
// So the grader is no longer skipped — it is re-pointed at the notes. A pass is
|
|
336
|
+
// a REAL passing grade and confirms through the ordinary rank-open path; a fail
|
|
337
|
+
// is a real fail, and the builder fixes the evidence rather than reaching for a
|
|
338
|
+
// permission. skipGrade stays false; only an explicit --skip-grade still skips.
|
|
339
|
+
// Set only when a grade will actually run. With --skip-grade (or the server-side
|
|
340
|
+
// grader_bypass, which forces skipGrade above) the `if (!skipGrade)` gate below
|
|
341
|
+
// skips grading entirely and this flag would be inert — but an inert flag makes a
|
|
342
|
+
// reader trace two of them to see why nothing happened, and invites a later
|
|
343
|
+
// refactor to treat it as "this ship graded its notes" when it graded nothing.
|
|
344
|
+
noArtifactGrade = !skipGrade;
|
|
345
|
+
// task 1003950: mark WHY the grader is being skipped. A --skip-grade ship past a
|
|
346
|
+
// failing grade and a genuinely artifact-free close both reach the same archon
|
|
347
|
+
// gate below, but only the second one may be escalated automatically — the first
|
|
348
|
+
// has a diff the grader DID read and reject, and auto-filing a blocker for it
|
|
349
|
+
// would be a builder routing their own rejected work to an override queue.
|
|
350
|
+
//
|
|
351
|
+
// Still set, and still needed: since task 1004011 this close reaches the archon
|
|
352
|
+
// gate only when the builder ALSO passed --skip-grade, or the server bypassed
|
|
353
|
+
// the grader for them. Those are the cases where the escalation split still
|
|
354
|
+
// decides which refusal is printed.
|
|
355
|
+
noArtifactClose = true;
|
|
356
|
+
console.log('--allow-empty: no committed diff (no-artifact / DB-only ship).');
|
|
357
|
+
if (noArtifactGrade) {
|
|
358
|
+
console.log(' The grader is not skipped — it is re-pointed: your handoff notes and value summary are graded');
|
|
359
|
+
console.log(' against the task description, so the claim that nothing was needed is what gets checked (task 1004011).');
|
|
360
|
+
} else {
|
|
361
|
+
console.log(' The grader is skipped (--skip-grade / server bypass), so the claim is NOT checked — this close');
|
|
362
|
+
console.log(' routes to the archon confirm gate. Drop --skip-grade to have your notes graded instead.');
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// ---- Module drift check (BV1.R53, task 1422) ----
|
|
367
|
+
// If the task carries a module_key, verify the committed diff doesn't stray
|
|
368
|
+
// into a DIFFERENT module's territory. "You said game, you touched provisioning" is
|
|
369
|
+
// the semantic violation this catches. Files no module owns are allowed —
|
|
370
|
+
// they're cross-cutting — as is the territory of a CROSS-CUTTING module, which
|
|
371
|
+
// every craft legitimately writes into. Only contact with a different OWNING
|
|
372
|
+
// module's glob set is flagged.
|
|
373
|
+
//
|
|
374
|
+
// The rule itself lives in module-scope-map.js (moduleDriftFiles) next to the
|
|
375
|
+
// map it reads, so it can be tested without running a ship (task 1003770). It
|
|
376
|
+
// used to be inline here, and read "files outside all module scopes (docs,
|
|
377
|
+
// session logs, general scripts) are allowed" — a premise task 1002989 ended by
|
|
378
|
+
// giving `methodology` the whole docs/ subtree. Since every ship writes a
|
|
379
|
+
// session log, the advisory then fired for 25 of the 26 module keys on that log
|
|
380
|
+
// alone. See CROSS_CUTTING_KEYS for why the glob was not shrunk instead.
|
|
381
|
+
//
|
|
382
|
+
// The check is ADVISORY (warns but does not refuse) on the first cut because
|
|
383
|
+
// the module_key column is new and existing tasks may carry a broader diff scope
|
|
384
|
+
// until all tasks are labelled. Enforced tasks can opt in with --enforce-module.
|
|
385
|
+
// ac.module_key comes from getActiveClaimsForBuilder (t.module_key in the join).
|
|
386
|
+
const enforceModule = args.includes('--enforce-module');
|
|
387
|
+
if (ac.module_key && isModuleKey(ac.module_key) && committedFiles.length > 0) {
|
|
388
|
+
const moduleDriftFiles = computeModuleDrift(ac.module_key, committedFiles);
|
|
389
|
+
if (moduleDriftFiles.length > 0) {
|
|
390
|
+
// Name the module's REAL territory rather than guessing 'modules/<key>/'.
|
|
391
|
+
// That guess is wrong for every module whose code has not been carved out
|
|
392
|
+
// yet (ADR 0083) — kernel lives in src/bongos/, methodology in docs/ — so
|
|
393
|
+
// the advisory used to tell those builders to move their work somewhere
|
|
394
|
+
// their module does not own. scopeForModule is the roster's own answer.
|
|
395
|
+
const declared = scopeForModule(ac.module_key);
|
|
396
|
+
const territory = declared && declared.globs.length
|
|
397
|
+
? declared.globs.slice(0, 4).join(', ') + (declared.globs.length > 4 ? `, +${declared.globs.length - 4} more` : '')
|
|
398
|
+
: `modules/${ac.module_key}/`;
|
|
399
|
+
const msg = [
|
|
400
|
+
`\n⚠ Module drift detected: task is scoped to '${ac.module_key}' but ${moduleDriftFiles.length} file(s) touch a different module:`,
|
|
401
|
+
...moduleDriftFiles.map((f) => ` - ${f}`),
|
|
402
|
+
'',
|
|
403
|
+
` '${ac.module_key}' owns: ${territory}`,
|
|
404
|
+
'',
|
|
405
|
+
enforceModule
|
|
406
|
+
? `Refused (--enforce-module). Confine your changes to that territory, or clear the module_key label.`
|
|
407
|
+
: 'Advisory — ship proceeds, but consider confining your changes to that territory.',
|
|
408
|
+
].join('\n');
|
|
409
|
+
console.log(msg);
|
|
410
|
+
if (enforceModule) process.exit(1);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// ---- Sandbox-first review gate (#927, ADR 0046) ----
|
|
415
|
+
// On a clone that carries the game preview, a diff that touches game
|
|
416
|
+
// surfaces must be STAGED on the builder's own local preview (ADR 0044)
|
|
417
|
+
// and reviewed in a browser before the claim resolves — see it running,
|
|
418
|
+
// get the chance to iterate, THEN decide to ship to the main game. A
|
|
419
|
+
// checkout with no game preview, non-game diffs, and --skip-stage all pass
|
|
420
|
+
// through untouched. Interactive: stage + ask; declining aborts with the
|
|
421
|
+
// claim intact. Non-TTY (agent-driven sessions): stage, then abort with the
|
|
422
|
+
// review URL — the re-run after the human reviews passes on the fresh
|
|
423
|
+
// staged marker. Never hangs on stdin.
|
|
424
|
+
const sandboxGate = await runShipGate({
|
|
425
|
+
taskId,
|
|
426
|
+
files: committedFiles,
|
|
427
|
+
skipStage: args.includes('--skip-stage'),
|
|
428
|
+
// #1048: --approved records the builder's sign-off after they reviewed the
|
|
429
|
+
// staged change on their sandbox. Only honored on a re-run whose game state
|
|
430
|
+
// is already staged-fresh — it can't pre-approve an unstaged change.
|
|
431
|
+
approved: args.includes('--approved'),
|
|
432
|
+
tty: Boolean(process.stdout.isTTY && process.stdin.isTTY),
|
|
433
|
+
});
|
|
434
|
+
if (!sandboxGate.ok) {
|
|
435
|
+
if (sandboxGate.review) {
|
|
436
|
+
// task 1275: the in-review card — the SAME lifecycle card, amber, whose
|
|
437
|
+
// action is "Open in sandbox ↗" (the sandbox URL the owner asked to surface
|
|
438
|
+
// here). Best-effort, never blocks the pause.
|
|
439
|
+
try {
|
|
440
|
+
const shipCard = require('../../modules/lifecycle/ship-card');
|
|
441
|
+
const { added, removed } = diffstatFor(graderBaseline);
|
|
442
|
+
const model = shipCard.buildCardModel({
|
|
443
|
+
stage: 'review',
|
|
444
|
+
taskId,
|
|
445
|
+
title: ac.title,
|
|
446
|
+
valueSummary: summary,
|
|
447
|
+
fileCount: committedFiles.length || null,
|
|
448
|
+
added,
|
|
449
|
+
removed,
|
|
450
|
+
sandboxUrl: sandboxGate.url,
|
|
451
|
+
});
|
|
452
|
+
// task 1279 / 1002518: honour the builder's card-richness level (from the
|
|
453
|
+
// /me fetched at the top of shipMain; the standard rung if absent, and
|
|
454
|
+
// the boolean's old meaning against an older server).
|
|
455
|
+
shipCard.emitCard(model, taskId, { flags: cardFlagsFromMe(me) });
|
|
456
|
+
} catch (_) { /* the review pause stands with or without the card */ }
|
|
457
|
+
// #1061 polish: a sandbox review pause is a DELIBERATE, expected
|
|
458
|
+
// checkpoint — not a failed ship. printReviewBlock already showed the URL
|
|
459
|
+
// + the --approved next step, so don't follow it with red "Ship aborted /
|
|
460
|
+
// no credits awarded" text that makes the review moment read as broken.
|
|
461
|
+
// Calm note on stdout (not stderr); the claim is left fully intact.
|
|
462
|
+
console.log('');
|
|
463
|
+
console.log('⏸ Paused for your sandbox review — this is expected, not an error.');
|
|
464
|
+
console.log(' Your claim is still active; nothing was lost.');
|
|
465
|
+
console.log(' Walk the change at the link above, then approve with: /builder-ship --approved');
|
|
466
|
+
process.exit(1);
|
|
467
|
+
}
|
|
468
|
+
console.error('');
|
|
469
|
+
console.error(`Ship aborted: ${sandboxGate.reason}.`);
|
|
470
|
+
console.error('No claim resolved, no credits awarded — your claim is still active.');
|
|
471
|
+
process.exit(1);
|
|
472
|
+
}
|
|
473
|
+
// #1048: the recorded sandbox self-approval (when the builder approved a
|
|
474
|
+
// staged game change), threaded into the resolve call below so the server
|
|
475
|
+
// persists it on the task. null on a checkout with no game preview, non-game
|
|
476
|
+
// diffs, --skip-stage, and bare fresh-marker re-runs without --approved.
|
|
477
|
+
const sandboxReview = sandboxGate.sandboxReview || null;
|
|
478
|
+
|
|
479
|
+
// ---- Step 1+2: verify locally (smoke) — runs AFTER the review gate (#1061) ----
|
|
480
|
+
// touches[] cleanup [4/8] (task 879): the predictive drift scanner is gone;
|
|
481
|
+
// local verification is smoke-only. Smoke runs HERE (post-gate) so a review
|
|
482
|
+
// PAUSE doesn't bury the sandbox link under the smoke output — smoke only runs
|
|
483
|
+
// on the actual ship: the --approved re-run, or a laptop / non-game ship the
|
|
484
|
+
// gate waved straight through. (#1061 — the gate is a no-op for those, so this
|
|
485
|
+
// is the same single smoke run as before, just sequenced after it.)
|
|
486
|
+
|
|
487
|
+
// task 1002660: start the grade COMPUTATION now, so the multi-minute panel
|
|
488
|
+
// overlaps the smoke run + claim resolve instead of serializing behind them.
|
|
489
|
+
// computeGradeResult performs no server writes — the grade POST stays in the
|
|
490
|
+
// grade step below, after the resolve lands the task at 'completed'. On a
|
|
491
|
+
// smoke abort the in-flight panel is discarded (its partial spend is lost —
|
|
492
|
+
// rare, and cheaper than serializing every ship behind smoke).
|
|
493
|
+
let gradeCompute = null;
|
|
494
|
+
let fullTaskForGrade = null;
|
|
495
|
+
if (!skipGrade) {
|
|
496
|
+
const tFetch = await (await cliClient()).tasks.getTasksId({ id: taskId });
|
|
497
|
+
fullTaskForGrade = tFetch.ok ? tFetch.data.task : { id: taskId, title: ac.title };
|
|
498
|
+
console.log(noArtifactGrade
|
|
499
|
+
? 'Starting the no-artifact grader over your notes (overlaps the smoke run — task 1002660)...'
|
|
500
|
+
: 'Starting the quality grader panel (overlaps the smoke run — task 1002660)...');
|
|
501
|
+
gradeCompute = computeGradeResult({
|
|
502
|
+
taskId, task: fullTaskForGrade, summary,
|
|
503
|
+
baseline: graderBaseline, committedFiles,
|
|
504
|
+
// task 1004011: present ⇒ grade the claim, not the (empty) diff. The notes
|
|
505
|
+
// are the evidence, so they have to travel with it.
|
|
506
|
+
noArtifact: noArtifactGrade ? { notes } : null,
|
|
507
|
+
});
|
|
508
|
+
gradeCompute.catch(() => {}); // an abort path must not die on an unhandled rejection
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
console.log('Running smoke tests against production...');
|
|
512
|
+
// task 1002660: the async twin — awaiting keeps the event loop free so the
|
|
513
|
+
// overlapped panel's subprocess callbacks progress while smoke runs.
|
|
514
|
+
const smoke = await runSmokeAsync();
|
|
515
|
+
const passed = smoke.clean;
|
|
516
|
+
console.log('');
|
|
517
|
+
console.log(`Verification: smoke=${smoke.clean ? 'clean' : 'FAIL'}, overall=${passed ? 'PASS' : 'FAIL'}`);
|
|
518
|
+
console.log('');
|
|
519
|
+
|
|
520
|
+
// task 1002605 (G-18): a smoke FAIL used to fall straight through into the
|
|
521
|
+
// claim resolve — claim consumed, grading silently skipped, task parked at
|
|
522
|
+
// 'completed', exit 0, and the builder read "Done." believing they shipped.
|
|
523
|
+
// Abort BEFORE the resolve instead — the same claim-preserving posture as the
|
|
524
|
+
// budget cap and the sandbox-review gate above. --allow-smoke-fail is the
|
|
525
|
+
// deliberate continuation; the parked message where the grader would have run
|
|
526
|
+
// says exactly where that leaves the task.
|
|
527
|
+
if (!passed && !allowSmokeFail) {
|
|
528
|
+
console.error('');
|
|
529
|
+
for (const line of smokeGateMessages(taskId).abort) console.error(line);
|
|
530
|
+
for (const line of plainCardLines('smoke_failed')) console.error(line);
|
|
531
|
+
process.exit(1);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// ---- Step 1: resolve the claim (lands at completed) ----
|
|
535
|
+
// V3.R18 (#209): resolveClaim no longer runs the v1 deterministic grader.
|
|
536
|
+
// It now lands the task at `completed` when verification (smoke) passes, and
|
|
537
|
+
// stops. The v2 subagent grader (step 2 below) is what gates the credits +
|
|
538
|
+
// the completed→confirmed transition.
|
|
539
|
+
const resolveBody = {
|
|
540
|
+
outcome: 'shipped',
|
|
541
|
+
notes_md: notes,
|
|
542
|
+
value_summary: summary,
|
|
543
|
+
verification: {
|
|
544
|
+
passed,
|
|
545
|
+
// touches[] cleanup [4/8] (task 879): the drift scanner is gone; with no
|
|
546
|
+
// scanner there is nothing to drift, so this audit-trail signal
|
|
547
|
+
// (read by the retired v1 grader, task 1002842) is vacuously clean.
|
|
548
|
+
scanner_clean: true,
|
|
549
|
+
smoke_clean: smoke.clean,
|
|
550
|
+
},
|
|
551
|
+
// touches[] cleanup [7/8] (task 882): the real committed changed-files, so
|
|
552
|
+
// the server backfills touches[] from reality (the planning prediction is
|
|
553
|
+
// now optional). Same list the grader already used.
|
|
554
|
+
committed_files: committedFiles,
|
|
555
|
+
// #1048: the sandbox self-approval { stamp, url, method } when the builder
|
|
556
|
+
// reviewed + approved a staged game change. The server stamps by/at and
|
|
557
|
+
// persists it to tasks.sandbox_review. null = nothing to record.
|
|
558
|
+
sandbox_review: sandboxReview,
|
|
559
|
+
// task 1003767: the working tree this ship is running in, so the server's
|
|
560
|
+
// resolve lock can key on the TREE instead of the auth session. Without it
|
|
561
|
+
// a /builder-reauth mid-claim re-issued the session and stranded the ship
|
|
562
|
+
// with `release --force` (forfeiting graded work) the only way out. Same
|
|
563
|
+
// detector claim.js uses, so the two names always agree.
|
|
564
|
+
resolver_worktree: detectWorktreeName(),
|
|
565
|
+
};
|
|
566
|
+
let r = await (await cliClient()).claims.postClaimsIdResolve({ id: ac.claim_id, body: resolveBody });
|
|
567
|
+
|
|
568
|
+
// FORWARD COMPATIBILITY (task 1003767). The resolve route validates STRICTLY:
|
|
569
|
+
// an unknown body field is a hard 400, not an ignored extra. @cloudbongos/cli
|
|
570
|
+
// is published separately from the core and instances pin their own core
|
|
571
|
+
// version, so a CLI carrying a field the server has not learned yet would
|
|
572
|
+
// otherwise be unable to ship AT ALL against that instance — the diff that
|
|
573
|
+
// added `resolver_worktree` hit exactly this on its own ship.
|
|
574
|
+
//
|
|
575
|
+
// So: if the server rejects specifically because it does not know
|
|
576
|
+
// `resolver_worktree`, drop it and retry ONCE. The lock then falls back to
|
|
577
|
+
// the session compare server-side, which is what an older core did anyway —
|
|
578
|
+
// no behaviour is lost that that server ever had.
|
|
579
|
+
//
|
|
580
|
+
// Deliberately narrow: it retries only when the details name THIS field as
|
|
581
|
+
// unknown. Any other validation failure — including an unknown field we did
|
|
582
|
+
// not send on purpose — still surfaces, so this cannot mask a real bug.
|
|
583
|
+
if (!r.ok && isUnknownFieldRejection(r.status, r.data, 'resolver_worktree')) {
|
|
584
|
+
console.error("note: this instance's core predates resolver_worktree — retrying without it.");
|
|
585
|
+
console.error(' (the resolve lock falls back to the session check on that server.)');
|
|
586
|
+
delete resolveBody.resolver_worktree;
|
|
587
|
+
r = await (await cliClient()).claims.postClaimsIdResolve({ id: ac.claim_id, body: resolveBody });
|
|
588
|
+
}
|
|
589
|
+
if (!r.ok) {
|
|
590
|
+
const resolveErr = normalizeApiError(r.data);
|
|
591
|
+
if (resolveErr.code === 'CLAIM_SESSION_MISMATCH') {
|
|
592
|
+
const wt = resolveErr.details.claimWorktree;
|
|
593
|
+
// task 1003767: name WHICH lock fired. 'worktree_mismatch' means the claim
|
|
594
|
+
// really was made in another working tree — the branch this ship would
|
|
595
|
+
// publish is not the branch that did the work, so shipping here would land
|
|
596
|
+
// the wrong commits. That is the guard doing its job, and the fix is to run
|
|
597
|
+
// the ship from the right tree, NOT to force-release. Only a fallback
|
|
598
|
+
// 'session_mismatch' (no tree named on one side — a plain clone, or an
|
|
599
|
+
// older CLI) is the historical session case.
|
|
600
|
+
if (resolveErr.details.reason === 'worktree_mismatch') {
|
|
601
|
+
console.error(`This claim belongs to a different working tree${wt ? ` (worktree: ${wt})` : ''}.`);
|
|
602
|
+
console.error(`Ship it from there — its branch holds the work: cd .claude/worktrees/${wt || '<name>'}`);
|
|
603
|
+
console.error('Shipping from this tree would publish the wrong branch, which is why it is refused.');
|
|
604
|
+
} else {
|
|
605
|
+
console.error(`This claim was created in a different session${wt ? ` (worktree: ${wt})` : ''}.`);
|
|
606
|
+
console.error('No working tree was named on one side, so the older session check applied.');
|
|
607
|
+
}
|
|
608
|
+
console.error(`If the work is genuinely gone, give the task back: node scripts/bongos/release.js ${taskId} --force`);
|
|
609
|
+
console.error('(--force abandons the claim and forfeits its credits — it is the give-up exit, not the fix.)');
|
|
610
|
+
} else {
|
|
611
|
+
console.error(`resolve failed: ${apiErrorLine(r.data, r.status)}`);
|
|
612
|
+
}
|
|
613
|
+
process.exit(1);
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
const taskStatus = r.data.taskStatus || 'shipped (legacy response)';
|
|
617
|
+
console.log(`Task #${r.data.taskId} is now: ${taskStatus}`);
|
|
618
|
+
// task 1003109: attach the optional visual now the claim has resolved (the upload
|
|
619
|
+
// gate is "the task's last claim holder" — still us). Best-effort: it prints its
|
|
620
|
+
// own warning, and a failed picture never fails a successful ship.
|
|
621
|
+
await shipVisual.upload({ taskId, visual, client: await cliClient(), errorLine: apiErrorLine });
|
|
622
|
+
// Claim CONSUMED, task at 'completed' — a crash from here needs fatalRecoveryLines.
|
|
623
|
+
markShipProgress('resolved', taskId);
|
|
624
|
+
|
|
625
|
+
// ---- Step 2: subagent quality grader ----
|
|
626
|
+
// Runs when local verification passed AND resolveClaim landed at completed.
|
|
627
|
+
// If verification did not pass we don't bother grading — the task stays at
|
|
628
|
+
// completed (or whatever resolveClaim returned) with no credits.
|
|
629
|
+
let credits = r.data.creditsAwarded ?? 0;
|
|
630
|
+
let postGradeStatus = taskStatus;
|
|
631
|
+
let postGradeJustUnlocked = r.data.just_unlocked || [];
|
|
632
|
+
let gradePassed = false;
|
|
633
|
+
let advanceToMerge = false;
|
|
634
|
+
let held = false; // task 1004322: a page tweak's pass, held for its artist (ADR 0341 D7)
|
|
635
|
+
let gradeObj = null; // task 1270: the grade result, hoisted for the completion card
|
|
636
|
+
// V3.R27 (#247): credit breakdown surfaced from the grade or confirm
|
|
637
|
+
// response. Kept separate from `credits` so we only print the multiplier
|
|
638
|
+
// line when the multiplier actually moved the payout.
|
|
639
|
+
let creditsRaw = null;
|
|
640
|
+
let creditsMultiplier = null;
|
|
641
|
+
let ideaBonusInfo = null;
|
|
642
|
+
|
|
643
|
+
if (passed && taskStatus === 'completed' && skipGrade) {
|
|
644
|
+
// Escape hatch: skip the subagent grader and manual-confirm. The
|
|
645
|
+
// task_grades row gets grader_kind='lars' so the audit trail captures
|
|
646
|
+
// that this ship bypassed the v2 grader.
|
|
647
|
+
console.log('');
|
|
648
|
+
console.log('--skip-grade: skipping subagent grader; manual-confirming via POST /tasks/:id/confirm.');
|
|
649
|
+
// task 1053 (F): pass the verify attestation. The server refuses to confirm a
|
|
650
|
+
// kind='verify' task without it (so a hardware-verify can't land before the
|
|
651
|
+
// verify ran). --verified is a no-op for every other kind.
|
|
652
|
+
const confirm = await (await cliClient()).tasks.postTasksIdConfirm({ id: taskId, body: { verified } });
|
|
653
|
+
if (!confirm.ok) {
|
|
654
|
+
if (confirm.status === 409 && normalizeApiError(confirm.data).code === 'verify_attestation_required') {
|
|
655
|
+
console.error('');
|
|
656
|
+
console.error(`This is a VERIFICATION task — it won't confirm until you attest the verify actually passed.`);
|
|
657
|
+
console.error(`Run the verification, then re-ship with --verified:`);
|
|
658
|
+
console.error(` node scripts/bongos/ship.js ${taskId} --verified`);
|
|
659
|
+
console.error(`(Your work is committed and the task is at 'completed' — re-running resumes, task 941.)`);
|
|
660
|
+
process.exit(1);
|
|
661
|
+
}
|
|
662
|
+
// task 1002613 (map P-1): the one genuine permission wall on the ship path
|
|
663
|
+
// used to surface as a raw envelope dump — an atom name is not a rank, and
|
|
664
|
+
// no remedy printed at the one station where self-service exists. Interpret
|
|
665
|
+
// it: name the wall, the floor (from the server's floors map — never
|
|
666
|
+
// hardcoded), and both ways forward.
|
|
667
|
+
const errObj = confirm.data && confirm.data.error;
|
|
668
|
+
const errCode = typeof errObj === 'string' ? errObj : (errObj && errObj.code);
|
|
669
|
+
if (confirm.status === 403 && errCode === 'permission_forbidden') {
|
|
670
|
+
const details = (errObj && typeof errObj === 'object' && errObj.details) || {};
|
|
671
|
+
const floor = details.floors && details.floors['task.confirm.grade_bypass'];
|
|
672
|
+
const floorNote = floor ? ` (floor: ${floor})` : '';
|
|
673
|
+
// task 1003950: these two cases used to print the same advice, and for a
|
|
674
|
+
// no-artifact close that advice was a LOOP — --regrade on an empty diff
|
|
675
|
+
// refuses and points back at --allow-empty, which lands here again. Split
|
|
676
|
+
// them: a rejected-grade bypass still has a real diff and a real remedy
|
|
677
|
+
// (fix the findings, re-grade); an artifact-free close has neither, so it
|
|
678
|
+
// gets the escalation filed for it and terminates.
|
|
679
|
+
if (noArtifactClose) {
|
|
680
|
+
const escalation = await fileNoArtifactEscalation({
|
|
681
|
+
taskId, title: ac.title, floor, summary, notes, builder: (me.data.builder || {}).github_login,
|
|
682
|
+
});
|
|
683
|
+
for (const line of noArtifactRefusalLines({ taskId, floor, escalation })) console.error(line);
|
|
684
|
+
process.exit(1);
|
|
685
|
+
}
|
|
686
|
+
console.error('');
|
|
687
|
+
console.error(`✖ Confirming without a passing grade is permission-gated: task.confirm.grade_bypass${floorNote}.`);
|
|
688
|
+
console.error(' This is an authorization wall, not a verdict on your work.');
|
|
689
|
+
console.error(' Self-service: re-run WITHOUT --skip-grade to use the subagent grader, and if a');
|
|
690
|
+
console.error(' grade fails, fix its findings and re-run (unlimited, no attempt cap):');
|
|
691
|
+
console.error(` node scripts/bongos/ship.js ${taskId} --regrade`);
|
|
692
|
+
console.error(` If the grade genuinely cannot pass, ask a builder whose role holds`);
|
|
693
|
+
console.error(` task.confirm.grade_bypass${floorNote} to POST /api/bongos/tasks/${taskId}/confirm.`);
|
|
694
|
+
process.exit(1);
|
|
695
|
+
}
|
|
696
|
+
console.error(`manual-confirm failed: ${apiErrorLine(confirm.data, confirm.status)}`);
|
|
697
|
+
process.exit(1);
|
|
698
|
+
}
|
|
699
|
+
postGradeStatus = confirm.data.taskStatus;
|
|
700
|
+
credits = confirm.data.creditsAwarded ?? 0;
|
|
701
|
+
ideaBonusInfo = confirm.data.ideaBonus ?? null;
|
|
702
|
+
advanceToMerge = postGradeStatus === 'confirmed';
|
|
703
|
+
gradePassed = true; // by builder fiat, not by grader
|
|
704
|
+
} else if (passed && taskStatus === 'completed') {
|
|
705
|
+
console.log('');
|
|
706
|
+
console.log(noArtifactGrade
|
|
707
|
+
? 'Running the no-artifact grader (subject: your claim that nothing was needed)...'
|
|
708
|
+
: 'Running subagent quality grader...');
|
|
709
|
+
|
|
710
|
+
// #513 + #536: the grader reads COMMITTED history (baseline...HEAD), not
|
|
711
|
+
// the working tree. The empty-committed-diff guard now runs earlier — BEFORE
|
|
712
|
+
// the claim is resolved (see above) — so by the time we reach here the diff
|
|
713
|
+
// is guaranteed non-empty on the grader path, EXCEPT on the task 1004011
|
|
714
|
+
// no-artifact species, where it is guaranteed empty and the notes are the
|
|
715
|
+
// subject instead. Reuse the baseline + file list
|
|
716
|
+
// computed there so we don't diff twice. #678: gradeAndRecord POSTs the
|
|
717
|
+
// result and logs the panel cost — the same unit the --regrade path reuses.
|
|
718
|
+
// task 1002660: the panel computation was started BEFORE the smoke gate
|
|
719
|
+
// (gradeCompute above) — hand it in so this step only waits out whatever
|
|
720
|
+
// panel time smoke + resolve didn't already absorb.
|
|
721
|
+
const gradePost = await gradeAndRecord({
|
|
722
|
+
taskId,
|
|
723
|
+
task: fullTaskForGrade || { id: taskId, title: ac.title },
|
|
724
|
+
summary,
|
|
725
|
+
baseline: graderBaseline,
|
|
726
|
+
committedFiles,
|
|
727
|
+
precomputed: gradeCompute,
|
|
728
|
+
// No `noArtifact` here on purpose: `precomputed` is ALWAYS set on this path, and
|
|
729
|
+
// gradeAndRecord only falls back to computing inline when it is absent. Passing it would be
|
|
730
|
+
// unreachable by construction — defensive symmetry that reads like a live argument. The
|
|
731
|
+
// species reaches the grader through gradeCompute above, which was built with it.
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
if (!gradePost.ok) {
|
|
735
|
+
console.error(`grade POST failed (${gradePost.status}):`, gradePost.data);
|
|
736
|
+
console.error('Task stays at completed. Manual options:');
|
|
737
|
+
console.error(` - Re-run /builder-ship ${taskId} to try grading again, or`);
|
|
738
|
+
console.error(` - node scripts/bongos/ship.js ${taskId} --regrade after fixing findings, or`);
|
|
739
|
+
console.error(` - POST /api/bongos/tasks/${taskId}/confirm to manual-confirm (last resort —`);
|
|
740
|
+
console.error(' permission-gated on task.confirm.grade_bypass).');
|
|
741
|
+
process.exit(1);
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
const g = gradePost.data.grade;
|
|
745
|
+
recordGradeOutcome({ taskId, grade: g });
|
|
746
|
+
gradeObj = g;
|
|
747
|
+
gradePassed = g.passed;
|
|
748
|
+
advanceToMerge = gradePost.data.advanceToMerge;
|
|
749
|
+
held = gradePost.data.held === true;
|
|
750
|
+
postGradeStatus = gradePost.data.taskStatus;
|
|
751
|
+
credits = gradePost.data.creditsAwarded;
|
|
752
|
+
postGradeJustUnlocked = gradePost.data.just_unlocked || [];
|
|
753
|
+
// V3.R27 (#247): pull the multiplier breakdown + idea-bonus info forward.
|
|
754
|
+
creditsRaw = gradePost.data.creditsRaw ?? null;
|
|
755
|
+
creditsMultiplier = gradePost.data.creditsMultiplier ?? null;
|
|
756
|
+
ideaBonusInfo = gradePost.data.ideaBonus ?? null;
|
|
757
|
+
|
|
758
|
+
printGradeOutcome(g, taskId);
|
|
759
|
+
} else if (!passed && taskStatus === 'completed') {
|
|
760
|
+
// task 1002605 (G-18): the --allow-smoke-fail continuation. The resolve above
|
|
761
|
+
// consumed the claim with verification.passed=false, so the grader deliberately
|
|
762
|
+
// does not run. This used to be a silent fall-through; say where the task is.
|
|
763
|
+
console.log('');
|
|
764
|
+
for (const line of smokeGateMessages(taskId).parked) console.log(line);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
printCreditsAndAchievements({
|
|
768
|
+
postGradeStatus, credits, creditsRaw, creditsMultiplier, ideaBonusInfo,
|
|
769
|
+
justUnlocked: postGradeJustUnlocked, held,
|
|
770
|
+
});
|
|
771
|
+
|
|
772
|
+
// ---- Step 3: confirmed→shipped tail (merge + deploy → memory/session sync →
|
|
773
|
+
// Done → onboarding nudge → completion card), shared with regradeMain via
|
|
774
|
+
// finishShip (#1093/C9). ----
|
|
775
|
+
// Graded. If it passed, only the merge remains — a different crash story.
|
|
776
|
+
if (postGradeStatus === 'confirmed' || postGradeStatus === 'shipped') {
|
|
777
|
+
markShipProgress(postGradeStatus === 'shipped' ? 'landed' : 'graded', taskId);
|
|
778
|
+
}
|
|
779
|
+
await finishShip({
|
|
780
|
+
taskId, summary, advanceToMerge, skipMerge, postGradeStatus, doneLine: 'Done.', dbOnly, held,
|
|
781
|
+
// task 1270: data for the deterministic completion card.
|
|
782
|
+
card: {
|
|
783
|
+
title: ac.title,
|
|
784
|
+
valueSummary: summary,
|
|
785
|
+
notes,
|
|
786
|
+
files: committedFiles,
|
|
787
|
+
baseline: graderBaseline,
|
|
788
|
+
creditsAwarded: credits,
|
|
789
|
+
// task 1275: a real grade ran → pass/fail + issues; otherwise (--skip-grade
|
|
790
|
+
// or server-side GRADER_BYPASS) it was confirmed without a grade → skipped,
|
|
791
|
+
// so the card reads "grade skipped" rather than implying a real pass.
|
|
792
|
+
grade: gradeObj
|
|
793
|
+
? { passed: gradeObj.passed, issues: gradeObj.issues || [], panel: Array.isArray(gradeObj.workers) ? gradeObj.workers.length : null, skipped: false }
|
|
794
|
+
: { passed: gradePassed, skipped: true },
|
|
795
|
+
},
|
|
796
|
+
});
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
// persistRegradeSummary — store a re-grade's corrected --summary on the task row
|
|
800
|
+
// (task 1003817). A re-grade has no claim, so it cannot reach claim-resolve, the
|
|
801
|
+
// only writer of tasks.value_summary before this; PATCH /tasks/:id is the route
|
|
802
|
+
// it uses instead.
|
|
803
|
+
//
|
|
804
|
+
// WHY PATCH AND NOT publish-branch, which already RECEIVES value_summary and
|
|
805
|
+
// could have persisted it with a one-line change: publish-branch is only called
|
|
806
|
+
// when pushVia() === 'server'. A laptop land goes through ciLandLocal (gh), and
|
|
807
|
+
// --no-merge / --db-only / --allow-empty never land at all — so persisting there
|
|
808
|
+
// would have fixed one path of four and left the defect standing on the rest. It
|
|
809
|
+
// would also have made publish-branch a SECOND writer racing claim-resolve on
|
|
810
|
+
// the normal ship path, which sends the same field. Writing from here keeps one
|
|
811
|
+
// writer per ship: the claim on a first ship, this on a re-grade.
|
|
812
|
+
//
|
|
813
|
+
// Three deliberate postures:
|
|
814
|
+
// - OMITTED --summary writes NOTHING. The stored value is the fallback the
|
|
815
|
+
// grader was already handed, so a re-grade that omits the flag must leave
|
|
816
|
+
// the row exactly as it was — the COALESCE/NULLIF posture every other
|
|
817
|
+
// value_summary write in db-ship.js keeps. This is acceptance 2.
|
|
818
|
+
// - UNCHANGED text writes nothing either, so a no-op edit mints no audit_log row.
|
|
819
|
+
// - A FAILURE is LOUD BUT NON-BLOCKING. The grade is the expensive step and it
|
|
820
|
+
// has not run yet; discarding a re-grade over a summary that did not persist
|
|
821
|
+
// would trade the cheap problem for the costly one. The builder is told
|
|
822
|
+
// plainly that the row still holds the old sentence, so nothing is silent.
|
|
823
|
+
// An older pinned core that has not learned the field is named as exactly
|
|
824
|
+
// that rather than reported as a generic error — the same forward-compat
|
|
825
|
+
// posture the resolve call in shipMain documents at length (task 1003767),
|
|
826
|
+
// because @cloudbongos/cli ships separately from the core and an instance
|
|
827
|
+
// pins its own core version.
|
|
828
|
+
async function persistRegradeSummary({ taskId, summaryArg, task }) {
|
|
829
|
+
const next = (summaryArg || '').trim();
|
|
830
|
+
if (!next) return { written: false, reason: 'omitted' };
|
|
831
|
+
if (next === (task.value_summary || '').trim()) return { written: false, reason: 'unchanged' };
|
|
832
|
+
let r;
|
|
833
|
+
try {
|
|
834
|
+
r = await (await cliClient()).tasks.patchTasksId({ id: taskId, body: { value_summary: next } });
|
|
835
|
+
} catch (err) {
|
|
836
|
+
console.error(` ⚠ value_summary NOT stored (${err && err.message ? err.message : 'request failed'}) — task #${taskId} keeps its previous summary. The grade below is unaffected.`);
|
|
837
|
+
return { written: false, reason: 'error' };
|
|
838
|
+
}
|
|
839
|
+
if (!r.ok) {
|
|
840
|
+
if (isUnknownFieldRejection(r.status, r.data, 'value_summary')) {
|
|
841
|
+
console.error(` ⚠ value_summary NOT stored: this instance's core predates PATCH /tasks/:id accepting the field. Upgrade the core, or edit the summary in the hall. The grade below is unaffected.`);
|
|
842
|
+
} else {
|
|
843
|
+
console.error(` ⚠ value_summary NOT stored (${apiErrorLine(r.data, r.status)}) — task #${taskId} keeps its previous summary. The grade below is unaffected.`);
|
|
844
|
+
}
|
|
845
|
+
return { written: false, reason: 'refused' };
|
|
846
|
+
}
|
|
847
|
+
console.log(` value_summary updated on task #${taskId} — the hall, /status and the ship broadcast now read the corrected sentence.`);
|
|
848
|
+
return { written: true };
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
// ---------- Re-grade flow (#678) ----------
|
|
852
|
+
//
|
|
853
|
+
// `node scripts/bongos/ship.js <id> --regrade` closes the task-595-regrade-gap
|
|
854
|
+
// (re-hit on #600): when a ship lands at `completed` but the subagent grader
|
|
855
|
+
// fails, /builder-ship has already resolved+consumed the claim, leaving no CLI
|
|
856
|
+
// path back in (claim refuses "not ready", PATCH refuses, promote refuses, a
|
|
857
|
+
// fresh ship.js says "no active claim"). The only escapes were the Archon
|
|
858
|
+
// /confirm override (bypasses the grader — see feedback_prefer_regrade_over_override)
|
|
859
|
+
// or hand-building a grader harness (learning #43).
|
|
860
|
+
//
|
|
861
|
+
// This re-runs ONLY the grade step against the committed diff, with no claim:
|
|
862
|
+
// - eligibility: task at `completed` AND (you last held the claim OR Archon)
|
|
863
|
+
// - preflight: working tree committed + ship/grade tooling current
|
|
864
|
+
// - empty-diff guard: the grader reads committed history, so refuse if empty
|
|
865
|
+
// - grade: gradeAndRecord → POST /tasks/:id/grade (rank-open; applyGrade
|
|
866
|
+
// promotes completed→confirmed + awards credits on pass, idempotent)
|
|
867
|
+
// - on pass: the normal confirmed→shipped merge + sync tail runs.
|
|
868
|
+
|
|
869
|
+
async function regradeMain(opts = {}) {
|
|
870
|
+
await requireSession();
|
|
871
|
+
const args = process.argv.slice(2);
|
|
872
|
+
const taskId = Number(args[0]);
|
|
873
|
+
if (!Number.isFinite(taskId)) {
|
|
874
|
+
console.error('usage: node scripts/bongos/ship.js <task-id> --regrade [--summary-file <path|-> | --summary "..."] [--response-file <path|-> | --response "..."] [--visual <image>] [--visual-alt "caption"] [--no-merge] [--force] [--verified] [--base <ref>]');
|
|
875
|
+
process.exit(2);
|
|
876
|
+
}
|
|
877
|
+
// A passing re-grade runs finishShip, the same land as a fresh ship, so Manual mode asks
|
|
878
|
+
// here too — whether reached by --regrade or by shipMain's resume-grade dispatch (task 1004631).
|
|
879
|
+
if (await stopForManualApproval(args, taskId)) return;
|
|
880
|
+
// task 1003702: refuse --notes rather than swallowing it. The reasoning — why
|
|
881
|
+
// a refusal and not a persist — is in ship-honesty.js above regradeNotesRefusal
|
|
882
|
+
// and is not repeated here. What is load-bearing at THIS call site is the
|
|
883
|
+
// POSITION: before the preflight and before any grade spend, because a refusal
|
|
884
|
+
// that first costs a 4-worker panel run is barely better than the silence it
|
|
885
|
+
// replaces. tests/ship_cannot_lie.mjs pins that order.
|
|
886
|
+
if (proseFlagPresent(args, 'notes')) {
|
|
887
|
+
for (const line of regradeNotesRefusal(taskId)) console.error(line);
|
|
888
|
+
process.exit(2);
|
|
889
|
+
}
|
|
890
|
+
// task 1004665: --visual used to be screened by shipMain and then dropped here
|
|
891
|
+
// without a word — this path returned before shipMain's upload, so visual_url
|
|
892
|
+
// stayed null (task 1004351). Screen it at the same early position as the
|
|
893
|
+
// --notes refusal (bad input costs no grade spend), and attach it on every
|
|
894
|
+
// path below that goes on to grade or land. shipMain's resume-grade dispatch
|
|
895
|
+
// hands over the visual it already screened rather than reading the file twice.
|
|
896
|
+
const visual = opts.visual !== undefined ? opts.visual : shipVisual.fromArgs(args, { regrade: true });
|
|
897
|
+
const attachVisual = async () => (visual
|
|
898
|
+
? shipVisual.upload({ taskId, visual, client: await cliClient(), errorLine: apiErrorLine })
|
|
899
|
+
: false);
|
|
900
|
+
const regradeProse = resolveProse(args, ['summary', 'response']);
|
|
901
|
+
const summaryArg = regradeProse.summary;
|
|
902
|
+
// task 1002662: the builder's response to the prior round's findings — how
|
|
903
|
+
// each was fixed, tracked (a task ref), or why it's out of scope. Rides to
|
|
904
|
+
// the panel fenced, under the delta re-grade policy.
|
|
905
|
+
const responseArg = regradeProse.response;
|
|
906
|
+
const skipMerge = args.includes('--no-merge');
|
|
907
|
+
const force = args.includes('--force');
|
|
908
|
+
// task 1002422: honor --base on regrade/resume too, so `--regrade --base <ref>`
|
|
909
|
+
// and shipMain's resume-grade dispatch grade the real <base>...HEAD diff and
|
|
910
|
+
// advance already-on-main work, instead of aborting "nothing to grade". Same
|
|
911
|
+
// 0-ahead security guard as shipMain (applyBaseOverride is the shared gate).
|
|
912
|
+
const baseRefRaw = arg('--base', args);
|
|
913
|
+
const dbOnly = args.includes('--db-only') || args.includes('--allow-empty') || Boolean(baseRefRaw); // task 391 — honor --db-only on a regrade too
|
|
914
|
+
const verified = args.includes('--verified'); // task 1053 (F) — see gate below
|
|
915
|
+
|
|
916
|
+
if (baseRefRaw) {
|
|
917
|
+
const res = applyBaseOverride(baseRefRaw);
|
|
918
|
+
if (!res.ok) {
|
|
919
|
+
console.error(`Regrade aborted: ${res.reason}. Omit --base and re-grade normally.`);
|
|
920
|
+
process.exit(2);
|
|
921
|
+
}
|
|
922
|
+
console.log(`--base: re-grading ${res.sha.slice(0, 9)}...HEAD (work already on main).`);
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
// ---- Eligibility: completed + (owner | archon) ----
|
|
926
|
+
const me = noteServerReward(await (await cliClient()).me.getMe());
|
|
927
|
+
if (!me.ok) {
|
|
928
|
+
console.error('failed to load profile:', me.data);
|
|
929
|
+
process.exit(1);
|
|
930
|
+
}
|
|
931
|
+
const builder = me.data.builder || {};
|
|
932
|
+
// ?include=grade,last_claim — the claim-holder lookup for eligibility (#678)
|
|
933
|
+
// + the stored grade row for the delta-aware prior-round payload (task 1002662).
|
|
934
|
+
const tRes = await (await cliClient()).tasks.getTasksId({ id: taskId, query: { include: 'grade,last_claim' } });
|
|
935
|
+
if (!tRes.ok) {
|
|
936
|
+
if (tRes.status === 404) {
|
|
937
|
+
console.error(`Task #${taskId} not found.`);
|
|
938
|
+
} else {
|
|
939
|
+
console.error(`failed to load task #${taskId} (${tRes.status}):`, tRes.data);
|
|
940
|
+
}
|
|
941
|
+
process.exit(1);
|
|
942
|
+
}
|
|
943
|
+
const task = tRes.data.task;
|
|
944
|
+
const lastClaim = tRes.data.last_claim || null;
|
|
945
|
+
// pushVia() decides whether /merge-mode is even runnable here (task 1003221).
|
|
946
|
+
const elig = evaluateRegradeEligibility({ task, lastClaim, builder, pushMode: pushVia() });
|
|
947
|
+
if (!elig.ok) {
|
|
948
|
+
console.error(elig.reason);
|
|
949
|
+
process.exit(1);
|
|
950
|
+
}
|
|
951
|
+
// task 1053 (F): the resume/regrade path promotes completed→confirmed via the
|
|
952
|
+
// grade (applyGrade), which the server-side /confirm verify guard does NOT
|
|
953
|
+
// cover. Gate it here so a verification task can't be confirmed by simply
|
|
954
|
+
// re-running without attesting the verify passed (closing the bypass).
|
|
955
|
+
if (task.kind === 'verify' && !verified) {
|
|
956
|
+
console.error('');
|
|
957
|
+
console.error(`Task #${taskId} is a VERIFICATION task — it won't confirm until you attest the verify actually passed.`);
|
|
958
|
+
console.error(`Run the verification, then re-run with --verified:`);
|
|
959
|
+
console.error(` node scripts/bongos/ship.js ${taskId} --verified`);
|
|
960
|
+
process.exit(1);
|
|
961
|
+
}
|
|
962
|
+
// task 1004322 (ADR 0341 D7): a page tweak already HELD for its artist has a
|
|
963
|
+
// passed grade. A plain re-run lands here (completed -> resume-grade), and
|
|
964
|
+
// re-grading would spend the panel again for the verdict it already has, so it
|
|
965
|
+
// only re-publishes the branch (the recovery for a publish that failed).
|
|
966
|
+
if (tweakHold.isHeldForArtist(task, tRes.data.grade ? tRes.data.grade.passed : null)) {
|
|
967
|
+
console.log(`Task #${taskId} already passed its grade and is waiting for the artist: re-publishing its branch, not re-grading.`);
|
|
968
|
+
await attachVisual();
|
|
969
|
+
await finishShip({
|
|
970
|
+
taskId, summary: summaryArg || task.value_summary || '', held: true, postGradeStatus: 'completed', doneLine: 'Done.',
|
|
971
|
+
card: { title: task.title, valueSummary: summaryArg || task.value_summary || '', notes: '' },
|
|
972
|
+
});
|
|
973
|
+
return;
|
|
974
|
+
}
|
|
975
|
+
console.log(`Re-grading task #${taskId}: ${task.title}`);
|
|
976
|
+
console.log(` eligibility: ${elig.reason} (${elig.via})`);
|
|
977
|
+
|
|
978
|
+
// A grade-failed ship never reached the merge/broadcast step, so a passing
|
|
979
|
+
// re-grade is the FIRST time this task actually ships. Fall back to the
|
|
980
|
+
// task's stored value_summary so the merge commit + Discord #ship-news post
|
|
981
|
+
// carry meaningful text even when --summary is omitted.
|
|
982
|
+
//
|
|
983
|
+
// AND IT NOW REACHES THE TASK ROW TOO — task 1003817. It did not before: this
|
|
984
|
+
// `summary` fed the grader prompt, the merge commit message and the PR
|
|
985
|
+
// title/body and stopped there, so a builder who re-graded with a CORRECTED
|
|
986
|
+
// --summary saw it applied everywhere except the place that is the record —
|
|
987
|
+
// the hall, /status and the Discord #ship-news line all kept the first ship's
|
|
988
|
+
// sentence forever. persistRegradeSummary (below the preflight) is the write;
|
|
989
|
+
// PATCH /tasks/:id is the route it uses, and `value_summary` was added to that
|
|
990
|
+
// schema by this same task. tests/ship_cannot_lie.mjs pins the wiring.
|
|
991
|
+
const summary = summaryArg || task.value_summary || '';
|
|
992
|
+
// task 1003693: the fallback above is silent, and on a re-grade silence means
|
|
993
|
+
// re-publishing the failed attempt's sentence. Say so while it can still be
|
|
994
|
+
// corrected — see staleSummaryNotice for the incident this comes from.
|
|
995
|
+
if (!summaryArg) {
|
|
996
|
+
for (const line of staleSummaryNotice(taskId, task.value_summary)) console.log(line);
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
// The grader helpers want a claim-like object for touches[] (preflight's
|
|
1000
|
+
// working-tree-drift check) and head_sha (baseline fallback). The claim is
|
|
1001
|
+
// gone, so synthesize one from the task row + the last claim's head_sha.
|
|
1002
|
+
const claimLike = { touches: task.touches || [], head_sha: lastClaim?.head_sha ?? null, task_id: taskId, title: task.title };
|
|
1003
|
+
|
|
1004
|
+
// ---- Preflight: work committed + ship/grade tooling current ----
|
|
1005
|
+
// No scanner/smoke re-run — --regrade re-runs ONLY the grade step. But the
|
|
1006
|
+
// grader judges COMMITTED history, so uncommitted fixes on touches[] files
|
|
1007
|
+
// wouldn't be graded — refuse that (it would grade a stale diff). Also refuse
|
|
1008
|
+
// if the local ship/grade tooling is behind main (a stale grader silently
|
|
1009
|
+
// fails the same way — the #662 lesson). --force overrides the freshness leg.
|
|
1010
|
+
console.log('Preflight (working tree + branch freshness)...');
|
|
1011
|
+
const pre = preflight(claimLike, { force, inputFiles: shipInputPaths(args) });
|
|
1012
|
+
if (!pre.ok) {
|
|
1013
|
+
console.error('');
|
|
1014
|
+
console.error(`Re-grade aborted: ${pre.reason}. Task stays at completed.`);
|
|
1015
|
+
process.exit(1);
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
// ---- Empty-diff guard (the grader reads committed history) ----
|
|
1019
|
+
const graderBaseline = computeGraderBaseline(claimLike);
|
|
1020
|
+
const committedFiles = computeChangedFiles(graderBaseline);
|
|
1021
|
+
if (committedFiles.length === 0) {
|
|
1022
|
+
// task 1003147: a DELIBERATELY artifact-free task used to dead-end here.
|
|
1023
|
+
// shipMain routes every 'completed' task to this re-grade BEFORE reading any
|
|
1024
|
+
// flag (evaluateResumeAction takes none), so --allow-empty / --skip-grade never
|
|
1025
|
+
// reached the manual-confirm path that a no-artifact task actually needs — and
|
|
1026
|
+
// that path is unreachable from 'completed' any other way. Hit for real on task
|
|
1027
|
+
// 1003146: a kind=verify task landed at 'completed' with no grade row, and
|
|
1028
|
+
// --allow-empty, --skip-grade and --verified all bailed on this same line.
|
|
1029
|
+
//
|
|
1030
|
+
// BOTH conditions are required, and the diff emptiness is MEASURED, not taken
|
|
1031
|
+
// on the builder's word. A flag alone must not reach confirm: a task with a
|
|
1032
|
+
// real diff whose grade failed would then bypass the grader by passing
|
|
1033
|
+
// --allow-empty, which is a quality hole, not a fix. Here the grader has
|
|
1034
|
+
// nothing to read, so there is no verdict to dodge. Confirming is additionally
|
|
1035
|
+
// permission-gated server-side on task.confirm.grade_bypass, so this widens
|
|
1036
|
+
// no authority — it only stops the ONE shape that had no exit at all.
|
|
1037
|
+
// task 1003944: the porcelain is MEASURED here and handed to the decision, so a
|
|
1038
|
+
// re-grade weighs the same evidence a first ship does. Without it the guard saw
|
|
1039
|
+
// only the flag and the (empty) committed diff, and an UNTRACKED deliverable —
|
|
1040
|
+
// invisible to preflight's trackedDirty — confirmed straight through to shipped.
|
|
1041
|
+
const emptyShip = shouldConfirmWithoutGrade({
|
|
1042
|
+
committedFileCount: committedFiles.length,
|
|
1043
|
+
porcelain: gitOk('git status --porcelain'),
|
|
1044
|
+
args,
|
|
1045
|
+
});
|
|
1046
|
+
if (emptyShip.confirm) {
|
|
1047
|
+
console.log('');
|
|
1048
|
+
console.log(`Nothing to grade (the committed diff vs ${graderBaseline || 'baseline'} is empty) and this ship`);
|
|
1049
|
+
console.log('declares itself artifact-free — manual-confirming via POST /tasks/:id/confirm.');
|
|
1050
|
+
await attachVisual();
|
|
1051
|
+
// A kind='verify' task cannot reach here without --verified: the gate above
|
|
1052
|
+
// exits first, so the server's verify_attestation_required can't fire below.
|
|
1053
|
+
const confirm = await (await cliClient()).tasks.postTasksIdConfirm({ id: taskId, body: { verified } });
|
|
1054
|
+
if (!confirm.ok) {
|
|
1055
|
+
const errObj = confirm.data && confirm.data.error;
|
|
1056
|
+
const errCode = typeof errObj === 'string' ? errObj : (errObj && errObj.code);
|
|
1057
|
+
if (confirm.status === 403 && errCode === 'permission_forbidden') {
|
|
1058
|
+
const details = (errObj && typeof errObj === 'object' && errObj.details) || {};
|
|
1059
|
+
const floor = details.floors && details.floors['task.confirm.grade_bypass'];
|
|
1060
|
+
// task 1003950: this branch is reached ONLY via shouldConfirmWithoutGrade,
|
|
1061
|
+
// which requires both an empty committed diff and an explicit --allow-empty —
|
|
1062
|
+
// so it is always a no-artifact close, and never a bypass of a failing grade.
|
|
1063
|
+
// It used to end at "ask a builder whose role holds it", which is the exact
|
|
1064
|
+
// dead end the bug names: a builder who knows no archon had nowhere to go.
|
|
1065
|
+
const escalation = await fileNoArtifactEscalation({
|
|
1066
|
+
// no `notes` on this path by design: regradeMain REFUSES --notes (see
|
|
1067
|
+
// proseFlagPresent above), so the summary is the only reason the builder gave.
|
|
1068
|
+
taskId, title: task && task.title, floor, summary, builder: builder.github_login,
|
|
1069
|
+
});
|
|
1070
|
+
for (const line of noArtifactRefusalLines({ taskId, floor, escalation })) console.error(line);
|
|
1071
|
+
process.exit(1);
|
|
1072
|
+
}
|
|
1073
|
+
console.error(`manual-confirm failed: ${apiErrorLine(confirm.data, confirm.status)}`);
|
|
1074
|
+
process.exit(1);
|
|
1075
|
+
}
|
|
1076
|
+
const confirmedStatus = confirm.data.taskStatus;
|
|
1077
|
+
printCreditsAndAchievements({
|
|
1078
|
+
postGradeStatus: confirmedStatus,
|
|
1079
|
+
credits: confirm.data.creditsAwarded ?? 0,
|
|
1080
|
+
creditsRaw: null,
|
|
1081
|
+
creditsMultiplier: null,
|
|
1082
|
+
ideaBonusInfo: confirm.data.ideaBonus ?? null,
|
|
1083
|
+
justUnlocked: confirm.data.just_unlocked || [],
|
|
1084
|
+
});
|
|
1085
|
+
// The same confirmed→shipped tail a normal ship runs, so a no-artifact resume
|
|
1086
|
+
// lands identically instead of stopping one step short.
|
|
1087
|
+
await finishShip({
|
|
1088
|
+
taskId, summary, advanceToMerge: confirmedStatus === 'confirmed', skipMerge, dbOnly: true,
|
|
1089
|
+
postGradeStatus: confirmedStatus,
|
|
1090
|
+
doneLine: 'Done — confirmed with no artifact (grader had nothing to read).',
|
|
1091
|
+
card: { title: task.title, valueSummary: summary, notes: '' },
|
|
1092
|
+
});
|
|
1093
|
+
return;
|
|
1094
|
+
}
|
|
1095
|
+
// task 1003944: the two refusals are DIFFERENT advice. 'uncommitted-work' means
|
|
1096
|
+
// the deliverable exists and was never committed — offering --allow-empty there
|
|
1097
|
+
// would be telling the builder to assert the opposite of what the tree shows,
|
|
1098
|
+
// which is how task 1363 shipped nothing and called it done. Only the genuinely
|
|
1099
|
+
// clean tree gets pointed at the flag.
|
|
1100
|
+
if (emptyShip.reason === 'uncommitted-work') {
|
|
1101
|
+
console.error('Nothing to grade: nothing is committed on this branch, but your working tree has uncommitted changes:');
|
|
1102
|
+
for (const f of emptyShip.uncommitted) console.error(` - ${f}`);
|
|
1103
|
+
console.error('');
|
|
1104
|
+
console.error('Your work was never committed — confirming now would mark the task "shipped" with NO artifact on main (the ledger would lie).');
|
|
1105
|
+
console.error('Stage + commit your work (e.g. `git add -A && git commit`), then re-run --regrade.');
|
|
1106
|
+
process.exit(1);
|
|
1107
|
+
}
|
|
1108
|
+
console.error(`Nothing to grade: the committed diff vs ${graderBaseline || 'baseline'} is empty.`);
|
|
1109
|
+
console.error('The grader reads committed history, not the working tree — commit your fixes on this branch, then re-run --regrade.');
|
|
1110
|
+
console.error('If this task is DELIBERATELY artifact-free (a DB-only close, an ops verification), say so:');
|
|
1111
|
+
console.error(` node scripts/bongos/ship.js ${taskId} --allow-empty`);
|
|
1112
|
+
process.exit(1);
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
// ---- Persist a corrected --summary to the task row (task 1003817) ----
|
|
1116
|
+
// Placed HERE deliberately: after the guards that can still abort the re-grade
|
|
1117
|
+
// (so a refused run writes nothing), and BEFORE the grade — which is the order
|
|
1118
|
+
// the normal ship already has, where claim-resolve stores value_summary and
|
|
1119
|
+
// the panel runs afterwards. The row, the grader prompt, the merge commit and
|
|
1120
|
+
// the PR then all carry the same sentence.
|
|
1121
|
+
await persistRegradeSummary({ taskId, summaryArg, task });
|
|
1122
|
+
// task 1004665: the picture goes up at the same point and for the same reason
|
|
1123
|
+
// as the summary — after every guard that can still refuse, before the panel.
|
|
1124
|
+
await attachVisual();
|
|
1125
|
+
|
|
1126
|
+
// ---- Delta-aware prior-round context (task 1002662) ----
|
|
1127
|
+
// The prior grade's findings + the builder's response + the interim fix diff
|
|
1128
|
+
// ride to the panel so an already-answered finding can't re-veto on
|
|
1129
|
+
// re-wording alone. The interim range comes from the prior grade's
|
|
1130
|
+
// signals.graded_head_sha (recorded by runSubagentGrader since this task);
|
|
1131
|
+
// older grade rows lack it — the findings still ride, just without the diff.
|
|
1132
|
+
const storedGradeRow = tRes.data.grade ?? null;
|
|
1133
|
+
let interimCommits = '';
|
|
1134
|
+
let interimDiffStat = '';
|
|
1135
|
+
const priorSha = storedGradeRow?.signals?.graded_head_sha;
|
|
1136
|
+
// The sha comes from a DB JSONB blob — validate the shape before shelling out.
|
|
1137
|
+
if (typeof priorSha === 'string' && /^[0-9a-f]{7,40}$/i.test(priorSha) && gitOk(`git rev-parse --verify --quiet ${priorSha}`)) {
|
|
1138
|
+
interimCommits = gitOk(`git log --oneline ${priorSha}..HEAD`) || '';
|
|
1139
|
+
interimDiffStat = gitOk(`git diff --stat ${priorSha}..HEAD`) || '';
|
|
1140
|
+
}
|
|
1141
|
+
const priorRound = buildPriorRoundContext({
|
|
1142
|
+
storedGrade: storedGradeRow,
|
|
1143
|
+
responseText: responseArg,
|
|
1144
|
+
interimCommits,
|
|
1145
|
+
interimDiffStat,
|
|
1146
|
+
});
|
|
1147
|
+
if (priorRound) {
|
|
1148
|
+
console.log(` prior round context: ${priorRound.audit.prior_findings_count} finding(s) from the prior grade${priorRound.audit.response_present ? ' + builder response' : ''}${priorRound.audit.interim_present ? ' + interim fix diff' : ''} → round ${priorRound.audit.round}`);
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
// ---- Grade step (the only step) ----
|
|
1152
|
+
console.log('');
|
|
1153
|
+
console.log('Running subagent quality grader...');
|
|
1154
|
+
const gradePost = await gradeAndRecord({
|
|
1155
|
+
taskId,
|
|
1156
|
+
task,
|
|
1157
|
+
summary,
|
|
1158
|
+
baseline: graderBaseline,
|
|
1159
|
+
committedFiles,
|
|
1160
|
+
priorRound,
|
|
1161
|
+
});
|
|
1162
|
+
if (!gradePost.ok) {
|
|
1163
|
+
console.error(`grade POST failed (${gradePost.status}):`, gradePost.data);
|
|
1164
|
+
console.error('Task stays at completed. Fix the issue and re-run --regrade (unlimited, no attempt cap).');
|
|
1165
|
+
console.error('(POST /confirm is a last resort — it is permission-gated on task.confirm.grade_bypass.)');
|
|
1166
|
+
process.exit(1);
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
const g = gradePost.data.grade;
|
|
1170
|
+
recordGradeOutcome({ taskId, grade: g });
|
|
1171
|
+
const postGradeStatus = gradePost.data.taskStatus;
|
|
1172
|
+
const held = gradePost.data.held === true; // task 1004322: a page tweak's pass waits for its artist
|
|
1173
|
+
printGradeOutcome(g, taskId);
|
|
1174
|
+
printCreditsAndAchievements({
|
|
1175
|
+
postGradeStatus,
|
|
1176
|
+
credits: gradePost.data.creditsAwarded,
|
|
1177
|
+
creditsRaw: gradePost.data.creditsRaw ?? null,
|
|
1178
|
+
creditsMultiplier: gradePost.data.creditsMultiplier ?? null,
|
|
1179
|
+
ideaBonusInfo: gradePost.data.ideaBonus ?? null,
|
|
1180
|
+
justUnlocked: gradePost.data.just_unlocked || [],
|
|
1181
|
+
held, // task 1004379: a held pass is not 'grade not passed'
|
|
1182
|
+
});
|
|
1183
|
+
|
|
1184
|
+
// On a pass the task is now confirmed — run the SAME confirmed→shipped tail as a
|
|
1185
|
+
// normal ship (finishShip, #1093/C9) so a re-grade lands identically.
|
|
1186
|
+
await finishShip({
|
|
1187
|
+
taskId, summary, advanceToMerge: gradePost.data.advanceToMerge, skipMerge, dbOnly,
|
|
1188
|
+
held,
|
|
1189
|
+
postGradeStatus,
|
|
1190
|
+
doneLine: g.passed ? 'Done — re-grade passed.' : 'Done — re-grade still failing; fix and try again.',
|
|
1191
|
+
// task 1270: completion card for the re-grade path too.
|
|
1192
|
+
card: {
|
|
1193
|
+
title: task.title,
|
|
1194
|
+
valueSummary: summary,
|
|
1195
|
+
// Empty by design, not by omission (task 1003702). A re-grade takes no
|
|
1196
|
+
// --notes at all now — it is refused above — so there are none from THIS
|
|
1197
|
+
// round to show. The first ship's notes are the durable record and live on
|
|
1198
|
+
// the resolved claim; re-printing them here would suggest this round
|
|
1199
|
+
// produced them.
|
|
1200
|
+
notes: '',
|
|
1201
|
+
files: committedFiles,
|
|
1202
|
+
baseline: graderBaseline,
|
|
1203
|
+
creditsAwarded: gradePost.data.creditsAwarded,
|
|
1204
|
+
grade: { passed: g.passed, issues: g.issues || [], panel: Array.isArray(g.workers) ? g.workers.length : null },
|
|
1205
|
+
},
|
|
1206
|
+
});
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
// Pure helpers are exported for unit tests (tests/session_records.mjs). The
|
|
1210
|
+
// orchestration only runs when ship.js is invoked directly — so `require()`ing
|
|
1211
|
+
// this module (a test) does NOT kick off a ship. (uploadSessionOnShip is not
|
|
1212
|
+
// exported: it does I/O + network and is covered by the live smoke at ship.)
|
|
1213
|
+
|
|
1214
|
+
module.exports = {
|
|
1215
|
+
regradeMain,
|
|
1216
|
+
shipMain,
|
|
1217
|
+
};
|