@joshuafolkken/kit 1.1240.0 → 1.1370.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +29 -47
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +216 -202
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +281 -94
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +58 -47
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
2
|
import { lane_paths } from './lane-paths'
|
|
3
3
|
|
|
4
4
|
// The mark a dispatched lane child carries, so the pre-gate cut and a resume are decided from the
|
|
5
|
-
// environment rather than from the model's reading of the prompt
|
|
5
|
+
// environment rather than from the model's reading of the prompt.
|
|
6
6
|
//
|
|
7
|
-
// **
|
|
8
|
-
// and the `run:cut` relaunch both start the child with `claude -p "fullrun #<N>"` and
|
|
9
|
-
// environment, and nothing in the argv, the environment or a file
|
|
10
|
-
// typed".
|
|
11
|
-
//
|
|
12
|
-
//
|
|
7
|
+
// **Without this mark a dispatched child is indistinguishable from a person's own session.**
|
|
8
|
+
// `lane:dispatch` and the `run:cut` relaunch both start the child with `claude -p "fullrun #<N>"` and
|
|
9
|
+
// a copied environment, and nothing in the argv, the environment or a file says "this session was
|
|
10
|
+
// launched, not typed". Left to the model, the human-or-child question is answered by reading its own
|
|
11
|
+
// prompt, which decides "person" and declines the cut. This variable is that missing fact, made
|
|
12
|
+
// mechanical.
|
|
13
13
|
//
|
|
14
14
|
// **Its value is the issue number, because a mark that only said "a child" could not be told from one
|
|
15
15
|
// that leaked.** A person's shell, or a parent session that was itself a dispatched child, can carry
|
|
@@ -19,7 +19,7 @@ import { lane_paths } from './lane-paths'
|
|
|
19
19
|
// `.claude/skills/workflow-commands/pre-gate-cut.md`.
|
|
20
20
|
const KEY = 'JOSH_LANE_CHILD'
|
|
21
21
|
|
|
22
|
-
// **A dispatched child also asks for the five-minute prompt-cache TTL
|
|
22
|
+
// **A dispatched child also asks for the five-minute prompt-cache TTL**. A
|
|
23
23
|
// headless `claude -p` session on a subscription defaults to the one-hour TTL, whose writes bill at 2x
|
|
24
24
|
// the input rate against 1.25x for five minutes. A replay of 1,953 lane transcripts (about 57,000
|
|
25
25
|
// requests) found 0.3% of request gaps over five minutes, so the shorter TTL — re-writing the prefix on
|
|
@@ -34,7 +34,7 @@ type MarkerSource = Readonly<Record<string, string | undefined>>
|
|
|
34
34
|
// issue number rather than from text read anywhere — the same discipline `lane-dispatch.ts` applies to
|
|
35
35
|
// the invocation it builds — so a malformed number fails here rather than reaching a child.
|
|
36
36
|
function environment_for(issue: string): Record<string, string> {
|
|
37
|
-
|
|
37
|
+
issue_number_shape.require_issue_number(issue)
|
|
38
38
|
|
|
39
39
|
return { [KEY]: issue, [CACHE_TTL_KEY]: CACHE_TTL }
|
|
40
40
|
}
|
|
@@ -47,14 +47,14 @@ function marked_issue(source: MarkerSource = process.env): string | undefined {
|
|
|
47
47
|
|
|
48
48
|
if (value === undefined) return undefined
|
|
49
49
|
|
|
50
|
-
return
|
|
50
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
// True when this session is a dispatched lane child for the checkout it is running in: the mark is
|
|
54
54
|
// present and names this lane's own issue, read from the checkout path. A numeric mark naming a
|
|
55
55
|
// *different* issue leaked in from a parent session into a checkout it does not belong to, so it is
|
|
56
56
|
// read as a person's run — the trust condition the header describes, applied the same way
|
|
57
|
-
// `pre-gate-cut.ts` applies it to the resume decision
|
|
57
|
+
// `pre-gate-cut.ts` applies it to the resume decision.
|
|
58
58
|
function is_child_of(directory: string, source: MarkerSource = process.env): boolean {
|
|
59
59
|
const marked = marked_issue(source)
|
|
60
60
|
|
package/scripts/lane/lane-cli.ts
CHANGED
|
@@ -4,6 +4,8 @@ import { epic_busy } from '#scripts/epic/epic-busy'
|
|
|
4
4
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
5
5
|
import type { OpenIssueData } from '#scripts/git/git-schemas'
|
|
6
6
|
import { issue_cite, type IssueCiter } from '#scripts/issue/issue-cite'
|
|
7
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
8
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
7
9
|
import { error_text } from '#scripts/lib/error-message'
|
|
8
10
|
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
9
11
|
import { run_carry_reclaim } from '#scripts/run/carry/run-carry-reclaim'
|
|
@@ -18,8 +20,7 @@ import { lane_report } from './lane-report'
|
|
|
18
20
|
import { lane_seed_policy } from './lane-seed'
|
|
19
21
|
import { lane_stray } from './lane-stray'
|
|
20
22
|
|
|
21
|
-
// `josh lane:open` / `lane:close` / `lane:list` / `lane:prune` — the lane's whole lifecycle
|
|
22
|
-
// (joshuafolkken/kit#1490).
|
|
23
|
+
// `josh lane:open` / `lane:close` / `lane:list` / `lane:prune` — the lane's whole lifecycle.
|
|
23
24
|
//
|
|
24
25
|
// **`lane:open` prints the lane's directory on standard output and nothing else**, so
|
|
25
26
|
// `dir=$(pnpm josh lane:open 1490)` is what a caller needs and a refusal is an empty capture beside
|
|
@@ -33,7 +34,6 @@ const SINGLE_ARGUMENT = 1
|
|
|
33
34
|
const ISSUE_AND_PATH_ARGUMENTS = 2
|
|
34
35
|
const ALL_FLAG = '--all'
|
|
35
36
|
const NONE_TOKEN = 'none'
|
|
36
|
-
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
37
37
|
|
|
38
38
|
const USAGE = [
|
|
39
39
|
'Usage: josh lane:open <issue-number>',
|
|
@@ -54,8 +54,7 @@ function report_usage(): number {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
// Read the carry record and refuse if this session has already handed off its budget via `--cut`.
|
|
57
|
-
// A cut session must not open new lanes or dispatch new children — the successor owns the budget
|
|
58
|
-
// (joshuafolkken/kit#2114).
|
|
57
|
+
// A cut session must not open new lanes or dispatch new children — the successor owns the budget.
|
|
59
58
|
async function guard_cut_session(): Promise<string | undefined> {
|
|
60
59
|
const directory = await run_carry.repository_directory()
|
|
61
60
|
|
|
@@ -73,7 +72,7 @@ async function guard_cut_session(): Promise<string | undefined> {
|
|
|
73
72
|
function parse_lane_issue(value: string | undefined): string | undefined {
|
|
74
73
|
if (value === undefined) return undefined
|
|
75
74
|
|
|
76
|
-
return ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
|
|
75
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
function parse_issue(rest: ReadonlyArray<string>): string | undefined {
|
|
@@ -89,7 +88,7 @@ function refusal_message(outcome: Exclude<OpenOutcome, { kind: 'opened' }>): str
|
|
|
89
88
|
return `All ${String(lane_seed_policy.LAST_LANE_SEAT)} lane seats are taken. Run \`pnpm josh lane:list\` to see them and \`pnpm josh lane:close <issue-number>\` to free one.`
|
|
90
89
|
}
|
|
91
90
|
|
|
92
|
-
return `A lane for
|
|
91
|
+
return `A lane for ${session_cite.issue(outcome.lane.issue)} is already open at ${outcome.lane.directory}. Run \`pnpm josh lane:close ${outcome.lane.issue}\` before opening it again.`
|
|
93
92
|
}
|
|
94
93
|
|
|
95
94
|
function report_open(outcome: OpenOutcome): number {
|
|
@@ -119,7 +118,7 @@ function report_issues(issues: ReadonlyArray<string>): number {
|
|
|
119
118
|
function report_close(outcome: CloseOutcome): number {
|
|
120
119
|
if (outcome.reaped.length > 0) {
|
|
121
120
|
console.error(
|
|
122
|
-
`Terminated the lane child for
|
|
121
|
+
`Terminated the lane child for ${session_cite.issue(outcome.issue)} that had not ended by itself: process ${outcome.reaped.join(', ')}.`,
|
|
123
122
|
)
|
|
124
123
|
}
|
|
125
124
|
|
|
@@ -128,7 +127,7 @@ function report_close(outcome: CloseOutcome): number {
|
|
|
128
127
|
}
|
|
129
128
|
|
|
130
129
|
console.error(
|
|
131
|
-
`Closing the lane for
|
|
130
|
+
`Closing the lane for ${session_cite.issue(outcome.issue)} left this behind: ${outcome.left_behind.join(', ')}. Remove it and run \`pnpm josh lane:close ${outcome.issue}\` again.`,
|
|
132
131
|
)
|
|
133
132
|
|
|
134
133
|
return FAILURE_EXIT_CODE
|
|
@@ -141,7 +140,7 @@ function report_sweep(outcome: SweepOutcome): number {
|
|
|
141
140
|
|
|
142
141
|
if (outcome.failed.length === 0) return code
|
|
143
142
|
|
|
144
|
-
const named = outcome.failed.map((issue) =>
|
|
143
|
+
const named = outcome.failed.map((issue) => session_cite.issue(issue)).join(', ')
|
|
145
144
|
|
|
146
145
|
// `lane:list` reads git's work trees, and the usual survivor is a branch whose work tree is
|
|
147
146
|
// already gone — which that listing cannot show. Closing each one again is what names it.
|
|
@@ -194,7 +193,7 @@ const OCCUPANCY_UNREADABLE =
|
|
|
194
193
|
'Could not read the `in-progress` listing, so the lane/label difference was not checked — that is not "everything agrees"; check `gh auth status`.'
|
|
195
194
|
|
|
196
195
|
// The `in-progress` issues this repository shows running, read the way `epic:next` reads lane
|
|
197
|
-
// occupancy — never rebuilt
|
|
196
|
+
// occupancy — never rebuilt. A read that could not see the whole listing is
|
|
198
197
|
// `undefined`, so the difference is skipped rather than computed against a set known to be partial.
|
|
199
198
|
async function to_holders(repo: string): Promise<ReadonlyArray<OpenIssueData> | undefined> {
|
|
200
199
|
const read = await epic_busy.read_repository(repo)
|
|
@@ -204,7 +203,7 @@ async function to_holders(repo: string): Promise<ReadonlyArray<OpenIssueData> |
|
|
|
204
203
|
}
|
|
205
204
|
|
|
206
205
|
// The repository and its running issues, read once: the listing cites each lane from the titles here
|
|
207
|
-
//
|
|
206
|
+
// and the occupancy check compares against the same set.
|
|
208
207
|
interface InProgress {
|
|
209
208
|
repo: string | undefined
|
|
210
209
|
holders: ReadonlyArray<OpenIssueData> | undefined
|
|
@@ -273,7 +272,7 @@ async function prune_command(rest: ReadonlyArray<string>): Promise<number> {
|
|
|
273
272
|
|
|
274
273
|
// After the closes, so a lane whose close left its directory behind is swept in the same run. A
|
|
275
274
|
// kept stray is reported, never a failure: it waits on a person, and a non-zero exit would stop
|
|
276
|
-
// every `backlogrun` preparation until one came
|
|
275
|
+
// every `backlogrun` preparation until one came.
|
|
277
276
|
await lane_stray.sweep_and_report()
|
|
278
277
|
|
|
279
278
|
return code
|
|
@@ -6,7 +6,7 @@ import { lane_paths } from './lane-paths'
|
|
|
6
6
|
import { lane_reap } from './lane-reap'
|
|
7
7
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
8
8
|
|
|
9
|
-
// Closing a lane: no work tree, no branch, no directory
|
|
9
|
+
// Closing a lane: no work tree, no branch, no directory.
|
|
10
10
|
//
|
|
11
11
|
// **A lane is closed after a park, a failure or an interruption as readily as after a success**, so
|
|
12
12
|
// every step here is written to run over a subject that is already gone or that still holds
|
|
@@ -21,7 +21,7 @@ interface LaneTargets {
|
|
|
21
21
|
|
|
22
22
|
// The lane an issue number names: its registration, when there is one, and the paths a close acts on.
|
|
23
23
|
// Resolved once here so a caller that has to look inside the tree before closing it reads the same
|
|
24
|
-
// directory the close removes
|
|
24
|
+
// directory the close removes.
|
|
25
25
|
interface ResolvedLane {
|
|
26
26
|
existing: LaneInfo | undefined
|
|
27
27
|
targets: LaneTargets
|
|
@@ -107,8 +107,8 @@ function close_kind(did_exist: boolean, left_behind: ReadonlyArray<string>): Clo
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
// The main work tree's root, not this one's — the same reading `list_lanes` uses, so the fallback
|
|
110
|
-
// directory an unregistered lane is closed by is the one `lane:open` would have created
|
|
111
|
-
//
|
|
110
|
+
// directory an unregistered lane is closed by is the one `lane:open` would have created.
|
|
111
|
+
// Derived here from the current work tree, a close run inside a lane
|
|
112
112
|
// reports `none` over a directory that is still on disk.
|
|
113
113
|
async function lane_root_directory(): Promise<string> {
|
|
114
114
|
return lane_paths.lane_root(await lane_registry.main_repository_root())
|
|
@@ -130,8 +130,8 @@ async function close_lane(issue: string): Promise<CloseOutcome> {
|
|
|
130
130
|
const { existing, targets } = await resolve_lane(issue)
|
|
131
131
|
const did_exist = existing !== undefined || existsSync(targets.directory)
|
|
132
132
|
// Before the removal, not after: a child still running in the tree would keep writing into a
|
|
133
|
-
// directory being deleted, and a process outliving its lane is
|
|
134
|
-
//
|
|
133
|
+
// directory being deleted, and a process outliving its lane is a half-discarded state — the work
|
|
134
|
+
// tree gone, the child still answering `alive`.
|
|
135
135
|
const reaped = lane_reap.reap_child(issue)
|
|
136
136
|
|
|
137
137
|
await remove_lane(targets)
|
|
@@ -2,45 +2,44 @@ import { agent_argv, type AgentArgv, type AgentArgvResult } from '#scripts/agent
|
|
|
2
2
|
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
3
3
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
4
|
import type { LabelWrite } from '#scripts/gh/git-gh-issue-write'
|
|
5
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
5
6
|
import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
|
|
7
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
8
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
6
9
|
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
7
10
|
import { detached_launch } from '#scripts/run/detached-launch'
|
|
8
11
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
9
12
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
10
13
|
import { run_ending } from '#scripts/run/run-ending'
|
|
11
|
-
import {
|
|
14
|
+
import { run_label } from '#scripts/run/run-label'
|
|
12
15
|
import { lane_child_invocation } from './lane-child-invocation'
|
|
13
16
|
import { lane_child_marker } from './lane-child-marker'
|
|
14
17
|
import { lane_dispatch_log } from './lane-dispatch-log'
|
|
18
|
+
import { lane_ledger } from './lane-ledger'
|
|
15
19
|
import { lane_output } from './lane-output'
|
|
16
20
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
17
21
|
import { lane_resume, type ResumePlan } from './lane-resume'
|
|
18
22
|
import { openai_lane_supervisor } from './openai-lane-supervisor'
|
|
19
23
|
|
|
20
|
-
// `josh lane:dispatch <issue-number>` — start a lane's child as an operating-system process of its own
|
|
21
|
-
// (joshuafolkken/kit#1749).
|
|
24
|
+
// `josh lane:dispatch <issue-number>` — start a lane's child as an operating-system process of its own.
|
|
22
25
|
//
|
|
23
|
-
// **
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
// was dead, waited out the silent-unit window, booked each lane `stopped`, and aborted the whole run on
|
|
28
|
-
// the third one. Launched detached, the child survives the cut and the sentence holds as written.
|
|
26
|
+
// **This is what makes the premise the session cut rests on true.** `backlogrun-progress.md` → "The
|
|
27
|
+
// hand-off" says "nothing has to finish, because nothing is being abandoned"; an in-process child
|
|
28
|
+
// would die with the parent it was cut from. Launched detached, the child survives the cut and the
|
|
29
|
+
// sentence holds as written.
|
|
29
30
|
//
|
|
30
31
|
// **Nothing here is new machinery.** The lane is already a linked work tree with its own branch and
|
|
31
32
|
// ports (`lane-open.ts`), the detached launcher is already `run:wake`'s (`detached-launch.ts`), and the
|
|
32
33
|
// recorded output path is already how a session that never opened a lane polls it (`lane-output.ts`).
|
|
33
|
-
//
|
|
34
|
+
// This is the one command that puts the three together.
|
|
34
35
|
//
|
|
35
|
-
// **The recording happens inside the dispatch, so "the lane records no path"
|
|
36
|
-
//
|
|
37
|
-
// recording used to be a separate step a run could forget. A lane dispatched through here is recorded
|
|
38
|
-
// by the same call that starts it.
|
|
36
|
+
// **The recording happens inside the dispatch, so "the lane records no path" is not a state.** A
|
|
37
|
+
// lane dispatched through here is recorded by the same call that starts it, so no run can forget it.
|
|
39
38
|
|
|
40
39
|
// The invocation the child is given. Composed from this constant and a digits-only issue number, never
|
|
41
40
|
// from text that was read from anywhere — the same discipline `run-wake-session.ts` applies to the
|
|
42
41
|
// invocation it rebuilds out of the carry record.
|
|
43
|
-
// The resume guide a relaunched child is pointed at
|
|
42
|
+
// The resume guide a relaunched child is pointed at. It carries the resume
|
|
44
43
|
// procedure a `run:cut` successor follows, so naming it lets the child read one section rather than the
|
|
45
44
|
// workflow-commands entry documents it would otherwise read to learn it is a resume at all.
|
|
46
45
|
const NOTE_SEPARATOR = '; '
|
|
@@ -60,7 +59,7 @@ interface Dispatched {
|
|
|
60
59
|
log_path: string
|
|
61
60
|
pid: number
|
|
62
61
|
profile: AgentProfile
|
|
63
|
-
// The session id this dispatch resumed, or `undefined` when it started fresh
|
|
62
|
+
// The session id this dispatch resumed, or `undefined` when it started fresh.
|
|
64
63
|
// `describe` reports which path was taken, so an `outage` re-dispatch says whether it recovered the
|
|
65
64
|
// disconnected child's context or fell back to a fresh run.
|
|
66
65
|
resumed_from: string | undefined
|
|
@@ -110,14 +109,13 @@ function child_invocation(issue: string): string {
|
|
|
110
109
|
|
|
111
110
|
/**
|
|
112
111
|
* The prompt a relaunched child is given after a `run:cut` — a resume-specific instruction followed by
|
|
113
|
-
* the bare `child_invocation`
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* `run:cut --resume` and the stage that answers.
|
|
112
|
+
* the bare `child_invocation`. Given the plain `fullrun #<N>`, a relaunched child would read the
|
|
113
|
+
* workflow-commands entry documents every resume before it could learn it was a resume at all — the
|
|
114
|
+
* "do not re-read" exception lives inside the very skill it would have to open. This preamble tells
|
|
115
|
+
* it up front, so it goes straight to `run:cut --resume` and the stage that answers.
|
|
118
116
|
*
|
|
119
117
|
* **It ends with `child_invocation` on purpose, not as decoration.** The parent's liveness poll is
|
|
120
|
-
* `
|
|
118
|
+
* `lane_child_invocation.process_pattern` (read by `run:liveness` — see `log_sentence`), so a relaunched process
|
|
121
119
|
* whose command line did not end with `fullrun #<N>` would be booked stopped while it ran. The trailing
|
|
122
120
|
* invocation keeps that poll matching and is also the ordinary run a `fresh` verdict falls back to.
|
|
123
121
|
*/
|
|
@@ -171,7 +169,7 @@ function failed_start(
|
|
|
171
169
|
|
|
172
170
|
// The `dispatched` outcome, built from the request the launch was composed from — one place so the
|
|
173
171
|
// three launch paths cannot drift on which fields a dispatched child carries (the resume flag among
|
|
174
|
-
// them
|
|
172
|
+
// them). The request's `argv` rides along harmlessly.
|
|
175
173
|
// **`kind` is written last on purpose**: the request was spread from a `Prepared`, so it still carries
|
|
176
174
|
// `kind: 'prepared'` at runtime, and letting the spread win would mislabel the outcome.
|
|
177
175
|
function dispatched_of(
|
|
@@ -190,7 +188,7 @@ function existing_dispatch(request: StartRequest): DispatchOutcome | undefined {
|
|
|
190
188
|
if (!openai_lane_supervisor.approve(request.lane.directory, active.nonce)) {
|
|
191
189
|
return failed_start(
|
|
192
190
|
request,
|
|
193
|
-
`the OpenAI supervisor for lane
|
|
191
|
+
`the OpenAI supervisor for lane ${session_cite.issue(request.lane.issue)} was cancelled`,
|
|
194
192
|
[],
|
|
195
193
|
)
|
|
196
194
|
}
|
|
@@ -216,13 +214,17 @@ async function openai_dispatched_start(
|
|
|
216
214
|
if (owner?.issue !== lane.issue) {
|
|
217
215
|
if (nonce !== undefined) openai_lane_supervisor.cancel(lane.directory, nonce)
|
|
218
216
|
|
|
219
|
-
return failed_start(
|
|
217
|
+
return failed_start(
|
|
218
|
+
request,
|
|
219
|
+
`the OpenAI supervisor did not claim lane ${session_cite.issue(lane.issue)}`,
|
|
220
|
+
notes,
|
|
221
|
+
)
|
|
220
222
|
}
|
|
221
223
|
|
|
222
224
|
if (!openai_lane_supervisor.approve(lane.directory, owner.nonce)) {
|
|
223
225
|
return failed_start(
|
|
224
226
|
request,
|
|
225
|
-
`the OpenAI supervisor for lane
|
|
227
|
+
`the OpenAI supervisor for lane ${session_cite.issue(lane.issue)} was cancelled`,
|
|
226
228
|
notes,
|
|
227
229
|
)
|
|
228
230
|
}
|
|
@@ -267,7 +269,7 @@ async function started(request: StartRequest): Promise<DispatchOutcome> {
|
|
|
267
269
|
|
|
268
270
|
// Build the argv the plan calls for: a resume carries the stored session id, a fresh start does not.
|
|
269
271
|
// Both run the same profile diagnostics under the already-resolved profile, so a resume is refused for
|
|
270
|
-
// exactly the reasons a fresh dispatch is
|
|
272
|
+
// exactly the reasons a fresh dispatch is.
|
|
271
273
|
function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): AgentArgvResult {
|
|
272
274
|
if (plan.kind === 'resume') {
|
|
273
275
|
return agent_argv.with_resume_in(plan.invocation, profile, plan.session_id, lane.directory)
|
|
@@ -276,7 +278,7 @@ function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): Age
|
|
|
276
278
|
return agent_argv.with_profile_in(plan.invocation, profile, lane.directory)
|
|
277
279
|
}
|
|
278
280
|
|
|
279
|
-
// **The re-dispatch decides resume-or-fresh from the lane's own exit record
|
|
281
|
+
// **The re-dispatch decides resume-or-fresh from the lane's own exit record**.
|
|
280
282
|
// The record is read from the log the previous dispatch of this lane wrote — a first dispatch finds
|
|
281
283
|
// none and starts fresh, an `outage` ending with a session id resumes it. The provider is resolved
|
|
282
284
|
// first because the resume mechanism is Claude Code's, and an OpenAI lane falls back to fresh.
|
|
@@ -304,30 +306,33 @@ function prepared(lane: LaneInfo): Prepared {
|
|
|
304
306
|
// **The parent claims the marker before it starts the child**, so the window in which a running child
|
|
305
307
|
// is uncounted closes at dispatch rather than tens of minutes later once the child's own `fullrun` gets
|
|
306
308
|
// to its (idempotent) apply. `issue_add_label` creates the label if the repository lacks it — a
|
|
307
|
-
// `POST /issues/{N}/labels` provisions a missing label with a generated color
|
|
308
|
-
//
|
|
309
|
+
// `POST /issues/{N}/labels` provisions a missing label with a generated color
|
|
310
|
+
// (`git-gh-issue-write.ts`) — so no separate `label_ensure` is needed here, and
|
|
309
311
|
// its unapplied answer is a real refusal to launch rather than a note — confirmed by a read-back, so
|
|
310
|
-
// a write that landed but answered with an error still launches
|
|
312
|
+
// a write that landed but answered with an error still launches.
|
|
311
313
|
async function mark_in_progress(issue: string): Promise<LabelWrite> {
|
|
312
314
|
return await git_gh_command.issue_apply_label(issue, IN_PROGRESS_LABEL)
|
|
313
315
|
}
|
|
314
316
|
|
|
315
|
-
// The dispatch owns both halves of the marker: it applied it, so a launch that never started takes it
|
|
316
|
-
// back off, leaving no `in-progress` on an issue nothing is running. A removal that itself fails is
|
|
317
|
-
// swallowed — the failed launch is already warned about, and `lane:list` / `run:progress` surface a
|
|
318
|
-
// stuck marker — so this never turns a launch failure into a thrown error.
|
|
319
|
-
async function unmark_in_progress(issue: string): Promise<void> {
|
|
320
|
-
try {
|
|
321
|
-
await git_gh_command.issue_remove_label(issue, IN_PROGRESS_LABEL)
|
|
322
|
-
} catch {
|
|
323
|
-
/* the launch already failed and is warned about; a stuck marker is reported by lane:list */
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
317
|
// A started child is recorded on the run's stream, which is where the stall detector ages the last
|
|
328
|
-
// dispatch from
|
|
318
|
+
// dispatch from — unrecorded, every stall read "hours since the last dispatch"
|
|
329
319
|
// minutes after a launch. A failed start records nothing: no child is running. The marker is claimed
|
|
330
320
|
// first, so a refused one starts nothing.
|
|
321
|
+
//
|
|
322
|
+
// The dispatch owns both halves of the marker: it applied it, so a launch that never started takes it
|
|
323
|
+
// back off through `run_label.unmark`, leaving no `in-progress` on an issue nothing is running. That
|
|
324
|
+
// removal warns and never throws, so it cannot turn a launch failure into a thrown error.
|
|
325
|
+
//
|
|
326
|
+
// The lane ledger takes the same instant: `lane:stats` times a lane's implementation from it, and the
|
|
327
|
+
// stream is capped, so a period's earlier dispatches would be gone from there.
|
|
328
|
+
async function record_started(issue: string): Promise<void> {
|
|
329
|
+
await run_event_stream_emit.emit(
|
|
330
|
+
run_event_stream.EVENT_KIND.CHILD_LAUNCH,
|
|
331
|
+
`${issue_cite.plain(issue)} dispatched`,
|
|
332
|
+
)
|
|
333
|
+
await lane_ledger.record_dispatch(Number(issue))
|
|
334
|
+
}
|
|
335
|
+
|
|
331
336
|
async function finish_dispatch(issue: string, request: StartRequest): Promise<DispatchOutcome> {
|
|
332
337
|
const mark = await mark_in_progress(issue)
|
|
333
338
|
|
|
@@ -336,16 +341,14 @@ async function finish_dispatch(issue: string, request: StartRequest): Promise<Di
|
|
|
336
341
|
|
|
337
342
|
const is_failed = outcome.kind === 'failed'
|
|
338
343
|
|
|
339
|
-
await (is_failed
|
|
340
|
-
? unmark_in_progress(issue)
|
|
341
|
-
: run_event_stream_emit.emit(run_event_stream.EVENT_KIND.CHILD_LAUNCH, `#${issue} dispatched`))
|
|
344
|
+
await (is_failed ? run_label.unmark(issue) : record_started(issue))
|
|
342
345
|
|
|
343
346
|
return outcome
|
|
344
347
|
}
|
|
345
348
|
|
|
346
349
|
/** Start `fullrun #<N>` detached in the lane for `#<N>`, recording where it writes as it does so. */
|
|
347
350
|
async function dispatch_child(issue: string): Promise<DispatchOutcome> {
|
|
348
|
-
|
|
351
|
+
issue_number_shape.require_issue_number(issue)
|
|
349
352
|
|
|
350
353
|
const lane = await lane_registry.find_open_lane(issue)
|
|
351
354
|
|
|
@@ -366,25 +369,11 @@ async function dispatch_child(issue: string): Promise<DispatchOutcome> {
|
|
|
366
369
|
// The child is running — saying otherwise would send the caller to dispatch a second one into the same
|
|
367
370
|
// lane — but its output is going nowhere, so a message naming the path would point at a file that will
|
|
368
371
|
// never grow, and a poll of that file would book a working child as stopped.
|
|
369
|
-
// The liveness pattern the parent polls with — the shared one, which also finds a detached ship
|
|
370
|
-
// supervisor (joshuafolkken/kit#2428). `describe` never throws, so an issue that is not a number falls
|
|
371
|
-
// back to the launched invocation rather than raising from the validator.
|
|
372
|
-
function poll_pattern(outcome: Dispatched, issue: string): string {
|
|
373
|
-
if (!run_issue_number.ISSUE_NUMBER_PATTERN.test(issue)) return `${outcome.invocation}$`
|
|
374
|
-
|
|
375
|
-
return lane_child_invocation.process_pattern(issue)
|
|
376
|
-
}
|
|
377
|
-
|
|
378
372
|
function log_sentence(outcome: Dispatched, issue: string): string {
|
|
379
|
-
//
|
|
380
|
-
//
|
|
381
|
-
//
|
|
382
|
-
|
|
383
|
-
// anchor is what keeps `fullrun #12` from matching a running `fullrun #123`. `run:liveness` takes
|
|
384
|
-
// `--process` as what the caller *saw*, never as a property of the child's kind — told to pass
|
|
385
|
-
// `alive`, a parent that never ran `pgrep` would answer `alive` for a child that crashed an hour ago
|
|
386
|
-
// and poll it for ever.
|
|
387
|
-
const poll = `run \`pgrep -laf "${poll_pattern(outcome, issue)}"\` and pass what it found to \`pnpm josh run:liveness ${issue} --output ${outcome.log_path} --process alive\` — or \`--process none\` where it found nothing`
|
|
373
|
+
// **`run:liveness` reads the child's process for itself**, with the shared
|
|
374
|
+
// pattern that matches the child's own command line and a detached ship supervisor, so no parent
|
|
375
|
+
// passes `alive` by hand for a child that crashed an hour ago.
|
|
376
|
+
const poll = `run \`pnpm josh run:liveness ${issue} --output ${outcome.log_path}\` — it reads the child's process for itself`
|
|
388
377
|
|
|
389
378
|
if (outcome.notes.length > 0) {
|
|
390
379
|
return ` Its output is NOT being kept — ${outcome.notes.join(NOTE_SEPARATOR)} — so ${outcome.log_path} will not grow and the process trace is the only answer: ${poll}.`
|
|
@@ -394,7 +383,7 @@ function log_sentence(outcome: Dispatched, issue: string): string {
|
|
|
394
383
|
}
|
|
395
384
|
|
|
396
385
|
// Whether this dispatch resumed the disconnected child's session or started fresh — the report the
|
|
397
|
-
// `outage` re-dispatch owes
|
|
386
|
+
// `outage` re-dispatch owes. A fresh start says so too, so the absence of a
|
|
398
387
|
// resume is never silent when an outage record was present.
|
|
399
388
|
function resume_sentence(outcome: Dispatched): string {
|
|
400
389
|
if (outcome.resumed_from === undefined) {
|
|
@@ -408,20 +397,20 @@ function resume_sentence(outcome: Dispatched): string {
|
|
|
408
397
|
// message the warning exists to carry — the pid among it, with the child already running.
|
|
409
398
|
function describe(outcome: DispatchOutcome, issue: string): string {
|
|
410
399
|
if (outcome.kind === 'no-lane') {
|
|
411
|
-
return `No lane is open for
|
|
400
|
+
return `No lane is open for ${session_cite.issue(issue)}. Run \`pnpm josh lane:open ${issue}\` first, then dispatch into it.`
|
|
412
401
|
}
|
|
413
402
|
|
|
414
403
|
if (outcome.kind === 'unrecordable') return outcome.reason
|
|
415
404
|
|
|
416
405
|
if (outcome.kind === LABEL_UNSET_KIND) {
|
|
417
|
-
return `The child for
|
|
406
|
+
return `The child for ${session_cite.issue(issue)} was not started: the \`${IN_PROGRESS_LABEL}\` label could not be applied (${outcome.reason}), so the lane would be counted as empty. Nothing was launched.`
|
|
418
407
|
}
|
|
419
408
|
|
|
420
409
|
if (outcome.kind === 'failed') {
|
|
421
|
-
return `The child for
|
|
410
|
+
return `The child for ${session_cite.issue(issue)} did not start: ${outcome.note}.${agent_role_profile.default_notice()} Its log is at ${outcome.log_path}.`
|
|
422
411
|
}
|
|
423
412
|
|
|
424
|
-
return `Dispatched \`${outcome.invocation}\` as process ${String(outcome.pid)} in ${outcome.lane.directory} with ${agent_role_profile.describe(outcome.profile)}.${resume_sentence(outcome)}${log_sentence(outcome, issue)}`
|
|
413
|
+
return `Dispatched \`${outcome.invocation}\` as process ${String(outcome.pid)} in ${outcome.lane.directory} with ${agent_role_profile.describe(outcome.profile)}.${agent_role_profile.default_notice()}${resume_sentence(outcome)}${log_sentence(outcome, issue)}`
|
|
425
414
|
}
|
|
426
415
|
|
|
427
416
|
/**
|
|
@@ -441,7 +430,7 @@ function is_worth_warning(outcome: DispatchOutcome): boolean {
|
|
|
441
430
|
// own failures to standard error and never throws, so this cannot turn a refusal into an exception.
|
|
442
431
|
async function warn_of_problem(outcome: DispatchOutcome, issue: string): Promise<void> {
|
|
443
432
|
await telegram_notify.warn({
|
|
444
|
-
issue_title: `${WARNING_TITLE}
|
|
433
|
+
issue_title: `${WARNING_TITLE} ${issue_cite.plain(issue)}`,
|
|
445
434
|
body: describe(outcome, issue),
|
|
446
435
|
recovery: WARNING_RECOVERY,
|
|
447
436
|
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { LANE_SEAT_KEY, PORT_SEED_KEY, ports } from '#ports'
|
|
2
2
|
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
3
3
|
|
|
4
|
-
// The lane's `.env`, built from the root's
|
|
4
|
+
// The lane's `.env`, built from the root's.
|
|
5
5
|
//
|
|
6
6
|
// **Port separation is required here, not optional.** `ports/index.js` resolves the project root as
|
|
7
7
|
// the nearest ancestor holding a `package.json` — which, inside a linked work tree, is the lane's
|
|
@@ -9,8 +9,8 @@ import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role
|
|
|
9
9
|
// root's runs on the root's exact offset; either way every lane lands on one pair of ports, and a
|
|
10
10
|
// busy port fails without retrying on another. At the default six lanes that turns E2E from "fails
|
|
11
11
|
// sometimes" into "fails nearly always". So the lane's `.env` keeps the project's `PORT_SEED`
|
|
12
|
-
// unchanged and adds `JOSH_LANE_SEAT`, and `ports/index.js` combines them as `seed × 10 + seat
|
|
13
|
-
//
|
|
12
|
+
// unchanged and adds `JOSH_LANE_SEAT`, and `ports/index.js` combines them as `seed × 10 + seat`:
|
|
13
|
+
// the file plainly shows which number is the project's and which is the
|
|
14
14
|
// seat, and the multiplication that separates the bands lives in one place rather than here.
|
|
15
15
|
//
|
|
16
16
|
// **Everything else in the file is carried across verbatim**, comments and blank lines included:
|
|
@@ -18,7 +18,7 @@ import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role
|
|
|
18
18
|
// are as necessary inside a lane as outside one, and a lane that had to have them re-entered would
|
|
19
19
|
// not be a place a run could start unattended.
|
|
20
20
|
|
|
21
|
-
// Where the delegated unit running this lane's child writes
|
|
21
|
+
// Where the delegated unit running this lane's child writes. It goes in the
|
|
22
22
|
// lane's own `.env` — the store `lane-registry.ts` already reads — rather than in a ledger beside the
|
|
23
23
|
// trees, so `git worktree remove` erases the record along with the lane it described and there is
|
|
24
24
|
// nothing left to go stale. `.env` is gitignored in kit and in every consumer `josh sync` reaches,
|
|
@@ -149,7 +149,7 @@ function read_lane_ports(content: string): { development: number; preview: numbe
|
|
|
149
149
|
/**
|
|
150
150
|
* The output path a lane's `.env` records, or `undefined` where it records none.
|
|
151
151
|
*
|
|
152
|
-
* **A blank assignment is `undefined` rather than an empty path
|
|
152
|
+
* **A blank assignment is `undefined` rather than an empty path**. A lane
|
|
153
153
|
* whose record was cleared has nothing to poll, and an empty string handed to
|
|
154
154
|
* `pnpm josh run:liveness --output` is a relative path — refused by its own root check, so the
|
|
155
155
|
* child would come back `undetermined` for ever rather than saying the record is missing.
|
|
@@ -1,35 +1,21 @@
|
|
|
1
1
|
import { lane_child_marker, type MarkerSource } from './lane-child-marker'
|
|
2
2
|
|
|
3
3
|
// How each `PreToolUse` guard behaves in a dispatched lane child, as an enumeration rather than a
|
|
4
|
-
// judgement
|
|
4
|
+
// judgement.
|
|
5
5
|
//
|
|
6
6
|
// **The three guards were built for the interactive main line, where a refusal is guidance.** A denial
|
|
7
7
|
// rewrites the next move of a person's session. A dispatched lane child is a headless `claude -p`
|
|
8
|
-
// process, so a *denial* ends the conversation with nothing committed
|
|
9
|
-
//
|
|
10
|
-
// them a read of a file the child was about to edit. So a guard whose correction is a denial cannot fire
|
|
11
|
-
// as one in a child.
|
|
8
|
+
// process, so a *denial* ends the conversation with nothing committed. So a guard whose correction is a
|
|
9
|
+
// denial cannot fire as one in a child.
|
|
12
10
|
//
|
|
13
|
-
// **But a denial is not the only way a guard can speak
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// in the child for exactly that reason. So the choice is three-valued, not two:
|
|
11
|
+
// **But a denial is not the only way a guard can speak.** A guard can also raise a *notice* — a
|
|
12
|
+
// non-blocking `additionalContext` that carries the same guidance without a `permissionDecision`, so the
|
|
13
|
+
// turn is never ended. So the choice is three-valued, not two:
|
|
17
14
|
//
|
|
18
15
|
// - `refuse` — deny the call (the main-line default; the child keeps this for the safety rules).
|
|
19
16
|
// - `notice` — let the call through but attach the guidance, so a headless child is nudged, not killed.
|
|
20
17
|
// - `off` — say nothing at all, for a guard whose remedy the child cannot carry out.
|
|
21
18
|
//
|
|
22
|
-
// **The notice did not move the number, kit#2178 took it off, and kit#2276 restores it changed.** The
|
|
23
|
-
// lane child that ran right after kit#2164 merged came in at 1.00 calls per turn on both sides of the
|
|
24
|
-
// first notice (transcript `f39efeb5`), so kit#2178 turned the batching notice `off` in the child rather
|
|
25
|
-
// than pay the per-turn context cost of guidance measured not to work. But with it off, the notice fired
|
|
26
|
-
// **zero** times across the 2026-09-21 backlogrun the density was next measured on, so the 1.147 read
|
|
27
|
-
// there is the rate with no guidance at all — not a second measurement of the notice failing. kit#2276
|
|
28
|
-
// therefore restores it as `notice`, with the two things #2164's lacked: it names the concrete recent
|
|
29
|
-
// calls the run issued one-per-turn, and it recurs every single-call turn rather than every three. The
|
|
30
|
-
// mode stays a genuine experiment — the density is re-measured on the next backlogrun, and a notice that
|
|
31
|
-
// still does not move it is redesigned rather than kept.
|
|
32
|
-
//
|
|
33
19
|
// **It is an enumeration and not a judgement, for the reason `delegation-policy.ts` is one.** "This
|
|
34
20
|
// guard's mode in a child" is a call made under the same pressure that produced the misfire. The list is
|
|
35
21
|
// the whole of it, and a guard nobody classified refuses — the safe direction, since a wrongly-silenced
|
|
@@ -37,7 +23,7 @@ import { lane_child_marker, type MarkerSource } from './lane-child-marker'
|
|
|
37
23
|
// survived once. `lane-guard-policy.test.ts` pins that the enumeration and the guards' live behavior
|
|
38
24
|
// cannot disagree.
|
|
39
25
|
|
|
40
|
-
// The three ways a guard may behave in a lane child
|
|
26
|
+
// The three ways a guard may behave in a lane child. Outside a lane child every
|
|
41
27
|
// guard is `refuse`, which is why that is also the fail-safe default below.
|
|
42
28
|
type LaneGuardMode = 'refuse' | 'notice' | 'off'
|
|
43
29
|
type LaneGuardId = 'investigation' | 'batching' | 'rule' | 'duplicate-read'
|
|
@@ -2,12 +2,12 @@ import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
|
2
2
|
import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
|
|
3
3
|
import { lane_child_marker, type MarkerSource } from './lane-child-marker'
|
|
4
4
|
|
|
5
|
-
// Whether a lane has handed its post-implementation region to the detached ship
|
|
5
|
+
// Whether a lane has handed its post-implementation region to the detached ship.
|
|
6
6
|
//
|
|
7
7
|
// **A child that ran `pnpm josh ship --detach` waits on nobody when it ends.** The supervisor drives the
|
|
8
8
|
// gate, the review and the merge, and notifies on its own outcome, so the `Stop` hook's demand for a
|
|
9
9
|
// `confirmation` notify and `lane-park`'s refusal of that notify only bought a "nothing needed"
|
|
10
|
-
// Telegram and a wasted turn
|
|
10
|
+
// Telegram and a wasted turn.
|
|
11
11
|
// Both hooks read this one predicate, so they cannot disagree about whether the lane was handed off.
|
|
12
12
|
//
|
|
13
13
|
// **Running, never merely recorded.** A ship that failed hands its region back to the child, whose
|