@joshuafolkken/kit 1.1453.0 → 1.1471.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/skills/dependency-update/SKILL.md +26 -55
- package/.claude/skills/epic-commands/SKILL.md +87 -148
- package/.claude/skills/epic-commands/epic-bundle.md +45 -77
- package/.claude/skills/epic-commands/execution-waves.md +44 -81
- package/.claude/skills/verify-ui/SKILL.md +25 -50
- package/.claude/skills/workflow-commands/background-commands.md +36 -47
- package/.claude/skills/workflow-commands/backlogrun-child.md +72 -85
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +91 -121
- package/.claude/skills/workflow-commands/backlogrun-park.md +73 -117
- package/.claude/skills/workflow-commands/backlogrun-progress.md +7 -9
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +11 -20
- package/.claude/skills/workflow-commands/backlogrun-steps.md +43 -52
- package/.claude/skills/workflow-commands/chain-rule.md +24 -34
- package/.claude/skills/workflow-commands/followup.md +57 -76
- package/.claude/skills/workflow-commands/halfrun.md +2 -1
- package/.claude/skills/workflow-commands/issue-comments.md +43 -60
- package/.claude/skills/workflow-commands/kickoff.md +65 -74
- package/.claude/skills/workflow-commands/observation-filing.md +62 -107
- package/.claude/skills/workflow-commands/observation-ledger.md +56 -111
- package/.claude/skills/workflow-commands/pre-gate-cut.md +89 -138
- package/.claude/skills/workflow-commands/prerequisite.md +10 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +21 -26
- package/.claude/skills/workflow-commands/prrun.md +2 -1
- package/.claude/skills/workflow-commands/retrospective.md +31 -50
- package/.claude/skills/workflow-commands/split-assessment.md +34 -58
- package/.claude/skills/workflow-commands/working-tree-hold.md +54 -71
- package/CLAUDE.md +7 -6
- package/README.md +2 -9
- package/dist/CLAUDE.md +7 -6
- package/dist/hooks/batch-guard.js +6 -6
- package/dist/hooks/{chunk-Y3GKIKGW.js → chunk-43ZHT22P.js} +31 -15
- package/dist/hooks/{chunk-MBJYQPEK.js → chunk-AS74OU3D.js} +24 -8
- package/dist/hooks/{chunk-3C4XRYG6.js → chunk-E7OIKX5Z.js} +17 -12
- package/dist/hooks/{chunk-Z4XI7CZS.js → chunk-EUMACUK2.js} +18 -12
- package/dist/hooks/{chunk-NO4AALP5.js → chunk-H5HVWYXK.js} +4 -4
- package/dist/hooks/{chunk-5C7L6FRC.js → chunk-IIGFYXKC.js} +346 -241
- package/dist/hooks/{chunk-W5ZKGTSY.js → chunk-J47HU5H5.js} +14 -3
- package/dist/hooks/{chunk-OLMO72ON.js → chunk-K4EOONYM.js} +1 -1
- package/dist/hooks/{chunk-LBFYEOXJ.js → chunk-K4LMBQC2.js} +4 -4
- package/dist/hooks/{chunk-D3NJXN5M.js → chunk-KC5AK2GF.js} +8 -6
- package/dist/hooks/chunk-SHGPANFB.js +56 -0
- package/dist/hooks/{chunk-EF5GQ6WS.js → chunk-YHBZAJSV.js} +3 -3
- package/dist/hooks/{chunk-SHYUQOIS.js → chunk-YYPI7SJZ.js} +5 -5
- package/dist/hooks/codex-hook-adapter.js +13 -13
- package/dist/hooks/duplicate-read-guard.js +7 -7
- package/dist/hooks/format-edited.js +3 -3
- package/dist/hooks/inputs.json +251 -247
- package/dist/hooks/investigation-guard.js +7 -7
- package/dist/hooks/pretool-guard.js +12 -12
- package/dist/hooks/session-lang.js +6 -5
- package/dist/hooks/stop-guard.js +75 -18
- package/dist/josh.js +6 -7
- package/dist/managed-marker/index.js +1 -2
- package/dist/version/index.js +15 -12
- package/eslint/base.js +2 -1
- package/eslint/rules/unicorn.js +16 -0
- package/package.json +3 -3
- package/prompts/coding-standards.md +12 -22
- package/prompts/collaboration-workflow/file-edits.md +26 -44
- package/prompts/collaboration-workflow/gh-rest.md +20 -36
- package/prompts/collaboration-workflow/glossary.md +5 -7
- package/prompts/collaboration-workflow/issue-citation.md +7 -13
- package/prompts/collaboration-workflow/issue-template.md +29 -29
- package/prompts/collaboration-workflow/operating-rules.md +35 -44
- package/prompts/collaboration-workflow/output-bounds.md +15 -15
- package/prompts/collaboration-workflow/overview.md +14 -19
- package/prompts/collaboration-workflow/plan-comment.md +13 -13
- package/prompts/collaboration-workflow/principles.md +50 -53
- package/prompts/collaboration-workflow/proposal-request.md +1 -9
- package/prompts/collaboration-workflow/report-format.md +32 -49
- package/prompts/collaboration-workflow/residency.md +10 -10
- package/prompts/collaboration-workflow/rule-delivery.md +9 -9
- package/prompts/collaboration-workflow/shell-body.md +11 -21
- package/prompts/collaboration-workflow/turn-batching.md +8 -14
- package/prompts/collaboration-workflow/upstream-interrupt.md +26 -34
- package/prompts/collaboration-workflow/wip-cap.md +24 -30
- package/prompts/collaboration-workflow.md +24 -25
- package/prompts/refactoring.md +33 -43
- package/prompts/review-rubric.md +84 -129
- package/prompts/review.md +111 -141
- package/prompts/sonar-hotspot-handling.md +22 -50
- package/prompts/testing-guide.md +48 -99
- package/scripts/adopt/adopt-toolkits.ts +2 -4
- package/scripts/agent/agent-exit-record.ts +23 -1
- package/scripts/agent/codex-agent-argv.ts +7 -2
- package/scripts/backlog/backlog-budget-cli.ts +1 -2
- package/scripts/backlog/backlog-drive-carried.ts +26 -0
- package/scripts/backlog/backlog-drive-cli.ts +10 -5
- package/scripts/backlog/backlog-drive-named.ts +2 -4
- package/scripts/backlog/backlog-drive-restore.ts +19 -1
- package/scripts/backlog/backlog-drive-seats.ts +27 -0
- package/scripts/backlog/backlog-drive.ts +11 -6
- package/scripts/backlog/backlog-ready.ts +13 -6
- package/scripts/behavior/behavior-rules.ts +3 -2
- package/scripts/cost-runtime/codex-usage.ts +4 -2
- package/scripts/cost-runtime/cost-cli.ts +1 -2
- package/scripts/delegation/investigation-guard.ts +1 -1
- package/scripts/delegation/investigation-reads.ts +1 -1
- package/scripts/discovery/repo-discovery.ts +4 -2
- package/scripts/discovery/repo-origin.ts +2 -4
- package/scripts/doctor/doctor-logic.ts +6 -3
- package/scripts/document/document-byte-budget.ts +27 -27
- package/scripts/document/document-byte-check.ts +1 -2
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/epic/epic-audit-rationale.ts +8 -2
- package/scripts/epic/epic-bundle-cli.ts +1 -2
- package/scripts/epic/epic-chains.ts +6 -2
- package/scripts/epic/epic-close-comment.ts +1 -2
- package/scripts/gate/verification-gate.ts +7 -2
- package/scripts/gh/git-pr-ai-review.ts +12 -1
- package/scripts/gh/git-pr-confirmation.ts +11 -7
- package/scripts/gh/git-pr.ts +6 -2
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +16 -9
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/hooks/format-edited-file.ts +10 -4
- package/scripts/hooks/pre-push-unit.ts +15 -4
- package/scripts/hooks/pretool-guard.ts +23 -29
- package/scripts/hooks/step-zero-notice.ts +3 -2
- package/scripts/init/hook-command-rewrite.ts +6 -2
- package/scripts/init/init-logic-deploy-vps.ts +4 -2
- package/scripts/issue/behavior-change-lint.ts +12 -6
- package/scripts/issue/issue-scout-cli.ts +3 -2
- package/scripts/josh/file-map-stamp.ts +1 -3
- package/scripts/josh/hook-decision.ts +17 -2
- package/scripts/josh/josh-commands-workflow.ts +1 -1
- package/scripts/lane/lane-await.ts +3 -2
- package/scripts/lane/lane-child-invocation.ts +14 -1
- package/scripts/lane/lane-guard-policy.ts +4 -4
- package/scripts/lane/lane-ledger.ts +9 -0
- package/scripts/lane/lane-load.ts +9 -2
- package/scripts/lane/lane-measure-cli.ts +2 -0
- package/scripts/lane/lane-parked.ts +18 -0
- package/scripts/lane/lane-process-load.ts +125 -0
- package/scripts/lane/lane-process-stats.ts +93 -0
- package/scripts/lane/lane-registry.ts +8 -3
- package/scripts/lane/lane-session-broker.ts +29 -5
- package/scripts/lane/lane-spent.ts +14 -3
- package/scripts/lane/lane-stats.ts +1 -0
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/confirmation-options.ts +59 -0
- package/scripts/notify/notify-opt-in.ts +33 -0
- package/scripts/notify/telegram-notify.ts +25 -8
- package/scripts/notify/telegram-test-logic.ts +33 -1
- package/scripts/notify/telegram-test.ts +4 -2
- package/scripts/overrides/lockfile-overrides.ts +1 -3
- package/scripts/propagate/propagate.ts +1 -2
- package/scripts/release/release-progress.ts +3 -2
- package/scripts/report/report-lint.ts +7 -4
- package/scripts/review/review-record-cli.ts +6 -2
- package/scripts/rules/destructive-command.ts +6 -9
- package/scripts/rules/direct-filing.ts +3 -7
- package/scripts/rules/early-heartbeat.ts +7 -18
- package/scripts/rules/file-body.ts +6 -13
- package/scripts/rules/filing-cap.ts +3 -6
- package/scripts/rules/git-force.ts +5 -9
- package/scripts/rules/implementation-cut.ts +37 -35
- package/scripts/rules/index-guard.ts +4 -7
- package/scripts/rules/issue-comments.ts +5 -15
- package/scripts/rules/josh-git-bare.ts +3 -6
- package/scripts/rules/lane-background.ts +10 -21
- package/scripts/rules/lane-carry-conflict.ts +7 -17
- package/scripts/rules/lane-interactive-ask.ts +6 -11
- package/scripts/rules/lane-park.ts +5 -13
- package/scripts/rules/lane-split-park.ts +2 -7
- package/scripts/rules/lane-switch-main.ts +9 -12
- package/scripts/rules/oracle-consulted.ts +4 -5
- package/scripts/rules/piped-verification.ts +81 -31
- package/scripts/rules/poll-loop.ts +7 -17
- package/scripts/rules/pre-gate-cut.ts +7 -21
- package/scripts/rules/prior-comment-read.ts +7 -5
- package/scripts/rules/protected-files.ts +5 -9
- package/scripts/rules/raw-field-body.ts +3 -7
- package/scripts/rules/rule-body-guard.ts +4 -11
- package/scripts/rules/run-tail-rule.ts +6 -22
- package/scripts/rules/shell-body-trigger.ts +7 -8
- package/scripts/rules/shell-segments.ts +7 -0
- package/scripts/rules/stop-rules.ts +17 -29
- package/scripts/rules/test-declared-commit.ts +4 -10
- package/scripts/rules/third-party-write.ts +5 -10
- package/scripts/rules/worktree-guard.ts +5 -12
- package/scripts/run/board/run-board-github.ts +11 -3
- package/scripts/run/board/run-board-idle.ts +31 -0
- package/scripts/run/board/run-board-read.ts +9 -12
- package/scripts/run/board/run-board-reason.ts +7 -3
- package/scripts/run/board/run-board-state.ts +4 -0
- package/scripts/run/board/run-board-status.ts +18 -3
- package/scripts/run/board/run-board-thanks.ts +7 -2
- package/scripts/run/board/run-board-tick.ts +32 -7
- package/scripts/run/carry/run-carry-args.ts +1 -3
- package/scripts/run/carry/run-carry-conversation.ts +7 -2
- package/scripts/run/cut/run-cut-cli.ts +15 -20
- package/scripts/run/cut/run-cut-decline.ts +72 -0
- package/scripts/run/cut/run-cut-ready.ts +74 -0
- package/scripts/run/cut/run-cut-report.ts +13 -0
- package/scripts/run/cut/run-cut.ts +10 -1
- package/scripts/run/entry/run-entry-stop.ts +6 -3
- package/scripts/run/hold/run-hold-cli.ts +14 -3
- package/scripts/run/hold/run-hold.ts +6 -3
- package/scripts/run/merge/run-merge-cli.ts +30 -7
- package/scripts/run/merge/run-merge-ship.ts +59 -1
- package/scripts/run/merge/run-merge.ts +3 -2
- package/scripts/run/run-ending.ts +31 -3
- package/scripts/run/run-parent-cut-hook.ts +5 -10
- package/scripts/run/run-preflight.ts +1 -2
- package/scripts/run/run-stop-notify.ts +3 -2
- package/scripts/run/run-watcher-guard.ts +6 -3
- package/scripts/run/ship/run-ship-review-steps.ts +13 -4
- package/scripts/run/ship/run-ship-review.ts +15 -2
- package/scripts/run/tidy/run-tidy-cli.ts +3 -3
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -2
- package/scripts/safe-chain/project-config.ts +7 -2
- package/scripts/sync/sync-hook-safety.ts +8 -2
- package/scripts/test/unit-worker-share.ts +3 -2
- package/scripts/time-runtime/time-batch-guard.ts +3 -3
- package/scripts/time-runtime/time-hook-transcript.ts +3 -2
- package/scripts/time-runtime/time-shell.ts +10 -0
- package/scripts/version/effective-upstream.ts +3 -4
- package/scripts/version/kit-version-config.ts +8 -2
- package/scripts/version/latest-corepack.ts +1 -2
- package/scripts/version/release-hold.ts +11 -4
- package/scripts/version/version-commands.ts +12 -4
- package/dist/hooks/chunk-UT7YC3N2.js +0 -56
|
@@ -13,9 +13,8 @@ point-of-use document, never an entry read, and the single source of the heartbe
|
|
|
13
13
|
pnpm josh run:progress --wait --output <the transcript path of each delegated unit> # in the background
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
**Start it once; it reports by itself.** Each silence interval appends the
|
|
17
|
-
|
|
18
|
-
standard output and keeps running — so a scheduled report never wakes the session, and the session
|
|
16
|
+
**Start it once; it reports by itself.** Each silence interval appends the five labelled lines to the
|
|
17
|
+
event stream and the ambient log, prints nothing to standard output and keeps running — the session
|
|
19
18
|
relays none. **It exits only on one of three, and the command computes which:**
|
|
20
19
|
|
|
21
20
|
| Exit | What the session does |
|
|
@@ -27,22 +26,20 @@ relays none. **It exits only on one of three, and the command computes which:**
|
|
|
27
26
|
**A report is not an exit, and neither is a decline** — with no run recorded it keeps waiting, and the
|
|
28
27
|
`--hours` exit says so on standard error.
|
|
29
28
|
|
|
30
|
-
**`pnpm josh run:watcher:guard` detects a missed restart
|
|
31
|
-
|
|
32
|
-
flight and the watcher's life record has gone stale — once per run, so the restart is not blocked.
|
|
29
|
+
**`pnpm josh run:watcher:guard` detects a missed restart** — via `pretool-guard` it refuses the next
|
|
30
|
+
tool call while lane children are in flight and the watcher's record is stale, once per run.
|
|
33
31
|
|
|
34
|
-
**`--mark` at every real report
|
|
35
|
-
`
|
|
36
|
-
never a timer (`docs/josh-commands-run.md` → "`josh run:progress`").
|
|
32
|
+
**`--mark` at every real report** — `pnpm josh run:progress --mark` in the same turn restarts the
|
|
33
|
+
silence clock (`docs/josh-commands-run.md` → "`josh run:progress`").
|
|
37
34
|
|
|
38
|
-
**Do not keep a progress clock of your own** — the hook refuses the arm
|
|
35
|
+
**Do not keep a progress clock of your own** — the hook refuses the arm
|
|
39
36
|
(`scripts/rules/early-heartbeat.ts` → `decide`), though a single correctly-spaced arm is allowed.
|
|
40
37
|
`--wait` is not a wait timer.
|
|
41
38
|
|
|
42
39
|
**The default interval is twenty minutes, overridable — by the person, not the run.**
|
|
43
|
-
`JOSH_PROGRESS_INTERVAL_MINUTES` moves both sides
|
|
44
|
-
`
|
|
45
|
-
|
|
40
|
+
`JOSH_PROGRESS_INTERVAL_MINUTES` moves both sides; `josh` → `progress_interval_minutes` in
|
|
41
|
+
`package.json` sits one step below it. **`--interval` moves the watcher alone** — quieter, never the
|
|
42
|
+
guard stricter.
|
|
46
43
|
Rationale: `docs/maintainers/progress-watcher-rationale.md` → "Why the heartbeat reads as it does".
|
|
47
44
|
|
|
48
45
|
### What a report says
|
|
@@ -75,21 +72,19 @@ signal tiers are split this way".
|
|
|
75
72
|
`JOSH_LANE_CHILD` mark** — it still runs `--mark` for the parent's clock, but every reporting form
|
|
76
73
|
(`--wait`, `--once`, the default watch) exits at once with a notice.
|
|
77
74
|
|
|
78
|
-
**It is started in the target repository's checkout, and `--mark` is run there too.**
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
**It is started in the target repository's checkout, and `--mark` is run there too.** It beats from the
|
|
76
|
+
moment a run has started — a registered lane, a held work tree or a carried budget; only a checkout
|
|
77
|
+
with no run recorded stays silent.
|
|
81
78
|
|
|
82
79
|
**In a single-issue run, a real report is any turn that puts a progress statement in front of the
|
|
83
|
-
person** —
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
notification, and the running `--wait` is stopped in the same turn, since no report ends it. That
|
|
92
|
-
covers `halfrun`'s stop before commit, a `needs-human-review` stop, a split or prerequisite stop, and a
|
|
80
|
+
person** — `--mark` in the same turn as each: **the Step 0 work summary, the pull request opening, each
|
|
81
|
+
review round's verdict, and any `confirmation` / `failure` / `completion` notification or stop.** **A
|
|
82
|
+
tool result only you read is not one.** `--output` is omitted there, and `record` reads `unread`. In a
|
|
83
|
+
`backlogrun`, a child merged, parked or stopped is the report.
|
|
84
|
+
|
|
85
|
+
**A run that merges needs no teardown; a run that stops has to end the reporting itself** — **no
|
|
86
|
+
further `--wait` is started** after the stop notification, and the running one is stopped in the same
|
|
87
|
+
turn: `halfrun`'s stop before commit, a `needs-human-review`, split or prerequisite stop, a
|
|
93
88
|
`backlogrun` named issue's failure stop. Rationale: `docs/maintainers/progress-watcher-rationale.md` →
|
|
94
89
|
"Why the watcher runs where it does".
|
|
95
90
|
|
|
@@ -27,7 +27,8 @@ Where `fullrun` runs `pnpm josh followup` and merges, `prrun` does three things
|
|
|
27
27
|
follows for finishing without an agent:
|
|
28
28
|
`pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'prrun ready to
|
|
29
29
|
merge: <pr-url>\nNext: fullrun #<N>\nAfter a manual merge, without an agent: pnpm josh followup
|
|
30
|
-
"<title> #<N>"'
|
|
30
|
+
"<title> #<N>"' --recommended "fullrun #<N>" --alternative "Merge by hand, then pnpm josh
|
|
31
|
+
followup"`. The stop report names the same two, in the same order.
|
|
31
32
|
|
|
32
33
|
**Invoking `prrun` is _not_ authorization to merge** — never run `pnpm josh followup` without
|
|
33
34
|
`--no-merge` in a `prrun`. After a person merges by hand, the same `pnpm josh followup "<title> #<N>"`
|
|
@@ -1,75 +1,56 @@
|
|
|
1
1
|
# The end-of-run retrospective
|
|
2
2
|
|
|
3
|
-
**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
Everything that decides *how* — what the four sections mean, how the top two are chosen, the
|
|
7
|
-
exclusions, and the `auto-ok` judgement — is here. Read it in full, in the same turn, before filing.
|
|
3
|
+
**Read it when `run:step` prints the retrospective step — not at the entry.** `SKILL.md` → §2's table
|
|
4
|
+
keeps the rule: run what `run:step` prints once, file the improvements worth carrying, stack the rest,
|
|
5
|
+
mark the step done. Read this file in full, in the same turn, before filing.
|
|
8
6
|
|
|
9
|
-
**When it fires is not
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
picks up; a run that stops without draining — the failure guard, `--idle 0` — still prints it at the
|
|
13
|
-
stop position. It is kit-only — `run:step` prints the step only in the kit repository.
|
|
7
|
+
**When it fires is not a judgement.** `run:step` prints the step when `backlog:offer` marks the backlog
|
|
8
|
+
drained, *before* the idle watch, so the watch picks up what it files; a run that stops without
|
|
9
|
+
draining — the failure guard, `--idle 0` — still prints it at the stop position. Kit-only.
|
|
14
10
|
|
|
15
11
|
Rationale: `docs/maintainers/retrospective-rationale.md` → "Why the retrospective is read at its step";
|
|
16
12
|
provenance: `docs/maintainers/retrospective-rationale.md` → "Where each rule came from".
|
|
17
13
|
|
|
18
14
|
## The digest is read, not skimmed
|
|
19
15
|
|
|
20
|
-
The command `run:step` prints folds four measurements
|
|
21
|
-
new measurement (the observation-filing rule against readerless numbers). Read each section for what it
|
|
22
|
-
is for:
|
|
16
|
+
The command `run:step` prints folds four existing measurements into one digest — it adds none:
|
|
23
17
|
|
|
24
|
-
- **Run cost & time by role.** A role whose
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
- **Observation ledger.** How many observations are already held without being filed — a reminder to
|
|
31
|
-
promote one a second sighting has now earned, rather than a fresh finding.
|
|
32
|
-
- **Run events.** The parks, outages, cuts and review rounds the run hit — where it did not run
|
|
33
|
-
straight through.
|
|
18
|
+
- **Run cost & time by role.** A role whose wall-clock share runs ahead of its cost share is marked
|
|
19
|
+
`waiting-heavy` — a candidate improvement, not a verdict: some roles wait by design.
|
|
20
|
+
- **Recurring review findings.** A category that keeps coming back is friction the reviews keep
|
|
21
|
+
catching; the zero-finding denominator separates a quiet category from an unexamined one.
|
|
22
|
+
- **Observation ledger.** Observations held without being filed — promote one a second sighting earned.
|
|
23
|
+
- **Run events.** The parks, outages, cuts and review rounds — where the run did not run straight through.
|
|
34
24
|
|
|
35
|
-
The
|
|
36
|
-
|
|
37
|
-
outside it).
|
|
25
|
+
The two targets are **the run itself** (sections one, three, four) and **the repository** (section two,
|
|
26
|
+
and anything the run surfaced that lives outside it).
|
|
38
27
|
|
|
39
28
|
## What to file, and how the top two are chosen
|
|
40
29
|
|
|
41
|
-
**The filing condition is the existing depth test, unchanged**
|
|
42
|
-
|
|
43
|
-
test"). An improvement that cannot pass the test is not filed; it is not a shortfall of the two-item
|
|
44
|
-
count, it simply is not yet a finding.
|
|
30
|
+
**The filing condition is the existing depth test, unchanged** (`observation-filing.md` → "The depth
|
|
31
|
+
test"). What cannot pass it is not filed — not a shortfall, just not yet a finding.
|
|
45
32
|
|
|
46
33
|
**Order what passes by effect, and file the top two.** **The third onward is stacked in the observation
|
|
47
|
-
ledger
|
|
48
|
-
nothing passes** — a run whose measurements show no improvement worth carrying files zero Issues.
|
|
34
|
+
ledger** (drained by `pnpm josh observations:flush`). **File nothing when nothing passes.**
|
|
49
35
|
`docs/maintainers/retrospective-rationale.md` → "Why the top two are a selection, not a ration".
|
|
50
36
|
|
|
51
|
-
**Exclude what is already filed or already done, through the existing scout** (`issue-scout.md`)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
already merged. Neither exclusion is a new mechanism. The same call runs `epic:bundle` on each new
|
|
55
|
-
Issue, as after any filing.
|
|
37
|
+
**Exclude what is already filed or already done, through the existing scout** (`issue-scout.md`): file
|
|
38
|
+
with `pnpm josh issue:file`, which scouts first — an **open** candidate covering it means do not file, a
|
|
39
|
+
`(closed)` one means already merged. It also runs `epic:bundle` on each new Issue.
|
|
56
40
|
|
|
57
41
|
## `auto-ok`, and closing the step
|
|
58
42
|
|
|
59
|
-
**What a retrospective files is judged for `auto-ok`** —
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
43
|
+
**What a retrospective files is judged for `auto-ok`** — one needing no person's judgement declares
|
|
44
|
+
`- 人の判断: 不要`, so `issue:file` applies the label (with the run label
|
|
45
|
+
`prompts/collaboration-workflow/issue-template.md` requires). **`backlogrun-steps.md` → "What one
|
|
46
|
+
invocation approves" is that judgement's single source.** Every brake still counts these filings: the
|
|
63
47
|
ten-per-invocation ceiling, the WIP cap, `--max` and the 150,000-token session budget.
|
|
64
48
|
|
|
65
49
|
**Close with `pnpm josh run:carry --retrospective --summary "<result>" --owner "$PPID"`.** It marks the
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
stream, so a zero-filing retrospective differs from one that never ran; name
|
|
71
|
-
the issues filed (or that none were) and the candidates dropped with why.
|
|
50
|
+
carry record so `run:step` prints `stop` from then on; the mark survives a session cut and is removed at
|
|
51
|
+
`pnpm josh run:carry --end`, so one invocation runs it exactly once. **`--summary` is required** — it is
|
|
52
|
+
written as a `retrospective` event, so a zero-filing retrospective differs from one that never ran; name
|
|
53
|
+
the issues filed (or none) and the candidates dropped with why.
|
|
72
54
|
|
|
73
|
-
**A dispatched lane child never reaches any of this** — the batch runs
|
|
74
|
-
|
|
75
|
-
`stop` for a lane child at the stop position, so a child never prints the step to begin with.
|
|
55
|
+
**A dispatched lane child never reaches any of this** — the batch runs it at its own end; `run:step`
|
|
56
|
+
answers `stop` for a lane child at the stop position.
|
|
@@ -1,52 +1,43 @@
|
|
|
1
1
|
# The split assessment — one definition, every entry point
|
|
2
2
|
|
|
3
|
-
Before any entry point starts work on an Issue, decide whether the request is
|
|
4
|
-
|
|
3
|
+
Before any entry point starts work on an Issue, decide whether the request is **one** deliverable or
|
|
4
|
+
several. This file is the single definition; every command applies it identically. Reasons:
|
|
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".
|
|
5
7
|
|
|
6
8
|
## The question
|
|
7
9
|
|
|
8
|
-
**The default is not to split.** Two questions have to answer yes **together
|
|
9
|
-
leaves the work as one Issue:
|
|
10
|
+
**The default is not to split.** Two questions have to answer yes **together**:
|
|
10
11
|
|
|
11
12
|
1. **Does the request contain two or more deliverables that could each be merged separately?**
|
|
12
13
|
2. **Does the whole of it clearly exceed what one verification gate can confirm in one pass?** The
|
|
13
14
|
guide is **about 10 changed files and about 400 changed lines** (test files excluded).
|
|
14
15
|
Under that, it is one Issue however many separable pieces a reader can name inside it.
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
**The guide is a guide, and "clearly" is the operative word.** A run that has to argue itself past the
|
|
21
|
-
numbers has already answered no. They are read against the whole request's estimate, not against the
|
|
22
|
-
diff a first pass happens to produce, and a request that lands at 11 files is not thereby a split.
|
|
17
|
+
A change that must land in one commit to be correct is one deliverable however big it is; **separability
|
|
18
|
+
alone no longer splits anything**. **"Clearly" is the operative word** — a run that has to argue past
|
|
19
|
+
the numbers has answered no. They are read against the whole request's estimate, and 11 files is not
|
|
20
|
+
thereby a split.
|
|
23
21
|
|
|
24
22
|
## The same two questions decide the filing-time fold
|
|
25
23
|
|
|
26
24
|
**The entry's split decision and the filing-time fold decision are the same two conditions, stated
|
|
27
|
-
here once
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
`
|
|
31
|
-
`
|
|
32
|
-
does. A diff with no non-test file, or none readable, answers `undetermined`: the size is then the
|
|
33
|
-
whole request's estimate above. **There is no second criterion.** `observation-filing.md`'s observation, the review round cap's branch 2 and `prerequisite.md`'s
|
|
25
|
+
here once** — the fold asks whether *several findings from one session* are one Issue, with the same
|
|
26
|
+
conjunction. `pnpm josh issue:fold "<title>" …` answers `fold` / `separate` / `no-fold-needed`; its size
|
|
27
|
+
half is `pnpm josh split:assess`, called not recomputed. A diff with no readable non-test file answers
|
|
28
|
+
`undetermined`, and the size is the request's estimate. **There is no second criterion.**
|
|
29
|
+
`observation-filing.md`'s observation, the review round cap's branch 2 and `prerequisite.md`'s
|
|
34
30
|
prerequisite each route a second filing through it — `pnpm josh issue:file` asks it itself at the
|
|
35
31
|
run's second filing, never the first, and holds only a `fold`.
|
|
36
32
|
|
|
37
33
|
## Diff size is not a reason to split, and that is measured
|
|
38
34
|
|
|
39
|
-
**Size is a bar a split has to clear; it is never a reason to split.**
|
|
40
|
-
|
|
41
|
-
size threshold that splits more is required to say why the round-1 measurement does not reach it.**
|
|
42
|
-
Rationale: `docs/maintainers/split-assessment-rationale.md` → "Why the default is not to split" and
|
|
43
|
-
`docs/maintainers/split-assessment-rationale.md` → "Why diff size is not a reason to split".
|
|
35
|
+
**Size is a bar a split has to clear; it is never a reason to split.** **A proposal to add a size
|
|
36
|
+
threshold that splits more is required to say why the round-1 measurement does not reach it.**
|
|
44
37
|
|
|
45
|
-
**The size half is measured, not eyeballed — `pnpm josh split:assess
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
estimate. It answers the **size** question only; separability (question 1) stays a judgement, which is
|
|
49
|
-
why a `split` from this command is the size condition met, not a decision to divide the Issue.
|
|
38
|
+
**The size half is measured, not eyeballed — `pnpm josh split:assess`** counts the branch's changed
|
|
39
|
+
files and lines, test files excluded, and answers `split` / `single` on size alone. Separability stays
|
|
40
|
+
a judgement, so its `split` is the size condition met, not a decision to divide.
|
|
50
41
|
|
|
51
42
|
## What each entry point does with the answer
|
|
52
43
|
|
|
@@ -59,26 +50,19 @@ why a `split` from this command is the size condition met, not a decision to div
|
|
|
59
50
|
|
|
60
51
|
## A prerequisite is not a split
|
|
61
52
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
single source; each entry's own branch is in `backlogrun-park.md` → "A prerequisite discovered mid-run" and, for
|
|
66
|
-
the stopping entry points, in `fullrun.md` / `halfrun.md`.
|
|
53
|
+
A split means the request contains several deliverables; a prerequisite means it is **one** deliverable
|
|
54
|
+
with another in front of it. `prerequisite.md` is the single source; each entry's branch is in
|
|
55
|
+
`backlogrun-park.md` → "A prerequisite discovered mid-run" and `fullrun.md` / `halfrun.md`.
|
|
67
56
|
|
|
68
57
|
## Two or more always means an epic
|
|
69
58
|
|
|
70
59
|
**Splitting into two or more Issues always creates an epic. There is no count threshold and no ordering
|
|
71
|
-
condition to evaluate.**
|
|
72
|
-
|
|
73
|
-
the whole point of one definition is that where the split was noticed cannot change what happens next.
|
|
74
|
-
|
|
75
|
-
The epic is the non-closing home for the split rationale. A comment on the first child is buried the
|
|
76
|
-
moment that child merges and closes.
|
|
60
|
+
condition to evaluate.** **An entry point that applies a different condition is a defect.** The epic
|
|
61
|
+
is the non-closing home for the split rationale.
|
|
77
62
|
|
|
78
63
|
**Each split child is filed with the `route:split` label** —
|
|
79
|
-
`pnpm josh issue:file "<sub-title>" --body-file <body-file> --depth <n> --route split` —
|
|
80
|
-
|
|
81
|
-
is judged for `auto-ok` like any filing (`kickoff.md` → "Words typed after `new`").
|
|
64
|
+
`pnpm josh issue:file "<sub-title>" --body-file <body-file> --depth <n> --route split` — and judged for
|
|
65
|
+
`auto-ok` like any filing (`kickoff.md` → "Words typed after `new`").
|
|
82
66
|
|
|
83
67
|
## Promote, or create a new epic
|
|
84
68
|
|
|
@@ -87,33 +71,25 @@ on the Issue, without asking.
|
|
|
87
71
|
|
|
88
72
|
- **`#N` is a request, a discussion, or a container → promote it.**
|
|
89
73
|
`pnpm josh epic --promote <N> <N1> <N2> ... [--ordered]`. The body is appended to, never replaced.
|
|
90
|
-
- **`#N` is itself one of the deliverables → keep `#N` as a child and create a new epic
|
|
91
|
-
that
|
|
92
|
-
with nowhere to live.
|
|
74
|
+
- **`#N` is itself one of the deliverables → keep `#N` as a child and create a new epic** — e.g. a bug
|
|
75
|
+
report that needs three fixes.
|
|
93
76
|
|
|
94
77
|
## `backlogrun` is the one entry that does not stop
|
|
95
78
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
what creates the epic (`backlogrun-child.md` → "When `#N` is not an epic"). The assessment itself is identical;
|
|
99
|
-
only what follows the answer differs.
|
|
79
|
+
A split found under `backlogrun` is filed and continued through — including from a bare, non-epic
|
|
80
|
+
Issue, where the split creates the epic (`backlogrun-child.md` → "When `#N` is not an epic").
|
|
100
81
|
|
|
101
82
|
## Finding a split mid-run stops the run
|
|
102
83
|
|
|
103
|
-
`fullrun` and `halfrun` **stop** after filing the children and the epic
|
|
104
|
-
|
|
105
|
-
merging **one** Issue; a batch of N is a different authorization. Report what was filed and end with:
|
|
84
|
+
`fullrun` and `halfrun` **stop** after filing the children and the epic — typing `fullrun` approved
|
|
85
|
+
**one** Issue. Report what was filed and end with:
|
|
106
86
|
|
|
107
87
|
> Please run `backlogrun #<E> --only` to execute this epic.
|
|
108
88
|
|
|
109
89
|
## There is no `kickoff epic`
|
|
110
90
|
|
|
111
|
-
|
|
112
|
-
leaving a person to decide which of two commands to type for one job. The assessment above is how a
|
|
113
|
-
split is reached from every entry.
|
|
91
|
+
It would duplicate `kickoff new`; the assessment above reaches a split from every entry.
|
|
114
92
|
|
|
115
93
|
## Issues filed separately, found related later
|
|
116
94
|
|
|
117
|
-
|
|
118
|
-
split is about one request in hand containing several deliverables. That case is outside this
|
|
119
|
-
assessment, and `pnpm josh epic --promote` is what handles it.
|
|
95
|
+
Not a split — `pnpm josh epic --promote` handles it.
|
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
**The single source of the hold**, read at its point of use — the moment a run is about to claim or
|
|
4
4
|
release the tree. History: `docs/maintainers/working-tree-hold-rationale.md` → "Where each rule came from".
|
|
5
5
|
|
|
6
|
-
**Ask `pnpm josh run:hold` before anything else, and obey what it answers
|
|
7
|
-
`fullrun` and `halfrun
|
|
8
|
-
|
|
9
|
-
artifact it should not have created.
|
|
6
|
+
**Ask `pnpm josh run:hold` before anything else, and obey what it answers** — the first call of
|
|
7
|
+
`fullrun` and `halfrun`, before the title, before `pnpm josh ms`, and **before a `new` entry files its
|
|
8
|
+
Issue**.
|
|
10
9
|
|
|
11
10
|
```bash
|
|
12
11
|
pnpm josh run:hold <N> # a `#N` entry point
|
|
@@ -17,81 +16,65 @@ pnpm josh run:release --force # a record left behind by a run that has ended
|
|
|
17
16
|
```
|
|
18
17
|
|
|
19
18
|
- **`hold` — this run now holds the tree. Continue.**
|
|
20
|
-
- **`busy` — another run holds it. Stop.** Send a `confirmation` Telegram carrying
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
- **`busy` — another run holds it. Stop.** Send a `confirmation` Telegram carrying its stderr (the
|
|
20
|
+
holder, when the record was written, the release command). **File nothing, create no branch, edit
|
|
21
|
+
nothing.**
|
|
23
22
|
- **`unknown` — nothing was established. Stop the same way.** It is not "the tree is free".
|
|
24
23
|
|
|
25
24
|
**The unit is the working tree** — one branch, one index and one uncommitted diff, and a linked work
|
|
26
|
-
tree has its own three. **`backlogrun`'s per-repository guard (`epic-busy.ts`) is a separate layer
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
split
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
**
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
goes in the stop report and the Telegram for the person to type. **`fullrun #<N>` of the same issue
|
|
56
|
-
adopts a `halfrun`'s kept hold** rather than being refused `busy` by it — "The halfrun resume" below. **An expired record over a tree that
|
|
57
|
-
still has uncommitted changes does not free it**: the command answers `busy` and says to commit, stash,
|
|
58
|
-
or release once the work is done; only an expired record over a clean tree is replaced.
|
|
59
|
-
|
|
60
|
-
**The batch entry points claim per child, not per batch.** `backlogrun` never
|
|
61
|
-
call it themselves; each child runs the `fullrun` procedure, so it claims on entry and `pnpm josh
|
|
62
|
-
followup` releases it at that child's merge. The command's behavior and the answer table are
|
|
63
|
-
`docs/josh-commands-run.md` → "`josh run:hold` / `josh run:release`"; this file is the single source of
|
|
64
|
-
the procedure.
|
|
25
|
+
tree has its own three. **`backlogrun`'s per-repository guard (`epic-busy.ts`) is a separate layer.** **`kickoff`
|
|
26
|
+
does not claim it** (`docs/maintainers/working-tree-hold-rationale.md` → "Why the unit is the working
|
|
27
|
+
tree").
|
|
28
|
+
|
|
29
|
+
**Claim it in the checkout the run will edit** — a cross-repository `fullrun owner/repo#N` resolves
|
|
30
|
+
that checkout from `pnpm josh doctor` **first** (a read) and claims there.
|
|
31
|
+
|
|
32
|
+
**A release names the run it belongs to.** `pnpm josh run:release <N>` removes only a record naming
|
|
33
|
+
`<N>`, the bare form only the unnumbered run's; anything else answers **`held`** and stands. **`pnpm
|
|
34
|
+
josh run:release --force` is the one spelling that removes a record this run did not write**, and the
|
|
35
|
+
`busy` message names it.
|
|
36
|
+
|
|
37
|
+
**Release what the claim recorded.** A `#N` entry releases `<N>`; a **`new` entry claimed before its
|
|
38
|
+
Issue existed**, so it releases with the **bare** form — a `fullrun new` that stops on a split types
|
|
39
|
+
`pnpm josh run:release`. The bare form removes no label, so every `new` stop that releases also runs
|
|
40
|
+
`gh api -X DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress 2>/dev/null || true`.
|
|
41
|
+
|
|
42
|
+
**Releasing is the run's, not a person's memory.** `pnpm josh followup` releases on a merged run; an
|
|
43
|
+
abandoned record expires after 8 hours. **A stop that leaves the tree clean releases it explicitly** —
|
|
44
|
+
a split, a prerequisite or a third-party target ends with `pnpm josh run:release <N>` (bare for a `new`
|
|
45
|
+
entry, plus the label DELETE). **`halfrun`'s stop before commit keeps the hold**, as does a
|
|
46
|
+
`needs-human-review` stop: the release command goes in the stop report and the Telegram for the person
|
|
47
|
+
to type. **`fullrun #<N>` of the same issue adopts a `halfrun`'s kept hold** — "The halfrun resume"
|
|
48
|
+
below. **An expired record over a tree that still has uncommitted changes does not free it** — it
|
|
49
|
+
answers `busy`; only an expired record over a clean tree is replaced.
|
|
50
|
+
|
|
51
|
+
**The batch entry points claim per child, not per batch** — each `backlogrun` child claims on entry and
|
|
52
|
+
`pnpm josh followup` releases at its merge. The answer table is `docs/josh-commands-run.md` → "`josh
|
|
53
|
+
run:hold` / `josh run:release`".
|
|
65
54
|
|
|
66
55
|
## The halfrun resume
|
|
67
56
|
|
|
68
|
-
**`fullrun #<N>` or `prrun #<N>` after a `halfrun` stop resumes it instead of claiming.** The
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
`
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
`
|
|
76
|
-
issue (`pnpm josh issue:read <N>`), then run the gate **in full** from the refactor (`chain-rule.md` →
|
|
77
|
-
"Run the review-to-merge chain") — a fix made during the manual check has had no gate — and ship as
|
|
78
|
-
any `fullrun` does.
|
|
57
|
+
**`fullrun #<N>` or `prrun #<N>` after a `halfrun` stop resumes it instead of claiming.** The stop is
|
|
58
|
+
**recorded, never inferred**: the `halfrun` ends with `pnpm josh run:hold <N> --halfrun-stop`, marking
|
|
59
|
+
its record (re-keying a `halfrun new`'s unnumbered one) — a `halfrun` still implementing or a
|
|
60
|
+
`backlogrun` child leaves the same dirty tree and is not adopted. On a marked hold for `#<N>`,
|
|
61
|
+
`run:entry` asks the session budget, adopts the hold and prints `entry #<N> — resume: halfrun`. **Skip
|
|
62
|
+
the title, the plan, the split assessment, `pnpm josh ms`, `latest:scope` and the implementation**;
|
|
63
|
+
re-read the issue (`pnpm josh issue:read <N>`), run the gate **in full** from the refactor
|
|
64
|
+
(`chain-rule.md` → "Run the review-to-merge chain"), and ship as any `fullrun` does.
|
|
79
65
|
|
|
80
66
|
## The prrun resume
|
|
81
67
|
|
|
82
|
-
**`fullrun #<N>` after a `prrun` stop resumes it the same way.** The `prrun`
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
could not be read, or the tree is dirty: a person changed something. Run the
|
|
94
|
-
gate **in full** and the review (`chain-rule.md` → "Run the review-to-merge chain"), then ship as any
|
|
95
|
-
`fullrun` does.
|
|
68
|
+
**`fullrun #<N>` after a `prrun` stop resumes it the same way.** The `prrun` ends with `pnpm josh
|
|
69
|
+
run:hold <N> --prrun-stop`, which records its pull request's commit; only a record carrying it is
|
|
70
|
+
adopted. `run:entry` prints one of three tokens — read, never inferred:
|
|
71
|
+
|
|
72
|
+
- **`resume: prrun-merged`** — a person merged it. Run `pnpm josh followup "<title> #<N>"` alone; it
|
|
73
|
+
runs only the post-merge tail.
|
|
74
|
+
- **`resume: prrun-merge`** — branch and pull request still on the stop's commit, tree clean. Skip the
|
|
75
|
+
gate and the review; run `pnpm josh followup` to merge.
|
|
76
|
+
- **`resume: prrun-gate`** — the branch moved, its pull request could not be read, or the tree is
|
|
77
|
+
dirty. Run the gate **in full** and the review (`chain-rule.md` → "Run the review-to-merge chain"),
|
|
78
|
+
then ship.
|
|
96
79
|
|
|
97
80
|
All three skip the title, the plan, the split assessment and the implementation.
|
package/CLAUDE.md
CHANGED
|
@@ -7,13 +7,14 @@ Stack: TypeScript · pnpm · SvelteKit · Vitest · Playwright · TailwindCSS ·
|
|
|
7
7
|
## Communication
|
|
8
8
|
|
|
9
9
|
- **Answer opinion-seeking questions from a neutral standpoint.** A leading question is not a cue to agree — recommend the option you genuinely judge best.
|
|
10
|
-
- **Fix root causes, not symptoms.** Where the proper fix is out of scope, surface
|
|
10
|
+
- **Fix root causes, not symptoms.** Where the proper fix is out of scope, surface it instead of papering over it.
|
|
11
11
|
- **Cross-package problems → file the upstream Issue, then stop.** A defect in another package (a dependency, or `josh` / kit tooling) is never worked around locally — **weakening a verification gate is a workaround too**. File it (first-party Tier A, third-party Tier C) and stop. `prompts/collaboration-workflow/upstream-interrupt.md`. Your own repository's run tooling is not another package: `upstream-interrupt.md` → "実行中のリポジトリ自身のラン機構の不具合".
|
|
12
12
|
- **Third-party repositories are Tier C.** Decide the party with `pnpm josh repo:party`; every write to a tracker we do not own needs explicit current-turn instruction. `prompts/collaboration-workflow/upstream-interrupt.md`.
|
|
13
13
|
- **No clones — single-source, even across package boundaries.** Duplicate non-trivial logic only after presenting the alternative and getting explicit approval. `prompts/collaboration-workflow/principles.md` → "no-clones".
|
|
14
14
|
- **Design for elegance and simplicity first.** Before adding a hook, guard, rule or abstraction, ask whether fixing the cause makes it unnecessary. `prompts/collaboration-workflow/principles.md` → "elegant-design"; conflicting quality goals → "quality-priority".
|
|
15
|
+
- **Write concise prose: conditions and actions only.** `prompts/collaboration-workflow/principles.md` → "concise-prose".
|
|
15
16
|
- **Distinguish consultation from execution.** A question or goal statement asks for analysis only — act on an explicit imperative or a workflow keyword. `prompts/collaboration-workflow/principles.md` → "consult-vs-execute".
|
|
16
|
-
- **Route distributed-doc / config changes upstream to kit.** In a consumer repo never edit kit-distributed docs/config
|
|
17
|
+
- **Route distributed-doc / config changes upstream to kit.** In a consumer repo never edit kit-distributed docs/config; in kit you are the source. `prompts/collaboration-workflow/principles.md` → "upstream-to-kit".
|
|
17
18
|
- **Latest-first, fix forward — pin back only as a last resort.** `prompts/collaboration-workflow/principles.md` → "latest-first".
|
|
18
19
|
- **Output language follows `JOSH_SESSION_LANG`** (default `ja`) for session output and artifact prose; English for Issue/PR titles, code comments, test titles, commit messages and script strings. `prompts/collaboration-workflow/overview.md`.
|
|
19
20
|
- **Durable rules belong in prompts/docs, not local MEMORY.** `prompts/collaboration-workflow/principles.md` → "durable-rules".
|
|
@@ -31,16 +32,16 @@ Log auto-decisions: an Issue comment in an Issue workflow, else a one-line "Auto
|
|
|
31
32
|
|
|
32
33
|
## Critical Conventions (non-standard — always apply)
|
|
33
34
|
|
|
34
|
-
Naming, exports, file names and content rules are enforced by `eslint/rules/`; their single source is `prompts/coding-standards.md` → "Conventions". `function` syntax, not arrows (named SvelteKit route handlers may use
|
|
35
|
+
Naming, exports, file names and content rules are enforced by `eslint/rules/`; their single source is `prompts/coding-standards.md` → "Conventions". `function` syntax, not arrows (named SvelteKit route handlers may use typed-const arrows); lint does not check it.
|
|
35
36
|
|
|
36
37
|
### Quality limits
|
|
37
38
|
|
|
38
|
-
- Function complexity ≤5 · nesting ≤2 · function ≤25 lines · file ≤300 lines · params ≤4 · statements per function ≤10 · cognitive complexity ≤4 — line counts are code lines, not physical lines
|
|
39
|
+
- Function complexity ≤5 · nesting ≤2 · function ≤25 lines · file ≤300 lines · params ≤4 · statements per function ≤10 · cognitive complexity ≤4 — line counts are code lines, not physical lines; test functions allow 35 code lines.
|
|
39
40
|
- No magic numbers beyond `0`, `1`, `-1` · no `any` · restricted `as` · explicit param and return types · single short early return → one-liner `if (x) return y`.
|
|
40
41
|
|
|
41
42
|
## Package-First Development
|
|
42
43
|
|
|
43
|
-
Before building a feature,
|
|
44
|
+
Before building a feature, run `pnpm josh pkg:scout <keywords>`: `clear` → use it (Tier A), `close` → ask (Tier B).
|
|
44
45
|
|
|
45
46
|
## Code Change Rules
|
|
46
47
|
|
|
@@ -82,5 +83,5 @@ Never start a `kickoff` / `halfrun` / `prrun` / `fullrun` / `backlogrun` workflo
|
|
|
82
83
|
Before pausing **any** run for the user — a command's stop, an upstream-Issue interrupt, a Tier C confirmation — send once per stop (skip when the user asked for the stop this turn):
|
|
83
84
|
|
|
84
85
|
```bash
|
|
85
|
-
pnpm josh notify --task-type confirmation --issue-url "<
|
|
86
|
+
pnpm josh notify --task-type confirmation --issue-url "<url>" --body=$'<reason>' --recommended "<choice>" --alternative "<other>"
|
|
86
87
|
```
|
package/README.md
CHANGED
|
@@ -39,7 +39,7 @@ Next: [tutorial](./docs/tutorial.md)
|
|
|
39
39
|
|
|
40
40
|
#### Your first backlogrun
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
File Issues with `kickoff new`, then run:
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
45
|
pnpm josh backlogrun
|
|
@@ -59,14 +59,7 @@ Next: [tutorial](./docs/tutorial.md#without-github-one-change-checked-locally)
|
|
|
59
59
|
|
|
60
60
|
### Adding kit to an existing project
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
- **Overwritten by `josh sync`:** the managed files, such as `.github/workflows/ci.yml` and `AGENTS.md` ([the list](./docs/sync.md#ai-files-overwritten)).
|
|
64
|
-
- **Permissions:** the Claude Code settings kit writes (with `josh start`, or on `full`) set `bypassPermissions` with `Bash(*)`, guarded by a deny list and a hook ([how to opt out](./docs/init.md#claude-code-permission-mode)).
|
|
65
|
-
- **On GitHub:** `josh start` adds labels, and on an existing `main` an Issue and a setup PR that you merge yourself ([the steps](./docs/init.md#josh-init-or-josh-start)).
|
|
66
|
-
|
|
67
|
-
## Claude Code in a fresh-machine run
|
|
68
|
-
|
|
69
|
-
A `josh fresh:run` scenario that runs Claude Code needs a sign-in saved once with `pnpm josh auth:setup` ([steps](./docs/maintainers/fresh-machine.md#claude-code)).
|
|
62
|
+
Check first: [what kit changes in your project](./docs/how-to/add-kit.md#what-kit-changes-in-your-project)
|
|
70
63
|
|
|
71
64
|
## Docs
|
|
72
65
|
|