@joshuafolkken/kit 1.1784.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/workflow-commands/SKILL.md +6 -6
- package/.claude/skills/workflow-commands/background-commands.md +8 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +41 -32
- package/.claude/skills/workflow-commands/delegation.md +6 -6
- package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +7 -5
- package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +9 -4
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/kickoff.md +2 -2
- package/.claude/skills/workflow-commands/observation-filing.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
- package/.claude/skills/workflow-commands/prerequisite.md +3 -2
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +7 -5
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-pnpm/action.yml +9 -16
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +155 -15
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +59 -45
- package/.vscode/settings.json +19 -0
- package/CLAUDE.md +5 -12
- package/SECURITY.md +2 -2
- package/dist/CLAUDE.md +5 -12
- package/dist/commands/document-read-cli.js +2 -1
- package/dist/commands/document-section-main.js +2 -1
- package/dist/commands/read-set-cli.js +194 -134
- package/dist/commands/run-prep-main.js +9694 -10173
- package/dist/commands/run-step-cli.js +22138 -18285
- package/dist/hooks/audit-provision.js +23 -5
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
- package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
- package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
- package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +8 -8
- package/dist/hooks/format-edited.js +4 -5
- package/dist/hooks/inputs.json +415 -389
- package/dist/hooks/pretool-guard.js +7 -6
- package/dist/hooks/session-lang.js +101 -258
- package/dist/hooks/stop-guard.js +1744 -2576
- package/dist/josh.js +7133 -6368
- package/dist/version/index.js +161 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/package.json +15 -8
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +14 -11
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +40 -21
- package/prompts/collaboration-workflow/lane-instructions.md +3 -1
- package/prompts/collaboration-workflow/measurement.md +8 -1
- package/prompts/collaboration-workflow/operating-rules.md +11 -2
- package/prompts/collaboration-workflow/output-bounds.md +6 -2
- package/prompts/collaboration-workflow/plan-comment.md +1 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +3 -1
- package/prompts/review-rubric.md +8 -0
- package/prompts/review.md +31 -22
- package/prompts/testing-guide.md +1 -0
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +20 -9
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +6 -1
- package/scripts/backlog/backlog-drive-hold.ts +3 -3
- package/scripts/backlog/backlog-drive-idle.ts +10 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
- package/scripts/backlog/backlog-drive-named.ts +28 -7
- package/scripts/backlog/backlog-drive-paused.ts +5 -4
- package/scripts/backlog/backlog-drive-restore.ts +11 -3
- package/scripts/backlog/backlog-drive.ts +21 -60
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next.ts +39 -49
- package/scripts/backlog/backlog-occupied.ts +2 -2
- package/scripts/backlog/backlog-overlap.ts +42 -8
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +19 -6
- package/scripts/backlog/backlog-pool.ts +50 -12
- package/scripts/backlog/backlog-rank.ts +60 -13
- package/scripts/backlog/backlog-stalled-detect.ts +2 -1
- package/scripts/backlog/backlog-waves.ts +17 -2
- package/scripts/backlog/backlogrun-launch.ts +7 -4
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-cli.ts +37 -16
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +2 -2
- package/scripts/delegation/duplicate-read-guard.ts +1 -0
- package/scripts/delegation/investigation-guard.ts +14 -2
- package/scripts/delegation/investigation-reads.ts +45 -23
- package/scripts/dependabot/dependabot-cooldown.ts +3 -2
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +17 -7
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-cli-argv.ts +2 -2
- package/scripts/epic/epic-fetch.ts +4 -2
- package/scripts/epic/epic-graph.ts +7 -2
- package/scripts/epic/epic-issue.ts +3 -1
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +13 -10
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +41 -11
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
- package/scripts/followup/git-pr-followup.ts +62 -27
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
- package/scripts/gate/busy-average.ts +34 -2
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/command-memory.ts +1 -1
- package/scripts/gate/core-admission.ts +24 -6
- package/scripts/gate/core-budget-timing.ts +20 -6
- package/scripts/gate/core-budget.ts +40 -11
- package/scripts/gate/core-wait-record.ts +3 -2
- package/scripts/gate/core-wait.ts +25 -2
- package/scripts/gate/core-weights.ts +15 -7
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +14 -6
- package/scripts/gate/gate-plan.ts +103 -58
- package/scripts/gate/gate-report.ts +9 -7
- package/scripts/gate/gate-run-steps.ts +26 -3
- package/scripts/gate/gate-skip.ts +45 -6
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +2 -1
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/scoped-green.ts +68 -15
- package/scripts/gate/since-green.ts +14 -6
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/verification-gate.ts +51 -16
- package/scripts/gate/verification-inputs.ts +21 -6
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +23 -2
- package/scripts/gh/git-ai-review-scan.ts +1 -1
- package/scripts/gh/git-gh-api-path.ts +12 -3
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +4 -2
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +8 -2
- package/scripts/gh/git-gh-issue.ts +12 -5
- package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +3 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +21 -7
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +3 -0
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/git/base-tree.ts +30 -0
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +16 -1
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +66 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-schemas.ts +13 -0
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +53 -5
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +11 -2
- package/scripts/git/stash/stash-push-cli.ts +10 -0
- package/scripts/hooks/batch-guard.ts +40 -21
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +22 -2
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +14 -1
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +76 -10
- package/scripts/hooks/pretool-guard.ts +2 -0
- package/scripts/hooks/reserved-run.ts +14 -1
- package/scripts/hooks/run-hook.sh +23 -8
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +3 -15
- package/scripts/hooks/stop-guard.ts +7 -6
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +5 -1
- package/scripts/init/hook-launch.ts +4 -2
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-line.ts +19 -1
- package/scripts/issue/defect-rate-cli.ts +5 -102
- package/scripts/issue/defect-report.ts +4 -4
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +64 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-body-or-comment.ts +38 -4
- package/scripts/issue/issue-cite-cli.ts +1 -3
- package/scripts/issue/issue-classification.ts +1 -0
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-evidence-exit.ts +4 -2
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +111 -38
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +43 -6
- package/scripts/issue/issue-labels.ts +19 -2
- package/scripts/issue/issue-lint-cli.ts +27 -2
- package/scripts/issue/issue-measured-cli.ts +13 -35
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-not-before-label.ts +2 -2
- package/scripts/issue/issue-not-before.ts +4 -1
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +174 -43
- package/scripts/issue/issue-rank.ts +21 -4
- package/scripts/issue/issue-read-cli.ts +32 -6
- package/scripts/issue/issue-read.ts +37 -12
- package/scripts/issue/issue-sample-gate.ts +95 -74
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +12 -11
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +31 -1
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -12
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -70
- package/scripts/issue/plan-consumers-section.ts +22 -1
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/command-usage.ts +3 -2
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -82
- package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
- package/scripts/josh/josh-commands-ai.ts +5 -5
- package/scripts/josh/josh-commands-development.ts +59 -58
- package/scripts/josh/josh-commands-issue-write.ts +23 -4
- package/scripts/josh/josh-commands-issue.ts +32 -0
- package/scripts/josh/josh-commands-lane.ts +87 -4
- package/scripts/josh/josh-commands-lint.ts +16 -3
- package/scripts/josh/josh-commands-maintenance.ts +15 -0
- package/scripts/josh/josh-commands-review.ts +41 -6
- package/scripts/josh/josh-commands-ship.ts +56 -8
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-workflow.ts +1 -1
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +5 -3
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/stamp-file.ts +11 -2
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +5 -8
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-check-stats.ts +29 -8
- package/scripts/lane/lane-child-invocation.ts +9 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-close.ts +8 -3
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +2 -2
- package/scripts/lane/lane-gap-stats.ts +7 -6
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +119 -36
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +31 -177
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +176 -59
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +16 -7
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +4 -1
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-registry.ts +14 -1
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-sampler.ts +23 -4
- package/scripts/lane/lane-session-action.ts +93 -18
- package/scripts/lane/lane-session-broker.ts +49 -21
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-spent.ts +1 -1
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +13 -1
- package/scripts/lane/lane-state.ts +41 -9
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +21 -5
- package/scripts/lane/lane-stop-stats.ts +51 -19
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-transcript-calls.ts +67 -10
- package/scripts/lane/lane-transcript-stats.ts +44 -12
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +108 -31
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +45 -6
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/import-graph.ts +141 -11
- package/scripts/lint/lint-gate-scope.ts +2 -2
- package/scripts/lint/lint-parallel.ts +54 -6
- package/scripts/lint/lint-related.ts +154 -33
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/telegram-notify.ts +12 -3
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush.ts +32 -9
- package/scripts/overrides/overrides-check.ts +9 -1
- package/scripts/release/release-approval-prune.ts +7 -1
- package/scripts/repo/required-checks-logic.ts +4 -1
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +15 -1
- package/scripts/report/report-labels.ts +12 -1
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +26 -7
- package/scripts/report/report-lint.ts +2 -20
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +68 -19
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +14 -7
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +85 -22
- package/scripts/review/review-finding-ledger.ts +109 -7
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +11 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +4 -2
- package/scripts/review/review-record-cli.ts +177 -54
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +91 -29
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +24 -8
- package/scripts/review/review-stamps.ts +7 -3
- package/scripts/review/review-stop-log.ts +20 -6
- package/scripts/review/review-stops-cli.ts +2 -1
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/rules/agent-model.ts +1 -1
- package/scripts/rules/bash-triggers.ts +3 -3
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle.ts +1 -1
- package/scripts/rules/delivered-rules.ts +36 -17
- package/scripts/rules/destructive-command.ts +3 -11
- package/scripts/rules/direct-issue-comment.ts +34 -12
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +4 -24
- package/scripts/rules/early-heartbeat.ts +2 -0
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/guard-remedy.ts +14 -5
- package/scripts/rules/implementation-cut.ts +61 -28
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +9 -4
- package/scripts/rules/josh-git-bare.ts +1 -1
- package/scripts/rules/lane-background.ts +41 -13
- package/scripts/rules/lane-direct-tool.ts +107 -9
- package/scripts/rules/lane-interactive-ask.ts +4 -1
- package/scripts/rules/lane-park.ts +4 -2
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +1 -1
- package/scripts/rules/lane-switch-main.ts +4 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/permission-guards.ts +5 -1
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +67 -17
- package/scripts/rules/poll-loop.ts +72 -9
- package/scripts/rules/pr-merge.ts +5 -5
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +88 -24
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +5 -15
- package/scripts/rules/rule-value-cache.ts +53 -5
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +59 -11
- package/scripts/rules/rule-value.ts +17 -4
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +10 -2
- package/scripts/rules/stop-rule-rows.ts +1 -13
- package/scripts/rules/stop-rules.ts +33 -58
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +110 -23
- package/scripts/rules/timed-rerun.ts +1 -1
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +22 -7
- package/scripts/run/board/run-board-ending-reason.ts +6 -2
- package/scripts/run/board/run-board-fit.ts +24 -1
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-header.ts +8 -0
- package/scripts/run/board/run-board-labels.ts +11 -1
- package/scripts/run/board/run-board-lane-time.ts +1 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-notes.ts +7 -1
- package/scripts/run/board/run-board-operation.ts +4 -2
- package/scripts/run/board/run-board-phase.ts +2 -5
- package/scripts/run/board/run-board-plan.ts +1 -1
- package/scripts/run/board/run-board-read.ts +46 -1
- package/scripts/run/board/run-board-reason.ts +20 -8
- package/scripts/run/board/run-board-render-checks.ts +3 -2
- package/scripts/run/board/run-board-render-drawn.ts +11 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-lead.ts +9 -0
- package/scripts/run/board/run-board-render-legend.ts +19 -0
- package/scripts/run/board/run-board-render-tail.ts +1 -1
- package/scripts/run/board/run-board-render.ts +82 -18
- package/scripts/run/board/run-board-spin.ts +1 -3
- package/scripts/run/board/run-board-status.ts +2 -0
- package/scripts/run/board/run-board-tick.ts +39 -10
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +3 -2
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +52 -8
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-filed.ts +9 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +4 -0
- package/scripts/run/event/run-event-stream.ts +25 -3
- package/scripts/run/hold/run-stop-notify.ts +3 -8
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +66 -23
- package/scripts/run/merge/run-merge-outcome.ts +2 -0
- package/scripts/run/merge/run-merge-ship.ts +13 -3
- package/scripts/run/merge/run-merge-signals.ts +40 -23
- package/scripts/run/merge/run-merge-steps.ts +56 -36
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +41 -14
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +26 -6
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-prep.ts +1 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +5 -2
- package/scripts/run/ship/run-ship-args.ts +19 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +131 -39
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +10 -4
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +27 -26
- package/scripts/run/ship/run-ship-overlap.ts +8 -3
- package/scripts/run/ship/run-ship-place.ts +9 -2
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
- package/scripts/run/ship/run-ship-preflight.ts +16 -4
- package/scripts/run/ship/run-ship-probe.ts +23 -9
- package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-return.ts +103 -29
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +230 -59
- package/scripts/run/ship/run-ship-review.ts +171 -51
- package/scripts/run/ship/run-ship-reviewer.ts +138 -42
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +49 -13
- package/scripts/run/ship/run-ship-steps.ts +24 -4
- package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-sync.ts +171 -30
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +16 -2
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +6 -113
- package/scripts/run/wake/run-wake-code.ts +53 -11
- package/scripts/run/wake/run-wake-driver.ts +5 -3
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +5 -3
- package/scripts/run/wake/run-wake-ports.ts +11 -3
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake.ts +3 -2
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/project-config.ts +3 -2
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-provision-main.ts +9 -1
- package/scripts/security/security-audit-provision.ts +1 -1
- package/scripts/security/security-audit.ts +21 -1
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/split/split-assess.ts +12 -3
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +20 -2
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +208 -20
- package/scripts/test/test-pinned-main.ts +84 -18
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +258 -47
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +35 -11
- package/scripts/test/test-read-recording.ts +17 -5
- package/scripts/test/test-read-trace.ts +26 -8
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red.ts +34 -14
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +4 -1
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +43 -23
- package/scripts/test/test-related-scope.ts +99 -34
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +167 -83
- package/scripts/test/test-unit-guard.ts +28 -5
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-worker-share.ts +5 -4
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +12 -1
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +36 -5
- package/scripts/time-runtime/time-markers.ts +2 -2
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +17 -5
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/latest-corepack.ts +2 -0
- package/templates/gitignore +2 -0
- package/templates/workflows/ci.yml +41 -0
- package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
- package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
- package/dist/hooks/chunk-TUIFS5E7.js +0 -72
- package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/rules/filing-cap.ts +0 -139
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// The kind each lane ledger line carries — the discriminant `lane-ledger-schema.ts` parses on, kept
|
|
2
|
+
// apart so a schema module of its own can name its kind without importing the union it joins.
|
|
3
|
+
|
|
4
|
+
const KIND = {
|
|
5
|
+
MERGE: 'merge',
|
|
6
|
+
GATE: 'gate',
|
|
7
|
+
LOAD: 'load',
|
|
8
|
+
DISPATCH: 'dispatch',
|
|
9
|
+
STAGE: 'stage',
|
|
10
|
+
STOP: 'stop',
|
|
11
|
+
OVERLAP: 'overlap',
|
|
12
|
+
HELD: 'held',
|
|
13
|
+
RELEASED: 'released',
|
|
14
|
+
ROUND_ONE: 'round-one',
|
|
15
|
+
ROUND_TWO: 'round-two',
|
|
16
|
+
OFFERABLE: 'offerable',
|
|
17
|
+
CORE_WAIT: 'core-wait',
|
|
18
|
+
UNIT_FILES: 'unit-files',
|
|
19
|
+
TEST_RELATED: 'test-related',
|
|
20
|
+
TEST_PINNED: 'test-pinned',
|
|
21
|
+
SPLIT_NOTICE: 'split-notice',
|
|
22
|
+
SPLIT_FILED: 'split-filed',
|
|
23
|
+
UNPLANNED_NOTICE: 'unplanned-notice',
|
|
24
|
+
LANE_STATE: 'lane-state',
|
|
25
|
+
PUSH_MISS: 'push-miss',
|
|
26
|
+
SHIP_LAP: 'ship-lap',
|
|
27
|
+
} as const
|
|
28
|
+
|
|
29
|
+
const lane_ledger_kind = { KIND }
|
|
30
|
+
|
|
31
|
+
export { lane_ledger_kind }
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { lane_ledger_kind } from './lane-ledger-kind'
|
|
3
|
+
|
|
4
|
+
// The lane ledger lines `josh ship` writes about itself — a stop, the preflight's `unplanned` notice
|
|
5
|
+
// and the inner steps of a stage — joined into the entry union by `lane-ledger-schema.ts`.
|
|
6
|
+
|
|
7
|
+
const { KIND } = lane_ledger_kind
|
|
8
|
+
|
|
9
|
+
// A `josh ship` that stopped on `issue`: `reason` is the stage it stopped at, or `conflict` — the
|
|
10
|
+
// retrospective's stop reason — and `cause` why (`run-ship-stop-cause.ts`), absent on a stop recorded
|
|
11
|
+
// before it had one. `preconditions` names the kinds a preflight stop found unmet (`run-ship-preflight.ts`),
|
|
12
|
+
// with `pre-detach` where a lane child's fast checks went red (joshuafolkken/kit#4478) and `unpinned`
|
|
13
|
+
// where its `test:pinned` did (joshuafolkken/kit#5228), beside them or alone, absent on any other
|
|
14
|
+
// stop and on one recorded before it had them. `findings` names the `<category>:<severity>` of each
|
|
15
|
+
// finding that decided a review or round-2 stop — the blocking ones, else the fixed ones
|
|
16
|
+
// (joshuafolkken/kit#4426), absent where none decided the stop. How long it stayed stopped is derived
|
|
17
|
+
// from the next ship stage, not recorded, so a resumed ship never has to know the stop it ends.
|
|
18
|
+
const stop_schema = z.object({
|
|
19
|
+
kind: z.literal(KIND.STOP),
|
|
20
|
+
at: z.string(),
|
|
21
|
+
issue: z.number(),
|
|
22
|
+
reason: z.string(),
|
|
23
|
+
cause: z.string().optional(),
|
|
24
|
+
preconditions: z.array(z.string()).optional(),
|
|
25
|
+
findings: z.array(z.string()).optional(),
|
|
26
|
+
})
|
|
27
|
+
// The ship's `unplanned` answer `josh check:related` printed to the lane of `issue` ahead of the ship,
|
|
28
|
+
// so a preflight `unplanned` stop after it is told apart in `lane:stats` (joshuafolkken/kit#5203).
|
|
29
|
+
const unplanned_notice_schema = z.object({
|
|
30
|
+
kind: z.literal(KIND.UNPLANNED_NOTICE),
|
|
31
|
+
at: z.string(),
|
|
32
|
+
issue: z.number(),
|
|
33
|
+
files: z.array(z.string()),
|
|
34
|
+
})
|
|
35
|
+
// One inner step of a `josh ship` stage on `issue` — the overlap wait inside `sync`, the scoped pair
|
|
36
|
+
// inside `gate` — so `lane:breakdown` names what a stage spent its time on (joshuafolkken/kit#5294).
|
|
37
|
+
// `at` is its end and `elapsed_ms` its length, as on a stage row.
|
|
38
|
+
const ship_lap_schema = z.object({
|
|
39
|
+
kind: z.literal(KIND.SHIP_LAP),
|
|
40
|
+
at: z.string(),
|
|
41
|
+
issue: z.number(),
|
|
42
|
+
stage: z.string(),
|
|
43
|
+
step: z.string(),
|
|
44
|
+
elapsed_ms: z.number(),
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
const lane_ledger_schema_ship = { ship_lap_schema, stop_schema, unplanned_notice_schema }
|
|
48
|
+
|
|
49
|
+
export { lane_ledger_schema_ship }
|
|
@@ -1,23 +1,11 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
|
+
import { lane_ledger_kind } from './lane-ledger-kind'
|
|
3
|
+
import { lane_ledger_schema_ship } from './lane-ledger-schema-ship'
|
|
2
4
|
|
|
3
5
|
// The shape of each line `lane-ledger.ts` appends and reads back — one schema per entry kind.
|
|
4
6
|
|
|
5
|
-
const KIND =
|
|
6
|
-
|
|
7
|
-
GATE: 'gate',
|
|
8
|
-
LOAD: 'load',
|
|
9
|
-
DISPATCH: 'dispatch',
|
|
10
|
-
STAGE: 'stage',
|
|
11
|
-
STOP: 'stop',
|
|
12
|
-
OVERLAP: 'overlap',
|
|
13
|
-
HELD: 'held',
|
|
14
|
-
RELEASED: 'released',
|
|
15
|
-
ROUND_TWO: 'round-two',
|
|
16
|
-
OFFERABLE: 'offerable',
|
|
17
|
-
CORE_WAIT: 'core-wait',
|
|
18
|
-
UNIT_FILES: 'unit-files',
|
|
19
|
-
TEST_RELATED: 'test-related',
|
|
20
|
-
} as const
|
|
7
|
+
const { KIND } = lane_ledger_kind
|
|
8
|
+
const { ship_lap_schema, stop_schema, unplanned_notice_schema } = lane_ledger_schema_ship
|
|
21
9
|
|
|
22
10
|
const merge_schema = z.object({ kind: z.literal(KIND.MERGE), at: z.string(), issue: z.number() })
|
|
23
11
|
const check_schema = z.object({
|
|
@@ -55,6 +43,9 @@ const gate_schema = z.object({
|
|
|
55
43
|
// A gate that reused a green record for this tree and base and started no check: counted, never
|
|
56
44
|
// timed (joshuafolkken/kit#4397).
|
|
57
45
|
is_reused: z.boolean().optional(),
|
|
46
|
+
// The lane the gate ran in, so `josh lane:breakdown` puts its checks under the lane's ship gate;
|
|
47
|
+
// absent outside a lane and on a row written before it (joshuafolkken/kit#5319).
|
|
48
|
+
issue: z.number().optional(),
|
|
58
49
|
})
|
|
59
50
|
// `available_mb`, `swapped_mb` and `lanes` are optional because each read can fail on its own — a
|
|
60
51
|
// platform with no memory reading, a `git worktree` call that did not answer — and a sample is still
|
|
@@ -86,31 +77,17 @@ const dispatch_schema = z.object({
|
|
|
86
77
|
})
|
|
87
78
|
// One finished stage of a lane's run, passed or failed: `at` is its end and `elapsed_ms` its length, so
|
|
88
79
|
// its start is read from the two. `issue` is absent where the writer does not hold one — `followup`'s
|
|
89
|
-
// CI wait
|
|
80
|
+
// CI wait where the run did not know its issue. On that `ci-wait` row,
|
|
81
|
+
// `check_ms` is each check seen pending and then settled, by the time it settled into the wait, and
|
|
82
|
+
// `last_check` the one that settled last — the wait's critical path (joshuafolkken/kit#5295).
|
|
90
83
|
const stage_schema = z.object({
|
|
91
84
|
kind: z.literal(KIND.STAGE),
|
|
92
85
|
at: z.string(),
|
|
93
86
|
stage: z.string(),
|
|
94
87
|
elapsed_ms: z.number(),
|
|
95
88
|
issue: z.number().optional(),
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
// retrospective's stop reason — and `cause` why (`run-ship-stop-cause.ts`), absent on a stop recorded
|
|
99
|
-
// before it had one. `preconditions` names the kinds a preflight stop found unmet (`run-ship-preflight.ts`),
|
|
100
|
-
// with `pre-detach` where a lane child's fast checks went red beside them (joshuafolkken/kit#4478),
|
|
101
|
-
// absent on any other stop and on one recorded before it had them. `findings` names the
|
|
102
|
-
// `<category>:<severity>` of each finding that decided a review or round-2 stop — the blocking ones, else
|
|
103
|
-
// the fixed ones (joshuafolkken/kit#4426),
|
|
104
|
-
// absent where none decided the stop. How long it stayed stopped is derived from the next ship stage, not recorded, so a
|
|
105
|
-
// resumed ship never has to know the stop it ends.
|
|
106
|
-
const stop_schema = z.object({
|
|
107
|
-
kind: z.literal(KIND.STOP),
|
|
108
|
-
at: z.string(),
|
|
109
|
-
issue: z.number(),
|
|
110
|
-
reason: z.string(),
|
|
111
|
-
cause: z.string().optional(),
|
|
112
|
-
preconditions: z.array(z.string()).optional(),
|
|
113
|
-
findings: z.array(z.string()).optional(),
|
|
89
|
+
last_check: z.string().optional(),
|
|
90
|
+
check_ms: z.record(z.string(), z.number()).optional(),
|
|
114
91
|
})
|
|
115
92
|
// A `josh ship` on `issue` whose actual change overlapped the open pull requests of `lanes` on `paths`
|
|
116
93
|
// before its sync: it waited `waited_ms` for their ships to end, and `is_cleared` is false where the
|
|
@@ -137,6 +114,23 @@ const held_schema = z.object({
|
|
|
137
114
|
// The end of a hold no dispatch ended: every lane taken — one opened outside the driver included — or
|
|
138
115
|
// the run finished, so no free lane is owed a child any more.
|
|
139
116
|
const released_schema = z.object({ kind: z.literal(KIND.RELEASED), at: z.string() })
|
|
117
|
+
// A `lane:pause` (`paused`) or `lane:resume` (`running`) of `issue`'s lane, so a measurement reads the
|
|
118
|
+
// time its processes stood stopped (joshuafolkken/kit#5168) — the lane state file keeps only the last.
|
|
119
|
+
const lane_state_schema = z.object({
|
|
120
|
+
kind: z.literal(KIND.LANE_STATE),
|
|
121
|
+
at: z.string(),
|
|
122
|
+
issue: z.number(),
|
|
123
|
+
state: z.enum(['paused', 'running']),
|
|
124
|
+
})
|
|
125
|
+
// The round 1 a `josh ship` acted on for `issue`: `verdict` is the reviewer's — `clean`, `fixed`,
|
|
126
|
+
// `blocking` — or `reused` where a round recorded before the ship still described the tree, so the
|
|
127
|
+
// period's ship-time rounds that passed with no fix are counted (joshuafolkken/kit#4620).
|
|
128
|
+
const round_one_schema = z.object({
|
|
129
|
+
kind: z.literal(KIND.ROUND_ONE),
|
|
130
|
+
at: z.string(),
|
|
131
|
+
issue: z.number(),
|
|
132
|
+
verdict: z.string(),
|
|
133
|
+
})
|
|
140
134
|
// One `review:round2` decision a `josh ship` acted on for `issue`: `verdict` and the stable reason
|
|
141
135
|
// `code` it fell under, so the period's skips and runs are counted by why (joshuafolkken/kit#4064).
|
|
142
136
|
const round_two_schema = z.object({
|
|
@@ -190,6 +184,55 @@ const test_related_schema = z.object({
|
|
|
190
184
|
trigger_files: z.array(z.string()).optional(),
|
|
191
185
|
elapsed_ms: z.number(),
|
|
192
186
|
})
|
|
187
|
+
// One `josh test:pinned` run that probed (joshuafolkken/kit#5078): `held` hunks the verdict cache
|
|
188
|
+
// answered, and each probed hunk's `file`, the test files it ran (`tests`, absent where vitest wrote no
|
|
189
|
+
// report) and its wall time. `issue` is the lane it ran in, absent outside a lane. `rewired` counts the
|
|
190
|
+
// hunks not probed as an import moved under a new name (joshuafolkken/kit#5235), absent on older rows.
|
|
191
|
+
// `origin` is what started the run, and `discarded` marks a `run:review` background run stopped before
|
|
192
|
+
// its answer, written by the stop with its wall time so far (joshuafolkken/kit#5262); both absent on
|
|
193
|
+
// older rows.
|
|
194
|
+
const pinned_origin_schema = z.enum(['run-review', 'pre-detach', 'manual'])
|
|
195
|
+
const test_pinned_probe_schema = z.object({
|
|
196
|
+
file: z.string(),
|
|
197
|
+
tests: z.number().optional(),
|
|
198
|
+
elapsed_ms: z.number(),
|
|
199
|
+
})
|
|
200
|
+
const test_pinned_schema = z.object({
|
|
201
|
+
kind: z.literal(KIND.TEST_PINNED),
|
|
202
|
+
at: z.string(),
|
|
203
|
+
issue: z.number().optional(),
|
|
204
|
+
held: z.number(),
|
|
205
|
+
rewired: z.number().optional(),
|
|
206
|
+
probes: z.array(test_pinned_probe_schema),
|
|
207
|
+
elapsed_ms: z.number(),
|
|
208
|
+
origin: pinned_origin_schema.optional(),
|
|
209
|
+
discarded: z.boolean().optional(),
|
|
210
|
+
})
|
|
211
|
+
// The split notice shown to the lane of `issue`, with the measured diff it fired on — written once per
|
|
212
|
+
// Issue, by whichever of `josh lint:related`, `test:related` or `main:merge` showed it first
|
|
213
|
+
// (joshuafolkken/kit#4695).
|
|
214
|
+
const split_notice_schema = z.object({
|
|
215
|
+
kind: z.literal(KIND.SPLIT_NOTICE),
|
|
216
|
+
at: z.string(),
|
|
217
|
+
issue: z.number(),
|
|
218
|
+
files: z.number(),
|
|
219
|
+
lines: z.number(),
|
|
220
|
+
})
|
|
221
|
+
// One `josh issue:file --route split` filed from the lane of `issue`; `child` is its reference.
|
|
222
|
+
const split_filed_schema = z.object({
|
|
223
|
+
kind: z.literal(KIND.SPLIT_FILED),
|
|
224
|
+
at: z.string(),
|
|
225
|
+
issue: z.number(),
|
|
226
|
+
child: z.string(),
|
|
227
|
+
})
|
|
228
|
+
// A pre-push hook that could not reuse the green gate record and ran the `whole` or the `related`
|
|
229
|
+
// suite: `reason` is the miss's kind (`hook_gate_reuse.miss_kind`), never its sentence (joshuafolkken/kit#5234).
|
|
230
|
+
const push_miss_schema = z.object({
|
|
231
|
+
kind: z.literal(KIND.PUSH_MISS),
|
|
232
|
+
at: z.string(),
|
|
233
|
+
scope: z.enum(['whole', 'related']),
|
|
234
|
+
reason: z.string(),
|
|
235
|
+
})
|
|
193
236
|
const entry_schema = z.discriminatedUnion('kind', [
|
|
194
237
|
merge_schema,
|
|
195
238
|
gate_schema,
|
|
@@ -200,11 +243,19 @@ const entry_schema = z.discriminatedUnion('kind', [
|
|
|
200
243
|
overlap_schema,
|
|
201
244
|
held_schema,
|
|
202
245
|
released_schema,
|
|
246
|
+
round_one_schema,
|
|
203
247
|
round_two_schema,
|
|
204
248
|
offerable_schema,
|
|
205
249
|
core_wait_schema,
|
|
206
250
|
unit_files_schema,
|
|
207
251
|
test_related_schema,
|
|
252
|
+
test_pinned_schema,
|
|
253
|
+
split_notice_schema,
|
|
254
|
+
split_filed_schema,
|
|
255
|
+
unplanned_notice_schema,
|
|
256
|
+
lane_state_schema,
|
|
257
|
+
push_miss_schema,
|
|
258
|
+
ship_lap_schema,
|
|
208
259
|
])
|
|
209
260
|
|
|
210
261
|
type LedgerEntry = z.infer<typeof entry_schema>
|
|
@@ -216,6 +267,7 @@ type StageEntry = z.infer<typeof stage_schema>
|
|
|
216
267
|
type StopEntry = z.infer<typeof stop_schema>
|
|
217
268
|
type OverlapEntry = z.infer<typeof overlap_schema>
|
|
218
269
|
type HeldEntry = z.infer<typeof held_schema>
|
|
270
|
+
type RoundOneEntry = z.infer<typeof round_one_schema>
|
|
219
271
|
type RoundTwoEntry = z.infer<typeof round_two_schema>
|
|
220
272
|
type OfferableEntry = z.infer<typeof offerable_schema>
|
|
221
273
|
type CoreWaitEntry = z.infer<typeof core_wait_schema>
|
|
@@ -224,6 +276,21 @@ type UnitFilesEntry = z.infer<typeof unit_files_schema>
|
|
|
224
276
|
type UnitFileRecord = z.infer<typeof unit_file_schema>
|
|
225
277
|
type TestRelatedEntry = z.infer<typeof test_related_schema>
|
|
226
278
|
type TestRelatedRecord = Omit<TestRelatedEntry, 'kind' | 'at'>
|
|
279
|
+
type TestPinnedEntry = z.infer<typeof test_pinned_schema>
|
|
280
|
+
type TestPinnedRecord = Omit<TestPinnedEntry, 'kind' | 'at'>
|
|
281
|
+
type SplitNoticeEntry = z.infer<typeof split_notice_schema>
|
|
282
|
+
type SplitNoticeRecord = Omit<SplitNoticeEntry, 'kind' | 'at'>
|
|
283
|
+
type SplitFiledEntry = z.infer<typeof split_filed_schema>
|
|
284
|
+
type SplitFiledRecord = Omit<SplitFiledEntry, 'kind' | 'at'>
|
|
285
|
+
type UnplannedNoticeEntry = z.infer<typeof unplanned_notice_schema>
|
|
286
|
+
type UnplannedNoticeRecord = Omit<UnplannedNoticeEntry, 'kind' | 'at'>
|
|
287
|
+
type LaneStateChangeEntry = z.infer<typeof lane_state_schema>
|
|
288
|
+
type LaneStateChangeRecord = Omit<LaneStateChangeEntry, 'kind' | 'at'>
|
|
289
|
+
type PushMissEntry = z.infer<typeof push_miss_schema>
|
|
290
|
+
type PushMissRecord = Omit<PushMissEntry, 'kind' | 'at'>
|
|
291
|
+
type ShipLapEntry = z.infer<typeof ship_lap_schema>
|
|
292
|
+
type ShipLapRecord = Omit<ShipLapEntry, 'kind' | 'at'>
|
|
293
|
+
type RoundOneRecord = Omit<RoundOneEntry, 'kind' | 'at'>
|
|
227
294
|
type RoundTwoRecord = Omit<RoundTwoEntry, 'kind' | 'at'>
|
|
228
295
|
// What a finished gate reports; the ledger stamps the kind and the time.
|
|
229
296
|
type GateRecord = Omit<GateEntry, 'kind' | 'at'>
|
|
@@ -235,7 +302,7 @@ type HeldRecord = Omit<HeldEntry, 'kind' | 'at' | 'waiting'> & {
|
|
|
235
302
|
waiting?: ReadonlyArray<number> | undefined
|
|
236
303
|
}
|
|
237
304
|
|
|
238
|
-
const lane_ledger_schema = { KIND, entry_schema }
|
|
305
|
+
const lane_ledger_schema = { KIND, entry_schema, pinned_origin_schema }
|
|
239
306
|
|
|
240
307
|
export type {
|
|
241
308
|
CoreWaitEntry,
|
|
@@ -246,21 +313,37 @@ export type {
|
|
|
246
313
|
GateRecord,
|
|
247
314
|
HeldEntry,
|
|
248
315
|
HeldRecord,
|
|
316
|
+
LaneStateChangeEntry,
|
|
317
|
+
LaneStateChangeRecord,
|
|
249
318
|
LedgerEntry,
|
|
250
319
|
LoadEntry,
|
|
251
320
|
MergeEntry,
|
|
252
321
|
OfferableEntry,
|
|
253
322
|
OverlapEntry,
|
|
254
323
|
OverlapRecord,
|
|
324
|
+
PushMissEntry,
|
|
325
|
+
PushMissRecord,
|
|
326
|
+
RoundOneEntry,
|
|
327
|
+
RoundOneRecord,
|
|
255
328
|
RoundTwoEntry,
|
|
256
329
|
RoundTwoRecord,
|
|
330
|
+
ShipLapEntry,
|
|
331
|
+
ShipLapRecord,
|
|
332
|
+
SplitFiledEntry,
|
|
333
|
+
SplitFiledRecord,
|
|
334
|
+
SplitNoticeEntry,
|
|
335
|
+
SplitNoticeRecord,
|
|
257
336
|
StageEntry,
|
|
258
337
|
StageRecord,
|
|
259
338
|
StopEntry,
|
|
260
339
|
StopRecord,
|
|
340
|
+
TestPinnedEntry,
|
|
341
|
+
TestPinnedRecord,
|
|
261
342
|
TestRelatedEntry,
|
|
262
343
|
TestRelatedRecord,
|
|
263
344
|
UnitFileRecord,
|
|
264
345
|
UnitFilesEntry,
|
|
346
|
+
UnplannedNoticeEntry,
|
|
347
|
+
UnplannedNoticeRecord,
|
|
265
348
|
}
|
|
266
349
|
export { lane_ledger_schema }
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { closeSync, constants, openSync, writeSync } from 'node:fs'
|
|
2
|
+
import { durable_state } from '#scripts/josh/durable-state'
|
|
3
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
4
|
+
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
5
|
+
import {
|
|
6
|
+
lane_ledger_schema,
|
|
7
|
+
type CoreWaitRecord,
|
|
8
|
+
type GateRecord,
|
|
9
|
+
type HeldRecord,
|
|
10
|
+
type LaneStateChangeRecord,
|
|
11
|
+
type LedgerEntry,
|
|
12
|
+
type OverlapRecord,
|
|
13
|
+
type PushMissRecord,
|
|
14
|
+
type RoundOneRecord,
|
|
15
|
+
type RoundTwoRecord,
|
|
16
|
+
type ShipLapRecord,
|
|
17
|
+
type SplitFiledRecord,
|
|
18
|
+
type SplitNoticeRecord,
|
|
19
|
+
type StageRecord,
|
|
20
|
+
type StopRecord,
|
|
21
|
+
type TestPinnedRecord,
|
|
22
|
+
type TestRelatedRecord,
|
|
23
|
+
type UnitFileRecord,
|
|
24
|
+
type UnplannedNoticeRecord,
|
|
25
|
+
} from './lane-ledger-schema'
|
|
26
|
+
|
|
27
|
+
// The measurement ledger the lane limit is tuned against: one JSON line per
|
|
28
|
+
// lane merge, per finished `josh gate`, per machine-load sample, per lane dispatch, per finished
|
|
29
|
+
// `josh ship` stage, per stopped `josh ship`, per round-2 decision, per core-budget wait and per
|
|
30
|
+
// `josh test:related` run, read back by `josh lane:stats` through `lane-ledger.ts`. Each line's shape
|
|
31
|
+
// is `lane-ledger-schema.ts`.
|
|
32
|
+
//
|
|
33
|
+
// **The writers' leaf, apart from the reader** (joshuafolkken/kit#5202). The gate, `followup`, `josh
|
|
34
|
+
// ship`, the dispatch and the backlog driver write here, and dozens of suites import them; the reading
|
|
35
|
+
// and the measurement modules built on it import `lane-ledger.ts`, so a change there no longer reaches
|
|
36
|
+
// every suite a writer sits under.
|
|
37
|
+
//
|
|
38
|
+
// **Its own file rather than the run's event stream.** The stream is capped at 500 events and is
|
|
39
|
+
// rewritten whole on every append, which is right for "where is the run" and wrong for a measurement
|
|
40
|
+
// that spans days of one-a-minute load samples. This file is only ever appended to, so concurrent lanes
|
|
41
|
+
// never lose each other's lines to a read-modify-write race.
|
|
42
|
+
//
|
|
43
|
+
// **Keyed on the common git directory, the event stream's key**, so a lane child's gate, the parent's
|
|
44
|
+
// merge and the sampler all land in one ledger per repository. It is a durable record
|
|
45
|
+
// (`durable-state.ts`), so a period runs across a reboot.
|
|
46
|
+
|
|
47
|
+
const LEDGER_PREFIX = durable_state.PREFIX.LANE_LEDGER
|
|
48
|
+
const LEDGER_SUFFIX = '.jsonl'
|
|
49
|
+
const LINE_SEPARATOR = '\n'
|
|
50
|
+
// `followup`'s wait for CI — a stage of a lane's run that no `josh ship` stage is the whole of.
|
|
51
|
+
const CI_WAIT_STAGE = 'ci-wait'
|
|
52
|
+
// The part of `followup`'s waits CodeRabbit spent running or rate-limited, and the rate-limited part
|
|
53
|
+
// alone (joshuafolkken/kit#4574).
|
|
54
|
+
const CODERABBIT_WAIT_STAGE = 'coderabbit-wait'
|
|
55
|
+
const CODERABBIT_RATE_LIMIT_STAGE = 'coderabbit-rate-limit'
|
|
56
|
+
// The rate-limit window `followup` waited out before posting its one `@coderabbitai review`
|
|
57
|
+
// (joshuafolkken/kit#5289).
|
|
58
|
+
const CODERABBIT_RETRIGGER_STAGE = 'coderabbit-retriggered'
|
|
59
|
+
// A detached `josh ship`'s fast checks in the agent's own turn — not a resumable ship stage, since the
|
|
60
|
+
// supervised gate runs them again (joshuafolkken/kit#4382).
|
|
61
|
+
const PRE_DETACH_STAGE = 'pre-detach'
|
|
62
|
+
// A ship's round 1 that reused a recorded review instead of running one (joshuafolkken/kit#4620).
|
|
63
|
+
const ROUND_ONE_REUSED = 'reused'
|
|
64
|
+
const LEDGER_FILE_MODE = 0o600
|
|
65
|
+
// The flags `detached-launch.ts` appends its log with, for the same deterministic shared-temp path.
|
|
66
|
+
const { O_APPEND, O_CREAT, O_NOFOLLOW, O_WRONLY } = constants
|
|
67
|
+
// eslint-disable-next-line no-bitwise -- POSIX open flags are a bit field; `||` here would be a bug
|
|
68
|
+
const APPEND_FLAGS = O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW
|
|
69
|
+
|
|
70
|
+
const { KIND } = lane_ledger_schema
|
|
71
|
+
|
|
72
|
+
function target_of(repository: string): string {
|
|
73
|
+
return durable_state.path(LEDGER_PREFIX, repository, LEDGER_SUFFIX)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The ledger of the repository this checkout belongs to, or `undefined` outside one. `git rev-parse`
|
|
77
|
+
// rejects outside a repository, and `josh gate` resolves this before it runs a check, so the rejection
|
|
78
|
+
// is read as "no ledger" rather than allowed to fail the gate it would only have measured.
|
|
79
|
+
//
|
|
80
|
+
// **A test run has no ledger either.** The writers sit on paths dozens of suites exercise — a ship
|
|
81
|
+
// stage, a dispatch, a `followup` — and one suite that forgot to mock this module would append its
|
|
82
|
+
// fixture durations to the real measurement; a test that writes passes its own path instead.
|
|
83
|
+
async function target(): Promise<string | undefined> {
|
|
84
|
+
if (process.env['VITEST'] !== undefined) return undefined
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
const repository = await run_carry.repository_directory()
|
|
88
|
+
|
|
89
|
+
return repository === undefined ? undefined : target_of(repository)
|
|
90
|
+
} catch {
|
|
91
|
+
return undefined
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// **Append, never rewrite** — `O_APPEND` keeps each short line whole across concurrent writers, and
|
|
96
|
+
// `O_NOFOLLOW` plus `stamp_file`'s ownership test keep a planted link or another account's file from
|
|
97
|
+
// receiving it. Any JSON-lines log takes it — the durable review stop log too (joshuafolkken/kit#4519).
|
|
98
|
+
function append(path: string, entry: object): void {
|
|
99
|
+
const descriptor = openSync(path, APPEND_FLAGS, LEDGER_FILE_MODE)
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
if (stamp_file.is_own_regular_file(path)) {
|
|
103
|
+
writeSync(descriptor, `${JSON.stringify(entry)}${LINE_SEPARATOR}`)
|
|
104
|
+
}
|
|
105
|
+
} finally {
|
|
106
|
+
closeSync(descriptor)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Best-effort: a measurement must never fail the gate or the merge it measures, so every error — no
|
|
111
|
+
// repository, an unwritable temp root — is dropped.
|
|
112
|
+
async function record(entry: LedgerEntry, path?: string): Promise<void> {
|
|
113
|
+
try {
|
|
114
|
+
const destination = path ?? (await target())
|
|
115
|
+
|
|
116
|
+
if (destination !== undefined) append(destination, entry)
|
|
117
|
+
} catch {
|
|
118
|
+
// Reporting is best-effort: a failed append is dropped rather than raised into the caller's work.
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function now_iso(): string {
|
|
123
|
+
return new Date().toISOString()
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// One finished `josh gate`, whether it passed or not — a failing gate cost the lane its time as well.
|
|
127
|
+
async function record_gate(path: string, gate: GateRecord): Promise<void> {
|
|
128
|
+
await record({ kind: KIND.GATE, at: now_iso(), ...gate }, path)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async function record_merge(issue: number, at: Date = new Date()): Promise<void> {
|
|
132
|
+
await record({ kind: KIND.MERGE, at: at.toISOString(), issue })
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function record_dispatch(issue: number, path?: string): Promise<void> {
|
|
136
|
+
await record({ kind: KIND.DISPATCH, at: now_iso(), issue }, path)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function record_stage(stage: StageRecord, path?: string): Promise<void> {
|
|
140
|
+
await record({ kind: KIND.STAGE, at: now_iso(), ...stage }, path)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function record_stop(stop: StopRecord, path?: string): Promise<void> {
|
|
144
|
+
await record({ kind: KIND.STOP, at: now_iso(), ...stop }, path)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async function record_overlap(overlap: OverlapRecord, path?: string): Promise<void> {
|
|
148
|
+
await record({ kind: KIND.OVERLAP, at: now_iso(), ...overlap }, path)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// `waiting` is written only when the offer named issues, so a hold that waited on none stays one short line.
|
|
152
|
+
async function record_held(held: HeldRecord, path?: string): Promise<void> {
|
|
153
|
+
const waiting = held.waiting ?? []
|
|
154
|
+
const named = waiting.length > 0 ? { waiting: [...waiting] } : {}
|
|
155
|
+
|
|
156
|
+
await record({ kind: KIND.HELD, at: now_iso(), reason: held.reason, ...named }, path)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async function record_released(path?: string): Promise<void> {
|
|
160
|
+
await record({ kind: KIND.RELEASED, at: now_iso() }, path)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function record_lane_state(change: LaneStateChangeRecord, path?: string): Promise<void> {
|
|
164
|
+
await record({ kind: KIND.LANE_STATE, at: now_iso(), ...change }, path)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async function record_offerable(is_offerable: boolean, path?: string): Promise<void> {
|
|
168
|
+
await record({ kind: KIND.OFFERABLE, at: now_iso(), is_offerable }, path)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async function record_round_one(round_one: RoundOneRecord, path?: string): Promise<void> {
|
|
172
|
+
await record({ kind: KIND.ROUND_ONE, at: now_iso(), ...round_one }, path)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async function record_round_two(round_two: RoundTwoRecord, path?: string): Promise<void> {
|
|
176
|
+
await record({ kind: KIND.ROUND_TWO, at: now_iso(), ...round_two }, path)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async function record_core_wait(wait: CoreWaitRecord, path?: string): Promise<void> {
|
|
180
|
+
await record({ kind: KIND.CORE_WAIT, at: now_iso(), ...wait }, path)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async function record_unit_files(
|
|
184
|
+
files: ReadonlyArray<UnitFileRecord>,
|
|
185
|
+
path?: string,
|
|
186
|
+
): Promise<void> {
|
|
187
|
+
await record({ kind: KIND.UNIT_FILES, at: now_iso(), files: [...files] }, path)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async function record_test_related(run: TestRelatedRecord, path?: string): Promise<void> {
|
|
191
|
+
await record({ kind: KIND.TEST_RELATED, at: now_iso(), ...run }, path)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
async function record_test_pinned(run: TestPinnedRecord, path?: string): Promise<void> {
|
|
195
|
+
await record({ kind: KIND.TEST_PINNED, at: now_iso(), ...run }, path)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
async function record_split_notice(notice: SplitNoticeRecord, path?: string): Promise<void> {
|
|
199
|
+
await record({ kind: KIND.SPLIT_NOTICE, at: now_iso(), ...notice }, path)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
async function record_split_filed(filed: SplitFiledRecord, path?: string): Promise<void> {
|
|
203
|
+
await record({ kind: KIND.SPLIT_FILED, at: now_iso(), ...filed }, path)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async function record_push_miss(miss: PushMissRecord, path?: string): Promise<void> {
|
|
207
|
+
await record({ kind: KIND.PUSH_MISS, at: now_iso(), ...miss }, path)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async function record_ship_lap(lap: ShipLapRecord, path?: string): Promise<void> {
|
|
211
|
+
await record({ kind: KIND.SHIP_LAP, at: now_iso(), ...lap }, path)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async function record_unplanned_notice(
|
|
215
|
+
notice: UnplannedNoticeRecord,
|
|
216
|
+
path?: string,
|
|
217
|
+
): Promise<void> {
|
|
218
|
+
await record({ kind: KIND.UNPLANNED_NOTICE, at: now_iso(), ...notice }, path)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const lane_ledger_write = {
|
|
222
|
+
CI_WAIT_STAGE,
|
|
223
|
+
CODERABBIT_RATE_LIMIT_STAGE,
|
|
224
|
+
CODERABBIT_RETRIGGER_STAGE,
|
|
225
|
+
CODERABBIT_WAIT_STAGE,
|
|
226
|
+
KIND,
|
|
227
|
+
LINE_SEPARATOR,
|
|
228
|
+
PRE_DETACH_STAGE,
|
|
229
|
+
ROUND_ONE_REUSED,
|
|
230
|
+
append,
|
|
231
|
+
record,
|
|
232
|
+
record_core_wait,
|
|
233
|
+
record_dispatch,
|
|
234
|
+
record_gate,
|
|
235
|
+
record_held,
|
|
236
|
+
record_lane_state,
|
|
237
|
+
record_released,
|
|
238
|
+
record_merge,
|
|
239
|
+
record_overlap,
|
|
240
|
+
record_offerable,
|
|
241
|
+
record_push_miss,
|
|
242
|
+
record_round_one,
|
|
243
|
+
record_round_two,
|
|
244
|
+
record_ship_lap,
|
|
245
|
+
record_split_filed,
|
|
246
|
+
record_split_notice,
|
|
247
|
+
record_stage,
|
|
248
|
+
record_stop,
|
|
249
|
+
record_test_pinned,
|
|
250
|
+
record_test_related,
|
|
251
|
+
record_unit_files,
|
|
252
|
+
record_unplanned_notice,
|
|
253
|
+
target,
|
|
254
|
+
target_of,
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export { lane_ledger_write }
|