diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 27b852704..eb0026aef 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.609.0", + "version": "1.610.0", "author": { "name": "deep-code-review contributors" }, diff --git a/.claude/skills/agentic-delivery/SKILL.md b/.claude/skills/agentic-delivery/SKILL.md index 717660d30..81c3cddf0 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.609.0" + version: "1.610.0" --- # Agentic delivery diff --git a/.claude/skills/agentic-delivery/VERSION b/.claude/skills/agentic-delivery/VERSION index 48096e354..247382153 100644 --- a/.claude/skills/agentic-delivery/VERSION +++ b/.claude/skills/agentic-delivery/VERSION @@ -1 +1 @@ -1.609.0 +1.610.0 diff --git a/.claude/skills/deep-code-review/SKILL.md b/.claude/skills/deep-code-review/SKILL.md index b22ae7d6a..08383003a 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.609.0" + version: "1.610.0" --- # Deep Code Review diff --git a/.claude/skills/deep-code-review/VERSION b/.claude/skills/deep-code-review/VERSION index 48096e354..247382153 100644 --- a/.claude/skills/deep-code-review/VERSION +++ b/.claude/skills/deep-code-review/VERSION @@ -1 +1 @@ -1.609.0 +1.610.0 diff --git a/.claude/skills/idea-critic/SKILL.md b/.claude/skills/idea-critic/SKILL.md index 5106bdf15..9c3c3f48c 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.609.0" + version: "1.610.0" --- # Veles: the evil twin (idea-critic) diff --git a/.claude/skills/idea-critic/VERSION b/.claude/skills/idea-critic/VERSION index 48096e354..247382153 100644 --- a/.claude/skills/idea-critic/VERSION +++ b/.claude/skills/idea-critic/VERSION @@ -1 +1 @@ -1.609.0 +1.610.0 diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 59e4ca63f..938207ee5 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "perun", - "version": "1.609.0", + "version": "1.610.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 64e791e70..5a10b0204 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,48 @@ All notable changes to this repository are documented here. Format loosely follows Keep a Changelog; versioning follows Semantic Versioning. +## [1.610.0] — 2026-10-28 + +### Added +- agentic-delivery: `stage_run.py --run-dir DIR` refuses (exit 1) a run dir that already exists; `lkg.py verdict FILE` exits 1 with "rerun" unless the receipt is a pass for HEAD with matching runner blob (`run-ci-tests.sh` reads its own receipt back and honors `PERUN_RUN_DIR`); `wired_check.py --strict --runs FILE` (now the CI step) fails a new script with no caller or no exact-name run in the registered tests; new `vendor_drift.py TARGET` lists vendored skill files that differ from canonical (sha256) and exits 1 on drift or zero overlap (`--skills` flags deleted copies; `update-installed.sh` runs it). +- agentic-delivery: a merge train that parks a PR posts a `perun-train-refused: ` comment on it; admission skips a PR with that line for its current head, so a dropped PR is not re-ridden until a new push (invariant in `references/merge-queue-worktrees.md`). + +size-budget-raise: .claude/skills/agentic-delivery/references/full-map.md 23891→24381 one routing line for the four wave-AE mechanisms +size-budget-raise: .claude/skills/INDEX.md 14569→14671 generated index row for vendor_drift.py +size-budget-raise: .claude/skills/agentic-delivery/INDEX-scripts.md 15097→15241 generated index row for vendor_drift.py +size-budget-raise: .claude/skills/agentic-delivery/references/merge-queue-worktrees.md 43476→44819 one paragraph: head-bound train refusal invariant (author filter, clear, neutralized reason) + +### Added +- agentic-delivery: `scripts/admission_check.py` flags a per-PR admission config that omits a test class the batch runs (e.g. browser/e2e) and a stale or ownerless spec-selection map. `scripts/host_accept.py` is the merge-host acceptance checklist (operator reset without extra IAM, auto-reset on missed heartbeats, per-slice memory caps with sshd/agent reserve). `train_land.sh` runs both (rc != 0 refuses the train) whenever the base branch carries their config. The landing watchdog now surfaces the existing `red_main.py` uncovered/oldest-red alarm, and `flake_ledger.py serial-move` records tests moved to the serial project (never quarantined, failure there is BLOCKING as a real bug). + +size-budget-raise: .claude/skills/agentic-delivery/references/red-gate-triage.md 25417→27186 one paragraph: admission completeness and map owner, plus watchdog and serial-move notes +size-budget-raise: .claude/skills/agentic-delivery/references/fanout-host-sizing.md 48845→49827 one paragraph: merge-host acceptance checklist + +### Added +- agentic-delivery: lane worktrees live outside the watched repo tree. `scripts/lane_worktree.sh ` creates `lane/` under `${XDG_CACHE_HOME:-~/.cache}/perun-wt/` (override `PERUN_WT_ROOT`; `/` refused) and writes a per-lane marker; one host with 129 in-repo lane worktrees (49GB) kept fseventsd at 158% CPU. The `handback_cap.py` SubagentStop hook now removes the stopping lane's worktree with `git worktree remove` (never forced) and deletes its merged branch, only when the marker, repo, agent id (if set) and `lane/` branch match, the tree is strictly under the lane root, HEAD equals its upstream, and the tree is clean including ignored files; any doubt keeps it and reports on stderr (`PERUN_REAP_WORKTREE=0` disables). `perun_doctor.py` gains "lane worktrees in repo" and "lane worktrees out of tree" rows (count and size, `du` capped at 30s, WARN above 20 trees or 20GB). Tests: `scripts/test_lane_worktree_reap.py`. Doc: `worktree-isolation.md`. +size-budget-raise: .claude/skills/agentic-delivery/references/worktree-isolation.md 14713→16482 documents the out-of-tree lane worktree root and the stop-hook reaper in the one worktree reference +- `update-installed.sh` skips the vendored-drift report with one stderr note when `vendor_drift.py` is absent (an older checked-out tag), instead of printing "No such file". +size-budget-raise: .claude/skills/agentic-delivery/references/host-enforcement.md 44866→44913 points the orchestrator-worktree step at lane_worktree.sh + +### Added +- agentic-ceo, agentic-delivery: a send to a remote peer session has no read receipt, so the conductor verifies pickup from the peer's durable trail after a bounded wait and never re-sends on silence alone (`multi-session-coordination.md`, linked from the agentic-ceo hard rules, scoped to bare sends so the board ACK rule keeps winning for board directives). `incident-response.md` now says to read the subject's last 2 comments or events before relaying an automated alarm. One eval case each; `scripts/test_peer_send_alarm_relay.py` pins the wording. +size-budget-raise: .claude/skills/agentic-ceo/SKILL.md 7332→7477 one short rule added: bare peer-send pickup check and read-before-relay alarm rule +size-budget-raise: .claude/skills/agentic-delivery/references/incident-response.md 12693→13056 one short rule added: bare peer-send pickup check and read-before-relay alarm rule +size-budget-raise: .claude/skills/agentic-delivery/references/multi-session-coordination.md 72883→73901 one short rule added: bare peer-send pickup check and read-before-relay alarm rule + +### Added +- idea-critic: `veche.py` returns `default_action` (proceed when `--reversibility easy`, else hold) and a `COUNCIL_BLOCKING_WORK` alarm when a council cannot decide or runs past `--alarm-s`; seats of each round run in parallel with atomic cap accounting and a failed seat is dropped; critique rounds add an anonymized Borda `peer_ranking`; a malformed `--criteria` error shows the `name:weight` format. + +size-budget-raise: .claude/skills/idea-critic/references/council.md 6098→8433 timebox and alarm section, peer ranking and parallel seats notes, and a compact gap table versus the fetched open-source councils + +### Added +- agentic-delivery: `scrub_env.sh CMD` now also gives the child an invalid `GH_TOKEN`/`GITHUB_TOKEN`, an empty throwaway `GH_CONFIG_DIR` and a refusing proxy with loopback direct, no ssh agent, no global git config or credential helper (`PERUN_ALLOW_NET=1` drops only the proxy, logged), so a test cannot post to a real PR even when it calls `gh` by absolute path past a PATH stub; `run-ci-tests.sh` runs every ci-test through it and drops `CLAUDE*` session vars. +- agentic-delivery: `bg_admit.py admit SCRIPT` admits a background or shadow job only if it declares `# disk-cap:`, a `trap ... EXIT` cleanup and a `# disk-stop:` rule backed by a df/disk_usage check (`job_lease.py run --admit -- CMD` admits the script CMD actually runs); `bg_admit.py untrapped` lints shell scripts that call mktemp with no trap against the shrink-only `scripts/mktemp-trap-baseline.tsv`. +- Promote-by ratchet: `scripts/promote-by.tsv` lists a promote-by date for every shadow-default policy flag (`train_gate`, `lkg_gate`); `scripts/test_promote_by.py` fails when one is overdue or more than 120 days out (keeping a flag in shadow means recording a decision and moving the date). + +size-budget-raise: .claude/skills/INDEX.md 14671→14767 generated index row for bg_admit.py +size-budget-raise: .claude/skills/agentic-delivery/INDEX-scripts.md 15241→15388 generated index row for bg_admit.py + ## [1.609.0] — 2026-10-28 ### Added diff --git a/SHA256SUMS b/SHA256SUMS index 4f0893be8..f03955f97 100644 --- a/SHA256SUMS +++ b/SHA256SUMS @@ -19,8 +19,8 @@ b1080da06ca20a2807ea7be3a25cb95b94c97a6c2a686401796ffc3adac3ee37 .claude/skills 9521b057ff3db92d1e60923ebd88170713914f7e235ceb45717eb39419daf811 .claude/skills/agentic-ceo/scripts/weekly_receipt.py 1cbb49cb10c054dfc52d7721f1f5c741c97683e8be677463f774ca31f73c7cab .claude/skills/agentic-delivery/INDEX-scripts.md 7e8a02a1f7a363d82c427c4dbbff596f20e6d94c350145599b52d574b550e367 .claude/skills/agentic-delivery/INDEX.md -cb294d4e818a13084f0372e18a9dc786bc684f6af8d6bf16a40e3d71563b9c0e .claude/skills/agentic-delivery/SKILL.md -b96207a886490ea9c86607ea5c7bcae8575832b3688318fbba925bcc194aa0bb .claude/skills/agentic-delivery/VERSION +ad6bd53f58fb0e9215ae6106f3a3367fde773603abe1a52d18aa9e29a5f7da48 .claude/skills/agentic-delivery/SKILL.md +2173de515343f1e614346180abcee9f0dd17c3ea20d2ba2946e591b78672bbf9 .claude/skills/agentic-delivery/VERSION 7ffab2d4a589ac748779b948d02869f290d82f151516a04e0372481de431411d .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 @@ -193,8 +193,8 @@ d98f3e4380da3496061ba63be7beebe75017ab4ee1734eda9a3e798e19007b0e .claude/skills 18f20db537ab784460ad33cf218f7a01ac0a172fc38413f14c0e19e1ce6821cc .claude/skills/contribution/scripts/share_learning.py 6105878af71183aec3ff7c16f546f8044c313a3ae525ec9d4eda608ff737e97f .claude/skills/deep-code-review/INDEX-scripts.md 8f56d90513f2cdac935fa1106b97653734d09a220666d6d77ff5a47db96fc63b .claude/skills/deep-code-review/INDEX.md -16c74e96177e7ad354d063a410abd61d395b7b3ad7c9cfa0e519e8e6d2c044de .claude/skills/deep-code-review/SKILL.md -b96207a886490ea9c86607ea5c7bcae8575832b3688318fbba925bcc194aa0bb .claude/skills/deep-code-review/VERSION +5f7bec6c993539270612756e76b3c4e6d43989b528b2be55b2bd48a09593ba6d .claude/skills/deep-code-review/SKILL.md +2173de515343f1e614346180abcee9f0dd17c3ea20d2ba2946e591b78672bbf9 .claude/skills/deep-code-review/VERSION 392371349dc5757dbabc27d7a1e7fc38742b92c18e42d3fc7e5fb82b50d2c230 .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 @@ -402,8 +402,8 @@ e951eaa63fd0d1870701d69c89c29ef4fe74dbad9b680ab6ef0a4e993fb8bc20 .claude/skills fd316c63bbf1cc0ea64322d7d923d66692eaf7b545c056367bfecca35146c862 .claude/skills/growth-analytics/references/full-map.md 2f1d7499e9ed7ae59f550b5c00043e465b2a4e885821ad153438e2e33fcccb45 .claude/skills/growth-analytics/scripts/readout_check.py 5be54df47bce30f18c77b2b3f7fc6cfb9e58c59bf436f90e7e987122b6329557 .claude/skills/idea-critic/INDEX.md -db3a728b4f7e974be9c45d333137ec97188bfd90afb084b03beaff987a0975a2 .claude/skills/idea-critic/SKILL.md -b96207a886490ea9c86607ea5c7bcae8575832b3688318fbba925bcc194aa0bb .claude/skills/idea-critic/VERSION +aba0d02f46c6e9231ebe639f89df7202000afa693a29951fac277c64cf59cfce .claude/skills/idea-critic/SKILL.md +2173de515343f1e614346180abcee9f0dd17c3ea20d2ba2946e591b78672bbf9 .claude/skills/idea-critic/VERSION 0eaff6a652b6588e819d1a85caa697228bed504934dcb4d34097ebd69aef623a .claude/skills/idea-critic/evals/evals.json 0e1c0db300661a1ab1a427a7157c75e2ed67130ab24d5c6cb02ec3ff9e793f58 .claude/skills/idea-critic/evals/heldout.json d8098c5ced63e8b8608867dd144091049563a0553cf62d27ce05b9d52ac54266 .claude/skills/idea-critic/evals/triggers.json @@ -422,7 +422,7 @@ ffa9792bd3dc750725d85e32f91a8051d2f21932d035f3f4e47fcccb66186860 .claude/skills 0b3872c37c94e1db02a094ccdb04a39d1a245b1089f801729c2c1827a154ff6e .claude/skills/idea-critic/scripts/lenses/skeptic.txt e3c08eee63d6da353029bfcc78f0ba7638d75b3acb02fd0af045e3c399a857a6 .claude/skills/idea-critic/scripts/lenses/user-advocate.txt 5baa5b2f797a24208cac893de5ba34bda548590c0340ca41826bbcdc60dabf6c .claude/skills/idea-critic/scripts/validate_verdict.py -bdaa72ccc8ce87d58ad7d7f39b87d0151bb1af9ced0c5c61cad60886ae0d6daa .claude/skills/idea-critic/scripts/veche.py +99c575ad34fb286a0e4ea9551c8d07505a4a4731349f67cf36cae6ff8d990f87 .claude/skills/idea-critic/scripts/veche.py b812c50e074a71f342c5a9cf9d032f31be84768cd231840a0006c26c66536ccf .claude/skills/positioning/INDEX.md 595e209389ef87fded12b1f0b9a7f368449bc622e8b431f74a4f603438ed20b8 .claude/skills/positioning/SKILL.md f5e5c9534532840fcd45bb002e69ed85c61dba2753450e26b448b7df1481e24d .claude/skills/positioning/VERSION diff --git a/changelog.d/wave-ae-run-id-verdict-wired-drift.md b/changelog.d/wave-ae-run-id-verdict-wired-drift.md deleted file mode 100644 index d3ab60d9b..000000000 --- a/changelog.d/wave-ae-run-id-verdict-wired-drift.md +++ /dev/null @@ -1,8 +0,0 @@ -### Added -- agentic-delivery: `stage_run.py --run-dir DIR` refuses (exit 1) a run dir that already exists; `lkg.py verdict FILE` exits 1 with "rerun" unless the receipt is a pass for HEAD with matching runner blob (`run-ci-tests.sh` reads its own receipt back and honors `PERUN_RUN_DIR`); `wired_check.py --strict --runs FILE` (now the CI step) fails a new script with no caller or no exact-name run in the registered tests; new `vendor_drift.py TARGET` lists vendored skill files that differ from canonical (sha256) and exits 1 on drift or zero overlap (`--skills` flags deleted copies; `update-installed.sh` runs it). -- agentic-delivery: a merge train that parks a PR posts a `perun-train-refused: ` comment on it; admission skips a PR with that line for its current head, so a dropped PR is not re-ridden until a new push (invariant in `references/merge-queue-worktrees.md`). - -size-budget-raise: .claude/skills/agentic-delivery/references/full-map.md 23891→24381 one routing line for the four wave-AE mechanisms -size-budget-raise: .claude/skills/INDEX.md 14569→14671 generated index row for vendor_drift.py -size-budget-raise: .claude/skills/agentic-delivery/INDEX-scripts.md 15097→15241 generated index row for vendor_drift.py -size-budget-raise: .claude/skills/agentic-delivery/references/merge-queue-worktrees.md 43476→44819 one paragraph: head-bound train refusal invariant (author filter, clear, neutralized reason) diff --git a/changelog.d/wave-af-admission-sheriff-hostaccept.md b/changelog.d/wave-af-admission-sheriff-hostaccept.md deleted file mode 100644 index 8ab266dae..000000000 --- a/changelog.d/wave-af-admission-sheriff-hostaccept.md +++ /dev/null @@ -1,5 +0,0 @@ -### Added -- agentic-delivery: `scripts/admission_check.py` flags a per-PR admission config that omits a test class the batch runs (e.g. browser/e2e) and a stale or ownerless spec-selection map. `scripts/host_accept.py` is the merge-host acceptance checklist (operator reset without extra IAM, auto-reset on missed heartbeats, per-slice memory caps with sshd/agent reserve). `train_land.sh` runs both (rc != 0 refuses the train) whenever the base branch carries their config. The landing watchdog now surfaces the existing `red_main.py` uncovered/oldest-red alarm, and `flake_ledger.py serial-move` records tests moved to the serial project (never quarantined, failure there is BLOCKING as a real bug). - -size-budget-raise: .claude/skills/agentic-delivery/references/red-gate-triage.md 25417→27186 one paragraph: admission completeness and map owner, plus watchdog and serial-move notes -size-budget-raise: .claude/skills/agentic-delivery/references/fanout-host-sizing.md 48845→49827 one paragraph: merge-host acceptance checklist diff --git a/changelog.d/wave-ag-lane-wt-root.md b/changelog.d/wave-ag-lane-wt-root.md deleted file mode 100644 index b06fa3485..000000000 --- a/changelog.d/wave-ag-lane-wt-root.md +++ /dev/null @@ -1,5 +0,0 @@ -### Added -- agentic-delivery: lane worktrees live outside the watched repo tree. `scripts/lane_worktree.sh ` creates `lane/` under `${XDG_CACHE_HOME:-~/.cache}/perun-wt/` (override `PERUN_WT_ROOT`; `/` refused) and writes a per-lane marker; one host with 129 in-repo lane worktrees (49GB) kept fseventsd at 158% CPU. The `handback_cap.py` SubagentStop hook now removes the stopping lane's worktree with `git worktree remove` (never forced) and deletes its merged branch, only when the marker, repo, agent id (if set) and `lane/` branch match, the tree is strictly under the lane root, HEAD equals its upstream, and the tree is clean including ignored files; any doubt keeps it and reports on stderr (`PERUN_REAP_WORKTREE=0` disables). `perun_doctor.py` gains "lane worktrees in repo" and "lane worktrees out of tree" rows (count and size, `du` capped at 30s, WARN above 20 trees or 20GB). Tests: `scripts/test_lane_worktree_reap.py`. Doc: `worktree-isolation.md`. -size-budget-raise: .claude/skills/agentic-delivery/references/worktree-isolation.md 14713→16482 documents the out-of-tree lane worktree root and the stop-hook reaper in the one worktree reference -- `update-installed.sh` skips the vendored-drift report with one stderr note when `vendor_drift.py` is absent (an older checked-out tag), instead of printing "No such file". -size-budget-raise: .claude/skills/agentic-delivery/references/host-enforcement.md 44866→44913 points the orchestrator-worktree step at lane_worktree.sh diff --git a/changelog.d/wave-ah-peer-send-alarm-relay.md b/changelog.d/wave-ah-peer-send-alarm-relay.md deleted file mode 100644 index e96916a04..000000000 --- a/changelog.d/wave-ah-peer-send-alarm-relay.md +++ /dev/null @@ -1,5 +0,0 @@ -### Added -- agentic-ceo, agentic-delivery: a send to a remote peer session has no read receipt, so the conductor verifies pickup from the peer's durable trail after a bounded wait and never re-sends on silence alone (`multi-session-coordination.md`, linked from the agentic-ceo hard rules, scoped to bare sends so the board ACK rule keeps winning for board directives). `incident-response.md` now says to read the subject's last 2 comments or events before relaying an automated alarm. One eval case each; `scripts/test_peer_send_alarm_relay.py` pins the wording. -size-budget-raise: .claude/skills/agentic-ceo/SKILL.md 7332→7477 one short rule added: bare peer-send pickup check and read-before-relay alarm rule -size-budget-raise: .claude/skills/agentic-delivery/references/incident-response.md 12693→13056 one short rule added: bare peer-send pickup check and read-before-relay alarm rule -size-budget-raise: .claude/skills/agentic-delivery/references/multi-session-coordination.md 72883→73901 one short rule added: bare peer-send pickup check and read-before-relay alarm rule diff --git a/changelog.d/wave-aj-veche-timebox.md b/changelog.d/wave-aj-veche-timebox.md deleted file mode 100644 index b73e62127..000000000 --- a/changelog.d/wave-aj-veche-timebox.md +++ /dev/null @@ -1,4 +0,0 @@ -### Added -- idea-critic: `veche.py` returns `default_action` (proceed when `--reversibility easy`, else hold) and a `COUNCIL_BLOCKING_WORK` alarm when a council cannot decide or runs past `--alarm-s`; seats of each round run in parallel with atomic cap accounting and a failed seat is dropped; critique rounds add an anonymized Borda `peer_ranking`; a malformed `--criteria` error shows the `name:weight` format. - -size-budget-raise: .claude/skills/idea-critic/references/council.md 6098→8433 timebox and alarm section, peer ranking and parallel seats notes, and a compact gap table versus the fetched open-source councils diff --git a/changelog.d/wave-ak-hermetic-admission-promote-by.md b/changelog.d/wave-ak-hermetic-admission-promote-by.md deleted file mode 100644 index fcec41cbb..000000000 --- a/changelog.d/wave-ak-hermetic-admission-promote-by.md +++ /dev/null @@ -1,7 +0,0 @@ -### Added -- agentic-delivery: `scrub_env.sh CMD` now also gives the child an invalid `GH_TOKEN`/`GITHUB_TOKEN`, an empty throwaway `GH_CONFIG_DIR` and a refusing proxy with loopback direct, no ssh agent, no global git config or credential helper (`PERUN_ALLOW_NET=1` drops only the proxy, logged), so a test cannot post to a real PR even when it calls `gh` by absolute path past a PATH stub; `run-ci-tests.sh` runs every ci-test through it and drops `CLAUDE*` session vars. -- agentic-delivery: `bg_admit.py admit SCRIPT` admits a background or shadow job only if it declares `# disk-cap:`, a `trap ... EXIT` cleanup and a `# disk-stop:` rule backed by a df/disk_usage check (`job_lease.py run --admit -- CMD` admits the script CMD actually runs); `bg_admit.py untrapped` lints shell scripts that call mktemp with no trap against the shrink-only `scripts/mktemp-trap-baseline.tsv`. -- Promote-by ratchet: `scripts/promote-by.tsv` lists a promote-by date for every shadow-default policy flag (`train_gate`, `lkg_gate`); `scripts/test_promote_by.py` fails when one is overdue or more than 120 days out (keeping a flag in shadow means recording a decision and moving the date). - -size-budget-raise: .claude/skills/INDEX.md 14671→14767 generated index row for bg_admit.py -size-budget-raise: .claude/skills/agentic-delivery/INDEX-scripts.md 15241→15388 generated index row for bg_admit.py diff --git a/gemini-extension.json b/gemini-extension.json index c35a12b73..d8f6b0e09 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,6 +1,6 @@ { "name": "perun", - "version": "1.609.0", + "version": "1.610.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" }