@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -9,8 +9,12 @@ import { stamp_file } from '#scripts/josh/stamp-file'
|
|
|
9
9
|
import { json_value } from '#scripts/lib/json-value'
|
|
10
10
|
import { unit_worker_share } from '#scripts/test/unit-worker-share'
|
|
11
11
|
import { z } from 'zod'
|
|
12
|
+
import { busy_average, type BusySample, type LoadEase } from './busy-average'
|
|
12
13
|
import { core_admission, type Admission, type LedgerEntry, type Overflow } from './core-admission'
|
|
14
|
+
import { core_budget_timing, type TimingConfig } from './core-budget-timing'
|
|
13
15
|
import { core_wait, type BudgetWait, type WaitReason } from './core-wait'
|
|
16
|
+
import { core_wait_record, type WaitSink } from './core-wait-record'
|
|
17
|
+
import { core_weights } from './core-weights'
|
|
14
18
|
import { held_mark } from './held-mark'
|
|
15
19
|
import { machine_capacity, type MachineBudget, type MachineReading } from './machine-capacity'
|
|
16
20
|
|
|
@@ -25,8 +29,9 @@ import { machine_capacity, type MachineBudget, type MachineReading } from './mac
|
|
|
25
29
|
//
|
|
26
30
|
// **A solo run is bit-for-bit unchanged, and that is arithmetic rather than a branch.** The gate's
|
|
27
31
|
// weights are its `reserved_cores` (the static checks) and its `unit_worker_cap` (the unit suite), and
|
|
28
|
-
// `reserved(2 +
|
|
29
|
-
// to the whole budget and
|
|
32
|
+
// `reserved(2 + 2 + 1) + unit_cap(cores - 5)` is exactly `cores` — so a single gate's four claims sum
|
|
33
|
+
// to the whole budget and, while the busy cores stay within what the ledger holds, every one is
|
|
34
|
+
// admitted the instant it is made, with no poll and no wait. Under
|
|
30
35
|
// concurrency the same weights sum past the budget and the ledger is what holds the machine down.
|
|
31
36
|
//
|
|
32
37
|
// **Liveness is `process_identity`'s, reused rather than re-invented.** A run
|
|
@@ -41,66 +46,21 @@ import { machine_capacity, type MachineBudget, type MachineReading } from './mac
|
|
|
41
46
|
|
|
42
47
|
const RESERVED_PREFIX = 'josh-core-reserved-'
|
|
43
48
|
const RESERVED_SUFFIX = '.json'
|
|
44
|
-
//
|
|
45
|
-
// promptly, long enough that the wait itself burns no measurable CPU.
|
|
46
|
-
const POLL_INTERVAL_MS = 50
|
|
47
|
-
// The longest a reservation waits before it is admitted at minimum width regardless — a heavy step must
|
|
48
|
-
// make progress even if the budget never clears, so a leaked or wedged sibling cannot stall the machine
|
|
49
|
-
// for good. Two minutes is well past a unit suite's worst measured time under six-way load.
|
|
50
|
-
const WAIT_CAP_MS = 120_000
|
|
51
|
-
// The head of the ledger is always admitted, so the smallest budget worth planning against is one core.
|
|
49
|
+
// The head of an unsaturated ledger is always admitted, so the smallest declared budget is one core.
|
|
52
50
|
const MIN_BUDGET = 1
|
|
53
51
|
|
|
54
|
-
// **The cores each heavy tool occupies, declared once for both places that reserve them**
|
|
55
|
-
// `gate-plan.ts`'s checks and the `josh` commands that run the same tools
|
|
56
|
-
// directly read these, so a direct `josh lint` claims what the gate's lint claims. The lint, type check
|
|
57
|
-
// and spell check numbers are `gate-plan.ts`'s measured table, floored. The whole-tree eslint scan
|
|
58
|
-
// behind `josh lines` and `josh refactor:scan` runs in one process: measured cold on the 11-core
|
|
59
|
-
// machine on 2026-10-06, 113s of CPU over 98s of wall, so it gets one core.
|
|
60
|
-
//
|
|
61
|
-
// The rest ran outside the ledger until joshuafolkken/kit#3944, measured with `/usr/bin/time -l` on the
|
|
62
|
-
// same machine on 2026-10-17 under a load average of 16. Every one stays under one core, so each takes
|
|
63
|
-
// one: `prettier --check` over 40 staged files 2.1s of CPU over 1.7s of wall (`format`), `josh
|
|
64
|
-
// retrospective` 16.5s over 19.8s, and a fresh lane's `pnpm install --frozen-lockfile` 1.9s over 6.1s.
|
|
65
|
-
// `e2e` is the Playwright worker count `josh test:e2e` passes locally — the two-worker run CI already
|
|
66
|
-
// sizes for its four-core runner — since kit has no e2e suite of its own to time.
|
|
67
|
-
const CORE_WEIGHTS = {
|
|
68
|
-
lint: 2,
|
|
69
|
-
type_check: 1,
|
|
70
|
-
spell_check: 1,
|
|
71
|
-
eslint_scan: 1,
|
|
72
|
-
format: 1,
|
|
73
|
-
retrospective: 1,
|
|
74
|
-
install: 1,
|
|
75
|
-
e2e: 2,
|
|
76
|
-
} as const
|
|
77
|
-
|
|
78
|
-
// **The memory each heavy tool holds, declared beside its cores**: peak
|
|
79
|
-
// resident size in MB, rounded up. Measured with `/usr/bin/time -l` on the 11-core / 18 GB machine on
|
|
80
|
-
// 2026-10-07: the type check 1,244 MB, the spell check 330 MB, and one unit worker 319 MB over 54 test
|
|
81
|
-
// files. Typed eslint was 1,207 MB over one directory and was observed at 1.6–2.4 GB per whole-tree
|
|
82
|
-
// `eslint .` with three lanes running the same day, so lint and the whole-tree scan take that peak.
|
|
83
|
-
// On 2026-10-17: prettier 260 MB, the retrospective 862 MB and a lane install 65 MB.
|
|
84
|
-
const MEMORY_MB = {
|
|
85
|
-
lint: 2400,
|
|
86
|
-
type_check: 1300,
|
|
87
|
-
spell_check: 350,
|
|
88
|
-
eslint_scan: 2400,
|
|
89
|
-
unit_worker: 350,
|
|
90
|
-
format: 300,
|
|
91
|
-
retrospective: 900,
|
|
92
|
-
install: 100,
|
|
93
|
-
} as const
|
|
94
|
-
|
|
95
52
|
// `memory_mb` and `admitted_at` are optional so a marker an older `josh` wrote still reads: it holds no
|
|
96
53
|
// declared memory, and it counts as load from outside the ledger until it is gone.
|
|
97
54
|
// `command`, `checkout`, `lane`, `lanes_root` and `wait_reason` name a waiting claim on `run:board`
|
|
98
|
-
// (`core-wait.ts`).
|
|
55
|
+
// (`core-wait.ts`). `is_unit` marks a unit suite's claim, which may be admitted narrowed to `granted`
|
|
56
|
+
// past the wait cap, or once outside load holding it does not ease (`core_admission.narrowed_weight`).
|
|
99
57
|
const reservation_schema = process_owner_schema.extend({
|
|
100
58
|
weight: z.number(),
|
|
101
59
|
claimed_at: z.number(),
|
|
102
60
|
memory_mb: z.number().optional(),
|
|
103
61
|
admitted_at: z.number().optional(),
|
|
62
|
+
is_unit: z.boolean().optional(),
|
|
63
|
+
granted: z.number().optional(),
|
|
104
64
|
command: z.string().optional(),
|
|
105
65
|
checkout: z.string().optional(),
|
|
106
66
|
lane: z.string().optional(),
|
|
@@ -121,13 +81,18 @@ interface ReserveOptions {
|
|
|
121
81
|
memory_mb?: number | undefined
|
|
122
82
|
// What the claim is for, named on the waiting line and on `run:board`.
|
|
123
83
|
command?: string | undefined
|
|
84
|
+
// A unit suite's claim, whose weight is its worker count.
|
|
85
|
+
is_unit?: boolean | undefined
|
|
124
86
|
report?: (line: string) => void
|
|
125
87
|
read_machine?: () => Promise<MachineReading>
|
|
126
88
|
wait_cap_ms?: number
|
|
89
|
+
ease_window_ms?: number
|
|
127
90
|
poll_interval_ms?: number
|
|
128
91
|
directory?: string
|
|
129
92
|
now?: () => number
|
|
130
93
|
sleep?: (ms: number) => Promise<void>
|
|
94
|
+
// Where a claim that waited records how long, once admitted (`core-wait-record.ts`).
|
|
95
|
+
record_wait?: WaitSink
|
|
131
96
|
}
|
|
132
97
|
|
|
133
98
|
interface Handle {
|
|
@@ -139,7 +104,7 @@ function marker_name(key: string): string {
|
|
|
139
104
|
return `${RESERVED_PREFIX}${key}${RESERVED_SUFFIX}`
|
|
140
105
|
}
|
|
141
106
|
|
|
142
|
-
// **"Cannot tell" counts as live**, the same direction `unit-
|
|
107
|
+
// **"Cannot tell" counts as live**, the same direction `unit-run-marker.ts` takes: being wrong that
|
|
143
108
|
// way costs a reservation a slower admission, while the other way admits past a run that is still there.
|
|
144
109
|
function is_running(reservation: Reservation): boolean {
|
|
145
110
|
return process_identity.is_same_process(reservation.pid, reservation.process_start) !== false
|
|
@@ -155,7 +120,7 @@ function read_reservation(source: string): Reservation | undefined {
|
|
|
155
120
|
|
|
156
121
|
// **A dead marker is removed, not merely skipped** — otherwise a reissued pid turns a leaked place into
|
|
157
122
|
// a phantom that fills the budget for good. The unlink never throws: a marker this account may not
|
|
158
|
-
// remove is left alone, exactly as `unit-
|
|
123
|
+
// remove is left alone, exactly as `unit-run-marker.ts` leaves it.
|
|
159
124
|
function sweep_marker(source: string): void {
|
|
160
125
|
try {
|
|
161
126
|
stamp_file.remove_stamp(source)
|
|
@@ -202,12 +167,6 @@ function normalize_budget(budget: number): number {
|
|
|
202
167
|
return Number.isFinite(budget) ? Math.max(MIN_BUDGET, Math.floor(budget)) : MIN_BUDGET
|
|
203
168
|
}
|
|
204
169
|
|
|
205
|
-
async function default_sleep(ms: number): Promise<void> {
|
|
206
|
-
await new Promise<void>((resolve) => {
|
|
207
|
-
setTimeout(resolve, ms)
|
|
208
|
-
})
|
|
209
|
-
}
|
|
210
|
-
|
|
211
170
|
// **Replaced atomically, never unlinked and recreated**: the admitted rewrite lands on a marker other
|
|
212
171
|
// lanes are polling, and a reader that hit the gap between an unlink and its create would see the ledger
|
|
213
172
|
// without this place and admit past it.
|
|
@@ -219,57 +178,56 @@ function report_wait(line: string): void {
|
|
|
219
178
|
process.stderr.write(`${line}\n`)
|
|
220
179
|
}
|
|
221
180
|
|
|
222
|
-
// The clock and cadence a wait runs on, resolved apart from the ledger fields so `reserve` stays under
|
|
223
|
-
// the complexity limit — each default is a branch.
|
|
224
|
-
interface TimingConfig {
|
|
225
|
-
now: () => number
|
|
226
|
-
sleep: (ms: number) => Promise<void>
|
|
227
|
-
poll_interval_ms: number
|
|
228
|
-
wait_cap_ms: number
|
|
229
|
-
}
|
|
230
|
-
|
|
231
181
|
interface WaitContext extends TimingConfig {
|
|
232
182
|
read_machine: () => Promise<MachineReading>
|
|
233
183
|
report: (line: string) => void
|
|
184
|
+
record_wait: WaitSink | undefined
|
|
234
185
|
key: string
|
|
235
186
|
target: string
|
|
236
187
|
directory: string
|
|
237
188
|
budget: number
|
|
238
189
|
deadline: number
|
|
239
190
|
fields: ReservationFields
|
|
191
|
+
busy_samples: Array<BusySample>
|
|
192
|
+
// Unset until the first reading of the machine (`busy_average.with_ease`).
|
|
193
|
+
ease?: LoadEase | undefined
|
|
240
194
|
}
|
|
241
195
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
wait_cap_ms: options.wait_cap_ms ?? WAIT_CAP_MS,
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// **A claim alone in the ledger reads nothing from the machine**: the head is admitted whatever the
|
|
252
|
-
// budget says, so a solo run pays no sampling window and starts exactly as it did before.
|
|
196
|
+
// **A claim alone in the ledger reads the machine too** (joshuafolkken/kit#4238): load outside the
|
|
197
|
+
// ledger saturates the CPU whether or not another claim is in it. The busy cores are the mean of this
|
|
198
|
+
// wait's recent readings of load outside the ledger (`busy-average.ts`). That load holds every claim but
|
|
199
|
+
// the first waiter, which it narrows instead (`core_admission.is_admitted`, joshuafolkken/kit#4313) unless
|
|
200
|
+
// the run queue reads the machine overloaded (`machine_capacity.machine_budget`, joshuafolkken/kit#4361).
|
|
253
201
|
async function current_budget(
|
|
254
202
|
context: WaitContext,
|
|
255
203
|
reservations: ReadonlyArray<LiveReservation>,
|
|
256
204
|
): Promise<MachineBudget> {
|
|
257
|
-
if (reservations.length <= 1) return { cores: context.budget, memory_mb: Infinity }
|
|
258
|
-
|
|
259
205
|
const reading = await context.read_machine()
|
|
260
206
|
const ledger = core_admission.ledger_load(reservations, context.now())
|
|
261
|
-
const budget = machine_capacity.machine_budget(context.budget, reading, ledger)
|
|
262
207
|
|
|
263
|
-
|
|
208
|
+
context.busy_samples = busy_average.with_reading(
|
|
209
|
+
context.busy_samples,
|
|
210
|
+
reading,
|
|
211
|
+
ledger.cores,
|
|
212
|
+
context.now(),
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
const mean = busy_average.averaged(reading, context.busy_samples, ledger.cores)
|
|
216
|
+
|
|
217
|
+
context.ease = busy_average.with_ease(context.ease, mean.busy_cores, context.now())
|
|
218
|
+
|
|
219
|
+
return machine_capacity.machine_budget(context.budget, mean, ledger)
|
|
264
220
|
}
|
|
265
221
|
|
|
266
222
|
// The claim is admitted: its marker records when, which moves its load from "load outside the ledger"
|
|
267
223
|
// to "load the ledger holds" for every later reader — its cores at once, its memory once its tool has
|
|
268
224
|
// had time to ramp up.
|
|
269
|
-
function admit(context: WaitContext, overflow?: Overflow): Admission {
|
|
270
|
-
|
|
225
|
+
function admit(context: WaitContext, overflow?: Overflow, granted?: number): Admission {
|
|
226
|
+
const admitted_at = context.now()
|
|
271
227
|
|
|
272
|
-
|
|
228
|
+
write_reservation(context.target, { ...context.fields, admitted_at, granted })
|
|
229
|
+
|
|
230
|
+
return { overflow, granted, waited_ms: admitted_at - context.fields.claimed_at }
|
|
273
231
|
}
|
|
274
232
|
|
|
275
233
|
function overflow_of(
|
|
@@ -297,22 +255,49 @@ function mark_waiting(context: WaitContext, reason: WaitReason): void {
|
|
|
297
255
|
if (previous === undefined) context.report(core_wait.wait_line(context.fields.command, reason))
|
|
298
256
|
}
|
|
299
257
|
|
|
258
|
+
// Past the cap a held claim runs regardless, and so does one only load outside the ledger holds once
|
|
259
|
+
// that load has not eased for a window of the wait — waiting on gains it nothing. A claim a swap stall
|
|
260
|
+
// holds is the exception to both.
|
|
261
|
+
function is_wait_spent(
|
|
262
|
+
context: WaitContext,
|
|
263
|
+
reservations: ReadonlyArray<LiveReservation>,
|
|
264
|
+
budget: MachineBudget,
|
|
265
|
+
): boolean {
|
|
266
|
+
if (core_admission.is_swap_held(context.key, reservations, budget)) return false
|
|
267
|
+
|
|
268
|
+
const now = context.now()
|
|
269
|
+
|
|
270
|
+
if (now >= context.deadline) return true
|
|
271
|
+
|
|
272
|
+
return (
|
|
273
|
+
busy_average.is_unrelieved(context.ease, now, context.ease_window_ms) &&
|
|
274
|
+
core_wait.is_outside_held(context.key, reservations, budget)
|
|
275
|
+
)
|
|
276
|
+
}
|
|
277
|
+
|
|
300
278
|
async function poll_admission(context: WaitContext): Promise<Admission | undefined> {
|
|
301
279
|
const reservations = live_reservations(context.directory)
|
|
302
280
|
const budget = await current_budget(context, reservations)
|
|
281
|
+
// A unit claim is admitted at the room the budget leaves rather than at full width — the first
|
|
282
|
+
// waiter, which load outside the ledger does not hold, as well as one whose wait is spent.
|
|
283
|
+
const granted = core_admission.narrowed_weight(context.key, reservations, budget.cores)
|
|
284
|
+
const reason = core_wait.hold_reason(context.key, reservations, budget, granted)
|
|
285
|
+
|
|
286
|
+
if (reason === undefined) return admit(context, undefined, granted)
|
|
303
287
|
|
|
304
|
-
if (
|
|
288
|
+
if (is_wait_spent(context, reservations, budget)) {
|
|
289
|
+
const held = core_admission.with_grant(context.key, reservations, granted)
|
|
305
290
|
|
|
306
|
-
|
|
307
|
-
return admit(context, overflow_of(context, reservations, budget))
|
|
291
|
+
return admit(context, overflow_of(context, held, budget), granted)
|
|
308
292
|
}
|
|
309
293
|
|
|
310
|
-
mark_waiting(context,
|
|
294
|
+
mark_waiting(context, reason)
|
|
311
295
|
|
|
312
296
|
return undefined
|
|
313
297
|
}
|
|
314
298
|
|
|
315
|
-
// Poll the ledger until this reservation is admitted, or until the wait cap
|
|
299
|
+
// Poll the ledger until this reservation is admitted, or until the wait cap — or, for a claim only load
|
|
300
|
+
// outside the ledger holds, that load not easing — admits it at minimum width.
|
|
316
301
|
// A solo run is admitted on the first read — its own claim is the ledger's head — so the loop body never
|
|
317
302
|
// runs and the wait costs nothing.
|
|
318
303
|
async function await_admission(context: WaitContext): Promise<Admission> {
|
|
@@ -325,14 +310,19 @@ async function await_admission(context: WaitContext): Promise<Admission> {
|
|
|
325
310
|
admission = await poll_admission(context)
|
|
326
311
|
}
|
|
327
312
|
|
|
313
|
+
await core_wait_record.record_admitted(context.fields, context.now(), context.record_wait)
|
|
314
|
+
|
|
328
315
|
return admission
|
|
329
316
|
}
|
|
330
317
|
|
|
331
|
-
// What a wait reads the machine through
|
|
332
|
-
function resolve_ports(
|
|
318
|
+
// What a wait reads the machine through, reports its start to and records its length in.
|
|
319
|
+
function resolve_ports(
|
|
320
|
+
options: ReserveOptions,
|
|
321
|
+
): Pick<WaitContext, 'read_machine' | 'report' | 'record_wait'> {
|
|
333
322
|
return {
|
|
334
323
|
read_machine: options.read_machine ?? machine_capacity.read_machine,
|
|
335
324
|
report: options.report ?? report_wait,
|
|
325
|
+
record_wait: options.record_wait,
|
|
336
326
|
}
|
|
337
327
|
}
|
|
338
328
|
|
|
@@ -343,13 +333,13 @@ function claim_fields(
|
|
|
343
333
|
claimed_at: number,
|
|
344
334
|
options: ReserveOptions,
|
|
345
335
|
): ReservationFields {
|
|
346
|
-
const { memory_mb, command } = options
|
|
336
|
+
const { memory_mb, command, is_unit } = options
|
|
347
337
|
|
|
348
|
-
return { weight, claimed_at, memory_mb, command, ...core_wait.where_of(process.cwd()) }
|
|
338
|
+
return { weight, claimed_at, memory_mb, command, is_unit, ...core_wait.where_of(process.cwd()) }
|
|
349
339
|
}
|
|
350
340
|
|
|
351
341
|
async function reserve(weight: number, options: ReserveOptions = {}): Promise<Handle> {
|
|
352
|
-
const timing = resolve_timing(options)
|
|
342
|
+
const timing = core_budget_timing.resolve_timing(options)
|
|
353
343
|
const directory = options.directory ?? PLATFORM_TEMP_ROOT
|
|
354
344
|
const claimed_at = timing.now()
|
|
355
345
|
const name = marker_name(randomUUID())
|
|
@@ -365,6 +355,7 @@ async function reserve(weight: number, options: ReserveOptions = {}): Promise<Ha
|
|
|
365
355
|
budget: normalize_budget(options.budget ?? availableParallelism()),
|
|
366
356
|
deadline: claimed_at + timing.wait_cap_ms,
|
|
367
357
|
fields,
|
|
358
|
+
busy_samples: [],
|
|
368
359
|
...resolve_ports(options),
|
|
369
360
|
})
|
|
370
361
|
|
|
@@ -401,6 +392,12 @@ async function with_core_reservation<T>(
|
|
|
401
392
|
}
|
|
402
393
|
}
|
|
403
394
|
|
|
395
|
+
// Whether a parent's claim already covers this process — a held parent command, or a unit suite this
|
|
396
|
+
// runs inside — so a command claims nothing, and one that sizes its claim need not size it.
|
|
397
|
+
function is_covered(): boolean {
|
|
398
|
+
return held_mark.is_held() || unit_worker_share.is_nested_run()
|
|
399
|
+
}
|
|
400
|
+
|
|
404
401
|
// **A command's reservation: the gate's claim, unless a parent already holds the cores**
|
|
405
402
|
// `josh-logic.ts` calls this around every command that declares a weight.
|
|
406
403
|
// Each command then only declares its weight, and no command carries a copy of the claim, run and
|
|
@@ -412,7 +409,7 @@ async function with_command_reservation<T>(
|
|
|
412
409
|
run: () => Promise<T>,
|
|
413
410
|
options: ReserveOptions = {},
|
|
414
411
|
): Promise<T> {
|
|
415
|
-
if (
|
|
412
|
+
if (is_covered()) return await run()
|
|
416
413
|
|
|
417
414
|
return await with_core_reservation(
|
|
418
415
|
weight,
|
|
@@ -421,16 +418,30 @@ async function with_command_reservation<T>(
|
|
|
421
418
|
)
|
|
422
419
|
}
|
|
423
420
|
|
|
421
|
+
// The unit claim the parent command holds for this process (`with_command_reservation`), or
|
|
422
|
+
// `undefined` where none does. A held claim that is not a unit suite's says nothing about workers.
|
|
423
|
+
function held_unit_claim(directory: string = PLATFORM_TEMP_ROOT): Reservation | undefined {
|
|
424
|
+
const key = held_mark.held_reservation()
|
|
425
|
+
|
|
426
|
+
if (key === undefined) return undefined
|
|
427
|
+
|
|
428
|
+
const held = live_reservations(directory).find((entry) => entry.key === key)
|
|
429
|
+
|
|
430
|
+
return held?.reservation.is_unit === true ? held.reservation : undefined
|
|
431
|
+
}
|
|
432
|
+
|
|
424
433
|
const core_budget = {
|
|
425
|
-
CORE_WEIGHTS,
|
|
434
|
+
CORE_WEIGHTS: core_weights.CORE_WEIGHTS,
|
|
426
435
|
HELD_KEY: held_mark.HELD_KEY,
|
|
427
436
|
HELD_VALUE: held_mark.HELD_VALUE,
|
|
428
|
-
MEMORY_MB,
|
|
437
|
+
MEMORY_MB: core_weights.MEMORY_MB,
|
|
429
438
|
RESERVED_PREFIX,
|
|
430
439
|
admitted_keys: core_admission.admitted_keys,
|
|
431
440
|
admitted_load: core_admission.admitted_load,
|
|
432
441
|
budget_waits,
|
|
433
442
|
describe_overflow: core_admission.describe_overflow,
|
|
443
|
+
held_unit_claim,
|
|
444
|
+
is_covered,
|
|
434
445
|
is_held: held_mark.is_held,
|
|
435
446
|
live_reservations,
|
|
436
447
|
release,
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { CoreWaitRecord } from '#scripts/lane/lane-ledger-schema'
|
|
2
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
3
|
+
|
|
4
|
+
// How long a claim waited for the core budget, written to the lane ledger once it is admitted, so
|
|
5
|
+
// `josh lane:stats` can split a lane's time into work and waiting (joshuafolkken/kit#4382). The
|
|
6
|
+
// waiting line on stderr says a wait started; this says what it cost.
|
|
7
|
+
//
|
|
8
|
+
// **Only a claim that waited is recorded** — one admitted on its first read cost nothing, and a line per
|
|
9
|
+
// command would bury the waits a lane's time is split by. The lane is the claim's own checkout's, the
|
|
10
|
+
// one `run:board` names the waiting claim by.
|
|
11
|
+
|
|
12
|
+
const UNNAMED_COMMAND = 'a step'
|
|
13
|
+
|
|
14
|
+
// What `core-budget.ts` knows of the claim when it is admitted.
|
|
15
|
+
interface AdmittedClaim {
|
|
16
|
+
command?: string | undefined
|
|
17
|
+
lane?: string | undefined
|
|
18
|
+
wait_reason?: string | undefined
|
|
19
|
+
claimed_at: number
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type WaitSink = (wait: CoreWaitRecord) => Promise<void>
|
|
23
|
+
|
|
24
|
+
async function to_ledger(wait: CoreWaitRecord): Promise<void> {
|
|
25
|
+
await lane_ledger_write.record_core_wait(wait)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function wait_of(claim: AdmittedClaim, now: number): CoreWaitRecord | undefined {
|
|
29
|
+
if (claim.wait_reason === undefined) return undefined
|
|
30
|
+
|
|
31
|
+
const wait = { command: claim.command ?? UNNAMED_COMMAND, waited_ms: now - claim.claimed_at }
|
|
32
|
+
|
|
33
|
+
return claim.lane === undefined ? wait : { ...wait, issue: Number(claim.lane) }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function record_admitted(
|
|
37
|
+
claim: AdmittedClaim,
|
|
38
|
+
now: number,
|
|
39
|
+
sink: WaitSink = to_ledger,
|
|
40
|
+
): Promise<void> {
|
|
41
|
+
const wait = wait_of(claim, now)
|
|
42
|
+
|
|
43
|
+
if (wait !== undefined) await sink(wait)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const core_wait_record = { record_admitted, wait_of }
|
|
47
|
+
|
|
48
|
+
export type { WaitSink }
|
|
49
|
+
export { core_wait_record }
|
|
@@ -9,13 +9,15 @@ import type { MachineBudget } from './machine-capacity'
|
|
|
9
9
|
// says it once on its own output; `run:board` draws every marker still waiting. Everything here is a
|
|
10
10
|
// pure function of the ledger and the budget it is handed.
|
|
11
11
|
|
|
12
|
-
const WAIT_REASONS = ['cores', 'memory', 'pressure'] as const
|
|
12
|
+
const WAIT_REASONS = ['cores', 'cpu', 'memory', 'pressure'] as const
|
|
13
13
|
|
|
14
14
|
type WaitReason = (typeof WAIT_REASONS)[number]
|
|
15
15
|
|
|
16
|
-
// The one wording of each reason,
|
|
16
|
+
// The one wording of each reason, on the waiting command's own line; the board draws the reason as the
|
|
17
|
+
// header's icon instead (joshuafolkken/kit#4052).
|
|
17
18
|
const REASON_TEXT: Record<WaitReason, string> = {
|
|
18
19
|
cores: 'not enough free cores',
|
|
20
|
+
cpu: 'CPU saturated',
|
|
19
21
|
memory: 'not enough free memory',
|
|
20
22
|
pressure: 'memory under pressure',
|
|
21
23
|
}
|
|
@@ -49,6 +51,18 @@ interface BudgetWait extends BudgetPlace {
|
|
|
49
51
|
reason: WaitReason
|
|
50
52
|
}
|
|
51
53
|
|
|
54
|
+
// A claim short of cores waits on the CPU when it would fit on what the ledger declares — the cores it
|
|
55
|
+
// lacks are taken by busy load beyond the ledger (joshuafolkken/kit#4238) — and on the ledger otherwise.
|
|
56
|
+
function core_reason(
|
|
57
|
+
key: string,
|
|
58
|
+
reservations: ReadonlyArray<LedgerEntry>,
|
|
59
|
+
budget: MachineBudget,
|
|
60
|
+
): WaitReason {
|
|
61
|
+
const declared = { cores: budget.cores + (budget.busy_excess ?? 0), memory_mb: Infinity }
|
|
62
|
+
|
|
63
|
+
return core_admission.is_admitted(key, reservations, declared) ? 'cpu' : 'cores'
|
|
64
|
+
}
|
|
65
|
+
|
|
52
66
|
// **The cores decide first**: a claim that would not fit even with unlimited memory waits for cores;
|
|
53
67
|
// one that fits on cores waits for memory, named as pressure when the reading saw compression or swap.
|
|
54
68
|
function wait_reason(
|
|
@@ -56,13 +70,50 @@ function wait_reason(
|
|
|
56
70
|
reservations: ReadonlyArray<LedgerEntry>,
|
|
57
71
|
budget: MachineBudget,
|
|
58
72
|
): WaitReason {
|
|
59
|
-
const cores_only = {
|
|
73
|
+
const cores_only = { ...budget, memory_mb: Infinity }
|
|
60
74
|
|
|
61
|
-
if (!core_admission.is_admitted(key, reservations, cores_only))
|
|
75
|
+
if (!core_admission.is_admitted(key, reservations, cores_only)) {
|
|
76
|
+
return core_reason(key, reservations, budget)
|
|
77
|
+
}
|
|
62
78
|
|
|
63
79
|
return budget.memory_pressured === true ? 'pressure' : 'memory'
|
|
64
80
|
}
|
|
65
81
|
|
|
82
|
+
// Why a claim is not admitted yet, or `undefined` once it is: a unit claim the budget admits only too
|
|
83
|
+
// narrow (`core_admission.is_too_narrow`) still waits, on the CPU — admitted, it fits what the ledger
|
|
84
|
+
// declares, so only busy load beyond the ledger narrowed it (`core_reason`).
|
|
85
|
+
function hold_reason(
|
|
86
|
+
key: string,
|
|
87
|
+
reservations: ReadonlyArray<LedgerEntry>,
|
|
88
|
+
budget: MachineBudget,
|
|
89
|
+
granted: number | undefined,
|
|
90
|
+
): WaitReason | undefined {
|
|
91
|
+
if (!core_admission.is_admitted(key, reservations, budget)) {
|
|
92
|
+
return wait_reason(key, reservations, budget)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return core_admission.is_too_narrow(key, reservations, granted) ? 'cpu' : undefined
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// **Whether only load from outside the ledger holds the claim** (joshuafolkken/kit#4982): with that load
|
|
99
|
+
// gone — its busy cores handed back and no run-queue overload — the claim would be admitted at a width
|
|
100
|
+
// that is not too narrow. A claim the ledger or memory holds is not, and waits for its room to come back.
|
|
101
|
+
function is_outside_held(
|
|
102
|
+
key: string,
|
|
103
|
+
reservations: ReadonlyArray<LedgerEntry>,
|
|
104
|
+
budget: MachineBudget,
|
|
105
|
+
): boolean {
|
|
106
|
+
const unloaded = {
|
|
107
|
+
...budget,
|
|
108
|
+
cores: budget.cores + (budget.busy_excess ?? 0),
|
|
109
|
+
busy_excess: 0,
|
|
110
|
+
is_overloaded: false,
|
|
111
|
+
}
|
|
112
|
+
const granted = core_admission.narrowed_weight(key, reservations, unloaded.cores)
|
|
113
|
+
|
|
114
|
+
return hold_reason(key, reservations, unloaded, granted) === undefined
|
|
115
|
+
}
|
|
116
|
+
|
|
66
117
|
// The line a waiting command prints once, when its wait starts.
|
|
67
118
|
function wait_line(command: string | undefined, reason: WaitReason): string {
|
|
68
119
|
return `⏳ ${command ?? 'a step'} waits for the core budget — ${REASON_TEXT[reason]}`
|
|
@@ -70,10 +121,13 @@ function wait_line(command: string | undefined, reason: WaitReason): string {
|
|
|
70
121
|
|
|
71
122
|
// The lanes root a checkout belongs to: a lane's parent, or the root beside a main checkout. Two
|
|
72
123
|
// checkouts of one repository share it; the ledger is machine-wide, so another repository's do not.
|
|
124
|
+
// A Claude Code worktree under a checkout reads as that checkout (`lane_paths.checkout_of`).
|
|
73
125
|
function lanes_root_of(checkout: string): string {
|
|
74
|
-
|
|
126
|
+
const resolved = lane_paths.checkout_of(path.resolve(checkout))
|
|
127
|
+
|
|
128
|
+
if (lane_paths.lane_issue_of(resolved) === undefined) return lane_paths.lane_root(resolved)
|
|
75
129
|
|
|
76
|
-
return path.dirname(
|
|
130
|
+
return path.dirname(resolved)
|
|
77
131
|
}
|
|
78
132
|
|
|
79
133
|
// Where a claim runs, read by the claimer under its own environment: `JOSH_LANE_ROOT` is a
|
|
@@ -118,8 +172,9 @@ function waits_of(
|
|
|
118
172
|
}
|
|
119
173
|
|
|
120
174
|
const core_wait = {
|
|
121
|
-
REASON_TEXT,
|
|
122
175
|
WAIT_REASONS,
|
|
176
|
+
hold_reason,
|
|
177
|
+
is_outside_held,
|
|
123
178
|
wait_line,
|
|
124
179
|
wait_reason,
|
|
125
180
|
waits_of,
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// The weights heavy tools declare to the core budget (`core-budget.ts`), in their own module so the
|
|
2
|
+
// ledger's file stays under its line ceiling.
|
|
3
|
+
|
|
4
|
+
// One tool's measured run: its CPU seconds over its wall seconds, the cores it kept busy on average.
|
|
5
|
+
interface Measurement {
|
|
6
|
+
cpu_s: number
|
|
7
|
+
wall_s: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// **What each heavy tool was measured at, on the 11-core machine.** The whole-tree eslint scan behind
|
|
11
|
+
// `josh lines` and `josh refactor:scan`, cold on 2026-10-06. eslint over 40 staged files
|
|
12
|
+
// (`pre-commit-lint.ts`), which the gate's lint also runs beside its sibling linters, so it is the
|
|
13
|
+
// lint's floor; whole runs were observed at 124–147% CPU. The type check with `/usr/bin/time -l` on
|
|
14
|
+
// 2026-10-21 under a load average of 14. `prettier --check` over 40 staged files, `josh retrospective`
|
|
15
|
+
// and a fresh lane's `pnpm install --frozen-lockfile` with `/usr/bin/time -l` on 2026-10-17 under a
|
|
16
|
+
// load average of 16. The gate ledger records each check's CPU beside its duration (`check-cpu.ts`),
|
|
17
|
+
// so these can be re-measured from it. The spell check was re-measured from it
|
|
18
|
+
// (joshuafolkken/kit#5140): its median CPU and median wall over the lane ledger's 413 gate `cspell`
|
|
19
|
+
// runs that were not reused, from 2026-10-24 to 2026-10-27, whose per-run cores had a median of 0.91
|
|
20
|
+
// and a p90 of 1.31 — one core rounded up, where the single 2026-10-21 run of 6.0s over 5.6s had
|
|
21
|
+
// rounded up to two.
|
|
22
|
+
const MEASURED = {
|
|
23
|
+
lint: { cpu_s: 16.9, wall_s: 14 },
|
|
24
|
+
type_check: { cpu_s: 31.2, wall_s: 27.3 },
|
|
25
|
+
spell_check: { cpu_s: 5.7, wall_s: 6.2 },
|
|
26
|
+
eslint_scan: { cpu_s: 113, wall_s: 98 },
|
|
27
|
+
format: { cpu_s: 2.1, wall_s: 1.7 },
|
|
28
|
+
retrospective: { cpu_s: 16.5, wall_s: 19.8 },
|
|
29
|
+
install: { cpu_s: 1.9, wall_s: 6.1 },
|
|
30
|
+
} as const satisfies Readonly<Record<string, Measurement>>
|
|
31
|
+
|
|
32
|
+
// **Rounded up, never down** (joshuafolkken/kit#4362): a weight is a whole number of cores, and the
|
|
33
|
+
// floored table of joshuafolkken/kit#3354 let a 1.15-core eslint scan claim one, so the budget admitted
|
|
34
|
+
// more than the machine had.
|
|
35
|
+
function rounded_up(measurement: Measurement): number {
|
|
36
|
+
return Math.ceil(measurement.cpu_s / measurement.wall_s)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// **The cores each heavy tool occupies, declared once for both places that reserve them**
|
|
40
|
+
// `gate-plan.ts`'s checks and the `josh` commands that run the same tools
|
|
41
|
+
// directly read these, so a direct `josh lint` claims what the gate's lint claims. Each is its
|
|
42
|
+
// measurement rounded up. `e2e` is the Playwright worker count `josh test:e2e` passes locally — the
|
|
43
|
+
// two-worker run CI already sizes for its four-core runner — since kit has no e2e suite of its own to
|
|
44
|
+
// time.
|
|
45
|
+
const CORE_WEIGHTS = {
|
|
46
|
+
lint: rounded_up(MEASURED.lint),
|
|
47
|
+
type_check: rounded_up(MEASURED.type_check),
|
|
48
|
+
spell_check: rounded_up(MEASURED.spell_check),
|
|
49
|
+
eslint_scan: rounded_up(MEASURED.eslint_scan),
|
|
50
|
+
format: rounded_up(MEASURED.format),
|
|
51
|
+
retrospective: rounded_up(MEASURED.retrospective),
|
|
52
|
+
install: rounded_up(MEASURED.install),
|
|
53
|
+
e2e: 2,
|
|
54
|
+
} as const
|
|
55
|
+
|
|
56
|
+
// **The memory each heavy tool holds, declared beside its cores**: peak
|
|
57
|
+
// resident size in MB, rounded up. Measured with `/usr/bin/time -l` on the 11-core / 18 GB machine on
|
|
58
|
+
// 2026-10-07: the type check 1,244 MB, the spell check 330 MB, and one unit worker 319 MB over 54 test
|
|
59
|
+
// files. Typed eslint was 1,207 MB over one directory and was observed at 1.6–2.4 GB per whole-tree
|
|
60
|
+
// `eslint .` with three lanes running the same day, so lint and the whole-tree scan take that peak.
|
|
61
|
+
// On 2026-10-17: prettier 260 MB, the retrospective 862 MB and a lane install 65 MB. On 2026-10-22
|
|
62
|
+
// (joshuafolkken/kit#4528) the whole suite, 1,830 files at `--maxWorkers=3` beside four lanes, sampled
|
|
63
|
+
// each worker's resident size once a second: the largest peaked at 381 MB, so the 54-file
|
|
64
|
+
// measurement had read a worker short of the files it lives through. On 2026-10-23
|
|
65
|
+
// (joshuafolkken/kit#4595) `josh metrics`, its process tree sampled four times a second, peaked at
|
|
66
|
+
// 1,176 MB on a merge-base cache hit and 1,851 MB on a miss, where its own untyped `max-lines`-only
|
|
67
|
+
// eslint pass still holds its heap beside the `--json` child measuring the merge-base. It takes the miss.
|
|
68
|
+
const MEMORY_MB = {
|
|
69
|
+
lint: 2400,
|
|
70
|
+
metrics: 1900,
|
|
71
|
+
type_check: 1300,
|
|
72
|
+
spell_check: 350,
|
|
73
|
+
eslint_scan: 2400,
|
|
74
|
+
unit_worker: 400,
|
|
75
|
+
format: 300,
|
|
76
|
+
retrospective: 900,
|
|
77
|
+
install: 100,
|
|
78
|
+
} as const
|
|
79
|
+
|
|
80
|
+
// **The program a command launches, mapped to the `MEMORY_MB` row it holds** — the one table
|
|
81
|
+
// `command-memory.ts` reads a wrapped command's memory off. `install` is `pnpm install` read past its
|
|
82
|
+
// `pnpm` wrapper (`git_argv.program_of`).
|
|
83
|
+
const TOOL_MEMORY: Readonly<Partial<Record<string, keyof typeof MEMORY_MB>>> = {
|
|
84
|
+
eslint: 'lint',
|
|
85
|
+
tsc: 'type_check',
|
|
86
|
+
cspell: 'spell_check',
|
|
87
|
+
vitest: 'unit_worker',
|
|
88
|
+
prettier: 'format',
|
|
89
|
+
install: 'install',
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const core_weights = { CORE_WEIGHTS, MEASURED, MEMORY_MB, TOOL_MEMORY }
|
|
93
|
+
|
|
94
|
+
export { core_weights }
|