@joshuafolkken/kit 1.1471.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/epic-commands/SKILL.md +2 -14
- package/.claude/skills/epic-commands/epic-bundle.md +9 -5
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +7 -9
- package/.claude/skills/workflow-commands/background-commands.md +3 -7
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -10
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +6 -15
- package/.claude/skills/workflow-commands/backlogrun-park.md +2 -8
- package/.claude/skills/workflow-commands/backlogrun-progress.md +10 -19
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +8 -8
- package/.claude/skills/workflow-commands/backlogrun-steps.md +2 -10
- package/.claude/skills/workflow-commands/backlogrun.md +31 -50
- package/.claude/skills/workflow-commands/chain-rule.md +7 -6
- 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 +3 -6
- 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 +3 -3
- package/.claude/skills/workflow-commands/issue-scout.md +3 -2
- 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 +0 -14
- package/.claude/skills/workflow-commands/observation-ledger.md +4 -9
- package/.claude/skills/workflow-commands/pre-gate-cut.md +11 -16
- package/.claude/skills/workflow-commands/prerequisite.md +1 -2
- package/.claude/skills/workflow-commands/progress-watcher.md +2 -7
- package/.claude/skills/workflow-commands/prrun.md +3 -5
- package/.claude/skills/workflow-commands/retrospective.md +4 -4
- package/.claude/skills/workflow-commands/split-assessment.md +1 -3
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +2 -4
- 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 +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +1 -1
- 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-J47HU5H5.js → chunk-6TS2JD6D.js} +3 -3
- package/dist/hooks/chunk-7DSBJVFH.js +50 -0
- package/dist/hooks/{chunk-YHBZAJSV.js → chunk-A65Y4YOR.js} +3 -3
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-APUO6U4J.js} +85 -7
- package/dist/hooks/{chunk-IX6TTTI6.js → chunk-EFXE6C37.js} +8 -22
- package/dist/hooks/chunk-GP4IEC4O.js +20 -0
- package/dist/hooks/{chunk-SHGPANFB.js → chunk-JP45SOCJ.js} +3 -3
- package/dist/hooks/{chunk-K4EOONYM.js → chunk-LAOV7NLM.js} +1 -1
- package/dist/hooks/chunk-M4HGZV7U.js +83 -0
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-O6GDRNJB.js} +3 -3
- package/dist/hooks/{chunk-YYPI7SJZ.js → chunk-PF2NZL2A.js} +5 -5
- package/dist/hooks/{chunk-H5HVWYXK.js → chunk-PTICX4OL.js} +3 -4
- package/dist/hooks/{chunk-IIGFYXKC.js → chunk-RT27QRJW.js} +581 -1438
- package/dist/hooks/{chunk-43ZHT22P.js → chunk-SYOTDYCI.js} +1127 -1089
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-TNUMY6NL.js} +1507 -1336
- package/dist/hooks/chunk-UPUZF3AN.js +279 -0
- package/dist/hooks/{chunk-EUMACUK2.js → chunk-WK6SMBIC.js} +1948 -806
- 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 +317 -264
- package/dist/hooks/investigation-guard.js +8 -11
- package/dist/hooks/pretool-guard.js +16 -13
- package/dist/hooks/session-lang.js +370 -25
- package/dist/hooks/stop-guard.js +2576 -176
- package/dist/josh.js +2124 -277
- package/lefthook/base.yml +5 -3
- package/package.json +12 -10
- package/prompts/collaboration-workflow/file-edits.md +1 -3
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +10 -2
- package/prompts/collaboration-workflow/lane-instructions.md +35 -0
- package/prompts/collaboration-workflow/operating-rules.md +2 -6
- package/prompts/collaboration-workflow/output-bounds.md +3 -3
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/principles.md +14 -8
- package/prompts/collaboration-workflow/report-format.md +9 -0
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +6 -6
- package/prompts/collaboration-workflow/turn-batching.md +5 -5
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +6 -6
- package/prompts/collaboration-workflow.md +1 -0
- package/prompts/review.md +4 -5
- package/prompts/testing-guide.md +2 -2
- package/scripts/agent/agent-argv.ts +20 -4
- 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 +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/backlog/backlog-budget.ts +4 -4
- package/scripts/backlog/backlog-drive-named.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +9 -1
- package/scripts/backlog/backlog-occupied.ts +56 -0
- package/scripts/backlog/backlog-ready.ts +47 -10
- package/scripts/delegation/duplicate-read-guard.ts +2 -2
- package/scripts/delegation/investigation-guard.ts +15 -65
- package/scripts/delegation/investigation-reads.ts +0 -1
- package/scripts/document/document-byte-budget.ts +6 -5
- package/scripts/document/document-section-cli.ts +17 -5
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- 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/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 +58 -125
- 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 +13 -1
- 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/pre-commit-lint.ts +91 -0
- package/scripts/hooks/pre-push-unit.ts +1 -1
- package/scripts/hooks/pretool-guard.ts +27 -52
- package/scripts/hooks/reserved-run.ts +1 -0
- package/scripts/hooks/run-hook.sh +10 -12
- package/scripts/hooks/stop-actions.ts +204 -0
- package/scripts/hooks/stop-guard.ts +62 -21
- package/scripts/init/hook-launch.ts +12 -7
- 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 +19 -14
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/josh/command-usage.ts +110 -0
- 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-capacity.ts +8 -2
- package/scripts/lane/lane-check-stats.ts +56 -0
- package/scripts/lane/lane-child-invocation.ts +35 -4
- package/scripts/lane/lane-dispatch.ts +3 -3
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +8 -1
- package/scripts/lane/lane-install.ts +12 -4
- package/scripts/lane/lane-ledger.ts +43 -1
- package/scripts/lane/lane-limit-cli.ts +8 -9
- package/scripts/lane/lane-measure-cli.ts +2 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-registry.ts +9 -7
- package/scripts/lane/lane-restart.ts +5 -26
- package/scripts/lane/lane-session-action.ts +146 -0
- package/scripts/lane/lane-session-broker.ts +57 -138
- 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/notify/telegram-test.ts +10 -5
- package/scripts/report/report-format-reference.ts +2 -0
- 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/rules/agent-model.ts +59 -0
- package/scripts/rules/delivered-rules.ts +11 -2
- package/scripts/rules/filing-cap.ts +1 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/guard-remedy.ts +117 -0
- package/scripts/rules/issue-comments.ts +67 -6
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/piped-verification.ts +3 -1
- 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/shell-segments.ts +15 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rules.ts +147 -47
- package/scripts/rules/tail-commands.ts +15 -1
- 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 +9 -1
- package/scripts/run/board/run-board-header.ts +4 -1
- 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 +16 -0
- package/scripts/run/board/run-board-reason.ts +10 -1
- 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 +5 -0
- package/scripts/run/board/run-board-status.ts +72 -21
- package/scripts/run/board/run-board-tick.ts +5 -1
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- 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-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-cli.ts +16 -65
- 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 +21 -9
- package/scripts/run/run-liveness.ts +1 -1
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- 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 +12 -10
- 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/test/test-e2e-guard.ts +30 -5
- package/scripts/test/test-unit-guard.ts +16 -1
- package/scripts/test/unit-worker-share.ts +26 -4
- package/scripts/time-runtime/time-shell.ts +29 -4
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/templates/gitignore +6 -2
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
package/.claude/settings.json
CHANGED
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"hooks": [
|
|
55
55
|
{
|
|
56
56
|
"type": "command",
|
|
57
|
-
"command": "project_root=\"$(
|
|
57
|
+
"command": "if project_root=\"$(unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\"; fi && cd \"$project_root\" && sh scripts/hooks/run-hook.sh audit-provision",
|
|
58
58
|
"timeout": 180
|
|
59
59
|
}
|
|
60
60
|
]
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"hooks": [
|
|
67
67
|
{
|
|
68
68
|
"type": "command",
|
|
69
|
-
"command": "project_root=\"$(
|
|
69
|
+
"command": "if project_root=\"$(unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\"; fi && cd \"$project_root\" && sh scripts/hooks/run-hook.sh session-lang",
|
|
70
70
|
"timeout": 10
|
|
71
71
|
}
|
|
72
72
|
]
|
|
@@ -74,11 +74,11 @@
|
|
|
74
74
|
],
|
|
75
75
|
"PreToolUse": [
|
|
76
76
|
{
|
|
77
|
-
"matcher": "Bash|Edit|Read|Write|AskUserQuestion",
|
|
77
|
+
"matcher": "Bash|Edit|Read|Write|AskUserQuestion|Agent|Task",
|
|
78
78
|
"hooks": [
|
|
79
79
|
{
|
|
80
80
|
"type": "command",
|
|
81
|
-
"command": "project_root=\"$(
|
|
81
|
+
"command": "if project_root=\"$(unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\"; fi && cd \"$project_root\" && sh scripts/hooks/run-hook.sh pretool-guard",
|
|
82
82
|
"timeout": 20
|
|
83
83
|
}
|
|
84
84
|
]
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"hooks": [
|
|
91
91
|
{
|
|
92
92
|
"type": "command",
|
|
93
|
-
"command": "project_root=\"$(
|
|
93
|
+
"command": "if project_root=\"$(unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\"; fi && cd \"$project_root\" && sh scripts/hooks/run-hook.sh format-edited",
|
|
94
94
|
"timeout": 90
|
|
95
95
|
}
|
|
96
96
|
]
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"hooks": [
|
|
103
103
|
{
|
|
104
104
|
"type": "command",
|
|
105
|
-
"command": "project_root=\"$(
|
|
105
|
+
"command": "if project_root=\"$(unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; git rev-parse --show-toplevel 2>/dev/null)\"; then unset GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE; else project_root=\"$(git rev-parse --show-toplevel)\"; fi && cd \"$project_root\" && sh scripts/hooks/run-hook.sh stop-guard",
|
|
106
106
|
"timeout": 20
|
|
107
107
|
}
|
|
108
108
|
]
|
|
@@ -5,9 +5,6 @@ description: Procedures for `josh epic:audit`, `epic:next` and `epic:bundle`. Re
|
|
|
5
5
|
|
|
6
6
|
# The `josh epic:*` commands
|
|
7
7
|
|
|
8
|
-
This skill is the single source for the three commands. Reasons: `docs/maintainers/epic-commands-rationale.md`
|
|
9
|
-
→ "Where each rule came from".
|
|
10
|
-
|
|
11
8
|
The workflow keywords themselves — `kickoff`, `fullrun`, `halfrun`, `prrun`, `backlogrun` — live in the
|
|
12
9
|
`workflow-commands` skill.
|
|
13
10
|
|
|
@@ -61,8 +58,7 @@ pnpm josh epic "<epic-title>" <N1> <N2> ... --ordered # argument order is the d
|
|
|
61
58
|
|
|
62
59
|
After any hand edit run `pnpm josh epic:check <E>` (exit 1 when the body no longer parses).
|
|
63
60
|
`pnpm josh followup` closes the epic once every task-list child is closed; one tracking a
|
|
64
|
-
cross-repository child is closed by hand. Without `josh`: `issue-template.md
|
|
65
|
-
`docs/maintainers/epic-commands-rationale.md` → "Creating an epic by hand".
|
|
61
|
+
cross-repository child is closed by hand. Without `josh`: `issue-template.md`.
|
|
66
62
|
|
|
67
63
|
## `josh epic:audit <E>` — contradictions across the children
|
|
68
64
|
|
|
@@ -98,8 +94,6 @@ The two `orphan search` findings are about the search, not the children:
|
|
|
98
94
|
owns updating the existing code referencing that concept — do that at planning. Label names live in
|
|
99
95
|
`scripts/issue/issue-labels.ts`.
|
|
100
96
|
|
|
101
|
-
History: `docs/maintainers/epic-commands-rationale.md` → "`epic:audit` — why the children are read across".
|
|
102
|
-
|
|
103
97
|
## `josh epic:next <E…>` — what is runnable
|
|
104
98
|
|
|
105
99
|
Returns **every** runnable child, bundled per repository with its local checkout. `--repo <owner/repo>`
|
|
@@ -143,8 +137,6 @@ Two things stop the command: a **circular dependency**, and a **disagreement bet
|
|
|
143
137
|
and the `blocked-by` relations**. Only a line that is *nothing but* a chain is a declaration — a prose
|
|
144
138
|
line recommending an execution order is a suggestion, not a dependency.
|
|
145
139
|
|
|
146
|
-
Why: `docs/maintainers/epic-commands-rationale.md` → "`epic:next` — why it answers as it does".
|
|
147
|
-
|
|
148
140
|
## Epics that span repositories
|
|
149
141
|
|
|
150
142
|
Write cross-repository children as `owner/repo#N` or a full issue URL. Their state is read through
|
|
@@ -163,7 +155,7 @@ branch declares is in the registry** (checked in that order; that exact version)
|
|
|
163
155
|
bumps the version, so the target is the release that includes the blocker. **Unless that repository
|
|
164
156
|
publishes nothing**: no `package.json` on its default branch, or `private`, resolves on close — read
|
|
165
157
|
from its manifest, never the registry; a failed manifest read (not a 404) still waits. The publish
|
|
166
|
-
check is `josh propagate`'s.
|
|
158
|
+
check is `josh propagate`'s.
|
|
167
159
|
|
|
168
160
|
## `josh epic:bundle <N>` — does this new issue belong with one already filed?
|
|
169
161
|
|
|
@@ -181,7 +173,3 @@ when that step printed `⚠`. **It recommends; it writes nothing.**
|
|
|
181
173
|
| **The epic listing was cut short** | **Nothing** — every placing row above is withheld | — |
|
|
182
174
|
|
|
183
175
|
**A placing answer is acted on with `epic-bundle.md`**. `Nothing to bundle.` needs no further read.
|
|
184
|
-
|
|
185
|
-
History: `docs/maintainers/epic-commands-rationale.md` → "`epic:bundle` — why issues filed apart are bundled afterwards";
|
|
186
|
-
the reasons behind `epic-bundle.md`: `docs/maintainers/epic-commands-rationale.md` → "`epic:bundle` — why each answer reads as it does";
|
|
187
|
-
behind `execution-waves.md`: `docs/maintainers/epic-commands-rationale.md` → "Execution waves — why a wave is not a mechanism".
|
|
@@ -2,14 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
Read this when a filing's `epic:bundle` answer places the issue (`add_to_epic`, `create_epic`, or a
|
|
4
4
|
choice between epics), or when `SKILL.md` → "`josh epic:bundle <N>` — does this new issue belong with
|
|
5
|
-
one already filed?" does not settle it. `Nothing to bundle.` needs neither.
|
|
6
|
-
`docs/maintainers/epic-commands-rationale.md` → "`epic:bundle` — why each answer reads as it does".
|
|
5
|
+
one already filed?" does not settle it. `Nothing to bundle.` needs neither.
|
|
7
6
|
|
|
8
|
-
**Only two things count as a signal**:
|
|
9
|
-
|
|
7
|
+
**Only two things count as a signal**: one issue naming the other in its acceptance criteria
|
|
8
|
+
(`## 受け入れ条件` / `## Acceptance criteria`) or its `parent: #N` / `親: #N` line, or a `blocked-by`
|
|
9
|
+
recorded between them. A reference elsewhere, or a similar title, never counts; the evidence line
|
|
10
|
+
names the section.
|
|
11
|
+
|
|
12
|
+
**A placing answer you do not follow** — check it against both issues first; record the reason as an
|
|
13
|
+
`Auto-decided:` line on the issue.
|
|
10
14
|
|
|
11
15
|
**The release issue is neither a candidate nor a subject**, like an epic — its `blocked-by` relations
|
|
12
|
-
are mechanical. Any other `blocked-by` or
|
|
16
|
+
are mechanical. Any other `blocked-by` or counted reference still counts.
|
|
13
17
|
|
|
14
18
|
**The search is not limited to the open backlog.** Every number the subject's own body names is read
|
|
15
19
|
(capped at twenty), whatever its state:
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# Execution waves — parallel, then one alone, then the rest
|
|
2
2
|
|
|
3
3
|
Read this when an epic's children need an order between groups — a wave boundary, or one child that
|
|
4
|
-
must run alone. It builds on `SKILL.md` → "`josh epic:next <E…>` — what is runnable".
|
|
5
|
-
`docs/maintainers/epic-commands-rationale.md` → "Execution waves — why a wave is not a mechanism".
|
|
4
|
+
must run alone. It builds on `SKILL.md` → "`josh epic:next <E…>` — what is runnable".
|
|
6
5
|
|
|
7
6
|
**A wave is not a mechanism, and there is nothing to add for one** — the dependency declaration
|
|
8
7
|
already expresses it.
|
|
@@ -7,8 +7,7 @@ argument-hint: '[route] [route...]'
|
|
|
7
7
|
# Verify the rendered screen
|
|
8
8
|
|
|
9
9
|
A rendered-UI change is not done until someone has looked at it (`CLAUDE.md` → completion gate);
|
|
10
|
-
passing tests are not that look.
|
|
11
|
-
reads as it does".
|
|
10
|
+
passing tests are not that look.
|
|
12
11
|
|
|
13
12
|
## 1. Decide which routes to capture
|
|
14
13
|
|
|
@@ -5,10 +5,7 @@ description: Procedures for `kickoff`, `fullrun`, `halfrun`, `prrun` and `backlo
|
|
|
5
5
|
|
|
6
6
|
# Issue-driven workflow commands
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
package's collaboration workflow is built on. **This file is their manifest — triggers and pointers,
|
|
10
|
-
never a procedure**: each rule is stated once, in the file its row names. History:
|
|
11
|
-
`docs/maintainers/workflow-commands-rationale.md` → "Where each rule came from".
|
|
8
|
+
Each rule is stated once, in the file its row names.
|
|
12
9
|
|
|
13
10
|
## 0. The rule that fires before any of them — explicit invocation
|
|
14
11
|
|
|
@@ -19,8 +16,9 @@ alone**: `backlogrun-steps.md` → "The session cut is inside the invocation".
|
|
|
19
16
|
## 1. Which file to read
|
|
20
17
|
|
|
21
18
|
Read this file, then the files the typed command's row names. A command file is a **manifest** of
|
|
22
|
-
terse triggers and pointers; `pnpm josh run:step <N>` prints the run's next single action
|
|
23
|
-
from the event stream, the carry record and the issue state, never
|
|
19
|
+
terse triggers and pointers; `pnpm josh run:step <N>` prints the run's next single action and the
|
|
20
|
+
section that governs it, computed from the event stream, the carry record and the issue state, never
|
|
21
|
+
the conversation; a section it prints is not fetched again.
|
|
24
22
|
|
|
25
23
|
| Typed keyword | Read |
|
|
26
24
|
| ---------------------------------------- | ------------------------------------------- |
|
|
@@ -31,8 +29,8 @@ from the event stream, the carry record and the issue state, never the conversat
|
|
|
31
29
|
| `backlogrun` / `backlogrun #N…` / `backlogrun #E…` | `backlogrun.md` — its dispatched child reads `fullrun.md` + `split-assessment.md` in its own unit, not the parent at entry |
|
|
32
30
|
|
|
33
31
|
`entry-sequence.md` holds the entry sequence and stop branches `fullrun`, `halfrun` and `prrun` share;
|
|
34
|
-
each manifest carries only its difference. `split-assessment.md` → "The question" is
|
|
35
|
-
entry
|
|
32
|
+
each manifest carries only its difference. `split-assessment.md` → "The question" is printed by
|
|
33
|
+
`pnpm josh run:entry` at the entry, its split-handling detail read only when a split is found.
|
|
36
34
|
|
|
37
35
|
### The fetch is one `Read` call per file
|
|
38
36
|
|
|
@@ -100,7 +98,7 @@ from — read at that trigger, never restated here.
|
|
|
100
98
|
| `backlogrun`'s authorization | The whole `auto-ok` opted-in pool as well as its named items; `pnpm josh backlog:next` offers them | `backlogrun.md` |
|
|
101
99
|
| `run:step` prints the retrospective step (a run drained its backlog and stopped, not a lane child) | Run what it prints once, file 0–2 improvements, then `pnpm josh run:carry --retrospective` | `retrospective.md` |
|
|
102
100
|
| Any artifact prose (Issue bodies, comments, Telegram) | Session language (`JOSH_SESSION_LANG`, default `ja`); Issue/PR titles stay English | `prompts/collaboration-workflow/overview.md` |
|
|
103
|
-
| Any mid-workflow stop |
|
|
101
|
+
| Any mid-workflow stop | `stop:guard` sends the `confirmation` Telegram; on its refusal, send it | `CLAUDE.md` → "Mid-workflow stop notification" |
|
|
104
102
|
|
|
105
103
|
## 3. What stays resident, and what is read from here
|
|
106
104
|
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
- A lane child's hand-off or pre-gate cut is the sole turn boundary before the push (`chain-rule.md`).
|
|
18
18
|
|
|
19
19
|
Use harness detachment so completion returns to the run. Foreground timeouts stay within the cap.
|
|
20
|
-
Where each rule came from: `docs/maintainers/background-commands-rationale.md` → "Where each rule came from".
|
|
21
20
|
|
|
22
21
|
## How the wait ends — the task's exit, never a regex over its output
|
|
23
22
|
|
|
@@ -27,8 +26,7 @@ limit.
|
|
|
27
26
|
|
|
28
27
|
**Never hand-write a `while`/`until` … `sleep` loop over the output file** — a regex that never matches
|
|
29
28
|
waits to the block limit, one that matches a mid-run line exits early. `pnpm josh rule:guard` refuses it
|
|
30
|
-
(`prompts/collaboration-workflow/rule-delivery.md
|
|
31
|
-
→ "Why a poll loop is refused").
|
|
29
|
+
(`prompts/collaboration-workflow/rule-delivery.md`).
|
|
32
30
|
|
|
33
31
|
**To glance at interim output, `Read` the output file once**, never in a sleep loop. CI is waited on by
|
|
34
32
|
`pnpm josh followup`; a progress heartbeat is `run:progress --wait`'s job (`early-heartbeat` refuses a
|
|
@@ -37,8 +35,7 @@ hand-armed timer).
|
|
|
37
35
|
## The tail and what overlaps each wait
|
|
38
36
|
|
|
39
37
|
**Never give a foreground call a timeout above the harness cap** — a larger number detaches it without
|
|
40
|
-
the completion notification
|
|
41
|
-
collects idle time").
|
|
38
|
+
the completion notification.
|
|
42
39
|
|
|
43
40
|
**The tail is emptied before `followup` is issued.** Each step is asked one question: **does it read the
|
|
44
41
|
merge result?**
|
|
@@ -64,8 +61,7 @@ merge result?**
|
|
|
64
61
|
**The turn never ends at the push.** The `pnpm josh git -y` completion resumes the run, and that turn
|
|
65
62
|
goes straight through any branch-2 filing and `pnpm josh epic:bundle` to `pnpm josh followup`. `pnpm
|
|
66
63
|
josh rule:guard` refuses the foreground push (`prompts/collaboration-workflow/rule-delivery.md`); the
|
|
67
|
-
push reissued detached is not refused again
|
|
68
|
-
the push is guarded").
|
|
64
|
+
push reissued detached is not refused again.
|
|
69
65
|
|
|
70
66
|
**One turn does end before the push: a dispatched lane child's pre-gate cut** — `pre-gate-cut.md` →
|
|
71
67
|
"Taking the cut".
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
# `backlogrun` — running a child (shared mechanics, delegation, liveness, session setup)
|
|
2
2
|
|
|
3
|
-
Point-of-use, read one section at a time from `backlogrun.md` → "The
|
|
4
|
-
|
|
5
|
-
- `docs/maintainers/backlogrun-child-rationale.md` → "Why the file is read by section"
|
|
6
|
-
- `docs/maintainers/backlogrun-child-rationale.md` → "Why a bare Issue promotes itself under `backlogrun` but not under `fullrun`"
|
|
7
|
-
- `docs/maintainers/backlogrun-child-rationale.md` → "Why each child runs in a delegated unit"
|
|
8
|
-
- `docs/maintainers/backlogrun-child-rationale.md` → "Why the summary is bounded the way it is"
|
|
9
|
-
- `docs/maintainers/backlogrun-child-rationale.md` → "Why the audit runs before the first child"
|
|
10
|
-
- `docs/maintainers/backlogrun-child-rationale.md` → "Why `josh latest` is hoisted to the session"
|
|
11
|
-
- `docs/maintainers/backlogrun-child-rationale.md` → "Why the preflight is part of the claim"
|
|
3
|
+
Point-of-use, read one section at a time from `backlogrun.md` → "The manifest — the ordered flow".
|
|
12
4
|
|
|
13
5
|
## Running a child — the shared mechanics
|
|
14
6
|
|
|
@@ -89,7 +81,8 @@ is unchanged.
|
|
|
89
81
|
|
|
90
82
|
## A delegated unit that stopped without reporting
|
|
91
83
|
|
|
92
|
-
**Hand the child off without blocking, and
|
|
84
|
+
**Hand the child off without blocking, and wait on `pnpm josh lane:await <N>`** — a stopped unit
|
|
85
|
+
leaves no notification, so the await's exit is the wake. Once its
|
|
93
86
|
output is unchanged for the silent-unit window, read `backlogrun-recovery.md` → "A delegated unit that
|
|
94
87
|
stopped without reporting" and ask `pnpm josh run:liveness`.
|
|
95
88
|
|
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
# `backlogrun` — lanes and concurrency
|
|
2
2
|
|
|
3
|
-
Point-of-use, read one section at a time from `backlogrun.md` → "The
|
|
4
|
-
|
|
5
|
-
- `docs/maintainers/backlogrun-lanes-rationale.md` → "Why the lane ceiling is shaped the way it is"
|
|
6
|
-
- `docs/maintainers/backlogrun-lanes-rationale.md` → "Why CI concurrency is capped by the lane limit"
|
|
7
|
-
- `docs/maintainers/backlogrun-lanes-rationale.md` → "Why a lane's review needs a brief and an attestation"
|
|
8
|
-
- `docs/maintainers/backlogrun-lanes-rationale.md` → "Why the lane branch is `<N>-lane` and never switched"
|
|
9
|
-
- `docs/maintainers/backlogrun-lanes-rationale.md` → "Why lanes cost as well as buy throughput"
|
|
10
|
-
- `docs/maintainers/backlogrun-lanes-rationale.md` → "Why `lane:launch` folds the lane steps into one"
|
|
11
|
-
- `docs/maintainers/backlogrun-lanes-rationale.md` → "Why a committed child's lane is kept"
|
|
12
|
-
- `docs/maintainers/backlogrun-lanes-rationale.md` → "Where each rule came from"
|
|
3
|
+
Point-of-use, read one section at a time from `backlogrun.md` → "The manifest — the ordered flow".
|
|
13
4
|
|
|
14
5
|
## Concurrency: as many children per repository as it has free lanes
|
|
15
6
|
|
|
@@ -29,7 +20,6 @@ answer wrongly (a false green or a false red)? All three, and the issue carries
|
|
|
29
20
|
missing, and it carries `run:lane`. `backlog:next` and `epic:next --lanes` answer `triage` for an
|
|
30
21
|
issue with neither, so a filed issue carries one of the two from its filing. **It stops the other
|
|
31
22
|
lanes for one reason only: a batch run on broken verification leaves nobody's result trustworthy.**
|
|
32
|
-
This section is the rule's single source; why: `docs/maintainers/wip-cap-rationale.md` → "Why a solo run".
|
|
33
23
|
|
|
34
24
|
## Lanes — running more than one child at a time
|
|
35
25
|
|
|
@@ -77,7 +67,7 @@ pid=$(pnpm josh lane:launch "$n") || exit 1 # the child's pid on stdout, nothi
|
|
|
77
67
|
|
|
78
68
|
| It answers | What the run does |
|
|
79
69
|
| --- | --- |
|
|
80
|
-
| a pid | The child runs;
|
|
70
|
+
| a pid | The child runs; wait on it with `lane:await` |
|
|
81
71
|
| empty, non-zero, `full` | No free lane; wait for one |
|
|
82
72
|
| empty, non-zero, `already-open` or a failed install | **Park that child and name `pnpm josh lane:close <N>`** — a lock the lane cannot build is a person's to fix |
|
|
83
73
|
| `lane:open` reports a reused `<N>-lane` on stderr | The way back to a child parked after it pushed — **a reused branch is not a fresh lane** |
|
|
@@ -96,14 +86,15 @@ Everything else is unchanged; `pnpm josh followup` releases the lane's hold at t
|
|
|
96
86
|
- **It records where the child writes** — `<temp>/josh-lane-dispatch-<N>.log`.
|
|
97
87
|
- **A refusal is an empty capture beside a non-zero exit**, with a `warning` Telegram. **Park that
|
|
98
88
|
child and name the log the message carries**; never re-dispatch into the same lane without reading it.
|
|
99
|
-
- **A child that started with nowhere to write exits zero and warns** — **
|
|
100
|
-
process trace alone**.
|
|
89
|
+
- **A child that started with nowhere to write exits zero and warns** — **wait on that lane with
|
|
90
|
+
`lane:await`, which reads the process trace alone**.
|
|
101
91
|
- **The child is started as `fullrun #<N>` with the lane as its working directory**; the typed
|
|
102
92
|
`backlogrun` covers it.
|
|
103
93
|
- **It passes `--permission-mode bypassPermissions`, never `--dangerously-skip-permissions`.**
|
|
104
94
|
`.claude/settings.json`'s `deny` list still refuses what it names; report what stopped, never loosen it.
|
|
105
95
|
|
|
106
|
-
**Start each child without blocking on it,
|
|
96
|
+
**Start each child without blocking on it, then wait on `backlog:drive` or `lane:await`**
|
|
97
|
+
(`scripts/run/run-poll-hook.ts`) — a silent one is
|
|
107
98
|
`backlogrun-recovery.md` → "A delegated unit that stopped without reporting", read in that child's lane.
|
|
108
99
|
|
|
109
100
|
**`pnpm josh ms` is the parent's now, not the child's** — run it in the primary checkout **before
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
# `backlogrun` — a child that cannot finish
|
|
2
2
|
|
|
3
3
|
**Read this file in full when a child cannot finish** — before parking it, before a
|
|
4
|
-
`needs-human-review` stop, or before recording a mid-run prerequisite or split.
|
|
5
|
-
entry read (`backlogrun.md` points here). Single source of park-and-continue, the `needs-human-review`
|
|
6
|
-
stop, a stale `in-progress`, a mid-run prerequisite and a mid-run split. Provenance:
|
|
7
|
-
`docs/maintainers/backlogrun-park-rationale.md` → "Where each rule came from".
|
|
4
|
+
`needs-human-review` stop, or before recording a mid-run prerequisite or split.
|
|
8
5
|
|
|
9
6
|
## What happens to a child that cannot finish
|
|
10
7
|
|
|
@@ -33,8 +30,6 @@ parks, re-dispatches or files.
|
|
|
33
30
|
A child carrying **`needs-human-review`** stops `halfrun`-shaped and **the whole run ends there**:
|
|
34
31
|
implementation and the gate run, nothing is committed, the tree is left dirty and unstashed, a
|
|
35
32
|
`confirmation` Telegram carries the resume command, and the remaining children are not started.
|
|
36
|
-
Rationale: `docs/maintainers/backlogrun-park-rationale.md` → "Why `needs-human-review` ends the run
|
|
37
|
-
instead of parking".
|
|
38
33
|
|
|
39
34
|
**The child goes on holding its repository**, and **its lane is left open and untouched**. **Name the
|
|
40
35
|
lane directory in the stop report and in the Telegram.** Lanes in flight finish; no new lane opens.
|
|
@@ -90,8 +85,7 @@ It never carries:
|
|
|
90
85
|
|
|
91
86
|
**When in doubt, it is Tier A**: decide, comment the decision, and continue. **A label a mechanical step
|
|
92
87
|
applied** (a failed or abandoned child, a lost merge race) is read against this list once its reason is
|
|
93
|
-
known, and removed when the reason is not on it.
|
|
94
|
-
`docs/maintainers/backlogrun-park-rationale.md` → "Why a run spends no attention on a non-finding".
|
|
88
|
+
known, and removed when the reason is not on it.
|
|
95
89
|
|
|
96
90
|
## `in-progress` is removed by whoever finds it stale
|
|
97
91
|
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
# `backlogrun` — progress, the hand-off, resume and waiting
|
|
2
2
|
|
|
3
|
-
Point-of-use, read one section at a time from `backlogrun.md` → "The
|
|
3
|
+
Point-of-use, read one section at a time from `backlogrun.md` → "The manifest — the ordered flow"; the heartbeat is `progress-watcher.md` → "Progress while the run is quiet".
|
|
4
4
|
|
|
5
5
|
## Running a named epic's children
|
|
6
6
|
|
|
7
|
-
**`backlog:drive` walks this loop on its own; a session runs it when the driver hands back `epic #N
|
|
8
|
-
|
|
9
|
-
`docs/maintainers/backlogrun-progress-rationale.md` → "Why a named epic's children run in lanes";
|
|
10
|
-
`docs/maintainers/backlogrun-progress-rationale.md` → "Why state lives in records, not the
|
|
11
|
-
conversation"). Each child runs as `fullrun #<N>` in a lane —
|
|
7
|
+
**`backlog:drive` walks this loop on its own; a session runs it when the driver hands back `epic #N`.**
|
|
8
|
+
Each child runs as `fullrun #<N>` in a lane —
|
|
12
9
|
`pnpm josh lane:launch <N>` (`backlogrun-lanes.md` → "Opening one lane and dispatching its child"),
|
|
13
10
|
then `pnpm josh lane:await <N...> --owner "$PPID"` in the background — and every ending is read by one
|
|
14
11
|
command:
|
|
@@ -20,10 +17,7 @@ next=$(pnpm josh run:merge <N> --epic <E> --repo <owner/repo> --owner "$PPID" --
|
|
|
20
17
|
**`pnpm josh run:merge <N>` is the only reading of how a child ended** — never
|
|
21
18
|
classify `issue:state` by hand or ask `epic:next` in its place. **Pass `--output <path>`, the child's
|
|
22
19
|
transcript**; the named-epic flags are dropped for the opted-in backlog. It classifies, counts, closes
|
|
23
|
-
the lane and comments itself; act on the token.
|
|
24
|
-
`docs/maintainers/backlogrun-progress-rationale.md` → "Why a child's ending is read by `run:merge` alone";
|
|
25
|
-
`docs/maintainers/backlogrun-progress-rationale.md` → "Why a child's ending is classified at once";
|
|
26
|
-
provenance of each rule: `docs/maintainers/backlogrun-progress-rationale.md` → "Where each rule came from".
|
|
20
|
+
the lane and comments itself; act on the token.
|
|
27
21
|
|
|
28
22
|
| It prints | What the run does |
|
|
29
23
|
| --- | --- |
|
|
@@ -52,8 +46,7 @@ after every child's merge and `pnpm josh ms`, never wired to `pnpm josh delegate
|
|
|
52
46
|
carrying the budget** (`backlogrun-steps.md` → "The session cut is inside the invocation"); it is not a
|
|
53
47
|
stop. The threshold is `CONTEXT_CUT_THRESHOLD` in `scripts/cost-runtime/context-cut-threshold.ts`
|
|
54
48
|
(135,000, shared by the scheduler entry, hand-off and the lane worker cut, `pre-gate-cut.md` → "The
|
|
55
|
-
implementation-phase cut").
|
|
56
|
-
hand-off check is asked at every merge".
|
|
49
|
+
implementation-phase cut").
|
|
57
50
|
|
|
58
51
|
| It answers | What the run does |
|
|
59
52
|
| --- | --- |
|
|
@@ -72,8 +65,7 @@ and output path; fill a missing path with `pnpm josh lane:output <N> <path>`:
|
|
|
72
65
|
closed by `pnpm josh lane:prune`.
|
|
73
66
|
- **Every in-flight lane records a path** — count everything, run `pnpm josh run:carry --cut --owner
|
|
74
67
|
"$PPID"`, post the progress comment naming every lane and its path with `pnpm josh run:board`, and end
|
|
75
|
-
the turn; the `run:wake` driver polls the lanes.
|
|
76
|
-
`docs/maintainers/backlogrun-progress-rationale.md` → "Why lanes are handed over rather than drained".
|
|
68
|
+
the turn; the `run:wake` driver polls the lanes.
|
|
77
69
|
- **`--cut` answers `capped`** (`MAX_CUTS`) — **do not `run:wake` or hand off**;
|
|
78
70
|
carry this session on and re-ask at the next merge.
|
|
79
71
|
|
|
@@ -88,7 +80,7 @@ park** — nothing is labelled, stashed or filed.
|
|
|
88
80
|
### Picking the lanes up in the fresh session
|
|
89
81
|
|
|
90
82
|
**Start no child again and open no lane already open.** In one turn: `pnpm josh lane:list` (a line
|
|
91
|
-
with a path is a handed-over child,
|
|
83
|
+
with a path is a handed-over child, waited on per `backlogrun-recovery.md` → "A delegated unit that stopped
|
|
92
84
|
without reporting"), `pnpm josh run:progress --wait --output <handed-over paths>` in the background
|
|
93
85
|
(`run:watcher:guard`), `pnpm josh run:liveness`, and `epic:next --lanes`, a lane per child it offers.
|
|
94
86
|
**A carried-over child finishes in its own unit — never run its `followup` yourself**; one lost in the
|
|
@@ -104,15 +96,14 @@ the epic body; what merged the epic's task list.
|
|
|
104
96
|
|
|
105
97
|
| Setting | Value | Meaning |
|
|
106
98
|
| --- | --- | --- |
|
|
107
|
-
|
|
|
99
|
+
| Re-ask floor | 60 s | **In flight, never a clock — the wait is `backlog:drive` or `lane:await`**, and the wake is their exit or the watcher's arrival exit, never a report; a state read repeated with nothing decided in between is refused. **With nothing in flight no wake comes: it is the parent's own clock.** A `backlogrun` idle watch re-asks at this same floor. |
|
|
108
100
|
| Silent delegated unit | 30 min | Not the child's duration — the time its output has gone **unchanged**. Past it, ask `run:liveness` and book a stopped unit as a failure. |
|
|
109
101
|
| Stale `in-progress` | 90 min | Past it, the other session is gone. |
|
|
110
102
|
| Publish wait | 10 min | `josh propagate`'s own budget. A failed publish never appears. |
|
|
111
103
|
| `backlogrun` idle watch | 8 h | Counted from when the run's hands became free, never from its start; `pnpm josh backlog:budget` decides it. |
|
|
112
104
|
|
|
113
|
-
Each timeout **ends the wait and reports** — none is retried indefinitely.
|
|
114
|
-
|
|
115
|
-
clock". A stale child's label is removed first, so the next poll can offer it. **A graph that has
|
|
105
|
+
Each timeout **ends the wait and reports** — none is retried indefinitely. A stale child's label is
|
|
106
|
+
removed first, so the next ask can offer it. **A graph that has
|
|
116
107
|
deadlocked on a cycle is not this loop's to untangle**: `epic:next` detects it and exits with an error.
|
|
117
108
|
|
|
118
109
|
## Who sends the summary, and who propagates
|
|
@@ -4,7 +4,8 @@ Point-of-use, read one section at the failure that reaches it; the single source
|
|
|
4
4
|
|
|
5
5
|
## A delegated unit that stopped without reporting
|
|
6
6
|
|
|
7
|
-
**A stop from outside leaves no notification behind, so the parent
|
|
7
|
+
**A stop from outside leaves no notification behind, so the parent waits on `lane:await`, whose exit
|
|
8
|
+
covers it.** Record
|
|
8
9
|
where a lane child writes with `pnpm josh lane:output <N> <path>` in the dispatch turn, and once its
|
|
9
10
|
output has been unchanged for the silent-unit window (`backlogrun-progress.md` → "Waiting, and never
|
|
10
11
|
waiting forever") **ask the command rather than combining the traces yourself**, in the checkout the
|
|
@@ -18,14 +19,11 @@ pnpm josh run:liveness <N> --output <absolute path> --process <command lines nam
|
|
|
18
19
|
|
|
19
20
|
| Answer | What the parent does |
|
|
20
21
|
| --- | --- |
|
|
21
|
-
| `alive` |
|
|
22
|
+
| `alive` | Wait on `lane:await` again; touch nothing |
|
|
22
23
|
| `settled` | Re-read with `pnpm josh run:status <N>` and take the branch its state section says |
|
|
23
24
|
| `undetermined` | Read the trace that failed and ask again. **A second in a row on the same child is a fault in the check**: send a `confirmation` naming the trace and stop — never escalate it to `stopped` |
|
|
24
25
|
| `stopped` | The recovery below |
|
|
25
26
|
|
|
26
|
-
Rationale: `docs/maintainers/backlogrun-recovery-rationale.md` → "Why liveness needs silence and no
|
|
27
|
-
process together".
|
|
28
|
-
|
|
29
27
|
**On `stopped`, re-read with `pnpm josh run:status <N>`.** **A re-read carrying `needs-decision`** — the
|
|
30
28
|
unit parked it, then stopped: leave the label on and count nothing. Otherwise, while `state: OPEN`:
|
|
31
29
|
|
|
@@ -39,7 +37,10 @@ unit parked it, then stopped: leave the label on and count nothing. Otherwise, w
|
|
|
39
37
|
the stale `in-progress` itself.
|
|
40
38
|
3. **Act on the token it printed** — `backlogrun-progress.md` → "Running a named epic's children".
|
|
41
39
|
|
|
42
|
-
|
|
40
|
+
## A person withdraws a running child
|
|
41
|
+
|
|
42
|
+
On a person's instruction to drop a running child's issue, run `pnpm josh lane:withdraw <N>
|
|
43
|
+
--reason "<their reason>"` — `docs/josh-commands.md` → "`josh lane:withdraw`".
|
|
43
44
|
|
|
44
45
|
## Conflicts are not predicted
|
|
45
46
|
|
|
@@ -51,8 +52,7 @@ followup` ends that child with a named conflict in about ten seconds.
|
|
|
51
52
|
|
|
52
53
|
**That child does not stop: it resolves the conflict in its own lane**, uncounted by the
|
|
53
54
|
consecutive-failure guard. **The merge direction is `origin/main` into the lane's branch, never a
|
|
54
|
-
rebase**; no step rewrites a pushed commit
|
|
55
|
-
conflict is resolved in the lane rather than handed to a person").
|
|
55
|
+
rebase**; no step rewrites a pushed commit.
|
|
56
56
|
|
|
57
57
|
1. **Resolve in the lane.** `git fetch origin main`, merge `origin/main` into the lane's branch, resolve
|
|
58
58
|
in place. Do not close the lane, open another, or switch its branch.
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
# `backlogrun` — the detailed procedure behind the manifest
|
|
2
2
|
|
|
3
|
-
Point-of-use, read one section at a time from `backlogrun.md` → "The
|
|
4
|
-
|
|
5
|
-
- `docs/maintainers/backlogrun-steps-rationale.md` → "Why the authorization boundary is shaped this way"
|
|
6
|
-
- `docs/maintainers/backlogrun-steps-rationale.md` → "Why a session cut does not end the run"
|
|
7
|
-
- `docs/maintainers/backlogrun-steps-rationale.md` → "Why the plan and the decision pass come first"
|
|
8
|
-
- `docs/maintainers/backlogrun-steps-rationale.md` → "Why the loop's contract is shaped this way"
|
|
9
|
-
- `docs/maintainers/backlogrun-steps-rationale.md` → "Why the idle watch lasts 8 hours from when the hands became free"
|
|
10
|
-
- `docs/maintainers/backlogrun-steps-rationale.md` → "Why the cost check skips a watch"
|
|
11
|
-
- `docs/maintainers/backlogrun-steps-rationale.md` → "Where each rule came from"
|
|
3
|
+
Point-of-use, read one section at a time from `backlogrun.md` → "The manifest — the ordered flow".
|
|
12
4
|
|
|
13
5
|
## What one invocation approves
|
|
14
6
|
|
|
@@ -135,7 +127,7 @@ section the row names:
|
|
|
135
127
|
| `window` | Hand the loop back as is | — |
|
|
136
128
|
|
|
137
129
|
**A candidate only in another repository is never a token** — report it with its checkout. The budgets,
|
|
138
|
-
verdicts and stops are the driver's own
|
|
130
|
+
verdicts and stops are the driver's own.
|
|
139
131
|
|
|
140
132
|
## What runs once per session, not once per issue
|
|
141
133
|
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
# `backlogrun` — the manifest (named issues, epics and the opted-in backlog)
|
|
2
2
|
|
|
3
|
-
**This file is the manifest, not the procedure**: the ordered flow as terse triggers, and the route
|
|
4
|
-
table naming the one section each moment reads. Rationale and provenance:
|
|
5
|
-
`docs/maintainers/backlogrun-rationale.md` → "Why the loop's position is computed";
|
|
6
|
-
`docs/maintainers/backlogrun-rationale.md` → "Where each rule came from".
|
|
7
|
-
|
|
8
3
|
**`backlogrun` names either nothing, or the issues and epics to run first.** With no argument it runs
|
|
9
4
|
whatever `pnpm josh backlog:next` offers — the whole opted-in backlog, every issue carrying `auto-ok`
|
|
10
5
|
plus every child of an epic whose root carries it, ordered by dependency and grouped into waves. With
|
|
@@ -12,9 +7,9 @@ plus every child of an epic whose root carries it, ordered by dependency and gro
|
|
|
12
7
|
that same backlog. **`--only` stops it after the named list**, draining nothing.
|
|
13
8
|
|
|
14
9
|
**The loop's current position is computed, not carried in the conversation.** `pnpm josh run:step <N>`
|
|
15
|
-
reads
|
|
16
|
-
|
|
17
|
-
for the parent itself
|
|
10
|
+
reads it from the event stream, the carry record and the issue state, and prints the next single
|
|
11
|
+
action — a runnable command, or the one point a person has to judge — followed by the section that
|
|
12
|
+
governs it. With no `<N>` it answers for the parent itself, from the carry record alone.
|
|
18
13
|
|
|
19
14
|
**A named item may be a single issue or an epic.** A single-issue item is one `fullrun`; **a named epic runs its children in
|
|
20
15
|
dependency order across the free lanes, and the run does not advance to the next named item until
|
|
@@ -29,52 +24,46 @@ is still that one invocation (`backlogrun-steps.md` → "The session cut is insi
|
|
|
29
24
|
|
|
30
25
|
## The manifest — the ordered flow
|
|
31
26
|
|
|
27
|
+
A section `run:step` prints is not fetched again. Every other one is read at its step with
|
|
28
|
+
`pnpm josh doc:section <file> "<heading>"` — never a whole document (`SKILL.md` → "A section
|
|
29
|
+
reference is read as a section").
|
|
30
|
+
|
|
32
31
|
1. **Claim nothing at the entry — this parent orchestrates and never implements.** The working-tree
|
|
33
32
|
hold, the split assessment and `fullrun.md` are read by a dispatched child inside its own delegated
|
|
34
33
|
`fullrun` unit, never at the parent's entry.
|
|
35
34
|
2. **Begin the carry record before the plan** — `pnpm josh run:carry --begin "<invocation>" --owner
|
|
36
|
-
"$PPID"` and `pnpm josh run:wake --start`, in the same turn as the first `pnpm josh ms`.
|
|
35
|
+
"$PPID"` and `pnpm josh run:wake --start`, in the same turn as the first `pnpm josh ms`. Its answers:
|
|
36
|
+
`backlogrun-steps.md` → "The session cut is inside the invocation"; a resumed session:
|
|
37
|
+
`backlogrun-progress.md` → "Resuming after a cut".
|
|
37
38
|
3. **What this invocation approves** — the opted-in pool, a run's own filings once bundled, and the
|
|
38
|
-
brake that bounds the amount
|
|
39
|
+
brake that bounds the amount: `backlogrun-steps.md` → "What one invocation approves".
|
|
39
40
|
4. **Report the plan before the first child** — `pnpm josh backlog:plan`, then resolve every
|
|
40
41
|
`needs-decision` issue decidable from its body in one pass, recording `blocked-by`, `run:solo` and
|
|
41
|
-
`run:lane` in the same pass.
|
|
42
|
+
`run:lane` in the same pass: `backlogrun-steps.md` → "The plan, before the first child starts";
|
|
43
|
+
`run:solo`: `backlogrun-lanes.md` → "A solo run".
|
|
42
44
|
5. **Named issues run first, in order** — each as a delegated `fullrun`, one at a time, then the pool;
|
|
43
45
|
`--only` stops after the list.
|
|
46
|
+
- Once per session: `backlogrun-steps.md` → "What runs once per session, not once per issue" and
|
|
47
|
+
`backlogrun-child.md` → "`josh latest` runs once per session, not once per child"
|
|
48
|
+
(`latest-gate.md` whole on `required`).
|
|
49
|
+
- The watcher: `progress-watcher.md` → "Progress while the run is quiet".
|
|
50
|
+
- Lanes: `backlogrun-lanes.md` → "Once per repository, before the first lane opens", by hand
|
|
51
|
+
`backlogrun-lanes.md` → "Opening one lane and dispatching its child".
|
|
52
|
+
- Dispatch: `backlogrun-child.md` → "Each child runs in a delegated unit".
|
|
44
53
|
6. **The loop belongs to the supervisor — hand it over with what the bare `pnpm josh run:step`
|
|
45
54
|
prints**, whatever the plan held: `run:wake` runs `backlog:drive`, which returns a branch to an AI
|
|
46
|
-
session only when it needs judgment.
|
|
55
|
+
session only when it needs judgment (`backlogrun-steps.md` → "The loop").
|
|
56
|
+
- An `epic #N` hand-back or a `merge` branch: `backlogrun-progress.md` → "Running a named epic's
|
|
57
|
+
children".
|
|
58
|
+
- A merge answered `over`: `backlogrun-progress.md` → "The hand-off".
|
|
59
|
+
- A unit gone silent: `backlogrun-recovery.md` → "A delegated unit that stopped without reporting".
|
|
60
|
+
- A child that cannot finish: `backlogrun-park.md` → "park and continue".
|
|
47
61
|
7. **End the record when the run ends** — `run:report`, then `run:carry --end` (or `--end --stopped
|
|
48
|
-
"<reason>"`) and `run:wake --stop
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
**Read one section, at the moment its row names, with `pnpm josh doc:section <file> "<heading>"`** —
|
|
54
|
-
never a whole document (`SKILL.md` → "A section reference is read as a section"):
|
|
55
|
-
|
|
56
|
-
| The moment | Read |
|
|
57
|
-
| --- | --- |
|
|
58
|
-
| The entry: the carry record and its answers | `backlogrun-steps.md` → "The session cut is inside the invocation" |
|
|
59
|
-
| What the invocation may merge, and the `auto-ok` rule | `backlogrun-steps.md` → "What one invocation approves" |
|
|
60
|
-
| Before the first child: the plan and the decision pass | `backlogrun-steps.md` → "The plan, before the first child starts" |
|
|
61
|
-
| The driver hands a branch back | `backlogrun-steps.md` → "The loop" |
|
|
62
|
-
| Once per session | `backlogrun-steps.md` → "What runs once per session, not once per issue" |
|
|
63
|
-
| `josh latest:scope` answers `required` | `latest-gate.md` (whole) |
|
|
64
|
-
| Starting the progress watcher | `progress-watcher.md` → "Progress while the run is quiet" |
|
|
65
|
-
| The run ends | `backlogrun-steps.md` → "End the record when the run ends" |
|
|
66
|
-
| Labelling an issue `run:solo` | `backlogrun-lanes.md` → "A solo run" |
|
|
67
|
-
| Before the first lane opens | `backlogrun-lanes.md` → "Once per repository, before the first lane opens" |
|
|
68
|
-
| Opening a lane by hand | `backlogrun-lanes.md` → "Opening one lane and dispatching its child" |
|
|
69
|
-
| The first child is in hand | `backlogrun-child.md` → "`josh latest` runs once per session, not once per child" |
|
|
70
|
-
| Dispatching a child | `backlogrun-child.md` → "Each child runs in a delegated unit" |
|
|
71
|
-
| An `epic #N` hand-back, a `merge` branch, or a `run:merge` token | `backlogrun-progress.md` → "Running a named epic's children" |
|
|
72
|
-
| A merge answered `over` | `backlogrun-progress.md` → "The hand-off" |
|
|
73
|
-
| A resumed session | `backlogrun-progress.md` → "Resuming after a cut" |
|
|
74
|
-
| The run's last merge | `backlogrun-progress.md` → "Who sends the summary, and who propagates" |
|
|
75
|
-
| `josh release:scope`, after the last merge | `followup.md` → "When `pnpm josh release` runs" |
|
|
76
|
-
| A unit went silent | `backlogrun-recovery.md` → "A delegated unit that stopped without reporting" |
|
|
77
|
-
| A child cannot finish | `backlogrun-park.md` → "park and continue" |
|
|
62
|
+
"<reason>"`) and `run:wake --stop`: `backlogrun-steps.md` → "End the record when the run ends".
|
|
63
|
+
- An empty plan is not that end; the driver's idle watch decides it. A person stops a run from the
|
|
64
|
+
terminal with `pnpm josh backlogrun --stop`, which makes both calls.
|
|
65
|
+
- The last merge: `backlogrun-progress.md` → "Who sends the summary, and who propagates", then
|
|
66
|
+
`followup.md` → "When `pnpm josh release` runs".
|
|
78
67
|
|
|
79
68
|
## Guards
|
|
80
69
|
|
|
@@ -85,11 +74,3 @@ never a whole document (`SKILL.md` → "A section reference is read as a section
|
|
|
85
74
|
| Consecutive child failures | 3 | Stop and report; something is wrong with the environment, not the children. |
|
|
86
75
|
|
|
87
76
|
A failure that is not consecutive parks its child and the run continues.
|
|
88
|
-
|
|
89
|
-
## This file is the single source of the `backlogrun` procedure
|
|
90
|
-
|
|
91
|
-
`CLAUDE.md` carries the keyword's row in the shorthand table and the explicit-invocation rule;
|
|
92
|
-
`SKILL.md` → §1 routes here. This manifest names which children there are and in what order; each
|
|
93
|
-
step's procedure is the section its route-table row names. Where any of them could disagree, the rule
|
|
94
|
-
is that this manifest and `backlogrun-steps.md` add nothing to a child's procedure — they only say
|
|
95
|
-
which children there are.
|