@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
|
@@ -8,7 +8,8 @@ Review results and successful pushes are never turn boundaries.
|
|
|
8
8
|
0. **A lane child**: `pnpm josh main:merge`, the self-check (`prompts/review.md` → "Before round 1 —
|
|
9
9
|
the implementer's self-check"), the scoped pair, `pnpm josh ship --detach --review
|
|
10
10
|
"<title> #<N>"` (`--cite <N>`), then **end the turn** on `launched`/`busy`. A stop relaunches a child
|
|
11
|
-
whose prompt
|
|
11
|
+
whose prompt carries the failed output's tail and the changed files (`pnpm josh ship --log <N>` when
|
|
12
|
+
the stage printed nothing) and (Anthropic lane) the re-detach to run after
|
|
12
13
|
the fix — `pnpm josh ship --detach`, `--review` only if the stopped ship carried it and stopped before
|
|
13
14
|
round 2, which is final (`scripts/run/ship/run-ship-next.ts`); the supervisor skips a recorded round 1.
|
|
14
15
|
`failed` → step 1. A backgrounded `ship` issued alone is moved to the foreground by the hook
|
|
@@ -18,7 +19,8 @@ Review results and successful pushes are never turn boundaries.
|
|
|
18
19
|
(`prompts/review.md` → "Before round 1 — the implementer's self-check"), run the final scoped lint/test pair and
|
|
19
20
|
`pnpm josh run:review`: it starts `pnpm josh gate` in the background and prints the `/code-review`
|
|
20
21
|
brief in one call, so the two overlap. Launch the `/code-review` subagent as the `general-purpose`
|
|
21
|
-
agent type with that brief
|
|
22
|
+
agent type with that brief and the alias of its `model=` id (`claude-opus-5-5` → `opus`) (every
|
|
23
|
+
tool, so `--fix` applies; never a guessed type name).
|
|
22
24
|
Never load the review skill in the main line.
|
|
23
25
|
2. Once the review returns, run `pnpm josh run:review --join` to join and read the gate before
|
|
24
26
|
committing; it exits non-zero on a red gate. Fix any red check, then rerun the affected scoped check
|
|
@@ -40,7 +42,8 @@ Review results and successful pushes are never turn boundaries.
|
|
|
40
42
|
**`pnpm josh followup` refuses the merge until the round is recorded**
|
|
41
43
|
(`pnpm josh review:record --check --issue <N>`).
|
|
42
44
|
5. **The clean path ships in one call** — with no second round due, background
|
|
43
|
-
`pnpm josh ship "<title> #<N>" --body-file <evidence.md
|
|
45
|
+
`pnpm josh ship "<title> #<N>" --body-file <evidence.md>` — the file carries `## 実機証跡` and
|
|
46
|
+
`## 受け入れ条件の対応` (`report-format.md`), both asked at the preflight: PR preflight → gate → `git -y` →
|
|
44
47
|
`followup` → `run:tail`, stopping at the first failure. `--review` runs both rounds. **Else a due
|
|
45
48
|
round 2 does not fit `ship`**: the PR opens between the rounds — background
|
|
46
49
|
`pnpm josh git -y "<title> #<N>"`, round 2 beside CI, then `pnpm josh followup`.
|
|
@@ -54,9 +57,7 @@ Recommendations are informational; severity decides. A CodeRabbit rate-limit war
|
|
|
54
57
|
## Orchestration facts single-sourced here
|
|
55
58
|
|
|
56
59
|
These are the gate → review → PR → merge facts other documents cite; this file is their single source
|
|
57
|
-
(`prompts/review.md` carries the review _policy_, `prompts/review-rubric.md` the rubric).
|
|
58
|
-
rule came from and why it holds: `docs/maintainers/chain-rule-rationale.md` → "Where each rule came
|
|
59
|
-
from", `docs/maintainers/chain-rule-rationale.md` → "Why the orchestration facts hold".
|
|
60
|
+
(`prompts/review.md` carries the review _policy_, `prompts/review-rubric.md` the rubric).
|
|
60
61
|
|
|
61
62
|
- **The gate runs beside this review, not in front of it** — started with the review, joined before the
|
|
62
63
|
commit. A red gate is fixed and re-run whatever the review concluded.
|
|
@@ -37,15 +37,13 @@ classification lives in `backlogrun-child.md` → "Each child runs in a delegate
|
|
|
37
37
|
main line.** The unit returns conclusions with `file:line` citations, never the file text. It may run
|
|
38
38
|
a temporary probe script and return its output.
|
|
39
39
|
|
|
40
|
-
**The threshold is 3 files, and it is a count, not a forecast.**
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
the threshold.
|
|
40
|
+
**The threshold is 3 files, and it is a count, not a forecast.** Brief the unit on what was already
|
|
41
|
+
read. **A delegation resets the counter rather than spending it**; `pnpm josh investigation:guard`
|
|
42
|
+
refuses the threshold call, in a lane child too (`pnpm josh delegate --list`; counting:
|
|
43
|
+
`docs/josh-commands-automation.md` → "`josh investigation:guard`").
|
|
45
44
|
|
|
46
|
-
**Dispatch the unit as the `investigator` agent** (`kit:investigator` in a consumer) —
|
|
47
|
-
model
|
|
48
|
-
`docs/josh-commands-automation.md` → "`josh investigation:guard`" carries the command's counting details.
|
|
45
|
+
**Dispatch the unit as the `investigator` agent** (`kit:investigator` in a consumer) — read-only, on
|
|
46
|
+
the `model` its definition names.
|
|
49
47
|
|
|
50
48
|
**The main line does not idle while the unit reads:** read files this run will edit, then verify the
|
|
51
49
|
unit's cited lines. Independent investigations launch together; a brief that needs another unit's
|
|
@@ -54,3 +52,9 @@ answer waits for that answer.
|
|
|
54
52
|
**When the Issue already names the file, function or rule, read that edit target in the main line.**
|
|
55
53
|
It is not `survey`, and it is not `diagnosis`: the unit describes how the subject works;
|
|
56
54
|
the main line decides what that means and what to change.
|
|
55
|
+
|
|
56
|
+
## A `general-purpose` subagent names its model
|
|
57
|
+
|
|
58
|
+
**A `general-purpose` dispatch → set `model`**: `sonnet` for routine work, `opus` for judgment; a review
|
|
59
|
+
takes the alias of the `model=` id its brief prints (`claude-opus-5-5` → `opus`). Delivered by the
|
|
60
|
+
`agent-model` row of `pnpm josh rule:guard`.
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# The entry sequence and the stop branches — shared by `fullrun`, `halfrun` and `prrun`
|
|
2
2
|
|
|
3
|
-
`
|
|
4
|
-
procedure; `pnpm josh run:step <N>` prints the run's next single action. History:
|
|
5
|
-
`docs/maintainers/entry-sequence-rationale.md` → "Where each rule came from".
|
|
3
|
+
`pnpm josh run:step <N>` prints the run's next single action.
|
|
6
4
|
|
|
7
5
|
## The ordered entry sequence
|
|
8
6
|
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Everything between a green CI and a merged PR: the command, the merge it authorizes, the notifications,
|
|
4
4
|
the reviewer scan, the config report and the release ask. `fullrun` and `backlogrun` end here; `halfrun`
|
|
5
|
-
stops before the commit.
|
|
6
|
-
`docs/maintainers/followup-rationale.md` → "Where each rule came from".
|
|
5
|
+
stops before the commit.
|
|
7
6
|
|
|
8
7
|
## Run `pnpm josh followup`
|
|
9
8
|
|
|
@@ -106,15 +105,13 @@ pnpm josh notify --task-type failure --issue-url "<issue-url>" --body-file <reas
|
|
|
106
105
|
non-zero; with it, the reason is posted and the run proceeds.
|
|
107
106
|
- **A comment listing that could not be read is a standing blocker**.
|
|
108
107
|
- **Temporary**: CodeRabbit is non-blocking end to end — out of the default required checks
|
|
109
|
-
(restore via `JOSH_REQUIRED_CHECKS`); its findings are audit notes.
|
|
110
|
-
`docs/maintainers/followup-rationale.md` → "The temporary CodeRabbit exemption".
|
|
108
|
+
(restore via `JOSH_REQUIRED_CHECKS`); its findings are audit notes.
|
|
111
109
|
|
|
112
110
|
## Config file reporting
|
|
113
111
|
|
|
114
112
|
`followup` matches every changed path against what `josh sync` distributes (`AI_COPY_FILES`,
|
|
115
113
|
`AI_COPY_FILE_MAPPINGS`, `AI_COPY_DIRECTORIES`, `SYNCED_PATHS`) and **reports** the claimed paths in the
|
|
116
|
-
notification and the Issue report. **It stops nothing
|
|
117
|
-
"Why config claims are reported, not stopped"). `pnpm josh sync:scope` gives the same answer.
|
|
114
|
+
notification and the Issue report. **It stops nothing.** `pnpm josh sync:scope` gives the same answer.
|
|
118
115
|
|
|
119
116
|
## When `pnpm josh release` runs
|
|
120
117
|
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# `fullrun` — the step lists and the branches
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
`docs/maintainers/fullrun-steps-rationale.md` → "Where each rule came from".
|
|
3
|
+
`pnpm josh run:next <N>` names which step the run is at, and the sections below carry that step in
|
|
4
|
+
full.
|
|
6
5
|
|
|
7
6
|
## The `fullrun #N` step list
|
|
8
7
|
|
|
@@ -31,8 +30,7 @@ fit**: open the PR between the rounds with `pnpm josh git -y "<title> #<N>"`, ru
|
|
|
31
30
|
default `ja`). Before implementing, run `pnpm josh ms`, then `pnpm josh latest:scope`
|
|
32
31
|
and update dependencies only on `required` — `latest-gate.md` is its single source, and on `required`
|
|
33
32
|
load the `dependency-update` skill afterwards. **A dispatched lane child skips `pnpm josh ms`** — it
|
|
34
|
-
refuses in a lane, and `pnpm josh main:merge` brings the latest default in during the gate
|
|
35
|
-
(`docs/maintainers/fullrun-steps-rationale.md` → "Why a lane child skips `josh ms`"). The parent runs
|
|
33
|
+
refuses in a lane, and `pnpm josh main:merge` brings the latest default in during the gate. The parent runs
|
|
36
34
|
`pnpm josh ms` in the primary checkout, never the child — `backlogrun-lanes.md` and
|
|
37
35
|
`backlogrun-child.md` are the single sources. When running `pnpm josh followup`, pass an
|
|
38
36
|
implementation summary via `--notify-message` in the session language, leading with the three
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
# `fullrun` — the manifest (plan → implement → PR → merge → notify)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
`
|
|
5
|
-
`
|
|
6
|
-
`
|
|
7
|
-
use. The step lists are `fullrun-steps.md`, read when a step needs its detail. History:
|
|
8
|
-
`docs/maintainers/fullrun-rationale.md` → "Where each rule came from".
|
|
3
|
+
The entry sequence and the stop branches are `entry-sequence.md`. `pnpm josh run:step <N>` prints the
|
|
4
|
+
run's next single action. `chain-rule.md`, `followup.md`, `background-commands.md` and
|
|
5
|
+
`latest-gate.md` are **not entry reads** — each is fetched at its point of use. The step lists are
|
|
6
|
+
`fullrun-steps.md`, read when a step needs its detail.
|
|
9
7
|
|
|
10
8
|
## The difference — the entry and the end
|
|
11
9
|
|
|
@@ -2,13 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
When this run files a new Issue, file it with `pnpm josh issue:file`, which lints the body and applies the classification labels it declares beside the `--depth` and `--route` labels; `prompts/collaboration-workflow/issue-template.md` is the single source for this classification.
|
|
4
4
|
|
|
5
|
-
`halfrun`
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
**This file is the manifest.** The entry sequence and the stop branches are `entry-sequence.md`,
|
|
10
|
-
shared with `fullrun` and `prrun`; this file names only what is `halfrun`'s own. History:
|
|
11
|
-
`docs/maintainers/halfrun-rationale.md` → "Where each rule came from".
|
|
5
|
+
`halfrun` implements the change and runs the full verification gate, then **stops before commit** —
|
|
6
|
+
nothing is committed, pushed, or opened as a PR — so a person verifies the working tree by hand. The
|
|
7
|
+
entry sequence and the stop branches are `entry-sequence.md`.
|
|
12
8
|
|
|
13
9
|
## The difference — the entry
|
|
14
10
|
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**This file is the suffix's single source, read at its point of use — the moment a `new` entry is
|
|
4
4
|
typed with an `into <target>` suffix, not at any entry.** A run given a `#N` or a bare `new` never
|
|
5
|
-
reaches it.
|
|
6
|
-
`docs/maintainers/into-target-rationale.md` → "Why the suffix reads as it does".
|
|
5
|
+
reaches it.
|
|
7
6
|
|
|
8
7
|
`kickoff new` / `fullrun new` / `halfrun new` accept a suffix naming the epic the run's artifact
|
|
9
8
|
belongs to. Without it the artifact belongs to no epic, and `epic:next` only ever offers an epic's
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# An Issue's comments are part of the Issue
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
history: `docs/maintainers/issue-comments-rationale.md` → "Why comments are read".
|
|
3
|
+
Read before implementing a `#N` Issue.
|
|
5
4
|
|
|
6
5
|
**Every `#N` entry point reads the Issue's comments before it implements** — `fullrun`, `halfrun` and
|
|
7
6
|
`kickoff`; a `backlogrun` named issue and epic child inherit it through `fullrun`. One call, in the same
|
|
@@ -73,7 +72,8 @@ one this run still owes.
|
|
|
73
72
|
body. A thread longer than the Issue is the pre-implementation reading `delegation.md` describes: brief
|
|
74
73
|
a unit to return **the agreements in force plus the comment URLs that carry them**, never the text.
|
|
75
74
|
|
|
76
|
-
|
|
75
|
+
**Under Claude Code the hook prepends the comments to a line that opens with a body-only `gh api` read
|
|
76
|
+
and refuses every other body-only read; the Codex adapter refuses them all** (`prompts/collaboration-workflow/rule-delivery.md`).
|
|
77
77
|
**This file is the rule, not the hook** — a session without hooks still owes the read.
|
|
78
78
|
|
|
79
79
|
## A person's update mid-run
|
|
@@ -28,8 +28,9 @@ pnpm josh issue:file "<title>" --body-file <complete-draft.md> --depth <n> --dis
|
|
|
28
28
|
`add_to_epic` / `create_epic` Tier A and `ask` a stop, in exactly the reading `into-target.md`'s
|
|
29
29
|
`into <target>` suffix would have given by hand. Where the user typed `into <target>`, that naming wins.
|
|
30
30
|
- **`Epic: not asked` is not `Epic: none`.** The epic half decides from the issue numbers the body
|
|
31
|
-
names
|
|
32
|
-
|
|
31
|
+
names in its acceptance criteria or its `parent: #N` line; a background mention does not count.
|
|
32
|
+
**Cite `#N` there whenever the work follows an existing Issue** — one line is enough, and naming
|
|
33
|
+
the epic itself (`parent: #<E>`) is answered with that epic.
|
|
33
34
|
- **`epic:bundle` then runs on the new Issue, in the same call.** Act on its printed answer; a `⚠`
|
|
34
35
|
means rerun `pnpm josh epic:bundle <N>` — the Issue exists, so never refile; a placing answer
|
|
35
36
|
reads the `epic-commands` skill.
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
# The dependency update — when `josh latest` runs
|
|
2
2
|
|
|
3
3
|
`josh latest` updates every dependency, the published ranges, `pnpm audit` and pnpm, in that
|
|
4
|
-
order and over the network.
|
|
5
|
-
references it and none restates it. History: `docs/maintainers/latest-gate-rationale.md` → "Where
|
|
6
|
-
each rule came from".
|
|
4
|
+
order and over the network.
|
|
7
5
|
|
|
8
6
|
## Ask the command; do not decide
|
|
9
7
|
|
|
@@ -59,8 +57,6 @@ merge is CI**: the `Security Audit` job runs on every pull request and is one of
|
|
|
59
57
|
|
|
60
58
|
**The lock file the update rewrites lands with whichever issue ran it.** `josh latest` leaves
|
|
61
59
|
`pnpm-lock.yaml` modified and that issue's `pnpm josh git -y` commits it. Should the issue then fail
|
|
62
|
-
CI on a bump rather than on its own change, fix it forward before parking the issue for it.
|
|
63
|
-
for the elapsed-time window: `docs/maintainers/latest-gate-rationale.md` → "Why an elapsed-time
|
|
64
|
-
window rather than once per batch".
|
|
60
|
+
CI on a bump rather than on its own change, fix it forward before parking the issue for it.
|
|
65
61
|
|
|
66
62
|
`docs/josh-commands-automation.md` documents the command itself.
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# `needs-human-review` — the child that stops before its commit
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
answers `human_review: yes`. Rationale and history: `docs/maintainers/needs-human-review-rationale.md`
|
|
5
|
-
→ "Why the label exists".
|
|
3
|
+
Read the moment `pnpm josh issue:state <N>` answers `human_review: yes`.
|
|
6
4
|
|
|
7
5
|
An issue carrying **`needs-human-review`** is degraded to a `halfrun`-shaped stop, whichever entry
|
|
8
6
|
point reached it — `fullrun` or `backlogrun` — and the label may be applied **only by a person**.
|
|
@@ -46,8 +44,7 @@ gh api repos/{owner}/{repo}/labels -f name=needs-human-review -f color=d93f0b -f
|
|
|
46
44
|
**It is not `needs-decision`**: `needs-decision` withholds a run's *start*; this withholds its *end*.
|
|
47
45
|
So a `needs-human-review` issue is still offered, and a child stopped by it **goes on holding its
|
|
48
46
|
repository** — `scripts/issue/issue-labels.ts` keeps it out of `NOT_DIRECTLY_RUNNABLE_LABELS` and
|
|
49
|
-
`scripts/epic/epic-busy.ts` keeps it out of the parked set
|
|
50
|
-
→ "Why it is not `needs-decision`").
|
|
47
|
+
`scripts/epic/epic-busy.ts` keeps it out of the parked set.
|
|
51
48
|
|
|
52
49
|
Each entry point's own branch stays in its own file — `fullrun.md`, `halfrun.md`,
|
|
53
50
|
`backlogrun.md` — and routes here for the definition.
|
|
@@ -59,8 +59,6 @@ gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=depth:1' # an Issue
|
|
|
59
59
|
- **An Issue carrying more than one counts as the lowest depth present.**
|
|
60
60
|
- **An `epic` takes no depth label** and is excluded from the share's denominator.
|
|
61
61
|
|
|
62
|
-
Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the depth label is applied at filing".
|
|
63
|
-
|
|
64
62
|
- **A discretionary observation at depth 1 or deeper is filed only where it can cite the depth-0 work
|
|
65
63
|
it stopped or delayed** — an Issue number or a run, never "this would slow runs down". **Cannot cite
|
|
66
64
|
one, it is not filed**: it goes to the ledger (`observation-ledger.md`); the blockage arriving or a
|
|
@@ -74,12 +72,9 @@ Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the depth
|
|
|
74
72
|
- **Cannot write both, it is not filed** — it goes to the ledger.
|
|
75
73
|
- **This narrows depth 2 alone, and the exemptions above carry over unchanged.**
|
|
76
74
|
|
|
77
|
-
Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why depth gates a discretionary filing".
|
|
78
|
-
|
|
79
75
|
**It governs this route only — the fourth row of `prerequisite.md`'s table.** A review finding routed
|
|
80
76
|
to branch 2 of `prompts/review.md` → "Review round cap" is filed under that section's own bar and
|
|
81
77
|
**does not take the depth test**. **That bar is the reason, and the subject's depth is not.**
|
|
82
|
-
Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why a review branch-2 filing skips the depth test".
|
|
83
78
|
|
|
84
79
|
**And a PR that *adds* a measurement names its reader in the same way** — the Issue that read the value
|
|
85
80
|
to decide something, or the path of the rule that reads it. **A measurement with no reader is not
|
|
@@ -98,8 +93,6 @@ added.** `route:tier-a` and `route:interrupt` carry over unchanged.
|
|
|
98
93
|
|
|
99
94
|
**Two readings of the same backlog give the same number.**
|
|
100
95
|
|
|
101
|
-
Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the depth-0 denominator is fixed".
|
|
102
|
-
|
|
103
96
|
**What the number is for is not decided here** — no `backlog:next` change and no target value until it
|
|
104
97
|
has been measured the same way more than once.
|
|
105
98
|
|
|
@@ -114,10 +107,3 @@ run's ceiling.
|
|
|
114
107
|
appends what is left.** **The 10-per-run ceiling for this route is the parent's to count.** **Lines
|
|
115
108
|
its own `review:record` and `measure:rerun` write are not this route** — they go to its issue's file in
|
|
116
109
|
its lane (`observation-ledger.md` → "The ledger — where an observation that cannot cite a blockage goes").
|
|
117
|
-
|
|
118
|
-
Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why a delegated child neither files nor appends".
|
|
119
|
-
|
|
120
|
-
**This file is the single source of every procedure above**; nothing under
|
|
121
|
-
`prompts/collaboration-workflow/` restates it.
|
|
122
|
-
|
|
123
|
-
Provenance: `docs/maintainers/observation-filing-rationale.md` → "Where each rule came from".
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
# The observation ledger — grammar, commit path and promotion
|
|
2
2
|
|
|
3
3
|
**Read only when the depth test in `observation-filing.md` turns an observation away, or a user
|
|
4
|
-
reports a bug** (its kind of miss, below), in the turn that appends the line.
|
|
5
|
-
ledger's grammar, commit path and second-sighting promotion. Provenance:
|
|
6
|
-
`docs/maintainers/observation-ledger-rationale.md` → "Where each rule came from".
|
|
4
|
+
reports a bug** (its kind of miss, below), in the turn that appends the line.
|
|
7
5
|
|
|
8
6
|
## The ledger — where an observation that cannot cite a blockage goes
|
|
9
7
|
|
|
10
|
-
**An observation the depth test turns away is recorded in the ledger, not discarded.**
|
|
11
|
-
`docs/maintainers/observation-ledger-rationale.md` → "Why the ledger exists".
|
|
8
|
+
**An observation the depth test turns away is recorded in the ledger, not discarded.**
|
|
12
9
|
|
|
13
10
|
- **The destination is the `.josh/observations/` directory in the repository the observation is
|
|
14
11
|
about**, **one file per issue**: `<N>.md` for the issue the run is executing (its branch's number,
|
|
@@ -60,8 +57,7 @@ blocked depth-0 work is filed as before.
|
|
|
60
57
|
|
|
61
58
|
## The commit path — how an appended line reaches the default branch
|
|
62
59
|
|
|
63
|
-
**An append nobody commits is an append nobody can count.**
|
|
64
|
-
`docs/maintainers/observation-ledger-rationale.md` → "Why the ledger has a commit path".
|
|
60
|
+
**An append nobody commits is an append nobody can count.**
|
|
65
61
|
|
|
66
62
|
- **A run's appended lines ride its own commit** — `pnpm josh git` stages `.josh/observations/`
|
|
67
63
|
(`scripts/git/git-staging.ts`). **Record before the commit, not after the merge:** a finding recorded
|
|
@@ -87,8 +83,7 @@ blocked depth-0 work is filed as before.
|
|
|
87
83
|
|
|
88
84
|
## The second sighting is what files it
|
|
89
85
|
|
|
90
|
-
**A repeat is the citation** — counted, not judged
|
|
91
|
-
→ "Why a second sighting files"):
|
|
86
|
+
**A repeat is the citation** — counted, not judged:
|
|
92
87
|
|
|
93
88
|
- **On `observation:record` answering `file`, the observation is filed**, at depth 1 or deeper, with
|
|
94
89
|
no depth-0 citation (only when exactly one earlier sighting exists).
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
The **pre-gate cut**: a dispatched lane child ends its process the moment implementation is done, and a
|
|
4
4
|
**fresh** process resumes the same lane from the gate onward, without the implementation's accumulated
|
|
5
|
-
context.
|
|
5
|
+
context.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
`run:cut` takes the boundary, `run:cut --resume` is the fresh
|
|
8
8
|
process's entry check. A second boundary — the implementation-phase cut, _during_ implementation — is
|
|
9
9
|
below; it states only what differs.
|
|
10
10
|
|
|
@@ -55,8 +55,7 @@ pnpm josh run:cut <N>
|
|
|
55
55
|
### The gate refuses until the cut has been taken
|
|
56
56
|
|
|
57
57
|
`pnpm josh rule:guard` **refuses `pnpm josh gate`** in a lane with no cut record carried, handing back
|
|
58
|
-
the command above.
|
|
59
|
-
guards, not prose".
|
|
58
|
+
the command above.
|
|
60
59
|
|
|
61
60
|
- **It fires for a marked child and nowhere else**: the working directory is `<lane root>/<issue
|
|
62
61
|
number>` **and** `JOSH_LANE_CHILD` names that issue. `run:cut` uses an open-lane lookup instead, so
|
|
@@ -66,8 +65,7 @@ guards, not prose".
|
|
|
66
65
|
- **It fires once per run.**
|
|
67
66
|
- **`--resume`, `--end` and `--json` do not count as taking the cut.**
|
|
68
67
|
|
|
69
|
-
Its row: `prompts/collaboration-workflow/rule-delivery.md`.
|
|
70
|
-
→ "Which suites pin each guard".
|
|
68
|
+
Its row: `prompts/collaboration-workflow/rule-delivery.md`.
|
|
71
69
|
|
|
72
70
|
## Resuming — the fresh process's entry check
|
|
73
71
|
|
|
@@ -92,8 +90,7 @@ pnpm josh run:cut --resume <N>
|
|
|
92
90
|
### The stage is passed to the resumed child, not reconstructed by it
|
|
93
91
|
|
|
94
92
|
**Skip the entry it has already done**: do not re-read the workflow skill, repeat the split assessment
|
|
95
|
-
or re-normalize the title; the plan and decisions are read back from the issue.
|
|
96
|
-
`docs/maintainers/pre-gate-cut-rationale.md` → "Why the resume carries what it carries".
|
|
93
|
+
or re-normalize the title; the plan and decisions are read back from the issue.
|
|
97
94
|
|
|
98
95
|
## What is carried, and what is not
|
|
99
96
|
|
|
@@ -127,21 +124,21 @@ Same `cost_verdict.per_request_cost` through `cost_cli.session_verdict` as `back
|
|
|
127
124
|
**The trigger**: `pnpm josh rule:guard` refuses an `Edit` / `Write` in a dispatched lane child over
|
|
128
125
|
threshold, handing back `pnpm josh run:cut --impl <N> --handoff <path>`. `cut` ends the turn; the
|
|
129
126
|
fresh process's `run:cut --resume <N>` answers `resume-impl` — **the implementation resume clears the
|
|
130
|
-
record**, so the cut may fire again. **A cut that relaunches its successor owes no Telegram
|
|
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
|
|
131
130
|
lane, `run:cut --impl` prints the held run's instruction: on `over`, keep the hold, send a
|
|
132
131
|
`confirmation` Telegram naming `fullrun #<N>`, end the turn. **It fires on every threshold crossing,
|
|
133
132
|
not once per run**; **An edit reissued right after a refusal passes**; **An unmeasurable session
|
|
134
|
-
warrants the cut**; **It is silent between a cut and its resume
|
|
135
|
-
|
|
136
|
-
(`scripts/rules/implementation-cut.ts`). A child that ended without cutting is detected by
|
|
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
|
|
137
135
|
`pnpm josh run:ending <N> --output <path>`.
|
|
138
136
|
|
|
139
137
|
## The threshold
|
|
140
138
|
|
|
141
139
|
`CONTEXT_CUT_THRESHOLD` and `cost_verdict.per_request_cost` live in
|
|
142
140
|
`scripts/cost-runtime/context-cut-payback.ts`; both cuts and the parent hand-off read the same verdict,
|
|
143
|
-
and an unmeasurable session is always cut.
|
|
144
|
-
"Why the threshold is a break-even". Both cuts end the turn **before** the gate, so the push is never a
|
|
141
|
+
and an unmeasurable session is always cut. Both cuts end the turn **before** the gate, so the push is never a
|
|
145
142
|
turn boundary (`chain-rule.md`).
|
|
146
143
|
|
|
147
144
|
## A lane child records its park before it stops
|
|
@@ -162,5 +159,3 @@ until then — **It fires once per run.** (`scripts/rules/lane-park.ts`).
|
|
|
162
159
|
fires; `pnpm josh rule:guard` refuses `AskUserQuestion` for a marked lane child on every occurrence — park the question instead.
|
|
163
160
|
`pnpm josh run:ending` lifts a slipped ask into the park basis (`scripts/rules/lane-interactive-ask.ts`,
|
|
164
161
|
`scripts/agent/interactive-ask.ts`).
|
|
165
|
-
|
|
166
|
-
Provenance of each rule: `docs/maintainers/pre-gate-cut-rationale.md` → "Where each rule came from".
|
|
@@ -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.
|
|
@@ -40,7 +40,6 @@ silence clock (`docs/josh-commands-run.md` → "`josh run:progress`").
|
|
|
40
40
|
`JOSH_PROGRESS_INTERVAL_MINUTES` moves both sides; `josh` → `progress_interval_minutes` in
|
|
41
41
|
`package.json` sits one step below it. **`--interval` moves the watcher alone** — quieter, never the
|
|
42
42
|
guard stricter.
|
|
43
|
-
Rationale: `docs/maintainers/progress-watcher-rationale.md` → "Why the heartbeat reads as it does".
|
|
44
43
|
|
|
45
44
|
### What a report says
|
|
46
45
|
|
|
@@ -61,8 +60,7 @@ off-screen, start `pnpm josh run:board --every <minutes>` in the background (`do
|
|
|
61
60
|
|
|
62
61
|
**A stop is the only interrupt**: a `backlogrun` that has stopped ends with
|
|
63
62
|
`pnpm josh run:carry --end --stopped "<reason>"`, which sends one ⏸️ confirmation; a parked child sends
|
|
64
|
-
its own (`backlogrun-park.md`).
|
|
65
|
-
signal tiers are split this way".
|
|
63
|
+
its own (`backlogrun-park.md`).
|
|
66
64
|
|
|
67
65
|
### Who starts it, and what counts as a report
|
|
68
66
|
|
|
@@ -85,7 +83,4 @@ tool result only you read is not one.** `--output` is omitted there, and `record
|
|
|
85
83
|
**A run that merges needs no teardown; a run that stops has to end the reporting itself** — **no
|
|
86
84
|
further `--wait` is started** after the stop notification, and the running one is stopped in the same
|
|
87
85
|
turn: `halfrun`'s stop before commit, a `needs-human-review`, split or prerequisite stop, a
|
|
88
|
-
`backlogrun` named issue's failure stop.
|
|
89
|
-
"Why the watcher runs where it does".
|
|
90
|
-
|
|
91
|
-
Provenance of each rule: `docs/maintainers/progress-watcher-rationale.md` → "Where each rule came from".
|
|
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
|
|
|
@@ -8,9 +8,6 @@ mark the step done. Read this file in full, in the same turn, before filing.
|
|
|
8
8
|
drained, *before* the idle watch, so the watch picks up what it files; a run that stops without
|
|
9
9
|
draining — the failure guard, `--idle 0` — still prints it at the stop position. Kit-only.
|
|
10
10
|
|
|
11
|
-
Rationale: `docs/maintainers/retrospective-rationale.md` → "Why the retrospective is read at its step";
|
|
12
|
-
provenance: `docs/maintainers/retrospective-rationale.md` → "Where each rule came from".
|
|
13
|
-
|
|
14
11
|
## The digest is read, not skimmed
|
|
15
12
|
|
|
16
13
|
The command `run:step` prints folds four existing measurements into one digest — it adds none:
|
|
@@ -30,9 +27,12 @@ and anything the run surfaced that lives outside it).
|
|
|
30
27
|
**The filing condition is the existing depth test, unchanged** (`observation-filing.md` → "The depth
|
|
31
28
|
test"). What cannot pass it is not filed — not a shortfall, just not yet a finding.
|
|
32
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.
|
|
33
|
+
|
|
33
34
|
**Order what passes by effect, and file the top two.** **The third onward is stacked in the observation
|
|
34
35
|
ledger** (drained by `pnpm josh observations:flush`). **File nothing when nothing passes.**
|
|
35
|
-
`docs/maintainers/retrospective-rationale.md` → "Why the top two are a selection, not a ration".
|
|
36
36
|
|
|
37
37
|
**Exclude what is already filed or already done, through the existing scout** (`issue-scout.md`): file
|
|
38
38
|
with `pnpm josh issue:file`, which scouts first — an **open** candidate covering it means do not file, a
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
# The split assessment — one definition, every entry point
|
|
2
2
|
|
|
3
3
|
Before any entry point starts work on an Issue, decide whether the request is **one** deliverable or
|
|
4
|
-
several.
|
|
5
|
-
`docs/maintainers/split-assessment-rationale.md` → "Why the default is not to split" and
|
|
6
|
-
`docs/maintainers/split-assessment-rationale.md` → "Why diff size is not a reason to split".
|
|
4
|
+
several. Every command applies it identically.
|
|
7
5
|
|
|
8
6
|
## The question
|
|
9
7
|
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**This file is the prefix's single source, read at its point of use — the moment an entry is typed with an
|
|
4
4
|
`owner/repo#` prefix (or a short `repo#` name), not at any entry.** A run given a bare `#N` or `new`
|
|
5
|
-
targets the session's own repository and never reaches it.
|
|
6
|
-
points here. Rationale: `docs/maintainers/target-repository-rationale.md` → "Why the prefix reads as it does".
|
|
5
|
+
targets the session's own repository and never reaches it.
|
|
7
6
|
|
|
8
7
|
Every entry point takes the target repository in front of the Issue reference. Without it the target
|
|
9
8
|
is the repository the session runs in.
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# The working-tree hold — one run per tree
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
release the tree. History: `docs/maintainers/working-tree-hold-rationale.md` → "Where each rule came from".
|
|
3
|
+
Read the moment a run is about to claim or release the tree.
|
|
5
4
|
|
|
6
5
|
**Ask `pnpm josh run:hold` before anything else, and obey what it answers** — the first call of
|
|
7
6
|
`fullrun` and `halfrun`, before the title, before `pnpm josh ms`, and **before a `new` entry files its
|
|
@@ -23,8 +22,7 @@ pnpm josh run:release --force # a record left behind by a run that has ended
|
|
|
23
22
|
|
|
24
23
|
**The unit is the working tree** — one branch, one index and one uncommitted diff, and a linked work
|
|
25
24
|
tree has its own three. **`backlogrun`'s per-repository guard (`epic-busy.ts`) is a separate layer.** **`kickoff`
|
|
26
|
-
does not claim it
|
|
27
|
-
tree").
|
|
25
|
+
does not claim it.**
|
|
28
26
|
|
|
29
27
|
**Claim it in the checkout the run will edit** — a cross-repository `fullrun owner/repo#N` resolves
|
|
30
28
|
that checkout from `pnpm josh doctor` **first** (a read) and claims there.
|
package/.codex/hooks.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"hooks": [
|
|
7
7
|
{
|
|
8
8
|
"type": "command",
|
|
9
|
-
"command": "project_root=\"$(
|
|
9
|
+
"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",
|
|
10
10
|
"timeout": 180
|
|
11
11
|
}
|
|
12
12
|
]
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"hooks": [
|
|
18
18
|
{
|
|
19
19
|
"type": "command",
|
|
20
|
-
"command": "project_root=\"$(
|
|
20
|
+
"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",
|
|
21
21
|
"timeout": 10
|
|
22
22
|
}
|
|
23
23
|
]
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
],
|
|
26
26
|
"PreToolUse": [
|
|
27
27
|
{
|
|
28
|
-
"matcher": "Bash|Edit|Read|Write|AskUserQuestion|apply_patch",
|
|
28
|
+
"matcher": "Bash|Edit|Read|Write|AskUserQuestion|Agent|Task|apply_patch",
|
|
29
29
|
"hooks": [
|
|
30
30
|
{
|
|
31
31
|
"type": "command",
|
|
32
|
-
"command": "project_root=\"$(
|
|
32
|
+
"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 codex-hook-adapter pretool",
|
|
33
33
|
"timeout": 20
|
|
34
34
|
}
|
|
35
35
|
]
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"hooks": [
|
|
42
42
|
{
|
|
43
43
|
"type": "command",
|
|
44
|
-
"command": "project_root=\"$(
|
|
44
|
+
"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 codex-hook-adapter posttool",
|
|
45
45
|
"timeout": 90
|
|
46
46
|
}
|
|
47
47
|
]
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"hooks": [
|
|
54
54
|
{
|
|
55
55
|
"type": "command",
|
|
56
|
-
"command": "project_root=\"$(
|
|
56
|
+
"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",
|
|
57
57
|
"timeout": 20
|
|
58
58
|
}
|
|
59
59
|
]
|
|
@@ -26,7 +26,7 @@ runs:
|
|
|
26
26
|
using: composite
|
|
27
27
|
steps:
|
|
28
28
|
- name: Setup Node.js
|
|
29
|
-
uses: actions/setup-node@
|
|
29
|
+
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
|
|
30
30
|
with:
|
|
31
31
|
node-version: '24'
|
|
32
32
|
registry-url: ${{ inputs.registry-url }}
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -493,7 +493,7 @@ jobs:
|
|
|
493
493
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
494
494
|
|
|
495
495
|
- name: Run security audit
|
|
496
|
-
uses: google/osv-scanner-action/osv-scanner-action@
|
|
496
|
+
uses: google/osv-scanner-action/osv-scanner-action@b1d267aea5211fa648d9d442fa64b90dbdcbdd36 # v2.7.0
|
|
497
497
|
with:
|
|
498
498
|
scan-args: --lockfile=pnpm-lock.yaml
|
|
499
499
|
|