From 2f2f7446a58f251aac4322078859bcb001b691d2 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Fri, 3 Jul 2026 18:06:45 +0300 Subject: [PATCH] =?UTF-8?q?feat(skill):=20pedigree=20=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E,=20idle-guard=20=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20=D1=87?= =?UTF-8?q?=D1=83=D0=B6=D0=BE=D0=B3=D0=BE=20=D1=85=D0=BE=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - реальный инцидент 2026-07-03: Codex-координатор искал механизм Claude вместо своих субагентов, пропустил ревью и записал выдуманную причину; там же трижды воспроизведён недоставленный отчёт живого ревьюера. - Что: - Step 7: строка **Reviewer:** (pedigree) во всех трёх итоговых шаблонах; в Rules — запрет молча пропускать/подменять ревью. - Step 6: idle-уведомление больше не «авторитетный сигнал смерти» — unreachable только после повторного idle-without-report вслед за nudge; указатель из Step 3 (действует и на Round 1). - Step 2: спавн только на исполняющем хосте, запрет щупать чужой механизм; две новые строки в Red Flags. - Проверка: - adversarial team review порта: APPROVED (вердикт тиммейта-ревьюера, Claude, Agent Teams), NIT-правки формулировок применены. Co-Authored-By: Claude Fable 5 --- SKILL.md | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/SKILL.md b/SKILL.md index 3f87f08..7e1690f 100644 --- a/SKILL.md +++ b/SKILL.md @@ -118,6 +118,11 @@ pass it the briefing assembled from `reviewer-prompt.md`. as the host can spawn a subagent and (optionally) route follow-up messages to it. +Spawn on the host that is executing this skill. Do not probe for or +shell out to **another** host's mechanism (e.g. looking for the Claude +Code CLI or Agent Teams env vars from inside Codex) — "the other host's +mechanism is unavailable" is never a reason to skip the review. + The reviewer is a full agent session — it explores the repo, runs git commands, and reads files on its own. **Do not pre-collect diffs or file lists for it.** Pass mode-specific context only: @@ -206,6 +211,11 @@ Then check the verdict line: | Unclear / missing | Send a message back asking for a clear verdict line | | Round 5 reached | Step 7 with the "Max rounds reached" terminal state | +If instead of a response the host delivers an idle notification with no +report attached, apply the idle guard from Step 6 ("Detecting a dead +reviewer"): request the report once before concluding the reviewer is +gone. This applies to Round 1 as much as to re-review rounds. + --- ## Step 4: Evaluate findings (do NOT apply yet) @@ -436,9 +446,13 @@ one of the following is true: - The host surfaces an explicit shutdown / "teammate exited" / "no such teammate" event. On Claude Code + Agent Teams this includes the documented case where a resumed session no longer has the previous - teammates alive, and idle notifications (`TeammateIdle` / - message-delivery events) — when present, these are the authoritative - liveness signal. + teammates alive. +- An idle-without-report **repeats after a nudge**: the reviewer went + idle with no report delivered, you requested the report once, and the + answer was another idle-without-report. (A single idle notification + alone is not a death signal — a live reviewer sometimes goes idle + with its report undelivered on the first attempt, and the nudge + retrieves it; observed repeatedly in practice.) - Send fails outright (error response, not a success ack). - The reply is overdue (no `TeammateIdle` / message-delivery notification in a reasonable window) **and** an operator is present to confirm — @@ -505,11 +519,16 @@ This is a soft signal, not a hard gate. ## Step 7: Final result +The **Reviewer:** line reports the actual pedigree — what performed the +review (e.g. `Agent Teams teammate, Claude Opus` or `Codex native +subagent, GPT`), not what was planned. + **Approved:** ``` ## Team Review — Summary (mode: ) **Status:** Approved after N round(s) +**Reviewer:** [Final review verbatim] @@ -523,6 +542,7 @@ chose to conclude, or the run is headless): ## Team Review — Summary (mode: ) **Status:** NOT VERIFIED — fixes applied, reviewer did not re-verify +**Reviewer:** **Round N findings:** [Verbatim findings from the last reviewer round] @@ -540,6 +560,7 @@ by the reviewer. Manual review of the fixes is required before merging.** ## Team Review — Summary (mode: ) **Status:** Maximum reached (5 rounds) — not fully approved +**Reviewer:** **Remaining findings:** [Unresolved issues] @@ -574,6 +595,10 @@ Do NOT delete plan files that existed before the review. - Avoid creating auxiliary files (memory files, state files, logs, temporary markdown) — prefer working within the conversation context - If a fix contradicts user requirements — skip it and explain why +- Never skip or silently substitute the review. Declaring a spawn or + continuation mechanism unavailable without having attempted it is a + process violation — the **Reviewer:** line in the summary reports + what actually ran - For re-review, prefer continuation (cheap). Fresh-spawn is the expensive path — always confirm with the operator before doing it. In headless runs without operator access, conclude unverified rather @@ -600,6 +625,8 @@ the skill. Stop, re-read Steps 4–5. | "Just paraphrase the findings to save space" | Verbatim. Always verbatim. Paraphrase loses signal. | | "Severity hasn't dropped in 3 rounds, but I'll push through" | Pause. Surface to operator. Something is structurally off. | | "Continuation isn't available — let me just spawn a fresh reviewer" | Ask the operator first. Fresh-spawn is expensive; the operator may prefer to conclude unverified. | +| "This host can't run the skill — skip the review and note why" | Use the host's own subagent mechanism (Step 2). Attempt, then report what actually ran in the **Reviewer:** line. | +| "The reviewer went idle — it must be dead" | Idle ≠ dead. Request the report once (Step 6 idle guard); reports sometimes fail to deliver on the first attempt. | ---