@joshuafolkken/kit 1.1455.0 → 1.1514.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/settings.json +6 -6
- package/.claude/skills/dependency-update/SKILL.md +26 -55
- package/.claude/skills/epic-commands/SKILL.md +83 -156
- package/.claude/skills/epic-commands/epic-bundle.md +51 -79
- package/.claude/skills/epic-commands/execution-waves.md +43 -81
- package/.claude/skills/verify-ui/SKILL.md +24 -50
- package/.claude/skills/workflow-commands/SKILL.md +7 -9
- package/.claude/skills/workflow-commands/background-commands.md +31 -46
- package/.claude/skills/workflow-commands/backlogrun-child.md +65 -85
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +86 -125
- package/.claude/skills/workflow-commands/backlogrun-park.md +68 -118
- package/.claude/skills/workflow-commands/backlogrun-progress.md +17 -28
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +17 -26
- package/.claude/skills/workflow-commands/backlogrun-steps.md +35 -52
- package/.claude/skills/workflow-commands/backlogrun.md +31 -50
- package/.claude/skills/workflow-commands/chain-rule.md +31 -40
- package/.claude/skills/workflow-commands/delegation.md +12 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +1 -3
- package/.claude/skills/workflow-commands/followup.md +55 -77
- package/.claude/skills/workflow-commands/fullrun-steps.md +3 -5
- package/.claude/skills/workflow-commands/fullrun.md +4 -6
- package/.claude/skills/workflow-commands/halfrun.md +3 -7
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +43 -60
- package/.claude/skills/workflow-commands/issue-scout.md +3 -2
- package/.claude/skills/workflow-commands/kickoff.md +65 -74
- package/.claude/skills/workflow-commands/latest-gate.md +2 -6
- package/.claude/skills/workflow-commands/needs-human-review.md +2 -5
- package/.claude/skills/workflow-commands/observation-filing.md +59 -118
- package/.claude/skills/workflow-commands/observation-ledger.md +52 -112
- package/.claude/skills/workflow-commands/pre-gate-cut.md +88 -142
- package/.claude/skills/workflow-commands/prerequisite.md +11 -17
- package/.claude/skills/workflow-commands/progress-watcher.md +23 -33
- package/.claude/skills/workflow-commands/prrun.md +3 -5
- package/.claude/skills/workflow-commands/retrospective.md +35 -54
- package/.claude/skills/workflow-commands/split-assessment.md +32 -58
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +54 -73
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +1 -1
- package/.github/workflows/ci.yml +1 -1
- package/.github/workflows/publish.yml +2 -2
- package/CLAUDE.md +7 -6
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +7 -6
- package/dist/commands/document-section-cli.js +67 -34
- package/dist/hooks/batch-guard.js +6 -6
- package/dist/hooks/chunk-4KKD2UTK.js +66 -0
- package/dist/hooks/{chunk-GPLGZ6IC.js → chunk-6TS2JD6D.js} +14 -3
- package/dist/hooks/chunk-7DSBJVFH.js +50 -0
- package/dist/hooks/{chunk-5H4SSDSD.js → chunk-A65Y4YOR.js} +3 -3
- package/dist/hooks/{chunk-3C4XRYG6.js → chunk-APUO6U4J.js} +102 -19
- package/dist/hooks/{chunk-IX6TTTI6.js → chunk-EFXE6C37.js} +8 -22
- package/dist/hooks/chunk-GP4IEC4O.js +20 -0
- package/dist/hooks/chunk-JP45SOCJ.js +56 -0
- package/dist/hooks/{chunk-OLMO72ON.js → chunk-LAOV7NLM.js} +1 -1
- package/dist/hooks/chunk-M4HGZV7U.js +83 -0
- package/dist/hooks/{chunk-TBJFTSUY.js → chunk-O6GDRNJB.js} +9 -7
- package/dist/hooks/{chunk-HFGWYGUV.js → chunk-PF2NZL2A.js} +5 -5
- package/dist/hooks/{chunk-WNLVGT7E.js → chunk-PTICX4OL.js} +4 -5
- package/dist/hooks/{chunk-HHI6FO3R.js → chunk-RT27QRJW.js} +763 -1515
- package/dist/hooks/{chunk-7WQBPLUN.js → chunk-SYOTDYCI.js} +1149 -1095
- package/dist/hooks/{chunk-LIAFCXL7.js → chunk-TNUMY6NL.js} +1519 -1332
- package/dist/hooks/chunk-UPUZF3AN.js +279 -0
- package/dist/hooks/{chunk-Z4XI7CZS.js → chunk-WK6SMBIC.js} +1932 -784
- package/dist/hooks/codex-hook-adapter.js +17 -14
- package/dist/hooks/duplicate-read-guard.js +7 -7
- package/dist/hooks/format-edited.js +5 -4
- package/dist/hooks/inputs.json +302 -247
- package/dist/hooks/investigation-guard.js +8 -11
- package/dist/hooks/pretool-guard.js +16 -13
- package/dist/hooks/session-lang.js +372 -26
- package/dist/hooks/stop-guard.js +2593 -189
- package/dist/josh.js +2128 -282
- package/dist/managed-marker/index.js +1 -2
- package/dist/version/index.js +15 -12
- package/eslint/base.js +2 -1
- package/eslint/rules/unicorn.js +16 -0
- package/lefthook/base.yml +5 -3
- package/package.json +14 -12
- package/prompts/coding-standards.md +12 -22
- package/prompts/collaboration-workflow/file-edits.md +25 -45
- package/prompts/collaboration-workflow/gh-rest.md +19 -36
- package/prompts/collaboration-workflow/glossary.md +5 -7
- package/prompts/collaboration-workflow/issue-citation.md +6 -14
- package/prompts/collaboration-workflow/issue-template.md +40 -32
- package/prompts/collaboration-workflow/lane-instructions.md +35 -0
- package/prompts/collaboration-workflow/operating-rules.md +33 -46
- package/prompts/collaboration-workflow/output-bounds.md +15 -15
- package/prompts/collaboration-workflow/overview.md +14 -19
- package/prompts/collaboration-workflow/plan-comment.md +13 -13
- package/prompts/collaboration-workflow/principles.md +57 -54
- package/prompts/collaboration-workflow/proposal-request.md +1 -9
- package/prompts/collaboration-workflow/report-format.md +41 -49
- package/prompts/collaboration-workflow/residency.md +15 -11
- package/prompts/collaboration-workflow/rule-delivery.md +7 -15
- package/prompts/collaboration-workflow/shell-body.md +10 -20
- package/prompts/collaboration-workflow/turn-batching.md +8 -14
- package/prompts/collaboration-workflow/upstream-interrupt.md +26 -34
- package/prompts/collaboration-workflow/wip-cap.md +26 -32
- package/prompts/collaboration-workflow.md +25 -25
- package/prompts/refactoring.md +33 -43
- package/prompts/review-rubric.md +84 -129
- package/prompts/review.md +110 -141
- package/prompts/sonar-hotspot-handling.md +22 -50
- package/prompts/testing-guide.md +48 -99
- package/scripts/adopt/adopt-toolkits.ts +2 -4
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-exit-record.ts +23 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +9 -2
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/backlog/backlog-budget-cli.ts +1 -2
- package/scripts/backlog/backlog-budget.ts +4 -4
- package/scripts/backlog/backlog-drive-carried.ts +26 -0
- package/scripts/backlog/backlog-drive-cli.ts +10 -5
- package/scripts/backlog/backlog-drive-named.ts +3 -5
- package/scripts/backlog/backlog-drive-restore.ts +28 -2
- package/scripts/backlog/backlog-drive-seats.ts +27 -0
- package/scripts/backlog/backlog-drive.ts +11 -6
- package/scripts/backlog/backlog-occupied.ts +56 -0
- package/scripts/backlog/backlog-ready.ts +59 -15
- package/scripts/behavior/behavior-rules.ts +3 -2
- package/scripts/cost-runtime/codex-usage.ts +4 -2
- package/scripts/cost-runtime/cost-cli.ts +1 -2
- package/scripts/delegation/duplicate-read-guard.ts +2 -2
- package/scripts/delegation/investigation-guard.ts +15 -65
- package/scripts/delegation/investigation-reads.ts +1 -2
- package/scripts/discovery/repo-discovery.ts +4 -2
- package/scripts/discovery/repo-origin.ts +2 -4
- package/scripts/doctor/doctor-logic.ts +6 -3
- package/scripts/document/document-byte-budget.ts +28 -27
- package/scripts/document/document-byte-check.ts +1 -2
- package/scripts/document/document-section-cli.ts +17 -5
- package/scripts/document/entry-read-budget.ts +3 -3
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit-rationale.ts +8 -2
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-cli.ts +1 -2
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-chains.ts +6 -2
- package/scripts/epic/epic-close-comment.ts +1 -2
- package/scripts/followup/git-followup-workflow.ts +19 -1
- package/scripts/gate/check-inputs.ts +129 -0
- package/scripts/gate/check-reuse.ts +162 -0
- package/scripts/gate/core-budget.ts +93 -44
- package/scripts/gate/core-wait.ts +130 -0
- package/scripts/gate/free-cores.ts +49 -0
- package/scripts/gate/gate-ledger.ts +17 -3
- package/scripts/gate/gate-plan.ts +23 -1
- package/scripts/gate/gate-report.ts +15 -2
- package/scripts/gate/gate-run-steps.ts +150 -0
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/machine-capacity.ts +70 -11
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/verification-gate.ts +65 -127
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +24 -2
- package/scripts/gh/git-pr.ts +19 -3
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +16 -9
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +14 -5
- package/scripts/hooks/batch-guard.ts +5 -8
- package/scripts/hooks/format-edited-file.ts +10 -4
- package/scripts/hooks/pre-commit-lint.ts +91 -0
- package/scripts/hooks/pre-push-unit.ts +15 -4
- package/scripts/hooks/pretool-guard.ts +48 -79
- package/scripts/hooks/reserved-run.ts +1 -0
- package/scripts/hooks/run-hook.sh +10 -12
- package/scripts/hooks/step-zero-notice.ts +3 -2
- package/scripts/hooks/stop-actions.ts +204 -0
- package/scripts/hooks/stop-guard.ts +62 -21
- package/scripts/init/hook-command-rewrite.ts +6 -2
- package/scripts/init/hook-launch.ts +12 -7
- package/scripts/init/init-logic-deploy-vps.ts +4 -2
- package/scripts/issue/behavior-change-lint.ts +12 -6
- package/scripts/issue/expected-effect-lint.ts +59 -0
- package/scripts/issue/issue-cite-cli.ts +35 -15
- package/scripts/issue/issue-classification.ts +1 -1
- package/scripts/issue/issue-lint-cli.ts +5 -3
- package/scripts/issue/issue-scout-cli.ts +22 -16
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/josh/command-usage.ts +110 -0
- package/scripts/josh/file-map-stamp.ts +1 -3
- package/scripts/josh/hook-decision.ts +17 -2
- package/scripts/josh/josh-command-map.ts +2 -0
- package/scripts/josh/josh-command-types.ts +55 -9
- package/scripts/josh/josh-commands-ai.ts +13 -0
- package/scripts/josh/josh-commands-development.ts +1 -1
- package/scripts/josh/josh-commands-hooks.ts +6 -0
- package/scripts/josh/josh-commands-lane.ts +10 -1
- package/scripts/josh/josh-commands-workflow.ts +5 -0
- package/scripts/josh/josh-logic.ts +6 -15
- package/scripts/josh/josh-usage-automation.ts +121 -0
- package/scripts/josh/josh-usage-backlog.ts +180 -0
- package/scripts/josh/josh-usage-developer.ts +230 -0
- package/scripts/josh/josh-usage-hooks.ts +38 -0
- package/scripts/josh/josh-usage-issue.ts +205 -0
- package/scripts/josh/josh-usage-review.ts +101 -0
- package/scripts/josh/josh-usage-run.ts +252 -0
- package/scripts/josh/josh-usage-session.ts +238 -0
- package/scripts/josh/josh-usage-workflow.ts +212 -0
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +20 -0
- package/scripts/lane/lane-await.ts +3 -2
- package/scripts/lane/lane-capacity.ts +8 -2
- package/scripts/lane/lane-check-stats.ts +56 -0
- package/scripts/lane/lane-child-invocation.ts +49 -5
- package/scripts/lane/lane-dispatch.ts +3 -3
- package/scripts/lane/lane-guard-policy.ts +5 -5
- package/scripts/lane/lane-handoff.ts +8 -1
- package/scripts/lane/lane-install.ts +12 -4
- package/scripts/lane/lane-ledger.ts +52 -1
- package/scripts/lane/lane-limit-cli.ts +8 -9
- package/scripts/lane/lane-load.ts +9 -2
- package/scripts/lane/lane-measure-cli.ts +4 -0
- package/scripts/lane/lane-parked.ts +18 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-load.ts +125 -0
- package/scripts/lane/lane-process-stats.ts +93 -0
- package/scripts/lane/lane-registry.ts +17 -10
- package/scripts/lane/lane-restart.ts +5 -26
- package/scripts/lane/lane-session-action.ts +146 -0
- package/scripts/lane/lane-session-broker.ts +68 -125
- package/scripts/lane/lane-spent.ts +14 -3
- package/scripts/lane/lane-stats.ts +1 -0
- package/scripts/lane/lane-withdraw-cli.ts +71 -0
- package/scripts/lane/lane-withdraw.ts +182 -0
- package/scripts/lint/format.ts +4 -4
- package/scripts/lint/lint-parallel.ts +10 -3
- package/scripts/lint/lint-related-scope.ts +4 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/telegram-test.ts +10 -5
- package/scripts/overrides/lockfile-overrides.ts +1 -3
- package/scripts/propagate/propagate.ts +1 -2
- package/scripts/release/release-progress.ts +3 -2
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-lint.ts +7 -4
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +205 -0
- package/scripts/review/review-brief-cli.ts +1 -1
- package/scripts/review/review-record-cli.ts +6 -2
- package/scripts/rules/agent-model.ts +59 -0
- package/scripts/rules/delivered-rules.ts +11 -2
- package/scripts/rules/destructive-command.ts +6 -9
- package/scripts/rules/direct-filing.ts +3 -7
- package/scripts/rules/early-heartbeat.ts +7 -18
- package/scripts/rules/file-body.ts +6 -13
- package/scripts/rules/filing-cap.ts +4 -6
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-force.ts +5 -9
- package/scripts/rules/guard-remedy.ts +117 -0
- package/scripts/rules/implementation-cut.ts +37 -35
- package/scripts/rules/index-guard.ts +4 -7
- package/scripts/rules/issue-comments.ts +67 -16
- package/scripts/rules/josh-git-bare.ts +3 -6
- package/scripts/rules/lane-background.ts +10 -21
- package/scripts/rules/lane-carry-conflict.ts +7 -17
- package/scripts/rules/lane-interactive-ask.ts +6 -11
- package/scripts/rules/lane-park.ts +5 -13
- package/scripts/rules/lane-split-park.ts +2 -7
- package/scripts/rules/lane-switch-main.ts +9 -12
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +4 -5
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/piped-verification.ts +84 -32
- package/scripts/rules/poll-loop.ts +7 -17
- package/scripts/rules/pre-gate-cut.ts +7 -21
- package/scripts/rules/prior-comment-read.ts +7 -5
- package/scripts/rules/protected-files.ts +5 -9
- package/scripts/rules/raw-field-body.ts +3 -7
- package/scripts/rules/rule-body-guard.ts +4 -11
- package/scripts/rules/rule-list.ts +4 -1
- package/scripts/rules/rule-registry-rows.ts +10 -0
- package/scripts/rules/rule-registry.ts +7 -4
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value.ts +7 -1
- package/scripts/rules/run-tail-rule.ts +6 -22
- package/scripts/rules/shell-body-trigger.ts +4 -6
- package/scripts/rules/shell-segments.ts +22 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rules.ts +164 -77
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +4 -10
- package/scripts/rules/third-party-write.ts +5 -10
- package/scripts/rules/worktree-guard.ts +5 -12
- package/scripts/run/board/run-board-cli.ts +2 -0
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-github.ts +19 -3
- package/scripts/run/board/run-board-header.ts +4 -1
- package/scripts/run/board/run-board-idle.ts +31 -0
- package/scripts/run/board/run-board-labels.ts +2 -0
- package/scripts/run/board/run-board-layout.ts +1 -1
- package/scripts/run/board/run-board-read.ts +25 -12
- package/scripts/run/board/run-board-reason.ts +17 -4
- package/scripts/run/board/run-board-render-legend.ts +1 -0
- package/scripts/run/board/run-board-render-slot.ts +1 -1
- package/scripts/run/board/run-board-render-waits.ts +41 -0
- package/scripts/run/board/run-board-render.ts +6 -1
- package/scripts/run/board/run-board-row-yield.ts +1 -0
- package/scripts/run/board/run-board-state.ts +9 -0
- package/scripts/run/board/run-board-status.ts +89 -23
- package/scripts/run/board/run-board-thanks.ts +7 -2
- package/scripts/run/board/run-board-tick.ts +37 -8
- package/scripts/run/carry/run-carry-args.ts +1 -3
- package/scripts/run/carry/run-carry-conversation.ts +7 -2
- package/scripts/run/cut/run-cut-cli.ts +18 -22
- package/scripts/run/cut/run-cut-decline.ts +72 -0
- package/scripts/run/cut/run-cut-ready.ts +74 -0
- package/scripts/run/cut/run-cut-report.ts +29 -0
- package/scripts/run/cut/run-cut.ts +10 -1
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-render.ts +1 -0
- package/scripts/run/event/run-event-scope.ts +19 -1
- package/scripts/run/event/run-event-stream-emit.ts +13 -6
- package/scripts/run/event/run-event-stream.ts +4 -0
- package/scripts/run/hold/run-hold-cli.ts +14 -3
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +13 -4
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-cli.ts +16 -42
- package/scripts/run/merge/run-merge-ship.ts +59 -1
- package/scripts/run/merge/run-merge-signals.ts +99 -0
- package/scripts/run/merge/run-merge-steps.ts +11 -1
- package/scripts/run/merge/run-merge.ts +22 -9
- package/scripts/run/run-ending.ts +31 -3
- package/scripts/run/run-liveness.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +5 -10
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +1 -2
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-stop-notify.ts +1 -2
- package/scripts/run/run-watcher-guard.ts +6 -3
- package/scripts/run/ship/run-ship-cli.ts +5 -12
- package/scripts/run/ship/run-ship-detach.ts +9 -0
- package/scripts/run/ship/run-ship-next.ts +10 -2
- package/scripts/run/ship/run-ship-overlap.ts +195 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +33 -15
- package/scripts/run/ship/run-ship-preflight.ts +28 -2
- package/scripts/run/ship/run-ship-return.ts +31 -7
- package/scripts/run/ship/run-ship-review-steps.ts +25 -14
- package/scripts/run/ship/run-ship-review.ts +15 -2
- package/scripts/run/ship/run-ship-steps.ts +1 -1
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-sync.ts +14 -6
- package/scripts/run/tidy/run-tidy-cli.ts +3 -3
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -2
- package/scripts/safe-chain/project-config.ts +7 -2
- package/scripts/sync/sync-hook-safety.ts +8 -2
- package/scripts/test/test-e2e-guard.ts +30 -5
- package/scripts/test/test-unit-guard.ts +16 -1
- package/scripts/test/unit-worker-share.ts +26 -3
- package/scripts/time-runtime/time-batch-guard.ts +3 -3
- package/scripts/time-runtime/time-hook-transcript.ts +3 -2
- package/scripts/time-runtime/time-shell.ts +39 -4
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/version/effective-upstream.ts +3 -4
- package/scripts/version/kit-version-config.ts +8 -2
- package/scripts/version/latest-corepack.ts +1 -2
- package/scripts/version/release-hold.ts +11 -4
- package/scripts/version/version-commands.ts +12 -4
- package/templates/gitignore +6 -2
- package/dist/hooks/chunk-D5QBTOCZ.js +0 -68
- package/dist/hooks/chunk-UT7YC3N2.js +0 -56
|
@@ -1,215 +1,161 @@
|
|
|
1
1
|
# The pre-gate cut — a lane child ends its turn before the gate
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
from the gate onward. Rationale: `docs/maintainers/pre-gate-cut-rationale.md` → "Why the cut exists".
|
|
3
|
+
The **pre-gate cut**: a dispatched lane child ends its process the moment implementation is done, and a
|
|
4
|
+
**fresh** process resumes the same lane from the gate onward, without the implementation's accumulated
|
|
5
|
+
context.
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
Everything through "What is carried" describes the pre-gate cut; the later section states only what
|
|
12
|
-
differs.
|
|
7
|
+
`run:cut` takes the boundary, `run:cut --resume` is the fresh
|
|
8
|
+
process's entry check. A second boundary — the implementation-phase cut, _during_ implementation — is
|
|
9
|
+
below; it states only what differs.
|
|
13
10
|
|
|
14
11
|
## Where the boundary is
|
|
15
12
|
|
|
16
|
-
**After implementation and the refactor, before `pnpm josh gate`**:
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
**A lane child first hands it to a detached supervisor** (`chain-rule.md` step 0); the cut is the fallback.
|
|
13
|
+
**After implementation and the refactor, before `pnpm josh gate`**: nothing committed, the gate not
|
|
14
|
+
started. **A lane child first hands it to a detached supervisor** (`chain-rule.md` step 0); the cut is
|
|
15
|
+
the fallback.
|
|
21
16
|
|
|
22
17
|
## It applies to a dispatched lane child, and to nothing else
|
|
23
18
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
by the model reading the shape of its own prompt.
|
|
19
|
+
A person's interactive `fullrun` never relaunches itself. A dispatched child is told apart
|
|
20
|
+
**mechanically, by a mark the dispatch sets** — never by reading its own prompt.
|
|
27
21
|
|
|
28
22
|
### The dispatch mark
|
|
29
23
|
|
|
30
|
-
`lane:dispatch` starts each child generation with
|
|
31
|
-
|
|
24
|
+
`lane:dispatch` starts each child generation with **`JOSH_LANE_CHILD`** set to the lane's issue number
|
|
25
|
+
(`scripts/lane/lane-child-marker.ts`).
|
|
32
26
|
|
|
33
27
|
- **Meaning**: "this session was launched for issue `<N>`, not typed by a person."
|
|
34
|
-
- **Lifetime**: the child process — set at launch,
|
|
35
|
-
- **Trust**: only where its value equals the lane's own issue
|
|
36
|
-
|
|
37
|
-
on a checkout it does not belong to.
|
|
38
|
-
|
|
39
|
-
The name, meaning and lifetime are documented here and nowhere else.
|
|
28
|
+
- **Lifetime**: the child process — set at launch, never written by the run itself.
|
|
29
|
+
- **Trust**: only where its value equals the lane's own issue; a leaked mark naming another issue, or
|
|
30
|
+
none, is read as a person. An interactive `fullrun` carries no mark.
|
|
40
31
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
checkout, a cut in a lane.
|
|
32
|
+
The name, meaning and lifetime are documented here and nowhere else. `run:cut` itself looks for an
|
|
33
|
+
**open lane** for the issue instead (`not-a-lane` otherwise), so it is safe to issue unconditionally.
|
|
44
34
|
|
|
45
35
|
## Taking the cut
|
|
46
36
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
is issued unconditionally**; `run:cut` itself decides whether the cut is warranted, so a short lane with nothing to drop is answered `under-threshold` and walks on
|
|
50
|
-
to the gate rather than relaunching.
|
|
51
|
-
|
|
52
|
-
At the pre-gate boundary, issue:
|
|
37
|
+
`chain-rule.md` step 1 issues it after `pnpm josh main:merge`, before the scoped pair and the gate —
|
|
38
|
+
**unconditionally**:
|
|
53
39
|
|
|
54
40
|
```bash
|
|
55
41
|
pnpm josh run:cut <N>
|
|
56
42
|
```
|
|
57
43
|
|
|
58
44
|
- `cut` (0) — record written and handed to the lane's launch owner (OpenAI supervisor starts the
|
|
59
|
-
successor after this process exits; Anthropic relaunches directly). **End the turn immediately
|
|
60
|
-
|
|
61
|
-
- `
|
|
62
|
-
|
|
63
|
-
- `
|
|
64
|
-
- `unready` (1) — the tree is clean or on the default branch, nothing to carry. Continue to the gate.
|
|
65
|
-
- `busy` (1) — a cut is already in flight for this tree (the double-cut guard). Do not relaunch.
|
|
45
|
+
successor after this process exits; Anthropic relaunches directly). **End the turn immediately.**
|
|
46
|
+
- `under-threshold` (0) — the newest request's billed input is under `CONTEXT_CUT_THRESHOLD`; **continue to the gate.**
|
|
47
|
+
- `not-a-lane` (0) — not a dispatched child. **Continue to the gate.**
|
|
48
|
+
- `unready` (1) — the tree is clean or on the default branch. Continue to the gate.
|
|
49
|
+
- `busy` (1) — a cut is already in flight for this tree. Do not relaunch.
|
|
66
50
|
- `failed` (1) — no live OpenAI supervisor, or the Anthropic relaunch could not start. Continue.
|
|
67
51
|
- `unknown` (1) — the git directory could not be read. Continue to the gate.
|
|
68
52
|
|
|
69
|
-
**`cut` is the only verdict that ends the turn.**
|
|
70
|
-
the current process to carry the run on itself.
|
|
53
|
+
**`cut` is the only verdict that ends the turn.**
|
|
71
54
|
|
|
72
55
|
### The gate refuses until the cut has been taken
|
|
73
56
|
|
|
74
|
-
`pnpm josh rule:guard` **refuses `pnpm josh gate`**
|
|
75
|
-
|
|
76
|
-
`docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
|
|
57
|
+
`pnpm josh rule:guard` **refuses `pnpm josh gate`** in a lane with no cut record carried, handing back
|
|
58
|
+
the command above.
|
|
77
59
|
|
|
78
|
-
- **It fires for a marked child and nowhere else**: the working directory is
|
|
79
|
-
|
|
80
|
-
`fullrun` carries no mark and runs its gate untouched. `run:cut` uses an open-lane lookup instead, so
|
|
60
|
+
- **It fires for a marked child and nowhere else**: the working directory is `<lane root>/<issue
|
|
61
|
+
number>` **and** `JOSH_LANE_CHILD` names that issue. `run:cut` uses an open-lane lookup instead, so
|
|
81
62
|
the guard and the command need not agree byte for byte.
|
|
82
|
-
- **It fires only when the current context warrants a cut
|
|
83
|
-
|
|
84
|
-
to the gate rather than refused.
|
|
85
|
-
- **It is silent once the cut is carried**, so the resumed process goes straight to the gate.
|
|
63
|
+
- **It fires only when the current context warrants a cut** (`cost_cli.session_verdict`, as `run:cut`).
|
|
64
|
+
- **It is silent once the cut is carried**.
|
|
86
65
|
- **It fires once per run.**
|
|
87
66
|
- **`--resume`, `--end` and `--json` do not count as taking the cut.**
|
|
88
67
|
|
|
89
|
-
|
|
90
|
-
`prompts/collaboration-workflow/rule-delivery.md`. The suites that pin this and the three guards below:
|
|
91
|
-
`docs/maintainers/pre-gate-cut-rationale.md` → "Which suites pin each guard".
|
|
68
|
+
Its row: `prompts/collaboration-workflow/rule-delivery.md`.
|
|
92
69
|
|
|
93
70
|
## Resuming — the fresh process's entry check
|
|
94
71
|
|
|
95
|
-
A fresh `fullrun #<N>` runs this **at its entry, before `run:hold` and the session-boundary check
|
|
96
|
-
because whether it is fresh or resumed decides everything that follows:
|
|
72
|
+
A fresh `fullrun #<N>` runs this **at its entry, before `run:hold` and the session-boundary check**:
|
|
97
73
|
|
|
98
74
|
```bash
|
|
99
75
|
pnpm josh run:cut --resume <N>
|
|
100
76
|
```
|
|
101
77
|
|
|
102
|
-
- `fresh` (0) —
|
|
103
|
-
|
|
104
|
-
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
- `
|
|
113
|
-
an unknown hand-off state). **A resume failure**: send a `confirmation` Telegram and stop; never gate
|
|
114
|
-
the wrong tree.
|
|
115
|
-
- `busy` (1) — another process already owns the resume. Send a `confirmation` Telegram and stop.
|
|
116
|
-
|
|
117
|
-
**A resume is never reported as a success it did not earn**: `stale` and `busy` stop the run rather
|
|
118
|
-
than gating.
|
|
78
|
+
- `fresh` (0) — an ordinary run; normal entry.
|
|
79
|
+
- `resume` (0) — a verified pre-gate cut. **Skip the title, the plan, the fresh hold claim and the
|
|
80
|
+
implementation**; re-read the issue body and comments, then go straight to `pnpm josh gate`.
|
|
81
|
+
- `resume-impl` (0) — the cut was taken **during** implementation. Skip the title, the plan, the
|
|
82
|
+
fresh hold claim and the split assessment, re-read the plan, then **continue implementation** — do
|
|
83
|
+
**not** go straight to the gate.
|
|
84
|
+
- `handed-off` (0) — a successor already adopted this cut. **End the turn quietly and do nothing**;
|
|
85
|
+
no Telegram owed.
|
|
86
|
+
- `stale` (1) — the record does not match the tree (branch, clean tree, expired, or unknown hand-off).
|
|
87
|
+
**A resume failure**: send a `confirmation` Telegram and stop; never gate the wrong tree.
|
|
88
|
+
- `busy` (1) — another process owns the resume. Send a `confirmation` Telegram and stop.
|
|
119
89
|
|
|
120
90
|
### The stage is passed to the resumed child, not reconstructed by it
|
|
121
91
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
re-read the workflow skill, repeat the split assessment or re-normalize the title; the plan and
|
|
125
|
-
decisions are read back from the issue. Rationale:
|
|
126
|
-
`docs/maintainers/pre-gate-cut-rationale.md` → "Why the resume carries what it carries".
|
|
92
|
+
**Skip the entry it has already done**: do not re-read the workflow skill, repeat the split assessment
|
|
93
|
+
or re-normalize the title; the plan and decisions are read back from the issue.
|
|
127
94
|
|
|
128
95
|
## What is carried, and what is not
|
|
129
96
|
|
|
130
|
-
- **The working tree is not in the record, because it never left the disk.** The record carries
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
- **The
|
|
135
|
-
`pnpm josh followup` releases it at the merge.
|
|
136
|
-
- **The dispatch mark is re-applied, not inherited**: the relaunch strips the parent's environment and
|
|
137
|
-
sets `JOSH_LANE_CHILD` afresh from the lane's issue.
|
|
97
|
+
- **The working tree is not in the record, because it never left the disk.** The record carries the
|
|
98
|
+
issue, branch, invocation, and that a **declared cut** put it there. **The conversation is not
|
|
99
|
+
carried**; plan and auto-decisions are read back off GitHub.
|
|
100
|
+
- **The hold is kept, not released** — `pnpm josh followup` releases it at the merge.
|
|
101
|
+
- **The dispatch mark is re-applied, not inherited.**
|
|
138
102
|
|
|
139
103
|
## Verification, uniqueness and double-launch
|
|
140
104
|
|
|
141
|
-
- **The resume verifies the tree against the record**:
|
|
142
|
-
|
|
143
|
-
- **No owner is recorded on the cut**
|
|
144
|
-
|
|
145
|
-
- **The
|
|
146
|
-
the
|
|
147
|
-
- **The resume is unique.** Taking the hand-off over spends it — a second `run:cut --resume` reads a
|
|
148
|
-
spent record and is answered `handed-off`, and the take-over is itself an
|
|
149
|
-
exclusive create, so two resumes racing cannot both win. One lane crosses the pre-gate boundary
|
|
150
|
-
exactly once.
|
|
105
|
+
- **The resume verifies the tree against the record**: branch, dirty tree, issue, and the cutting
|
|
106
|
+
run's hold. Any mismatch is `stale`.
|
|
107
|
+
- **No owner is recorded on the cut** (OpenAI keeps its supervisor owner separately).
|
|
108
|
+
- **The cut is exclusive** — a second cut on the same tree is `busy`.
|
|
109
|
+
- **The resume is unique** — a spent record answers `handed-off`, and the take-over is an exclusive
|
|
110
|
+
create. One lane crosses the pre-gate boundary exactly once.
|
|
151
111
|
|
|
152
112
|
## The implementation-phase cut — a lane child cuts before the gate too
|
|
153
113
|
|
|
154
|
-
The
|
|
155
|
-
implementation — the child ends mid-implementation and a fresh one resumes the lane **back into
|
|
156
|
-
implementation**.
|
|
114
|
+
The child ends mid-implementation and a fresh one resumes **back into implementation**.
|
|
157
115
|
|
|
158
116
|
### The measurement is the parent hand-off's, never a second one
|
|
159
117
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
`
|
|
163
|
-
hand-off". The parent's seam and the child's `run_cut.IMPLEMENTATION_CONTEXT_THRESHOLD` share the
|
|
164
|
-
**135_000** `CONTEXT_CUT_THRESHOLD` (aliased so the tests cannot drift). No separate measurement is
|
|
165
|
-
built for the lane child.
|
|
118
|
+
Same `cost_verdict.per_request_cost` through `cost_cli.session_verdict` as `backlogrun-progress.md` →
|
|
119
|
+
"The hand-off"; `run_cut.IMPLEMENTATION_CONTEXT_THRESHOLD` aliases the **135_000**
|
|
120
|
+
`CONTEXT_CUT_THRESHOLD`.
|
|
166
121
|
|
|
167
122
|
### It is a guard, fired at the edit that crosses the threshold
|
|
168
123
|
|
|
169
|
-
**The trigger**: `pnpm josh rule:guard` refuses an `Edit` / `Write` in a dispatched lane child
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
124
|
+
**The trigger**: `pnpm josh rule:guard` refuses an `Edit` / `Write` in a dispatched lane child over
|
|
125
|
+
threshold, handing back `pnpm josh run:cut --impl <N> --handoff <path>`. `cut` ends the turn; the
|
|
126
|
+
fresh process's `run:cut --resume <N>` answers `resume-impl` — **the implementation resume clears the
|
|
127
|
+
record**, so the cut may fire again. **A cut that relaunches its successor owes no Telegram** — the
|
|
128
|
+
`Stop` hook reads the relaunch off the turn's own `run:cut` output, not off the record the resume
|
|
129
|
+
clears. Outside a
|
|
130
|
+
lane, `run:cut --impl` prints the held run's instruction: on `over`, keep the hold, send a
|
|
131
|
+
`confirmation` Telegram naming `fullrun #<N>`, end the turn. **It fires on every threshold crossing,
|
|
177
132
|
not once per run**; **An edit reissued right after a refusal passes**; **An unmeasurable session
|
|
178
|
-
warrants the cut**; **It is silent between a cut and its resume
|
|
179
|
-
|
|
180
|
-
`
|
|
181
|
-
after the fact by `pnpm josh run:ending <N> --output <path>`.
|
|
133
|
+
warrants the cut**; **It is silent between a cut and its resume** (`scripts/rules/implementation-cut.ts`).
|
|
134
|
+
A child that ended without cutting is detected by
|
|
135
|
+
`pnpm josh run:ending <N> --output <path>`.
|
|
182
136
|
|
|
183
137
|
## The threshold
|
|
184
138
|
|
|
185
|
-
`CONTEXT_CUT_THRESHOLD` and `cost_verdict.per_request_cost`
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
break-even". Both cuts end the turn **before** the gate, in the same act that starts the successor, so
|
|
190
|
-
the push is never a turn boundary (`chain-rule.md`).
|
|
139
|
+
`CONTEXT_CUT_THRESHOLD` and `cost_verdict.per_request_cost` live in
|
|
140
|
+
`scripts/cost-runtime/context-cut-payback.ts`; both cuts and the parent hand-off read the same verdict,
|
|
141
|
+
and an unmeasurable session is always cut. Both cuts end the turn **before** the gate, so the push is never a
|
|
142
|
+
turn boundary (`chain-rule.md`).
|
|
191
143
|
|
|
192
144
|
## A lane child records its park before it stops
|
|
193
145
|
|
|
194
|
-
**The trigger**: a dispatched lane child about to stop for a decision (
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
`pnpm josh rule:guard` refuses `pnpm josh notify --task-type confirmation` from a marked child
|
|
198
|
-
then — **It fires once per run
|
|
199
|
-
(`scripts/rules/lane-park.ts`).
|
|
146
|
+
**The trigger**: a dispatched lane child about to stop for a decision (Tier B, Tier C, an upstream
|
|
147
|
+
defect) parks its own Issue first — `backlogrun-park.md` → "park and continue" — so `pnpm josh
|
|
148
|
+
run:liveness` reads it `settled`. A `needs-human-review` or `already-done` stop already carries its
|
|
149
|
+
label. `pnpm josh rule:guard` refuses `pnpm josh notify --task-type confirmation` from a marked child
|
|
150
|
+
until then — **It fires once per run.** (`scripts/rules/lane-park.ts`).
|
|
200
151
|
|
|
201
|
-
**A split is not a park**:
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
the child promoted this run, on every occurrence (`scripts/rules/lane-split-park.ts`).
|
|
152
|
+
**A split is not a park**: a child that promoted its Issue to an `epic` stops without
|
|
153
|
+
`needs-decision` — `backlogrun-park.md` → "Splitting a child mid-run". `pnpm josh rule:guard` refuses a
|
|
154
|
+
`needs-decision` write onto that epic, on every occurrence (`scripts/rules/lane-split-park.ts`).
|
|
205
155
|
|
|
206
156
|
### The interactive ask is refused one call earlier
|
|
207
157
|
|
|
208
158
|
**The trigger**: a headless session ends the turn on an interactive ask, so the notify guard never
|
|
209
|
-
fires
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
the refused ask into the park basis; `scripts/rules/lane-interactive-ask.ts` and the shared
|
|
213
|
-
`scripts/agent/interactive-ask.ts` implement it.
|
|
214
|
-
|
|
215
|
-
Provenance of each rule: `docs/maintainers/pre-gate-cut-rationale.md` → "Where each rule came from".
|
|
159
|
+
fires; `pnpm josh rule:guard` refuses `AskUserQuestion` for a marked lane child on every occurrence — park the question instead.
|
|
160
|
+
`pnpm josh run:ending` lifts a slipped ask into the park basis (`scripts/rules/lane-interactive-ask.ts`,
|
|
161
|
+
`scripts/agent/interactive-ask.ts`).
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# A prerequisite discovered mid-run — a dependency, not a park
|
|
2
2
|
|
|
3
3
|
**The single source of the prerequisite branch**, read at its point of use — the moment a run
|
|
4
|
-
discovers that another Issue in this repository has to land first.
|
|
5
|
-
`docs/maintainers/prerequisite-rationale.md` → "Where each rule came from".
|
|
4
|
+
discovers that another Issue in this repository has to land first.
|
|
6
5
|
|
|
7
6
|
**A prerequisite discovered mid-run is a dependency, not a park** — the Issue in hand is still one
|
|
8
7
|
deliverable, it just needs another one before it.
|
|
@@ -34,10 +33,8 @@ open), then stash, comment and `pnpm josh run:release <M>` as for a prerequisite
|
|
|
34
33
|
`halfrun` stop, `backlogrun` continues. Closing the release Issue once a person has published it hands
|
|
35
34
|
`<M>` back to `backlog:next` (`docs/josh-commands-backlog.md` → `josh issue:release`).
|
|
36
35
|
|
|
37
|
-
**File the prerequisite with the `route:tier-a` label
|
|
38
|
-
|
|
39
|
-
the table** — the label means a filing the run is *blocked by*, so the observation row carries no
|
|
40
|
-
`route:` label of its own (`observation-filing.md`):
|
|
36
|
+
**File the prerequisite with the `route:tier-a` label** — it means a filing the run is *blocked by*,
|
|
37
|
+
so the observation row carries no `route:` label (`observation-filing.md`):
|
|
41
38
|
|
|
42
39
|
```bash
|
|
43
40
|
pnpm josh issue:file "<title>" --body-file <body-file> --depth <n> --route tier-a
|
|
@@ -47,9 +44,9 @@ The command lints the body against `prompts/collaboration-workflow/issue-templat
|
|
|
47
44
|
classification labels it declares, and runs the duplicate scan and `epic:bundle` itself
|
|
48
45
|
(`docs/josh-commands-backlog.md` → `josh issue:file`).
|
|
49
46
|
|
|
50
|
-
Every *file the prerequisite* step below means that
|
|
51
|
-
steps
|
|
52
|
-
|
|
47
|
+
Every *file the prerequisite* step below means that filing, and it always happens **first** — the
|
|
48
|
+
later steps name its number. **Its duplicate scan is read exactly as it is for a `new` entry**
|
|
49
|
+
(`issue-scout.md`).
|
|
53
50
|
|
|
54
51
|
**Each entry point's own branch stays in that entry's file:**
|
|
55
52
|
|
|
@@ -63,16 +60,13 @@ it is for a `new` entry** (`issue-scout.md`): a filing made mid-run is the one m
|
|
|
63
60
|
command to type (`fullrun.md` / `halfrun.md`). Typing `fullrun` approved implementing **one** Issue;
|
|
64
61
|
a batch is a different authorization, so the stop stays.
|
|
65
62
|
|
|
66
|
-
**Two steps every entry's procedure turns on
|
|
63
|
+
**Two steps every entry's procedure turns on:**
|
|
67
64
|
|
|
68
65
|
- **`git stash push -u` — the `-u` is not optional.** The work in progress almost always includes a
|
|
69
|
-
new `*.test.ts`, which
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
`pnpm josh stash:pop "<the -m message>"`, never a positional `git stash pop`**, because the stash is
|
|
74
|
-
a repository-wide stack every lane shares and a positional pop takes whichever lane last pushed. Say
|
|
75
|
-
it in the Telegram too — the comment is the record.
|
|
66
|
+
new, untracked `*.test.ts`, which a stash without `-u` leaves for the next `pnpm josh ms` to refuse.
|
|
67
|
+
- **The Issue comment is what gets the stash popped, not the Telegram.** The run that picks the Issue up
|
|
68
|
+
reads it and pops before implementing — **by message, `pnpm josh stash:pop "<the -m message>"`, never
|
|
69
|
+
a positional `git stash pop`** (the stack is shared by every lane). Say it in the Telegram too.
|
|
76
70
|
|
|
77
71
|
**Automatic filing is capped at 10 Issues per run** at every entry point; `pnpm josh rule:guard`
|
|
78
72
|
refuses the eleventh filing (`prompts/collaboration-workflow/rule-delivery.md`). On reaching it, stop
|
|
@@ -13,9 +13,8 @@ point-of-use document, never an entry read, and the single source of the heartbe
|
|
|
13
13
|
pnpm josh run:progress --wait --output <the transcript path of each delegated unit> # in the background
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
**Start it once; it reports by itself.** Each silence interval appends the
|
|
17
|
-
|
|
18
|
-
standard output and keeps running — so a scheduled report never wakes the session, and the session
|
|
16
|
+
**Start it once; it reports by itself.** Each silence interval appends the five labelled lines to the
|
|
17
|
+
event stream and the ambient log, prints nothing to standard output and keeps running — the session
|
|
19
18
|
relays none. **It exits only on one of three, and the command computes which:**
|
|
20
19
|
|
|
21
20
|
| Exit | What the session does |
|
|
@@ -27,23 +26,20 @@ relays none. **It exits only on one of three, and the command computes which:**
|
|
|
27
26
|
**A report is not an exit, and neither is a decline** — with no run recorded it keeps waiting, and the
|
|
28
27
|
`--hours` exit says so on standard error.
|
|
29
28
|
|
|
30
|
-
**`pnpm josh run:watcher:guard` detects a missed restart
|
|
31
|
-
|
|
32
|
-
flight and the watcher's life record has gone stale — once per run, so the restart is not blocked.
|
|
29
|
+
**`pnpm josh run:watcher:guard` detects a missed restart** — via `pretool-guard` it refuses the next
|
|
30
|
+
tool call while lane children are in flight and the watcher's record is stale, once per run.
|
|
33
31
|
|
|
34
|
-
**`--mark` at every real report
|
|
35
|
-
`
|
|
36
|
-
never a timer (`docs/josh-commands-run.md` → "`josh run:progress`").
|
|
32
|
+
**`--mark` at every real report** — `pnpm josh run:progress --mark` in the same turn restarts the
|
|
33
|
+
silence clock (`docs/josh-commands-run.md` → "`josh run:progress`").
|
|
37
34
|
|
|
38
|
-
**Do not keep a progress clock of your own** — the hook refuses the arm
|
|
35
|
+
**Do not keep a progress clock of your own** — the hook refuses the arm
|
|
39
36
|
(`scripts/rules/early-heartbeat.ts` → `decide`), though a single correctly-spaced arm is allowed.
|
|
40
37
|
`--wait` is not a wait timer.
|
|
41
38
|
|
|
42
39
|
**The default interval is twenty minutes, overridable — by the person, not the run.**
|
|
43
|
-
`JOSH_PROGRESS_INTERVAL_MINUTES` moves both sides
|
|
44
|
-
`
|
|
45
|
-
|
|
46
|
-
Rationale: `docs/maintainers/progress-watcher-rationale.md` → "Why the heartbeat reads as it does".
|
|
40
|
+
`JOSH_PROGRESS_INTERVAL_MINUTES` moves both sides; `josh` → `progress_interval_minutes` in
|
|
41
|
+
`package.json` sits one step below it. **`--interval` moves the watcher alone** — quieter, never the
|
|
42
|
+
guard stricter.
|
|
47
43
|
|
|
48
44
|
### What a report says
|
|
49
45
|
|
|
@@ -64,8 +60,7 @@ off-screen, start `pnpm josh run:board --every <minutes>` in the background (`do
|
|
|
64
60
|
|
|
65
61
|
**A stop is the only interrupt**: a `backlogrun` that has stopped ends with
|
|
66
62
|
`pnpm josh run:carry --end --stopped "<reason>"`, which sends one ⏸️ confirmation; a parked child sends
|
|
67
|
-
its own (`backlogrun-park.md`).
|
|
68
|
-
signal tiers are split this way".
|
|
63
|
+
its own (`backlogrun-park.md`).
|
|
69
64
|
|
|
70
65
|
### Who starts it, and what counts as a report
|
|
71
66
|
|
|
@@ -75,22 +70,17 @@ signal tiers are split this way".
|
|
|
75
70
|
`JOSH_LANE_CHILD` mark** — it still runs `--mark` for the parent's clock, but every reporting form
|
|
76
71
|
(`--wait`, `--once`, the default watch) exits at once with a notice.
|
|
77
72
|
|
|
78
|
-
**It is started in the target repository's checkout, and `--mark` is run there too.**
|
|
79
|
-
|
|
80
|
-
|
|
73
|
+
**It is started in the target repository's checkout, and `--mark` is run there too.** It beats from the
|
|
74
|
+
moment a run has started — a registered lane, a held work tree or a carried budget; only a checkout
|
|
75
|
+
with no run recorded stays silent.
|
|
81
76
|
|
|
82
77
|
**In a single-issue run, a real report is any turn that puts a progress statement in front of the
|
|
83
|
-
person** —
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
covers `halfrun`'s stop before commit, a `needs-human-review` stop, a split or prerequisite stop, and a
|
|
93
|
-
`backlogrun` named issue's failure stop. Rationale: `docs/maintainers/progress-watcher-rationale.md` →
|
|
94
|
-
"Why the watcher runs where it does".
|
|
95
|
-
|
|
96
|
-
Provenance of each rule: `docs/maintainers/progress-watcher-rationale.md` → "Where each rule came from".
|
|
78
|
+
person** — `--mark` in the same turn as each: **the Step 0 work summary, the pull request opening, each
|
|
79
|
+
review round's verdict, and any `confirmation` / `failure` / `completion` notification or stop.** **A
|
|
80
|
+
tool result only you read is not one.** `--output` is omitted there, and `record` reads `unread`. In a
|
|
81
|
+
`backlogrun`, a child merged, parked or stopped is the report.
|
|
82
|
+
|
|
83
|
+
**A run that merges needs no teardown; a run that stops has to end the reporting itself** — **no
|
|
84
|
+
further `--wait` is started** after the stop notification, and the running one is stopped in the same
|
|
85
|
+
turn: `halfrun`'s stop before commit, a `needs-human-review`, split or prerequisite stop, a
|
|
86
|
+
`backlogrun` named issue's failure stop.
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
# `prrun` — the manifest (plan → implement → PR → green → stop, a person merges)
|
|
2
2
|
|
|
3
|
-
`prrun`
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
sequence, the step lists, the gate, the review and the stop branches are `fullrun`'s, unchanged. This
|
|
7
|
-
file names only the difference.
|
|
3
|
+
`prrun` runs `fullrun` up to a green, mergeable pull request and **stops before the merge**, so a
|
|
4
|
+
person merges by hand. **Read `fullrun.md` and `entry-sequence.md` for every step** — the entry
|
|
5
|
+
sequence, the step lists, the gate, the review and the stop branches are `fullrun`'s, unchanged.
|
|
8
6
|
|
|
9
7
|
## The difference — the entry
|
|
10
8
|
|
|
@@ -1,75 +1,56 @@
|
|
|
1
1
|
# The end-of-run retrospective
|
|
2
2
|
|
|
3
|
-
**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
Everything that decides *how* — what the four sections mean, how the top two are chosen, the
|
|
7
|
-
exclusions, and the `auto-ok` judgement — is here. Read it in full, in the same turn, before filing.
|
|
3
|
+
**Read it when `run:step` prints the retrospective step — not at the entry.** `SKILL.md` → §2's table
|
|
4
|
+
keeps the rule: run what `run:step` prints once, file the improvements worth carrying, stack the rest,
|
|
5
|
+
mark the step done. Read this file in full, in the same turn, before filing.
|
|
8
6
|
|
|
9
|
-
**When it fires is not
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
picks up; a run that stops without draining — the failure guard, `--idle 0` — still prints it at the
|
|
13
|
-
stop position. It is kit-only — `run:step` prints the step only in the kit repository.
|
|
14
|
-
|
|
15
|
-
Rationale: `docs/maintainers/retrospective-rationale.md` → "Why the retrospective is read at its step";
|
|
16
|
-
provenance: `docs/maintainers/retrospective-rationale.md` → "Where each rule came from".
|
|
7
|
+
**When it fires is not a judgement.** `run:step` prints the step when `backlog:offer` marks the backlog
|
|
8
|
+
drained, *before* the idle watch, so the watch picks up what it files; a run that stops without
|
|
9
|
+
draining — the failure guard, `--idle 0` — still prints it at the stop position. Kit-only.
|
|
17
10
|
|
|
18
11
|
## The digest is read, not skimmed
|
|
19
12
|
|
|
20
|
-
The command `run:step` prints folds four measurements
|
|
21
|
-
new measurement (the observation-filing rule against readerless numbers). Read each section for what it
|
|
22
|
-
is for:
|
|
13
|
+
The command `run:step` prints folds four existing measurements into one digest — it adds none:
|
|
23
14
|
|
|
24
|
-
- **Run cost & time by role.** A role whose
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
- **Observation ledger.** How many observations are already held without being filed — a reminder to
|
|
31
|
-
promote one a second sighting has now earned, rather than a fresh finding.
|
|
32
|
-
- **Run events.** The parks, outages, cuts and review rounds the run hit — where it did not run
|
|
33
|
-
straight through.
|
|
15
|
+
- **Run cost & time by role.** A role whose wall-clock share runs ahead of its cost share is marked
|
|
16
|
+
`waiting-heavy` — a candidate improvement, not a verdict: some roles wait by design.
|
|
17
|
+
- **Recurring review findings.** A category that keeps coming back is friction the reviews keep
|
|
18
|
+
catching; the zero-finding denominator separates a quiet category from an unexamined one.
|
|
19
|
+
- **Observation ledger.** Observations held without being filed — promote one a second sighting earned.
|
|
20
|
+
- **Run events.** The parks, outages, cuts and review rounds — where the run did not run straight through.
|
|
34
21
|
|
|
35
|
-
The
|
|
36
|
-
|
|
37
|
-
outside it).
|
|
22
|
+
The two targets are **the run itself** (sections one, three, four) and **the repository** (section two,
|
|
23
|
+
and anything the run surfaced that lives outside it).
|
|
38
24
|
|
|
39
25
|
## What to file, and how the top two are chosen
|
|
40
26
|
|
|
41
|
-
**The filing condition is the existing depth test, unchanged**
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
27
|
+
**The filing condition is the existing depth test, unchanged** (`observation-filing.md` → "The depth
|
|
28
|
+
test"). What cannot pass it is not filed — not a shortfall, just not yet a finding.
|
|
29
|
+
|
|
30
|
+
**A cost regression is filed.** The digest's `File a cost regression: …` line passes the depth test as
|
|
31
|
+
printed — measured, with the command it names as the reproduction — and ranks first: one Issue names
|
|
32
|
+
every regressed row, and the scout keeps a repeat sighting from filing twice.
|
|
45
33
|
|
|
46
34
|
**Order what passes by effect, and file the top two.** **The third onward is stacked in the observation
|
|
47
|
-
ledger
|
|
48
|
-
nothing passes** — a run whose measurements show no improvement worth carrying files zero Issues.
|
|
49
|
-
`docs/maintainers/retrospective-rationale.md` → "Why the top two are a selection, not a ration".
|
|
35
|
+
ledger** (drained by `pnpm josh observations:flush`). **File nothing when nothing passes.**
|
|
50
36
|
|
|
51
|
-
**Exclude what is already filed or already done, through the existing scout** (`issue-scout.md`)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
already merged. Neither exclusion is a new mechanism. The same call runs `epic:bundle` on each new
|
|
55
|
-
Issue, as after any filing.
|
|
37
|
+
**Exclude what is already filed or already done, through the existing scout** (`issue-scout.md`): file
|
|
38
|
+
with `pnpm josh issue:file`, which scouts first — an **open** candidate covering it means do not file, a
|
|
39
|
+
`(closed)` one means already merged. It also runs `epic:bundle` on each new Issue.
|
|
56
40
|
|
|
57
41
|
## `auto-ok`, and closing the step
|
|
58
42
|
|
|
59
|
-
**What a retrospective files is judged for `auto-ok`** —
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
43
|
+
**What a retrospective files is judged for `auto-ok`** — one needing no person's judgement declares
|
|
44
|
+
`- 人の判断: 不要`, so `issue:file` applies the label (with the run label
|
|
45
|
+
`prompts/collaboration-workflow/issue-template.md` requires). **`backlogrun-steps.md` → "What one
|
|
46
|
+
invocation approves" is that judgement's single source.** Every brake still counts these filings: the
|
|
63
47
|
ten-per-invocation ceiling, the WIP cap, `--max` and the 150,000-token session budget.
|
|
64
48
|
|
|
65
49
|
**Close with `pnpm josh run:carry --retrospective --summary "<result>" --owner "$PPID"`.** It marks the
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
stream, so a zero-filing retrospective differs from one that never ran; name
|
|
71
|
-
the issues filed (or that none were) and the candidates dropped with why.
|
|
50
|
+
carry record so `run:step` prints `stop` from then on; the mark survives a session cut and is removed at
|
|
51
|
+
`pnpm josh run:carry --end`, so one invocation runs it exactly once. **`--summary` is required** — it is
|
|
52
|
+
written as a `retrospective` event, so a zero-filing retrospective differs from one that never ran; name
|
|
53
|
+
the issues filed (or none) and the candidates dropped with why.
|
|
72
54
|
|
|
73
|
-
**A dispatched lane child never reaches any of this** — the batch runs
|
|
74
|
-
|
|
75
|
-
`stop` for a lane child at the stop position, so a child never prints the step to begin with.
|
|
55
|
+
**A dispatched lane child never reaches any of this** — the batch runs it at its own end; `run:step`
|
|
56
|
+
answers `stop` for a lane child at the stop position.
|