@joshuafolkken/kit 1.1784.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/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 +59 -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 +415 -389
- 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 +15 -8
- 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,12 +1,18 @@
|
|
|
1
1
|
import type { JoshResult } from '#scripts/josh/josh-run'
|
|
2
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
|
-
import {
|
|
3
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
4
|
+
import { review_attest, type ReviewSlot } from '#scripts/review/review-attest'
|
|
4
5
|
import { review_interaction } from '#scripts/review/review-interaction'
|
|
5
|
-
import {
|
|
6
|
+
import { review_reviewed_tree } from '#scripts/review/review-reviewed-tree'
|
|
7
|
+
import { review_round_reuse, type ReuseAnswer } from '#scripts/review/review-round-reuse'
|
|
6
8
|
import { review_round2 } from '#scripts/review/review-round2'
|
|
9
|
+
import { review_stop_log } from '#scripts/review/review-stop-log'
|
|
10
|
+
import { run_review } from '#scripts/run/review/run-review'
|
|
7
11
|
import { run_ship_review, type RoundOutcome, type ScoredVerdict } from './run-ship-review'
|
|
12
|
+
import { run_ship_review_reason } from './run-ship-review-reason'
|
|
8
13
|
import { run_ship_reviewer, type Round } from './run-ship-reviewer'
|
|
9
14
|
import { run_ship_scoped } from './run-ship-scoped'
|
|
15
|
+
import { run_ship_stage } from './run-ship-stage'
|
|
10
16
|
import { run_ship_stop_cause } from './run-ship-stop-cause'
|
|
11
17
|
import type { StepResult } from './run-ship-sync'
|
|
12
18
|
|
|
@@ -24,7 +30,7 @@ import type { StepResult } from './run-ship-sync'
|
|
|
24
30
|
// **Round 1's local fixes and round 2 stay inside the supervisor**. A round-1
|
|
25
31
|
// reviewer that fixed its local Mediums in place changed the tree the background gate read, so that
|
|
26
32
|
// join drains the gate rather than judging it — the ship's gate stage re-runs on the fixed tree. After
|
|
27
|
-
// the commit, `round_two_stage` asks `review:round2 --
|
|
33
|
+
// the commit, `round_two_stage` asks `review:round2 --record <N>` whether the fix delta owes a
|
|
28
34
|
// second round, and on `required` runs it through the same commands the chain does: the scoped pair
|
|
29
35
|
// `review:brief` requires, `review:brief --round 2`, a fresh reviewer session, attest and record.
|
|
30
36
|
//
|
|
@@ -37,7 +43,13 @@ import type { StepResult } from './run-ship-sync'
|
|
|
37
43
|
// recorded first, because the round was attested, then routed back.
|
|
38
44
|
|
|
39
45
|
const RUN_REVIEW = 'run:review'
|
|
40
|
-
|
|
46
|
+
|
|
47
|
+
// `--record` names the issue whose ledger dispositions decide round 1's closure, and where a skip
|
|
48
|
+
// is commented (joshuafolkken/kit#5286).
|
|
49
|
+
function round_two_decision(issue: string): ReadonlyArray<string> {
|
|
50
|
+
return ['review:round2', '--record', issue, '--json']
|
|
51
|
+
}
|
|
52
|
+
|
|
41
53
|
const REVIEW_BRIEF = 'review:brief'
|
|
42
54
|
const ROUND_TWO_BRIEF = [REVIEW_BRIEF, '--round', '2']
|
|
43
55
|
const INTERACTION_FLAG = '--interaction'
|
|
@@ -49,12 +61,22 @@ const FIXED_JOIN_NOTE =
|
|
|
49
61
|
'the round-1 gate read the tree before the review fixes — drained, not judged; the gate re-runs once the tree is fixed.'
|
|
50
62
|
const ROUND_TWO_SKIPPED_NOTE = 'round 2 not due — nothing left to verify; shipping on.'
|
|
51
63
|
const ROUND_ONE_RECORDED_NOTE =
|
|
52
|
-
'round 1 already recorded
|
|
64
|
+
'round 1 already recorded — reused, not reviewed again; round 2 decides on the fix delta after the commit.'
|
|
53
65
|
|
|
54
66
|
// The scoped pair's precondition, met by the supervisor itself rather than stopped on,
|
|
55
67
|
// single-sourced with the preflight and gate stages.
|
|
56
68
|
const { run_phases, scoped_pair } = run_ship_scoped
|
|
57
69
|
const { CAUSE } = run_ship_stop_cause
|
|
70
|
+
const { CODE, INTERACTION } = review_attest.REVIEW_SLOT
|
|
71
|
+
// `run:review` opens code's brief alone here: the interaction slot's is the ship's own open beside it.
|
|
72
|
+
const ROUND_ONE_OPENS: Readonly<Record<ReviewSlot, ReadonlyArray<string>>> = {
|
|
73
|
+
code: [RUN_REVIEW, run_review.CODE_ONLY_FLAG],
|
|
74
|
+
interaction: INTERACTION_BRIEF,
|
|
75
|
+
}
|
|
76
|
+
const SLOT_RECORD_FLAGS: Readonly<Record<ReviewSlot, ReadonlyArray<string>>> = {
|
|
77
|
+
code: [],
|
|
78
|
+
interaction: [INTERACTION_FLAG],
|
|
79
|
+
}
|
|
58
80
|
const {
|
|
59
81
|
attest_phase,
|
|
60
82
|
current_verdict,
|
|
@@ -63,6 +85,7 @@ const {
|
|
|
63
85
|
note,
|
|
64
86
|
paths,
|
|
65
87
|
reviewed,
|
|
88
|
+
reviewed_together,
|
|
66
89
|
ROUND_ONE,
|
|
67
90
|
ROUND_TWO,
|
|
68
91
|
SUCCESS_EXIT_CODE,
|
|
@@ -75,15 +98,27 @@ const {
|
|
|
75
98
|
// its end, so the gate stage that follows never races it. Any fix drains it, not only a round whose
|
|
76
99
|
// every finding was fixed — a partial fix moved the tree just the same, and the round then stops on its
|
|
77
100
|
// unfixed finding at the record rather than on a `Gate RED` the gate never earned.
|
|
78
|
-
|
|
101
|
+
// Either slot's reviewer fixing in place moved the tree.
|
|
102
|
+
function has_fixes(slots: ReadonlyArray<ReviewSlot>): boolean {
|
|
103
|
+
return slots.some((slot) =>
|
|
104
|
+
run_ship_review.has_fixes(stamp_file.read_stamp_text(paths(slot).findings)),
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// **The tree is asked first, the findings file second** (joshuafolkken/kit#4774): a gate that passed on
|
|
109
|
+
// a tree that has since moved exits the join with its own code, which drains it whatever the reviewer
|
|
110
|
+
// wrote, or failed to write, at its findings path. An unpinned change is never drained
|
|
111
|
+
// (joshuafolkken/kit#4770): a reviewer's fix moved the tree, not the probe's answer.
|
|
112
|
+
function is_drained(code: number, slots: ReadonlyArray<ReviewSlot>): boolean {
|
|
113
|
+
if (code === run_review.UNPINNED_EXIT_CODE) return false
|
|
114
|
+
|
|
115
|
+
return code === run_review.MOVED_EXIT_CODE || has_fixes(slots)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function join_gate(slots: ReadonlyArray<ReviewSlot>): Promise<JoshResult> {
|
|
79
119
|
const joined = await josh([RUN_REVIEW, '--join'])
|
|
80
120
|
|
|
81
|
-
if (
|
|
82
|
-
joined.code === SUCCESS_EXIT_CODE ||
|
|
83
|
-
!run_ship_review.has_fixes(stamp_file.read_stamp_text(paths().findings))
|
|
84
|
-
) {
|
|
85
|
-
return joined
|
|
86
|
-
}
|
|
121
|
+
if (joined.code === SUCCESS_EXIT_CODE || !is_drained(joined.code, slots)) return joined
|
|
87
122
|
|
|
88
123
|
note(FIXED_JOIN_NOTE)
|
|
89
124
|
|
|
@@ -93,28 +128,36 @@ async function join_gate(): Promise<JoshResult> {
|
|
|
93
128
|
// **A passing round 2 is recorded on the issue, not in the tree**: it ran after the commit and reads
|
|
94
129
|
// only, so no commit of the run's follows it, and a line appended now would be pushed onto the open
|
|
95
130
|
// pull request by `pnpm josh followup` — restarting the CI the round ran beside. A blocking round 2
|
|
96
|
-
//
|
|
131
|
+
// on a pushed, clean tree goes to the issue as well (`review-record-comment.ts`).
|
|
97
132
|
function record_flags(round: Round, outcome: RoundOutcome): ReadonlyArray<string> {
|
|
98
133
|
return round === ROUND_TWO && outcome.is_passing ? [COMMENT_FLAG] : []
|
|
99
134
|
}
|
|
100
135
|
|
|
101
|
-
//
|
|
136
|
+
// The interaction slot records with `--interaction`, its `- ri:` line.
|
|
102
137
|
async function record_and_route(
|
|
103
138
|
issue: string,
|
|
104
139
|
round: Round,
|
|
105
140
|
outcome_of: (verdict: ScoredVerdict) => RoundOutcome,
|
|
106
|
-
|
|
107
|
-
): Promise<
|
|
108
|
-
const verdict = current_verdict()
|
|
141
|
+
slot: ReviewSlot = CODE,
|
|
142
|
+
): Promise<StepResult> {
|
|
143
|
+
const verdict = current_verdict(slot)
|
|
109
144
|
|
|
110
145
|
if (verdict.kind === run_ship_review.VERDICT.INVALID) return failure(verdict.note, CAUSE.INFRA)
|
|
111
146
|
|
|
112
147
|
const outcome = outcome_of(verdict)
|
|
113
|
-
const flags = [...
|
|
114
|
-
const
|
|
148
|
+
const flags = [...SLOT_RECORD_FLAGS[slot], ...record_flags(round, outcome)]
|
|
149
|
+
const specs = run_ship_review.recorded_specs(verdict, outcome)
|
|
150
|
+
const recorded = await josh(['review:record', '--issue', issue, ...flags, ...specs])
|
|
115
151
|
|
|
116
152
|
if (recorded.code !== SUCCESS_EXIT_CODE) return tagged(CAUSE.CHECK, recorded)
|
|
117
153
|
|
|
154
|
+
review_stop_log.record({
|
|
155
|
+
issue: Number(issue),
|
|
156
|
+
stage: run_ship_stage.STAGE.REVIEW,
|
|
157
|
+
findings: run_ship_review.passing_fixes(verdict, outcome),
|
|
158
|
+
is_fixed: true,
|
|
159
|
+
})
|
|
160
|
+
|
|
118
161
|
const out = [...verdict.report, outcome.note].join('\n')
|
|
119
162
|
|
|
120
163
|
return outcome.is_passing ? { code: SUCCESS_EXIT_CODE, out } : failure(out, CAUSE.FINDING)
|
|
@@ -122,78 +165,206 @@ async function record_and_route(
|
|
|
122
165
|
|
|
123
166
|
// Fixes made in place are counted only once the scoped pair is green on the fixed tree. The reviewer is
|
|
124
167
|
// asked to leave it green; this is the check that it did, and a fix it could not get green is routed as
|
|
125
|
-
// the finding it still is — recorded, then stopped before the gate and the commit take it in.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const
|
|
129
|
-
|
|
168
|
+
// the finding it still is — recorded, then stopped before the gate and the commit take it in. One
|
|
169
|
+
// scoped pair answers for every slot's fixes: they share the tree.
|
|
170
|
+
async function is_fix_verified(slots: ReadonlyArray<ReviewSlot>): Promise<boolean> {
|
|
171
|
+
const is_fixed = slots.some(
|
|
172
|
+
(slot) => current_verdict(slot).kind === run_ship_review.VERDICT.FIXED,
|
|
173
|
+
)
|
|
130
174
|
|
|
175
|
+
if (!is_fixed) return true
|
|
176
|
+
|
|
177
|
+
const checked = await scoped_pair()
|
|
178
|
+
|
|
179
|
+
return checked.code === SUCCESS_EXIT_CODE
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async function round_one_record(
|
|
183
|
+
issue: string,
|
|
184
|
+
slot: ReviewSlot,
|
|
185
|
+
is_verified: boolean,
|
|
186
|
+
): Promise<StepResult> {
|
|
131
187
|
return await record_and_route(
|
|
132
188
|
issue,
|
|
133
189
|
ROUND_ONE,
|
|
134
190
|
(verdict) =>
|
|
135
191
|
is_verified ? run_ship_review.round_one_outcome(verdict) : run_ship_review.UNVERIFIED_OUTCOME,
|
|
136
|
-
|
|
192
|
+
slot,
|
|
137
193
|
)
|
|
138
194
|
}
|
|
139
195
|
|
|
196
|
+
// Both reviews' reports in one result, stopped on the first slot that stopped — so a fix answers
|
|
197
|
+
// every finding at once (joshuafolkken/kit#4672).
|
|
198
|
+
function merged(results: ReadonlyArray<StepResult>): StepResult {
|
|
199
|
+
const out = results.map((result) => result.out).join('\n')
|
|
200
|
+
const stopped = results.find((result) => result.code !== SUCCESS_EXIT_CODE)
|
|
201
|
+
|
|
202
|
+
return stopped === undefined ? { code: SUCCESS_EXIT_CODE, out } : { ...stopped, out }
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async function record_slots(issue: string, slots: ReadonlyArray<ReviewSlot>): Promise<StepResult> {
|
|
206
|
+
const is_verified = await is_fix_verified(slots)
|
|
207
|
+
const results: Array<StepResult> = []
|
|
208
|
+
|
|
209
|
+
for (const slot of slots) {
|
|
210
|
+
// eslint-disable-next-line no-await-in-loop -- one `review:record` at a time: each appends to the issue's ledger
|
|
211
|
+
const result = await round_one_record(issue, slot, is_verified)
|
|
212
|
+
|
|
213
|
+
results.push(result)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return merged(results)
|
|
217
|
+
}
|
|
218
|
+
|
|
140
219
|
// A round that had nothing to review: it passes, and the ship does not time it as a review that ran.
|
|
141
220
|
function skipped(out: string): StepResult {
|
|
142
221
|
return { code: SUCCESS_EXIT_CODE, out, is_skipped: true }
|
|
143
222
|
}
|
|
144
223
|
|
|
145
|
-
//
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
// verify, and `round_two_stage` asks whether it is due after the commit — unless the issue changed after
|
|
152
|
-
// that round's brief: the recorded round then never read it, and `josh followup` refuses the merge on it
|
|
153
|
-
// (joshuafolkken/kit#4221).
|
|
154
|
-
async function round_one_stage(issue: string, is_stale: boolean): Promise<StepResult> {
|
|
155
|
-
const recorded = await review_record.check(Number(issue))
|
|
224
|
+
// How the ship's round 1 ended, for `josh lane:stats` to count the rounds that passed with no fix
|
|
225
|
+
// (joshuafolkken/kit#4620). An unreadable verdict is no outcome; the round stops on it as infra. A
|
|
226
|
+
// round whose `review:record` failed is not counted either: the relaunch re-runs it, and that run is
|
|
227
|
+
// the one that ended.
|
|
228
|
+
async function record_outcome(issue: string, verdict: string, cause?: string): Promise<void> {
|
|
229
|
+
if (verdict === run_ship_review.VERDICT.INVALID || cause === CAUSE.CHECK) return
|
|
156
230
|
|
|
157
|
-
|
|
231
|
+
await lane_ledger_write.record_round_one({ issue: Number(issue), verdict })
|
|
232
|
+
}
|
|
158
233
|
|
|
159
|
-
|
|
234
|
+
// Over every slot: either slot's fix moved the tree round 1 is gated on, so the round is `fixed`, and
|
|
235
|
+
// an unreadable slot leaves it uncounted.
|
|
236
|
+
function round_one_kind(slots: ReadonlyArray<ReviewSlot>): string {
|
|
237
|
+
const kinds = new Set(slots.map((slot) => current_verdict(slot).kind))
|
|
238
|
+
const { FIXED, INVALID } = run_ship_review.VERDICT
|
|
239
|
+
|
|
240
|
+
if (kinds.has(INVALID)) return INVALID
|
|
241
|
+
|
|
242
|
+
return kinds.has(FIXED) ? FIXED : current_verdict().kind
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// A round that stops on a finding — a fix the scoped pair did not get green included — is counted as
|
|
246
|
+
// `blocking`, and marks its round reusable however the fix then moves the tree. Written once, over
|
|
247
|
+
// every slot's result.
|
|
248
|
+
async function code_round_one_record(
|
|
249
|
+
issue: string,
|
|
250
|
+
slots: ReadonlyArray<ReviewSlot>,
|
|
251
|
+
): Promise<StepResult> {
|
|
252
|
+
const kind = round_one_kind(slots)
|
|
253
|
+
const recorded = await record_slots(issue, slots)
|
|
254
|
+
const is_stopped = recorded.cause === CAUSE.FINDING
|
|
255
|
+
|
|
256
|
+
review_reviewed_tree.mark_stopped(Number(issue), is_stopped)
|
|
257
|
+
await record_outcome(issue, is_stopped ? run_ship_review.VERDICT.BLOCKING : kind, recorded.cause)
|
|
258
|
+
|
|
259
|
+
return recorded
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// `run:review` alone takes the implementer's `--unpinned-ok "<reason>"`; the interaction brief runs no
|
|
263
|
+
// `test:pinned` check for it to carry past.
|
|
264
|
+
function round_one_opens(
|
|
265
|
+
slots: ReadonlyArray<ReviewSlot>,
|
|
266
|
+
unpinned_ok: ReadonlyArray<string>,
|
|
267
|
+
): Array<{ open: ReadonlyArray<string>; slot: ReviewSlot }> {
|
|
268
|
+
return slots.map((slot) => ({
|
|
269
|
+
open: slot === CODE ? [...ROUND_ONE_OPENS[slot], ...unpinned_ok] : ROUND_ONE_OPENS[slot],
|
|
270
|
+
slot,
|
|
271
|
+
}))
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// A recorded round 1 attested on this branch, its tree held or moved only where round 2 reads: the
|
|
275
|
+
// stage is skipped, and the event stream says why (joshuafolkken/kit#5296).
|
|
276
|
+
async function reused_round(issue: string, reused: ReuseAnswer): Promise<StepResult> {
|
|
277
|
+
await record_outcome(issue, lane_ledger_write.ROUND_ONE_REUSED)
|
|
278
|
+
|
|
279
|
+
return { ...skipped(ROUND_ONE_RECORDED_NOTE), reason: run_ship_review_reason.reused(reused) }
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// The round-1 review, beside the gate: scoped pair → open each slot's brief → their reviewers side by
|
|
283
|
+
// side → join → attest → record, stopping at the first that did not pass.
|
|
284
|
+
async function round_one_stage(
|
|
285
|
+
issue: string,
|
|
286
|
+
is_stale: boolean,
|
|
287
|
+
slots: ReadonlyArray<ReviewSlot>,
|
|
288
|
+
unpinned_ok: ReadonlyArray<string>,
|
|
289
|
+
): Promise<StepResult> {
|
|
290
|
+
// The reuse question `review:record --check` answers too (`review-round-reuse.ts`).
|
|
291
|
+
const reused = await review_round_reuse.answer(Number(issue), is_stale)
|
|
292
|
+
|
|
293
|
+
if (reused.reuse !== review_round_reuse.REUSE.AGAIN) return await reused_round(issue, reused)
|
|
294
|
+
|
|
295
|
+
// A stale record narrows nothing: the next round reads the whole change under the new specification.
|
|
296
|
+
if (is_stale) review_reviewed_tree.discard()
|
|
297
|
+
const opens = round_one_opens(slots, unpinned_ok)
|
|
298
|
+
const ran = await run_phases([
|
|
160
299
|
tagged_phase(CAUSE.CHECK, scoped_pair),
|
|
161
|
-
...
|
|
162
|
-
tagged_phase(CAUSE.CHECK, join_gate),
|
|
300
|
+
...reviewed_together(opens, run_ship_review.reviewer_prompt, issue, ROUND_ONE),
|
|
301
|
+
tagged_phase(CAUSE.CHECK, async () => await join_gate(slots)),
|
|
163
302
|
attest_phase,
|
|
164
|
-
async () => await
|
|
303
|
+
async () => await code_round_one_record(issue, slots),
|
|
165
304
|
])
|
|
305
|
+
|
|
306
|
+
return { ...ran, reason: run_ship_review_reason.ran(reused) }
|
|
166
307
|
}
|
|
167
308
|
|
|
168
|
-
// The interaction review (joshuafolkken/kit#4276)
|
|
169
|
-
//
|
|
170
|
-
//
|
|
309
|
+
// The interaction review alone (joshuafolkken/kit#4276), after a reused round 1: scoped pair →
|
|
310
|
+
// `review:brief --interaction` → reviewer → attest → `review:record --interaction`. Its fixes are
|
|
311
|
+
// verified as round 1's are; no join, since round 1 already drained the gate.
|
|
171
312
|
async function interaction_stage(issue: string): Promise<StepResult> {
|
|
313
|
+
const opens = [{ open: INTERACTION_BRIEF, slot: INTERACTION }]
|
|
314
|
+
|
|
172
315
|
return await run_phases([
|
|
173
316
|
tagged_phase(CAUSE.CHECK, scoped_pair),
|
|
174
|
-
...
|
|
317
|
+
...reviewed_together(opens, run_ship_review.reviewer_prompt, issue, ROUND_ONE),
|
|
175
318
|
attest_phase,
|
|
176
|
-
async () => await
|
|
319
|
+
async () => await record_slots(issue, [INTERACTION]),
|
|
177
320
|
])
|
|
178
321
|
}
|
|
179
322
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const first = await round_one_stage(issue, is_stale)
|
|
323
|
+
async function due_slots(issue: string): Promise<ReadonlyArray<ReviewSlot>> {
|
|
324
|
+
return review_interaction.round_one_slots(await review_interaction.status(Number(issue)))
|
|
325
|
+
}
|
|
184
326
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
)
|
|
189
|
-
|
|
190
|
-
|
|
327
|
+
async function is_interaction_due(issue: string): Promise<boolean> {
|
|
328
|
+
const slots = await due_slots(issue)
|
|
329
|
+
|
|
330
|
+
return slots.includes(INTERACTION)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Owed after a round 1 that passed and is still not recorded — so a relaunched ship whose round 1 is
|
|
334
|
+
// recorded still owes it.
|
|
335
|
+
async function is_interaction_owed(issue: string, first: StepResult): Promise<boolean> {
|
|
336
|
+
if (first.code !== SUCCESS_EXIT_CODE) return false
|
|
337
|
+
|
|
338
|
+
return await is_interaction_due(issue)
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Both passes' output under round 1's reason: the interaction pass ran, so the stage is never skipped.
|
|
342
|
+
function after_interaction(first: StepResult, second: StepResult): StepResult {
|
|
343
|
+
const out = [first.out, second.out].join('\n')
|
|
344
|
+
const { reason } = first
|
|
345
|
+
|
|
346
|
+
return { code: SUCCESS_EXIT_CODE, out, ...(reason !== undefined && { reason }) }
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// **The interaction review runs beside round 1 where it is due and not yet recorded**
|
|
350
|
+
// (joshuafolkken/kit#4672), so the two take one wait and one stop. **It is asked again after a round 1
|
|
351
|
+
// that passed**: a reused round 1 still owes it, and a round-1 fix may be the first to touch the run
|
|
352
|
+
// tooling — either way it then runs alone. The first stop is returned as it is.
|
|
353
|
+
async function review_stage(
|
|
354
|
+
issue: string,
|
|
355
|
+
is_stale = false,
|
|
356
|
+
unpinned_ok: ReadonlyArray<string> = [],
|
|
357
|
+
): Promise<StepResult> {
|
|
358
|
+
const slots = await due_slots(issue)
|
|
359
|
+
const first = await round_one_stage(issue, is_stale, slots, unpinned_ok)
|
|
360
|
+
|
|
361
|
+
if (!(await is_interaction_owed(issue, first))) return first
|
|
191
362
|
|
|
192
363
|
const second = await interaction_stage(issue)
|
|
193
364
|
|
|
194
365
|
if (second.code !== SUCCESS_EXIT_CODE) return second
|
|
195
366
|
|
|
196
|
-
return
|
|
367
|
+
return after_interaction(first, second)
|
|
197
368
|
}
|
|
198
369
|
|
|
199
370
|
// The round-2 verification pass, after the commit so it runs beside CI: due only when the round-1 fix
|
|
@@ -203,7 +374,7 @@ async function review_stage(issue: string, is_stale = false): Promise<StepResult
|
|
|
203
374
|
// `josh lane:stats` can count the period's round-2 runs and skips by their reason code
|
|
204
375
|
// (joshuafolkken/kit#4064). Output it cannot parse stops the ship rather than guessing a verdict.
|
|
205
376
|
async function round_two_stage(issue: string): Promise<StepResult> {
|
|
206
|
-
const decision = await josh(
|
|
377
|
+
const decision = await josh(round_two_decision(issue))
|
|
207
378
|
|
|
208
379
|
if (decision.code !== SUCCESS_EXIT_CODE) return tagged(CAUSE.CHECK, decision)
|
|
209
380
|
|
|
@@ -214,7 +385,7 @@ async function round_two_stage(issue: string): Promise<StepResult> {
|
|
|
214
385
|
}
|
|
215
386
|
|
|
216
387
|
note(answer.reason)
|
|
217
|
-
await
|
|
388
|
+
await lane_ledger_write.record_round_two({
|
|
218
389
|
issue: Number(issue),
|
|
219
390
|
verdict: answer.verdict,
|
|
220
391
|
code: answer.code,
|