@joshuafolkken/kit 1.1784.0 → 1.2116.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/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/workflow-commands/SKILL.md +6 -6
- package/.claude/skills/workflow-commands/background-commands.md +8 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +41 -32
- package/.claude/skills/workflow-commands/delegation.md +6 -6
- package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +7 -5
- package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +9 -4
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/kickoff.md +2 -2
- package/.claude/skills/workflow-commands/observation-filing.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
- package/.claude/skills/workflow-commands/prerequisite.md +3 -2
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +7 -5
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-pnpm/action.yml +9 -16
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +155 -15
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +60 -45
- package/.vscode/settings.json +19 -0
- package/CLAUDE.md +5 -12
- package/SECURITY.md +2 -2
- package/dist/CLAUDE.md +5 -12
- package/dist/commands/document-read-cli.js +2 -1
- package/dist/commands/document-section-main.js +2 -1
- package/dist/commands/read-set-cli.js +194 -134
- package/dist/commands/run-prep-main.js +9694 -10173
- package/dist/commands/run-step-cli.js +22138 -18285
- package/dist/hooks/audit-provision.js +23 -5
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
- package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
- package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
- package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +8 -8
- package/dist/hooks/format-edited.js +4 -5
- package/dist/hooks/inputs.json +386 -360
- package/dist/hooks/pretool-guard.js +7 -6
- package/dist/hooks/session-lang.js +101 -258
- package/dist/hooks/stop-guard.js +1744 -2576
- package/dist/josh.js +7133 -6368
- package/dist/version/index.js +161 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/package.json +16 -9
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +14 -11
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +40 -21
- package/prompts/collaboration-workflow/lane-instructions.md +3 -1
- package/prompts/collaboration-workflow/measurement.md +8 -1
- package/prompts/collaboration-workflow/operating-rules.md +11 -2
- package/prompts/collaboration-workflow/output-bounds.md +6 -2
- package/prompts/collaboration-workflow/plan-comment.md +1 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +3 -1
- package/prompts/review-rubric.md +8 -0
- package/prompts/review.md +31 -22
- package/prompts/testing-guide.md +1 -0
- package/scripts/agent/agent-argv.ts +14 -16
- 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-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 +20 -9
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +6 -1
- package/scripts/backlog/backlog-drive-hold.ts +3 -3
- package/scripts/backlog/backlog-drive-idle.ts +10 -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-named-offer.ts +73 -30
- package/scripts/backlog/backlog-drive-named.ts +28 -7
- package/scripts/backlog/backlog-drive-paused.ts +5 -4
- package/scripts/backlog/backlog-drive-restore.ts +11 -3
- package/scripts/backlog/backlog-drive.ts +21 -60
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next.ts +39 -49
- package/scripts/backlog/backlog-occupied.ts +2 -2
- package/scripts/backlog/backlog-overlap.ts +42 -8
- 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 +19 -6
- package/scripts/backlog/backlog-pool.ts +50 -12
- package/scripts/backlog/backlog-rank.ts +60 -13
- package/scripts/backlog/backlog-stalled-detect.ts +2 -1
- package/scripts/backlog/backlog-waves.ts +17 -2
- package/scripts/backlog/backlogrun-launch.ts +7 -4
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-cli.ts +37 -16
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +2 -2
- package/scripts/delegation/duplicate-read-guard.ts +1 -0
- package/scripts/delegation/investigation-guard.ts +14 -2
- package/scripts/delegation/investigation-reads.ts +45 -23
- package/scripts/dependabot/dependabot-cooldown.ts +3 -2
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- 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 +17 -7
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -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-cli-argv.ts +2 -2
- package/scripts/epic/epic-fetch.ts +4 -2
- package/scripts/epic/epic-graph.ts +7 -2
- package/scripts/epic/epic-issue.ts +3 -1
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- 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 +13 -10
- 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/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +41 -11
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
- package/scripts/followup/git-pr-followup.ts +62 -27
- 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 +2 -2
- package/scripts/gate/busy-average.ts +34 -2
- 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/command-memory.ts +1 -1
- package/scripts/gate/core-admission.ts +24 -6
- package/scripts/gate/core-budget-timing.ts +20 -6
- package/scripts/gate/core-budget.ts +40 -11
- package/scripts/gate/core-wait-record.ts +3 -2
- package/scripts/gate/core-wait.ts +25 -2
- package/scripts/gate/core-weights.ts +15 -7
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +14 -6
- package/scripts/gate/gate-plan.ts +103 -58
- package/scripts/gate/gate-report.ts +9 -7
- package/scripts/gate/gate-run-steps.ts +26 -3
- package/scripts/gate/gate-skip.ts +45 -6
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +2 -1
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/scoped-green.ts +68 -15
- package/scripts/gate/since-green.ts +14 -6
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/verification-gate.ts +51 -16
- package/scripts/gate/verification-inputs.ts +21 -6
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +23 -2
- package/scripts/gh/git-ai-review-scan.ts +1 -1
- package/scripts/gh/git-gh-api-path.ts +12 -3
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +4 -2
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +8 -2
- package/scripts/gh/git-gh-issue.ts +12 -5
- package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
- 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 +3 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +21 -7
- 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 +3 -0
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/git/base-tree.ts +30 -0
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +16 -1
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +66 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-schemas.ts +13 -0
- 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-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +53 -5
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +11 -2
- package/scripts/git/stash/stash-push-cli.ts +10 -0
- package/scripts/hooks/batch-guard.ts +40 -21
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +22 -2
- 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 +14 -1
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +76 -10
- package/scripts/hooks/pretool-guard.ts +2 -0
- package/scripts/hooks/reserved-run.ts +14 -1
- package/scripts/hooks/run-hook.sh +23 -8
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +3 -15
- package/scripts/hooks/stop-guard.ts +7 -6
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +5 -1
- package/scripts/init/hook-launch.ts +4 -2
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-line.ts +19 -1
- package/scripts/issue/defect-rate-cli.ts +5 -102
- package/scripts/issue/defect-report.ts +4 -4
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +64 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-body-or-comment.ts +38 -4
- package/scripts/issue/issue-cite-cli.ts +1 -3
- package/scripts/issue/issue-classification.ts +1 -0
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-evidence-exit.ts +4 -2
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +111 -38
- 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 +43 -6
- package/scripts/issue/issue-labels.ts +19 -2
- package/scripts/issue/issue-lint-cli.ts +27 -2
- package/scripts/issue/issue-measured-cli.ts +13 -35
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-not-before-label.ts +2 -2
- package/scripts/issue/issue-not-before.ts +4 -1
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +174 -43
- package/scripts/issue/issue-rank.ts +21 -4
- package/scripts/issue/issue-read-cli.ts +32 -6
- package/scripts/issue/issue-read.ts +37 -12
- package/scripts/issue/issue-sample-gate.ts +95 -74
- 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 +12 -11
- package/scripts/issue/issue-search.ts +124 -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 +31 -1
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -12
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -70
- package/scripts/issue/plan-consumers-section.ts +22 -1
- 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/command-usage.ts +3 -2
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -82
- package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
- package/scripts/josh/josh-commands-ai.ts +5 -5
- package/scripts/josh/josh-commands-development.ts +59 -58
- package/scripts/josh/josh-commands-issue-write.ts +23 -4
- package/scripts/josh/josh-commands-issue.ts +32 -0
- package/scripts/josh/josh-commands-lane.ts +87 -4
- package/scripts/josh/josh-commands-lint.ts +16 -3
- package/scripts/josh/josh-commands-maintenance.ts +15 -0
- package/scripts/josh/josh-commands-review.ts +41 -6
- package/scripts/josh/josh-commands-ship.ts +56 -8
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-workflow.ts +1 -1
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +5 -3
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/stamp-file.ts +11 -2
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +5 -8
- 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-check-stats.ts +29 -8
- package/scripts/lane/lane-child-invocation.ts +9 -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-close.ts +8 -3
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +2 -2
- package/scripts/lane/lane-gap-stats.ts +7 -6
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-investigation-switch.ts +16 -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 +119 -36
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +31 -177
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +176 -59
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +16 -7
- 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-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +4 -1
- 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-registry.ts +14 -1
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-sampler.ts +23 -4
- package/scripts/lane/lane-session-action.ts +93 -18
- package/scripts/lane/lane-session-broker.ts +49 -21
- 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-spent.ts +1 -1
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +13 -1
- package/scripts/lane/lane-state.ts +41 -9
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +21 -5
- package/scripts/lane/lane-stop-stats.ts +51 -19
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-transcript-calls.ts +67 -10
- package/scripts/lane/lane-transcript-stats.ts +44 -12
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +108 -31
- 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/lib/poll.ts +38 -9
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +45 -6
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/import-graph.ts +141 -11
- package/scripts/lint/lint-gate-scope.ts +2 -2
- package/scripts/lint/lint-parallel.ts +54 -6
- package/scripts/lint/lint-related.ts +154 -33
- 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/telegram-notify.ts +12 -3
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush.ts +32 -9
- package/scripts/overrides/overrides-check.ts +9 -1
- package/scripts/release/release-approval-prune.ts +7 -1
- package/scripts/repo/required-checks-logic.ts +4 -1
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +15 -1
- package/scripts/report/report-labels.ts +12 -1
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +26 -7
- package/scripts/report/report-lint.ts +2 -20
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +68 -19
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +14 -7
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +85 -22
- package/scripts/review/review-finding-ledger.ts +109 -7
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +11 -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 +4 -2
- package/scripts/review/review-record-cli.ts +177 -54
- 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-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-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +91 -29
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +24 -8
- package/scripts/review/review-stamps.ts +7 -3
- package/scripts/review/review-stop-log.ts +20 -6
- package/scripts/review/review-stops-cli.ts +2 -1
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/rules/agent-model.ts +1 -1
- package/scripts/rules/bash-triggers.ts +3 -3
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle.ts +1 -1
- package/scripts/rules/delivered-rules.ts +36 -17
- package/scripts/rules/destructive-command.ts +3 -11
- package/scripts/rules/direct-issue-comment.ts +34 -12
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +4 -24
- package/scripts/rules/early-heartbeat.ts +2 -0
- package/scripts/rules/edit-tool.ts +27 -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-force.ts +2 -2
- package/scripts/rules/guard-remedy.ts +14 -5
- package/scripts/rules/implementation-cut.ts +61 -28
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +9 -4
- package/scripts/rules/josh-git-bare.ts +1 -1
- package/scripts/rules/lane-background.ts +41 -13
- package/scripts/rules/lane-direct-tool.ts +107 -9
- package/scripts/rules/lane-interactive-ask.ts +4 -1
- package/scripts/rules/lane-park.ts +4 -2
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +1 -1
- package/scripts/rules/lane-switch-main.ts +4 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/permission-guards.ts +5 -1
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +67 -17
- package/scripts/rules/poll-loop.ts +72 -9
- package/scripts/rules/pr-merge.ts +5 -5
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +88 -24
- 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 +5 -15
- package/scripts/rules/rule-value-cache.ts +53 -5
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +59 -11
- package/scripts/rules/rule-value.ts +17 -4
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +10 -2
- package/scripts/rules/stop-rule-rows.ts +1 -13
- package/scripts/rules/stop-rules.ts +33 -58
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +110 -23
- package/scripts/rules/timed-rerun.ts +1 -1
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +22 -7
- package/scripts/run/board/run-board-ending-reason.ts +6 -2
- package/scripts/run/board/run-board-fit.ts +24 -1
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-header.ts +8 -0
- package/scripts/run/board/run-board-labels.ts +11 -1
- package/scripts/run/board/run-board-lane-time.ts +1 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-notes.ts +7 -1
- package/scripts/run/board/run-board-operation.ts +4 -2
- package/scripts/run/board/run-board-phase.ts +2 -5
- package/scripts/run/board/run-board-plan.ts +1 -1
- package/scripts/run/board/run-board-read.ts +46 -1
- package/scripts/run/board/run-board-reason.ts +20 -8
- package/scripts/run/board/run-board-render-checks.ts +3 -2
- package/scripts/run/board/run-board-render-drawn.ts +11 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-lead.ts +9 -0
- package/scripts/run/board/run-board-render-legend.ts +19 -0
- package/scripts/run/board/run-board-render-tail.ts +1 -1
- package/scripts/run/board/run-board-render.ts +82 -18
- package/scripts/run/board/run-board-spin.ts +1 -3
- package/scripts/run/board/run-board-status.ts +2 -0
- package/scripts/run/board/run-board-tick.ts +39 -10
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +3 -2
- 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 +52 -8
- 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-filed.ts +9 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +4 -0
- package/scripts/run/event/run-event-stream.ts +25 -3
- package/scripts/run/hold/run-stop-notify.ts +3 -8
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +66 -23
- package/scripts/run/merge/run-merge-outcome.ts +2 -0
- package/scripts/run/merge/run-merge-ship.ts +13 -3
- package/scripts/run/merge/run-merge-signals.ts +40 -23
- package/scripts/run/merge/run-merge-steps.ts +56 -36
- 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 +41 -14
- 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 +26 -6
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-prep.ts +1 -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 +5 -2
- package/scripts/run/ship/run-ship-args.ts +19 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +131 -39
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +10 -4
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +27 -26
- package/scripts/run/ship/run-ship-overlap.ts +8 -3
- package/scripts/run/ship/run-ship-place.ts +9 -2
- 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 +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
- package/scripts/run/ship/run-ship-preflight.ts +16 -4
- package/scripts/run/ship/run-ship-probe.ts +23 -9
- package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-return.ts +103 -29
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +230 -59
- package/scripts/run/ship/run-ship-review.ts +171 -51
- package/scripts/run/ship/run-ship-reviewer.ts +138 -42
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +49 -13
- package/scripts/run/ship/run-ship-steps.ts +24 -4
- package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-sync.ts +171 -30
- 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 +16 -2
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +6 -113
- package/scripts/run/wake/run-wake-code.ts +53 -11
- package/scripts/run/wake/run-wake-driver.ts +5 -3
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +5 -3
- package/scripts/run/wake/run-wake-ports.ts +11 -3
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake.ts +3 -2
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/project-config.ts +3 -2
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-provision-main.ts +9 -1
- package/scripts/security/security-audit-provision.ts +1 -1
- package/scripts/security/security-audit.ts +21 -1
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/split/split-assess.ts +12 -3
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +20 -2
- package/scripts/split/split-resolution.ts +107 -0
- 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-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 +208 -20
- package/scripts/test/test-pinned-main.ts +84 -18
- 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 +258 -47
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +35 -11
- package/scripts/test/test-read-recording.ts +17 -5
- package/scripts/test/test-read-trace.ts +26 -8
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red.ts +34 -14
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +4 -1
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +43 -23
- package/scripts/test/test-related-scope.ts +99 -34
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +167 -83
- package/scripts/test/test-unit-guard.ts +28 -5
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-worker-share.ts +5 -4
- 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 +12 -1
- 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 +36 -5
- package/scripts/time-runtime/time-markers.ts +2 -2
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +17 -5
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/latest-corepack.ts +2 -0
- package/templates/gitignore +2 -0
- package/templates/workflows/ci.yml +41 -0
- package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
- package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
- package/dist/hooks/chunk-TUIFS5E7.js +0 -72
- package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/rules/filing-cap.ts +0 -139
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
|
+
run_board_fit,
|
|
3
|
+
type FrameParts,
|
|
4
|
+
type PlanLine,
|
|
5
|
+
type PlanSection,
|
|
6
|
+
type TerminalSize,
|
|
7
|
+
type YieldStage,
|
|
8
|
+
} from './run-board-fit'
|
|
2
9
|
import { run_board_fold, type FrameBounds } from './run-board-fold'
|
|
3
10
|
import { run_board_fresh } from './run-board-fresh'
|
|
4
11
|
import { run_board_header, type BoardHeader } from './run-board-header'
|
|
@@ -14,6 +21,7 @@ import { run_board_notes, type BoardNote } from './run-board-notes'
|
|
|
14
21
|
import { run_board_priority } from './run-board-priority'
|
|
15
22
|
import { run_board_render_condition } from './run-board-render-condition'
|
|
16
23
|
import { run_board_render_foot } from './run-board-render-foot'
|
|
24
|
+
import { run_board_render_found } from './run-board-render-found'
|
|
17
25
|
import { run_board_render_icon } from './run-board-render-icon'
|
|
18
26
|
import { run_board_render_lanes, type LaneCells } from './run-board-render-lanes'
|
|
19
27
|
import { run_board_render_lead } from './run-board-render-lead'
|
|
@@ -38,14 +46,18 @@ const { time_of, time_width } = run_board_render_time
|
|
|
38
46
|
const { state_icon } = run_board_render_icon
|
|
39
47
|
const { NOTE_LIMIT } = run_board_render_notes
|
|
40
48
|
const { lane_cells_of, lanes_section, number_text } = run_board_render_lanes
|
|
41
|
-
const {
|
|
42
|
-
const { ELLIPSIS, TITLE_LIMIT, WHOLE, fitted, reason_text, row_overrun, title_of } =
|
|
49
|
+
const { indent_of, lead_of: lane_lead_of, running_fresh } = run_board_render_lead
|
|
50
|
+
const { ELLIPSIS, TITLE_LIMIT, WHOLE, columns_cut, fitted, reason_text, row_overrun, title_of } =
|
|
43
51
|
run_board_render_title
|
|
52
|
+
const { width_of } = run_board_fit
|
|
44
53
|
const { padded } = run_board_fresh
|
|
45
54
|
const { condition_of, waits_of } = run_board_render_condition
|
|
46
55
|
const { legend_lines, resume_lines, thanks_part } = run_board_render_foot
|
|
47
56
|
const { ROW_INDENT, done_section, keyed, plan_section } = run_board_render_section
|
|
48
57
|
const GAP = ' '
|
|
58
|
+
// The fewest columns a done row's end is cut to before its title gives them up: its minutes and a cut
|
|
59
|
+
// start of what follows.
|
|
60
|
+
const FOUND_FLOOR = 8
|
|
49
61
|
const FILED_LEAD = `${run_board_labels.FILED_RUN_MARK} `
|
|
50
62
|
const BRANCH = `${ROW_INDENT} ├ `
|
|
51
63
|
const LAST_BRANCH = `${ROW_INDENT} └ `
|
|
@@ -87,6 +99,8 @@ interface RowFrame {
|
|
|
87
99
|
// The lanes section draws each row's lead — progress, phase and times — before its cells
|
|
88
100
|
// (`run-board-render-lead.ts`).
|
|
89
101
|
is_lane_row?: boolean | undefined
|
|
102
|
+
// A done row whose title gives up the columns draws what was filed during it whole.
|
|
103
|
+
is_end_kept?: boolean | undefined
|
|
90
104
|
}
|
|
91
105
|
|
|
92
106
|
// A row drawn before the plan is read has no title yet, and says so.
|
|
@@ -159,40 +173,90 @@ function head_text(row: BoardRow, frame: RowFrame): string {
|
|
|
159
173
|
return joined([lead, time])
|
|
160
174
|
}
|
|
161
175
|
|
|
176
|
+
function same(reference: string): string {
|
|
177
|
+
return reference
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// A row up to what was filed during it: its head, then its tail where it draws one.
|
|
181
|
+
function tailed_head(row: BoardRow, frame: RowFrame): string {
|
|
182
|
+
return joined([head_text(row, frame), ...run_board_render_tail.tail_of(row, frame.header)])
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// The columns the pane leaves after `head` and its gap, where the frame is kept within one and the
|
|
186
|
+
// row's end is not kept whole.
|
|
187
|
+
function room_after(indent: string, head: string, frame: RowFrame): number | undefined {
|
|
188
|
+
if (frame.columns === undefined || frame.is_end_kept === true) return undefined
|
|
189
|
+
|
|
190
|
+
return frame.columns - width_of(`${indent}${head}${GAP}`)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// What was filed during a done row, in `room`: a pane too narrow for it cuts its end on an ellipsis
|
|
194
|
+
// rather than the title, so the time column stays where every other row has it
|
|
195
|
+
// (joshuafolkken/kit#4922). The cut text's references are left unlinked, so no hyperlink escape is cut
|
|
196
|
+
// in two.
|
|
197
|
+
function found_fitted(room: number | undefined, row: BoardRow, header: BoardHeader): string {
|
|
198
|
+
const found = run_board_render_found.found_text(row, header)
|
|
199
|
+
|
|
200
|
+
if (found === '' || room === undefined || width_of(found) <= room) return found
|
|
201
|
+
|
|
202
|
+
const unlinked = run_board_render_found.found_text(row, { ...header, link: same })
|
|
203
|
+
|
|
204
|
+
return columns_cut(unlinked, Math.max(1, room))
|
|
205
|
+
}
|
|
206
|
+
|
|
162
207
|
// Every row carries its state's icon, or the icon of what it waits on; a running row ends on its tail
|
|
163
|
-
// (`run-board-render-tail.ts`),
|
|
164
|
-
|
|
208
|
+
// (`run-board-render-tail.ts`), a done row on what was filed during it (`run-board-render-found.ts`),
|
|
209
|
+
// and a row with nothing after its padded columns ends where its text does.
|
|
210
|
+
function row_text(indent: string, row: BoardRow, frame: RowFrame): string {
|
|
165
211
|
const { header } = frame
|
|
166
|
-
const
|
|
212
|
+
const head = tailed_head(row, frame)
|
|
213
|
+
const found = found_fitted(room_after(indent, head, frame), row, header)
|
|
167
214
|
const notes = [waits_of(row, header, frame.is_conditioned), reason_text(row, frame.reason_cut)]
|
|
168
215
|
|
|
169
|
-
return joined([
|
|
216
|
+
return `${indent}${joined([head, found, ...notes]).trimEnd()}`
|
|
170
217
|
}
|
|
171
218
|
|
|
172
|
-
// A row
|
|
173
|
-
|
|
174
|
-
|
|
219
|
+
// A pane narrower than a done row's head leaves its end too few columns to say anything in, so there
|
|
220
|
+
// the title gives up the columns instead, as before joshuafolkken/kit#4922.
|
|
221
|
+
function is_found_squeezed(indent: string, row: BoardRow, frame: RowFrame): boolean {
|
|
222
|
+
if (run_board_render_found.found_text(row, frame.header) === '') return false
|
|
223
|
+
|
|
224
|
+
return (room_after(indent, tailed_head(row, frame), frame) ?? FOUND_FLOOR) < FOUND_FLOOR
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// A row drawn whole or cut, after its indent; a row that keeps its line keeps its end whole too, its
|
|
228
|
+
// title giving up the columns.
|
|
229
|
+
function row_draw(
|
|
230
|
+
indent: string,
|
|
231
|
+
row: BoardRow,
|
|
232
|
+
frame: RowFrame,
|
|
233
|
+
fit: RowFit,
|
|
234
|
+
): (cut: RowCut) => string {
|
|
235
|
+
const is_end_kept = fit.is_line_kept === true
|
|
236
|
+
|
|
237
|
+
return (cut) => row_text(indent, row, { ...frame, ...cut, is_end_kept })
|
|
175
238
|
}
|
|
176
239
|
|
|
177
240
|
// A row drawn with lane cells keeps its head on one line, its title giving up their columns where the
|
|
178
241
|
// pane is narrow. A row that draws a tail keeps its whole line, giving up the columns its section's
|
|
179
|
-
// rows give up together (joshuafolkken/kit#4226).
|
|
242
|
+
// rows give up together (joshuafolkken/kit#4226). A done row keeps its title's width and cuts the end of
|
|
243
|
+
// what was filed during it instead (`found_fitted`), unless that end is squeezed out.
|
|
180
244
|
function row_fit(indent: string, row: BoardRow, frame: RowFrame): RowFit {
|
|
181
|
-
const
|
|
245
|
+
const is_tailed = run_board_render_tail.tail_of(row, frame.header).length > 0
|
|
182
246
|
|
|
183
247
|
return {
|
|
184
|
-
is_line_kept,
|
|
248
|
+
is_line_kept: is_tailed || is_found_squeezed(indent, row, frame),
|
|
185
249
|
lead: frame.filed.has(row.number) ? FILED_LEAD.length : 0,
|
|
186
250
|
head: (cut) => `${indent}${head_text(row, { ...frame, ...cut })}`,
|
|
187
251
|
is_head_kept: frame.cells !== undefined,
|
|
188
|
-
shared:
|
|
252
|
+
shared: is_tailed ? frame.shared : undefined,
|
|
189
253
|
}
|
|
190
254
|
}
|
|
191
255
|
|
|
192
256
|
// A plan line that draws one issue row, and one that draws none — a blank, a rule, an epic's own line.
|
|
193
257
|
function row_line(indent: string, row: BoardRow, frame: RowFrame, stage?: YieldStage): PlanLine {
|
|
194
258
|
const fit = row_fit(indent, row, frame)
|
|
195
|
-
const text = fitted(row, frame.columns, row_draw(indent, row, frame), fit)
|
|
259
|
+
const text = fitted(row, frame.columns, row_draw(indent, row, frame, fit), fit)
|
|
196
260
|
|
|
197
261
|
return { text, row: run_board_row_yield.yield_of(row, stage) }
|
|
198
262
|
}
|
|
@@ -201,10 +265,10 @@ function row_line(indent: string, row: BoardRow, frame: RowFrame, stage?: YieldS
|
|
|
201
265
|
// their titles end in one column and the tails after them start in one.
|
|
202
266
|
function shared_overrun(rows: ReadonlyArray<BoardRow>, frame: RowFrame): number {
|
|
203
267
|
const overruns = rows.map((row) => {
|
|
204
|
-
const fit = row_fit(
|
|
268
|
+
const fit = row_fit(indent_of(row), row, frame)
|
|
205
269
|
|
|
206
270
|
return fit.is_line_kept === true
|
|
207
|
-
? row_overrun(row, frame.columns, row_draw(
|
|
271
|
+
? row_overrun(row, frame.columns, row_draw(indent_of(row), row, frame, fit), fit)
|
|
208
272
|
: 0
|
|
209
273
|
})
|
|
210
274
|
|
|
@@ -290,7 +354,7 @@ function active_sections(layout: BoardLayout, frame: RowFrame): Array<PlanSectio
|
|
|
290
354
|
const lane_frame = { ...frame, cells, is_lane_row: true }
|
|
291
355
|
const shared = shared_overrun(lead, lane_frame)
|
|
292
356
|
const lanes = lanes_section(
|
|
293
|
-
lead.map((row) => row_line(
|
|
357
|
+
lead.map((row) => row_line(indent_of(row), row, { ...lane_frame, shared })),
|
|
294
358
|
cells,
|
|
295
359
|
)
|
|
296
360
|
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { stripVTControlCharacters } from 'node:util'
|
|
2
1
|
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
3
|
-
import string_width from 'string-width'
|
|
4
2
|
import { run_board_fit, type TerminalSize } from './run-board-fit'
|
|
5
3
|
import { run_board_labels } from './run-board-labels'
|
|
6
4
|
import type { BoardPorts } from './run-board-state'
|
|
@@ -38,7 +36,7 @@ type SpinPorts = Pick<BoardPorts, 'now' | 'sleep' | 'write'>
|
|
|
38
36
|
// The spot of the placeholder at `index` in a line that starts `row` rows down the screen.
|
|
39
37
|
function spot_at(line: string, index: number, row: number, columns: number): Spot {
|
|
40
38
|
const before = line.slice(0, index)
|
|
41
|
-
const width =
|
|
39
|
+
const width = run_board_fit.width_of(before)
|
|
42
40
|
const style = (before.match(SGR) ?? []).join('')
|
|
43
41
|
|
|
44
42
|
return { row: row + Math.floor(width / columns), column: (width % columns) + 1, style }
|
|
@@ -88,6 +88,8 @@ interface RunActivity extends Partial<SetupRead> {
|
|
|
88
88
|
const KIND = run_event_stream.EVENT_KIND
|
|
89
89
|
const ENDING_STATES: Readonly<Partial<Record<string, ItemState>>> = {
|
|
90
90
|
[KIND.MERGE]: 'merged',
|
|
91
|
+
// A drive-closed measurement completes its issue as a merge does (`issue-merged.ts` → `is_measured`).
|
|
92
|
+
[KIND.MEASURED]: 'merged',
|
|
91
93
|
[KIND.PARK]: 'parked',
|
|
92
94
|
[KIND.SPLIT]: 'done',
|
|
93
95
|
[KIND.STOP]: 'done',
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { lane_investigation_switch } from '#scripts/lane/lane-investigation-switch'
|
|
1
2
|
import type { ClosedIssue } from './run-board-closed'
|
|
2
3
|
import type { EarlierLanes } from './run-board-earlier'
|
|
3
4
|
import type { FrameBounds } from './run-board-fold'
|
|
@@ -6,7 +7,7 @@ import { run_board_github } from './run-board-github'
|
|
|
6
7
|
import { run_board_header, type BoardHeader } from './run-board-header'
|
|
7
8
|
import { run_board_labels } from './run-board-labels'
|
|
8
9
|
import { run_board_layout, type BoardLayout, type BoardPlan } from './run-board-layout'
|
|
9
|
-
import { run_board_link } from './run-board-link'
|
|
10
|
+
import { run_board_link, type Link } from './run-board-link'
|
|
10
11
|
import { run_board_notes, type Titles } from './run-board-notes'
|
|
11
12
|
import type { LocalRead } from './run-board-read'
|
|
12
13
|
import { run_board_reason, type ReasonRead } from './run-board-reason'
|
|
@@ -93,15 +94,17 @@ function activity_here(local: LocalRead): RunActivity {
|
|
|
93
94
|
|
|
94
95
|
type RoomRead = Pick<
|
|
95
96
|
ReasonRead,
|
|
96
|
-
'free_lanes' | 'occupied_count' | 'lane_limit' | 'is_memory_held' | 'gauges'
|
|
97
|
+
'free_lanes' | 'occupied_count' | 'lane_limit' | 'usage_reset_ms' | 'is_memory_held' | 'gauges'
|
|
97
98
|
>
|
|
98
99
|
|
|
99
|
-
// The room a waiting row is weighed against: the lanes under the limit,
|
|
100
|
+
// The room a waiting row is weighed against: the lanes under the limit, the account's usage limit and
|
|
101
|
+
// the machine's memory.
|
|
100
102
|
function room_of(state: BoardState, local: LocalRead): RoomRead {
|
|
101
103
|
return {
|
|
102
104
|
free_lanes: local.free_lanes,
|
|
103
105
|
occupied_count: local.occupied_count,
|
|
104
106
|
lane_limit: local.lane_limit,
|
|
107
|
+
usage_reset_ms: local.usage_reset_ms,
|
|
105
108
|
is_memory_held: local.is_memory_held,
|
|
106
109
|
gauges: state.gauges,
|
|
107
110
|
}
|
|
@@ -131,7 +134,12 @@ function earlier_here(local: LocalRead): EarlierLanes {
|
|
|
131
134
|
}
|
|
132
135
|
|
|
133
136
|
// The plan laid under its statuses, each waiting row saying why it waits.
|
|
134
|
-
function planned_layout(
|
|
137
|
+
function planned_layout(
|
|
138
|
+
state: BoardState,
|
|
139
|
+
plan: BoardPlan,
|
|
140
|
+
local: LocalRead,
|
|
141
|
+
now_ms: number,
|
|
142
|
+
): BoardLayout {
|
|
135
143
|
const statuses = planned_statuses(state, plan, local)
|
|
136
144
|
const reason_of = run_board_reason.reader({
|
|
137
145
|
plan,
|
|
@@ -140,6 +148,7 @@ function planned_layout(state: BoardState, plan: BoardPlan, local: LocalRead): B
|
|
|
140
148
|
...room_of(state, local),
|
|
141
149
|
carry: local.carry,
|
|
142
150
|
is_stopped: activity_here(local).is_stopped,
|
|
151
|
+
now_ms,
|
|
143
152
|
})
|
|
144
153
|
|
|
145
154
|
return run_board_layout.layout_of(
|
|
@@ -152,8 +161,8 @@ function planned_layout(state: BoardState, plan: BoardPlan, local: LocalRead): B
|
|
|
152
161
|
|
|
153
162
|
// The statuses scoped to the run's plan, a running child GitHub read closed settled.
|
|
154
163
|
// Before the plan is read, the run's own children alone, named and settled as the snapshot left them.
|
|
155
|
-
function layout_for(state: BoardState, local: LocalRead): BoardLayout {
|
|
156
|
-
if (state.plan !== undefined) return planned_layout(state, state.plan, local)
|
|
164
|
+
function layout_for(state: BoardState, local: LocalRead, now_ms: number): BoardLayout {
|
|
165
|
+
if (state.plan !== undefined) return planned_layout(state, state.plan, local, now_ms)
|
|
157
166
|
|
|
158
167
|
const read = open_read_of(state, undefined)
|
|
159
168
|
const statuses = run_board_status.settle_closed(statuses_for(state, local), read)
|
|
@@ -168,10 +177,18 @@ interface Redraw {
|
|
|
168
177
|
now_ms: number
|
|
169
178
|
}
|
|
170
179
|
|
|
171
|
-
// What the header reads off the local read
|
|
180
|
+
// What the header reads off the local read, and the investigation switch off this machine's
|
|
181
|
+
// environment, `.env` loaded as for `run:merge`.
|
|
172
182
|
type LocalHeader = Pick<
|
|
173
183
|
BoardHeader,
|
|
174
|
-
|
|
184
|
+
| 'started_ms'
|
|
185
|
+
| 'ended_ms'
|
|
186
|
+
| 'activity'
|
|
187
|
+
| 'operations'
|
|
188
|
+
| 'usual'
|
|
189
|
+
| 'lane_limit'
|
|
190
|
+
| 'found'
|
|
191
|
+
| 'is_investigation_on'
|
|
175
192
|
>
|
|
176
193
|
|
|
177
194
|
function local_header(local: LocalRead): LocalHeader {
|
|
@@ -182,6 +199,18 @@ function local_header(local: LocalRead): LocalHeader {
|
|
|
182
199
|
operations: local.operations,
|
|
183
200
|
usual: local.usual,
|
|
184
201
|
lane_limit: local.lane_limit,
|
|
202
|
+
found: local.found,
|
|
203
|
+
is_investigation_on: lane_investigation_switch.is_on(),
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// The issue references and pull request numbers linked into `repo`, plain before a plan is read.
|
|
208
|
+
type Links = Pick<BoardHeader, 'link' | 'pull_link'>
|
|
209
|
+
|
|
210
|
+
function links_of(repo: string | undefined, link: Link): Links {
|
|
211
|
+
return {
|
|
212
|
+
link: run_board_link.linker(repo, link),
|
|
213
|
+
pull_link: run_board_link.pull_linker(repo, link),
|
|
185
214
|
}
|
|
186
215
|
}
|
|
187
216
|
|
|
@@ -207,7 +236,7 @@ function header_of(
|
|
|
207
236
|
form: redraw.ports.form,
|
|
208
237
|
repo: state.plan?.context.repo,
|
|
209
238
|
spinner: redraw.ports.is_tty ? SPOT : undefined,
|
|
210
|
-
|
|
239
|
+
...links_of(state.plan?.context.repo, redraw.ports.link),
|
|
211
240
|
}
|
|
212
241
|
}
|
|
213
242
|
|
|
@@ -242,7 +271,7 @@ function draw(ports: BoardPorts, lines: ReadonlyArray<string>): void {
|
|
|
242
271
|
// The first total the plan gives is the baseline every later arrival is counted against; the run's own
|
|
243
272
|
// children before it are no total.
|
|
244
273
|
function draw_run(state: BoardState, local: LocalRead, redraw: Redraw): BoardState {
|
|
245
|
-
const layout = layout_for(state, local)
|
|
274
|
+
const layout = layout_for(state, local, redraw.now_ms)
|
|
246
275
|
const first_total =
|
|
247
276
|
state.plan === undefined ? undefined : run_board_header.counts_of(layout).total
|
|
248
277
|
const settled = { ...state, baseline_total: state.baseline_total ?? first_total }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import path from 'node:path'
|
|
2
|
+
import { durable_state } from '#scripts/josh/durable-state'
|
|
2
3
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
4
|
import { json_value } from '#scripts/lib/json-value'
|
|
4
5
|
import { z } from 'zod'
|
|
@@ -17,7 +18,7 @@ import type { CarryRead } from './run-carry'
|
|
|
17
18
|
// **One record, overwritten by the next `--end`**: the board keeps only the run before the next one, and
|
|
18
19
|
// a run that begins replaces nothing here — its carry record is what the board reads while it runs.
|
|
19
20
|
|
|
20
|
-
const ENDED_PREFIX =
|
|
21
|
+
const ENDED_PREFIX = durable_state.PREFIX.ENDED
|
|
21
22
|
const TRANSCRIPT_SUFFIX = '.jsonl'
|
|
22
23
|
|
|
23
24
|
const ended_run_schema = z.object({
|
|
@@ -32,7 +33,7 @@ type EndedRun = z.infer<typeof ended_run_schema>
|
|
|
32
33
|
|
|
33
34
|
// Keyed on the common git directory, as the carry record is, so every lane reads the same one.
|
|
34
35
|
function ended_path(git_directory: string): string {
|
|
35
|
-
return
|
|
36
|
+
return durable_state.path(ENDED_PREFIX, git_directory)
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
function session_of(transcript: string | undefined): string | undefined {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { durable_state } from '#scripts/josh/durable-state'
|
|
2
3
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
3
4
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
4
5
|
import { json_value } from '#scripts/lib/json-value'
|
|
@@ -35,7 +36,7 @@ import { run_carry_conversation } from './run-carry-conversation'
|
|
|
35
36
|
// reaches, so only a cut the run itself took is carried without anyone deciding. Everything else is
|
|
36
37
|
// an explicit carry-or-discard: `--resume` adopts the standing record, `--end` discards it.
|
|
37
38
|
|
|
38
|
-
const CARRY_PREFIX =
|
|
39
|
+
const CARRY_PREFIX = durable_state.PREFIX.CARRY
|
|
39
40
|
const REPOSITORY_DIRECTORY_INDEX = 1
|
|
40
41
|
const NO_INCREMENT = 0
|
|
41
42
|
|
|
@@ -212,7 +213,7 @@ const run_carry_schema = z.object({
|
|
|
212
213
|
})
|
|
213
214
|
|
|
214
215
|
function carry_path(git_directory: string): string {
|
|
215
|
-
return
|
|
216
|
+
return durable_state.path(CARRY_PREFIX, git_directory)
|
|
216
217
|
}
|
|
217
218
|
|
|
218
219
|
// The common git directory: `.git` in the main work tree and the same `.git` from inside a lane, so
|
|
@@ -4,19 +4,22 @@ import { agent_session_role } from '#scripts/agent/agent-session-role'
|
|
|
4
4
|
import { cost_cli } from '#scripts/cost-runtime/cost-cli'
|
|
5
5
|
import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
6
6
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
7
|
-
import { session_cite } from '#scripts/issue/session-cite'
|
|
8
7
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
9
8
|
import { lane_relaunch } from '#scripts/lane/lane-relaunch'
|
|
10
9
|
import { openai_lane_supervisor } from '#scripts/lane/openai-lane-supervisor'
|
|
11
10
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
12
11
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
13
12
|
import { run_cli_fault } from '#scripts/run/run-cli-fault'
|
|
14
|
-
import {
|
|
13
|
+
import { split_resolution } from '#scripts/split/split-resolution'
|
|
14
|
+
import { run_cut } from './run-cut'
|
|
15
15
|
import { run_cut_args, type Request } from './run-cut-args'
|
|
16
16
|
import { run_cut_decline } from './run-cut-decline'
|
|
17
|
+
import { run_cut_digest } from './run-cut-digest'
|
|
17
18
|
import { run_cut_handoff } from './run-cut-handoff'
|
|
18
19
|
import { run_cut_ready } from './run-cut-ready'
|
|
19
20
|
import { run_cut_report } from './run-cut-report'
|
|
21
|
+
import { run_cut_resume } from './run-cut-resume'
|
|
22
|
+
import { run_cut_review } from './run-cut-review'
|
|
20
23
|
|
|
21
24
|
// `josh run:cut` — the record that lets a lane child end its process before the gate and a fresh one
|
|
22
25
|
// resume from it. `run:cut <N>` writes the record and relaunches a fresh
|
|
@@ -40,15 +43,13 @@ const {
|
|
|
40
43
|
FAILED_VERDICT,
|
|
41
44
|
FAILURE_EXIT_CODE,
|
|
42
45
|
FRESH_VERDICT,
|
|
43
|
-
HANDED_OFF_VERDICT,
|
|
44
46
|
HANDOFF_MISSING_NOTE,
|
|
45
47
|
HANDOFF_OVERFLOW_NOTE,
|
|
46
|
-
INCOMPLETE_VERDICT,
|
|
47
48
|
NOT_A_LANE_VERDICT,
|
|
48
49
|
OVER_VERDICT,
|
|
49
50
|
RESUME_IMPL_VERDICT,
|
|
50
51
|
RESUME_VERDICT,
|
|
51
|
-
|
|
52
|
+
SPLIT_UNRESOLVED_VERDICT,
|
|
52
53
|
SUCCESS_EXIT_CODE,
|
|
53
54
|
UNDER_THRESHOLD_VERDICT,
|
|
54
55
|
UNREADY_VERDICT,
|
|
@@ -57,27 +58,33 @@ const {
|
|
|
57
58
|
report_bad_handoff,
|
|
58
59
|
report_busy,
|
|
59
60
|
report_fault,
|
|
60
|
-
report_handed_off,
|
|
61
61
|
report_held_cut,
|
|
62
|
-
|
|
63
|
-
report_over,
|
|
62
|
+
report_missing_supervisor,
|
|
64
63
|
report_relaunched_cut,
|
|
65
64
|
report_reviewer,
|
|
66
|
-
|
|
65
|
+
report_split_unresolved,
|
|
67
66
|
report_under_threshold,
|
|
68
67
|
report_unknown,
|
|
69
|
-
report_unreadable,
|
|
70
68
|
} = run_cut_report
|
|
71
69
|
|
|
72
70
|
// **The pre-gate cut is conditional on the same statistic the implementation-phase cut reads**.
|
|
73
|
-
// `cost_cli.session_verdict` prices the newest request against `
|
|
71
|
+
// `cost_cli.session_verdict` prices the newest request against the `--cut` break-even, so no second
|
|
74
72
|
// threshold is introduced — an `under` session skips the cut, and an unmeasurable one still cuts as
|
|
75
73
|
// the safety net. Only the pre-gate phase is checked here; the implementation-phase caller gates its own
|
|
76
74
|
// `--impl` cut on `pnpm josh cost --cut` before it is ever issued.
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
//
|
|
76
|
+
// **A noticed Issue answers the split notice first** (joshuafolkken/kit#4695): the pre-gate cut is the
|
|
77
|
+
// boundary the notice names, so a lane that neither split nor recorded why is refused whether or not
|
|
78
|
+
// the cut itself would be taken. Returns the answer given without cutting, or `undefined`.
|
|
79
|
+
async function pre_gate_answer(issue: string, phase: string): Promise<number | undefined> {
|
|
80
|
+
if (phase !== run_cut.PRE_GATE_PHASE) return undefined
|
|
81
|
+
const split_note = await split_resolution.ledger_refusal(Number(issue))
|
|
82
|
+
|
|
83
|
+
if (split_note !== undefined) return report_split_unresolved(split_note)
|
|
79
84
|
|
|
80
85
|
return cost_cli.session_verdict() === cost_verdict.UNDER_VERDICT
|
|
86
|
+
? report_under_threshold()
|
|
87
|
+
: undefined
|
|
81
88
|
}
|
|
82
89
|
|
|
83
90
|
// The exclusive create lost, so a cut is already in flight for this tree — the double-cut guard. The
|
|
@@ -103,18 +110,11 @@ function report_relaunch_failure(target: string, note: string): number {
|
|
|
103
110
|
return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
|
|
104
111
|
}
|
|
105
112
|
|
|
106
|
-
function report_missing_supervisor(issue: string): number {
|
|
107
|
-
console.error(
|
|
108
|
-
`The OpenAI supervisor for ${session_cite.issue(issue)} is not live, so this nested process was not cut and can continue. Re-dispatch the lane to recover the supervisor.`,
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
113
|
// **The relaunched child is started at the effort of the phase it is resuming into**.
|
|
115
114
|
// A pre-gate resume drives the gate, commit, PR and merge — the mechanical
|
|
116
115
|
// ship/bookkeeping region, lowered — while an implementation resume keeps the role default. The
|
|
117
|
-
// phase-aware profile is `agent_argv.resume_argv`'s; a person's `JOSH_WORKER_EFFORT` still wins over it
|
|
116
|
+
// phase-aware profile is `agent_argv.resume_argv`'s; a person's `JOSH_WORKER_EFFORT` still wins over it,
|
|
117
|
+
// and a pre-gate resume moves to `JOSH_WORKER_SHIP_MODEL` when that is set.
|
|
118
118
|
function relaunch(target: string, lane: LaneInfo, phase: string): number {
|
|
119
119
|
const notes: Array<string> = []
|
|
120
120
|
const result = lane_relaunch.resume(lane, phase, (note) => {
|
|
@@ -177,14 +177,18 @@ async function write_cut(target: string, request: CutRequest): Promise<number |
|
|
|
177
177
|
const loaded = run_cut_handoff.load_handoff(request.handoff_path, run_cut.MAX_HANDOFF_BYTES)
|
|
178
178
|
if (loaded.kind === 'bad') return report_bad_handoff(loaded.note)
|
|
179
179
|
|
|
180
|
-
const
|
|
180
|
+
const base = {
|
|
181
181
|
issue: request.issue,
|
|
182
182
|
branch: request.branch,
|
|
183
183
|
phase: request.phase,
|
|
184
184
|
handoff: loaded.handoff,
|
|
185
185
|
}
|
|
186
|
+
// The checkout, not `target`: the record lives in the temp root, and the transcript is filed by checkout.
|
|
187
|
+
const checkout = await run_cut.worktree_directory()
|
|
188
|
+
const spec = run_cut.with_digest(base, () => run_cut_digest.own_digest(checkout))
|
|
186
189
|
|
|
187
|
-
const spec_note =
|
|
190
|
+
const spec_note =
|
|
191
|
+
spec_refusal(spec) ?? (await run_cut_review.unrecorded_refusal(request, loaded.handoff))
|
|
188
192
|
|
|
189
193
|
if (spec_note !== undefined) return report_bad_handoff(spec_note)
|
|
190
194
|
if (run_cut.begin_cut(target, spec) === undefined) return report_cut_exists(target)
|
|
@@ -247,7 +251,9 @@ async function cut(
|
|
|
247
251
|
return await declined({ issue, phase }, state, refuse_unready(state))
|
|
248
252
|
}
|
|
249
253
|
|
|
250
|
-
|
|
254
|
+
const answered = await pre_gate_answer(issue, phase)
|
|
255
|
+
|
|
256
|
+
if (answered !== undefined) return answered
|
|
251
257
|
|
|
252
258
|
clear_expired(target)
|
|
253
259
|
if (!has_matching_supervisor(lane, issue)) return report_missing_supervisor(issue)
|
|
@@ -255,111 +261,6 @@ async function cut(
|
|
|
255
261
|
return await finish_cut(target, lane, { issue, branch: state.branch, phase, handoff_path })
|
|
256
262
|
}
|
|
257
263
|
|
|
258
|
-
// **The adoption is the resume-uniqueness guarantee**: it removes and creates exclusively, so of two
|
|
259
|
-
// racing resumes only one wins the create and the loser is answered `busy`.
|
|
260
|
-
// An implementation cut resumes back into implementation; a pre-gate one into the gate. The resuming
|
|
261
|
-
// child is told which by the verdict rather than reconstructing it from the record.
|
|
262
|
-
function resume_verdict_for(cut_record: RunCut): string {
|
|
263
|
-
return run_cut.resumes_into_implementation(cut_record.phase)
|
|
264
|
-
? RESUME_IMPL_VERDICT
|
|
265
|
-
: RESUME_VERDICT
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// **An implementation resume removes the record; a pre-gate one marks it handed off**.
|
|
269
|
-
// The cuts have different multiplicities sharing one record: the pre-gate cut fires once per lane, so
|
|
270
|
-
// its record must survive to answer a second resume `handed-off`; the implementation cut is guarded by the run's
|
|
271
|
-
// event stream rather than the cut record, so its record is cleared on resume — a lingering record
|
|
272
|
-
// would keep the pre-gate guard, which reads `carried_cut_sync`, silent for the rest of the run. A double
|
|
273
|
-
// cut stays impossible either way: `begin_cut`'s exclusive create is what prevents it.
|
|
274
|
-
function take_over(target: string, cut_record: RunCut): RunCut | undefined {
|
|
275
|
-
if (!run_cut.resumes_into_implementation(cut_record.phase)) {
|
|
276
|
-
return run_cut.adopt_cut(target, cut_record)
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
run_cut.end_cut(target)
|
|
280
|
-
|
|
281
|
-
return cut_record
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// The carried instruction and work state, printed to standard error so the resumed session continues
|
|
285
|
-
// on what the run was told to do rather than on the tree alone. The record is cleared
|
|
286
|
-
// on adoption, so this is where it reaches the fresh process.
|
|
287
|
-
function announce_handoff(cut_record: RunCut): void {
|
|
288
|
-
if (cut_record.handoff !== undefined) {
|
|
289
|
-
console.error(run_cut_handoff.describe_handoff(cut_record.handoff))
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
// **An implementation resume appends a `resume` event**. It clears the record
|
|
294
|
-
// the `cut` event stood for, so the stream is what moves `run:step` back to implementation; a pre-gate
|
|
295
|
-
// resume keeps its record and appends nothing. Best-effort, as the cut's own append is.
|
|
296
|
-
async function emit_resume_event(issue: string, verdict: string): Promise<void> {
|
|
297
|
-
if (verdict !== RESUME_IMPL_VERDICT) return
|
|
298
|
-
|
|
299
|
-
await run_event_stream_emit.emit(
|
|
300
|
-
run_event_stream.EVENT_KIND.RESUME,
|
|
301
|
-
`${issue_cite.plain(issue)} resumed`,
|
|
302
|
-
)
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
async function adopt(target: string, cut_record: RunCut): Promise<number> {
|
|
306
|
-
const taken = take_over(target, cut_record)
|
|
307
|
-
|
|
308
|
-
if (taken === undefined) return report_busy(cut_record)
|
|
309
|
-
|
|
310
|
-
announce_handoff(cut_record)
|
|
311
|
-
|
|
312
|
-
const verdict = resume_verdict_for(cut_record)
|
|
313
|
-
|
|
314
|
-
await emit_resume_event(cut_record.issue, verdict)
|
|
315
|
-
|
|
316
|
-
return report(verdict, SUCCESS_EXIT_CODE)
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// A relaunched lane child and a fresh session both measure `under`, so only the session that took an
|
|
320
|
-
// implementation cut resumes over the threshold; unmeasurable is not refused.
|
|
321
|
-
function is_over_threshold_resume(cut_record: RunCut): boolean {
|
|
322
|
-
if (!run_cut.resumes_into_implementation(cut_record.phase)) return false
|
|
323
|
-
|
|
324
|
-
return cost_cli.session_verdict() === cost_verdict.OVER_VERDICT
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
async function verify_and_adopt(
|
|
328
|
-
target: string,
|
|
329
|
-
cut_record: RunCut,
|
|
330
|
-
issue: string,
|
|
331
|
-
): Promise<number> {
|
|
332
|
-
const state = await run_cut.current_state()
|
|
333
|
-
const verdict = run_cut.classify_resume(cut_record, {
|
|
334
|
-
issue,
|
|
335
|
-
current_branch: state.branch,
|
|
336
|
-
is_dirty: state.is_dirty,
|
|
337
|
-
is_held: state.is_held,
|
|
338
|
-
})
|
|
339
|
-
|
|
340
|
-
if (verdict === HANDED_OFF_VERDICT) return report_handed_off(cut_record)
|
|
341
|
-
|
|
342
|
-
if (verdict === 'stale') return report_stale(cut_record)
|
|
343
|
-
|
|
344
|
-
if (verdict === INCOMPLETE_VERDICT) return report_incomplete(cut_record)
|
|
345
|
-
|
|
346
|
-
if (is_over_threshold_resume(cut_record)) return report_over()
|
|
347
|
-
|
|
348
|
-
return await adopt(target, cut_record)
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
async function resume(target: string, issue: string): Promise<number> {
|
|
352
|
-
const read = run_cut.read_cut(target)
|
|
353
|
-
|
|
354
|
-
if (read.kind === 'none') return report(FRESH_VERDICT, SUCCESS_EXIT_CODE)
|
|
355
|
-
|
|
356
|
-
if (read.kind === 'unreadable') return report_unreadable()
|
|
357
|
-
|
|
358
|
-
if (read.kind === 'expired') return report_stale(read.cut)
|
|
359
|
-
|
|
360
|
-
return await verify_and_adopt(target, read.cut, issue)
|
|
361
|
-
}
|
|
362
|
-
|
|
363
264
|
function read_json(target: string): number {
|
|
364
265
|
const read = run_cut.read_cut(target)
|
|
365
266
|
const cut_record = read.kind === 'carried' || read.kind === 'expired' ? read.cut : undefined
|
|
@@ -395,7 +296,7 @@ async function take_cut(target: string, request: CutCommand): Promise<number> {
|
|
|
395
296
|
async function act(target: string, request: Request): Promise<number> {
|
|
396
297
|
if (request.kind === 'cut') return await take_cut(target, request)
|
|
397
298
|
|
|
398
|
-
if (request.kind === 'resume') return await resume(target, request.issue)
|
|
299
|
+
if (request.kind === 'resume') return await run_cut_resume.resume(target, request.issue)
|
|
399
300
|
|
|
400
301
|
if (request.kind === 'read') return read_json(target)
|
|
401
302
|
|
|
@@ -447,12 +348,11 @@ const run_cut_cli = {
|
|
|
447
348
|
ENDED_VERDICT,
|
|
448
349
|
FAILED_VERDICT,
|
|
449
350
|
FRESH_VERDICT,
|
|
450
|
-
HANDED_OFF_VERDICT,
|
|
451
351
|
NOT_A_LANE_VERDICT,
|
|
452
352
|
OVER_VERDICT,
|
|
453
353
|
RESUME_IMPL_VERDICT,
|
|
454
354
|
RESUME_VERDICT,
|
|
455
|
-
|
|
355
|
+
SPLIT_UNRESOLVED_VERDICT,
|
|
456
356
|
UNDER_THRESHOLD_VERDICT,
|
|
457
357
|
UNREADY_VERDICT,
|
|
458
358
|
run,
|