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"
}