@joshuafolkken/kit 1.1240.0 → 1.1370.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 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +29 -47
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +216 -202
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +281 -94
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +58 -47
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { LedgerLoad, MachineBudget } from './machine-capacity'
|
|
2
2
|
|
|
3
3
|
// The ledger's admission arithmetic, kept apart from the markers `core-budget.ts` reads and writes so
|
|
4
|
-
// that file stays under its line ceiling as the budget grew a memory side
|
|
4
|
+
// that file stays under its line ceiling as the budget grew a memory side.
|
|
5
5
|
// Everything here is a pure function of the ledger it is handed.
|
|
6
6
|
|
|
7
7
|
const MS_PER_SECOND = 1000
|
|
@@ -63,7 +63,7 @@ function exceeds(totals: LedgerLoad, budget: MachineBudget): boolean {
|
|
|
63
63
|
// cumulative weight ahead of it still fits the budget. The first that does not fit stops the walk, so a
|
|
64
64
|
// place is never jumped: admission is in claim order, which is what removes the start-time asymmetry.
|
|
65
65
|
// Memory is walked the same way, so a claim whose tool would not fit in free memory waits like one whose
|
|
66
|
-
// cores would not fit
|
|
66
|
+
// cores would not fit.
|
|
67
67
|
function admitted_keys(
|
|
68
68
|
reservations: ReadonlyArray<LedgerEntry>,
|
|
69
69
|
budget: number,
|
|
@@ -6,25 +6,20 @@ import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
|
6
6
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
7
7
|
import { process_owner_schema } from '#scripts/josh/process-owner'
|
|
8
8
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
9
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
9
10
|
import { unit_worker_share } from '#scripts/test/unit-worker-share'
|
|
10
11
|
import { z } from 'zod'
|
|
11
12
|
import { core_admission, type Admission, type LedgerEntry, type Overflow } from './core-admission'
|
|
12
13
|
import { machine_capacity, type MachineBudget, type MachineReading } from './machine-capacity'
|
|
13
14
|
|
|
14
|
-
// A machine-wide weighted core budget with admission control
|
|
15
|
+
// A machine-wide weighted core budget with admission control.
|
|
15
16
|
//
|
|
16
|
-
// **
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
// **The fix is admission rather than recomputation.** A heavy step declares the cores it needs, claims
|
|
24
|
-
// a place in a machine-wide ledger, and waits while the ledger is full — so the peak cannot exceed the
|
|
25
|
-
// budget by construction, and the asymmetry ("whoever started first took everything") disappears
|
|
26
|
-
// because a place is claimed in claim order rather than seized at start. Waiting is what replaces the
|
|
27
|
-
// recomputation `unit-worker-share.ts` did: a step that could not fit does not shrink, it defers.
|
|
17
|
+
// **Admission rather than a budget sized once at the gate's start.** A budget read once at the start
|
|
18
|
+
// has every gate that sees no sibling conclude it is alone and reserve the whole machine, so
|
|
19
|
+
// overlapping gates oversubscribe it. Instead a heavy step declares the cores it needs, claims a place
|
|
20
|
+
// in a machine-wide ledger, and waits while the ledger is full — so the peak cannot exceed the budget
|
|
21
|
+
// by construction, and a place is claimed in claim order rather than seized at start. A step that
|
|
22
|
+
// could not fit does not shrink, it defers.
|
|
28
23
|
//
|
|
29
24
|
// **A solo run is bit-for-bit unchanged, and that is arithmetic rather than a branch.** The gate's
|
|
30
25
|
// weights are its `reserved_cores` (the static checks) and its `unit_worker_cap` (the unit suite), and
|
|
@@ -32,12 +27,12 @@ import { machine_capacity, type MachineBudget, type MachineReading } from './mac
|
|
|
32
27
|
// to the whole budget and every one is admitted the instant it is made, with no poll and no wait. Under
|
|
33
28
|
// concurrency the same weights sum past the budget and the ledger is what holds the machine down.
|
|
34
29
|
//
|
|
35
|
-
// **Liveness is `process_identity`'s, reused rather than re-invented
|
|
30
|
+
// **Liveness is `process_identity`'s, reused rather than re-invented.** A run
|
|
36
31
|
// killed outright leaves its marker behind, and a ledger that trusted the file alone would fill forever
|
|
37
32
|
// and admit nothing. The pid-and-start-time pair a marker carries is the same identity the unit-run
|
|
38
33
|
// marker keeps, swept on read the moment its process is gone.
|
|
39
34
|
//
|
|
40
|
-
// **The budget is what the machine has free, in cores and in memory
|
|
35
|
+
// **The budget is what the machine has free, in cores and in memory.** The
|
|
41
36
|
// core count stays the ceiling, but load from outside the ledger is subtracted from it, and a claim
|
|
42
37
|
// waits while the memory its tool holds is not free — `machine-capacity.ts` reads both. A claim marks
|
|
43
38
|
// its marker admitted once it runs, so the reading's load is split into the ledger's and the rest.
|
|
@@ -55,7 +50,7 @@ const WAIT_CAP_MS = 120_000
|
|
|
55
50
|
const MIN_BUDGET = 1
|
|
56
51
|
|
|
57
52
|
// **The cores each heavy tool occupies, declared once for both places that reserve them**
|
|
58
|
-
//
|
|
53
|
+
// `gate-plan.ts`'s checks and the `josh` commands that run the same tools
|
|
59
54
|
// directly read these, so a direct `josh lint` claims what the gate's lint claims. The lint, type check
|
|
60
55
|
// and spell check numbers are `gate-plan.ts`'s measured table, floored. The whole-tree eslint scan
|
|
61
56
|
// behind `josh lines` and `josh refactor:scan` runs in one process: measured cold on the 11-core
|
|
@@ -67,7 +62,7 @@ const CORE_WEIGHTS = {
|
|
|
67
62
|
eslint_scan: 1,
|
|
68
63
|
} as const
|
|
69
64
|
|
|
70
|
-
// **The memory each heavy tool holds, declared beside its cores
|
|
65
|
+
// **The memory each heavy tool holds, declared beside its cores**: peak
|
|
71
66
|
// resident size in MB, rounded up. Measured with `/usr/bin/time -l` on the 11-core / 18 GB machine on
|
|
72
67
|
// 2026-10-07: the type check 1,244 MB, the spell check 330 MB, and one unit worker 319 MB over 54 test
|
|
73
68
|
// files. Typed eslint was 1,207 MB over one directory and was observed at 1.6–2.4 GB per whole-tree
|
|
@@ -81,7 +76,7 @@ const MEMORY_MB = {
|
|
|
81
76
|
} as const
|
|
82
77
|
|
|
83
78
|
// **The environment mark that says a parent already holds this process's cores**
|
|
84
|
-
//
|
|
79
|
+
// `josh gate` reserves per check and then spawns `pnpm josh lint`. Without
|
|
85
80
|
// the mark, that child's own dispatch would claim a second place for the cores its parent already
|
|
86
81
|
// holds. Every holder sets it, and every child inherits it through the environment and claims nothing.
|
|
87
82
|
const HELD_KEY = 'JOSH_CORE_RESERVED'
|
|
@@ -135,13 +130,7 @@ function read_reservation(source: string): Reservation | undefined {
|
|
|
135
130
|
|
|
136
131
|
if (raw === undefined) return undefined
|
|
137
132
|
|
|
138
|
-
|
|
139
|
-
const parsed = reservation_schema.safeParse(JSON.parse(raw))
|
|
140
|
-
|
|
141
|
-
return parsed.success ? parsed.data : undefined
|
|
142
|
-
} catch {
|
|
143
|
-
return undefined
|
|
144
|
-
}
|
|
133
|
+
return json_value.parse_with(raw, reservation_schema)
|
|
145
134
|
}
|
|
146
135
|
|
|
147
136
|
// **A dead marker is removed, not merely skipped** — otherwise a reissued pid turns a leaked place into
|
|
@@ -369,7 +358,7 @@ async function with_held_mark<T>(run: () => Promise<T>): Promise<T> {
|
|
|
369
358
|
}
|
|
370
359
|
|
|
371
360
|
// **A command's reservation: the gate's claim, unless a parent already holds the cores**
|
|
372
|
-
//
|
|
361
|
+
// `josh-logic.ts` calls this around every command that declares a weight.
|
|
373
362
|
// Each command then only declares its weight, and no command carries a copy of the claim, run and
|
|
374
363
|
// release steps. A solo run is admitted on the first read, so a run with room on the machine starts
|
|
375
364
|
// with no wait. A command inside a unit suite claims nothing either, for the reason `reserved-run.ts`
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { process_identity } from '#scripts/josh/process-identity'
|
|
2
|
+
import { lane_ledger } from '#scripts/lane/lane-ledger'
|
|
3
|
+
import { core_admission } from './core-admission'
|
|
4
|
+
import { core_budget } from './core-budget'
|
|
5
|
+
import { gate_plan } from './gate-plan'
|
|
6
|
+
import type { GateStepResult } from './gate-report'
|
|
7
|
+
import { machine_capacity } from './machine-capacity'
|
|
8
|
+
|
|
9
|
+
// A finished gate's line in the lane ledger: its duration, its verdict, its
|
|
10
|
+
// unit suite's duration, and the load it ran beside, so `josh metrics`
|
|
11
|
+
// compares only gates the machine was quiet for. Another gate's span is not the only load: another
|
|
12
|
+
// lane's lint, related tests or `ship` doubled a solo gate's duration within minutes.
|
|
13
|
+
//
|
|
14
|
+
// **The machine is read where none of the gate's own checks runs — before the first starts and after
|
|
15
|
+
// the last ends.** The load average cannot tell the two apart: a solo gate started at 4 on the 11-core
|
|
16
|
+
// machine ended at 21, its own load. The reading is the core budget's own, so "quiet" means what
|
|
17
|
+
// admission means by it: no whole core busy beyond the baseline the gate's weights were measured beside.
|
|
18
|
+
//
|
|
19
|
+
// **Between the ends, the load is read off the core budget's ledger, not the CPU**.
|
|
20
|
+
// Two readings missed every lane whose lint, tests or `ship` ran only while
|
|
21
|
+
// the gate did: seven lanes moved the solo median from 50.5s to 60.9s with no commit between. The CPU
|
|
22
|
+
// mid-gate holds this gate's own checks, whose declared weights are not what they burn, so the ledger
|
|
23
|
+
// is what tells the two apart: another `josh` run's admitted claim is another process's place, and its
|
|
24
|
+
// weight is the cores it holds. A claim still waiting holds none.
|
|
25
|
+
|
|
26
|
+
const NO_LEDGER_CORES = 0
|
|
27
|
+
// Often enough to catch another lane's shortest related lint, seldom enough that reading the markers —
|
|
28
|
+
// a process probe each — costs the gate nothing it could measure.
|
|
29
|
+
const SAMPLE_INTERVAL_MS = 3000
|
|
30
|
+
|
|
31
|
+
// Where the line goes, the external load read so far — before the first check started, then every
|
|
32
|
+
// sample since — and the timer taking the samples. No readings and no timer when no ledger was
|
|
33
|
+
// resolved: a suite driving the gate reads the machine for nothing.
|
|
34
|
+
interface GateLedgerStart {
|
|
35
|
+
ledger_path: string | undefined
|
|
36
|
+
readings: Array<number | undefined>
|
|
37
|
+
sampler: ReturnType<typeof setInterval> | undefined
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface GateOutcome {
|
|
41
|
+
elapsed_ms: number
|
|
42
|
+
is_passed: boolean
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// `undefined` where the machine could not be read — a CI runner, a CPU quota narrower than the host.
|
|
46
|
+
async function read_external_cores(): Promise<number | undefined> {
|
|
47
|
+
const { busy_cores } = await machine_capacity.read_machine()
|
|
48
|
+
|
|
49
|
+
if (busy_cores === undefined) return undefined
|
|
50
|
+
|
|
51
|
+
return machine_capacity.external_cores(busy_cores, NO_LEDGER_CORES)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The cores other processes' admitted claims hold now. This gate's own claims are written by this
|
|
55
|
+
// process, and its checks' dispatches claim nothing under its held mark.
|
|
56
|
+
function read_foreign_cores(): number {
|
|
57
|
+
const foreign = core_budget
|
|
58
|
+
.live_reservations()
|
|
59
|
+
.filter(
|
|
60
|
+
({ reservation }) =>
|
|
61
|
+
!process_identity.is_own_process(reservation.pid, reservation.process_start),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
return core_admission.ledger_load(foreign, Date.now()).cores
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// The highest reading; one unread reading leaves the whole gate unread rather than half-quiet.
|
|
68
|
+
function peak(readings: ReadonlyArray<number | undefined>): number | undefined {
|
|
69
|
+
const read = readings.filter((reading) => reading !== undefined)
|
|
70
|
+
|
|
71
|
+
if (read.length < readings.length) return undefined
|
|
72
|
+
|
|
73
|
+
return Math.max(...read)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Unreferenced, so a gate that throws before `record` never holds the process open on the timer.
|
|
77
|
+
function start_sampler(readings: Array<number | undefined>): ReturnType<typeof setInterval> {
|
|
78
|
+
return setInterval(() => {
|
|
79
|
+
readings.push(read_foreign_cores())
|
|
80
|
+
}, SAMPLE_INTERVAL_MS).unref()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function start(ledger_path: string | undefined): Promise<GateLedgerStart> {
|
|
84
|
+
if (ledger_path === undefined) return { ledger_path, readings: [], sampler: undefined }
|
|
85
|
+
|
|
86
|
+
const readings = [await read_external_cores()]
|
|
87
|
+
|
|
88
|
+
return { ledger_path, readings, sampler: start_sampler(readings) }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// The caller measures the elapsed time before this, so the end's reading is never part of it.
|
|
92
|
+
async function record(
|
|
93
|
+
begun: GateLedgerStart,
|
|
94
|
+
results: ReadonlyArray<GateStepResult>,
|
|
95
|
+
outcome: GateOutcome,
|
|
96
|
+
): Promise<void> {
|
|
97
|
+
clearInterval(begun.sampler)
|
|
98
|
+
|
|
99
|
+
if (begun.ledger_path === undefined) return
|
|
100
|
+
|
|
101
|
+
const unit_ms = results.find((result) => result.label === gate_plan.UNIT_LABEL)?.elapsed_ms
|
|
102
|
+
const external_cores = peak([...begun.readings, await read_external_cores()])
|
|
103
|
+
|
|
104
|
+
await lane_ledger.record_gate(begun.ledger_path, { ...outcome, unit_ms, external_cores })
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const gate_ledger = {
|
|
108
|
+
SAMPLE_INTERVAL_MS,
|
|
109
|
+
record,
|
|
110
|
+
start,
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export type { GateLedgerStart }
|
|
114
|
+
export { gate_ledger }
|
package/scripts/gate/gate-log.ts
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
2
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
3
|
|
|
4
|
-
// The verification gate's full output, kept somewhere the console's size limit cannot reach
|
|
5
|
-
// (joshuafolkken/kit#1227).
|
|
4
|
+
// The verification gate's full output, kept somewhere the console's size limit cannot reach.
|
|
6
5
|
//
|
|
7
|
-
// **The
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// check by hand, which is a judgement the reader has to make about output they cannot see.
|
|
6
|
+
// **The console cannot be the only copy of a failure's detail.** `josh gate` buffers every check and
|
|
7
|
+
// prints the failing ones whole, and `BASH_MAX_OUTPUT_LENGTH` caps what a command may carry into an
|
|
8
|
+
// agent's context. The verdict is the last line and so always survives, which is why a red gate can
|
|
9
|
+
// never read as green; what does not survive is the middle, and the middle is where the failure says
|
|
10
|
+
// what it was. Re-running one check by hand is a judgement the reader would have to make about output
|
|
11
|
+
// they cannot see.
|
|
14
12
|
//
|
|
15
13
|
// So the gate writes every check's output to a file and prints where it is. Nothing about the
|
|
16
14
|
// verdict changes; what changes is that the detail behind it no longer exists only in a window that
|
|
@@ -4,7 +4,7 @@ import { unit_worker_share } from '#scripts/test/unit-worker-share'
|
|
|
4
4
|
import { core_budget } from './core-budget'
|
|
5
5
|
|
|
6
6
|
// How many of the gate's checks run at once, and how wide the one elastic check may fan out —
|
|
7
|
-
// both derived from the machine rather than fixed at four
|
|
7
|
+
// both derived from the machine rather than fixed at four.
|
|
8
8
|
//
|
|
9
9
|
// **The measurement this table is built from.** Apple M3 Pro, 11 logical cores (5 performance +
|
|
10
10
|
// 6 efficiency, about 9 cores of aggregate throughput on this workload), warm caches, each check
|
|
@@ -19,10 +19,8 @@ import { core_budget } from './core-budget'
|
|
|
19
19
|
//
|
|
20
20
|
// Two things follow. **The concurrent gate is already the faster shape** — 15.1s together against
|
|
21
21
|
// 19.1s back to back, the median of three interleaved runs on the same tree, and the one pair
|
|
22
|
-
// `
|
|
23
|
-
//
|
|
24
|
-
// real when the type check and the spell check cost 6.9s and 3.6s of CPU, and joshuafolkken/kit#1256
|
|
25
|
-
// removed it by giving both a cache. **And the unit suite is the only check worth sizing**: it
|
|
22
|
+
// `docs/josh-commands.md` quotes too — so this is a widening of an existing win. **And the unit
|
|
23
|
+
// suite is the only check worth sizing**: it
|
|
26
24
|
// alone accounts for 107 of the 122 CPU-seconds, because vitest opens one worker per core while
|
|
27
25
|
// the other three are one or two processes each.
|
|
28
26
|
|
|
@@ -30,6 +28,8 @@ interface GateCheck {
|
|
|
30
28
|
label: string
|
|
31
29
|
// The `josh` sub-command that defines the check, and the one an appended argument belongs to.
|
|
32
30
|
target: string
|
|
31
|
+
// Arguments the gate always hands the target, before any appended one.
|
|
32
|
+
args?: ReadonlyArray<string>
|
|
33
33
|
// Cores this check holds for as long as it runs — the measured ratio above, floored to whole
|
|
34
34
|
// cores and never below one. Floored rather than rounded because this is the share the *other*
|
|
35
35
|
// checks must give up: over-reserving costs the elastic check workers it would have used.
|
|
@@ -37,40 +37,46 @@ interface GateCheck {
|
|
|
37
37
|
// instead of reserved, and counting it here would reserve cores against itself.
|
|
38
38
|
reserved_cores: number
|
|
39
39
|
// The memory this check holds while it runs, `core_budget.MEMORY_MB`'s measured peak; none declared is
|
|
40
|
-
// none waited for
|
|
40
|
+
// none waited for. The unit suite's is per worker, so it is derived instead.
|
|
41
41
|
memory_mb?: number
|
|
42
|
+
// A check whose `josh` command is kit-only, so a consumer's gate leaves it out rather than running
|
|
43
|
+
// a command that is not in the published package. It restates the command
|
|
44
|
+
// entry's own `is_kit_only`, because the command map imports this module; `gate-plan.test.ts` pins
|
|
45
|
+
// that the two agree.
|
|
46
|
+
is_kit_only?: boolean
|
|
42
47
|
}
|
|
43
48
|
|
|
44
49
|
const LINT_LABEL = 'lint'
|
|
45
50
|
const TYPE_CHECK_LABEL = 'check'
|
|
46
51
|
const UNIT_LABEL = 'test:unit'
|
|
47
52
|
const BEHAVIOR_LABEL = 'behavior'
|
|
53
|
+
const METRICS_LABEL = 'metrics'
|
|
48
54
|
|
|
49
55
|
// The checks whose warnings must survive the green record: eslint (the `lint` step) and svelte-check
|
|
50
56
|
// (the `check` step) both exit 0 while reporting per-tree warnings a developer needs to see again, so
|
|
51
|
-
// reusing a record taken from such a run would hide them
|
|
57
|
+
// reusing a record taken from such a run would hide them. Every other step's
|
|
52
58
|
// warning-shaped output — a Vite config deprecation printed by `test:unit`, say — is not a per-tree
|
|
53
|
-
// finding and repeats every run, so it must not withhold the record.
|
|
54
|
-
//
|
|
59
|
+
// finding and repeats every run, so it must not withhold the record. `has_checker_warning` narrows
|
|
60
|
+
// the withholding path down to these.
|
|
55
61
|
const WARNING_CHECKER_LABELS: ReadonlyArray<string> = [LINT_LABEL, TYPE_CHECK_LABEL]
|
|
56
62
|
|
|
57
63
|
// The checks that do not fan out across every core, in the order their output is printed. They are
|
|
58
|
-
// named apart from the unit suite because CI runs them on their own runner
|
|
64
|
+
// named apart from the unit suite because CI runs them on their own runner:
|
|
59
65
|
// the unit suite is the only check that fans out across every core, so on a 4-core GitHub runner it
|
|
60
66
|
// and the others spent the whole job taking cores off each other.
|
|
61
67
|
//
|
|
62
|
-
// **The behavior check belongs here, and it reserves no core
|
|
68
|
+
// **The behavior check belongs here, and it reserves no core**. It reads one
|
|
63
69
|
// recorded transcript rather than the tree, so it is I/O-bound and a zero reservation leaves
|
|
64
70
|
// `RESERVED_CORES` and the unit worker cap exactly where the other three were measured. Being a static
|
|
65
71
|
// check rather than one appended after the unit suite is what keeps the plan's shape intact: the
|
|
66
72
|
// `--no-unit` set stays "the whole gate minus the unit suite", and a CI runner — which has no recorded
|
|
67
73
|
// transcripts — runs it as a trivial green rather than skipping it.
|
|
68
74
|
//
|
|
69
|
-
// **The three reserving weights are `core_budget.CORE_WEIGHTS
|
|
75
|
+
// **The three reserving weights are `core_budget.CORE_WEIGHTS`**, the same
|
|
70
76
|
// numbers the `josh lint`, `josh check` and `josh cspell:dot` commands claim when run directly.
|
|
71
77
|
//
|
|
72
|
-
// **The two zero weights
|
|
73
|
-
//
|
|
78
|
+
// **The two zero weights are measured, and they stay zero.** These are warm runs on the 11-core
|
|
79
|
+
// machine. `behavior` took 0.6s of wall for 0.7s of CPU, which
|
|
74
80
|
// is node starting up. `exports:unused` took 5.5s of wall for 9.0s of CPU, about 1.6 cores. Floored,
|
|
75
81
|
// that would be one core, but a reservation lasts the whole gate's plan, not the check's five seconds.
|
|
76
82
|
// It would lower `RESERVED_CORES` from 4 to 5 and cut the solo unit cap from 7 workers to 6 for the
|
|
@@ -96,11 +102,23 @@ const STATIC_CHECKS: ReadonlyArray<GateCheck> = [
|
|
|
96
102
|
memory_mb: core_budget.MEMORY_MB.spell_check,
|
|
97
103
|
},
|
|
98
104
|
{ label: BEHAVIOR_LABEL, target: BEHAVIOR_LABEL, reserved_cores: 0 },
|
|
99
|
-
// **The unused-member check reserves no core
|
|
105
|
+
// **The unused-member check reserves no core**: it builds one TypeScript
|
|
100
106
|
// program and walks it for about 5s, and it is over well before lint and the type check. A
|
|
101
107
|
// reservation would only take a place from the four-core CI runner's fan-out and a worker from the
|
|
102
108
|
// unit suite for the whole gate.
|
|
103
109
|
{ label: 'exports', target: 'exports:unused', reserved_cores: 0 },
|
|
110
|
+
// **The metrics ratchet is kit's own**: it holds kit's repository-wide
|
|
111
|
+
// totals to the merge-base's. It is one in-process eslint pass with only `max-lines` enabled, over
|
|
112
|
+
// in a few seconds, so it reserves no core for the reason the unused-member check above does not.
|
|
113
|
+
// It times no startup here: beside the unit suite that reads the load, not josh.
|
|
114
|
+
{
|
|
115
|
+
label: METRICS_LABEL,
|
|
116
|
+
target: METRICS_LABEL,
|
|
117
|
+
args: ['--no-startup'],
|
|
118
|
+
reserved_cores: 0,
|
|
119
|
+
memory_mb: core_budget.MEMORY_MB.eslint_scan,
|
|
120
|
+
is_kit_only: true,
|
|
121
|
+
},
|
|
104
122
|
]
|
|
105
123
|
|
|
106
124
|
// The checks, in the order their output is printed — the static set, then the unit suite last (the
|
|
@@ -116,8 +134,15 @@ const GATE_CHECKS: ReadonlyArray<GateCheck> = [
|
|
|
116
134
|
// set safe is that nothing downstream may mistake it for the full gate: `verification-gate.ts`
|
|
117
135
|
// withholds both the green-gate record and the in-flight marker on a partial run, so a `--no-unit`
|
|
118
136
|
// gate can never tell `josh review:brief` that the unit suite passed on this tree.
|
|
119
|
-
|
|
120
|
-
|
|
137
|
+
//
|
|
138
|
+
// A consumer's gate also drops the kit-only checks, whose commands its installed kit does not have.
|
|
139
|
+
function select_gate_checks(
|
|
140
|
+
is_unit_included: boolean,
|
|
141
|
+
is_kit_repository = true,
|
|
142
|
+
): ReadonlyArray<GateCheck> {
|
|
143
|
+
const checks = is_unit_included ? GATE_CHECKS : STATIC_CHECKS
|
|
144
|
+
|
|
145
|
+
return is_kit_repository ? checks : checks.filter((check) => check.is_kit_only !== true)
|
|
121
146
|
}
|
|
122
147
|
|
|
123
148
|
// Asked of the plan rather than of the flag, so the one question "did this gate run the unit suite"
|
|
@@ -169,7 +194,7 @@ interface GatePlan {
|
|
|
169
194
|
}
|
|
170
195
|
|
|
171
196
|
// This gate's share of the machine — the cores it may plan against once the other gates in flight
|
|
172
|
-
// have theirs
|
|
197
|
+
// have theirs.
|
|
173
198
|
//
|
|
174
199
|
// **At one run this is the identity, and that is the whole argument that solo behavior is
|
|
175
200
|
// unchanged.** `Math.floor(cores / 1)` is `cores`, so a solo gate and a CI runner hand the admission
|
|
@@ -197,8 +222,8 @@ function shared_cores(available_cores: number, concurrent_runs: number): number
|
|
|
197
222
|
// difference between two checks sharing a core and four fighting over it.
|
|
198
223
|
//
|
|
199
224
|
// **Under concurrency it is the only lever there is, and that is a measurement rather than a
|
|
200
|
-
// preference
|
|
201
|
-
//
|
|
225
|
+
// preference**. `josh gate` starts four checks at once and sizing only the unit suite let six lanes
|
|
226
|
+
// put 18 unbounded checks on 11 cores: measured on that machine,
|
|
202
227
|
// one gate took 254.1s with lint alone at 252.9s against the 5.2s the table above records for it
|
|
203
228
|
// solo. The obvious repair — hand each of the other three a worker count the way the unit suite gets
|
|
204
229
|
// one — **does not exist to be applied**: eslint 10's `--concurrency` defaults to `off` and is
|
|
@@ -235,7 +260,7 @@ function resolve_concurrency(
|
|
|
235
260
|
// 107s). A machine smaller than the measured one is left uncapped; see `MEASURED_CORES`.
|
|
236
261
|
//
|
|
237
262
|
// **The table above is a measurement of one gate on an idle machine, and `concurrent_runs` is what
|
|
238
|
-
// says whether that is the situation
|
|
263
|
+
// says whether that is the situation**. Six lanes each reading "11 cores,
|
|
239
264
|
// take 7" put 42 workers on 11 cores, at a load average of 14.97, and the gate had no way to know the
|
|
240
265
|
// other five existed. Where more than one unit run is in flight the machine is divided between them
|
|
241
266
|
// instead, by `unit-worker-share.ts`, which is the same answer `test-unit-guard.ts` gives the pre-push
|
|
@@ -251,11 +276,11 @@ function resolve_concurrency(
|
|
|
251
276
|
// oversubscription for an unmeasured starvation is not an improvement anyone can defend. What *is*
|
|
252
277
|
// measured is the unit half — six concurrent suites went from ten timeouts to none at this share.
|
|
253
278
|
//
|
|
254
|
-
//
|
|
255
|
-
//
|
|
256
|
-
//
|
|
257
|
-
//
|
|
258
|
-
//
|
|
279
|
+
// **`resolve_concurrency` narrows the gate and leaves this number alone.** A narrowed gate no longer
|
|
280
|
+
// runs its three siblings *beside* its unit step, so the paragraph above over-states what the share
|
|
281
|
+
// is competing with — which is an argument for widening it, and widening it is exactly the
|
|
282
|
+
// unmeasured move that paragraph refuses. The measured number stays until something measures a
|
|
283
|
+
// better one on this machine.
|
|
259
284
|
//
|
|
260
285
|
// **The count is a parameter rather than a read.** This module stays a pure function of its inputs, so
|
|
261
286
|
// its own assertions are about arithmetic and not about what happened to be running while they ran;
|
|
@@ -277,7 +302,7 @@ function solo_unit_weight(available_cores: number): number {
|
|
|
277
302
|
return Math.max(0, available_cores - RESERVED_CORES)
|
|
278
303
|
}
|
|
279
304
|
|
|
280
|
-
// The cores a check reserves from the machine-wide budget while it runs
|
|
305
|
+
// The cores a check reserves from the machine-wide budget while it runs. The
|
|
281
306
|
// static checks declare their measured reservation; the unit suite declares the pool it will open,
|
|
282
307
|
// which `unit_worker_cap` has already sized against the runs in flight. **This is the same table, read
|
|
283
308
|
// once**: no second set of weights is introduced, so a change to the measured reservation moves the
|
|
@@ -298,7 +323,7 @@ function unit_memory(workers: number): number {
|
|
|
298
323
|
return workers * core_budget.MEMORY_MB.unit_worker
|
|
299
324
|
}
|
|
300
325
|
|
|
301
|
-
// The memory a check holds
|
|
326
|
+
// The memory a check holds: its declared figure, or for the unit suite one
|
|
302
327
|
// worker's peak for each core it reserves — its weight is its worker count.
|
|
303
328
|
function check_memory(check: GateCheck, plan: GatePlan, available_cores: number): number {
|
|
304
329
|
if (check.label !== UNIT_LABEL) return check.memory_mb ?? 0
|
|
@@ -306,7 +331,7 @@ function check_memory(check: GateCheck, plan: GatePlan, available_cores: number)
|
|
|
306
331
|
return unit_memory(check_weight(check, plan, available_cores))
|
|
307
332
|
}
|
|
308
333
|
|
|
309
|
-
// The cores a unit run started directly reserves
|
|
334
|
+
// The cores a unit run started directly reserves: the share it will pass to
|
|
310
335
|
// vitest while other runs are live, and otherwise the gate's own solo unit weight. **Not the whole
|
|
311
336
|
// machine**, though a lone vitest sizes its own pool: FIFO admission lets a claim of every core in only
|
|
312
337
|
// once the ledger is empty, so a one-file `josh test:related` would wait out every other lane's gate
|
|
@@ -329,6 +354,16 @@ function direct_unit_memory(): number {
|
|
|
329
354
|
return unit_memory(direct_unit_weight())
|
|
330
355
|
}
|
|
331
356
|
|
|
357
|
+
function unit_cap_for(
|
|
358
|
+
checks: ReadonlyArray<GateCheck>,
|
|
359
|
+
available_cores: number,
|
|
360
|
+
concurrent_runs: number,
|
|
361
|
+
): number | undefined {
|
|
362
|
+
if (!has_unit_check(checks)) return undefined
|
|
363
|
+
|
|
364
|
+
return resolve_unit_worker_cap(available_cores, concurrent_runs)
|
|
365
|
+
}
|
|
366
|
+
|
|
332
367
|
// `availableParallelism()` rather than `cpus().length`: it reports what this process may actually
|
|
333
368
|
// use, so a container with a CPU quota is sized by the quota rather than by the host.
|
|
334
369
|
// The three fields together, for a caller that has already decided the numbers. The gate's own
|
|
@@ -351,29 +386,28 @@ function resolve_gate_plan(
|
|
|
351
386
|
available_cores: number = availableParallelism(),
|
|
352
387
|
concurrent_runs: number = unit_worker_share.SOLO_RUNS,
|
|
353
388
|
is_unit_included = true,
|
|
389
|
+
is_kit_repository = true,
|
|
354
390
|
): GatePlan {
|
|
355
|
-
const checks = select_gate_checks(is_unit_included)
|
|
391
|
+
const checks = select_gate_checks(is_unit_included, is_kit_repository)
|
|
356
392
|
|
|
357
393
|
return {
|
|
358
394
|
checks,
|
|
359
395
|
concurrency: resolve_concurrency(available_cores, concurrent_runs, checks),
|
|
360
|
-
unit_worker_cap:
|
|
361
|
-
? resolve_unit_worker_cap(available_cores, concurrent_runs)
|
|
362
|
-
: undefined,
|
|
396
|
+
unit_worker_cap: unit_cap_for(checks, available_cores, concurrent_runs),
|
|
363
397
|
}
|
|
364
398
|
}
|
|
365
399
|
|
|
366
400
|
// Printed once per run, so a gate that was slow on someone else's machine can be read without
|
|
367
401
|
// re-deriving the plan from their core count.
|
|
368
402
|
//
|
|
369
|
-
// **The two fragments come from `josh-verdict.ts
|
|
403
|
+
// **The two fragments come from `josh-verdict.ts`.** `josh time` matches
|
|
370
404
|
// this line to tell where a gate run's output begins — it is the one line the gate prints before any
|
|
371
405
|
// check body exists — so the printer and the detector build it from the same strings, exactly as they
|
|
372
406
|
// already do for the verdict.
|
|
373
407
|
// **The machine is described as shared only when it is.** A solo gate prints exactly the line it
|
|
374
408
|
// always printed — which is what keeps `josh time`'s detector, and every reader used to the old
|
|
375
409
|
// output, unaffected — while a narrowed one says why it is narrow, so a lane owner reading a slow
|
|
376
|
-
// gate is not left deriving the reason from a worker count that looks wrong
|
|
410
|
+
// gate is not left deriving the reason from a worker count that looks wrong.
|
|
377
411
|
function format_machine(available_cores: number, concurrent_runs: number): string {
|
|
378
412
|
const cores = `${String(available_cores)} cores`
|
|
379
413
|
|
|
@@ -409,6 +443,7 @@ const gate_plan = {
|
|
|
409
443
|
GATE_CHECKS,
|
|
410
444
|
LINT_LABEL,
|
|
411
445
|
MEASURED_CORES,
|
|
446
|
+
METRICS_LABEL,
|
|
412
447
|
RESERVED_CORES,
|
|
413
448
|
STATIC_CHECKS,
|
|
414
449
|
TYPE_CHECK_LABEL,
|
|
@@ -7,7 +7,7 @@ import { gate_log } from './gate-log'
|
|
|
7
7
|
import { gate_plan } from './gate-plan'
|
|
8
8
|
|
|
9
9
|
// The gate's console reporting, split out of `verification-gate.ts` so that file stays under its line
|
|
10
|
-
// ceiling while it grows the scoped pre-check and the failure summary
|
|
10
|
+
// ceiling while it grows the scoped pre-check and the failure summary. Nothing
|
|
11
11
|
// about what is printed changes in the move: the four blocks, the log notice and the verdict come out
|
|
12
12
|
// exactly as before, with one addition — the per-failure action lines below.
|
|
13
13
|
|
|
@@ -25,7 +25,7 @@ interface GateStepResult extends BufferedProcessResult {
|
|
|
25
25
|
// What was actually run. The type check's command is resolved per project, so a failure on the
|
|
26
26
|
// `check` step is only reproducible if the header names the command rather than the label.
|
|
27
27
|
command: string
|
|
28
|
-
// Set when the check started past the machine-wide budget at the wait cap
|
|
28
|
+
// Set when the check started past the machine-wide budget at the wait cap.
|
|
29
29
|
budget_note?: string | undefined
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -36,8 +36,7 @@ function is_gate_step_failed(result: GateStepResult): boolean {
|
|
|
36
36
|
// A passing check's output is not read. What a green gate has to say is "all four passed", and
|
|
37
37
|
// `print_gate_summary` already says it in one line — while the four bodies, vitest's per-file
|
|
38
38
|
// listing among them, run to tens of kilobytes that then sit in the conversation and are re-read on
|
|
39
|
-
// every later turn. The gate runs more than once per Issue, so the cost is per run, not per Issue
|
|
40
|
-
// (joshuafolkken/kit#967).
|
|
39
|
+
// every later turn. The gate runs more than once per Issue, so the cost is per run, not per Issue.
|
|
41
40
|
//
|
|
42
41
|
// A failing check keeps its whole output: that is the one time the body is the answer. So does a
|
|
43
42
|
// check that **passed without running** — `test-unit-guard` exits 0 with a notice when vitest is
|
|
@@ -61,8 +60,8 @@ function has_warnings(result: GateStepResult): boolean {
|
|
|
61
60
|
return WARNING_MARKERS.some((marker) => result.output.includes(marker))
|
|
62
61
|
}
|
|
63
62
|
|
|
64
|
-
// The withholding path's counterpart to `has_warnings`, and deliberately narrower than it
|
|
65
|
-
//
|
|
63
|
+
// The withholding path's counterpart to `has_warnings`, and deliberately narrower than it.
|
|
64
|
+
// `has_warnings` is read by `should_print_body`, where a false positive
|
|
66
65
|
// costs one printed body — the loose match above is right there. `record_green_gate` reads *this*
|
|
67
66
|
// one, where a false positive is not one printed line but the whole green record withheld, which
|
|
68
67
|
// turns a green gate's `run:review --join` red. So the record is withheld only for a warning from a
|
|
@@ -70,7 +69,7 @@ function has_warnings(result: GateStepResult): boolean {
|
|
|
70
69
|
// from another tool that happens to contain the word — a Vite config deprecation on `test:unit` was
|
|
71
70
|
// the line that stopped a green gate's commit chain.
|
|
72
71
|
//
|
|
73
|
-
// **The safe-chain shim's banner is not the checker's either
|
|
72
|
+
// **The safe-chain shim's banner is not the checker's either**. Where
|
|
74
73
|
// `setup-ci` installed the shims but the binary cannot be reached, every `pnpm` a check spawns prints
|
|
75
74
|
// "Warning: safe-chain is not available …" into that check's output, so a green lint withheld the
|
|
76
75
|
// record on every CI run. The banner's lines are dropped before the match; a real warning on any
|
|
@@ -97,7 +96,7 @@ function should_print_body(result: GateStepResult, is_verbose: boolean): boolean
|
|
|
97
96
|
|
|
98
97
|
// Seconds to one decimal, which is the resolution the answer is read at: the question a gate's
|
|
99
98
|
// timing answers is "which of the four is the long pole", and no check is ever separated from
|
|
100
|
-
// another by less than a tenth of a second
|
|
99
|
+
// another by less than a tenth of a second.
|
|
101
100
|
const MS_PER_SECOND = 1000
|
|
102
101
|
const SECONDS_DECIMALS = 1
|
|
103
102
|
|
|
@@ -109,8 +108,8 @@ function format_seconds(elapsed_ms: number): string {
|
|
|
109
108
|
// naming the one command to re-run while fixing (`docs/josh-commands.md` → `josh gate`), and a
|
|
110
109
|
// number spliced in front of it would push that name out of the place a reader scans for it.
|
|
111
110
|
//
|
|
112
|
-
// Built rather than inlined because the log file names each section with the same string
|
|
113
|
-
//
|
|
111
|
+
// Built rather than inlined because the log file names each section with the same string:
|
|
112
|
+
// a header written twice is a header the two copies can disagree about,
|
|
114
113
|
// and the log exists precisely to be read when the console's copy has been elided.
|
|
115
114
|
function gate_step_header(result: GateStepResult): string {
|
|
116
115
|
const icon = is_gate_step_failed(result) ? FAIL_ICON : PASS_ICON
|
|
@@ -127,7 +126,7 @@ function print_gate_step(result: GateStepResult, is_verbose: boolean): void {
|
|
|
127
126
|
}
|
|
128
127
|
|
|
129
128
|
// **One line per failed check, naming the command that reproduces it, printed at the tail just above
|
|
130
|
-
// the verdict
|
|
129
|
+
// the verdict**. A red gate used to report every failing check only in its
|
|
131
130
|
// bodies, which is where truncation lands: the run picked one failure at a time across separate gate
|
|
132
131
|
// runs because it could not read the rest. The verdict names *which* checks failed; this names *what
|
|
133
132
|
// to run* for each, and it sits in the same tail window the verdict and the log notice already
|
|
@@ -143,8 +142,8 @@ function format_failure_actions(failed: ReadonlyArray<GateStepResult>): string {
|
|
|
143
142
|
return `${GATE_COMMAND} — next:\n${lines.join('\n')}\n`
|
|
144
143
|
}
|
|
145
144
|
|
|
146
|
-
// **A check that started past the core budget is said in the summary, not only in the log
|
|
147
|
-
//
|
|
145
|
+
// **A check that started past the core budget is said in the summary, not only in the log**.
|
|
146
|
+
// The wait cap admits a check that waited two minutes whatever the budget says,
|
|
148
147
|
// so a gate that ran over-subscribed would otherwise look exactly like one that fitted. The icon is
|
|
149
148
|
// local rather than in `status-icons.ts` because nothing reads this line back.
|
|
150
149
|
const WARN_ICON = '⚠'
|
|
@@ -163,7 +162,7 @@ function format_budget_notes(results: ReadonlyArray<GateStepResult>): string {
|
|
|
163
162
|
// so a sum would report about three times what the caller waited.
|
|
164
163
|
//
|
|
165
164
|
// The failure actions and the log path are printed with the summary and immediately **above** the
|
|
166
|
-
// verdict line, which stays last for the reason `josh-verdict.ts` gives
|
|
165
|
+
// verdict line, which stays last for the reason `josh-verdict.ts` gives.
|
|
167
166
|
function print_gate_summary(
|
|
168
167
|
results: ReadonlyArray<GateStepResult>,
|
|
169
168
|
report: GateReport,
|
|
@@ -191,7 +190,7 @@ interface GateReport {
|
|
|
191
190
|
|
|
192
191
|
// Everything a finished run says, in the order a reader meets it: the four blocks, then the log the
|
|
193
192
|
// blocks may have been elided out of, then the failure actions and the verdict. **Every check's whole
|
|
194
|
-
// output goes into the log, the ones the console dropped included
|
|
193
|
+
// output goes into the log, the ones the console dropped included**.
|
|
195
194
|
function report_gate_steps(
|
|
196
195
|
results: ReadonlyArray<GateStepResult>,
|
|
197
196
|
report: GateReport,
|