@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
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
// The `pnpm josh rule:guard` rows of the rule registry (`rule-registry.ts`), split out by size: the
|
|
2
|
+
// human-readable side of each `delivered-rules.ts` row, keyed by the row's `id`.
|
|
3
|
+
|
|
4
|
+
interface RegisteredRule {
|
|
5
|
+
id: string
|
|
6
|
+
title: string
|
|
7
|
+
// The single source of the rule's procedure.
|
|
8
|
+
topic: string
|
|
9
|
+
// The hook command that delivers it.
|
|
10
|
+
entry: string
|
|
11
|
+
fires: string
|
|
12
|
+
// The silent turn — it matches the state in which the rule is already kept.
|
|
13
|
+
quiet: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const RULE_GUARD = 'pnpm josh rule:guard'
|
|
17
|
+
const OPERATING_RULES = '`operating-rules.md`'
|
|
18
|
+
const PRE_GATE_CUT = '`.claude/skills/workflow-commands/pre-gate-cut.md`'
|
|
19
|
+
const SHELL_BODY = '`shell-body.md`'
|
|
20
|
+
const BACKGROUND_COMMANDS = '`.claude/skills/workflow-commands/background-commands.md`'
|
|
21
|
+
const BACKLOGRUN_LANES = '`.claude/skills/workflow-commands/backlogrun-lanes.md`'
|
|
22
|
+
const GIT_RULES = '`CLAUDE.md` → Git Rules'
|
|
23
|
+
|
|
24
|
+
const GUARD_ROWS: ReadonlyArray<RegisteredRule> = [
|
|
25
|
+
{
|
|
26
|
+
id: 'third-party-write',
|
|
27
|
+
title: 'Third-party write',
|
|
28
|
+
topic: '`upstream-interrupt.md`',
|
|
29
|
+
entry: RULE_GUARD,
|
|
30
|
+
fires:
|
|
31
|
+
'a `gh api` write (field flag or a write method) to a repository whose owner is not this session. Every occurrence',
|
|
32
|
+
quiet: 'a read, or a first-party owner (`pnpm josh repo:party`)',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'direct-filing',
|
|
36
|
+
title: 'Direct filing',
|
|
37
|
+
topic: '`docs/josh-commands-backlog.md` → `josh issue:file`',
|
|
38
|
+
entry: RULE_GUARD,
|
|
39
|
+
fires:
|
|
40
|
+
'a `Bash` that creates an Issue outside `josh issue:file` (`gh issue create`, or a POST with `title` to `…/issues`); the refusal hands over the `pnpm josh issue:file` form. Every occurrence',
|
|
41
|
+
quiet:
|
|
42
|
+
'filing through `pnpm josh issue:file` — the duplicate scan, the body check and `epic:bundle` all run',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'filing-cap',
|
|
46
|
+
title: 'The 10-Issue filing cap per run',
|
|
47
|
+
topic: '`.claude/skills/workflow-commands/prerequisite.md`, `observation-filing.md`',
|
|
48
|
+
entry: RULE_GUARD,
|
|
49
|
+
fires:
|
|
50
|
+
'the 11th `pnpm josh issue:file` in a run that already has 10 filings not refused; failed calls do not count. Every occurrence',
|
|
51
|
+
quiet: 'fewer than 10 filings not refused',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: 'issue-comments',
|
|
55
|
+
title: 'Reading Issue comments',
|
|
56
|
+
topic: '`issue-comments.md`',
|
|
57
|
+
entry: RULE_GUARD,
|
|
58
|
+
fires:
|
|
59
|
+
'a `Bash` that reads only the Issue body (`gh issue view <N>`, or a GET ending in `…/issues/<N>`). Refused until it is re-read with the comments',
|
|
60
|
+
quiet:
|
|
61
|
+
'no Issue read, or a read with `--comments` / `--json comments` / `…/comments` from the start',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: 'shell-body',
|
|
65
|
+
title: 'No body on the shell',
|
|
66
|
+
topic: SHELL_BODY,
|
|
67
|
+
entry: RULE_GUARD,
|
|
68
|
+
fires:
|
|
69
|
+
'a double-quoted body value (`-f body="…"` / `-f "body=…"` / `--body "…"` / `--notify-message "…"`) carrying a backtick or `$`',
|
|
70
|
+
quiet: 'the shell does not evaluate the body',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: 'raw-field-body',
|
|
74
|
+
title: 'Posting `@path` literally',
|
|
75
|
+
topic: SHELL_BODY,
|
|
76
|
+
entry: RULE_GUARD,
|
|
77
|
+
fires: 'a raw field (`-f` / `--raw-field`) passing `body=@<path>`. Every occurrence',
|
|
78
|
+
quiet: '`-F` / `--field body=@`, a body without `@`, or `pnpm josh issue:comment`',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: 'piped-verification',
|
|
82
|
+
title: 'Piped verification',
|
|
83
|
+
topic: '`output-bounds.md`',
|
|
84
|
+
entry: RULE_GUARD,
|
|
85
|
+
fires:
|
|
86
|
+
'a pass/fail josh check (`gate` / `check` / `lint*` / `cspell*` / `test*` / `eval` / `overrides` / `ranges`) in front of a pipe — rewritten under `set -o pipefail` when every filter is `tail` or a full-reading `grep`, refused otherwise',
|
|
87
|
+
quiet: 'the exit code reaches the caller — a failure reads as a failure',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: 'early-heartbeat',
|
|
91
|
+
title: 'Early progress report',
|
|
92
|
+
topic:
|
|
93
|
+
'`.claude/skills/workflow-commands/progress-watcher.md` → "Progress while the run is quiet"',
|
|
94
|
+
entry: RULE_GUARD,
|
|
95
|
+
fires:
|
|
96
|
+
'a `Bash` whose only purpose is waiting (`sleep` alone, or `echo` / `:` / `date`) while a timer is live or before the interval. Every occurrence',
|
|
97
|
+
quiet: 'no hand-made wait timer — `run:progress` holds the one clock',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: 'test-declared',
|
|
101
|
+
title: 'Test declaration',
|
|
102
|
+
topic: '`CLAUDE.md` → Code Change Rules',
|
|
103
|
+
entry: RULE_GUARD,
|
|
104
|
+
fires: '`pnpm josh git -y` (`josh g`) while `pnpm josh test:declared` answers `required`',
|
|
105
|
+
quiet: '`exempt` (non-runtime only) or `satisfied` (tests included)',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
id: 'lane-background',
|
|
109
|
+
title: 'Lane child background push',
|
|
110
|
+
topic: BACKGROUND_COMMANDS,
|
|
111
|
+
entry: RULE_GUARD,
|
|
112
|
+
fires:
|
|
113
|
+
'a dispatched lane child backgrounding `josh gate` / `git` / `followup` / `ship`; it hands over `pnpm josh ship --detach`. Every occurrence',
|
|
114
|
+
quiet: 'not a lane child, or the foreground `ship --detach`',
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
id: 'run-tail',
|
|
118
|
+
title: 'Idle run tail',
|
|
119
|
+
topic: BACKGROUND_COMMANDS,
|
|
120
|
+
entry: RULE_GUARD,
|
|
121
|
+
fires:
|
|
122
|
+
'`pnpm josh git -y` (`josh g`, `--yes` alike) issued in the **foreground**. Every occurrence',
|
|
123
|
+
quiet: 'issued in the background — its completion resumes the run',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
id: 'pre-gate-cut',
|
|
127
|
+
title: 'The cut before the gate',
|
|
128
|
+
topic: PRE_GATE_CUT,
|
|
129
|
+
entry: RULE_GUARD,
|
|
130
|
+
fires:
|
|
131
|
+
'`pnpm josh gate` (`josh ga`) in a lane work tree whose `JOSH_LANE_CHILD` names the Issue and has no cut record',
|
|
132
|
+
quiet: 'outside a lane, no marker (a person in the lane), or already cut',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
id: 'lane-split-park',
|
|
136
|
+
title: 'A split is not a park',
|
|
137
|
+
topic: '`.claude/skills/workflow-commands/backlogrun-park.md` → "Splitting a child mid-run"',
|
|
138
|
+
entry: RULE_GUARD,
|
|
139
|
+
fires:
|
|
140
|
+
'a lane child that promoted its Issue to an epic this run parking it (`needs-decision`, `confirmation` notify). Every occurrence',
|
|
141
|
+
quiet: 'no promotion this run',
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
id: 'lane-park',
|
|
145
|
+
title: 'Lane child park',
|
|
146
|
+
topic: PRE_GATE_CUT,
|
|
147
|
+
entry: RULE_GUARD,
|
|
148
|
+
fires: 'a dispatched lane child issuing `pnpm josh notify --task-type confirmation`',
|
|
149
|
+
quiet: 'not a lane child, or not a stop notification',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: 'lane-interactive-ask',
|
|
153
|
+
title: 'Lane child interactive ask',
|
|
154
|
+
topic: `${PRE_GATE_CUT} → "The interactive ask is refused one call earlier"`,
|
|
155
|
+
entry: RULE_GUARD,
|
|
156
|
+
fires:
|
|
157
|
+
"a dispatched lane child's `AskUserQuestion`; it hands over the park procedure. Every occurrence",
|
|
158
|
+
quiet: 'not a lane child, or not an interactive tool',
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
id: 'lane-carry-conflict',
|
|
162
|
+
title: 'Lane child carry commands',
|
|
163
|
+
topic: BACKLOGRUN_LANES,
|
|
164
|
+
entry: RULE_GUARD,
|
|
165
|
+
fires: 'a dispatched lane child running `pnpm josh run:merge` / `run:carry`. Every occurrence',
|
|
166
|
+
quiet: 'not a lane child — the parent owns the run budget',
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: 'lane-switch-main',
|
|
170
|
+
title: 'Lane child on `git switch main`',
|
|
171
|
+
topic: BACKLOGRUN_LANES,
|
|
172
|
+
entry: RULE_GUARD,
|
|
173
|
+
fires:
|
|
174
|
+
'a dispatched lane child switching to the default branch or running `josh main:sync`. Every occurrence',
|
|
175
|
+
quiet: 'not a lane child — `pnpm josh main:merge` brings the default in at the gate',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
id: 'josh-git-bare',
|
|
179
|
+
title: 'Bare `pnpm josh git`',
|
|
180
|
+
topic: GIT_RULES,
|
|
181
|
+
entry: RULE_GUARD,
|
|
182
|
+
fires:
|
|
183
|
+
'`pnpm josh git` without `-y`, whose staging prompt cancels with no TTY. Every occurrence',
|
|
184
|
+
quiet: '`pnpm josh git -y`',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: 'git-force',
|
|
188
|
+
title: 'Force push / branch delete',
|
|
189
|
+
topic: OPERATING_RULES,
|
|
190
|
+
entry: RULE_GUARD,
|
|
191
|
+
fires:
|
|
192
|
+
'a `git push` / `git branch` read as force (`--force` / `-f` / `-uf` …) or delete (`--delete` / `-d` / `-D` / `:branch`) in any spelling. Every occurrence',
|
|
193
|
+
quiet: 'a plain `git push` / `git branch`',
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
id: 'worktree-mutation',
|
|
197
|
+
title: 'Unauthorized work-tree mutation',
|
|
198
|
+
topic: OPERATING_RULES,
|
|
199
|
+
entry: RULE_GUARD,
|
|
200
|
+
fires:
|
|
201
|
+
'`git checkout -- <path>` / `git restore <path>` / forced `git clean -f` / an unauthorized `git stash` (bare, push without a message, positional pop). Every occurrence',
|
|
202
|
+
quiet: '`git stash push -m`, `git stash list`, `pnpm josh git`, `pnpm josh stash:pop`',
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
id: 'file-body',
|
|
206
|
+
title: 'No file body on the shell',
|
|
207
|
+
topic: '`file-edits.md`',
|
|
208
|
+
entry: RULE_GUARD,
|
|
209
|
+
fires:
|
|
210
|
+
'a heredoc write to an existing file, a writing `node -e` / interpreter heredoc, or `perl -0pi -e`. Every occurrence',
|
|
211
|
+
quiet: 'a new file, a read-only heredoc, or a short `sed -i`',
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
id: 'index-mutation',
|
|
215
|
+
title: 'Index mutation',
|
|
216
|
+
topic: OPERATING_RULES,
|
|
217
|
+
entry: RULE_GUARD,
|
|
218
|
+
fires:
|
|
219
|
+
'`git add` / `commit` / `reset` / `rm` / `mv` / `restore --staged` in any spelling. Every occurrence',
|
|
220
|
+
quiet: '`pnpm josh git` — the approved commit flow',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: 'destructive-command',
|
|
224
|
+
title: 'Destructive command',
|
|
225
|
+
topic: OPERATING_RULES,
|
|
226
|
+
entry: RULE_GUARD,
|
|
227
|
+
fires:
|
|
228
|
+
'`rm -rf` (any spelling), `gh repo delete` / `archive`, `gh pr close`, `gh api -X DELETE`. Every occurrence',
|
|
229
|
+
quiet: "`gh issue close` or removing an Issue label — the workflow's own steps",
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
id: 'protected-file',
|
|
233
|
+
title: 'Protected file',
|
|
234
|
+
topic: OPERATING_RULES,
|
|
235
|
+
entry: RULE_GUARD,
|
|
236
|
+
fires:
|
|
237
|
+
'a `Read` of `.env`, or an `Edit` / `Write` of `.claude/settings.json` outside kit. Every occurrence',
|
|
238
|
+
quiet: "kit itself, or the user's `~/.claude/settings.json`",
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
id: 'direct-pr-create',
|
|
242
|
+
title: 'Direct PR creation',
|
|
243
|
+
topic: GIT_RULES,
|
|
244
|
+
entry: RULE_GUARD,
|
|
245
|
+
fires:
|
|
246
|
+
'`gh pr create`, or a `gh api` write to `repos/<o>/<r>/pulls`; it points at `pnpm josh pr`. Every occurrence',
|
|
247
|
+
quiet: '`pnpm josh pr`, or reading a PR — the path that writes `closes #N`',
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
id: 'poll-loop',
|
|
251
|
+
title: 'Output poll loop',
|
|
252
|
+
topic: BACKGROUND_COMMANDS,
|
|
253
|
+
entry: RULE_GUARD,
|
|
254
|
+
fires:
|
|
255
|
+
"a hand-written `while` / `until` wait loop over a command's output, a marker file or a process. Every occurrence",
|
|
256
|
+
quiet: 'the command started with `run_in_background` — its exit ends the wait',
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: 'implementation-cut',
|
|
260
|
+
title: 'The implementation-phase cut',
|
|
261
|
+
topic: `${PRE_GATE_CUT} → "It is a guard, fired at the edit that crosses the threshold"`,
|
|
262
|
+
entry: RULE_GUARD,
|
|
263
|
+
fires:
|
|
264
|
+
'an `Edit` / `Write` by an uncut lane child whose recent context is over the `pnpm josh cost --cut` threshold; it hands over `pnpm josh run:cut --impl <N> --handoff <path>`. At each threshold crossing',
|
|
265
|
+
quiet: 'not a lane child, a non-editing tool, already cut, or under the threshold',
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
id: 'rule-body',
|
|
269
|
+
title: 'Question 0 and the ordering question before writing a rule into prose',
|
|
270
|
+
topic: '`residency.md`',
|
|
271
|
+
entry: RULE_GUARD,
|
|
272
|
+
fires:
|
|
273
|
+
'an `Edit` / `Write` to `CLAUDE.md` / `prompts/**/*.md` / `.claude/skills/**/*.md` appending at least the threshold. Refused until both `pnpm josh oracle:list` and `pnpm josh run:step` ran',
|
|
274
|
+
quiet:
|
|
275
|
+
'not a rule document, an append under the threshold (typo, link swap, deletion), or both commands ran',
|
|
276
|
+
},
|
|
277
|
+
]
|
|
278
|
+
|
|
279
|
+
const rule_registry_rows = { GUARD_ROWS, RULE_GUARD }
|
|
280
|
+
|
|
281
|
+
export type { RegisteredRule }
|
|
282
|
+
export { rule_registry_rows }
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { rule_registry_rows, type RegisteredRule } from './rule-registry-rows'
|
|
2
|
+
|
|
3
|
+
// The human-readable side of every trigger-delivered rule, keyed by the `id` its guard row carries.
|
|
4
|
+
// `prompts/collaboration-workflow/rule-delivery.md` used to hold this list
|
|
5
|
+
// as a hand copy of `delivered-rules.ts`; `pnpm josh rule:list` now renders it from here, and
|
|
6
|
+
// `rule-list.test.ts` pins that every row of `MEASURED_RULES` has an entry and no entry is orphaned.
|
|
7
|
+
//
|
|
8
|
+
// A hookless agent reads the rendered list as a self-applied checklist (`principles.md`). An entry
|
|
9
|
+
// with no frequency in `fires` is delivered once per run; "every occurrence" fires each time, "until"
|
|
10
|
+
// refuses until a prerequisite is on the transcript, and "again" re-fires after an interval.
|
|
11
|
+
|
|
12
|
+
const { GUARD_ROWS, RULE_GUARD } = rule_registry_rows
|
|
13
|
+
const STOP_GUARD = 'pnpm josh stop:guard'
|
|
14
|
+
|
|
15
|
+
// The oracle rows share one entry: each `oracle-consulted:<name>` id is generated per oracle.
|
|
16
|
+
const ORACLE_PREFIX = 'oracle-consulted'
|
|
17
|
+
|
|
18
|
+
const MEASURED_ROWS: ReadonlyArray<RegisteredRule> = [
|
|
19
|
+
{
|
|
20
|
+
id: ORACLE_PREFIX,
|
|
21
|
+
title: 'An act its oracle was not asked about',
|
|
22
|
+
topic: '`decision-oracle.ts`',
|
|
23
|
+
entry: RULE_GUARD,
|
|
24
|
+
fires:
|
|
25
|
+
'a `Bash` governed by an oracle that declared a firing point (`pkg:scout` governs `pnpm add`), issued without that `pnpm josh <command>`. Refused until it ran',
|
|
26
|
+
quiet: 'no governed act, or the oracle already ran',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 'batching',
|
|
30
|
+
title: 'Turn batching',
|
|
31
|
+
topic: '`turn-batching.md`',
|
|
32
|
+
entry: 'pnpm josh batch:guard',
|
|
33
|
+
fires:
|
|
34
|
+
'the `Bash` / `Edit` / `Read` after three single-call turns in a row; fires **again** every three more such turns',
|
|
35
|
+
quiet: 'calls per round trip above the floor',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: 'investigation',
|
|
39
|
+
title: 'Investigation delegation threshold',
|
|
40
|
+
topic: '`delegation.md`',
|
|
41
|
+
entry: 'pnpm josh investigation:guard',
|
|
42
|
+
fires:
|
|
43
|
+
'the `Read` / `Bash` that makes the third read of a file the run will not edit; fires **again** once reads pile up to the threshold again',
|
|
44
|
+
quiet: 'reads under the threshold — nothing to delegate yet',
|
|
45
|
+
},
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
// The `Stop` hook's rows; `stop:guard` judges every stop, so each blocks the stop while it holds.
|
|
49
|
+
const STOP_ROWS: ReadonlyArray<RegisteredRule> = [
|
|
50
|
+
{
|
|
51
|
+
id: 'stop-notify',
|
|
52
|
+
title: 'Stop notification',
|
|
53
|
+
topic: '`CLAUDE.md` → "Mid-workflow stop notification"',
|
|
54
|
+
entry: STOP_GUARD,
|
|
55
|
+
fires: 'a stop with the work tree held and no `confirmation` notify that turn. Blocks the stop',
|
|
56
|
+
quiet: 'no hold, a `confirmation` notify on the tail, or a pre-gate cut taken',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'hold-release',
|
|
60
|
+
title: 'Hold release',
|
|
61
|
+
topic: '`.claude/skills/workflow-commands/working-tree-hold.md`',
|
|
62
|
+
entry: STOP_GUARD,
|
|
63
|
+
fires: 'a stop on a clean tree with the `run:hold` record still in place. Blocks the stop',
|
|
64
|
+
quiet:
|
|
65
|
+
'a dirty tree (a `halfrun` stop before the commit, a `needs-human-review` stop) or already released',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: 'issue-citation',
|
|
69
|
+
title: 'Issue citation format',
|
|
70
|
+
topic: '`prompts/collaboration-workflow/issue-citation.md`',
|
|
71
|
+
entry: STOP_GUARD,
|
|
72
|
+
fires:
|
|
73
|
+
'a bare `#N` in the prose of the last reply. Blocks the stop until the reply is reissued with the citation fixed',
|
|
74
|
+
quiet: 'link form, inside code or a quote, `#N` right after `PR`, or a GitHub-facing artifact',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'filing-offer',
|
|
78
|
+
title: 'Offer to file',
|
|
79
|
+
topic: '`.claude/skills/workflow-commands/observation-filing.md`',
|
|
80
|
+
entry: STOP_GUARD,
|
|
81
|
+
fires:
|
|
82
|
+
'an unattended run (a kit-launched headless session, a lane child, a `backlogrun` parent) whose last reply offers to file without filing. Blocks the stop',
|
|
83
|
+
quiet:
|
|
84
|
+
'an interactive session, already filed, inside a fence or quote, a named third-party `owner/repo`, or an unknown owner',
|
|
85
|
+
},
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
const REGISTERED_RULES: ReadonlyArray<RegisteredRule> = [
|
|
89
|
+
...GUARD_ROWS,
|
|
90
|
+
...MEASURED_ROWS,
|
|
91
|
+
...STOP_ROWS,
|
|
92
|
+
]
|
|
93
|
+
|
|
94
|
+
// A guard row's id, with a generated oracle id read as the one oracle entry.
|
|
95
|
+
function registry_id(row_id: string): string {
|
|
96
|
+
return row_id.startsWith(`${ORACLE_PREFIX}:`) ? ORACLE_PREFIX : row_id
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function entry_for(row_id: string): RegisteredRule | undefined {
|
|
100
|
+
const id = registry_id(row_id)
|
|
101
|
+
|
|
102
|
+
return REGISTERED_RULES.find((rule) => rule.id === id)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const rule_registry = { REGISTERED_RULES, STOP_ROWS, entry_for, registry_id }
|
|
106
|
+
|
|
107
|
+
export { rule_registry }
|
|
108
|
+
|
|
109
|
+
export { type RegisteredRule } from './rule-registry-rows'
|
|
@@ -3,8 +3,8 @@ import { mkdirSync, renameSync, statSync, writeFileSync } from 'node:fs'
|
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { file_reader } from '#scripts/lib/read-file'
|
|
5
5
|
|
|
6
|
-
// The `rule:value` reading at the `backlogrun` loop head, without the loop waiting on it
|
|
7
|
-
//
|
|
6
|
+
// The `rule:value` reading at the `backlogrun` loop head, without the loop waiting on it.
|
|
7
|
+
// Measuring re-reads every transcript and takes minutes, and `backlog:offer`
|
|
8
8
|
// ran it synchronously on every iteration, so each dispatch waited on it. The loop head now prints the
|
|
9
9
|
// last reading from a cache and, when the last refresh is old enough, starts one in a detached process
|
|
10
10
|
// — `josh rule:value --refresh` — so the next iteration prints the newer reading.
|
|
@@ -5,8 +5,8 @@ import { delivered_rules } from './delivered-rules'
|
|
|
5
5
|
import { rule_value, type RuleReading } from './rule-value'
|
|
6
6
|
import { rule_value_cache } from './rule-value-cache'
|
|
7
7
|
|
|
8
|
-
// `josh rule:value` — what each delivered rule earns on the channel that carries it, one row per rule
|
|
9
|
-
//
|
|
8
|
+
// `josh rule:value` — what each delivered rule earns on the channel that carries it, one row per rule.
|
|
9
|
+
// `rule_value.measure` was public but had no caller outside its own test, so
|
|
10
10
|
// a rule that never fired stayed invisible until a person thought to measure it. This is that caller:
|
|
11
11
|
// it groups every transcript by the run it belongs to — a lane's transcript counted with the parent
|
|
12
12
|
// that dispatched it — measures them, and prints the reading.
|
|
@@ -86,8 +86,10 @@ function row(reading: RuleReading): string {
|
|
|
86
86
|
const id = reading.id.padEnd(ID_WIDTH)
|
|
87
87
|
const reached = `reached ${reading.sessions.toString()}`
|
|
88
88
|
const refused = `refused ${reading.refusals.toString()}`
|
|
89
|
+
// Only where a rewrite happened, so the rows of rules that can only refuse keep their shape.
|
|
90
|
+
const rewritten = reading.rewrites > 0 ? [`rewritten ${reading.rewrites.toString()}`] : []
|
|
89
91
|
|
|
90
|
-
return [id, reached, rate_text(reading), refused].join(COLUMN_GAP)
|
|
92
|
+
return [id, reached, rate_text(reading), refused, ...rewritten].join(COLUMN_GAP)
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
// The reading as text, or `NO_TARGETS` when nothing measurable was found — never an empty output that
|
|
@@ -102,7 +104,7 @@ function render(runs: ReadonlyArray<ReadonlyArray<string>>): string {
|
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
// `--refresh` is the detached measurement the `backlogrun` loop head starts: the reading goes to the
|
|
105
|
-
// cache `backlog:offer` prints from, never to stdout (`rule-value-cache.ts
|
|
107
|
+
// cache `backlog:offer` prints from, never to stdout (`rule-value-cache.ts`).
|
|
106
108
|
function run_rule_value(argv: ReadonlyArray<string> = [], cwd: string = process.cwd()): number {
|
|
107
109
|
const reading = render(gather_runs(cwd))
|
|
108
110
|
|
|
@@ -4,13 +4,13 @@ import {
|
|
|
4
4
|
type TranscriptLine,
|
|
5
5
|
} from '#scripts/time-runtime/time-transcript-line'
|
|
6
6
|
import { delivered_rules, type MeasuredRule } from './delivered-rules'
|
|
7
|
+
import { hook_context_line } from './hook-context-line'
|
|
7
8
|
|
|
8
|
-
// What a rule is worth on the channel that carries it when its delivery has not fired
|
|
9
|
-
// (joshuafolkken/kit#1525).
|
|
9
|
+
// What a rule is worth on the channel that carries it when its delivery has not fired.
|
|
10
10
|
//
|
|
11
11
|
// **It exists because the eviction order was decided by protection rather than by value.**
|
|
12
12
|
// `prompts/collaboration-workflow/residency.md` records that when a rule is trimmed to keep a
|
|
13
|
-
// byte count, the sentence that goes is the one no marker pinned
|
|
13
|
+
// byte count, the sentence that goes is the one no marker pinned — so the
|
|
14
14
|
// least-defended text leaves, never the least-useful. Nothing in the repository could tell the two
|
|
15
15
|
// apart: `scripts/josh/hook-decision.ts` keeps a once-per-run stamp that answers "has this fired
|
|
16
16
|
// yet", never "how often", and no other counter exists.
|
|
@@ -42,7 +42,7 @@ const PERCENT = 100
|
|
|
42
42
|
// `scripts/time/time-batch-guard.ts` — so a session that
|
|
43
43
|
// merely opened that file carries the text too — and did so in a result whose `is_error` is false.
|
|
44
44
|
//
|
|
45
|
-
// **That fact is read off the parsed block, never off the raw line
|
|
45
|
+
// **That fact is read off the parsed block, never off the raw line**. The
|
|
46
46
|
// test it replaced was `line.includes('"is_error":true')`, which is two mistakes at once: it is
|
|
47
47
|
// whitespace- and key-order-sensitive, so a serializer emitting `"is_error": true` would take every
|
|
48
48
|
// rule's `refused` column to zero — indistinguishable from a hook that never fired — and it is
|
|
@@ -56,8 +56,7 @@ interface RuleReading {
|
|
|
56
56
|
// for a rule whose trigger is a neutral act** — filing an Issue, reading one — which a run keeping
|
|
57
57
|
// the rule still performs. Where the trigger is the violation itself, a run that kept the rule
|
|
58
58
|
// never trips it, so the row declares `reaches` and a run counts once it has reached *either* —
|
|
59
|
-
// the union, which equals `reaches` for every row whose trigger it covers
|
|
60
|
-
// (joshuafolkken/kit#1643).
|
|
59
|
+
// the union, which equals `reaches` for every row whose trigger it covers.
|
|
61
60
|
sessions: number
|
|
62
61
|
// Of those, the runs that kept the rule unaided — before the trigger fired, or without it firing
|
|
63
62
|
// at all, which is the ordinary case for a row that declares `reaches`. The compliance the carried
|
|
@@ -65,6 +64,9 @@ interface RuleReading {
|
|
|
65
64
|
unaided_kept: number
|
|
66
65
|
// Of those, the runs in which a refusal was actually delivered.
|
|
67
66
|
refusals: number
|
|
67
|
+
// Of those, the runs in which the hook rewrote the call instead of refusing it
|
|
68
|
+
// — a delivery that cost no round trip.
|
|
69
|
+
rewrites: number
|
|
68
70
|
// Whether the rule declares what keeping it looks like. False makes `unaided_kept` meaningless.
|
|
69
71
|
is_measurable: boolean
|
|
70
72
|
}
|
|
@@ -75,7 +77,7 @@ interface IssuedCall {
|
|
|
75
77
|
}
|
|
76
78
|
|
|
77
79
|
// **What a predicate is asked against beside the call: the turn it went out in, and the run it belongs
|
|
78
|
-
// to
|
|
80
|
+
// to**. The two travel as one parameter because every observer below takes
|
|
79
81
|
// both, and passing them separately would put each one over the four-parameter limit. `run` is every
|
|
80
82
|
// call the run issued, in timeline order, so a predicate reading it sees the whole run whatever point
|
|
81
83
|
// of it the walk has reached — which is right for `reaches`, a question about *whether* the situation
|
|
@@ -96,12 +98,19 @@ interface RuleState {
|
|
|
96
98
|
is_reached: boolean
|
|
97
99
|
is_triggered: boolean
|
|
98
100
|
is_refused: boolean
|
|
101
|
+
is_rewritten: boolean
|
|
99
102
|
}
|
|
100
103
|
|
|
101
104
|
function blank_states(): Map<string, RuleState> {
|
|
102
105
|
const entries = delivered_rules.MEASURED_RULES.map((rule): [string, RuleState] => [
|
|
103
106
|
rule.id,
|
|
104
|
-
{
|
|
107
|
+
{
|
|
108
|
+
is_kept: false,
|
|
109
|
+
is_reached: false,
|
|
110
|
+
is_triggered: false,
|
|
111
|
+
is_refused: false,
|
|
112
|
+
is_rewritten: false,
|
|
113
|
+
},
|
|
105
114
|
])
|
|
106
115
|
|
|
107
116
|
return new Map(entries)
|
|
@@ -110,7 +119,7 @@ function blank_states(): Map<string, RuleState> {
|
|
|
110
119
|
// **Keeping only counts before the trigger.** After the refusal the run complies because it was made
|
|
111
120
|
// to, which is the delivery's contribution and not the carried text's.
|
|
112
121
|
//
|
|
113
|
-
// **A row may declare no call-shaped trigger at all
|
|
122
|
+
// **A row may declare no call-shaped trigger at all**. The batching guard
|
|
114
123
|
// decides on the turns *behind* a call, so no predicate given one call could say whether it was
|
|
115
124
|
// about to be refused; what the transcript records instead is the refusal, and `observe_error` below
|
|
116
125
|
// is what closes the window for such a row.
|
|
@@ -148,13 +157,14 @@ function observe_call(
|
|
|
148
157
|
observe_before_trigger(rule, state, call, context)
|
|
149
158
|
}
|
|
150
159
|
|
|
151
|
-
// One transcript line, parsed once, as the
|
|
152
|
-
//
|
|
160
|
+
// One transcript line, parsed once, as the things a reading is taken from: the calls it issued, the
|
|
161
|
+
// bodies of the results the harness wrote back as failures, and the context a hook attached.
|
|
153
162
|
interface DatedLine {
|
|
154
163
|
at_ms: number
|
|
155
164
|
message_id: string
|
|
156
165
|
calls: Array<IssuedCall>
|
|
157
166
|
errors: Array<string>
|
|
167
|
+
contexts: Array<string>
|
|
158
168
|
}
|
|
159
169
|
|
|
160
170
|
function calls_of(parsed: TranscriptLine): Array<IssuedCall> {
|
|
@@ -182,10 +192,11 @@ function dated_line(line: string): DatedLine | undefined {
|
|
|
182
192
|
message_id: parsed.message_id,
|
|
183
193
|
calls: calls_of(parsed),
|
|
184
194
|
errors: errors_of(parsed),
|
|
195
|
+
contexts: hook_context_line.hook_contexts_of(line),
|
|
185
196
|
}
|
|
186
197
|
}
|
|
187
198
|
|
|
188
|
-
// **A turn is a message id, not a line
|
|
199
|
+
// **A turn is a message id, not a line**. Claude Code writes one line per
|
|
189
200
|
// content block and repeats the message id on each, so a turn that thought and then issued two calls
|
|
190
201
|
// is three lines carrying one id — the same reading `time-round-trips.ts` takes, for the same reason.
|
|
191
202
|
// Read per line, a batched turn is indistinguishable from two turns of one call, which is the whole
|
|
@@ -206,7 +217,7 @@ function turn_key(entry: DatedLine, index: number): string {
|
|
|
206
217
|
return entry.message_id
|
|
207
218
|
}
|
|
208
219
|
|
|
209
|
-
// **The turn a call belongs to, gathered by id but never moved
|
|
220
|
+
// **The turn a call belongs to, gathered by id but never moved**. A folded
|
|
210
221
|
// turn used to be *placed* where it opened, which both grouped a message's calls and reordered them:
|
|
211
222
|
// a background unit's call landing between two blocks of a parent message was read after the whole
|
|
212
223
|
// parent turn instead of at its own instant. This gathers each message's calls without touching the
|
|
@@ -232,15 +243,18 @@ function turns_by_key(entries: ReadonlyArray<DatedLine>): Map<string, Array<Issu
|
|
|
232
243
|
// result, which is why the speaker is identified by what the body *opens* with rather than by what
|
|
233
244
|
// it carries somewhere inside.
|
|
234
245
|
//
|
|
235
|
-
// **That is what stops a dump of the enumeration being read as a refusal by every rule at once
|
|
236
|
-
//
|
|
246
|
+
// **That is what stops a dump of the enumeration being read as a refusal by every rule at once**.
|
|
247
|
+
// One `cat scripts/rules/delivered-rules.ts && false` writes a single
|
|
237
248
|
// errored result carrying all six reasons verbatim, and a containment test credited a refusal to
|
|
238
249
|
// each of them; the file opens with its imports, so under this test nothing claims it. Position is
|
|
239
250
|
// what separates the two, so no count of how many signatures appear is needed — and a body naming
|
|
240
251
|
// several can no longer be attributed to any of them.
|
|
241
252
|
function refused_id(text: string): string | undefined {
|
|
253
|
+
const body = text.trimStart()
|
|
242
254
|
const found = delivered_rules.MEASURED_RULES.find((rule) =>
|
|
243
|
-
|
|
255
|
+
[rule.reason, ...(rule.former_reasons ?? [])].some((reason) =>
|
|
256
|
+
body.startsWith(reason.slice(0, REASON_SIGNATURE_LENGTH)),
|
|
257
|
+
),
|
|
244
258
|
)
|
|
245
259
|
|
|
246
260
|
return found?.id
|
|
@@ -253,13 +267,36 @@ function observe_error(states: Map<string, RuleState>, text: string): void {
|
|
|
253
267
|
if (state === undefined) return
|
|
254
268
|
|
|
255
269
|
state.is_refused = true
|
|
256
|
-
// **A delivered refusal is the trigger, whatever a predicate said
|
|
270
|
+
// **A delivered refusal is the trigger, whatever a predicate said**. The
|
|
257
271
|
// hook refuses only where the rule bound, so the window in which compliance is the carried text's
|
|
258
272
|
// closes here — for the six rows this is already true by the time the result comes back, and for
|
|
259
273
|
// a row declaring no call-shaped trigger it is the only thing that can close it.
|
|
260
274
|
state.is_triggered = true
|
|
261
275
|
}
|
|
262
276
|
|
|
277
|
+
// **A rewrite is a delivery too, read off the note the hook attached**. The
|
|
278
|
+
// call is recorded as typed and nothing errors, so the note is the one trace — matched at its opening,
|
|
279
|
+
// exactly as a refusal's reason is.
|
|
280
|
+
function rewritten_id(text: string): string | undefined {
|
|
281
|
+
const found = delivered_rules.MEASURED_RULES.find((rule) => {
|
|
282
|
+
const note = rule.rewrite_note
|
|
283
|
+
|
|
284
|
+
return note !== undefined && text.trimStart().startsWith(note.slice(0, REASON_SIGNATURE_LENGTH))
|
|
285
|
+
})
|
|
286
|
+
|
|
287
|
+
return found?.id
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function observe_rewrite(states: Map<string, RuleState>, text: string): void {
|
|
291
|
+
const id = rewritten_id(text)
|
|
292
|
+
const state = id === undefined ? undefined : states.get(id)
|
|
293
|
+
|
|
294
|
+
if (state === undefined) return
|
|
295
|
+
|
|
296
|
+
state.is_rewritten = true
|
|
297
|
+
state.is_triggered = true
|
|
298
|
+
}
|
|
299
|
+
|
|
263
300
|
function observe_for_rule(
|
|
264
301
|
rule: MeasuredRule,
|
|
265
302
|
state: RuleState,
|
|
@@ -268,8 +305,7 @@ function observe_for_rule(
|
|
|
268
305
|
): void {
|
|
269
306
|
// This line's own calls, read in order; `context.turn` is every call the message issued, so a
|
|
270
307
|
// call's siblings are the rest of the turn it went out in even where the transcript split them
|
|
271
|
-
// across lines. The two coincide except when a message spans several lines
|
|
272
|
-
// (joshuafolkken/kit#1804).
|
|
308
|
+
// across lines. The two coincide except when a message spans several lines.
|
|
273
309
|
for (const call of calls) observe_call(rule, state, call, context)
|
|
274
310
|
}
|
|
275
311
|
|
|
@@ -293,6 +329,7 @@ function observe_line(
|
|
|
293
329
|
observe_calls(states, entry.calls, context)
|
|
294
330
|
|
|
295
331
|
for (const text of entry.errors) observe_error(states, text)
|
|
332
|
+
for (const text of entry.contexts) observe_rewrite(states, text)
|
|
296
333
|
}
|
|
297
334
|
|
|
298
335
|
// **One timeline, ordered by timestamp — not the files read back to back.** "Kept before the
|
|
@@ -315,9 +352,9 @@ function timeline_of(texts: ReadonlyArray<string>): Array<DatedLine> {
|
|
|
315
352
|
|
|
316
353
|
// Every text belonging to one run — the session transcript and the transcripts of the units it
|
|
317
354
|
// delegated — read as one timeline. The lines are walked in timestamp order; `turns_by_key` supplies
|
|
318
|
-
// each call the rest of its message as context, so grouping no longer reorders the reading
|
|
319
|
-
//
|
|
320
|
-
// ask about the run rather than the turn
|
|
355
|
+
// each call the rest of its message as context, so grouping no longer reorders the reading,
|
|
356
|
+
// and the run's own calls ride beside it for the one predicate that has to
|
|
357
|
+
// ask about the run rather than the turn.
|
|
321
358
|
function read_run(texts: ReadonlyArray<string>): Map<string, RuleState> {
|
|
322
359
|
const states = blank_states()
|
|
323
360
|
const entries = timeline_of(texts)
|
|
@@ -337,6 +374,7 @@ function credit(reading: RuleReading, state: RuleState): void {
|
|
|
337
374
|
reading.sessions += 1
|
|
338
375
|
reading.unaided_kept += state.is_kept ? 1 : 0
|
|
339
376
|
reading.refusals += state.is_refused ? 1 : 0
|
|
377
|
+
reading.rewrites += state.is_rewritten ? 1 : 0
|
|
340
378
|
}
|
|
341
379
|
|
|
342
380
|
function reading_to_credit(
|
|
@@ -363,6 +401,7 @@ function blank_readings(): Map<string, RuleReading> {
|
|
|
363
401
|
sessions: 0,
|
|
364
402
|
unaided_kept: 0,
|
|
365
403
|
refusals: 0,
|
|
404
|
+
rewrites: 0,
|
|
366
405
|
is_measurable: rule.keeps !== undefined,
|
|
367
406
|
},
|
|
368
407
|
])
|