From 8856e0b0b0a5b0ccbcf39f07e5ef3ef677f58146 Mon Sep 17 00:00:00 2001 From: Remi Antczak <140408771+remigiusz-antczak@users.noreply.github.com> Date: Sun, 1 Nov 2026 05:54:50 +0100 Subject: [PATCH] release: 1.635.0 (stamped at land time) Co-Authored-By: Claude Opus 5.5 --- .claude-plugin/plugin.json | 2 +- .claude/skills/agentic-delivery/INDEX.md | 6 ++-- .claude/skills/agentic-delivery/SKILL.md | 2 +- .claude/skills/agentic-delivery/VERSION | 2 +- .claude/skills/deep-code-review/INDEX.md | 2 +- .claude/skills/deep-code-review/SKILL.md | 2 +- .claude/skills/deep-code-review/VERSION | 2 +- .claude/skills/idea-critic/SKILL.md | 2 +- .claude/skills/idea-critic/VERSION | 2 +- .codex-plugin/plugin.json | 2 +- CHANGELOG.md | 37 ++++++++++++++++++++++ SHA256SUMS | 32 +++++++++---------- changelog.d/flow-alarm-command-word.md | 11 ------- changelog.d/reaper-lint-linux-only-tool.md | 9 ------ changelog.d/test-timeouts.md | 6 ---- changelog.d/tests-line-from-a-run.md | 5 --- gemini-extension.json | 2 +- scripts/size-budgets.tsv | 8 ++--- 18 files changed, 70 insertions(+), 64 deletions(-) delete mode 100644 changelog.d/flow-alarm-command-word.md delete mode 100644 changelog.d/reaper-lint-linux-only-tool.md delete mode 100644 changelog.d/test-timeouts.md delete mode 100644 changelog.d/tests-line-from-a-run.md diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 4c375ea22..131e795e3 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "perun", "description": "Perun: a suite of skills for building with AI agents. Deep code review, token and cost tools (spend reports, auto-compact with handoff, model-tier guidance), gated agentic delivery (merge train, lanes, destructive-command guard, auto-update), an idea critic, and product, growth, positioning, business-ops and output-safety specialists.", "skills": "./.claude/skills", - "version": "1.634.0", + "version": "1.635.0", "author": { "name": "deep-code-review contributors" }, diff --git a/.claude/skills/agentic-delivery/INDEX.md b/.claude/skills/agentic-delivery/INDEX.md index 3a470950a..3c4353b16 100644 --- a/.claude/skills/agentic-delivery/INDEX.md +++ b/.claude/skills/agentic-delivery/INDEX.md @@ -6,7 +6,7 @@ Generated by `scripts/skill_index.py` (do not hand-edit; rerun it after changing | File | Read this when... | Tok | |---|---|---| -| `references/cost-quality-guardrails.md` | a change cuts cost — a cheaper model tier, a lane or tool-call cap, a must-load section moved behin… | 4057 | +| `references/cost-quality-guardrails.md` | a change cuts cost — a cheaper model tier, a lane or tool-call cap, a must-load section moved behin… | 4074 | | `references/dev-env-ownership.md` | booting a dev server in a lane, separating the serving tree from the committing tree, re-running a… | 8423 | | `references/fanout-host-sizing.md` | sizing a fan-out or capping in-flight write lanes, cutting per-lane cycle-time or handback verbosit… | 12456 | | `references/fast-agentic-delivery.md` | sizing a heavy-lane fan-out on a shared machine (the full environment-probe procedure and the fan-o… | 1703 | @@ -25,14 +25,14 @@ Generated by `scripts/skill_index.py` (do not hand-edit; rerun it after changing | `references/project-state.md` | beginning multi-step delivery, changing objectives, transferring ownership, checkpointing, or recov… | 1885 | | `references/red-gate-triage.md` | a gate, union, or CI check is red and you must decide whether it is real: attributing a red union (… | 7259 | | `references/retrospective.md` | running G10, or when a target's own incident/postmortem practice is in scope for a review. | 1273 | -| `references/roles.md` | standing up (or running) the full delivery team on a repo: who does what, when a hat fires, which g… | 6830 | +| `references/roles.md` | standing up (or running) the full delivery team on a repo: who does what, when a hat fires, which g… | 6889 | | `references/support-ops.md` | the product has users who file tickets, bug reports, or feature requests, and you need a support sy… | 1113 | | `references/template-adr.md` | G3 Design must record a decision — an interface, NFR budget, or data/security choice — as an ADR (c… | 660 | | `references/template-onepager.md` | G0 Intake turns a vague idea into a brief the owner can approve in one reply, or when /idea drafts… | 416 | | `references/template-postmortem.md` | G10 or an incident meets retrospective.md's mandatory-trigger criteria and you must write the blame… | 879 | | `references/unattended-operating-mode.md` | an agent or a Conductor is granted a block of unattended time to work a backlog — an overnight or m… | 6709 | | `references/unattended-trackers.md` | deciding whether an open issue's fix is absent, placing an auto-close keyword or a gate-parsed PR-b… | 11803 | -| `references/verification-handback.md` | delegating visual/parity work by measured number, running or finalizing verification, writing a lan… | 15292 | +| `references/verification-handback.md` | delegating visual/parity work by measured number, running or finalizing verification, writing a lan… | 15313 | | `references/work-tracking.md` | a repo uses a work tracker (Linear first-class | 1051 | | `references/worktree-isolation.md` | isolating a lane's worktree: stale refs, git stash, out-of-tree scratch, an assignment path, a work… | 4120 | diff --git a/.claude/skills/agentic-delivery/SKILL.md b/.claude/skills/agentic-delivery/SKILL.md index 6026a424f..ac68f4367 100644 --- a/.claude/skills/agentic-delivery/SKILL.md +++ b/.claude/skills/agentic-delivery/SKILL.md @@ -8,7 +8,7 @@ description: >- license: MIT metadata: author: deep-code-review contributors - version: "1.634.0" + version: "1.635.0" --- # Agentic delivery diff --git a/.claude/skills/agentic-delivery/VERSION b/.claude/skills/agentic-delivery/VERSION index 979d44492..3965a0075 100644 --- a/.claude/skills/agentic-delivery/VERSION +++ b/.claude/skills/agentic-delivery/VERSION @@ -1 +1 @@ -1.634.0 +1.635.0 diff --git a/.claude/skills/deep-code-review/INDEX.md b/.claude/skills/deep-code-review/INDEX.md index bc5acb866..25d8a3485 100644 --- a/.claude/skills/deep-code-review/INDEX.md +++ b/.claude/skills/deep-code-review/INDEX.md @@ -90,7 +90,7 @@ Generated by `scripts/skill_index.py` (do not hand-edit; rerun it after changing | `references/lang-jvm.md` | the target contains Java or Kotlin. | 427 | | `references/lang-python.md` | the target contains Python. | 389 | | `references/lang-ruby-php.md` | the target contains Ruby or PHP. | 187 | -| `references/lang-shell.md` | the target runs any shell — CI run: steps, hooks, Dockerfile RUN lines, Makefile recipes, or shell… | 2312 | +| `references/lang-shell.md` | the target runs any shell — CI run: steps, hooks, Dockerfile RUN lines, Makefile recipes, or shell… | 2471 | | `references/lang-sql.md` | the target contains any SQL string, ORM query, or schema/data migration. | 188 | | `references/language-stack-redflags.md` | Read this to turn the abstract checks in SKILL.md into concrete patterns you can grep for in the ta… | 2520 | | `references/machine-report.md` | writing Phase 5, when the run is a re-verification of an earlier review (PRIOR ), or when ano… | 3266 | diff --git a/.claude/skills/deep-code-review/SKILL.md b/.claude/skills/deep-code-review/SKILL.md index 7ee1acdea..de49e6fb8 100644 --- a/.claude/skills/deep-code-review/SKILL.md +++ b/.claude/skills/deep-code-review/SKILL.md @@ -8,7 +8,7 @@ description: >- license: MIT metadata: author: deep-code-review contributors - version: "1.634.0" + version: "1.635.0" --- # Deep Code Review diff --git a/.claude/skills/deep-code-review/VERSION b/.claude/skills/deep-code-review/VERSION index 979d44492..3965a0075 100644 --- a/.claude/skills/deep-code-review/VERSION +++ b/.claude/skills/deep-code-review/VERSION @@ -1 +1 @@ -1.634.0 +1.635.0 diff --git a/.claude/skills/idea-critic/SKILL.md b/.claude/skills/idea-critic/SKILL.md index 468e0f711..3d87d72ab 100644 --- a/.claude/skills/idea-critic/SKILL.md +++ b/.claude/skills/idea-critic/SKILL.md @@ -8,7 +8,7 @@ description: >- license: MIT metadata: author: deep-code-review contributors - version: "1.634.0" + version: "1.635.0" --- # Veles: the evil twin (idea-critic) diff --git a/.claude/skills/idea-critic/VERSION b/.claude/skills/idea-critic/VERSION index 979d44492..3965a0075 100644 --- a/.claude/skills/idea-critic/VERSION +++ b/.claude/skills/idea-critic/VERSION @@ -1 +1 @@ -1.634.0 +1.635.0 diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index e61aad717..0a46dc249 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "perun", - "version": "1.634.0", + "version": "1.635.0", "description": "Perun: a skill suite for AI-agent teams: deep code review, token and cost tools, gated delivery, an idea critic and product specialists.", "skills": "./.claude/skills", "interface": { diff --git a/CHANGELOG.md b/CHANGELOG.md index e78c011dc..52029dca3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,43 @@ All notable changes to this repository are documented here. Format loosely follows Keep a Changelog; versioning follows Semantic Versioning. +## [1.635.0] — 2026-11-01 + +### Fixed +- The stop-starting hook in `.claude/skills/agentic-delivery/scripts/flow_alarm.py` denied any Bash command whose raw text matched `gh pr create`, so at the cap a `grep`, an `echo`, a commit message or an issue body that only named the command was blocked, while a quoted or escaped form such as `gh pr "create"` or `g\h pr create` was not matched at all. A command now counts as naming it when its text, in any case and also read with quotes and backslashes removed and backslash-newline joined, contains `gh pr create`, wherever it sits (in code, in a comment or in a heredoc body). A command that names it is denied (exit 2 at the cap) unless every command in it is a known text tool (echo, printf, cat, grep, rg, head, tail, git and similar, and `gh` outside `pr create`, `pr new` and `api`). A failed `gh`, a timeout and unparseable hook JSON still allow, and `# priority: ` still overrides. +- Every step that drops text before parsing now keeps the text when the input is ambiguous (keep means deny). A `#` is dropped as a comment, and a heredoc body as data, only when the text before it is provably shell code: no open quote, `$'..'`, `${..}`, `$[..]`, `((..))`, backtick or earlier comment, and the one open quote accepted is the `"$(` of a heredoc commit message. A backslash-newline is joined only where a shell joins it, not at the end of a comment. A heredoc needs one plain or fully quoted delimiter word without a backslash, and a delimiter line; a command with no delimiter line is denied, and so is one whose body holds `$(` or a backtick under an unquoted delimiter, whose operator line opens a `(`, a backtick or a quote after the marker (the shell reads it across the body lines), or whose body or operator line holds `)` inside a `$(` (an older shell can end the substitution there). A heredoc beside a comment is not stripped at all: the command is read again with every body in place, so each body line and its delimiter line must pass as commands (a `#` inside a body is data and does not count as the comment). +- A command that holds the text may use `git` only for the log, show, diff, grep, status, blame, commit and add subcommands, in every `git` segment of it, so `git rebase --exec`, `git bisect run`, `git submodule foreach`, `git apply` (a patch can write a config that a later `git` runs), `-c alias.*`, `git grep -O` (also bundled, as in `-nOcmd`), `--output` (it writes a file), `-p`, `--config-env` and any option before the subcommand other than `-C DIR` deny, and so does a `git` word that holds `$` or `{` (an expansion can build an option: `o=--output=gc` then `git log ... $o` writes a config that a later `git status` runs), except the message after `commit -m` or `-am`. These rules, and the file-write rule below, read the whole command, so a mention that sits only in a comment or a heredoc body counts as the text: `git rebase --exec '...' # gh pr create` is denied. +- `gh` is a text tool only outside `pr create`: a `pr` followed anywhere by `create`, its alias `new` or an expansion (`gh pr -R o/r create`, `gh pr --repo=o/r create`, `gh pr new --fill`, `gh -R o/r pr new`), and `gh` with an `api` word (it can open a pull request), an `alias`, `config` or `extension` word, or a `$`, `*`, `?`, `[` or `{` among its first two words, deny. So do `rg --pre` and `rg --hostname-bin`, a `gh` word that spells `create` through an expansion (`create$x`, `create{,}`, `create*`), an unquoted backtick and `$'..'` quoting. The command word must be a listed name exactly, so `./echo` and `/bin/echo` are other programs and deny. +- A variable set before a command passes only when its name is inert: `GIT_AUTHOR_NAME`, `GIT_AUTHOR_EMAIL`, `GIT_AUTHOR_DATE`, `GIT_COMMITTER_NAME`, `GIT_COMMITTER_EMAIL`, `GIT_COMMITTER_DATE`, `LANG`, `LC_*`, `TZ` and `NO_COLOR`. Any other name, such as `GIT_EXTERNAL_DIFF`, `GIT_EDITOR`, `GIT_CONFIG_*` or `PAGER`, is denied, bare or before a command, because an editor, a pager, a config entry or an external diff makes a tool run its value. `printf -v` (any `printf` whose first word is an option or expands) and an expansion that assigns (`${NAME:=..}`) deny for the same reason. +- Operators are read one at a time, so a redirect that follows a newline or `;` skips its own target and no longer hands the next word to the allowlist as a command. A command that names the text and writes a file (an output redirect to anything but `/dev/null` or a file descriptor, including `| cat > file`) is denied, and so is a file written beside a heredoc body that holds the text. `tee` and `uniq` are not on the allowlist. +- Still passing, and named in the hook docstring: `$(which gh) pr create`, `${GH} pr create`, `gh${IFS}pr create`, `gh $'pr' create` and `gh pr cre{a,}te` (the text is not in the command), a script written by an editor tool and run later, a `gh` alias or extension that is already installed (it runs under its own name), and another allowed tool's own exec flag that the hook does not list. Over-denied, the safe direction: a `#` that cannot be proven to start a comment (for example a quoted `#` before a heredoc), a single-quoted backtick or `$(`, a `(`, backtick or open quote after a heredoc marker, a backslash in a delimiter word, a `)` in a heredoc body inside `$(`, a `gh` word with `$`, `*`, `?`, `[` or `{` among its first two (its own `{owner}` placeholder), a mention-only pipeline through a command outside the allowlist, a non-read `git` subcommand such as `push` beside a mention (also one only in a comment), a heredoc written to a file beside a mention, a comment beside a heredoc, an assignment of a variable that is not inert, `printf -v`, `${x:=..}`, a `$` or `{` in a `git` word other than a `commit -m` message (`git log "$base"..HEAD`, `git -C "$dir" log`), and a command word that is a path. This is a flow alarm, not a security boundary. + +### Changed +- Tests: `python3 scripts/test_flow_alarm.py` goes from 10 to 22 tests. The new `Gate` class checks 35 commands that only name the command (exit 0 at the cap), 48 shapes that run it and that the old substring test denied on the raw text (exit 2), 125 deny probes (exit 2) that run it, write it where a later command runs it, hide it from a step that drops text before parsing, or spell it in another case, and 26 commands that only name it and are denied anyway (the safe direction). Further tests pin the git subcommand rule, the inert-variable rule, the file-write rule, the residuals above that still pass (5 shapes) and the unparseable-text case. + +### Added +- `reaper_lint.py` gains the rule `LINUX_ONLY_NO_PREFLIGHT`: a command line whose command word is `setsid`, `flock` or `timeout` with at least one argument (the first word after shell keywords, `sudo`, `nohup`, `env`, `time`, `nice`, `exec`, `xargs`, `command`, `stdbuf`, `ionice`, `chrt`, `taskset`, `NAME=value` and a Makefile recipe's leading `@`, `-` or `+`), or that has a bare `/proc/` word or redirect source, fires when the file has no platform preflight. A stock macOS install has none of those tools and no procfs, so a gate that calls one exits 127 or reads nothing there and posts FAIL for a check that never ran. A preflight anywhere in the file clears the line: `command -v`, `type`, `hash` or `which` naming that tool; any `uname`; `$OSTYPE` or `${OSTYPE`; a `-e`, `-d`, `-r`, `-f`, `-s` or `-x` test on a path (a `/proc` path clears `/proc`, a path to the tool clears the tool); the tool run as its own probe (`--version` or `--help` as its only argument, or `true` or `:` as its whole payload, as in `timeout 1 true`). Only commands are read: heredoc bodies, multi-line quoted strings, `package.json` text outside `scripts`, text after a `$(...)` inside double quotes, arithmetic, Makefile and justfile assignments, and `/proc` as a `find` operand, a `grep`, `sed` or `awk` pattern, or a word `echo` or `printf` prints do not fire. YAML files, hook configs included, are skipped (a CI step runs on its runner's OS) and the usual `# reaper-lint: allow ` marker suppresses a line. The docstring names the residuals, among them `sh -c` strings, `find -exec` tails, option-argument wrappers such as `nice -n 10`, a preflight in a sourced file or a wrapper function, and preflight clearing that is file-wide and blind to mentions. +- `lang-shell.md` gains one bullet, "A gate that calls a Linux-only tool turns red on macOS for a check that never ran", after the `env` bullet; it ends by routing to the rule. + +### Changed +- A repo that opted in to the gate (`DCR_REAPER_LINT=1`) and has an unguarded Linux-only call goes red on upgrade, until it adds a preflight or a `# reaper-lint: allow ` marker. +- Tests: `python3 .claude/skills/deep-code-review/scripts/reaper_lint.py --selftest` (already run by CI) goes from 90 to 185 cases: each Linux-only tool and `/proc` shape that fires, each preflight form that clears it (a tool self-probe included), the command-word handling (wrappers, `NAME=value`, a Makefile recipe's `@`, `-` and `+`, a `for` word list, a `grep` argument, a quote split at `$(`), and each non-command the rule leaves quiet (heredoc and multi-line string bodies, JSON prose, text after a quoted `$(...)`, arithmetic, Makefile and justfile assignments, `/proc` as a pattern, `find` operand or printed word). Every earlier case keeps its result. + +size-budget-raise: .claude/skills/deep-code-review/references/lang-shell.md 9249→9885 one bullet on a gate that calls a Linux-only tool + +### Fixed +- Nothing bounded a test's run time, so a test that never returned spun a core until someone killed it, and parallel runs stacked up. `scripts/run-ci-tests.sh` now runs each test under a wall-clock bound, `PERUN_TEST_TIMEOUT_S` seconds (default 900; a missing, non-numeric or non-positive value, or one longer than 9 digits, means 900). A test that outlives it is killed and fails like any other failing test, printing `run-ci-tests: FAIL (timed out after s)`. The alarm kills the test's own process, not child processes it started, so a caller that pipes the runner's output waits for those; a test that arms its own alarm replaces the runner's. +- `scripts/test_security_gates_corpus.py` now bounds each guard check to 5 seconds, and so do the in-process Python blocks of `scripts/test-destructive-guard.sh`. A check that never returns (catastrophic regex backtracking, say) is a `FAIL` line naming the case or block instead of a hang: the corpus test moves on to the next case, and a destructive-guard block skips the rest of its checks. The destructive-guard test's selftest and hook calls are bounded by the runner only. The privacy-gate call in the Python test has a 120 second timeout, and a timeout is a `FAIL` line, not a traceback (the gate's own child processes are not stopped). Every existing case keeps its result. + +### Changed +- Tests: `scripts/test_security_gates_corpus.py` checks its own bound against a catastrophic regex, and the new `scripts/ci-tests.d/run-ci-tests-timeout.sh` covers the runner bound: a test that sleeps far past `PERUN_TEST_TIMEOUT_S=2` fails promptly with the timed-out line and its own process is gone, and a bad value falls back to 900. + +### Changed +- The commit-tier gate row in agentic-delivery's `references/roles.md` now asks for a `Tests: X/X` count only when a suite printed it on the staged tree. When the suites run later, in a merge train or in CI, the line reads `Tests: none ()`: a count copied from an older tree, another branch or the suite's size is an over-claim. The hand-back check (`handback.py`) reads such a line, a `Tests: none ()` with a non-empty parenthetical, as a stated no-run, so that one line is enough; a bare `Tests: none` still fails, and digits inside the parenthetical are no count. A new eval, `tests-line-only-from-a-run`, pins the rule. +size-budget-raise: .claude/skills/agentic-delivery/references/roles.md 27320→27559 the unit-tests row says a count must come from a run on the staged tree and names the `Tests: none ()` line for suites that run later +size-budget-raise: .claude/skills/agentic-delivery/references/cost-quality-guardrails.md 16230→16298 the required-trailers sentence names both forms of the Tests: line +size-budget-raise: .claude/skills/agentic-delivery/references/verification-handback.md 61170→61252 the hand-back count sentence names both forms of the Tests: line + ## [1.634.0] — 2026-11-01 ### Fixed diff --git a/SHA256SUMS b/SHA256SUMS index 402d1a840..8ccc78d5c 100644 --- a/SHA256SUMS +++ b/SHA256SUMS @@ -19,12 +19,12 @@ ef9e423362b12d0dd73c8e165faf32e9f53c4d4ac215b57c2e34002a88713838 .claude/skills 372f7d86157392ebfab627f6a05a892e4dd3297db9b8bfc6f404759169c7500c .claude/skills/agentic-ceo/scripts/token_report.py 9521b057ff3db92d1e60923ebd88170713914f7e235ceb45717eb39419daf811 .claude/skills/agentic-ceo/scripts/weekly_receipt.py 7e2179751e9dd2fb371b3e9fb01fca987d69605af1e8e6e609ff9b0d0abb384b .claude/skills/agentic-delivery/INDEX-scripts.md -356b85280ede56adc36aea682ae0a182346892c52f8351df82c8d3225647a473 .claude/skills/agentic-delivery/INDEX.md -245d271bd12ad434a1bd50138d0738130a720b2b7fa629c6a6b545cf78809471 .claude/skills/agentic-delivery/SKILL.md -e2530427fb933b08eec7e6f2a855d6e60f5832c9d294309170bb9f2d878d591d .claude/skills/agentic-delivery/VERSION -b14f9f9cf466e6886fee63c6563d8a7f40c7a6a02782d44e1f4557f5ccd7fe21 .claude/skills/agentic-delivery/evals/evals.json +2fed85471b0e6a01eeb011bdbec48e0d05ce560c25615db8c942f7bd0fef93fa .claude/skills/agentic-delivery/INDEX.md +525867ab62d402b1cbb62239767524c2f34a6a2b316332adb03fccf378df99be .claude/skills/agentic-delivery/SKILL.md +ccf4d44f5fc59fb2572e6f7dc7d27fc4d67d317cb9db7cba1e93fd7a0057cdb4 .claude/skills/agentic-delivery/VERSION +ea9c0361f4432cb83a1f40cbf91745a02916d1227043bfdda578ea4cf21223ba .claude/skills/agentic-delivery/evals/evals.json fba7699a2d0836b51b7c838d019b1f0cd20570522a362e8a32b8dacfb911298e .claude/skills/agentic-delivery/evals/triggers.json -39140ac0b40907dc2279bb3234ce1d8ffb4db56e8658c7f89cc370f777df0592 .claude/skills/agentic-delivery/references/cost-quality-guardrails.md +d7ab95bb614e70bec6d97bf16f06ffd510d4f9472139519bd8c93dd5061e69ba .claude/skills/agentic-delivery/references/cost-quality-guardrails.md eed07e997b517be02c087b9d0fff769c2098eb9c3ed6528fbee3a538ce3fc250 .claude/skills/agentic-delivery/references/dev-env-ownership.md d1e42983bc76a328c0f980f0dcf4b99542121322252b2ed6da981361cf7465d3 .claude/skills/agentic-delivery/references/fanout-host-sizing.md 314a311c97b04d06b45a24c0090b8772918d04acd87586debd973da848dd1bcc .claude/skills/agentic-delivery/references/fast-agentic-delivery.md @@ -43,14 +43,14 @@ fc00cf483537ec847b8e3ecc1c988cd7cb9d55844525702e1cbf623a5f488ff3 .claude/skills 4c46afbe5c5ae4d7b544e251a950ab54cc0683e4f655ec9a29dca0693c191361 .claude/skills/agentic-delivery/references/project-state.md dd23c85b0f9f6479aadfbb13cc7e09e12d57e0e8b47f4d52f29a6e68ebf70241 .claude/skills/agentic-delivery/references/red-gate-triage.md 63ad6e8eb0fe8d51a9c548e3308cf08cff2d406e6583ee5605d0a6d140952540 .claude/skills/agentic-delivery/references/retrospective.md -00750ffbd78d3607d42ceae64f1f9e9f2762d018e76ad94652c20439189cc565 .claude/skills/agentic-delivery/references/roles.md +e5e541f7ca3dab9359a6cff796f19ccb0172d773cae3291cf6e6036a47d42e86 .claude/skills/agentic-delivery/references/roles.md 538a658aa8a65b21932795812ddaefa3ed8c15ef5b37703c76d6601a5f192748 .claude/skills/agentic-delivery/references/support-ops.md 3a345cabed38700296cdf88810eda6f716b82efa55e6bf5fd46b3a8d96b51e2d .claude/skills/agentic-delivery/references/template-adr.md 2d576f8376e837f38a137a7bd48c14455d823e85b0d1c0da771af186f6d86950 .claude/skills/agentic-delivery/references/template-onepager.md 59f7580b0173acbcca5f3244eef7aa5c2a0a020df48cd4055e24f1ba5aa2d716 .claude/skills/agentic-delivery/references/template-postmortem.md 052275126b82dffc4214b5c223ad77271ed56cd30e40c88f1cd9079b555f7b3c .claude/skills/agentic-delivery/references/unattended-operating-mode.md 21ed04bf22ae6781fc45d934b4f3df985b00750d66a0e84f9bb19acbc7ae243e .claude/skills/agentic-delivery/references/unattended-trackers.md -d504c83a02704b1905268d4a2e0abb26e5b720d6da166b500cd8f70da36fdb67 .claude/skills/agentic-delivery/references/verification-handback.md +1ec25cd88ad5820852137e5be7ea5f3e69e404971e3f1366f3c014376285ff0c .claude/skills/agentic-delivery/references/verification-handback.md b926a46cea1f0a7d998ce0b4a932af3ded64bf5b57de1c0098052c582aad98cb .claude/skills/agentic-delivery/references/work-tracking.md 9ab76cf253ef45096844de071f135395a0b5d09d943e5a821afff996d89a2a2e .claude/skills/agentic-delivery/references/worktree-isolation.md 14c304485a05f9d72ef3f89ecfcd4b7b08d7d063f2ff3f070a715b079992229f .claude/skills/agentic-delivery/scripts/_clean_union.sh @@ -83,13 +83,13 @@ f8d53918a80af8ffac076044bd917757e42e76853d1a9aa4281bacdc23e7ccba .claude/skills bd29dd7f6cb2ce16402fbaa741d9abc5b081617bed739b0838054ab071d1780d .claude/skills/agentic-delivery/scripts/fitness_tick.py 7674c231572999ecaabc7124fb0dfcb75e162378bcdb7b1a5907fac47ecafb39 .claude/skills/agentic-delivery/scripts/flake_holder.py 0ffda0a89dce1f6b8d1f75940333caa06fa6d74b8703fcd44c17e0359388a914 .claude/skills/agentic-delivery/scripts/flake_ledger.py -33f47d186493b5bda2cf9a116f43474c051b9d3afb5741380c24a2e818b8b7bb .claude/skills/agentic-delivery/scripts/flow_alarm.py +f3b8d50f37b1995a30fc6ebec24a65e4351c5bd1be1172440324bd903e483565 .claude/skills/agentic-delivery/scripts/flow_alarm.py 4b94f99b46a44258ea67a2df1a98124a613e7ea5a3d2b79b526b87ac1c583559 .claude/skills/agentic-delivery/scripts/focus_gate.py 2ffe0e677a5f2cf6066c28aad50ba5c84f966ccb6bfe6f902e7b169287a5af55 .claude/skills/agentic-delivery/scripts/focus_kit.py 42cb6463464d948a9f2970d43eb8f862cfd010bd5408f8c5a063bce2a8b5b6db .claude/skills/agentic-delivery/scripts/freeze_gate.py 06824e47863d8660c084ad6ede05573ae3754029e23c41129030718a622768ea .claude/skills/agentic-delivery/scripts/freeze_hook.py e6cc0913d51d2b761c6a41938840a68425c934e39324f7afaf001cee553be0c6 .claude/skills/agentic-delivery/scripts/gh_rest.py -48a985aafe738fca5e96d30ac36a3f7f7065bd30bbb06cad8f51296be80fc975 .claude/skills/agentic-delivery/scripts/handback.py +54dcbf5e739fba24aae4ea99b1dc9e3d72b0d1af24e54c85448373bb08f08923 .claude/skills/agentic-delivery/scripts/handback.py bc6cbe754241459320b4b7c5b23f5edfe212da2c053d9df15648358916745087 .claude/skills/agentic-delivery/scripts/handback_cap.py 026dfd9c2d90300e54a7ec24a51391e7c8fb2eaa64dfecb61afaf8cced3bbce0 .claude/skills/agentic-delivery/scripts/handoff_inject.py 8cd0c52f1f5ef552677d523021072c8030031a36f96a3c51b9f10bde87ca8f74 .claude/skills/agentic-delivery/scripts/heavy_gate.py @@ -205,9 +205,9 @@ d98f3e4380da3496061ba63be7beebe75017ab4ee1734eda9a3e798e19007b0e .claude/skills 92d22cc5d0a60ba6bdb1f4a9b597823dec5b8412cec09a5be6cf93b3973f4226 .claude/skills/contribution/scripts/prefile_check.sh 18f20db537ab784460ad33cf218f7a01ac0a172fc38413f14c0e19e1ce6821cc .claude/skills/contribution/scripts/share_learning.py 57ab71eae0e846ea4e5e8287da26679a5a010cf576fed89ca37c94e0c900180f .claude/skills/deep-code-review/INDEX-scripts.md -bd033973aa245a22749cbd3e6c987813ea1be6352756b20599dc0b700bd5ab21 .claude/skills/deep-code-review/INDEX.md -530337177b2035e9b1c8c6bd44f6525f05890a38bcdbd55a68a143d804deb0d2 .claude/skills/deep-code-review/SKILL.md -e2530427fb933b08eec7e6f2a855d6e60f5832c9d294309170bb9f2d878d591d .claude/skills/deep-code-review/VERSION +f77585005c951991c7cf61691b28556820ead6ac93fe5afb3916309616184bd0 .claude/skills/deep-code-review/INDEX.md +bba42e264ec6fe7765d276b2e0ccfb8f24f269723a50c6a81d782dd53dbb47d5 .claude/skills/deep-code-review/SKILL.md +ccf4d44f5fc59fb2572e6f7dc7d27fc4d67d317cb9db7cba1e93fd7a0057cdb4 .claude/skills/deep-code-review/VERSION b97d95bc93cc23a8bc689e2e23db261a138367bcbc69d2f8a0452d5c2c6dfb68 .claude/skills/deep-code-review/evals/evals.json 13dbb52e4bf61b1093302e094151def167371d26e7cf67a026f3beeb09d34378 .claude/skills/deep-code-review/evals/triggers.json b84e3a2b88dc189f041784e76b97e68ad879915814e00f4b37cd27513746d6f1 .claude/skills/deep-code-review/references/a11y-aria.md @@ -294,7 +294,7 @@ bc07c4366bfd341798ce0256ce9ea84dd61eba904901713933e94137395a852f .claude/skills 051ed3e65f4af3a020f863b046e80a5663f7a2162ccd050e1c58b1cce080c2b3 .claude/skills/deep-code-review/references/lang-jvm.md ba03d850119e84e0abfd6875ab482b827d47edba1bec2bc0be0eb26806235f4d .claude/skills/deep-code-review/references/lang-python.md 42ebe7339583059eb7a3b1b280be76898e3d1263d100682d5971d4c40a2bdd8b .claude/skills/deep-code-review/references/lang-ruby-php.md -8a2f0272b0984f3176951adb194dda2c2fb8a5ae5ee2483870cfb7f56c4c02f2 .claude/skills/deep-code-review/references/lang-shell.md +6cf320d5ad87ee962a674513fbb1665cc4ec31f409ea372b35026560b50d1702 .claude/skills/deep-code-review/references/lang-shell.md f2374ef94de331d8a965a4647c6039bf43dc9b198f697b365825ccc744d30175 .claude/skills/deep-code-review/references/lang-sql.md 58b33121250c278d629ec52699409f51778e55dd4795c7d4887742ddb0f6ad7f .claude/skills/deep-code-review/references/language-stack-redflags.md 9c3f5d9506c50d783553549173a36daaf7ac96f479e3e52743c1cb8de665c48c .claude/skills/deep-code-review/references/machine-report.md @@ -396,7 +396,7 @@ e2903a566deee3423cc377b000475b30d6698ccebd640cb62b86b6d2001c4822 .claude/skills 38a7dbb735c7feb25df4c392b739e884d7e02320056fbd16fb27cb5b8f2a1ca5 .claude/skills/deep-code-review/scripts/perf_compare.sh 5d6910164ddf6dfd4ed62dfc365a2f615f49dc07878ed3d1f881aa9518e481c2 .claude/skills/deep-code-review/scripts/post_review.sh b01cae69d80ca560cc414c1c70ef0ddfdbb910da5b68df4e9d46cf0daf3f8b16 .claude/skills/deep-code-review/scripts/provision_tools.sh -f1108e2700864195a239744b319b1d04953879589f8a2b83708bc45a080e3d86 .claude/skills/deep-code-review/scripts/reaper_lint.py +e1d1d2eab715ef280b8c211a9da15ebe6b87969de89d7028d7f1cc82d64fc1f0 .claude/skills/deep-code-review/scripts/reaper_lint.py 67bde273fae6d8903def8b54a86a3adfc65b4f234f8eddc8172fe370f1b4c6cc .claude/skills/deep-code-review/scripts/review_checks.sh 8c87c02a050a975e453b52ecacbaf01481c7134466a9c67feaf409d22e36d9f7 .claude/skills/deep-code-review/scripts/review_feedback.py 6ca102dffcfbc5ecc4eca7c99977351154bca82ded3e499aa31f26fbd8937892 .claude/skills/deep-code-review/scripts/route_auth_map.py @@ -426,8 +426,8 @@ e951eaa63fd0d1870701d69c89c29ef4fe74dbad9b680ab6ef0a4e993fb8bc20 .claude/skills fd316c63bbf1cc0ea64322d7d923d66692eaf7b545c056367bfecca35146c862 .claude/skills/growth-analytics/references/full-map.md 2f1d7499e9ed7ae59f550b5c00043e465b2a4e885821ad153438e2e33fcccb45 .claude/skills/growth-analytics/scripts/readout_check.py 67e71ec40535ad0b3931c51f3decf323bce809ed4c9586c6d422b7ad5698129f .claude/skills/idea-critic/INDEX.md -f9c6b6a60f2061322f8c10085ceaa5b9457a2a56476f7bf0cf7b8d966d92b260 .claude/skills/idea-critic/SKILL.md -e2530427fb933b08eec7e6f2a855d6e60f5832c9d294309170bb9f2d878d591d .claude/skills/idea-critic/VERSION +7aa10a70b88ec92c54800760f41cda4ecbc514681b3dfe5e0b8723bdc90f7f6f .claude/skills/idea-critic/SKILL.md +ccf4d44f5fc59fb2572e6f7dc7d27fc4d67d317cb9db7cba1e93fd7a0057cdb4 .claude/skills/idea-critic/VERSION 9f77d5d6d13c99fd16cd8c398795d8be226d74bae5a5bf65369ed94a59fa56b7 .claude/skills/idea-critic/evals/evals.json 0e1c0db300661a1ab1a427a7157c75e2ed67130ab24d5c6cb02ec3ff9e793f58 .claude/skills/idea-critic/evals/heldout.json d8098c5ced63e8b8608867dd144091049563a0553cf62d27ce05b9d52ac54266 .claude/skills/idea-critic/evals/triggers.json diff --git a/changelog.d/flow-alarm-command-word.md b/changelog.d/flow-alarm-command-word.md deleted file mode 100644 index 19a98af02..000000000 --- a/changelog.d/flow-alarm-command-word.md +++ /dev/null @@ -1,11 +0,0 @@ -### Fixed -- The stop-starting hook in `.claude/skills/agentic-delivery/scripts/flow_alarm.py` denied any Bash command whose raw text matched `gh pr create`, so at the cap a `grep`, an `echo`, a commit message or an issue body that only named the command was blocked, while a quoted or escaped form such as `gh pr "create"` or `g\h pr create` was not matched at all. A command now counts as naming it when its text, in any case and also read with quotes and backslashes removed and backslash-newline joined, contains `gh pr create`, wherever it sits (in code, in a comment or in a heredoc body). A command that names it is denied (exit 2 at the cap) unless every command in it is a known text tool (echo, printf, cat, grep, rg, head, tail, git and similar, and `gh` outside `pr create`, `pr new` and `api`). A failed `gh`, a timeout and unparseable hook JSON still allow, and `# priority: ` still overrides. -- Every step that drops text before parsing now keeps the text when the input is ambiguous (keep means deny). A `#` is dropped as a comment, and a heredoc body as data, only when the text before it is provably shell code: no open quote, `$'..'`, `${..}`, `$[..]`, `((..))`, backtick or earlier comment, and the one open quote accepted is the `"$(` of a heredoc commit message. A backslash-newline is joined only where a shell joins it, not at the end of a comment. A heredoc needs one plain or fully quoted delimiter word without a backslash, and a delimiter line; a command with no delimiter line is denied, and so is one whose body holds `$(` or a backtick under an unquoted delimiter, whose operator line opens a `(`, a backtick or a quote after the marker (the shell reads it across the body lines), or whose body or operator line holds `)` inside a `$(` (an older shell can end the substitution there). A heredoc beside a comment is not stripped at all: the command is read again with every body in place, so each body line and its delimiter line must pass as commands (a `#` inside a body is data and does not count as the comment). -- A command that holds the text may use `git` only for the log, show, diff, grep, status, blame, commit and add subcommands, in every `git` segment of it, so `git rebase --exec`, `git bisect run`, `git submodule foreach`, `git apply` (a patch can write a config that a later `git` runs), `-c alias.*`, `git grep -O` (also bundled, as in `-nOcmd`), `--output` (it writes a file), `-p`, `--config-env` and any option before the subcommand other than `-C DIR` deny, and so does a `git` word that holds `$` or `{` (an expansion can build an option: `o=--output=gc` then `git log ... $o` writes a config that a later `git status` runs), except the message after `commit -m` or `-am`. These rules, and the file-write rule below, read the whole command, so a mention that sits only in a comment or a heredoc body counts as the text: `git rebase --exec '...' # gh pr create` is denied. -- `gh` is a text tool only outside `pr create`: a `pr` followed anywhere by `create`, its alias `new` or an expansion (`gh pr -R o/r create`, `gh pr --repo=o/r create`, `gh pr new --fill`, `gh -R o/r pr new`), and `gh` with an `api` word (it can open a pull request), an `alias`, `config` or `extension` word, or a `$`, `*`, `?`, `[` or `{` among its first two words, deny. So do `rg --pre` and `rg --hostname-bin`, a `gh` word that spells `create` through an expansion (`create$x`, `create{,}`, `create*`), an unquoted backtick and `$'..'` quoting. The command word must be a listed name exactly, so `./echo` and `/bin/echo` are other programs and deny. -- A variable set before a command passes only when its name is inert: `GIT_AUTHOR_NAME`, `GIT_AUTHOR_EMAIL`, `GIT_AUTHOR_DATE`, `GIT_COMMITTER_NAME`, `GIT_COMMITTER_EMAIL`, `GIT_COMMITTER_DATE`, `LANG`, `LC_*`, `TZ` and `NO_COLOR`. Any other name, such as `GIT_EXTERNAL_DIFF`, `GIT_EDITOR`, `GIT_CONFIG_*` or `PAGER`, is denied, bare or before a command, because an editor, a pager, a config entry or an external diff makes a tool run its value. `printf -v` (any `printf` whose first word is an option or expands) and an expansion that assigns (`${NAME:=..}`) deny for the same reason. -- Operators are read one at a time, so a redirect that follows a newline or `;` skips its own target and no longer hands the next word to the allowlist as a command. A command that names the text and writes a file (an output redirect to anything but `/dev/null` or a file descriptor, including `| cat > file`) is denied, and so is a file written beside a heredoc body that holds the text. `tee` and `uniq` are not on the allowlist. -- Still passing, and named in the hook docstring: `$(which gh) pr create`, `${GH} pr create`, `gh${IFS}pr create`, `gh $'pr' create` and `gh pr cre{a,}te` (the text is not in the command), a script written by an editor tool and run later, a `gh` alias or extension that is already installed (it runs under its own name), and another allowed tool's own exec flag that the hook does not list. Over-denied, the safe direction: a `#` that cannot be proven to start a comment (for example a quoted `#` before a heredoc), a single-quoted backtick or `$(`, a `(`, backtick or open quote after a heredoc marker, a backslash in a delimiter word, a `)` in a heredoc body inside `$(`, a `gh` word with `$`, `*`, `?`, `[` or `{` among its first two (its own `{owner}` placeholder), a mention-only pipeline through a command outside the allowlist, a non-read `git` subcommand such as `push` beside a mention (also one only in a comment), a heredoc written to a file beside a mention, a comment beside a heredoc, an assignment of a variable that is not inert, `printf -v`, `${x:=..}`, a `$` or `{` in a `git` word other than a `commit -m` message (`git log "$base"..HEAD`, `git -C "$dir" log`), and a command word that is a path. This is a flow alarm, not a security boundary. - -### Changed -- Tests: `python3 scripts/test_flow_alarm.py` goes from 10 to 22 tests. The new `Gate` class checks 35 commands that only name the command (exit 0 at the cap), 48 shapes that run it and that the old substring test denied on the raw text (exit 2), 125 deny probes (exit 2) that run it, write it where a later command runs it, hide it from a step that drops text before parsing, or spell it in another case, and 26 commands that only name it and are denied anyway (the safe direction). Further tests pin the git subcommand rule, the inert-variable rule, the file-write rule, the residuals above that still pass (5 shapes) and the unparseable-text case. diff --git a/changelog.d/reaper-lint-linux-only-tool.md b/changelog.d/reaper-lint-linux-only-tool.md deleted file mode 100644 index e620e1e12..000000000 --- a/changelog.d/reaper-lint-linux-only-tool.md +++ /dev/null @@ -1,9 +0,0 @@ -### Added -- `reaper_lint.py` gains the rule `LINUX_ONLY_NO_PREFLIGHT`: a command line whose command word is `setsid`, `flock` or `timeout` with at least one argument (the first word after shell keywords, `sudo`, `nohup`, `env`, `time`, `nice`, `exec`, `xargs`, `command`, `stdbuf`, `ionice`, `chrt`, `taskset`, `NAME=value` and a Makefile recipe's leading `@`, `-` or `+`), or that has a bare `/proc/` word or redirect source, fires when the file has no platform preflight. A stock macOS install has none of those tools and no procfs, so a gate that calls one exits 127 or reads nothing there and posts FAIL for a check that never ran. A preflight anywhere in the file clears the line: `command -v`, `type`, `hash` or `which` naming that tool; any `uname`; `$OSTYPE` or `${OSTYPE`; a `-e`, `-d`, `-r`, `-f`, `-s` or `-x` test on a path (a `/proc` path clears `/proc`, a path to the tool clears the tool); the tool run as its own probe (`--version` or `--help` as its only argument, or `true` or `:` as its whole payload, as in `timeout 1 true`). Only commands are read: heredoc bodies, multi-line quoted strings, `package.json` text outside `scripts`, text after a `$(...)` inside double quotes, arithmetic, Makefile and justfile assignments, and `/proc` as a `find` operand, a `grep`, `sed` or `awk` pattern, or a word `echo` or `printf` prints do not fire. YAML files, hook configs included, are skipped (a CI step runs on its runner's OS) and the usual `# reaper-lint: allow ` marker suppresses a line. The docstring names the residuals, among them `sh -c` strings, `find -exec` tails, option-argument wrappers such as `nice -n 10`, a preflight in a sourced file or a wrapper function, and preflight clearing that is file-wide and blind to mentions. -- `lang-shell.md` gains one bullet, "A gate that calls a Linux-only tool turns red on macOS for a check that never ran", after the `env` bullet; it ends by routing to the rule. - -### Changed -- A repo that opted in to the gate (`DCR_REAPER_LINT=1`) and has an unguarded Linux-only call goes red on upgrade, until it adds a preflight or a `# reaper-lint: allow ` marker. -- Tests: `python3 .claude/skills/deep-code-review/scripts/reaper_lint.py --selftest` (already run by CI) goes from 90 to 185 cases: each Linux-only tool and `/proc` shape that fires, each preflight form that clears it (a tool self-probe included), the command-word handling (wrappers, `NAME=value`, a Makefile recipe's `@`, `-` and `+`, a `for` word list, a `grep` argument, a quote split at `$(`), and each non-command the rule leaves quiet (heredoc and multi-line string bodies, JSON prose, text after a quoted `$(...)`, arithmetic, Makefile and justfile assignments, `/proc` as a pattern, `find` operand or printed word). Every earlier case keeps its result. - -size-budget-raise: .claude/skills/deep-code-review/references/lang-shell.md 9249→9885 one bullet on a gate that calls a Linux-only tool diff --git a/changelog.d/test-timeouts.md b/changelog.d/test-timeouts.md deleted file mode 100644 index f6e2603ce..000000000 --- a/changelog.d/test-timeouts.md +++ /dev/null @@ -1,6 +0,0 @@ -### Fixed -- Nothing bounded a test's run time, so a test that never returned spun a core until someone killed it, and parallel runs stacked up. `scripts/run-ci-tests.sh` now runs each test under a wall-clock bound, `PERUN_TEST_TIMEOUT_S` seconds (default 900; a missing, non-numeric or non-positive value, or one longer than 9 digits, means 900). A test that outlives it is killed and fails like any other failing test, printing `run-ci-tests: FAIL (timed out after s)`. The alarm kills the test's own process, not child processes it started, so a caller that pipes the runner's output waits for those; a test that arms its own alarm replaces the runner's. -- `scripts/test_security_gates_corpus.py` now bounds each guard check to 5 seconds, and so do the in-process Python blocks of `scripts/test-destructive-guard.sh`. A check that never returns (catastrophic regex backtracking, say) is a `FAIL` line naming the case or block instead of a hang: the corpus test moves on to the next case, and a destructive-guard block skips the rest of its checks. The destructive-guard test's selftest and hook calls are bounded by the runner only. The privacy-gate call in the Python test has a 120 second timeout, and a timeout is a `FAIL` line, not a traceback (the gate's own child processes are not stopped). Every existing case keeps its result. - -### Changed -- Tests: `scripts/test_security_gates_corpus.py` checks its own bound against a catastrophic regex, and the new `scripts/ci-tests.d/run-ci-tests-timeout.sh` covers the runner bound: a test that sleeps far past `PERUN_TEST_TIMEOUT_S=2` fails promptly with the timed-out line and its own process is gone, and a bad value falls back to 900. diff --git a/changelog.d/tests-line-from-a-run.md b/changelog.d/tests-line-from-a-run.md deleted file mode 100644 index 1f98ac4cf..000000000 --- a/changelog.d/tests-line-from-a-run.md +++ /dev/null @@ -1,5 +0,0 @@ -### Changed -- The commit-tier gate row in agentic-delivery's `references/roles.md` now asks for a `Tests: X/X` count only when a suite printed it on the staged tree. When the suites run later, in a merge train or in CI, the line reads `Tests: none ()`: a count copied from an older tree, another branch or the suite's size is an over-claim. The hand-back check (`handback.py`) reads such a line, a `Tests: none ()` with a non-empty parenthetical, as a stated no-run, so that one line is enough; a bare `Tests: none` still fails, and digits inside the parenthetical are no count. A new eval, `tests-line-only-from-a-run`, pins the rule. -size-budget-raise: .claude/skills/agentic-delivery/references/roles.md 27320→27559 the unit-tests row says a count must come from a run on the staged tree and names the `Tests: none ()` line for suites that run later -size-budget-raise: .claude/skills/agentic-delivery/references/cost-quality-guardrails.md 16230→16298 the required-trailers sentence names both forms of the Tests: line -size-budget-raise: .claude/skills/agentic-delivery/references/verification-handback.md 61170→61252 the hand-back count sentence names both forms of the Tests: line diff --git a/gemini-extension.json b/gemini-extension.json index 84cd459ee..9353dde1f 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,6 +1,6 @@ { "name": "perun", - "version": "1.634.0", + "version": "1.635.0", "description": "Perun: a skill suite for AI-agent teams: deep code review, token and cost tools, gated delivery, an idea critic and product specialists.", "contextFileName": "AGENTS.md" } diff --git a/scripts/size-budgets.tsv b/scripts/size-budgets.tsv index 3a83bc425..7369594e8 100644 --- a/scripts/size-budgets.tsv +++ b/scripts/size-budgets.tsv @@ -33,7 +33,7 @@ .claude/skills/agentic-ceo/references/full-map.md 15848 .claude/skills/agentic-ceo/references/improvement-loop.md 11646 .claude/skills/agentic-delivery/SKILL.md 7457 -.claude/skills/agentic-delivery/references/cost-quality-guardrails.md 16230 +.claude/skills/agentic-delivery/references/cost-quality-guardrails.md 16298 .claude/skills/agentic-delivery/references/dev-env-ownership.md 33694 .claude/skills/agentic-delivery/references/fanout-host-sizing.md 49827 .claude/skills/agentic-delivery/references/fast-agentic-delivery.md 6812 @@ -48,13 +48,13 @@ .claude/skills/agentic-delivery/references/production-grade-product-playbook.md 6635 .claude/skills/agentic-delivery/references/project-state.md 7540 .claude/skills/agentic-delivery/references/retrospective.md 5095 -.claude/skills/agentic-delivery/references/roles.md 27320 +.claude/skills/agentic-delivery/references/roles.md 27559 .claude/skills/agentic-delivery/references/support-ops.md 4455 .claude/skills/agentic-delivery/references/template-adr.md 2641 .claude/skills/agentic-delivery/references/template-postmortem.md 3519 .claude/skills/agentic-delivery/references/unattended-operating-mode.md 26837 .claude/skills/agentic-delivery/references/unattended-trackers.md 47212 -.claude/skills/agentic-delivery/references/verification-handback.md 61170 +.claude/skills/agentic-delivery/references/verification-handback.md 61252 .claude/skills/business-ops/SKILL.md 6454 .claude/skills/business-ops/references/regulated-domain-triage.md 8031 .claude/skills/business-ops/references/full-map.md 11211 @@ -134,7 +134,7 @@ .claude/skills/deep-code-review/references/lang-jvm.md 1708 .claude/skills/deep-code-review/references/lang-python.md 1556 .claude/skills/deep-code-review/references/lang-ruby-php.md 751 -.claude/skills/deep-code-review/references/lang-shell.md 9249 +.claude/skills/deep-code-review/references/lang-shell.md 9885 .claude/skills/deep-code-review/references/lang-sql.md 755 .claude/skills/deep-code-review/references/language-stack-redflags.md 10082 .claude/skills/deep-code-review/references/machine-report.md 13064