@joshuafolkken/kit 1.1010.0 → 1.1050.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 +1 -5
- package/.claude/skills/dependency-update/SKILL.md +6 -3
- package/.claude/skills/epic-commands/SKILL.md +46 -17
- package/.claude/skills/verify-ui/SKILL.md +1 -1
- package/.claude/skills/workflow-commands/SKILL.md +10 -25
- package/.claude/skills/workflow-commands/background-commands.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-child.md +6 -4
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
- package/.claude/skills/workflow-commands/backlogrun-progress.md +30 -36
- package/.claude/skills/workflow-commands/backlogrun-steps.md +16 -16
- package/.claude/skills/workflow-commands/backlogrun.md +3 -12
- package/.claude/skills/workflow-commands/chain-rule.md +2 -2
- package/.claude/skills/workflow-commands/followup-reference.md +2 -2
- package/.claude/skills/workflow-commands/fullrun-steps.md +4 -3
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/halfrun.md +2 -1
- package/.claude/skills/workflow-commands/into-target.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +80 -126
- package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +2 -2
- package/.codex/hooks.json +1 -5
- package/.github/workflows/auto-tag.yml +21 -0
- package/.github/workflows/publish.yml +9 -10
- package/.github/workflows/sonar-qube.yml +1 -1
- package/AGENTS.md +4 -25
- package/CLAUDE.md +24 -38
- package/GEMINI.md +4 -24
- package/README.md +22 -56
- package/dist/CLAUDE.md +24 -38
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-6PSTVOLH.js → chunk-5BK3K7V4.js} +114 -90
- package/dist/hooks/{chunk-PAXMLGSS.js → chunk-7VPDUBRN.js} +93 -175
- package/dist/hooks/{chunk-KPZN42RT.js → chunk-DMQN45FN.js} +3 -3
- package/dist/hooks/{chunk-WMIR5SNX.js → chunk-EJDX2TOB.js} +13 -3
- package/dist/hooks/{chunk-A2H5I2VD.js → chunk-GQ7KP45M.js} +2 -2
- package/dist/hooks/{chunk-4GDR2YTV.js → chunk-HJIISEAC.js} +4 -4
- package/dist/hooks/{chunk-AWTFKKFW.js → chunk-NAS4C7GP.js} +6 -33
- package/dist/hooks/{chunk-56LGMJJV.js → chunk-NJQOBE6L.js} +2 -2
- package/dist/hooks/{chunk-EZLHXKJ6.js → chunk-RLDX5SOC.js} +1222 -941
- package/dist/hooks/{chunk-GBJUERYK.js → chunk-WQ4OSBSS.js} +10 -3
- package/dist/hooks/codex-hook-adapter.js +10 -10
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +15 -34
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +23 -16
- package/dist/hooks/stop-guard.js +21 -200
- package/dist/josh.js +42 -125
- package/dist/version/index.js +466 -42
- package/eslint/base.js +2 -11
- package/package.json +36 -10
- package/prompts/coding-standards.md +15 -290
- package/prompts/collaboration-workflow/cross-repo-epic.md +2 -51
- package/prompts/collaboration-workflow/epic-audit.md +2 -53
- package/prompts/collaboration-workflow/epic-bundle.md +2 -106
- package/prompts/collaboration-workflow/file-edits.md +6 -53
- package/prompts/collaboration-workflow/issue-template.md +4 -4
- package/prompts/collaboration-workflow/operating-rules.md +18 -75
- package/prompts/collaboration-workflow/principles.md +74 -0
- package/prompts/collaboration-workflow/residency.md +55 -15
- package/prompts/collaboration-workflow/rule-delivery.md +5 -46
- package/prompts/collaboration-workflow/shell-body.md +7 -9
- package/prompts/collaboration-workflow/turn-batching.md +21 -37
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +15 -18
- package/prompts/collaboration-workflow.md +22 -28
- package/prompts/sonar-hotspot-handling.md +1 -1
- package/scripts/adopt/adopt-logic.ts +2 -2
- package/scripts/adopt/adopt-toolkits.ts +3 -1
- package/scripts/adopt/adopt.ts +2 -2
- package/scripts/agent/agent-event.ts +2 -9
- package/scripts/agent/agent-exit-record.ts +2 -9
- package/scripts/auto-ok/auto-ok-cli.ts +9 -9
- package/scripts/backlog/backlog-budget-cli.ts +2 -6
- package/scripts/backlog/backlog-drive-cli.ts +20 -10
- package/scripts/backlog/backlog-drive.ts +50 -16
- package/scripts/backlog/backlog-next.ts +24 -8
- package/scripts/backlog/backlog-offer-cli.ts +6 -5
- package/scripts/backlog/backlog-plan-cli.ts +5 -1
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +31 -11
- package/scripts/backlog/backlog-rank.ts +106 -0
- package/scripts/backlog/backlog-waves.ts +42 -29
- package/scripts/build/build-bin.ts +2 -1
- package/scripts/build/build-config-merge.ts +2 -1
- package/scripts/build/build-hooks.ts +31 -6
- package/scripts/build/build-managed-marker.ts +2 -1
- package/scripts/build/build-self-sync-guard.ts +2 -1
- package/scripts/build/build-version.ts +2 -1
- package/scripts/cases/cases-logic.ts +2 -6
- package/scripts/ci/pr-classification.ts +13 -11
- package/scripts/cost-runtime/cost-transcript.ts +4 -11
- package/scripts/delegation/delegation-policy.ts +11 -0
- package/scripts/doctor/doctor-consumer.ts +5 -12
- package/scripts/doctor/doctor-ports.ts +2 -2
- package/scripts/document/document-byte-budget.ts +13 -21
- package/scripts/document/document-section.ts +2 -6
- package/scripts/document/entry-read-budget.ts +6 -5
- package/scripts/{git/git-epic-add-body.ts → epic/epic-add-body.ts} +23 -23
- package/scripts/{git/git-epic-add-plan.ts → epic/epic-add-plan.ts} +23 -26
- package/scripts/{git/git-epic-add.ts → epic/epic-add.ts} +17 -17
- package/scripts/epic/epic-audit-cli.ts +4 -4
- package/scripts/epic/epic-audit-orphans.ts +2 -2
- package/scripts/epic/epic-audit-rationale.ts +1 -1
- package/scripts/epic/epic-audit.ts +1 -1
- package/scripts/{git/git-epic-body.ts → epic/epic-body.ts} +6 -6
- package/scripts/epic/epic-bundle-cli.ts +1 -1
- package/scripts/epic/epic-bundle.ts +2 -2
- package/scripts/epic/epic-candidate-confirm.ts +2 -1
- package/scripts/{git/git-epic-chains.ts → epic/epic-chains.ts} +4 -4
- package/{scripts-ai → scripts/epic}/epic-check.ts +5 -4
- package/{scripts-ai → scripts/epic}/epic-cli.ts +4 -4
- package/scripts/{git/git-epic-close-comment.ts → epic/epic-close-comment.ts} +9 -9
- package/scripts/{git/git-epic-close.ts → epic/epic-close.ts} +23 -19
- package/scripts/epic/epic-cross-repo.ts +21 -38
- package/scripts/{git/git-epic-decision.ts → epic/epic-decision.ts} +12 -14
- package/scripts/epic/epic-fetch.ts +3 -3
- package/scripts/epic/epic-graph.ts +3 -3
- package/scripts/epic/epic-index.ts +2 -2
- package/scripts/epic/epic-issue.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +11 -22
- package/scripts/epic/epic-next.ts +3 -3
- package/scripts/{git/git-epic-parse.ts → epic/epic-parse.ts} +3 -3
- package/scripts/{git/git-epic-promote.ts → epic/epic-promote.ts} +10 -10
- package/scripts/epic/epic-rank.ts +37 -0
- package/scripts/{git/git-epic-read.ts → epic/epic-read.ts} +9 -9
- package/scripts/{git/git-epic-reconcile.ts → epic/epic-reconcile.ts} +18 -20
- package/scripts/{git/git-epic-reference.ts → epic/epic-reference.ts} +4 -23
- package/scripts/epic/epic-relation-recheck.ts +4 -3
- package/scripts/{git/git-epic-relations.ts → epic/epic-relations.ts} +5 -5
- package/scripts/{git/git-epic-remove-plan.ts → epic/epic-remove-plan.ts} +17 -19
- package/scripts/{git/git-epic-remove.ts → epic/epic-remove.ts} +13 -13
- package/scripts/{git/git-epic-run.ts → epic/epic-run.ts} +27 -27
- package/scripts/{git/git-epic-sections.ts → epic/epic-sections.ts} +6 -6
- package/scripts/{git/git-epic-shape.ts → epic/epic-shape.ts} +7 -7
- package/scripts/epic/epic-solo.ts +29 -28
- package/scripts/{git/git-epic-validate.ts → epic/epic-validate.ts} +13 -13
- package/{scripts-ai → scripts/epic}/epic.ts +17 -16
- package/scripts/gh/fix-gh-packages.ts +2 -1
- package/scripts/gh/gh-spawn.ts +12 -10
- package/scripts/git/constants.ts +1 -1
- package/scripts/git/git-branch.ts +10 -1
- package/scripts/git/git-command.ts +2 -2
- package/scripts/git/git-error.ts +2 -5
- package/scripts/git/git-execa-error.ts +6 -1
- package/{scripts-ai → scripts/git}/git-followup-finish.ts +7 -7
- package/scripts/git/git-followup-flush.ts +74 -48
- package/scripts/git/git-followup-issue-close.ts +2 -2
- package/scripts/git/git-followup-label.ts +1 -1
- package/scripts/git/git-followup-pending.ts +1 -1
- package/{scripts-ai → scripts/git}/git-followup-workflow.ts +23 -11
- package/scripts/git/git-gh-exec.ts +85 -26
- package/scripts/git/git-gh-issue-read.ts +2 -2
- package/scripts/git/git-gh-issue-rest.ts +2 -2
- package/scripts/git/git-gh-issue-write.ts +6 -6
- package/scripts/git/git-gh-pr-read.ts +0 -21
- package/scripts/git/git-gh-pr.ts +2 -23
- package/scripts/git/git-next-issues.ts +34 -5
- package/scripts/git/git-pr-followup-wrapup.ts +2 -6
- package/scripts/git/git-preflight.ts +25 -10
- package/scripts/git/git-push-transport.ts +12 -69
- package/scripts/git/git-spawn.ts +79 -3
- package/scripts/git/git-ssh-keepalive.ts +74 -0
- package/scripts/git/git-staging.ts +21 -9
- package/{scripts-ai → scripts/git}/git-workflow.ts +11 -11
- package/scripts/git/github-issue-url.ts +1 -1
- package/scripts/git/gone-branch.ts +3 -2
- package/scripts/git/issue-labels.ts +13 -1
- package/scripts/git/issue-rank.ts +89 -0
- package/scripts/git/issue-reference.ts +19 -0
- package/scripts/git/main-merge.ts +2 -1
- package/scripts/git/main-sync.ts +3 -2
- package/scripts/git/schemas.ts +1 -1
- package/scripts/git/stash-pop-args.ts +7 -13
- package/scripts/git/stash-pop-cli.ts +2 -1
- package/{scripts-ai → scripts/git}/telegram-test-logic.ts +2 -2
- package/{scripts-ai → scripts/git}/telegram-test.ts +7 -7
- package/scripts/hooks/format-edited-cli.ts +15 -0
- package/scripts/hooks/format-edited-file.ts +2 -9
- package/scripts/hooks/format-rewrite-notice.ts +2 -8
- package/scripts/hooks/pretool-guard-cli.ts +21 -0
- package/scripts/hooks/pretool-guard.ts +14 -15
- package/scripts/init/init-ai-copy.ts +2 -5
- package/scripts/init/init.ts +8 -4
- package/scripts/init/start-exec.ts +7 -1
- package/scripts/init/start-plan.ts +18 -5
- package/scripts/init/start-setup-pr.ts +46 -19
- package/scripts/init/start-steps.ts +43 -10
- package/scripts/init/start.ts +42 -11
- package/scripts/issue/issue-cite.ts +19 -1
- package/scripts/issue/issue-comment-cli.ts +2 -1
- package/scripts/issue/issue-file-cli.ts +2 -1
- package/scripts/issue/issue-fold-cli.ts +9 -16
- package/scripts/issue/issue-scout-cli.ts +8 -13
- package/scripts/issue/measure-rerun-cli.ts +7 -6
- package/scripts/josh/josh-command-map.ts +0 -102
- package/scripts/josh/josh-commands-ai.ts +2 -2
- package/scripts/josh/josh-commands-backlog.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +3 -3
- package/scripts/josh/josh-commands-project.ts +1 -1
- package/scripts/josh/josh-commands-workflow.ts +4 -4
- package/scripts/lane/lane-child-marker.ts +16 -2
- package/scripts/lane/lane-cli.ts +34 -15
- package/scripts/lane/lane-open.ts +3 -2
- package/scripts/lane/lane-registry.ts +3 -6
- package/scripts/lane/lane-report.ts +10 -4
- package/scripts/lib/cli-flags.ts +20 -2
- package/scripts/lib/error-message.ts +9 -0
- package/scripts/lib/read-file.ts +26 -2
- package/scripts/observations/observation-ledger-home.ts +98 -26
- package/scripts/observations/observation-ledger-migrate.ts +26 -21
- package/scripts/observations/observation-ledger-prepare.ts +10 -20
- package/scripts/observations/observation-ledger.ts +58 -25
- package/scripts/observations/observations-flush-cli.ts +6 -23
- package/scripts/observations/observations-flush-landing.ts +2 -1
- package/scripts/observations/observations-flush.ts +29 -20
- package/scripts/package/package-scout-cli.ts +8 -16
- package/scripts/ports/port-command.ts +2 -1
- package/scripts/propagate/propagate-plan.ts +185 -0
- package/scripts/propagate/propagate-publish.ts +6 -7
- package/scripts/propagate/propagate-run.ts +5 -1
- package/scripts/propagate/propagate-steps.ts +18 -2
- package/scripts/propagate/propagate-targets.ts +13 -2
- package/scripts/propagate/propagate.ts +63 -44
- package/scripts/refactor/import-graph.ts +2 -6
- package/scripts/registry-migration/migrate-logic.ts +1 -0
- package/scripts/registry-migration/migrate.ts +3 -2
- package/scripts/registry-migration/user-npmrc.ts +2 -2
- package/scripts/release/github-release.ts +1 -1
- package/scripts/release/release-cli.ts +2 -1
- package/scripts/repo/repo-setting.ts +10 -8
- package/scripts/review/review-attest.ts +44 -0
- package/scripts/review/review-brief-cli.ts +49 -2
- package/scripts/review/review-brief.ts +46 -1
- package/scripts/review/review-finding-ledger.ts +3 -3
- package/scripts/review/review-findings-cli.ts +4 -11
- package/scripts/review/review-record-cli.ts +14 -11
- package/scripts/review/review-record.ts +6 -16
- package/scripts/review/review-stamps.ts +7 -0
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/implementation-cut.ts +1 -1
- package/scripts/rules/issue-fold.ts +1 -2
- package/scripts/rules/lane-carry-conflict.ts +1 -2
- package/scripts/rules/lane-park.ts +1 -2
- package/scripts/rules/pre-gate-cut.ts +2 -2
- package/scripts/rules/rule-body-guard.ts +2 -2
- package/scripts/rules/rule-value-cache.ts +99 -0
- package/scripts/rules/rule-value-cli.ts +10 -9
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/run/run-carry-args.ts +2 -6
- package/scripts/run/run-carry-cli.ts +5 -7
- package/scripts/run/run-cut-args.ts +7 -13
- package/scripts/run/run-ending-cli.ts +4 -7
- package/scripts/run/run-event-stream.ts +2 -5
- package/scripts/run/run-headless.ts +22 -6
- package/scripts/run/run-liveness-cli.ts +4 -7
- package/scripts/run/run-parent-cut-hook.ts +144 -0
- package/scripts/run/run-progress-args.ts +2 -6
- package/scripts/run/run-progress-cli.ts +2 -1
- package/scripts/run/run-progress-read.ts +2 -1
- package/scripts/run/run-progress.ts +21 -8
- package/scripts/run/run-ship-cli.ts +6 -74
- package/scripts/run/run-ship-preflight.ts +87 -0
- package/scripts/run/run-ship-review-steps.ts +5 -26
- package/scripts/run/run-ship-review.ts +9 -0
- package/scripts/run/run-ship-scoped.ts +44 -0
- package/scripts/run/run-ship-stage.ts +5 -1
- package/scripts/run/run-ship-steps.ts +105 -0
- package/scripts/run/run-ship.ts +2 -0
- package/scripts/run/run-tail-cli.ts +3 -3
- package/scripts/run/run-tidy-stashes.ts +7 -14
- package/scripts/run/run-wake-cli.ts +4 -8
- package/scripts/run/run-wake-describe.ts +19 -1
- package/scripts/run/run-wake-driver.ts +15 -2
- package/scripts/run/run-wake-session.ts +14 -4
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/project-config.ts +3 -6
- package/scripts/security/security-audit-provision.ts +6 -7
- package/scripts/sonar/sonar-hotspots-cli.ts +2 -1
- package/scripts/sync/directory-copy-guard.ts +2 -1
- package/scripts/sync/sync-ai-files.ts +3 -3
- package/scripts/sync/template-source-logic.ts +3 -4
- package/scripts/test/e2e-retry-check.ts +3 -6
- package/scripts/time-runtime/time-bundle-call.ts +2 -2
- package/scripts/ui/ui-routes-cli.ts +3 -6
- package/scripts/version/bump-version.ts +2 -1
- package/scripts/version/npm-registry.ts +97 -0
- package/scripts/version/version-commands.ts +5 -4
- package/scripts/version/version-remote.ts +38 -33
- package/scripts/version/version-targets.ts +3 -3
- package/.claude/skills/workflow-commands/rule-residency.md +0 -267
- package/evals/scenarios/consult-not-execute.json +0 -20
- package/evals/scenarios/no-implicit-workflow.json +0 -26
- package/evals/scenarios/overrides-both-locations.json +0 -29
- package/evals/scenarios/upstream-interrupt.json +0 -23
- package/evals/scenarios/workflow-skill-loaded.json +0 -16
- package/prompts/agent-lint-protocol.json +0 -79
- package/prompts/agent-rules.md +0 -63
- package/prompts/collaboration-workflow/consultation-vs-execution.md +0 -8
- package/prompts/collaboration-workflow/distributed-docs.md +0 -7
- package/prompts/collaboration-workflow/durable-rules.md +0 -24
- package/prompts/collaboration-workflow/latest-first.md +0 -14
- package/prompts/collaboration-workflow/no-clones.md +0 -11
- package/prompts/collaboration-workflow/simplicity-first.md +0 -9
- package/prompts/collaboration-workflow/single-source-rules.md +0 -13
- package/scripts/build/shim-shell.ts +0 -25
- package/scripts/claude/skill-meta.ts +0 -37
- package/scripts/document/document-scan.ts +0 -108
- package/scripts/document/generate-catalog.ts +0 -69
- package/scripts/document/retired-phrases.ts +0 -143
- package/scripts/document/review-agent-type.ts +0 -46
- package/scripts/document/single-source.ts +0 -73
- package/scripts/git/git-fixture-workspace.ts +0 -88
- package/scripts/hooks/format-edited-file-fixtures.ts +0 -109
- package/scripts/hooks/prompt-hooks.ts +0 -38
- package/scripts/init/hook-command-bootstrap.ts +0 -83
- package/scripts/issue/issue-logic.ts +0 -50
- package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +0 -1227
- package/scripts/josh/josh-script-reader.ts +0 -11
- package/scripts/package/production-dependency-graph.ts +0 -68
- package/scripts/retrospective/retrospective-cli.ts +0 -97
- package/scripts/retrospective/retrospective.ts +0 -127
- package/scripts/rules/delivered-rules-harness.ts +0 -72
- package/scripts/rules/top-level-scripts-guard.ts +0 -47
- package/scripts/run/run-carry-flush.ts +0 -58
- package/scripts/run/run-transcript.golden.txt +0 -57
- package/scripts/run/run-wake-work.ts +0 -108
- package/scripts/sync/dependabot-pin-logic.ts +0 -135
- package/scripts/test/classify-isolation.ts +0 -149
- package/scripts/test/http-fault-injection.ts +0 -79
- package/scripts/test/josh-harness-environment.ts +0 -260
- package/scripts/test/josh-harness.ts +0 -96
- package/scripts/test/pilot-files.ts +0 -452
- package/scripts/test/pilot-measure.ts +0 -78
- package/scripts/test/test-network-guard.ts +0 -453
- package/scripts/test/test-repository-guard.ts +0 -317
- package/scripts/test/test-state-guard.ts +0 -85
- package/scripts/test/test-stdout-guard.ts +0 -54
- package/scripts/test/test-telegram-guard.ts +0 -90
- package/scripts/test/unit-guard-environment.ts +0 -12
- package/scripts/test/unit-projects.ts +0 -139
- package/scripts/test/vitest-include-globs.ts +0 -12
- package/scripts/time-runtime/time-batch-guard-fixtures.ts +0 -66
- package/scripts-ai/completion-gate.ts +0 -13
- package/scripts-ai/environment-loader.ts +0 -9
- /package/{scripts-ai → scripts/epic}/epic-cli-argv.ts +0 -0
- /package/{scripts-ai → scripts/epic}/epic-cli-remove.ts +0 -0
- /package/{scripts-ai → scripts/git}/followup-issue-number.ts +0 -0
|
@@ -84,7 +84,7 @@ pnpm josh notify --task-type failure --issue-url "<issue-url>" --body "<the reas
|
|
|
84
84
|
**The matching itself is unchanged, and so is the reason it is mechanical.** The instruction the mechanical read replaced was skipped in two runs out of three on the day it was measured, and one of those two could not have succeeded by eye at all: `AI_COPY_DIRECTORIES` holds directories, so a distributed path such as `.claude/skills/workflow-commands/backlogrun.md` appears in no list textually.
|
|
85
85
|
|
|
86
86
|
```bash
|
|
87
|
-
pnpm josh sync:scope # managed | clean, naming which list claimed each path
|
|
87
|
+
pnpm josh sync:scope # managed | clean, naming which list claimed each path
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
- **There is no flag to pass and nothing to approve.** `--managed-config-ignore-reason` is gone with the stop it existed to get past.
|
|
@@ -99,7 +99,7 @@ pnpm josh sync:scope # managed | clean, naming which list claimed each path;
|
|
|
99
99
|
**The answer: `pnpm josh release:scope`.**
|
|
100
100
|
|
|
101
101
|
```bash
|
|
102
|
-
pnpm josh release:scope # → required | skip | unknown
|
|
102
|
+
pnpm josh release:scope # → required | skip | unknown
|
|
103
103
|
pnpm josh release:scope --json # the same answer as one JSON object
|
|
104
104
|
```
|
|
105
105
|
|
|
@@ -55,7 +55,8 @@ that covers the same work stops the run rather than filing a second Issue (`SKIL
|
|
|
55
55
|
`<N>`. (3) Add
|
|
56
56
|
`in-progress` (as above). (4) Post the agreed plan in the session language: fill the body if blank,
|
|
57
57
|
otherwise add a comment. (5) If the working tree already has staged or modified files,
|
|
58
|
-
`git stash push -m "fullrun new: pre-existing changes"
|
|
58
|
+
`git stash push -m "fullrun new: pre-existing changes" -- ':!docs/maintainers/observations'` first
|
|
59
|
+
(joshuafolkken/kit#2919). (6) `git switch main && git pull`. (7)
|
|
59
60
|
`pnpm josh latest:scope`; on `required` run `josh latest` and load the `dependency-update` skill; on
|
|
60
61
|
`skip` neither runs (`latest-gate.md` is the single source). If you stashed in (5),
|
|
61
62
|
`pnpm josh stash:pop "fullrun new: pre-existing changes"` — by message, never a positional `git stash
|
|
@@ -78,8 +79,8 @@ release:scope` and close the completion summary with what it answered** (`follow
|
|
|
78
79
|
## The release ask — the last step of either form
|
|
79
80
|
|
|
80
81
|
**One call folds the post-merge bookkeeping** (joshuafolkken/kit#2372): after the merge, `pnpm josh
|
|
81
|
-
run:tail <N>` commits
|
|
82
|
-
|
|
82
|
+
run:tail <N>` commits ledger lines written outside any issue's run (`observations:flush`,
|
|
83
|
+
joshuafolkken/kit#2919), reads the completion citations
|
|
83
84
|
(`issue:cite`, given the closed issue and any follow-ups filed this run) and decides the release scope
|
|
84
85
|
(`release:scope`) in one round trip, joining each under its own header. **On the clean path `run:tail`
|
|
85
86
|
runs inside `pnpm josh ship`** as its report step (joshuafolkken/kit#2398), so it is a standalone call
|
|
@@ -46,7 +46,7 @@ call reports `hold`.
|
|
|
46
46
|
`pnpm josh latest:scope` — update dependencies only on `required` (`latest-gate.md`), never on every
|
|
47
47
|
run. `run:step` names every later action in order — the verification gate, `pnpm josh followup`,
|
|
48
48
|
`pnpm josh ms`, the release ask — each read at the point-of-use doc the header lists, never
|
|
49
|
-
re-narrated here (`residency.md` →
|
|
49
|
+
re-narrated here (`residency.md` → "順序の問い").
|
|
50
50
|
|
|
51
51
|
## The progress step and the lane-child seam
|
|
52
52
|
|
|
@@ -59,7 +59,8 @@ back with fixes, treat each as a new round: implement, re-run `pnpm josh gate`,
|
|
|
59
59
|
mirror `fullrun new` (1)–(8): derive an English title (or use the provided one) → create the Issue
|
|
60
60
|
(`pnpm josh issue:file "<title>" --body-file <body-file> --depth <n>`, body per
|
|
61
61
|
`prompts/collaboration-workflow/issue-template.md`; its duplicate scan is read per `SKILL.md` → §2e) → add `in-progress` → post the agreed plan → stash
|
|
62
|
-
any pre-existing changes with `git stash push -m "halfrun new: pre-existing changes"
|
|
62
|
+
any pre-existing changes with `git stash push -m "halfrun new: pre-existing changes" -- ':!docs/maintainers/observations'`
|
|
63
|
+
(the pathspec keeps the observation ledger in the tree for this run's commit; joshuafolkken/kit#2919), popped by
|
|
63
64
|
message with `pnpm josh stash:pop "halfrun new: pre-existing changes"`, never a positional `git stash pop` →
|
|
64
65
|
`git switch main && git pull` → `pnpm josh latest:scope` → implement → run the gate (as above, `pnpm
|
|
65
66
|
josh test:e2e` run by **you**) → `pnpm josh run:hold <N> --halfrun-stop` → send the `confirmation`
|
|
@@ -39,7 +39,7 @@ new epic" when what gets created is often a single Issue.
|
|
|
39
39
|
applies depends on what the target is, and promoting rewrites someone else's Issue into a container.
|
|
40
40
|
- **A cross-repository target is written `owner/repo#N`** and inserted from that repository's
|
|
41
41
|
checkout; run there, since `epic --add` reads and writes only the repository it runs from
|
|
42
|
-
(
|
|
42
|
+
(`.claude/skills/epic-commands/SKILL.md` → "Epics that span repositories"). A bare `#N` resolves to this repository's
|
|
43
43
|
issue of that number.
|
|
44
44
|
- **No suffix leaves the behavior exactly as it was.**
|
|
45
45
|
|
|
@@ -12,7 +12,7 @@ delegated unit executing `fullrun`'s procedure, and the hook keys its once-per-r
|
|
|
12
12
|
same turn as whatever else the run already needs:
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
pnpm josh issue:read <N> [<N> ...] # body and comments, one call per batch
|
|
15
|
+
pnpm josh issue:read <N> [<N> ...] # body and comments, one call per batch
|
|
16
16
|
gh api repos/{owner}/{repo}/issues/<N>/comments --jq '.[] | {user: .user.login, created_at, body}'
|
|
17
17
|
```
|
|
18
18
|
|
|
@@ -32,13 +32,7 @@ The detail below is read at the filing decision, and the marker suite pins the r
|
|
|
32
32
|
|
|
33
33
|
### The depth test — a discretionary filing cites the product work it blocked
|
|
34
34
|
|
|
35
|
-
**
|
|
36
|
-
tooling** (joshuafolkken/kit#1698). Measured on the `backlogrun` of 2026-09-09: 5 Issues shipped and
|
|
37
|
-
15 filed, of which 13 were discretionary — and all 20 were about this package's own run
|
|
38
|
-
orchestration or the tools that measure it, with not one change a consumer of the package would see.
|
|
39
|
-
**A listing that measures itself has no natural stopping condition**, because every measurement
|
|
40
|
-
creates something new to measure. So the condition comes from outside, and **depth is what supplies
|
|
41
|
-
it — read off the subject rather than judged**:
|
|
35
|
+
**Depth is read off the subject rather than judged** (joshuafolkken/kit#1698):
|
|
42
36
|
|
|
43
37
|
| Depth | The subject | Where it lives |
|
|
44
38
|
| --- | --- | --- |
|
|
@@ -75,16 +69,14 @@ gh api repos/{owner}/{repo}/labels -f name=depth:2 -f color=c5def5 -f descriptio
|
|
|
75
69
|
- **It is read off the subject, exactly as the table is** — so applying it is not a judgement and not
|
|
76
70
|
a person's to make, which is what separates it from `auto-ok` and `needs-human-review`. Those two
|
|
77
71
|
decide what a run may do; this one records what an Issue is about and withholds nothing.
|
|
78
|
-
- **Applied at filing, not at completion.**
|
|
79
|
-
whoever happens to close it, and the share below is a question about the *open* backlog — an Issue
|
|
80
|
-
that never carried the label was never in the numerator's reach.
|
|
72
|
+
- **Applied at filing, not at completion.**
|
|
81
73
|
- **An Issue carrying more than one counts as the lowest depth present**, the one closest to the
|
|
82
|
-
consumer.
|
|
83
|
-
twice can answer twice, which is the whole defect joshuafolkken/kit#1729 was filed for.
|
|
74
|
+
consumer.
|
|
84
75
|
- **An `epic` takes no depth label**, because it has no subject of its own to read one off — its
|
|
85
76
|
children carry the subjects, and the share below excludes it from the denominator for that same
|
|
86
|
-
reason.
|
|
87
|
-
|
|
77
|
+
reason.
|
|
78
|
+
|
|
79
|
+
Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the depth label is applied at filing".
|
|
88
80
|
|
|
89
81
|
- **A discretionary observation at depth 1 or deeper is filed only where it can cite the depth-0 work
|
|
90
82
|
it stopped or delayed** — named as an Issue number or a run, never as "this would slow runs down".
|
|
@@ -96,12 +88,8 @@ gh api repos/{owner}/{repo}/labels -f name=depth:2 -f color=c5def5 -f descriptio
|
|
|
96
88
|
- **`route:tier-a` and `route:interrupt` do not take it either**, at any depth: a filing the run
|
|
97
89
|
cannot proceed without is already citing its own blockage.
|
|
98
90
|
- **A depth-2 filing — one whose subject is what measures a run — carries a further requirement, on
|
|
99
|
-
top of the depth-0 citation above rather than in place of it** (joshuafolkken/kit#1975).
|
|
100
|
-
|
|
101
|
-
measurement Issue: "runs are slow" and "the diff is large" both name depth-0 work, while the number
|
|
102
|
-
the Issue proposes to produce changes nothing — and a listing that measures itself has no natural
|
|
103
|
-
stopping condition precisely there. So a discretionary depth-2 filing states two things the depth-0
|
|
104
|
-
citation does not force:
|
|
91
|
+
top of the depth-0 citation above rather than in place of it** (joshuafolkken/kit#1975). A
|
|
92
|
+
discretionary depth-2 filing states two things the depth-0 citation does not force:
|
|
105
93
|
- **The decision the number would change, named** — the Issue number holding the choice it is
|
|
106
94
|
waiting on, or a decision a person is about to make. "Slow", "large" and "worth knowing" are not a
|
|
107
95
|
decision.
|
|
@@ -115,15 +103,15 @@ gh api repos/{owner}/{repo}/labels -f name=depth:2 -f color=c5def5 -f descriptio
|
|
|
115
103
|
depth-0 observation does not take it because it is the product, and a review round cap's branch-2
|
|
116
104
|
filing (below) clears its own bar and never reaches this one.
|
|
117
105
|
|
|
106
|
+
Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why depth gates a discretionary filing".
|
|
107
|
+
|
|
118
108
|
**It governs this route only — the fourth row of §2d's table.** A review finding routed to branch 2
|
|
119
109
|
of `prompts/review.md` → "Review round cap" is filed under that section's own bar — a confirmed
|
|
120
110
|
defect reaching a runtime path, with a written failure scenario — and **does not take the depth
|
|
121
111
|
test**: it has already cleared a bar this route has not, so gating it on a citation as well would
|
|
122
112
|
drop the one kind of finding both documents agree is never dropped. **That bar is the reason, and the
|
|
123
|
-
subject's depth is not
|
|
124
|
-
|
|
125
|
-
filings whose subject is the epic tooling, which the table above puts at depth 1
|
|
126
|
-
(joshuafolkken/kit#1675).
|
|
113
|
+
subject's depth is not.** Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why a
|
|
114
|
+
review branch-2 filing skips the depth test".
|
|
127
115
|
|
|
128
116
|
**This is not the count cap that was rejected.** A cap is rationing — past the number the finding is
|
|
129
117
|
lost, and nothing about it says which findings were worth having. This changes what counts as a
|
|
@@ -133,34 +121,26 @@ finding at all, so what it excludes is excluded for a reason a reader can check.
|
|
|
133
121
|
a depth-2 Issue that *proposes* a measurement; a pull request that *adds* one — a new report column,
|
|
134
122
|
section, scope or subcommand, a diagnostic step — states in its body the reader that consumes it: the
|
|
135
123
|
Issue number that read the value to decide something, or the path of the rule that reads it. **A
|
|
136
|
-
measurement with no reader is not added**
|
|
137
|
-
|
|
138
|
-
never has to be filed again. `route:tier-a` and `route:interrupt` carry over unchanged.
|
|
124
|
+
measurement with no reader is not added** (joshuafolkken/kit#2012). `route:tier-a` and
|
|
125
|
+
`route:interrupt` carry over unchanged.
|
|
139
126
|
|
|
140
127
|
### The depth-0 share — what is counted
|
|
141
128
|
|
|
142
|
-
**
|
|
143
|
-
|
|
144
|
-
2026-09-10 it produced 3/14 ≈ 21%, and the two figures **are not comparable**: they took different
|
|
145
|
-
denominators, and neither said which. So the denominator is fixed here as a rule rather than left to
|
|
146
|
-
the counter.
|
|
129
|
+
**The depth-0 share is the share of open Issues at depth 0** (joshuafolkken/kit#1698,
|
|
130
|
+
joshuafolkken/kit#1729).
|
|
147
131
|
|
|
148
132
|
**The denominator is a rule, not a choice, and this is it:**
|
|
149
133
|
|
|
150
|
-
- **Counted: every open Issue that does not carry `epic`.**
|
|
151
|
-
rather than a deliverable of its own — counting one counts its children twice, and an epic has no
|
|
152
|
-
subject of its own to read a depth off.
|
|
134
|
+
- **Counted: every open Issue that does not carry `epic`.**
|
|
153
135
|
- **`route:tier-a` and `route:interrupt` are counted like anything else.** The depth test above
|
|
154
|
-
exempts them from its *citation* requirement; it never said they are not work.
|
|
155
|
-
|
|
156
|
-
- **An Issue with no depth label is in the denominator**, counted separately as `unlabelled`. Left
|
|
157
|
-
out, the share would improve every time a filing skipped the label — the one direction a
|
|
158
|
-
measurement must never be able to move on its own.
|
|
136
|
+
exempts them from its *citation* requirement; it never said they are not work.
|
|
137
|
+
- **An Issue with no depth label is in the denominator**, counted separately as `unlabelled`.
|
|
159
138
|
- **The numerator is what is left**: open, non-epic Issues carrying `depth:0`.
|
|
160
139
|
|
|
161
|
-
**Two readings of the same backlog give the same number
|
|
162
|
-
|
|
163
|
-
|
|
140
|
+
**Two readings of the same backlog give the same number**: nothing in the count is left to the
|
|
141
|
+
counter's judgement.
|
|
142
|
+
|
|
143
|
+
Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the depth-0 denominator is fixed".
|
|
164
144
|
|
|
165
145
|
**What the number is for is not decided here.** Changing what `backlog:next` offers on the strength
|
|
166
146
|
of it, and setting a target value, are both deliberately out of scope until the current value has
|
|
@@ -168,17 +148,19 @@ been measured the same way more than once (joshuafolkken/kit#1729 → 範囲外)
|
|
|
168
148
|
|
|
169
149
|
### The ledger — where an observation that cannot cite a blockage goes
|
|
170
150
|
|
|
171
|
-
**
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
151
|
+
**An observation the depth test turns away is recorded in the ledger, not discarded**
|
|
152
|
+
(joshuafolkken/kit#1728). Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the
|
|
153
|
+
ledger exists".
|
|
154
|
+
|
|
155
|
+
- **The destination is the `docs/maintainers/observations/` directory in the repository the
|
|
156
|
+
observation is about** — the same repository the Issue would have been filed into — **one file per
|
|
157
|
+
issue** (joshuafolkken/kit#2919): append to `<N>.md` for the issue the run is executing (the number
|
|
158
|
+
its branch leads with, a lane's included), or to `<YYYY-MM-DD>.md` for a line written on the
|
|
159
|
+
default branch outside any issue's run. Parallel lanes therefore write different files, and their
|
|
160
|
+
pull requests never conflict on the ledger. **The count and the append are both run in that
|
|
161
|
+
repository's checkout** — in this repository, the work tree the run is in, a lane's inside a lane —
|
|
162
|
+
resolved the way §2c (`target-repository.md`) resolves any cross-repository target, and the
|
|
163
|
+
directory is created on the first append where that repository has none. **The subject decides, never the
|
|
182
164
|
working directory**: an observation about this package's own orchestration, seen while a run is
|
|
183
165
|
inside a repository that consumes it, is recorded here rather than there — the append follows the
|
|
184
166
|
subject, never the working directory. **A third-party target gets no line either** — Tier C covers
|
|
@@ -186,8 +168,8 @@ and it was filed anyway, because **discarding it was the only alternative on off
|
|
|
186
168
|
- **It is append-only.** A line is never edited and never deleted, because the count of lines
|
|
187
169
|
carrying one key is what says whether an observation has recurred; a second sighting is a second
|
|
188
170
|
line, not a rewrite of the first. **A merge conflict in it is resolved by keeping both sides** —
|
|
189
|
-
|
|
190
|
-
dropping either side destroys exactly what the
|
|
171
|
+
one file per issue should keep it from arising, but a repeated key is the whole signal, so
|
|
172
|
+
dropping either side destroys exactly what the ledger is for.
|
|
191
173
|
- **The completion report keeps its line too.** The ledger is what the next run can read; the report
|
|
192
174
|
is what this run's reader sees. Neither replaces the other.
|
|
193
175
|
- **The append is not the end of it** — a line only becomes readable to anyone else once it has
|
|
@@ -215,21 +197,21 @@ A sample, in the shape a real entry takes:
|
|
|
215
197
|
```
|
|
216
198
|
|
|
217
199
|
**`k:example` is reserved for this sample and is never used by a real observation**, so the count
|
|
218
|
-
below can be run over the whole
|
|
219
|
-
here rather than in the ledger**
|
|
220
|
-
|
|
221
|
-
leave every consumer's ledger shaped by hand.
|
|
200
|
+
below can be run over the whole ledger without the sample answering for one. **The grammar is defined
|
|
201
|
+
here rather than in the ledger** (`docs/maintainers/observation-filing-rationale.md` → "Why the
|
|
202
|
+
ledger exists").
|
|
222
203
|
|
|
223
204
|
**The identity key is the whole of the repeat test — never a similarity judgement about the prose.**
|
|
224
205
|
Choose the key from the phenomenon rather than from the run, then count what the ledger already holds
|
|
225
|
-
for it, in that repository's checkout rather than the working directory. **
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
206
|
+
for it, in that repository's checkout rather than the working directory. **Every file of the
|
|
207
|
+
directory is counted**, because a recurrence is a recurrence whichever issue's file each sighting
|
|
208
|
+
sits in. **The `|| true` is not decoration**: `grep -c` exits non-zero on a count of zero, which is
|
|
209
|
+
the first-sighting branch and the common one, so without it the step reads as a failed command
|
|
210
|
+
wherever an exit status is being watched. **A missing directory is still a first sighting** — `cat`
|
|
211
|
+
complains on standard error and the count is zero; the append below creates the directory.
|
|
230
212
|
|
|
231
213
|
```bash
|
|
232
|
-
|
|
214
|
+
cat <that repository's checkout>/docs/maintainers/observations/*.md | grep -c '^- k:<slug> |' || true
|
|
233
215
|
```
|
|
234
216
|
|
|
235
217
|
Free-text comparison is what the key exists to replace, so two lines that read alike under different
|
|
@@ -238,60 +220,40 @@ rather than by editing the one already written.
|
|
|
238
220
|
|
|
239
221
|
**The depth gate is not withdrawn, and this is not a way around it.** An observation that *can* cite
|
|
240
222
|
the depth-0 work it stopped is filed exactly as it was before — this route is only for the ones that
|
|
241
|
-
could not
|
|
242
|
-
unchanged).
|
|
223
|
+
could not.
|
|
243
224
|
|
|
244
225
|
### The commit path — how an appended line reaches the default branch
|
|
245
226
|
|
|
246
|
-
**An append nobody commits is an append nobody can count** (joshuafolkken/kit#1756).
|
|
247
|
-
|
|
248
|
-
nobody was going to commit one**: the parent session that appends never runs `pnpm josh git`, a child
|
|
249
|
-
runs it inside a lane work tree that cannot see the parent's checkout, and in the primary checkout
|
|
250
|
-
`git add -u` swept the line into whatever unrelated pull request that run was opening. Measured on
|
|
251
|
-
the day the ledger shipped, `docs/observations.md` had exactly one commit — the one that created
|
|
252
|
-
it — and seven lines had never left a working tree. **So the repeat count below was reading a file
|
|
253
|
-
that is empty on every other machine**, and every sighting was a first one, which is the state
|
|
254
|
-
joshuafolkken/kit#1728 created the ledger to end.
|
|
227
|
+
**An append nobody commits is an append nobody can count** (joshuafolkken/kit#1756). Rationale:
|
|
228
|
+
`docs/maintainers/observation-filing-rationale.md` → "Why the ledger has a commit path".
|
|
255
229
|
|
|
256
230
|
- **A run's appended lines ride its own commit** (joshuafolkken/kit#2763). `pnpm josh git` stages
|
|
257
|
-
`docs/maintainers/observations
|
|
231
|
+
`docs/maintainers/observations/` with the run's other changes, in the one staging step every entry
|
|
258
232
|
point goes through (`scripts/git/git-staging.ts`), so the lines are reviewed and merged with the
|
|
259
|
-
pull request of the run that recorded them, and the run's CI is the only wait they cost.
|
|
260
|
-
#2763 the ledger was excluded there (joshuafolkken/kit#1756) and every run that appended a line
|
|
261
|
-
paid a second branch, CI wait and merge after its own — 144 ledger-only pull requests in one month.
|
|
233
|
+
pull request of the run that recorded them, and the run's CI is the only wait they cost.
|
|
262
234
|
**Record before the commit, not after the merge:** a finding recorded with `pnpm josh review:record`
|
|
263
235
|
before `pnpm josh git -y` is carried; the time while CI runs is for the records that need no CI
|
|
264
236
|
result — filing an observation Issue, drafting the completion report.
|
|
265
237
|
- **A line that breaks the grammar is not carried** (joshuafolkken/kit#2123). The staging step parses
|
|
266
|
-
the ledger first — after moving lines still on
|
|
267
|
-
broken line leaves the ledger out of the
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
second review round's record
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
branch
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
at `pnpm josh run:carry --end`.
|
|
286
|
-
- **A lane child's pull request does not carry the lines, and that is deliberate.** Lanes run side by
|
|
287
|
-
side, and two pull requests that each append at the ledger's tail conflict with each other the
|
|
288
|
-
moment the first merges — a conflict ends the other's CI wait. The batch's single flush at
|
|
289
|
-
`run:carry --end` is already one pull request per batch, not one per child.
|
|
290
|
-
- **Run by hand it goes in the primary checkout, once per cycle rather than once per observation** —
|
|
291
|
-
but with the lines riding the run's commit and `pnpm josh followup` flushing the rest (above), a hand
|
|
292
|
-
run is the exception rather than the rule. It refuses off the default branch and refuses a working tree holding anything besides
|
|
293
|
-
the ledger, so a run in progress cannot be flushed out from under, and a lane's checkout is never
|
|
294
|
-
the one it acts on.
|
|
238
|
+
every file of the ledger first — after moving lines still on an old single-file path
|
|
239
|
+
(joshuafolkken/kit#2724, joshuafolkken/kit#2919) — and on a broken line leaves the ledger out of the
|
|
240
|
+
commit and says so; the commit itself goes ahead.
|
|
241
|
+
- **`pnpm josh followup` commits a line appended after the run's commit onto the pull request, before
|
|
242
|
+
the merge** (joshuafolkken/kit#2919) — a second review round's record is the usual case. After the
|
|
243
|
+
merge gates and before the CI wait, `followup` reads the tree and, **only when the ledger holds a
|
|
244
|
+
pending append**, stages the ledger paths alone, commits them and pushes the branch; the CI wait
|
|
245
|
+
that follows covers the pushed commit. A broken line refuses the merge, because the line would
|
|
246
|
+
otherwise be lost with the branch. A run whose lines rode its commit pays nothing.
|
|
247
|
+
- **A lane carries its own lines, in its own pull request** (joshuafolkken/kit#2919). Its writers
|
|
248
|
+
append to its own tree's `<N>.md`, so the two steps above take them to the default branch exactly as
|
|
249
|
+
they do for a run in the primary checkout. **Nothing is held in the primary checkout for later.**
|
|
250
|
+
- **`pnpm josh observations:flush` is left for a line written outside any issue's run** — the
|
|
251
|
+
date-named file a retrospective or a hand append on the default branch writes. It stages the ledger
|
|
252
|
+
and nothing else, commits it on a branch of its own, opens a docs-only pull request, waits on the
|
|
253
|
+
same required checks every other pull request waits on, merges it and returns the checkout to the
|
|
254
|
+
default branch; a single run's `run:tail` runs it after the merge. It refuses off the default branch
|
|
255
|
+
and refuses a working tree holding anything besides the ledger, so a run in progress cannot be
|
|
256
|
+
flushed out from under. **Nothing is committed to the default branch directly.**
|
|
295
257
|
- **Nothing to flush is an answer, not a failure.** With the ledger matching the commit it sits on
|
|
296
258
|
the command prints `clean` and exits 0 — most cycles append nothing, and a command that errored
|
|
297
259
|
there would be one nobody runs.
|
|
@@ -301,10 +263,9 @@ joshuafolkken/kit#1728 created the ledger to end.
|
|
|
301
263
|
|
|
302
264
|
### The second sighting is what files it
|
|
303
265
|
|
|
304
|
-
**A repeat is the citation
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
it is counted rather than judged:
|
|
266
|
+
**A repeat is the citation**, so the gate has a second way through, and it is counted rather than
|
|
267
|
+
judged (rationale: `docs/maintainers/observation-filing-rationale.md` → "Why a second sighting
|
|
268
|
+
files"):
|
|
308
269
|
|
|
309
270
|
- **On the count answering exactly `1`, the observation is filed**, at depth 1 or deeper, with no
|
|
310
271
|
depth-0 citation — `1` and not "1 or more", because a higher count means the Issue was already
|
|
@@ -337,19 +298,12 @@ could bite later" line (`backlogrun-child.md` → "What the summary carries, and
|
|
|
337
298
|
parent files what survives — under the depth test above, and inside the run's ceiling.
|
|
338
299
|
|
|
339
300
|
**A delegated child does not append to the ledger either — the parent collapses the duplicates and
|
|
340
|
-
appends what is left.** The
|
|
341
|
-
holding one Issue's worth of context cannot tell its observation from the sibling lane's: eight
|
|
342
|
-
children appending in parallel would write the same thing under eight keys, and every one of them
|
|
343
|
-
would then read as a first sighting. The child's route is unchanged and is the only one it has —
|
|
301
|
+
appends what is left.** The child's route is unchanged and is the only one it has —
|
|
344
302
|
the summary's "Observations that could bite later" line — and the parent chooses the key, checks the
|
|
345
|
-
count and writes the line.
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
filings of 2026-09-09 were collapsed to 12 within that same day, which means they were collapsible
|
|
350
|
-
at the moment they were made. And **the 10-per-run ceiling for this route is the parent's to
|
|
351
|
-
count**: six children counting two or three filings each never reach it, which is why it did not
|
|
352
|
-
fire once on the run that filed fifteen.
|
|
303
|
+
count and writes the line. **The 10-per-run ceiling for this route is the parent's to count.**
|
|
304
|
+
|
|
305
|
+
Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why a delegated child neither files
|
|
306
|
+
nor appends".
|
|
353
307
|
|
|
354
308
|
**This file is the single source of every procedure above**, and `SKILL.md` → §2i is the single
|
|
355
309
|
source of the rule they carry out; nothing under `prompts/collaboration-workflow/` restates either
|
|
@@ -7,7 +7,7 @@ from the gate onward. Rationale: `docs/maintainers/pre-gate-cut-rationale.md`
|
|
|
7
7
|
|
|
8
8
|
This file is the single source of the boundary. `run:cut` takes it, and `run:cut --resume` is the
|
|
9
9
|
check a fresh process makes at its own entry. **A second boundary is added below** — the
|
|
10
|
-
implementation-phase cut
|
|
10
|
+
implementation-phase cut, at a context threshold _during_ implementation.
|
|
11
11
|
Everything through "What is carried" describes the pre-gate cut; the later section states only what
|
|
12
12
|
differs.
|
|
13
13
|
|
|
@@ -23,7 +23,7 @@ verification the fresh process runs on the tree.
|
|
|
23
23
|
|
|
24
24
|
The cut is for a **detached** `fullrun` a lane dispatched; a person's interactive `fullrun` never
|
|
25
25
|
relaunches itself. A dispatched child is told apart **mechanically, by a mark the dispatch sets** — never
|
|
26
|
-
by the model reading the shape of its own prompt
|
|
26
|
+
by the model reading the shape of its own prompt.
|
|
27
27
|
|
|
28
28
|
### The dispatch mark
|
|
29
29
|
|
|
@@ -44,16 +44,15 @@ checkout, a cut in a lane.
|
|
|
44
44
|
|
|
45
45
|
## Taking the cut
|
|
46
46
|
|
|
47
|
-
**The order is fixed in the chain
|
|
47
|
+
**The order is fixed in the chain**: `chain-rule.md` step 1 issues
|
|
48
48
|
`pnpm josh run:cut <N>` after `pnpm josh main:merge`, before the scoped pair and the gate. **The command
|
|
49
|
-
is issued unconditionally**; `run:cut` itself decides whether the cut is warranted
|
|
50
|
-
(joshuafolkken/kit#2312), so a short lane with nothing to drop is answered `under-threshold` and walks on
|
|
49
|
+
is issued unconditionally**; `run:cut` itself decides whether the cut is warranted, so a short lane with nothing to drop is answered `under-threshold` and walks on
|
|
51
50
|
to the gate rather than relaunching.
|
|
52
51
|
|
|
53
52
|
At the pre-gate boundary, issue:
|
|
54
53
|
|
|
55
54
|
```bash
|
|
56
|
-
pnpm josh run:cut <N>
|
|
55
|
+
pnpm josh run:cut <N>
|
|
57
56
|
```
|
|
58
57
|
|
|
59
58
|
- `cut` (0) — record written and handed to the lane's launch owner (OpenAI supervisor starts the
|
|
@@ -72,25 +71,25 @@ the current process to carry the run on itself.
|
|
|
72
71
|
|
|
73
72
|
### The gate refuses until the cut has been taken (joshuafolkken/kit#1864)
|
|
74
73
|
|
|
75
|
-
**This step was carried as prose and fired exactly never.**
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
refusal is insurance, not the primary trigger. Rationale:
|
|
74
|
+
**This step was carried as prose and fired exactly never.** In measured lane children the cut was taken **0 times**, so
|
|
75
|
+
`pnpm josh rule:guard` **refuses `pnpm josh gate`** while this checkout is a lane and no cut record is
|
|
76
|
+
carried, handing back the command above. Rationale:
|
|
79
77
|
`docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
|
|
80
78
|
|
|
81
79
|
- **It fires for a marked child and nowhere else**: the working directory is a lane —
|
|
82
80
|
`<lane root>/<issue number>` — **and** `JOSH_LANE_CHILD` names that same issue. An interactive
|
|
83
81
|
`fullrun` carries no mark and runs its gate untouched. `run:cut` uses an open-lane lookup instead, so
|
|
84
82
|
the guard and the command need not agree byte for byte.
|
|
85
|
-
- **It fires only when the recent-window context warrants a cut
|
|
83
|
+
- **It fires only when the recent-window context warrants a cut**. The guard
|
|
86
84
|
reads the same `cost_cli.session_verdict` `run:cut` reads, so an `under`-threshold lane is let through
|
|
87
85
|
to the gate rather than refused.
|
|
88
86
|
- **It is silent once the cut is carried**, so the resumed process goes straight to the gate.
|
|
89
|
-
- **It fires once per run.**
|
|
87
|
+
- **It fires once per run.**
|
|
90
88
|
- **`--resume`, `--end` and `--json` do not count as taking the cut.**
|
|
91
89
|
|
|
92
90
|
The row, its trigger and the enumeration it joins are
|
|
93
|
-
`prompts/collaboration-workflow/rule-delivery.md
|
|
91
|
+
`prompts/collaboration-workflow/rule-delivery.md`. The suites that pin this and the three guards below:
|
|
92
|
+
`docs/maintainers/pre-gate-cut-rationale.md` → "Which suites pin each guard".
|
|
94
93
|
|
|
95
94
|
## Resuming — the fresh process's entry check
|
|
96
95
|
|
|
@@ -106,8 +105,7 @@ pnpm josh run:cut --resume <N>
|
|
|
106
105
|
- `resume` (0) — a declared pre-gate cut whose tree matches was verified and taken over. **Skip the
|
|
107
106
|
title, the plan, the fresh hold claim and the implementation**; re-read the issue body and comments
|
|
108
107
|
for the plan and the recorded decisions, then go straight to `pnpm josh gate`.
|
|
109
|
-
- `resume-impl` (0) — like `resume`, but the cut was taken **during** implementation
|
|
110
|
-
(joshuafolkken/kit#1933). Skip the title, the plan, the fresh hold claim and the split assessment,
|
|
108
|
+
- `resume-impl` (0) — like `resume`, but the cut was taken **during** implementation. Skip the title, the plan, the fresh hold claim and the split assessment,
|
|
111
109
|
re-read the plan, then **continue implementation** — do **not** go straight to the gate.
|
|
112
110
|
- `handed-off` (0) — a successor has already adopted this cut, `is_handed_off` is spent
|
|
113
111
|
(joshuafolkken/kit#1935). This process was woken **after** its own cut. **End the turn quietly and do
|
|
@@ -154,7 +152,7 @@ decisions are read back from the issue. Rationale:
|
|
|
154
152
|
|
|
155
153
|
## The implementation-phase cut — a lane child cuts before the gate too
|
|
156
154
|
|
|
157
|
-
The **implementation-phase cut**
|
|
155
|
+
The **implementation-phase cut** caps the context accumulated _during_
|
|
158
156
|
implementation — the child ends mid-implementation and a fresh one resumes the lane **back into
|
|
159
157
|
implementation**.
|
|
160
158
|
|
|
@@ -162,15 +160,15 @@ implementation**.
|
|
|
162
160
|
|
|
163
161
|
The guard below refuses on the same measurement the parent uses between children —
|
|
164
162
|
`cost_verdict.per_request_cost`, read through `cost_cli.session_verdict` (the read-only form of
|
|
165
|
-
`pnpm josh cost --cut
|
|
163
|
+
`pnpm josh cost --cut`), single-sourced at `backlogrun-progress.md` → "The
|
|
166
164
|
hand-off". The parent's seam and the child's `run_cut.IMPLEMENTATION_CONTEXT_THRESHOLD` share the
|
|
167
165
|
**135_000** `CONTEXT_CUT_THRESHOLD` (aliased so the tests cannot drift). No separate measurement is
|
|
168
166
|
built for the lane child.
|
|
169
167
|
|
|
170
168
|
### It is a guard, fired at the edit that crosses the threshold (joshuafolkken/kit#2310)
|
|
171
169
|
|
|
172
|
-
**This step was carried as prose and fired exactly never** —
|
|
173
|
-
|
|
170
|
+
**This step was carried as prose and fired exactly never** — the cut fired **0 times** while 33.9% of
|
|
171
|
+
lane requests ran past 200,000 tokens. Rationale:
|
|
174
172
|
`docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
|
|
175
173
|
|
|
176
174
|
So `pnpm josh rule:guard` **refuses an `Edit` / `Write`** while this checkout is a dispatched lane child
|
|
@@ -185,7 +183,7 @@ crossing one successor.
|
|
|
185
183
|
- **It fires for a marked child, or a run held outside a lane on a measured `over`**
|
|
186
184
|
(joshuafolkken/kit#2760); a person's tree holds no run. Outside a lane `cut` relaunches nothing: keep
|
|
187
185
|
the hold, send a `confirmation` Telegram naming `fullrun #<N>`, end the turn.
|
|
188
|
-
- **It fires on every threshold crossing, not once per run**
|
|
186
|
+
- **It fires on every threshold crossing, not once per run** — it re-asks on
|
|
189
187
|
each over-threshold edit, including after a `busy` / `failed` / `unready` verdict.
|
|
190
188
|
- **An edit reissued right after a refusal passes** — so a `busy` / `failed` cut cannot wedge the run:
|
|
191
189
|
the reissue lands inside a short window and goes through, a genuinely new crossing past it refuses
|
|
@@ -196,8 +194,8 @@ crossing one successor.
|
|
|
196
194
|
- **The verdict read is reused over a short window** — cached per checkout for a few seconds, so a
|
|
197
195
|
turn's burst of edits shares one read.
|
|
198
196
|
|
|
199
|
-
`scripts/rules/implementation-cut.ts` implements the trigger,
|
|
200
|
-
|
|
197
|
+
`scripts/rules/implementation-cut.ts` implements the trigger, and the row joins
|
|
198
|
+
`prompts/collaboration-workflow/rule-delivery.md`. **A child that ended
|
|
201
199
|
without cutting is still detected after the fact by `pnpm josh run:ending <N> --output <path>`**
|
|
202
200
|
(joshuafolkken/kit#2139). **A single check (`lint:related` / `test:related`) is run after a batch of
|
|
203
201
|
edits, not after each one.**
|
|
@@ -206,12 +204,10 @@ edits, not after each one.**
|
|
|
206
204
|
|
|
207
205
|
**`CONTEXT_CUT_THRESHOLD` (135_000) is one value, and `cost_verdict.per_request_cost` — the one
|
|
208
206
|
statistic the parent and the lane child both read — averages the most recent `RECENT_REQUEST_WINDOW`
|
|
209
|
-
(10) requests, not the whole session
|
|
210
|
-
|
|
211
|
-
cut's one-time preamble rewrite (`POST_CUT_CONTEXT`, ~60_000 tokens — a cut carries a request from ~130k
|
|
212
|
-
down to ~60k), the cache multipliers in `cost-pricing.ts`, and a 10-request horizon.
|
|
207
|
+
(10) requests, not the whole session**. The value is computed by
|
|
208
|
+
`scripts/cost-runtime/context-cut-payback.ts`, its single source.
|
|
213
209
|
|
|
214
|
-
**The cut is conditional
|
|
210
|
+
**The cut is conditional**: taken only when the recent-window per-request cost
|
|
215
211
|
is over `CONTEXT_CUT_THRESHOLD` — the same statistic and threshold the implementation-phase cut reads, so
|
|
216
212
|
no second threshold exists. Below it `run:cut` answers `under-threshold` and the gate runs uncut; the
|
|
217
213
|
guard reads the same verdict and stays silent. An **unmeasurable** session is always cut.
|
|
@@ -227,8 +223,8 @@ cut is the same pattern one boundary earlier.
|
|
|
227
223
|
## A lane child records its park before it stops
|
|
228
224
|
|
|
229
225
|
**A dispatched lane child records its park on the Issue before it stops for a decision**
|
|
230
|
-
(joshuafolkken/kit#2034). A headless child's only route to ask a person is to park the Issue
|
|
231
|
-
|
|
226
|
+
(joshuafolkken/kit#2034). A headless child's only route to ask a person is to park the Issue (#2012,
|
|
227
|
+
#2011). Rationale:
|
|
232
228
|
`docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
|
|
233
229
|
|
|
234
230
|
**The record, before the Telegram, is the park procedure exactly** — `needs-decision` plus a comment
|
|
@@ -255,21 +251,22 @@ lane child — the mark `JOSH_LANE_CHILD` names this lane's own issue — handin
|
|
|
255
251
|
on the compliant path is safe.
|
|
256
252
|
|
|
257
253
|
This section is the single source of the lane-child park rule; `scripts/rules/lane-park.ts` implements
|
|
258
|
-
the trigger,
|
|
254
|
+
the trigger, and the row joins the enumeration in
|
|
259
255
|
`prompts/collaboration-workflow/rule-delivery.md`.
|
|
260
256
|
|
|
261
257
|
### The interactive ask is refused one call earlier
|
|
262
258
|
|
|
263
259
|
(joshuafolkken/kit#2201) The harness refuses an interactive ask in a headless session by **ending the
|
|
264
|
-
turn**, so the notify guard never fires — #
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
260
|
+
turn**, so the notify guard never fires (#2178 — the failure joshuafolkken/kit#2034 set out to prevent,
|
|
261
|
+
one call upstream). So `pnpm josh rule:guard` **refuses `AskUserQuestion` for a marked lane child**; the
|
|
262
|
+
deny returns to the model, and the instruction is to park the question. It fires on **every occurrence**
|
|
263
|
+
and stays silent for a person working in a lane. Rationale:
|
|
264
|
+
`docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
|
|
268
265
|
|
|
269
266
|
**A child that slips past it is still recoverable** — `pnpm josh run:ending` lifts the refused ask out
|
|
270
267
|
of the exit record's `permission_denials` into the `abandoned` verdict's park basis, so the parent puts
|
|
271
|
-
it into the park comment. `scripts/rules/lane-interactive-ask.ts` implements the trigger,
|
|
272
|
-
`scripts/
|
|
268
|
+
it into the park comment. `scripts/rules/lane-interactive-ask.ts` implements the trigger, and
|
|
269
|
+
`scripts/agent/interactive-ask.ts` is the
|
|
273
270
|
shared extractor the guard and `run:ending` both read.
|
|
274
271
|
|
|
275
272
|
This file is the single source of the rule.
|
|
@@ -18,7 +18,7 @@ another is the failure this section exists to prevent:
|
|
|
18
18
|
| A defect originating in **another package** | File the upstream Issue and **stop** — Tier A for a first-party target; a third-party one is Tier C, recorded and drafted rather than filed (`CLAUDE.md` → "Cross-package problems"; `prompts/collaboration-workflow/upstream-interrupt.md`) |
|
|
19
19
|
| This Issue was really **several** (a split) | File the children and the epic and **stop** — except under `backlogrun`, whose authorization already covers a batch, so the children are filed and run through (`split-assessment.md`) |
|
|
20
20
|
| Another Issue in **this** repository has to land first (**a prerequisite**) | This section |
|
|
21
|
-
| Something worth filing that is **none of the three** (**an observation**) | File it **without asking** — Tier A for a first-party target — and **carry the run straight on**: nothing is stashed, nothing is parked (§2i). **A delegated child does not file here**, and a filing at depth 1 or deeper cites the depth-0 work it blocked; one that cannot cite it goes to `docs/maintainers/observations
|
|
21
|
+
| Something worth filing that is **none of the three** (**an observation**) | File it **without asking** — Tier A for a first-party target — and **carry the run straight on**: nothing is stashed, nothing is parked (§2i). **A delegated child does not file here**, and a filing at depth 1 or deeper cites the depth-0 work it blocked; one that cannot cite it goes to the run's own `docs/maintainers/observations/<N>.md` and is filed on its second sighting — all of them §2i's |
|
|
22
22
|
|
|
23
23
|
**File the prerequisite with the `route:tier-a` label**, so a Tier A filing made during implementation
|
|
24
24
|
stays countable by filing route afterwards. **This paragraph belongs to the prerequisite row, not to
|