@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { lane_ledger, type LedgerEntry, type RoundTwoEntry } from './lane-ledger'
|
|
2
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
3
|
+
|
|
4
|
+
// Why round 2 ran or was skipped: the ledger's `round-two` entries of one period reduced to one row per
|
|
5
|
+
// verdict and reason code, printed by `josh lane:stats` so the next change — to the procedure, or to
|
|
6
|
+
// what counts as an inert fix — is chosen from counts rather than impressions (joshuafolkken/kit#4064).
|
|
7
|
+
|
|
8
|
+
const COLUMNS = ['round 2', 'code', 'decisions'] as const
|
|
9
|
+
const KEY_SEPARATOR = ' '
|
|
10
|
+
// A period with no decision: the table still prints, so a reader sees zero rather than no table.
|
|
11
|
+
const NONE_ROW = ['none', 'none', '0']
|
|
12
|
+
|
|
13
|
+
function is_round_two(entry: LedgerEntry): entry is RoundTwoEntry {
|
|
14
|
+
return entry.kind === lane_ledger.KIND.ROUND_TWO
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function counts_of(decisions: ReadonlyArray<RoundTwoEntry>): Map<string, number> {
|
|
18
|
+
const counts = new Map<string, number>()
|
|
19
|
+
|
|
20
|
+
for (const decision of decisions) {
|
|
21
|
+
const key = `${decision.verdict}${KEY_SEPARATOR}${decision.code}`
|
|
22
|
+
|
|
23
|
+
counts.set(key, (counts.get(key) ?? 0) + 1)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return counts
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// The most frequent pair first, so the reason worth acting on leads.
|
|
30
|
+
function rows_of(counts: ReadonlyMap<string, number>): Array<string> {
|
|
31
|
+
return [...counts]
|
|
32
|
+
.toSorted(([, left], [, right]) => right - left)
|
|
33
|
+
.map(([key, count]) => lane_stats.to_row([...key.split(KEY_SEPARATOR), String(count)]))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The period's table: `entries` is the whole ledger, filtered here to `window`.
|
|
37
|
+
function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
|
|
38
|
+
const rows = rows_of(counts_of(lane_stats.in_window(entries, window).filter(is_round_two)))
|
|
39
|
+
|
|
40
|
+
return [
|
|
41
|
+
lane_stats.to_row(COLUMNS),
|
|
42
|
+
lane_stats.to_row(COLUMNS.map(() => '---')),
|
|
43
|
+
...(rows.length === 0 ? [lane_stats.to_row(NONE_ROW)] : rows),
|
|
44
|
+
].join('\n')
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const lane_round_two_stats = { table }
|
|
48
|
+
|
|
49
|
+
export { lane_round_two_stats }
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { lane_ledger_write } from './lane-ledger-write'
|
|
2
2
|
import { lane_load } from './lane-load'
|
|
3
|
+
import type { LaneSpan } from './lane-net-time'
|
|
4
|
+
import { lane_sleep } from './lane-sleep'
|
|
3
5
|
|
|
4
6
|
// The machine-load sampler: one `load` entry appended to the lane ledger, once or on a timer.
|
|
5
7
|
//
|
|
@@ -14,13 +16,18 @@ const SAMPLE_INTERVAL_MS = 60_000
|
|
|
14
16
|
// Where the ledger is and what "now" is, overridable so a test reads a fixed ledger at a fixed instant.
|
|
15
17
|
interface MeasureContext {
|
|
16
18
|
ledger_path?: string
|
|
19
|
+
// The run's event stream `lane:stats` reads parks from and a sleep is recorded on; absent, the
|
|
20
|
+
// repository's own.
|
|
21
|
+
events_path?: string
|
|
22
|
+
// The lane transcript directories `lane:stats` reads tool calls from; absent, this repository's lanes'.
|
|
23
|
+
transcript_directories?: ReadonlyArray<string>
|
|
17
24
|
now_ms?: number
|
|
18
25
|
}
|
|
19
26
|
|
|
20
27
|
async function take(context: MeasureContext = {}): Promise<void> {
|
|
21
28
|
const at = new Date(context.now_ms ?? Date.now()).toISOString()
|
|
22
29
|
|
|
23
|
-
await
|
|
30
|
+
await lane_ledger_write.record(await lane_load.sample(at), context.ledger_path)
|
|
24
31
|
}
|
|
25
32
|
|
|
26
33
|
// A timer tick has no caller to raise into, and a sample that could not be read must never end the run
|
|
@@ -33,10 +40,26 @@ async function take_quietly(context: MeasureContext): Promise<void> {
|
|
|
33
40
|
}
|
|
34
41
|
}
|
|
35
42
|
|
|
36
|
-
|
|
43
|
+
// A sleep that could not be recorded is a gap in the measurement, the same as an unread sample.
|
|
44
|
+
async function record_quietly(span: LaneSpan, context: MeasureContext): Promise<void> {
|
|
45
|
+
try {
|
|
46
|
+
await lane_sleep.record(span, context.events_path)
|
|
47
|
+
} catch {
|
|
48
|
+
// Best-effort: an unrecorded sleep counts as lane time, never as a failure of the run.
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Sample now and then every minute, recording a tick the host slept through; the returned function stops it. */
|
|
37
53
|
function start(context: MeasureContext = {}): () => void {
|
|
54
|
+
let last_ms = Date.now()
|
|
55
|
+
|
|
38
56
|
void take_quietly(context)
|
|
39
57
|
const timer = setInterval(() => {
|
|
58
|
+
const now_ms = Date.now()
|
|
59
|
+
const slept = lane_sleep.gap_of(last_ms, now_ms, SAMPLE_INTERVAL_MS)
|
|
60
|
+
|
|
61
|
+
last_ms = now_ms
|
|
62
|
+
if (slept !== undefined) void record_quietly(slept, context)
|
|
40
63
|
void take_quietly(context)
|
|
41
64
|
}, SAMPLE_INTERVAL_MS).unref()
|
|
42
65
|
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
1
3
|
import { agent_argv } from '#scripts/agent/agent-argv'
|
|
2
4
|
import { agent_role_profile, type AgentProvider } from '#scripts/agent/agent-role-profile'
|
|
5
|
+
import { api_auth } from '#scripts/agent/api-auth'
|
|
6
|
+
import { distributed_paths } from '#scripts/init/distributed-paths'
|
|
3
7
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
4
8
|
import { error_text } from '#scripts/lib/error-message'
|
|
9
|
+
import { review_attest, type ReviewSlot } from '#scripts/review/review-attest'
|
|
5
10
|
import { detached_launch, type AttachedLaunchResult } from '#scripts/run/detached-launch'
|
|
6
11
|
import { run_ship_review } from '#scripts/run/ship/run-ship-review'
|
|
7
12
|
import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
|
|
13
|
+
import { run_ship_stop_cause } from '#scripts/run/ship/run-ship-stop-cause'
|
|
8
14
|
import { run_ship_stop_context } from '#scripts/run/ship/run-ship-stop-context'
|
|
9
15
|
import { z } from 'zod'
|
|
10
16
|
import { lane_child_invocation, type ShipStop } from './lane-child-invocation'
|
|
@@ -14,13 +20,14 @@ import type { LaneInfo } from './lane-registry'
|
|
|
14
20
|
import { lane_relaunch } from './lane-relaunch'
|
|
15
21
|
|
|
16
22
|
// The actions a lane's session broker performs for the ship that asked (`lane-session-broker.ts`):
|
|
17
|
-
// starting the round-1 or round-2 reviewer, or relaunching the lane's child after a stopped ship.
|
|
23
|
+
// starting the round-1 reviewers or the round-2 reviewer, or relaunching the lane's child after a stopped ship.
|
|
18
24
|
// **A failure names its reason**: a bare `false` left every relaunch a stale supervisor refused
|
|
19
25
|
// unexplained in the ship log (joshuafolkken/kit#3974).
|
|
20
26
|
|
|
21
27
|
const BRIEF_PREFIX = 'josh-ship-review-brief-'
|
|
22
28
|
const FINDINGS_PREFIX = 'josh-ship-review-findings-'
|
|
23
29
|
const LOG_PREFIX = 'josh-ship-review-log-'
|
|
30
|
+
const SUBMIT_SCRIPT = 'scripts/review/review-submit-cli.ts'
|
|
24
31
|
const ANTHROPIC_PROVIDER: AgentProvider = 'anthropic'
|
|
25
32
|
const stop_schema = z
|
|
26
33
|
.object({
|
|
@@ -28,16 +35,45 @@ const stop_schema = z
|
|
|
28
35
|
title: z.string(),
|
|
29
36
|
flags: z.array(z.string()).readonly(),
|
|
30
37
|
is_review: z.boolean(),
|
|
38
|
+
unpinned_ok: z.array(z.string()).readonly().exactOptional(),
|
|
31
39
|
conflicts: z.array(z.string()).readonly().default([]),
|
|
40
|
+
cause: z.enum(run_ship_stop_cause.CAUSE).exactOptional(),
|
|
41
|
+
is_review_stale: z.boolean().exactOptional(),
|
|
32
42
|
context: run_ship_stop_context.stop_context_schema.exactOptional(),
|
|
33
43
|
})
|
|
34
44
|
.strict()
|
|
45
|
+
// `slots` is omitted for `/code-review` alone, so a supervisor still on the code before it reads the
|
|
46
|
+
// request as before; it names the reviews a ship runs side by side (joshuafolkken/kit#4672).
|
|
47
|
+
const slots_schema = z.array(z.enum(review_attest.REVIEW_SLOTS)).readonly()
|
|
35
48
|
const action_schema = z.discriminatedUnion('kind', [
|
|
36
|
-
z
|
|
49
|
+
z
|
|
50
|
+
.object({
|
|
51
|
+
kind: z.literal('review'),
|
|
52
|
+
round: z.enum(['1', '2']),
|
|
53
|
+
slots: slots_schema.exactOptional(),
|
|
54
|
+
})
|
|
55
|
+
.strict(),
|
|
37
56
|
z.object({ kind: z.literal('relaunch'), stop: stop_schema }).strict(),
|
|
38
57
|
])
|
|
58
|
+
const request_schema = z
|
|
59
|
+
.object({ session: z.uuid(), nonce: z.uuid(), action: action_schema })
|
|
60
|
+
.strict()
|
|
39
61
|
type ReviewRound = Extract<z.infer<typeof action_schema>, { kind: 'review' }>['round']
|
|
40
|
-
|
|
62
|
+
|
|
63
|
+
interface ReviewAction {
|
|
64
|
+
kind: 'review'
|
|
65
|
+
round: ReviewRound
|
|
66
|
+
slots?: ReadonlyArray<ReviewSlot>
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
type BrokerAction = ReviewAction | { kind: 'relaunch'; stop: ShipStop }
|
|
70
|
+
|
|
71
|
+
interface ReviewPaths {
|
|
72
|
+
brief: string
|
|
73
|
+
findings: string
|
|
74
|
+
log: string
|
|
75
|
+
}
|
|
76
|
+
|
|
41
77
|
type BrokerAnswer = { is_success: true } | { is_success: false; reason: string }
|
|
42
78
|
|
|
43
79
|
const SUCCESS: BrokerAnswer = { is_success: true }
|
|
@@ -46,11 +82,18 @@ function failure(reason: string): BrokerAnswer {
|
|
|
46
82
|
return { is_success: false, reason }
|
|
47
83
|
}
|
|
48
84
|
|
|
49
|
-
|
|
85
|
+
// **Each review slot has its own files**: `/code-review` and the interaction review run side by side
|
|
86
|
+
// (joshuafolkken/kit#4672), so neither overwrites the other's brief, findings or log.
|
|
87
|
+
function review_paths(
|
|
88
|
+
directory: string,
|
|
89
|
+
slot: ReviewSlot = review_attest.REVIEW_SLOT.CODE,
|
|
90
|
+
): ReviewPaths {
|
|
91
|
+
const prefix = slot === review_attest.REVIEW_SLOT.CODE ? '' : 'interaction-'
|
|
92
|
+
|
|
50
93
|
return {
|
|
51
|
-
brief: stamp_file.stamp_path(BRIEF_PREFIX
|
|
52
|
-
findings: stamp_file.stamp_path(FINDINGS_PREFIX
|
|
53
|
-
log: stamp_file.stamp_path(LOG_PREFIX
|
|
94
|
+
brief: stamp_file.stamp_path(`${BRIEF_PREFIX}${prefix}`, directory, '.md'),
|
|
95
|
+
findings: stamp_file.stamp_path(`${FINDINGS_PREFIX}${prefix}`, directory, '.txt'),
|
|
96
|
+
log: stamp_file.stamp_path(`${LOG_PREFIX}${prefix}`, directory, '.log'),
|
|
54
97
|
}
|
|
55
98
|
}
|
|
56
99
|
|
|
@@ -65,33 +108,62 @@ function provider_of(lane: LaneInfo): AgentProvider {
|
|
|
65
108
|
// read as the `backlogrun` parent by every hook. **Its prompt ends with the review invocation**, so the
|
|
66
109
|
// lane's liveness read and the park's reap find it as they find the child (joshuafolkken/kit#3878).
|
|
67
110
|
|
|
68
|
-
function
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
111
|
+
function action_slots(action: ReviewAction): ReadonlyArray<ReviewSlot> {
|
|
112
|
+
return action.slots ?? [review_attest.REVIEW_SLOT.CODE]
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// **A lane branched before `review:submit` is handed its findings path** (joshuafolkken/kit#4799): the
|
|
116
|
+
// reviewer runs the lane's own josh, and a supervisor reloaded onto main serves lanes that predate it.
|
|
117
|
+
function has_submit(directory: string): boolean {
|
|
118
|
+
return [SUBMIT_SCRIPT, `${distributed_paths.KIT_PACKAGE_PATH_PREFIX}${SUBMIT_SCRIPT}`].some(
|
|
119
|
+
(script) => existsSync(path.join(directory, script)),
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function review_prompt(lane: LaneInfo, action: ReviewAction, slot: ReviewSlot): string {
|
|
124
|
+
const { brief, findings } = review_paths(lane.directory, slot)
|
|
125
|
+
const round_prompt =
|
|
126
|
+
action.round === '1' ? run_ship_review.reviewer_prompt : run_ship_review.verification_prompt
|
|
127
|
+
const prompt_of = run_ship_review.slot_prompt(round_prompt, slot, action_slots(action))
|
|
72
128
|
const tail = lane_child_invocation.review_invocation(lane.issue)
|
|
129
|
+
const findings_path = has_submit(lane.directory) ? undefined : findings
|
|
130
|
+
|
|
131
|
+
return `${prompt_of(brief, slot, lane.issue, findings_path)} This is ${tail}`
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// **A reviewer that could not authenticate names it** with `api_auth.AUTH_FAILURE_NOTE`, read off its
|
|
135
|
+
// log's exit record, so the ship stop is not booked as a review finding (joshuafolkken/kit#4216).
|
|
136
|
+
function exited_answer(exit_code: number | null, log_path: string): BrokerAnswer {
|
|
137
|
+
const exited = `the reviewer exited with code ${String(exit_code)}`
|
|
138
|
+
|
|
139
|
+
if (!api_auth.is_auth_failed_transcript(stamp_file.read_stamp_text(log_path))) {
|
|
140
|
+
return failure(exited)
|
|
141
|
+
}
|
|
73
142
|
|
|
74
|
-
return `${
|
|
143
|
+
return failure(`${api_auth.AUTH_FAILURE_NOTE}: ${exited}`)
|
|
75
144
|
}
|
|
76
145
|
|
|
77
|
-
function reviewer_answer(result: AttachedLaunchResult): BrokerAnswer {
|
|
146
|
+
function reviewer_answer(result: AttachedLaunchResult, log_path: string): BrokerAnswer {
|
|
78
147
|
if (result.kind === 'failed') return failure(`the reviewer could not start: ${result.note}`)
|
|
79
148
|
|
|
80
|
-
return result.exit_code === 0
|
|
81
|
-
? SUCCESS
|
|
82
|
-
: failure(`the reviewer exited with code ${String(result.exit_code)}`)
|
|
149
|
+
return result.exit_code === 0 ? SUCCESS : exited_answer(result.exit_code, log_path)
|
|
83
150
|
}
|
|
84
151
|
|
|
85
|
-
async function launch_review(
|
|
86
|
-
|
|
87
|
-
|
|
152
|
+
async function launch_review(
|
|
153
|
+
lane: LaneInfo,
|
|
154
|
+
action: ReviewAction,
|
|
155
|
+
slot: ReviewSlot,
|
|
156
|
+
): Promise<BrokerAnswer> {
|
|
157
|
+
const target = review_paths(lane.directory, slot)
|
|
158
|
+
const prompt = review_prompt(lane, action, slot)
|
|
159
|
+
const built = agent_argv.review_in(prompt, Number(action.round), lane.directory)
|
|
88
160
|
if (built.kind === 'rejected') return failure(`the reviewer profile was rejected: ${built.note}`)
|
|
89
161
|
|
|
90
162
|
if (built.profile.provider !== provider_of(lane)) {
|
|
91
163
|
return failure(`the reviewer resolved to ${built.profile.provider}, not the lane's provider`)
|
|
92
164
|
}
|
|
93
165
|
|
|
94
|
-
console.error(agent_role_profile.describe_review(Number(round), built.profile))
|
|
166
|
+
console.error(agent_role_profile.describe_review(Number(action.round), built.profile))
|
|
95
167
|
const result = await detached_launch.launch_attached(
|
|
96
168
|
{
|
|
97
169
|
argv: built.argv,
|
|
@@ -103,7 +175,17 @@ async function launch_review(lane: LaneInfo, round: ReviewRound): Promise<Broker
|
|
|
103
175
|
console.error,
|
|
104
176
|
)
|
|
105
177
|
|
|
106
|
-
return reviewer_answer(result)
|
|
178
|
+
return reviewer_answer(result, target.log)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// **The slots' reviewers run side by side**, and the answer is the first failure among them — each
|
|
182
|
+
// slot's findings file then says which review finished (`run-ship-reviewer.ts`).
|
|
183
|
+
async function launch_reviews(lane: LaneInfo, action: ReviewAction): Promise<BrokerAnswer> {
|
|
184
|
+
const answers = await Promise.all(
|
|
185
|
+
action_slots(action).map(async (slot) => await launch_review(lane, action, slot)),
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
return answers.find((reply) => !reply.is_success) ?? SUCCESS
|
|
107
189
|
}
|
|
108
190
|
|
|
109
191
|
// An OpenAI lane's successor is its supervisor's to start, never a relaunch's.
|
|
@@ -128,7 +210,7 @@ async function perform(lane: LaneInfo, action: BrokerAction): Promise<BrokerAnsw
|
|
|
128
210
|
|
|
129
211
|
if (action.kind === 'relaunch') return relaunch(lane, action.stop)
|
|
130
212
|
|
|
131
|
-
return await
|
|
213
|
+
return await launch_reviews(lane, action)
|
|
132
214
|
}
|
|
133
215
|
|
|
134
216
|
// What the server answers: a thrown action is a failure naming its error, never a dead server.
|
|
@@ -140,7 +222,14 @@ async function answer(lane: LaneInfo, action: BrokerAction): Promise<BrokerAnswe
|
|
|
140
222
|
}
|
|
141
223
|
}
|
|
142
224
|
|
|
143
|
-
const lane_session_action = {
|
|
225
|
+
const lane_session_action = {
|
|
226
|
+
SUCCESS,
|
|
227
|
+
action_schema,
|
|
228
|
+
answer,
|
|
229
|
+
failure,
|
|
230
|
+
request_schema,
|
|
231
|
+
review_paths,
|
|
232
|
+
}
|
|
144
233
|
|
|
145
234
|
export type { BrokerAction, BrokerAnswer, ReviewRound }
|
|
146
235
|
export { lane_session_action }
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto'
|
|
2
|
-
import { mkdirSync, readFileSync,
|
|
2
|
+
import { mkdirSync, readFileSync, rmSync, unlinkSync } from 'node:fs'
|
|
3
3
|
import path from 'node:path'
|
|
4
|
-
import { setTimeout as sleep } from 'node:timers/promises'
|
|
5
4
|
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
5
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
6
6
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
7
|
+
import { atomic_write } from '#scripts/lib/atomic-write'
|
|
7
8
|
import { json_value } from '#scripts/lib/json-value'
|
|
9
|
+
import { poll } from '#scripts/lib/poll'
|
|
10
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
11
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
8
12
|
import { z } from 'zod'
|
|
9
13
|
import { lane_broker_server, type BrokerServer } from './lane-broker-server'
|
|
10
14
|
import type { LaneInfo } from './lane-registry'
|
|
11
15
|
import { lane_session_action, type BrokerAction, type BrokerAnswer } from './lane-session-action'
|
|
16
|
+
import { lane_session_reread } from './lane-session-reread'
|
|
12
17
|
|
|
13
18
|
// The sessions a lane child's detached `josh ship` cannot start itself, started for it by a process
|
|
14
19
|
// that can: the round-1 and round-2 reviewer, and the fresh child a stopped ship hands back to. An
|
|
@@ -28,11 +33,30 @@ const POLL_MS = 100
|
|
|
28
33
|
const LEGACY_HEARTBEAT_MS = 500
|
|
29
34
|
const LEGACY_HEARTBEAT_LIMIT_MS = 3000
|
|
30
35
|
const MINUTE_MS = 60_000
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
// **A relaunch is answered once the session has started, a review once it has finished**: waiting out a
|
|
37
|
+
// review's limit on a relaunch left the stopped lane idle for half an hour (joshuafolkken/kit#4344).
|
|
38
|
+
const REQUEST_LIMIT_MINUTES: Readonly<Record<BrokerAction['kind'], number>> = {
|
|
39
|
+
review: 30,
|
|
40
|
+
relaunch: 2,
|
|
41
|
+
}
|
|
42
|
+
const { request_schema } = lane_session_action
|
|
43
|
+
// **A request this broker cannot read is still answered**: the supervisor reloads on new code only at
|
|
44
|
+
// its next pass boundary (`run-wake-code.ts`), so until then a lane's ship can run a newer main than
|
|
45
|
+
// the broker's, and a field the ship added made the request unreadable and
|
|
46
|
+
// the ship waited out the whole limit on a server that had dropped it (joshuafolkken/kit#4230).
|
|
47
|
+
// **The reason names the fields the schema refused**: a guess at the supervisor's age hid a field the
|
|
48
|
+
// broker's schema had never learned even on one main (joshuafolkken/kit#4489).
|
|
49
|
+
const envelope_schema = z.looseObject({ session: z.uuid(), nonce: z.uuid() })
|
|
50
|
+
const UNREADABLE_REASON = 'the broker could not read the request'
|
|
51
|
+
// **A refused request is read as a version difference, never dropped silently** (joshuafolkken/kit#4714):
|
|
52
|
+
// the refusal marks the supervisor's code as suspect, so its next pass re-hashes the code even where the
|
|
53
|
+
// commit did not move or the hash at its start could not be read, and reloads when it differs. Only the
|
|
54
|
+
// `run:wake` supervisor takes the mark: an OpenAI lane's own supervisor never re-checks its code.
|
|
55
|
+
// **Before it is refused, the code on disk reads it** (`lane-session-reread.ts`), so a schema main widened
|
|
56
|
+
// since the supervisor started is answered now rather than after the reload (joshuafolkken/kit#4732).
|
|
57
|
+
const VERSION_NOTE =
|
|
58
|
+
"the broker's code differs from the ship's; a run:wake supervisor re-checks its code at its next pass"
|
|
59
|
+
const refusal = { is_pending: false }
|
|
36
60
|
const response_schema = z
|
|
37
61
|
.object({
|
|
38
62
|
session: z.uuid(),
|
|
@@ -44,7 +68,7 @@ const response_schema = z
|
|
|
44
68
|
// **A failure's reason sits beside the response, never in it**: a ship branched before the reason parses
|
|
45
69
|
// the response strictly, so a new field would read as no server (joshuafolkken/kit#3974).
|
|
46
70
|
const reason_schema = z.object({ nonce: z.string(), reason: z.string() }).strict()
|
|
47
|
-
type
|
|
71
|
+
type BrokerEnvelope = z.infer<typeof envelope_schema>
|
|
48
72
|
type BrokerResponse = z.infer<typeof response_schema>
|
|
49
73
|
|
|
50
74
|
const { failure } = lane_session_action
|
|
@@ -73,19 +97,72 @@ function read_record<T>(target: string, schema: z.ZodType<T>): T | undefined {
|
|
|
73
97
|
}
|
|
74
98
|
|
|
75
99
|
function write_record(target: string, body: BrokerResponse | z.infer<typeof reason_schema>): void {
|
|
76
|
-
|
|
100
|
+
atomic_write.replace_file(target, JSON.stringify(body))
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function refused_field(issue: z.core.$ZodIssue): ReadonlyArray<string> {
|
|
104
|
+
const at = issue.path.map(String)
|
|
105
|
+
|
|
106
|
+
if (issue.code !== 'unrecognized_keys') return [`${at.join('.')}: ${issue.message}`]
|
|
107
|
+
|
|
108
|
+
return issue.keys.map((key) => `unrecognized key: ${[...at, key].join('.')}`)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function unreadable(error: z.ZodError): BrokerAnswer {
|
|
112
|
+
const fields = error.issues.flatMap((issue) => refused_field(issue))
|
|
113
|
+
|
|
114
|
+
return failure(`${UNREADABLE_REASON} — ${VERSION_NOTE} — ${fields.join('; ')}`)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// The answer of a broker on code older than the request, which the ship can still fall back from.
|
|
118
|
+
function is_unreadable(answer: BrokerAnswer): boolean {
|
|
119
|
+
return !answer.is_success && answer.reason.includes(UNREADABLE_REASON)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async function answer_request(lane: LaneInfo, received: BrokerEnvelope): Promise<BrokerAnswer> {
|
|
123
|
+
const parsed = request_schema.safeParse(received)
|
|
124
|
+
if (parsed.success) return await lane_session_action.answer(lane, parsed.data.action)
|
|
125
|
+
|
|
126
|
+
refusal.is_pending = true
|
|
77
127
|
|
|
78
|
-
|
|
79
|
-
|
|
128
|
+
return (await lane_session_reread.reread(lane.issue, received)) ?? unreadable(parsed.error)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Whether a request was refused since the supervisor last asked, clearing the mark — the supervisor
|
|
132
|
+
// re-checks its code on it (`run-wake-code.ts`).
|
|
133
|
+
function take_refusal(): boolean {
|
|
134
|
+
const { is_pending } = refusal
|
|
135
|
+
|
|
136
|
+
refusal.is_pending = false
|
|
137
|
+
|
|
138
|
+
return is_pending
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// The requests this process's servers are answering now — what the supervisor's reload waits out
|
|
142
|
+
// (`run-wake-cli.ts`), since closing a server mid-review fails that review.
|
|
143
|
+
const answering = { count: 0 }
|
|
144
|
+
|
|
145
|
+
function is_answering(): boolean {
|
|
146
|
+
return answering.count > 0
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
async function answer_counted(lane: LaneInfo, received: BrokerEnvelope): Promise<BrokerAnswer> {
|
|
150
|
+
answering.count += 1
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
return await answer_request(lane, received)
|
|
154
|
+
} finally {
|
|
155
|
+
answering.count -= 1
|
|
156
|
+
}
|
|
80
157
|
}
|
|
81
158
|
|
|
82
159
|
async function process_request(
|
|
83
160
|
lane: LaneInfo,
|
|
84
161
|
response: string,
|
|
85
|
-
received:
|
|
162
|
+
received: BrokerEnvelope,
|
|
86
163
|
state: { current: BrokerResponse },
|
|
87
164
|
): Promise<void> {
|
|
88
|
-
const answer = await
|
|
165
|
+
const answer = await answer_counted(lane, received)
|
|
89
166
|
const { session, nonce } = received
|
|
90
167
|
|
|
91
168
|
if (!answer.is_success) write_record(reason_path(response), { nonce, reason: answer.reason })
|
|
@@ -99,21 +176,23 @@ async function serve(
|
|
|
99
176
|
response: string,
|
|
100
177
|
state: { is_running: boolean; current: BrokerResponse },
|
|
101
178
|
): Promise<void> {
|
|
102
|
-
|
|
179
|
+
const served = { nonce: '' }
|
|
103
180
|
const target = request_path(lane.directory, lane.issue)
|
|
104
181
|
|
|
105
|
-
|
|
106
|
-
|
|
182
|
+
// Requests are served one at a time, in arrival order: a pass ends only once its request is answered.
|
|
183
|
+
async function serve_pass(): Promise<true | undefined> {
|
|
184
|
+
if (!state.is_running) return true
|
|
185
|
+
const received = read_record(target, envelope_schema)
|
|
107
186
|
|
|
108
|
-
if (received?.session === session && received.nonce !==
|
|
109
|
-
|
|
110
|
-
// eslint-disable-next-line no-await-in-loop -- requests are served one at a time, in arrival order
|
|
187
|
+
if (received?.session === session && received.nonce !== served.nonce) {
|
|
188
|
+
served.nonce = received.nonce
|
|
111
189
|
await process_request(lane, response, received, state)
|
|
112
190
|
}
|
|
113
191
|
|
|
114
|
-
|
|
115
|
-
await sleep(POLL_MS)
|
|
192
|
+
return undefined
|
|
116
193
|
}
|
|
194
|
+
|
|
195
|
+
await poll.wait_for(serve_pass, { interval_ms: POLL_MS })
|
|
117
196
|
}
|
|
118
197
|
|
|
119
198
|
// The server record is written before the response, so a ship that finds the response finds it too.
|
|
@@ -233,18 +312,20 @@ async function wait_response(
|
|
|
233
312
|
target: string,
|
|
234
313
|
session: string,
|
|
235
314
|
nonce: string,
|
|
315
|
+
kind: BrokerAction['kind'],
|
|
236
316
|
): Promise<BrokerAnswer> {
|
|
237
|
-
const
|
|
317
|
+
const limit_minutes = REQUEST_LIMIT_MINUTES[kind]
|
|
318
|
+
const deadline = Date.now() + limit_minutes * MINUTE_MS
|
|
238
319
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
320
|
+
function verdict_by_deadline(): BrokerAnswer | undefined {
|
|
321
|
+
if (Date.now() >= deadline) {
|
|
322
|
+
return failure(`the broker gave no answer within ${String(limit_minutes)} minutes`)
|
|
323
|
+
}
|
|
242
324
|
|
|
243
|
-
|
|
244
|
-
await sleep(POLL_MS)
|
|
325
|
+
return response_verdict(target, session, nonce)
|
|
245
326
|
}
|
|
246
327
|
|
|
247
|
-
return
|
|
328
|
+
return await poll.wait_for(verdict_by_deadline, { interval_ms: POLL_MS })
|
|
248
329
|
}
|
|
249
330
|
|
|
250
331
|
function live_response(target: string): BrokerResponse | undefined {
|
|
@@ -255,12 +336,18 @@ function live_response(target: string): BrokerResponse | undefined {
|
|
|
255
336
|
: undefined
|
|
256
337
|
}
|
|
257
338
|
|
|
339
|
+
// The session of the server answering for this lane now, or `undefined` while none does. A new session
|
|
340
|
+
// means the server that held the lane before has ended.
|
|
341
|
+
function serving_session(directory: string, issue: string): string | undefined {
|
|
342
|
+
const target = response_path(directory, issue)
|
|
343
|
+
|
|
344
|
+
return target === undefined ? undefined : live_response(target)?.session
|
|
345
|
+
}
|
|
346
|
+
|
|
258
347
|
// Whether a server answers for this lane now — what a Claude lane's ship asks before it hands a session
|
|
259
348
|
// over rather than starting the session itself.
|
|
260
349
|
function is_serving(directory: string, issue: string): boolean {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
return target !== undefined && live_response(target) !== undefined
|
|
350
|
+
return serving_session(directory, issue) !== undefined
|
|
264
351
|
}
|
|
265
352
|
|
|
266
353
|
// **A request nobody waits for any more is taken back**: a server busy with an earlier request reads the
|
|
@@ -270,11 +357,17 @@ function withdraw(pending: string, nonce: string): void {
|
|
|
270
357
|
if (read_record(pending, request_schema)?.nonce === nonce) stamp_file.remove_stamp(pending)
|
|
271
358
|
}
|
|
272
359
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
360
|
+
// A failure is put on the run's stream as well as the ship's output, so a broker that cannot serve the
|
|
361
|
+
// lane is seen from `run:board` rather than only from the ship log (joshuafolkken/kit#4230).
|
|
362
|
+
async function record_failure(issue: string, answer: BrokerAnswer): Promise<void> {
|
|
363
|
+
if (answer.is_success) return
|
|
364
|
+
|
|
365
|
+
const text = `${issue_cite.plain(issue)} lane broker: ${answer.reason}`
|
|
366
|
+
|
|
367
|
+
await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.NOTE, text)
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
async function send(directory: string, issue: string, action: BrokerAction): Promise<BrokerAnswer> {
|
|
278
371
|
const target = response_path(directory, issue)
|
|
279
372
|
const response = target === undefined ? undefined : live_response(target)
|
|
280
373
|
|
|
@@ -285,19 +378,35 @@ async function request(
|
|
|
285
378
|
const pending = request_path(directory, issue)
|
|
286
379
|
|
|
287
380
|
stamp_file.replace_stamp(pending, body)
|
|
288
|
-
const answer = await wait_response(target, response.session, nonce)
|
|
381
|
+
const answer = await wait_response(target, response.session, nonce, action.kind)
|
|
289
382
|
|
|
290
383
|
withdraw(pending, nonce)
|
|
291
384
|
|
|
292
385
|
return answer
|
|
293
386
|
}
|
|
294
387
|
|
|
388
|
+
async function request(
|
|
389
|
+
directory: string,
|
|
390
|
+
issue: string,
|
|
391
|
+
action: BrokerAction,
|
|
392
|
+
): Promise<BrokerAnswer> {
|
|
393
|
+
const answer = await send(directory, issue, action)
|
|
394
|
+
|
|
395
|
+
await record_failure(issue, answer)
|
|
396
|
+
|
|
397
|
+
return answer
|
|
398
|
+
}
|
|
399
|
+
|
|
295
400
|
const lane_session_broker = {
|
|
401
|
+
is_answering,
|
|
296
402
|
is_serving,
|
|
403
|
+
is_unreadable,
|
|
297
404
|
request,
|
|
298
405
|
request_path,
|
|
299
406
|
response_path,
|
|
300
407
|
review_paths: lane_session_action.review_paths,
|
|
408
|
+
serving_session,
|
|
409
|
+
take_refusal,
|
|
301
410
|
with_server,
|
|
302
411
|
}
|
|
303
412
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { lane_session_reread } from './lane-session-reread'
|
|
4
|
+
|
|
5
|
+
// The fresh process a lane broker starts for a request its own code refused (`lane-session-reread.ts`):
|
|
6
|
+
// `<issue> <request JSON>` in, the answer's JSON out, exit 1 where it read nothing.
|
|
7
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
8
|
+
const ARGV_OFFSET = 2
|
|
9
|
+
const [issue = '', text = ''] = process.argv.slice(ARGV_OFFSET)
|
|
10
|
+
const answer = await lane_session_reread.answer_text(issue, text)
|
|
11
|
+
|
|
12
|
+
if (answer === undefined) process.exitCode = 1
|
|
13
|
+
else process.stdout.write(`${JSON.stringify(answer)}\n`)
|
|
14
|
+
}
|