@joshuafolkken/kit 1.1240.0 → 1.1373.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 +52 -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 +23 -66
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +43 -11
- 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-7UBFU3CL.js} +18 -20
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
- 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-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
- package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
- package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
- 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 +195 -181
- 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 +282 -95
- 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 +17 -11
- 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 +30 -5
- 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 +21 -7
- 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/cross-file-recheck.ts +155 -0
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +35 -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 +6 -7
- 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 +26 -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 +64 -18
- package/scripts/run/run-step.ts +107 -51
- 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
package/scripts/run/run-step.ts
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { git_stash } from '#scripts/git/stash/git-stash'
|
|
2
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
2
3
|
import type { CarryRead } from '#scripts/run/carry/run-carry'
|
|
3
4
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
4
5
|
import { latest_scope_cli } from '#scripts/version/latest-scope-cli'
|
|
5
|
-
import { run_retrospective } from './run-retrospective'
|
|
6
|
+
import { run_retrospective, type RetrospectiveFacts } from './run-retrospective'
|
|
6
7
|
|
|
7
8
|
// `josh run:step <N>` — the run's next single action, computed from three mechanical inputs and nothing
|
|
8
|
-
// else
|
|
9
|
-
//
|
|
10
|
-
// backlogrun loop stayed a state machine written in English that the reader rebuilt every turn. This
|
|
11
|
-
// computes the position from the event stream (`run-event-stream.ts`), the carry record
|
|
9
|
+
// else, so the run's loop is not a state machine written in English that the reader rebuilds every
|
|
10
|
+
// turn. This computes the position from the event stream (`run-event-stream.ts`), the carry record
|
|
12
11
|
// (`run-carry.ts`) and the issue state (`run-prep.ts`) — never the conversation — and prints one line.
|
|
13
12
|
//
|
|
14
13
|
// **The print is one of two shapes, never a procedure.** A runnable command the reader pastes, or a
|
|
@@ -24,12 +23,12 @@ import { run_retrospective } from './run-retrospective'
|
|
|
24
23
|
const CLOSED = 'CLOSED'
|
|
25
24
|
|
|
26
25
|
// The fixed verdict tokens — the non-command, non-decide answers. Kept as the oracle's declared
|
|
27
|
-
// vocabulary
|
|
26
|
+
// vocabulary, so `decision-oracle.test.ts` pins the list against these.
|
|
28
27
|
const IMPLEMENT = 'implement'
|
|
29
28
|
const HUMAN_REVIEW = 'human-review'
|
|
30
29
|
const UPDATE_DEPS = 'update-deps'
|
|
31
30
|
const ALREADY_DONE = 'already-done'
|
|
32
|
-
// A closed issue whose lane tree still holds uncommitted work
|
|
31
|
+
// A closed issue whose lane tree still holds uncommitted work — `run:step`
|
|
33
32
|
// itself prints the `decide:` line naming the stash, and this is the token `run:entry` reports.
|
|
34
33
|
const KEEP_WORK = 'keep-work'
|
|
35
34
|
const WAIT = 'wait'
|
|
@@ -52,15 +51,14 @@ const VOCABULARY: ReadonlyArray<string> = [
|
|
|
52
51
|
const EXPIRED_DECISION =
|
|
53
52
|
'decide: whole-run budget spent — resume with `pnpm josh run:carry --resume` | discard with `pnpm josh run:carry --end`'
|
|
54
53
|
|
|
55
|
-
// The one step a stopped run still owes before it ends: the end-of-run retrospective
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
// consumer project.
|
|
54
|
+
// The one step a stopped run still owes before it ends: the end-of-run retrospective.
|
|
55
|
+
// It reads the run's own measurements and files the improvements worth carrying into the next run;
|
|
56
|
+
// the command is kit-only, so it means nothing — and is never printed — in a consumer project.
|
|
59
57
|
const RETROSPECTIVE_COMMAND = 'pnpm josh retrospective'
|
|
60
58
|
|
|
61
59
|
// The pre-implementation verdict `run:next` degenerates to: the position of a run that has emitted no
|
|
62
60
|
// event yet. `run-next.ts` maps each of these to its prose sentence, so this is the single copy of the
|
|
63
|
-
// state → step mapping and there is no second implementation
|
|
61
|
+
// state → step mapping and there is no second implementation.
|
|
64
62
|
type PreVerdict =
|
|
65
63
|
| typeof IMPLEMENT
|
|
66
64
|
| typeof HUMAN_REVIEW
|
|
@@ -73,10 +71,9 @@ interface PreInput {
|
|
|
73
71
|
state: string | undefined
|
|
74
72
|
is_human_review: boolean
|
|
75
73
|
latest_scope: string
|
|
76
|
-
// Whether a lane child's tree holds uncommitted work, read by `run:prep`'s gather
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
// `keep-work`.
|
|
74
|
+
// Whether a lane child's tree holds uncommitted work, read by `run:prep`'s gather.
|
|
75
|
+
// A closed issue over such a tree is not "nothing to do": the work was popped back from a park and
|
|
76
|
+
// is lost with the lane unless it is kept, so `already-done` gives way to `keep-work`.
|
|
80
77
|
has_changes: boolean
|
|
81
78
|
}
|
|
82
79
|
|
|
@@ -101,36 +98,40 @@ interface StepInput extends PreInput {
|
|
|
101
98
|
// event is read: the position is where the run *is*, not how it got there.
|
|
102
99
|
last_event: string | undefined
|
|
103
100
|
carry_kind: CarryRead['kind']
|
|
104
|
-
// Whether this invocation's end-of-run retrospective has already run, read off the carry record
|
|
105
|
-
//
|
|
101
|
+
// Whether this invocation's end-of-run retrospective has already run, read off the carry record.
|
|
102
|
+
// At the stop position it is what tells a run that still owes a
|
|
106
103
|
// retrospective from one that has run it, so the step is printed exactly once.
|
|
107
104
|
is_retrospective_done: boolean
|
|
108
|
-
// Whether this checkout is a kit consumer rather than kit itself
|
|
105
|
+
// Whether this checkout is a kit consumer rather than kit itself. The
|
|
109
106
|
// retrospective command is kit-only — refused in a consumer — so the step is never printed there; the
|
|
110
107
|
// consumer determination is the existing `doctor-consumer.ts` one, never a new judgement.
|
|
111
108
|
is_consumer: boolean
|
|
112
109
|
issue_number: string
|
|
113
110
|
// Whether this run is a dispatched lane child, read by the CLI from the dispatch mark
|
|
114
111
|
// (`lane-child-marker.ts`). A child must never be handed `run:merge` — that is the parent's own
|
|
115
|
-
// budget command and returns `busy` in a child
|
|
112
|
+
// budget command and returns `busy` in a child.
|
|
116
113
|
is_lane_child: boolean
|
|
117
|
-
// Whether the end-of-run retrospective is switched on, read by the CLI from `JOSH_RETROSPECTIVE
|
|
118
|
-
//
|
|
114
|
+
// Whether the end-of-run retrospective is switched on, read by the CLI from `JOSH_RETROSPECTIVE`.
|
|
115
|
+
// It defaults **off** — the auto-filed improvement issues the step drives
|
|
119
116
|
// are opt-in — so a run that leaves the variable unset never prints the retrospective step, while the
|
|
120
117
|
// retrospective's own logic is untouched and `pnpm josh retrospective` still runs by hand.
|
|
121
118
|
is_retrospective_enabled: boolean
|
|
122
119
|
// Whether this session is woken when a background command it started completes, read by the CLI from
|
|
123
|
-
// the session's own environment
|
|
120
|
+
// the session's own environment. A parent without the callback cannot wait
|
|
124
121
|
// on its lanes except by polling, so it hands the run to the supervisor instead of waiting.
|
|
125
122
|
has_completion_callback: boolean
|
|
126
123
|
// Whether the carried invocation has already taken its maximum cuts, read off the carry record by the
|
|
127
|
-
// CLI
|
|
124
|
+
// CLI. At the cap `run:carry --cut` refuses, so the hand-off is not offered.
|
|
128
125
|
is_at_cut_cap: boolean
|
|
129
126
|
// Whether the carry record has been handed off by a cut and no successor has adopted it yet, read off
|
|
130
|
-
// the record by the CLI
|
|
127
|
+
// the record by the CLI and set only in the session that declared the record.
|
|
131
128
|
// The session that took the cut is the only one that can read this — a successor spends the mark when
|
|
132
129
|
// it begins — so it is what tells that session to stop.
|
|
133
130
|
is_handed_off: boolean
|
|
131
|
+
// Whether this run launched the issue and its stream holds no `merge` for it yet, read by the CLI.
|
|
132
|
+
// A parent that reads a closed child as `already-done` never runs
|
|
133
|
+
// `run:merge`, so the merge is never written and `run:board` shows the child running forever.
|
|
134
|
+
is_merge_owed: boolean
|
|
134
135
|
}
|
|
135
136
|
|
|
136
137
|
interface StepAction {
|
|
@@ -146,26 +147,30 @@ function command(line: string): StepAction {
|
|
|
146
147
|
return { kind: 'command', line }
|
|
147
148
|
}
|
|
148
149
|
|
|
150
|
+
function merge_command(issue_number: string): StepAction {
|
|
151
|
+
return command(`pnpm josh run:merge ${issue_number}`)
|
|
152
|
+
}
|
|
153
|
+
|
|
149
154
|
// The action for each event a run can be positioned at, keyed on the newest one. Each dispatches to the
|
|
150
155
|
// command that owns that phase. `stop`, `drain` and `child-launch` are handled apart in
|
|
151
156
|
// `FULL_INPUT_ACTIONS`, because each needs more than the issue number. A merge and an outage share a
|
|
152
157
|
// next step: `run:merge` classifies both, including the outage's stop condition.
|
|
153
158
|
const KIND = run_event_stream.EVENT_KIND
|
|
154
|
-
// A park and a stall share this next step: both mean runnable work is waiting to be offered
|
|
155
|
-
//
|
|
159
|
+
// A park and a stall share this next step: both mean runnable work is waiting to be offered,
|
|
160
|
+
// so both are pointed at the backlog.
|
|
156
161
|
const OFFER_BACKLOG = 'pnpm josh backlog:next'
|
|
157
162
|
const EVENT_ACTIONS: Record<string, (issue_number: string) => StepAction> = {
|
|
158
163
|
[KIND.PR_OPENED]: () => command('pnpm josh followup'),
|
|
159
164
|
[KIND.REVIEW_ROUND]: () => command('pnpm josh review:round2'),
|
|
160
|
-
[KIND.MERGE]:
|
|
161
|
-
[KIND.OUTAGE]:
|
|
165
|
+
[KIND.MERGE]: merge_command,
|
|
166
|
+
[KIND.OUTAGE]: merge_command,
|
|
162
167
|
[KIND.PARK]: () => command(OFFER_BACKLOG),
|
|
163
168
|
[KIND.CUT]: (issue_number) => command(`pnpm josh run:cut --resume ${issue_number}`),
|
|
164
169
|
// A stall is undispatched ready work with a free lane, so its next step is exactly a park's: offer
|
|
165
170
|
// the backlog. The detector only reports the stall; reading it here as a dispatch is what turns the
|
|
166
171
|
// report into the action that resolves it.
|
|
167
172
|
[KIND.STALL]: () => command(OFFER_BACKLOG),
|
|
168
|
-
// The post-implementation region is with a detached ship supervisor
|
|
173
|
+
// The post-implementation region is with a detached ship supervisor: nothing
|
|
169
174
|
// is the agent's until the supervisor stops or the issue closes, which the terminal read answers.
|
|
170
175
|
[KIND.SHIP_LAUNCH]: () => verdict(WAIT),
|
|
171
176
|
// The supervisor stopped at a failed stage and handed control back — the next step is reading the
|
|
@@ -174,29 +179,28 @@ const EVENT_ACTIONS: Record<string, (issue_number: string) => StepAction> = {
|
|
|
174
179
|
}
|
|
175
180
|
|
|
176
181
|
// The parent-only positions a dispatched lane child must never act on. `run:merge` is the parent's
|
|
177
|
-
// budget command — a child that ran it read the `busy` it got back as a competing session and
|
|
178
|
-
// its Issue unimplemented
|
|
179
|
-
//
|
|
180
|
-
// (joshuafolkken/kit#2297).
|
|
182
|
+
// budget command — a child that ran it would read the `busy` it got back as a competing session and
|
|
183
|
+
// park its Issue unimplemented. A merge or an outage is the parent's to classify, so a child at one
|
|
184
|
+
// has nothing to run and stops rather than being handed `run:merge`.
|
|
181
185
|
const PARENT_ONLY_EVENTS: ReadonlySet<string> = new Set([KIND.MERGE, KIND.OUTAGE])
|
|
182
186
|
|
|
183
187
|
// A stopped run's last owed step is the end-of-run retrospective. When it is not owed the position stops
|
|
184
|
-
// with no command to run
|
|
188
|
+
// with no command to run.
|
|
185
189
|
function stop_action(input: StepInput): StepAction {
|
|
186
190
|
return run_retrospective.is_owed(input) ? command(RETROSPECTIVE_COMMAND) : verdict(STOP)
|
|
187
191
|
}
|
|
188
192
|
|
|
189
|
-
// The drain fires the retrospective *before* the idle watch, not after it
|
|
190
|
-
// retrospective files the improvement issues the watch then picks up, so running it after the watch
|
|
191
|
-
//
|
|
193
|
+
// The drain fires the retrospective *before* the idle watch, not after it: the
|
|
194
|
+
// retrospective files the improvement issues the watch then picks up, so running it after the watch
|
|
195
|
+
// would spend the watch on an empty pool. When the retrospective is not owed the
|
|
192
196
|
// run proceeds to that watch, which is a `WAIT` rather than a `STOP`: the backlog is empty but the run is
|
|
193
197
|
// not ending, and the real `STOP` follows when the watch expires with the retrospective already done.
|
|
194
198
|
function drain_action(input: StepInput): StepAction {
|
|
195
199
|
return run_retrospective.is_owed(input) ? command(RETROSPECTIVE_COMMAND) : verdict(WAIT)
|
|
196
200
|
}
|
|
197
201
|
|
|
198
|
-
// The hand-off a `backlogrun` parent without a completion callback takes right after dispatching
|
|
199
|
-
//
|
|
202
|
+
// The hand-off a `backlogrun` parent without a completion callback takes right after dispatching.
|
|
203
|
+
// It is the existing merge-time cut, so the ownership check and the cut cap
|
|
200
204
|
// apply unchanged, and the supervisor's driver adopts the in-flight lanes from their `child-launch`
|
|
201
205
|
// events.
|
|
202
206
|
const HAND_OFF_COMMAND = 'pnpm josh run:carry --cut --owner "$PPID"'
|
|
@@ -237,14 +241,14 @@ function event_action(event: string, issue_number: string, is_lane_child: boolea
|
|
|
237
241
|
|
|
238
242
|
// A run that has planned but emitted nothing else is still at its pre-implementation position, so a
|
|
239
243
|
// `plan` reads the same as an empty stream. A resume from an implementation cut is back at the same
|
|
240
|
-
// position
|
|
244
|
+
// position: read as the `cut` it follows, it would point at the spent resume again.
|
|
241
245
|
const IMPLEMENTATION_POSITIONS: ReadonlySet<string> = new Set([KIND.PLAN, KIND.RESUME])
|
|
242
246
|
|
|
243
247
|
function is_pre_implementation(last_event: string | undefined): boolean {
|
|
244
248
|
return last_event === undefined || IMPLEMENTATION_POSITIONS.has(last_event)
|
|
245
249
|
}
|
|
246
250
|
|
|
247
|
-
// **No cut at the setup→implementation boundary
|
|
251
|
+
// **No cut at the setup→implementation boundary**. A lane child's context is
|
|
248
252
|
// bounded by the threshold-gated implementation cut alone (`implementation-cut.ts`): the first edit is
|
|
249
253
|
// the moment both would have looked at, and below the threshold a cut there is one that does not pay
|
|
250
254
|
// for itself (`context-cut-payback.ts`), so a planned lane child implements in the same session.
|
|
@@ -252,31 +256,41 @@ function pre_implementation_action(input: StepInput): StepAction {
|
|
|
252
256
|
return verdict(pre_verdict(input))
|
|
253
257
|
}
|
|
254
258
|
|
|
259
|
+
// A parent whose child closed before `run:merge` wrote the merge still owes it:
|
|
260
|
+
// `run:merge` is the one writer of the `merge` event, so answering `already-done` here would leave the
|
|
261
|
+
// child running on `run:board` forever. A lane child is never handed `run:merge`.
|
|
262
|
+
function owes_merge(input: StepInput): boolean {
|
|
263
|
+
return input.is_merge_owed && input.carry_kind === 'carried' && !input.is_lane_child
|
|
264
|
+
}
|
|
265
|
+
|
|
255
266
|
// A closed issue ends the run, but a tree still holding uncommitted work is surfaced rather than
|
|
256
|
-
// answered `already-done` — the answer a child
|
|
257
|
-
// with the work in it
|
|
267
|
+
// answered `already-done` — the answer a child reads as "nothing to do" before its lane is removed
|
|
268
|
+
// with the work in it.
|
|
258
269
|
function closed_action(input: StepInput): StepAction {
|
|
270
|
+
if (owes_merge(input)) return merge_command(input.issue_number)
|
|
259
271
|
if (closed_verdict(input) === ALREADY_DONE) return verdict(ALREADY_DONE)
|
|
260
272
|
|
|
261
273
|
const message = git_stash.work_message(input.issue_number, ALREADY_DONE)
|
|
262
274
|
|
|
263
275
|
return {
|
|
264
276
|
kind: 'decide',
|
|
265
|
-
line: `decide:
|
|
277
|
+
line: `decide: ${session_cite.issue(input.issue_number)} is closed but this tree holds uncommitted work — keep it with \`git stash push -u -m "${message}"\` | carry it into a new issue`,
|
|
266
278
|
}
|
|
267
279
|
}
|
|
268
280
|
|
|
269
|
-
//
|
|
270
|
-
|
|
271
|
-
|
|
281
|
+
// What the carry record alone says — the part an issue's position and the parent's own share.
|
|
282
|
+
type CarryFacts = Pick<StepInput, 'carry_kind' | 'is_handed_off' | 'is_lane_child'>
|
|
283
|
+
|
|
284
|
+
// **A cut hands the run on, so the session that took it stops** — otherwise it would go on answering
|
|
285
|
+
// `wait` or the next offer after `run:carry --cut`, launching children in the same conversation. A
|
|
272
286
|
// lane child never holds the carry record, so its own position is not decided here.
|
|
273
|
-
function is_handed_off_parent(input:
|
|
287
|
+
function is_handed_off_parent(input: CarryFacts): boolean {
|
|
274
288
|
return input.is_handed_off && input.carry_kind === 'carried' && !input.is_lane_child
|
|
275
289
|
}
|
|
276
290
|
|
|
277
291
|
// The carry record's terminal answers: an unreadable record leaves the position unknowable, a handed-off
|
|
278
292
|
// run is its successor's, and a spent budget is the person's call.
|
|
279
|
-
function carry_terminal_action(input:
|
|
293
|
+
function carry_terminal_action(input: CarryFacts): StepAction | undefined {
|
|
280
294
|
if (input.carry_kind === 'unreadable') return verdict(UNKNOWN)
|
|
281
295
|
if (is_handed_off_parent(input)) return verdict(STOP)
|
|
282
296
|
if (input.carry_kind === 'expired') return { kind: 'decide', line: EXPIRED_DECISION }
|
|
@@ -297,6 +311,47 @@ function terminal_action(input: StepInput): StepAction | undefined {
|
|
|
297
311
|
return undefined
|
|
298
312
|
}
|
|
299
313
|
|
|
314
|
+
// **A run with no issue still has a next action** — the `backlogrun` parent's own position, read off the
|
|
315
|
+
// carry record alone. Without it a run that dispatched nothing — one begun on an empty backlog — has no
|
|
316
|
+
// position to ask about, and "the backlog is empty, so the run is over" is decided in the conversation
|
|
317
|
+
// instead of by the idle watch.
|
|
318
|
+
interface ParentInput extends RetrospectiveFacts {
|
|
319
|
+
carry_kind: CarryRead['kind']
|
|
320
|
+
// Whether this session declared the live record and no cut has handed it off yet.
|
|
321
|
+
is_driving: boolean
|
|
322
|
+
is_handed_off: boolean
|
|
323
|
+
is_at_cut_cap: boolean
|
|
324
|
+
last_event: string | undefined
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// The positions the end-of-run retrospective fires at, whoever asks.
|
|
328
|
+
const RETROSPECTIVE_POSITIONS: ReadonlySet<string> = new Set([KIND.DRAIN, KIND.STOP])
|
|
329
|
+
|
|
330
|
+
function is_retrospective_position(input: ParentInput): boolean {
|
|
331
|
+
return RETROSPECTIVE_POSITIONS.has(input.last_event ?? '') && run_retrospective.is_owed(input)
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// **The loop belongs to the supervisor, so a driving parent's next action is the hand-off whatever the
|
|
335
|
+
// plan held.** The supervisor starts no driver while a live owner holds the record, and only the driver
|
|
336
|
+
// runs the idle watch. A record at the cut cap has no cut left to take, so its session carries on.
|
|
337
|
+
function driving_action(input: ParentInput): StepAction {
|
|
338
|
+
if (is_retrospective_position(input)) return command(RETROSPECTIVE_COMMAND)
|
|
339
|
+
|
|
340
|
+
return input.is_at_cut_cap ? verdict(WAIT) : command(HAND_OFF_COMMAND)
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// A lane child's position is its issue's, and a record this session does not drive — absent, or another
|
|
344
|
+
// session's — is not its to hand off: both are `unknown`, never a guess at someone else's run.
|
|
345
|
+
function parent_action(input: ParentInput): StepAction {
|
|
346
|
+
if (input.is_lane_child) return verdict(UNKNOWN)
|
|
347
|
+
|
|
348
|
+
const terminal = carry_terminal_action(input)
|
|
349
|
+
|
|
350
|
+
if (terminal !== undefined) return terminal
|
|
351
|
+
|
|
352
|
+
return input.is_driving ? driving_action(input) : verdict(UNKNOWN)
|
|
353
|
+
}
|
|
354
|
+
|
|
300
355
|
// The one entry point: the run's next action, from the three inputs and nothing else. A terminal answer
|
|
301
356
|
// wins first; otherwise a run with nothing emitted yet is at its pre-implementation position, and a run
|
|
302
357
|
// that has begun is placed by its newest event.
|
|
@@ -328,8 +383,9 @@ const run_step = {
|
|
|
328
383
|
VOCABULARY,
|
|
329
384
|
WAIT,
|
|
330
385
|
next_action,
|
|
386
|
+
parent_action,
|
|
331
387
|
pre_verdict,
|
|
332
388
|
}
|
|
333
389
|
|
|
334
|
-
export type { PreInput, PreVerdict, StepAction, StepInput }
|
|
390
|
+
export type { ParentInput, PreInput, PreVerdict, StepAction, StepInput }
|
|
335
391
|
export { run_step }
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
2
2
|
import type { CarryRead } from '#scripts/run/carry/run-carry'
|
|
3
3
|
|
|
4
|
-
// **A `backlogrun` that halts because a person is needed
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// stopped until someone thought to ask. The 15-minute heartbeat stays a pull; a *stop* is a state
|
|
4
|
+
// **A `backlogrun` that halts because a person is needed must reach them after a session cut.** Every
|
|
5
|
+
// remaining child blocked behind a parked one, the backlog drained of anything runnable, the failure
|
|
6
|
+
// streak tripped — each ends the run, and while the session is the person's the stop is there in the
|
|
7
|
+
// conversation. After a cut the parent is a headless `claude -p backlogrun`, so the stop would reach
|
|
8
|
+
// its own transcript and nowhere else. The 15-minute heartbeat stays a pull; a *stop* is a state
|
|
10
9
|
// change, and a state change is what `confirmation` exists to push.
|
|
11
10
|
//
|
|
12
11
|
// **This is the decision, kept apart from the send so the dedup can be pinned without a Telegram.**
|
|
@@ -21,8 +20,8 @@ const STOP_TITLE = 'backlogrun stopped'
|
|
|
21
20
|
const STOP_RECOVERY =
|
|
22
21
|
'If this did not arrive, `pnpm josh run:wake --list` relays the last progress line.'
|
|
23
22
|
|
|
24
|
-
// **Only a stop over a record that is still there is announced, and that is the whole of the dedup
|
|
25
|
-
//
|
|
23
|
+
// **Only a stop over a record that is still there is announced, and that is the whole of the dedup**.
|
|
24
|
+
// `--end` removes the record, so a second `--end --stopped` — a retried
|
|
26
25
|
// turn, a re-evaluation — reads `none` and plans nothing, which is why one event never sends twice. A
|
|
27
26
|
// clean finish passes no reason and stays silent, because a completed run has its own notification and
|
|
28
27
|
// this type is for the run that halted needing a person. An `unreadable` record is not announced: with
|
|
@@ -3,7 +3,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import { run_stranded } from './run-stranded'
|
|
4
4
|
import { run_stranded_detect } from './run-stranded-detect'
|
|
5
5
|
|
|
6
|
-
// `josh run:stranded` — read the three facts once and print the verdict
|
|
6
|
+
// `josh run:stranded` — read the three facts once and print the verdict. This
|
|
7
7
|
// is the manual and testable face of the detector `stop-guard.ts` runs on every stop; both call the one
|
|
8
8
|
// `detect_and_report`, so the command and the hook can never drift.
|
|
9
9
|
//
|
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
type SupervisorLiveness,
|
|
11
11
|
} from './run-stranded'
|
|
12
12
|
|
|
13
|
-
// The I/O half of the strand detector
|
|
13
|
+
// The I/O half of the strand detector: it gathers the three facts the pure
|
|
14
14
|
// judge in `run-stranded.ts` weighs, then — on a strand — leaves the marker and sends the one
|
|
15
15
|
// notification. `stop-guard.ts` wires it into the Stop hook, so it runs at each loop boundary beside the
|
|
16
|
-
// stall detector it mirrors
|
|
16
|
+
// stall detector it mirrors; the CLI exposes the same call for a person to run
|
|
17
17
|
// by hand.
|
|
18
18
|
//
|
|
19
19
|
// **Cheap and local.** Every read is a file on disk — the carry record, the wake record — and a process
|
|
@@ -23,8 +23,8 @@ import {
|
|
|
23
23
|
|
|
24
24
|
// The recovery line names the command that hands the run to a fresh supervisor — the same one the pure
|
|
25
25
|
// judge holds, so the notification and the recovery can never drift. It is deliberately not
|
|
26
|
-
// `run:carry --resume`: the cutting session is refused `busy` and must stay refused
|
|
27
|
-
//
|
|
26
|
+
// `run:carry --resume`: the cutting session is refused `busy` and must stay refused,
|
|
27
|
+
// so recovery is another actor's.
|
|
28
28
|
const STRAND_RECOVERY = `Restart supervision with \`${run_stranded.RECOVERY_COMMAND}\` — it wakes a fresh successor to claim the budget; the cutting session must not resume it itself.`
|
|
29
29
|
|
|
30
30
|
// The seams a test replaces: the two record targets, the two record reads, the owner and supervisor
|
|
@@ -2,12 +2,10 @@ import { process_identity } from '#scripts/josh/process-identity'
|
|
|
2
2
|
import { run_carry, type CarryRead, type RunCarry } from '#scripts/run/carry/run-carry'
|
|
3
3
|
import type { RunWake } from '#scripts/run/wake/run-wake'
|
|
4
4
|
|
|
5
|
-
// The mechanical judge of a *stranded* run
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// weighed, are what say that state has been reached: the budget was handed off, its owner is gone, and
|
|
10
|
-
// no supervisor is alive to wake a successor.
|
|
5
|
+
// The mechanical judge of a *stranded* run: a handed-off budget whose cutting session died, with no
|
|
6
|
+
// successor claiming it and no supervisor watching, so lanes run on with nobody driving. Three facts,
|
|
7
|
+
// read and never weighed, are what say that state has been reached: the budget was handed off, its
|
|
8
|
+
// owner is gone, and no supervisor is alive to wake a successor.
|
|
11
9
|
//
|
|
12
10
|
// **Pure by design, exactly as `backlog-stalled.ts` is.** The carry read, the owner's liveness and the
|
|
13
11
|
// supervisor's are handed in, so the four acceptance cases — all three holding, a live owner, a claimed
|
|
@@ -18,7 +16,7 @@ import type { RunWake } from '#scripts/run/wake/run-wake'
|
|
|
18
16
|
// **It is a report, never a stop.** A false positive costs one notification, never a halted run or a
|
|
19
17
|
// torn-down lane — so every axis is read toward *not* stranded when it cannot be proven: an unreadable
|
|
20
18
|
// carry record is not stranded, and a supervisor whose liveness cannot be established counts as watching.
|
|
21
|
-
// **And recovery is another actor's, not the reader's
|
|
19
|
+
// **And recovery is another actor's, not the reader's**: the cutting session is
|
|
22
20
|
// refused `busy` and must stay refused, so what the notification names is `run:wake --start`, which
|
|
23
21
|
// starts a supervisor that wakes a *fresh* successor rather than driving the run itself.
|
|
24
22
|
|
|
@@ -27,7 +25,7 @@ import type { RunWake } from '#scripts/run/wake/run-wake'
|
|
|
27
25
|
// which is the `busy` refusal `run-carry.ts` → `is_count_refused` exists to keep.
|
|
28
26
|
const RECOVERY_COMMAND = 'pnpm josh run:wake --start'
|
|
29
27
|
|
|
30
|
-
// The three answers a supervisor's liveness probe gives, named
|
|
28
|
+
// The three answers a supervisor's liveness probe gives, named. `live` is a
|
|
31
29
|
// supervisor still watching, `gone` is one whose process has died or a record that was never there at
|
|
32
30
|
// all, and `unknown` is the platform answering for nobody — a pid that is alive paired with a start
|
|
33
31
|
// token this machine could not read. The three are kept apart because the strand judge resolves
|
|
@@ -53,11 +51,11 @@ interface StrandedInput {
|
|
|
53
51
|
supervisor: SupervisorLiveness
|
|
54
52
|
}
|
|
55
53
|
|
|
56
|
-
// **The supervisor's liveness, three-valued
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
//
|
|
54
|
+
// **The supervisor's liveness, three-valued.** An absent wake record is `gone`: nothing watching is
|
|
55
|
+
// the very state a strand needs. A present record is read through `process_identity.is_same_process`,
|
|
56
|
+
// whose own three answers this passes straight through — `true` is `live`, `false` is `gone`, and the
|
|
57
|
+
// platform's "cannot tell" is `unknown`. The prober is injected so the three cases are tested without
|
|
58
|
+
// a real process.
|
|
61
59
|
function supervisor_liveness(
|
|
62
60
|
wake: RunWake | undefined,
|
|
63
61
|
same_process: (
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
3
4
|
import { josh_command } from '#scripts/josh/josh-run'
|
|
4
5
|
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
5
6
|
import { run_tail, type TailSection } from './run-tail'
|
|
6
7
|
|
|
7
|
-
// `josh run:tail [<N> ...]` — one call for the fixed post-merge sequence a run closes on
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
8
|
+
// `josh run:tail [<N> ...]` — one call for the fixed post-merge sequence a run closes on.
|
|
9
|
+
// It runs `observations:flush`, `issue:cite` and `release:scope` internally, so no round trip per step
|
|
10
|
+
// re-bills a lane's full context, and prints one composite report, the same way
|
|
11
|
+
// `backlog:offer` chains its two calls and `run:prep` bundles three reads. Each
|
|
12
|
+
// step's stderr is forwarded, so the reader still sees every explanation the three would have
|
|
13
|
+
// printed on their own.
|
|
13
14
|
//
|
|
14
15
|
// The issue numbers are the completion's citations — the closed issue and any follow-ups filed this run
|
|
15
16
|
// — and go to `issue:cite`; the other two take none. A `run:tail` with no numbers still closes the run,
|
|
16
17
|
// because `issue:cite` with no target exits zero.
|
|
17
18
|
//
|
|
18
|
-
// **A dispatched lane child skips the ledger step
|
|
19
|
+
// **A dispatched lane child skips the ledger step**. A flush opens a
|
|
19
20
|
// ledger-only pull request and waits out its whole CI before it merges — minutes per issue, spent on a
|
|
20
21
|
// file only the retrospective and the measurements read — and a lane has nothing for it: its lines
|
|
21
|
-
// merged with its own pull request
|
|
22
|
+
// merged with its own pull request. A single run outside a lane keeps the
|
|
22
23
|
// step for a line written on the default branch outside any issue's run.
|
|
23
24
|
|
|
24
25
|
const ARGV_OFFSET = 2
|
|
25
26
|
const FAILURE_EXIT_CODE = 1
|
|
26
|
-
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
27
27
|
const USAGE = 'Usage: josh run:tail [<issue-number> ...]'
|
|
28
28
|
const should_forward_stderr = true
|
|
29
29
|
|
|
@@ -33,14 +33,13 @@ interface Step {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
// The steps in the order a run closes on: the checkout returns to the default branch, any ledger line
|
|
36
|
-
// the run's own commit did not carry
|
|
36
|
+
// the run's own commit did not carry is committed so the recurrence count is on
|
|
37
37
|
// main — on most runs the flush answers `clean` — the citations are read for the completion report, and
|
|
38
38
|
// the release scope is decided last.
|
|
39
39
|
//
|
|
40
|
-
// **The return comes first because the flush refuses anywhere else
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
// step a person used to type after the fact; it fast-forwards the local default branch before the
|
|
40
|
+
// **The return comes first because the flush refuses anywhere else**. A run closes right
|
|
41
|
+
// after its merge, still on the feature branch it shipped from, and `josh ship` reaches this report
|
|
42
|
+
// with nothing in between. `main:sync` fast-forwards the local default branch before the
|
|
44
43
|
// checkout, so a ledger line appended after the merge is carried along rather than refused.
|
|
45
44
|
const LEDGER_STEPS: ReadonlyArray<Step> = [
|
|
46
45
|
{ header: run_tail.SYNC_HEADER, argv: () => ['main:sync'] },
|
|
@@ -58,7 +57,7 @@ function steps_for(is_lane_child: boolean): ReadonlyArray<Step> {
|
|
|
58
57
|
// Numbers only — a target `issue:cite` reads as an issue, so a stray flag is refused rather than
|
|
59
58
|
// forwarded to the wrong step.
|
|
60
59
|
function parse_issues(argv: ReadonlyArray<string>): ReadonlyArray<string> | undefined {
|
|
61
|
-
if (argv.every((token) =>
|
|
60
|
+
if (argv.every((token) => issue_number_shape.is_issue_number(token))) return argv
|
|
62
61
|
|
|
63
62
|
return undefined
|
|
64
63
|
}
|
|
@@ -74,7 +73,7 @@ async function run_step(step: Step, issues: ReadonlyArray<string>): Promise<Tail
|
|
|
74
73
|
}
|
|
75
74
|
|
|
76
75
|
// Run the steps in order, not concurrently: the ledger commit must land on main before the release scope
|
|
77
|
-
// reads main's pending count
|
|
76
|
+
// reads main's pending count.
|
|
78
77
|
async function close_run(issues: ReadonlyArray<string>): Promise<ReadonlyArray<TailSection>> {
|
|
79
78
|
const sections: Array<TailSection> = []
|
|
80
79
|
|
package/scripts/run/run-tail.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// `josh run:tail [<N> ...]` — the one call that closes a run
|
|
2
|
-
//
|
|
1
|
+
// `josh run:tail [<N> ...]` — the one call that closes a run. It folds the fixed
|
|
2
|
+
// post-merge bookkeeping that would otherwise take three separate round trips — commit the observation
|
|
3
3
|
// ledger (`observations:flush`), read the completion citations (`issue:cite`), and decide whether a
|
|
4
4
|
// release is owed (`release:scope`) — into one composite, the same shape `run:prep` bundles three reads
|
|
5
5
|
// on. None of the three needs a decision between it and the next, so nothing the reader had to judge is
|
|
@@ -9,53 +9,34 @@
|
|
|
9
9
|
// each step's output under a header and answers the exit code from the collected codes, so a test pins
|
|
10
10
|
// the composite without a ledger ever being committed or a release ever read.
|
|
11
11
|
|
|
12
|
+
import { run_section, type Section } from './run-section'
|
|
13
|
+
|
|
12
14
|
const SYNC_HEADER = '=== sync ==='
|
|
13
15
|
const OBSERVATIONS_HEADER = '=== observations ==='
|
|
14
16
|
const CITATIONS_HEADER = '=== citations ==='
|
|
15
17
|
const RELEASE_HEADER = '=== release ==='
|
|
16
|
-
const SECTION_SEPARATOR = '\n\n'
|
|
17
|
-
|
|
18
|
-
const SUCCESS_EXIT_CODE = 0
|
|
19
|
-
const FAILURE_EXIT_CODE = 1
|
|
20
|
-
|
|
21
|
-
interface TailSection {
|
|
22
|
-
header: string
|
|
23
|
-
body: string
|
|
24
|
-
code: number
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function section_report(section: TailSection): string {
|
|
28
|
-
return `${section.header}\n${section.body}`
|
|
29
|
-
}
|
|
30
18
|
|
|
31
|
-
|
|
32
|
-
return sections.map((section) => section_report(section)).join(SECTION_SEPARATOR)
|
|
33
|
-
}
|
|
19
|
+
type TailSection = Section
|
|
34
20
|
|
|
35
|
-
// **A failed step's stderr joins its body
|
|
36
|
-
//
|
|
37
|
-
//
|
|
21
|
+
// **A failed step's stderr joins its body.** A detached run's log keeps the report, not the
|
|
22
|
+
// terminal, so a refusal printed only to stderr would leave the section reading `ELIFECYCLE` alone. A
|
|
23
|
+
// passing step's stderr is commentary and stays out of the report.
|
|
38
24
|
function section_body(out: string, error_output: string | undefined, code: number): string {
|
|
39
|
-
if (
|
|
25
|
+
if (error_output === undefined || code === run_section.SUCCESS_EXIT_CODE) return out
|
|
40
26
|
|
|
41
27
|
return [out, error_output].filter((part) => part.length > 0).join('\n')
|
|
42
28
|
}
|
|
43
29
|
|
|
44
|
-
//
|
|
45
|
-
// ledger commit failed is never read as a clean close because the citations after it
|
|
46
|
-
|
|
47
|
-
const is_clean = sections.every((section) => section.code === SUCCESS_EXIT_CODE)
|
|
48
|
-
|
|
49
|
-
return is_clean ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
50
|
-
}
|
|
51
|
-
|
|
30
|
+
// The exit code is non-zero when any step failed, exactly as each of the three exits on its own — a
|
|
31
|
+
// bundle where the ledger commit failed is never read as a clean close because the citations after it
|
|
32
|
+
// succeeded.
|
|
52
33
|
const run_tail = {
|
|
53
34
|
CITATIONS_HEADER,
|
|
54
35
|
OBSERVATIONS_HEADER,
|
|
55
36
|
RELEASE_HEADER,
|
|
56
37
|
SYNC_HEADER,
|
|
57
|
-
exit_code,
|
|
58
|
-
format_report,
|
|
38
|
+
exit_code: run_section.exit_code_of,
|
|
39
|
+
format_report: run_section.format_sections,
|
|
59
40
|
section_body,
|
|
60
41
|
}
|
|
61
42
|
|
|
@@ -4,10 +4,9 @@ import { run_progress_read } from '#scripts/run/progress/run-progress-read'
|
|
|
4
4
|
import { run_watcher_guard } from './run-watcher-guard'
|
|
5
5
|
|
|
6
6
|
// `josh run:watcher:guard` — refuses when lane children are in-flight but the progress watcher has not
|
|
7
|
-
// pinged its life record recently
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// (joshuafolkken/kit#2353).
|
|
7
|
+
// pinged its life record recently. This is the hand-run form, kept for a run that calls it before a
|
|
8
|
+
// loop iteration; the *automatic* wiring is in `pretool-guard.ts`, which composes the same guard
|
|
9
|
+
// through `run-watcher-hook.ts` so every tool call is checked.
|
|
11
10
|
//
|
|
12
11
|
// **Exits 0 (ok) or 1 (stale).** A non-zero exit is what the hook mechanism treats as a refusal —
|
|
13
12
|
// the same contract `batch:guard` and `rule:guard` hold.
|