@joshuafolkken/kit 1.1229.0 → 1.1370.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/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +24 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +213 -197
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -201
- package/dist/josh.js +540 -137
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +4 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +313 -0
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +60 -53
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +12 -8
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +35 -0
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +49 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +32 -34
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +33 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +10 -10
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +20 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +44 -30
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +140 -0
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +68 -37
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +10 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +172 -43
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +62 -48
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +13 -21
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -328
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +129 -98
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -6,13 +6,12 @@ import { lane_guard_policy, type LaneGuardMode } from '#scripts/lane/lane-guard-
|
|
|
6
6
|
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
7
7
|
import { investigation_reads } from './investigation-reads'
|
|
8
8
|
|
|
9
|
-
// The disk half of the investigation-delegation threshold
|
|
9
|
+
// The disk half of the investigation-delegation threshold: find the
|
|
10
10
|
// transcript, read enough of its end, count the files read and not edited since the last delegated
|
|
11
11
|
// unit, and refuse the read that takes that count up to the threshold.
|
|
12
12
|
//
|
|
13
|
-
// **It is a `PreToolUse` hook because the rule it enforces
|
|
14
|
-
//
|
|
15
|
-
// asked the question once and read 8 more unedited files without asking again. The counting is
|
|
13
|
+
// **It is a `PreToolUse` hook because the rule it enforces fails as prose**: a run that asks the
|
|
14
|
+
// question once reads on without asking again. The counting is
|
|
16
15
|
// `investigation-reads.ts`, and the shell — the six steps every refusing hook takes, every one of
|
|
17
16
|
// which allows the call when it fails — is `hook-decision.ts`, shared with `batch-guard.ts`.
|
|
18
17
|
|
|
@@ -23,16 +22,14 @@ import { investigation_reads } from './investigation-reads'
|
|
|
23
22
|
const SWITCH_ENV_KEY = 'JOSH_INVESTIGATION_GUARD'
|
|
24
23
|
|
|
25
24
|
// This guard's refusal record, and the notice's own record — distinct so a lane-child notice never
|
|
26
|
-
// spends the refusal's stamp
|
|
25
|
+
// spends the refusal's stamp, the same split the batching guard keeps.
|
|
27
26
|
const STAMP_PREFIX = 'josh-investigation-guard-'
|
|
28
27
|
const NOTICE_STAMP_PREFIX = 'josh-investigation-guard-notice-'
|
|
29
28
|
|
|
30
|
-
// **How the guard behaves for the session in hand, decided from the one-place enumeration
|
|
31
|
-
//
|
|
32
|
-
// guard
|
|
33
|
-
//
|
|
34
|
-
// but #2382 measured six lane children reading 4–17 unedited files each and dispatching sub-agents, so
|
|
35
|
-
// the reading was there to send out. The enumeration reads `JOSH_LANE_CHILD` against this checkout's own
|
|
29
|
+
// **How the guard behaves for the session in hand, decided from the one-place enumeration**.
|
|
30
|
+
// Outside a lane child the mode is `refuse` and the
|
|
31
|
+
// guard refuses; in a dispatched lane child it is `notice`, because a lane child does read unedited
|
|
32
|
+
// files and can dispatch sub-agents, so the reading is there to send out. The enumeration reads `JOSH_LANE_CHILD` against this checkout's own
|
|
36
33
|
// issue only for a guard whose mode it would change, so a person working in a lane sees the guard
|
|
37
34
|
// unchanged. It wraps `investigation_reads.should_block` here rather than inside it so the pure counting
|
|
38
35
|
// rule stays free of process state and its own suite keeps testing it directly.
|
|
@@ -40,9 +37,9 @@ function investigation_mode(): LaneGuardMode {
|
|
|
40
37
|
return lane_guard_policy.mode_here('investigation')
|
|
41
38
|
}
|
|
42
39
|
|
|
43
|
-
// A refusable call is refused only where the mode is `refuse` — the main line. A lane child is
|
|
44
|
-
//
|
|
45
|
-
// turn
|
|
40
|
+
// A refusable call is refused only where the mode is `refuse` — the main line. A lane child is
|
|
41
|
+
// `notice`, so it reaches the notice branch and is withheld the refusal that would end its headless
|
|
42
|
+
// turn; an `off` some future enumeration sets stays silent here too.
|
|
46
43
|
function should_block(
|
|
47
44
|
tail: string,
|
|
48
45
|
call: GuardedCall,
|
|
@@ -54,7 +51,7 @@ function should_block(
|
|
|
54
51
|
return investigation_reads.should_block(tail, call, refused_at_ms, run)
|
|
55
52
|
}
|
|
56
53
|
|
|
57
|
-
// The lane-child notice: the same threshold, delivered without a `permissionDecision
|
|
54
|
+
// The lane-child notice: the same threshold, delivered without a `permissionDecision`. It
|
|
58
55
|
// reads the notify stamp's own record, so a notice never spends the refusal's stamp and re-arms on the
|
|
59
56
|
// next accumulation exactly as the refusal does.
|
|
60
57
|
function should_notify(
|
|
@@ -68,15 +65,14 @@ function should_notify(
|
|
|
68
65
|
return investigation_reads.should_block(tail, call, notified_at_ms, run)
|
|
69
66
|
}
|
|
70
67
|
|
|
71
|
-
// **The lane-child counterpart of REASON, delivered as a notice rather than a refusal
|
|
72
|
-
//
|
|
68
|
+
// **The lane-child counterpart of REASON, delivered as a notice rather than a refusal**.
|
|
69
|
+
// A dispatched lane child ends its turn on a denial, so
|
|
73
70
|
// the same guidance is carried without a `permissionDecision`: the read proceeds and the child is nudged
|
|
74
71
|
// to delegate rather than killed. It carries no ⛔, so a person watching reads it as advice.
|
|
75
72
|
const NOTICE = `💡 investigation: files read and not edited, or search turns, since the last delegated unit reached the threshold, so the reading from here should go to a unit of its own. This is a notice, not a refusal — the read proceeds, because a dispatched lane child ends its turn on a denial. Ask \`pnpm josh delegate investigation\`, then dispatch the \`${investigation_reads.INVESTIGATOR_AGENT}\` agent (\`kit:${investigation_reads.INVESTIGATOR_AGENT}\` in a consumer) with a brief of what the main line has already concluded and what is left to find out; it returns the conclusion plus its \`file:line\` citations, never the file text. Keep a read in the main line only where this run will edit that file. This recurs on the next accumulation.`
|
|
76
73
|
|
|
77
|
-
// The notice as it reaches the model: the base guidance with the concrete unedited reads named
|
|
78
|
-
//
|
|
79
|
-
// the #2276 precedent against the generic notice #2164 → #2178 measured not to move the number. An empty
|
|
74
|
+
// The notice as it reaches the model: the base guidance with the concrete unedited reads named, so a
|
|
75
|
+
// lane child is shown *which* reads to send to a unit rather than only told to delegate. An empty
|
|
80
76
|
// set names nothing and the notice falls back to its guidance alone. The call is part of the notify
|
|
81
77
|
// contract but this guard's wording depends on the tail alone.
|
|
82
78
|
function notice_text(_call: GuardedCall, tail: string): string {
|
|
@@ -95,7 +91,7 @@ const GUARD = hook_decision.create_transcript_guard({
|
|
|
95
91
|
is_candidate: investigation_reads.is_refusable_call,
|
|
96
92
|
should_block,
|
|
97
93
|
reason: investigation_reads.REASON,
|
|
98
|
-
// The lane-child notice fires where the refusal is withheld
|
|
94
|
+
// The lane-child notice fires where the refusal is withheld, on a record of its own so it
|
|
99
95
|
// never spends the refusal's stamp.
|
|
100
96
|
notify: {
|
|
101
97
|
prefix: NOTICE_STAMP_PREFIX,
|
|
@@ -108,7 +104,7 @@ const investigation_refusal = GUARD.refusal
|
|
|
108
104
|
const investigation_outcome = GUARD.outcome
|
|
109
105
|
const { is_enabled, refusal_path } = GUARD
|
|
110
106
|
// The notice's stamp path, exposed the way `refusal_path` is so a test can clean it apart from the
|
|
111
|
-
// refusal's record
|
|
107
|
+
// refusal's record.
|
|
112
108
|
const investigation_notice_path = hook_decision.create_refusal_stamp(NOTICE_STAMP_PREFIX).path
|
|
113
109
|
const { deny_envelope, load_environment_file, DISABLED_VALUES } = hook_decision
|
|
114
110
|
|
|
@@ -9,37 +9,15 @@ import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
|
9
9
|
import { time_spans, type Span } from '#scripts/time-runtime/time-spans'
|
|
10
10
|
import { delegation_policy } from './delegation-policy'
|
|
11
11
|
|
|
12
|
-
// How many files a run has read and not edited
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
// **joshuafolkken/kit#1426 made the threshold a count rather than a forecast, and left the counting
|
|
16
|
-
// to the agent.** Measured on run #1441, that is a one-shot judgement: `josh delegate investigation`
|
|
17
|
-
// was called once at t+4.0 min, the unit returned at t+7.2, and the main line then read **8 more
|
|
18
|
-
// files it did not edit** — more than twice the threshold — without the question being asked a second
|
|
19
|
-
// time. The count is a memory, and after a delegation the run remembers the *step* as done rather
|
|
20
|
-
// than the *counter* as reset.
|
|
21
|
-
//
|
|
22
|
-
// **So the counting happens here, off the transcript, and not in the agent's head.** A delegation
|
|
23
|
-
// clears the set; a read adds to it; an edit takes its file back out of it. Nothing has to be
|
|
24
|
-
// remembered, which is why the threshold necessarily fires again — a second accumulation is
|
|
25
|
-
// indistinguishable from the first.
|
|
26
|
-
//
|
|
27
|
-
// **Why a mechanism and not wording.** joshuafolkken/kit#1344 measured three consecutive runs after
|
|
28
|
-
// the batching norm was distributed as prose and as a live notice: 1.10–1.12 calls per round trip
|
|
29
|
-
// against a 1.50 floor, unchanged. joshuafolkken/kit#1390 read that as the answer — intervene in the
|
|
30
|
-
// decision instead of describing it — and this is the same conclusion applied to the same class of
|
|
31
|
-
// rule. The wording is corrected too, but it is not what is expected to move the number.
|
|
12
|
+
// How many files a run has read and not edited since its last delegated unit, counted off the
|
|
13
|
+
// transcript rather than left to the agent's memory, so the threshold fires again on a second
|
|
14
|
+
// accumulation. A delegation clears the set; a read adds to it; an edit exempts its file.
|
|
32
15
|
|
|
33
16
|
const READ_TOOLS: ReadonlySet<string> = new Set(['Read'])
|
|
34
|
-
//
|
|
35
|
-
// both spellings are in use: `Task` in the published tool set, `Agent` in this harness's transcripts.
|
|
36
|
-
// Neither has a constant anywhere, so the pair is named here rather than matched loosely.
|
|
17
|
+
// Both spellings of the subagent tool are in use: `Task` (published) and `Agent` (this harness).
|
|
37
18
|
const DELEGATION_TOOLS: ReadonlySet<string> = new Set(['Agent', 'Task'])
|
|
38
19
|
|
|
39
|
-
//
|
|
40
|
-
// calls are bundleable, and it holds `grep`, `ls` and `wc` — commands that report *about* a file
|
|
41
|
-
// without carrying its text. What this rule counts is text arriving in the prompt, so only the
|
|
42
|
-
// commands that print a file belong here.
|
|
20
|
+
// Narrower than `time-bundle-call.ts`'s `READ_COMMANDS`: only commands that print file text count.
|
|
43
21
|
const CONTENT_READ_COMMANDS: ReadonlyArray<string> = [
|
|
44
22
|
'bat',
|
|
45
23
|
'cat',
|
|
@@ -50,83 +28,50 @@ const CONTENT_READ_COMMANDS: ReadonlyArray<string> = [
|
|
|
50
28
|
'sed',
|
|
51
29
|
'tail',
|
|
52
30
|
]
|
|
53
|
-
// Built through `bash_label` so the `Bash: ` prefix is spelled in one place — the labels on a span
|
|
54
|
-
// come from that same function.
|
|
55
31
|
const CONTENT_READ_LABELS: ReadonlySet<string> = new Set(
|
|
56
32
|
CONTENT_READ_COMMANDS.map((command) => time_shell.bash_label(command)),
|
|
57
33
|
)
|
|
58
34
|
|
|
59
|
-
//
|
|
60
|
-
// (joshuafolkken/kit#3139). The file count above never saw a `grep`, yet searches were the commonest
|
|
61
|
-
// exploration turn a lane took — 457 of them in one day, each re-reading the main line's whole context.
|
|
62
|
-
// What a search costs is the turn, so a turn is the unit: parallel searches in one turn count once.
|
|
35
|
+
// A search carries no file text but costs a turn, so searches count in turns: parallel ones count once.
|
|
63
36
|
const SEARCH_COMMANDS: ReadonlyArray<string> = ['fd', 'find', 'grep', 'rg']
|
|
64
37
|
const SEARCH_LABELS: ReadonlySet<string> = new Set(
|
|
65
38
|
SEARCH_COMMANDS.map((command) => time_shell.bash_label(command)),
|
|
66
39
|
)
|
|
67
40
|
|
|
68
|
-
//
|
|
69
|
-
// the parent's model at a lowered effort. A consumer receives it through the plugin as `kit:investigator`.
|
|
41
|
+
// `.claude/agents/investigator.md`; a consumer receives it through the plugin as `kit:investigator`.
|
|
70
42
|
const INVESTIGATOR_AGENT = 'investigator'
|
|
71
43
|
|
|
72
|
-
//
|
|
73
|
-
// because the deny reason is the only text that reaches the model — a run that is refused and told
|
|
74
|
-
// nothing reads it as a broken tool.
|
|
44
|
+
// The deny reason is the only text that reaches the model, so it names the count, command and return shape.
|
|
75
45
|
const REASON = `⛔ investigation: ${String(delegation_policy.INVESTIGATION_FILE_THRESHOLD)} files read and not edited, or ${String(delegation_policy.INVESTIGATION_SEARCH_TURN_THRESHOLD)} search turns, since the last delegated unit, so the reading from here goes to a unit of its own (a successful write also starts the search count over). Ask \`pnpm josh delegate investigation\`, then dispatch the \`${INVESTIGATOR_AGENT}\` agent (\`kit:${INVESTIGATOR_AGENT}\` in a consumer) with a brief of what the main line has already concluded and what is left to find out; it returns the conclusion plus its \`file:line\` citations, never the file text. Keep a read in the main line only where this run will edit that file — an \`Edit\` cannot be issued against text you do not hold. This run's own instructions and the harness's own session files — a backgrounded call's output, a persisted tool result, this session's scratchpad — never count toward the files, so they are not what took the file count here; every read-only search turn counts, whatever it names. The rule is \`.claude/skills/workflow-commands/delegation.md\` → "The pre-implementation reading".`
|
|
76
46
|
|
|
77
47
|
interface ReadTally {
|
|
78
|
-
// The files read and not since edited, resolved
|
|
48
|
+
// The files read and not since edited, resolved.
|
|
79
49
|
pending: ReadonlyArray<string>
|
|
80
|
-
// How many
|
|
81
|
-
// in the one call that matters (joshuafolkken/kit#1764). It is the second way a refusal re-arms:
|
|
82
|
-
// a run that ignores the one refusal it gets goes on accumulating, and a threshold's worth of new
|
|
83
|
-
// unedited files is a second accumulation whatever the run did about the first.
|
|
50
|
+
// How many entered after the refusal's instant — a second accumulation re-arms the refusal.
|
|
84
51
|
pending_since: number
|
|
85
|
-
// When the last delegated unit closed, or `NEVER_MS` where the window holds none.
|
|
86
|
-
// re-arms a refusal: a delegation after the recorded one is a new accumulation.
|
|
52
|
+
// When the last delegated unit closed, or `NEVER_MS` where the window holds none.
|
|
87
53
|
reset_ms: number
|
|
88
|
-
//
|
|
89
|
-
// delegation any more, because the delegation that would re-arm it has scrolled out.
|
|
54
|
+
// A refusal older than this can no longer be checked against a delegation.
|
|
90
55
|
window_start_ms: number
|
|
91
|
-
// The search
|
|
92
|
-
// the instant asked about — the search-side `pending` / `pending_since` (joshuafolkken/kit#3139).
|
|
56
|
+
// The search-side `pending` / `pending_since`, reset by a delegation or a successful write.
|
|
93
57
|
searches: number
|
|
94
58
|
searches_since: number
|
|
95
|
-
//
|
|
96
|
-
// A re-read of one of them is a read of a file the run edited, which `delegation.md` keeps in the main line — so
|
|
97
|
-
// it is excluded from the count and from a call's projected growth rather than counted as fresh
|
|
98
|
-
// investigation.
|
|
59
|
+
// Files successfully edited in the window; a read of one stays in the main line, so it never counts.
|
|
99
60
|
edited: ReadonlySet<string>
|
|
100
61
|
}
|
|
101
62
|
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
// a skill file are read to find out what to *do*, they are read by nearly every run, and a unit cannot
|
|
105
|
-
// be sent to read them on the main line's behalf. #1441's own measurement excluded 5 of them by hand
|
|
106
|
-
// for exactly this reason, and a count that includes them trips on a run that has investigated nothing.
|
|
107
|
-
//
|
|
108
|
-
// **Matched against the path relative to the repository root, so `prompts` means *this* repository's**:
|
|
109
|
-
// `includes('prompts/')` also exempted `scripts/eval/prompts/x.ts`, which is subject code, and
|
|
110
|
-
// `endsWith('CLAUDE.md')` also exempted `MY_CLAUDE.md`. A file outside the checkout is subject
|
|
111
|
-
// material like any other — only these paths inside it are the run's own instructions.
|
|
63
|
+
// The run's own instructions are not the Issue's subject and cannot be delegated, so they never count.
|
|
64
|
+
// Matched relative to the repository root, so `scripts/eval/prompts/x.ts` stays subject code.
|
|
112
65
|
const INSTRUCTION_PATHS: ReadonlyArray<string> = ['prompts', '.claude/skills']
|
|
113
66
|
const INSTRUCTION_FILES: ReadonlySet<string> = new Set(['CLAUDE.md', 'AGENTS.md', 'GEMINI.md'])
|
|
114
67
|
const REPOSITORY_ROOT = process.cwd()
|
|
115
68
|
|
|
116
|
-
//
|
|
117
|
-
// `file_path`, which Claude Code requires to be absolute; a shell line carries the word as it was
|
|
118
|
-
// typed, normalized only for a leading `./`. Left as they are, `cat scripts/x.ts` followed by an
|
|
119
|
-
// `Edit` of `/…/scripts/x.ts` never cancels — the file stays pending for the rest of the run — and
|
|
120
|
-
// reading the same file once each way counts twice.
|
|
69
|
+
// A tool call carries an absolute `file_path`, a shell line a relative word; resolve so both compare.
|
|
121
70
|
function resolved(target: string): string {
|
|
122
71
|
return path.resolve(REPOSITORY_ROOT, target)
|
|
123
72
|
}
|
|
124
73
|
|
|
125
|
-
//
|
|
126
|
-
// absolute string made every file in the repository an instruction document for anyone whose checkout
|
|
127
|
-
// sits under a directory called `prompts` — which disarmed the guard entirely, in silence.
|
|
128
|
-
// Both path predicates below ask the same question of the repository root, so the expression is named
|
|
129
|
-
// once rather than written twice — they differ only in what they do with the answer.
|
|
74
|
+
// Anchored at the repository root: a checkout under a `prompts` directory must not exempt everything.
|
|
130
75
|
function repository_relative(absolute: string): string {
|
|
131
76
|
return path.relative(REPOSITORY_ROOT, absolute)
|
|
132
77
|
}
|
|
@@ -141,52 +86,21 @@ function is_instruction_document(target: string): boolean {
|
|
|
141
86
|
)
|
|
142
87
|
}
|
|
143
88
|
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
// backgrounded call's result reaches its run *only* as `tasks/<id>.output` under this session's temp
|
|
147
|
-
// tree, and a tool result too large for the transcript reaches it *only* as a file the harness wrote
|
|
148
|
-
// under `.claude/projects/`. Refusing either refuses a run the answer to an instruction it issued
|
|
149
|
-
// itself — and the remedy the refusal names does not exist for a file that belongs to this session
|
|
150
|
-
// alone, so the round trip buys nothing and the read is simply reissued.
|
|
151
|
-
//
|
|
152
|
-
// **Anchored on a directory the harness *writes*, never on the session tree as a whole.** Exempting
|
|
153
|
-
// the whole tree would have disarmed the guard in silence for anything a run unpacks or clones into
|
|
154
|
-
// its scratchpad to investigate — real subject material, read to find out how something works, that
|
|
155
|
-
// would never have reached the count. That is the failure the instruction-document half's own anchor
|
|
156
|
-
// note describes, and it is why the scratchpad is deliberately **not** exempt: what stays exempt is
|
|
157
|
-
// what the harness itself wrote.
|
|
89
|
+
// The harness's own session files (backgrounded output, persisted results) cannot be delegated either.
|
|
90
|
+
// Only what the harness writes is exempt — the scratchpad holds real subject material and still counts.
|
|
158
91
|
const SESSION_TEMP_SEGMENT = /^claude-\d+$/u
|
|
159
|
-
// **Single-sourced from `cost-transcript.ts`**, which already owns where the harness keeps a session's
|
|
160
|
-
// state and builds the transcript directory out of it — spelling `.claude/projects` a second time here
|
|
161
|
-
// is the clone `CLAUDE.md` prohibits. That module joins the value onto a home directory and this one
|
|
162
|
-
// matches it as a run of segments, so what the two share is the fact rather than the use.
|
|
163
|
-
//
|
|
164
|
-
// **The `tasks/<id>.output` spelling is deliberately *not* borrowed from `time-background.ts`.** This
|
|
165
|
-
// rule matches the session *tree*, which covers that file, the scratchpad and the transcript in one
|
|
166
|
-
// test; matching the file name would need a second rule for each of the others.
|
|
167
92
|
const SESSION_STATE_SEGMENTS = cost_transcript.TRANSCRIPT_ROOT.split(path.sep)
|
|
168
|
-
//
|
|
169
|
-
// backgrounded call's result — and **both halves are required**. The directory name alone is not
|
|
170
|
-
// enough: `tasks/` is one of the commonest directory names a repository has, and a run may unpack or
|
|
171
|
-
// clone one into its scratchpad, where matching the name would re-open the silent false negative one
|
|
172
|
-
// level down. Persisted tool results and the transcript need no entry here at all — they live under
|
|
173
|
-
// the state root above, which is exempt whole.
|
|
93
|
+
// Both halves of `tasks/<id>.output` are required: `tasks/` alone is a common repository directory.
|
|
174
94
|
const HARNESS_OUTPUT_DIRECTORY = 'tasks'
|
|
175
95
|
const HARNESS_OUTPUT_EXTENSION = '.output'
|
|
176
|
-
// `at()` counts from the end, so the file itself is -1 and the directory holding it is -2.
|
|
177
96
|
const FILE_SEGMENT_INDEX = -1
|
|
178
97
|
const PARENT_SEGMENT_INDEX = -2
|
|
179
98
|
|
|
180
|
-
// The state root holds
|
|
181
|
-
// It is not anchored to the home directory: `cost-transcript.ts` is this package's only file allowed
|
|
182
|
-
// to look that up at all (`scripts/hooks/no-global-shim-write.test.ts`), and two adjacent segments outside
|
|
183
|
-
// the checkout are specific enough without it.
|
|
99
|
+
// The state root holds no subject code, so it is exempt whole.
|
|
184
100
|
function has_state_root(segments: ReadonlyArray<string>, index: number): boolean {
|
|
185
101
|
return SESSION_STATE_SEGMENTS.every((segment, offset) => segments[index + offset] === segment)
|
|
186
102
|
}
|
|
187
103
|
|
|
188
|
-
// The file's **own parent** is tested rather than any directory above it, and the name has to match
|
|
189
|
-
// as well — see the shape note above for why one without the other is not enough.
|
|
190
104
|
function is_harness_output(segments: ReadonlyArray<string>): boolean {
|
|
191
105
|
return (
|
|
192
106
|
segments.some((segment) => SESSION_TEMP_SEGMENT.test(segment)) &&
|
|
@@ -195,12 +109,7 @@ function is_harness_output(segments: ReadonlyArray<string>): boolean {
|
|
|
195
109
|
)
|
|
196
110
|
}
|
|
197
111
|
|
|
198
|
-
//
|
|
199
|
-
// instruction-document test above is anchored at the repository root because matching the absolute
|
|
200
|
-
// string made every file an instruction document for a checkout sitting under a directory called
|
|
201
|
-
// `prompts`; this test cannot borrow that anchor, since the files it names live outside the checkout by
|
|
202
|
-
// construction. So the anchor is inverted — leaving the repository is a precondition — and a
|
|
203
|
-
// repository file can therefore never be exempted here, whatever it is named.
|
|
112
|
+
// Leaving the checkout is a precondition, so no repository file is ever exempted as a session artifact.
|
|
204
113
|
function is_outside_repository(absolute: string): boolean {
|
|
205
114
|
return repository_relative(absolute).startsWith('..')
|
|
206
115
|
}
|
|
@@ -218,14 +127,11 @@ function is_session_artifact(target: string): boolean {
|
|
|
218
127
|
)
|
|
219
128
|
}
|
|
220
129
|
|
|
221
|
-
// The two exclusions answer one question — could a unit be sent to read this instead? — so a target
|
|
222
|
-
// failing either is not the Issue's subject and never reaches the count.
|
|
223
130
|
function is_subject_file(target: string): boolean {
|
|
224
131
|
return !is_instruction_document(target) && !is_session_artifact(target)
|
|
225
132
|
}
|
|
226
133
|
|
|
227
|
-
// A
|
|
228
|
-
// it stays pending until the next delegation and keeps contributing to a count it does not belong in.
|
|
134
|
+
// A glob is a path no edit can name, so it would stay pending forever.
|
|
229
135
|
function is_nameable_file(target: string): boolean {
|
|
230
136
|
return !target.includes('*') && !target.includes('?')
|
|
231
137
|
}
|
|
@@ -244,32 +150,18 @@ function call_targets(call: GuardedCall): ReadonlyArray<string> {
|
|
|
244
150
|
return subject_targets(time_bundle_call.call_facts(call.name, call.input).targets)
|
|
245
151
|
}
|
|
246
152
|
|
|
247
|
-
//
|
|
248
|
-
// before the unit was ever briefed, so either end of that span is after it — and the closing instant
|
|
249
|
-
// needs no duration arithmetic to derive, which keeps the one number this rule compares free of
|
|
250
|
-
// `to_spans`' own bookkeeping.
|
|
153
|
+
// The closing instant: the refusal it re-arms predates the briefing, and it needs no duration arithmetic.
|
|
251
154
|
function delegation_instant(span: Span | undefined): number {
|
|
252
155
|
return span === undefined ? hook_decision.NEVER_MS : span.ended_ms
|
|
253
156
|
}
|
|
254
157
|
|
|
255
|
-
//
|
|
256
|
-
//
|
|
257
|
-
// prompt — the case that matters is the guard's own refusal: Claude Code writes a denied call to the
|
|
258
|
-
// transcript as a `tool_use` block with an errored `tool_result`, and the stamp is written *before*
|
|
259
|
-
// the reason is returned, so counting the denied read's targets would pre-load `pending_since` with
|
|
260
|
-
// the very read the refusal stopped. A failed **edit** wrote nothing, so it does not exempt a later
|
|
261
|
-
// read of its target either — `edited_files` below asks the same question for that reason. An
|
|
262
|
-
// **unknown** outcome still counts, because a result nobody recorded is not a failure.
|
|
158
|
+
// A failed span changed nothing — notably the guard's own denied read, which the transcript records as
|
|
159
|
+
// an errored call. An unknown outcome still counts.
|
|
263
160
|
function is_failed_outcome(span: Span): boolean {
|
|
264
161
|
return span.outcome === time_spans.FAILED_OUTCOME
|
|
265
162
|
}
|
|
266
163
|
|
|
267
|
-
//
|
|
268
|
-
// is the one source of "this run edited that file", shared by the live tally and the replay: a read of
|
|
269
|
-
// a file the run edits is reading `delegation.md` keeps in the main line, so it is never counted — whether the read
|
|
270
|
-
// came before the edit or after it. A failed edit wrote nothing and so exempts nothing, and a file
|
|
271
|
-
// edited outside the window is unknown rather than assumed: the set is only ever as wide as the tail
|
|
272
|
-
// the hook read, which is the bound joshuafolkken/kit#1764 already holds the accumulation to.
|
|
164
|
+
// The one source of "this run edited that file", bounded by the window the hook read.
|
|
273
165
|
function edited_files(spans: ReadonlyArray<Span>): Set<string> {
|
|
274
166
|
const written = spans
|
|
275
167
|
.filter((span) => !is_failed_outcome(span))
|
|
@@ -278,11 +170,8 @@ function edited_files(spans: ReadonlyArray<Span>): Set<string> {
|
|
|
278
170
|
return new Set(written)
|
|
279
171
|
}
|
|
280
172
|
|
|
281
|
-
//
|
|
282
|
-
//
|
|
283
|
-
// them arrived after the refusal, so a run that ignored its one refusal was indistinguishable from
|
|
284
|
-
// one that had read nothing since. The first entry stands: a re-read of a file already pending is
|
|
285
|
-
// not a new accumulation, exactly as it is not a new count.
|
|
173
|
+
// Records when each file entered, so a second accumulation after a refusal is countable; the first
|
|
174
|
+
// entry stands.
|
|
286
175
|
function add_all(
|
|
287
176
|
pending: Map<string, number>,
|
|
288
177
|
targets: ReadonlyArray<string>,
|
|
@@ -291,13 +180,7 @@ function add_all(
|
|
|
291
180
|
for (const target of targets) if (!pending.has(target)) pending.set(target, at_ms)
|
|
292
181
|
}
|
|
293
182
|
|
|
294
|
-
//
|
|
295
|
-
// `edited_files` has already gathered every successful write in the window, so a read of one of them —
|
|
296
|
-
// before the edit or after it — is filtered here rather than added and then subtracted. This closes
|
|
297
|
-
// the re-read-after-edit gap the old subtract-on-the-edit-span could not: a subtraction runs only on
|
|
298
|
-
// the edit's own span, so a read issued *after* the edit was added and stayed. `sed -i`, `MultiEdit`
|
|
299
|
-
// and `NotebookEdit` need no special case any more — each is a write, so its target is in `edited` and
|
|
300
|
-
// never enters the read count.
|
|
183
|
+
// An edited file is filtered before it is added, so a re-read after the edit never counts either.
|
|
301
184
|
interface Accumulation {
|
|
302
185
|
// Read files, keyed by resolved path, valued by the instant each entered.
|
|
303
186
|
pending: Map<string, number>
|
|
@@ -309,25 +192,15 @@ function is_read_only_search(span: Span): boolean {
|
|
|
309
192
|
return SEARCH_LABELS.has(span.label) && span.is_bundleable && !span.may_write
|
|
310
193
|
}
|
|
311
194
|
|
|
312
|
-
//
|
|
313
|
-
// other turn counter gives `NO_MESSAGE_ID` (`time-round-trips.ts`, `time-bundles.ts`). Keyed by the
|
|
314
|
-
// id, every untagged search would collapse into one entry and the count would never reach its threshold.
|
|
195
|
+
// A span with no message id is a turn of its own, as in every other turn counter.
|
|
315
196
|
function search_turn_key(searches: ReadonlyMap<string, number>, span: Span): string {
|
|
316
197
|
if (span.message_id !== time_spans.NO_MESSAGE_ID) return span.message_id
|
|
317
198
|
|
|
318
199
|
return `${time_spans.NO_MESSAGE_ID}#${String(searches.size)}`
|
|
319
200
|
}
|
|
320
201
|
|
|
321
|
-
//
|
|
322
|
-
//
|
|
323
|
-
// follow locate the next edit rather than continue an investigation.
|
|
324
|
-
//
|
|
325
|
-
// **Every read-only search counts, whatever it names** (joshuafolkken/kit#3139). The file count can
|
|
326
|
-
// exempt the run's own instructions because a read names each file it reads; a search does not — the
|
|
327
|
-
// targets drop a bare directory, so `grep -rn foo CLAUDE.md scripts` looked like a search of
|
|
328
|
-
// `CLAUDE.md` alone and an exemption let the whole sweep through. `is_bundleable` without `may_write`
|
|
329
|
-
// is the read-only test `is_search_call` asks at the call, so the transcript never counts a search the
|
|
330
|
-
// guard could not have refused.
|
|
202
|
+
// A successful write ends the streak: searches after it locate the next edit. Every read-only search
|
|
203
|
+
// counts whatever it names — its targets drop bare directories, so an exemption would leak sweeps.
|
|
331
204
|
function apply_search(searches: Map<string, number>, span: Span): void {
|
|
332
205
|
if (span.is_writing) {
|
|
333
206
|
searches.clear()
|
|
@@ -363,9 +236,7 @@ function last_delegation_ms(spans: ReadonlyArray<Span>): number {
|
|
|
363
236
|
return delegation_instant(spans.findLast((span) => DELEGATION_TOOLS.has(span.label)))
|
|
364
237
|
}
|
|
365
238
|
|
|
366
|
-
//
|
|
367
|
-
// guard works under, and it costs nothing here: the set is cleared at every delegation anyway, so a
|
|
368
|
-
// tail that reaches back past the last one already holds the whole accumulation.
|
|
239
|
+
// The window is the tail the hook read; the set clears at every delegation, so the tail suffices.
|
|
369
240
|
function pending_after(pending: ReadonlyMap<string, number>, since_ms: number): number {
|
|
370
241
|
return [...pending.values()].filter((at_ms) => at_ms > since_ms).length
|
|
371
242
|
}
|
|
@@ -388,13 +259,7 @@ function tally_of(text: string, since_ms: number = hook_decision.NEVER_MS): Read
|
|
|
388
259
|
}
|
|
389
260
|
}
|
|
390
261
|
|
|
391
|
-
//
|
|
392
|
-
// against `edited` first, so a re-read of a file the run edited is not the `+ 1` that trips the
|
|
393
|
-
// threshold — the same exclusion `apply_span` makes for the pending set this is compared against
|
|
394
|
-
// (joshuafolkken/kit#1840). The `Set` union still absorbs a re-read of something already pending — a
|
|
395
|
-
// second `sed -n` window of the same file, or a `Read` with a new `offset` — which would not have
|
|
396
|
-
// grown the count either. The default empty set is for the exported callers that ask about
|
|
397
|
-
// accumulation alone — a test, or any reader with no edited set in hand.
|
|
262
|
+
// The call grows the count only by a file neither pending nor edited (the same exclusion `apply_span` makes).
|
|
398
263
|
function projected_count(
|
|
399
264
|
pending: ReadonlyArray<string>,
|
|
400
265
|
call: GuardedCall,
|
|
@@ -403,14 +268,8 @@ function projected_count(
|
|
|
403
268
|
return new Set([...pending, ...call_targets(call).filter((target) => !edited.has(target))]).size
|
|
404
269
|
}
|
|
405
270
|
|
|
406
|
-
//
|
|
407
|
-
//
|
|
408
|
-
// result cost.
|
|
409
|
-
//
|
|
410
|
-
// **It is the *accumulated* count that has to reach the boundary, never the projected one.** Counting
|
|
411
|
-
// the call's own targets toward it let one bundled multi-file read — `cat a.ts b.ts c.ts`, exactly the
|
|
412
|
-
// batching `CLAUDE.md` mandates — be refused as the first call of a run, with a reason claiming three
|
|
413
|
-
// files had already been read. The boundary is crossed by a call, not jumped over by one.
|
|
271
|
+
// The accumulated count, never the projected one, must reach the boundary — otherwise one bundled
|
|
272
|
+
// multi-file read would be refused as a run's first call.
|
|
414
273
|
function is_at_threshold(pending_count: number): boolean {
|
|
415
274
|
return pending_count + 1 >= delegation_policy.INVESTIGATION_FILE_THRESHOLD
|
|
416
275
|
}
|
|
@@ -420,36 +279,9 @@ function is_at_search_threshold(search_count: number): boolean {
|
|
|
420
279
|
return search_count + 1 >= delegation_policy.INVESTIGATION_SEARCH_TURN_THRESHOLD
|
|
421
280
|
}
|
|
422
281
|
|
|
423
|
-
//
|
|
424
|
-
//
|
|
425
|
-
//
|
|
426
|
-
// as three more unedited files pile up, which is the whole of joshuafolkken/kit#1460.
|
|
427
|
-
//
|
|
428
|
-
// **A refusal older than the window re-arms too**, and without that arm the guard fell permanently
|
|
429
|
-
// silent on exactly the run lengths the Issue was filed about: once the last delegation scrolls out of
|
|
430
|
-
// the 256 KB tail there is no `reset_ms` left to beat, and one stale stamp disarmed the rest of the
|
|
431
|
-
// session. This is the bound `batch-guard.ts` already documents for its own window — one extra
|
|
432
|
-
// refusal per window rather than silence — and it errs toward delegating, which is the goal.
|
|
433
|
-
//
|
|
434
|
-
// **And a further accumulation re-arms it, which is what "one refusal per accumulation" had always
|
|
435
|
-
// meant and never done** (joshuafolkken/kit#1764). A delegation was the only thing that could clear
|
|
436
|
-
// the disarm, so a run that *ignored* the refusal — read on without delegating — was never spoken to
|
|
437
|
-
// again however many unedited files it went on to open: the one case the threshold exists for was the
|
|
438
|
-
// one case it stopped covering. `docs/josh-commands.md` had already published the corrected
|
|
439
|
-
// behavior — "one per accumulation and re-arms after the next three unedited reads" — against code
|
|
440
|
-
// that did nothing of the kind, which is the shipped-mechanism-not-working defect
|
|
441
|
-
// joshuafolkken/kit#1262 declared highest priority.
|
|
442
|
-
//
|
|
443
|
-
// **It is not a refusal on the next call.** The count has to climb a whole threshold again, so a
|
|
444
|
-
// false positive still costs one round trip; what it cannot do any more is buy silence for the rest
|
|
445
|
-
// of the run.
|
|
446
|
-
//
|
|
447
|
-
// **A delegated unit is not re-armed here because it is not refused at all** (joshuafolkken/kit#1840).
|
|
448
|
-
// The hook counts a unit's reading against the unit (joshuafolkken/kit#1424), and the refusal asks for
|
|
449
|
-
// a dispatch — but a unit is already where `delegation.md` sends the reading, and a read-only one (`Explore`,
|
|
450
|
-
// `Plan`) has no `Agent` tool to dispatch with. It was formerly degraded to a single first refusal,
|
|
451
|
-
// which still asked for an action the unit could not take; now the unit short circuit in `should_block`
|
|
452
|
-
// turns it off entirely, so this function is the parent's alone and needs no delegation condition.
|
|
282
|
+
// One refusal per accumulation, so a false positive costs one round trip. It re-arms on a later
|
|
283
|
+
// delegation, on a refusal older than the window (else a long run falls silent), and on a further
|
|
284
|
+
// threshold's worth of reads after it.
|
|
453
285
|
function has_cleared_the_disarm(tally: ReadTally, refused_at_ms: number): boolean {
|
|
454
286
|
return tally.reset_ms > refused_at_ms || refused_at_ms < tally.window_start_ms
|
|
455
287
|
}
|
|
@@ -462,16 +294,12 @@ function is_rearmed(tally: ReadTally, refused_at_ms: number): boolean {
|
|
|
462
294
|
return is_at_threshold(tally.pending_since) || is_at_search_threshold(tally.searches_since)
|
|
463
295
|
}
|
|
464
296
|
|
|
465
|
-
// A transcript under a session's `subagents/` directory is a delegated unit's.
|
|
466
|
-
// `cost-transcript.ts`'s, which owns the layout — spelling it a second time here is the clone
|
|
467
|
-
// `CLAUDE.md` prohibits, and the hook is handed the derived fork path rather than the parent's
|
|
468
|
-
// (`hook-decision.ts` → `guard_reason_for_payload`).
|
|
297
|
+
// A transcript under a session's `subagents/` directory is a delegated unit's.
|
|
469
298
|
function is_unit_transcript(transcript: string): boolean {
|
|
470
299
|
return transcript.split(path.sep).includes(cost_transcript.UNIT_DIRECTORY)
|
|
471
300
|
}
|
|
472
301
|
|
|
473
|
-
//
|
|
474
|
-
// `run` is absent in the pure-tally tests, which are the parent's context by construction.
|
|
302
|
+
// `run` is absent in the pure-tally tests, which are the parent's context.
|
|
475
303
|
function is_unit_run(run: GuardRun | undefined): boolean {
|
|
476
304
|
return run !== undefined && is_unit_transcript(run.transcript)
|
|
477
305
|
}
|
|
@@ -484,30 +312,13 @@ function is_read_only_command(call: GuardedCall, labels: ReadonlySet<string>): b
|
|
|
484
312
|
return labels.has(label) && time_batch_guard.is_read_only_call(call)
|
|
485
313
|
}
|
|
486
314
|
|
|
487
|
-
//
|
|
488
|
-
// bare directory, which `call_facts` deliberately does not take as a target, and such a sweep is exactly
|
|
489
|
-
// the search this count exists for.
|
|
315
|
+
// A search is refusable without a subject target: a bare-directory sweep is what this count is for.
|
|
490
316
|
function is_search_call(call: GuardedCall): boolean {
|
|
491
317
|
return is_read_only_command(call, SEARCH_LABELS)
|
|
492
318
|
}
|
|
493
319
|
|
|
494
|
-
//
|
|
495
|
-
//
|
|
496
|
-
// is work rather than investigation, and refusing one would leave the siblings of its turn applied and
|
|
497
|
-
// itself not for no gain in what this guard measures.
|
|
498
|
-
//
|
|
499
|
-
// **It asks `is_read_only_call`, which is what `is_guarded_call` used to mean**
|
|
500
|
-
// (joshuafolkken/kit#1762). The batching guard can now refuse a write, and the two guards ask
|
|
501
|
-
// different questions of the same call: that one asks whether the call could have gone out beside
|
|
502
|
-
// another, this one whether the call is reading. A single shared predicate would have moved this one
|
|
503
|
-
// silently when that one widened, so the read-only test kept its semantics under a name that states
|
|
504
|
-
// them. A `sed -n` read is therefore still **counted and never refused**; the refusal lands on the
|
|
505
|
-
// next call that is unambiguously a read.
|
|
506
|
-
//
|
|
507
|
-
// **A call naming no subject file is never refused either**, which covers two cases in one rule: a
|
|
508
|
-
// call that names only instruction documents — refusing `CLAUDE.md` would stop a run reading the very
|
|
509
|
-
// rule being enforced — and a call whose targets could not be read at all, which cannot move the count
|
|
510
|
-
// and so has nothing to be refused for.
|
|
320
|
+
// This guard counts reading, so a `Bash` line that also writes is never refused, and neither is a call
|
|
321
|
+
// naming no subject file (e.g. only `CLAUDE.md`).
|
|
511
322
|
function is_refusable_call(call: GuardedCall): boolean {
|
|
512
323
|
if (is_search_call(call)) return true
|
|
513
324
|
if (call_targets(call).length === 0) return false
|
|
@@ -531,9 +342,7 @@ function should_block(
|
|
|
531
342
|
refused_at_ms: number,
|
|
532
343
|
run?: GuardRun,
|
|
533
344
|
): boolean {
|
|
534
|
-
// A delegated unit is never refused
|
|
535
|
-
// the reading to a unit — does not exist inside one. Asked before the tail is parsed, since the
|
|
536
|
-
// answer needs none of it.
|
|
345
|
+
// A delegated unit is never refused: the remedy — send the reading to a unit — does not exist inside one.
|
|
537
346
|
if (!is_refusable_call(call) || is_unit_run(run)) return false
|
|
538
347
|
|
|
539
348
|
const tally = tally_of(text, refused_at_ms)
|
|
@@ -542,6 +351,7 @@ function should_block(
|
|
|
542
351
|
}
|
|
543
352
|
|
|
544
353
|
const investigation_reads = {
|
|
354
|
+
DELEGATION_TOOLS,
|
|
545
355
|
INVESTIGATOR_AGENT,
|
|
546
356
|
READ_TOOLS,
|
|
547
357
|
REASON,
|
|
@@ -8,7 +8,7 @@ import { repo_origin } from './repo-origin'
|
|
|
8
8
|
// Discovery is automatic by default rather than registered in a config file: on the machine this was
|
|
9
9
|
// written for, every first-party repository is a sibling of every other, so scanning the current
|
|
10
10
|
// repository's parent one level deep produces the same map from whichever of them the command runs
|
|
11
|
-
// in. `JOSH_REPO_PATHS` exists only for the exceptions
|
|
11
|
+
// in. `JOSH_REPO_PATHS` exists only for the exceptions.
|
|
12
12
|
|
|
13
13
|
const GIT_DIRECTORY = '.git'
|
|
14
14
|
const GIT_CONFIG = 'config'
|
|
@@ -5,8 +5,7 @@ import { repo_origin, type RepoIdentity } from './repo-origin'
|
|
|
5
5
|
// The owner restriction lives here, on the single path every entry travels, rather than in the
|
|
6
6
|
// scanner: an override that could re-enter the map behind the filter would be the hole the
|
|
7
7
|
// restriction exists to close. Discovered entries and overrides are both funnelled through
|
|
8
|
-
// `add_entry`, so there is exactly one place that decides what is allowed in
|
|
9
|
-
// (joshuafolkken/kit#869).
|
|
8
|
+
// `add_entry`, so there is exactly one place that decides what is allowed in.
|
|
10
9
|
|
|
11
10
|
// One candidate the scan produced: a directory holding a git work tree, and the `origin` remote it
|
|
12
11
|
// declares. `origin_url` is undefined for a work tree with no `origin` at all.
|