feat(eot-hook): Branch A — recommendation-laziness self-check nudge - #234
Merged
Conversation
…follow-up to defer-reflex Stage 2 REJECT) Stage 2 REJECTed regex-based detection (precision 3%, recall 0/3); this is the text-recall complement maintainer requested per Branch B/C pattern. Branch A (long-text, no question) now includes a self-check bullet mirroring Branch B/C «настоящая развилка» framing: if the AI recommended something or said «ждёт твой клик», it must verify alternatives were genuinely considered before deferring — not offload to the maintainer reflexively. Companion test: Branch A it() extended with expect(reason).toMatch on the nudge text keywords (рекомендовал|жду твоего решения|перекладывай). NOT a capability commit: hook edit + test extension within existing files; no new ≥80 LOC file, no new dep. Prior-art: skipped — hook wording extension only, no new capability introduced; test extension follows existing paired-negative pattern in the same file.
This was referenced Aug 1, 2026
Merged
artyhoo
added a commit
that referenced
this pull request
Aug 6, 2026
#1211) BFR two-axis verdict on the three `anthropics/knowledge-work-plugins` the operator named as uncovered by 53c2ec + #1210: engineering, design, product-management. Complements (does not duplicate) both prior verdicts and corrects #1210 §A0's "no engineering/design plugin exists" — true only for `claude-plugins-official`, false for `knowledge-work-plugins`. Verdict: ADOPT-operator + KEEP NARROW-shipped for all three, with a load-bearing Cowork-vs-CC caveat. README verbatim "Built for Claude Cowork, also compatible with Claude Code" + explicit `claude plugin install <p>@knowledge-work-plugins` block → trio IS CC-CLI-installable (kickoff's "Cowork-only" over-narrowed it), but optimal seat = Cowork. Per-capability T16 (actual counts corrected: engineering 10 skills/0 cmds, design 7/0, PM 8+1 = 26 capabilities, not the kickoff's "~38"): 0/26 direct problem-class matches; 1/26 real mechanism-overlap (product-brainstorming ↔ superpowers:brainstorming) that is domain-divergent (PM product-problem vs technical-capability design) — additive, not a displacement candidate; 1/26 name-adjacent-format-divergent (write-spec PRD prose vs machine-parseable kickoff). Negative-existence (6-item §1): zero hooks.json/.husky/scripts/CI in the trio; enforcement is .mcp.json connectors + skill prose, structurally distinct from our 20 CC hooks and from security-guidance's decision:"block". SSOT row #235 chosen (not #234) to leave #234 for in-flight PR #1210. Principle tests 08/10/11 GREEN (28/28). Prior-art: prior-art-evaluations.md#235 Co-authored-by: Test <test@example.com>
artyhoo
added a commit
that referenced
this pull request
Aug 6, 2026
…y verdict + SSOT #234 (#1210) Utility/gap-fill audit answering the operator question: now that verdict 53c2ec established the Anthropic first-party plugins are NOT competitors, where are they useful to US in /arch /dispatcher /harvest + the maintainer's harness + what we ship? Plus the design-plugin (frontend-design) investigation. Headline: engineering v1.2.0 pack = KEEP NARROW (53c2ec closed it). Two marketplace siblings 53c2ec flagged-but-did-not-adjudicate are where the real utility is — security-guidance ships a real decision:"block" PostToolUse hook (closes a security-pattern gap our 20 CC hooks don't cover); code-modernization ships a legacy-modernization orchestration with no counterpart in our contour. frontend-design = ADOPT-operator (maintainer builds UI), REJECT-shipped (first- party CC-only, we ship no design-generation surface). Shipped net = ZERO companion changes. security-guidance + code-modernization flagged for separate prior-art passes. Two-axis (operator vs shipped) per build-first-reuse-default §1.1. T16 per plugin. §A0 resolves plugin identity (no 'engineering'/'design' in the marketplace roster; DeepWiki + host census agree). Falsifier per verdict §A6. Zero build: research-patch + SSOT row #234 only. companions.manifest unchanged. Verdict 53c2ec (off-staging) cited, not modified. Prior-art: prior-art-evaluations.md#234 (this commit — the verdict itself; sibling precedent at verdict 53c2ec, the standalone engineering-pack verdict, off-staging at time of this patch). Co-authored-by: Test <test@example.com>
artyhoo
added a commit
that referenced
this pull request
Aug 7, 2026
…A/B arm re-homed to S-K (#1251) Operator verdict 2026-08-07 on the §5 PARKED DECISION-NEEDED: Option A. The ADR-8 A/B experiment is descoped from S-D′; the stage ships subtraction maps + review-seat agent definitions + the #234 annotation, and a PR with no evaluation arm is now conformant rather than incomplete. Edits: - Header rev marker -> REV 6, stating what moved and that the §5 blocker is lifted (the two-gate S-E + S-H dependency is untouched and still binds; S-E has not merged). - §1 item 3: PARKED -> DESCOPED. The four Phase -1 findings stay as the record of WHY; the binding instructions to the executor are inverted from "held" to "absence is not a shortfall". - §4 T2: re-scoped. ADR-8's baseline left with the arm, but S-D′'s OWN before/after baseline is still in scope and still subject to "captured, not described" -- now citing the pre-prune snapshot per the header INPUT CONDITION landed in #1250. - §5: heading and framing flipped to RESOLVED; the fork text kept verbatim as the record of what was decided against what alternative. - §5 INCONCLUSIVE: CLOSED, with evidence. aif creates the task id AFTER the prompt is composed -- the kickoff ships as `description` inside POST /tasks (AifHandoffBackend.ts:231-239) and the id exists only in that response (:249); the only post-create mutation is PUT {paused:false} (:260), the sole other write a best-effort DELETE rollback (:263). A parity-selected arm therefore cannot live in the dispatch prompt without a two-phase redesign -- independent grounds for Option A. Caveat carried: verified client-side only; packages/api not audited for description-editability of a paused task. - §6 (new): S-K stub. Entry criteria = the four unchanged findings + the task-id finding; the three surfaces it needs (ledger schema, dispatcher SKILL.md, install.sh skip-list) named as the reason it could not live in S-D′; inherits the INPUT CONDITION; depends on S-D′ merged. - Umbrella kickoff: S-K stub row added, S-D′ row updated (Implements ADR-8 -> ADR-1), and the "ADR-8 is NOT orphaned" paragraph extended with the second recorded deviation and the new host. Recorded rather than quietly ignored: Option A's own text instructed rewriting out a §3 sentence ("a PR that ships maps with no executable A/B arm fails the stage's purpose") that DOES NOT EXIST in this file. Verified by exhaustive grep, not by reading §3 -- the §3 region carries only the #optout-as-reflex note about install-fingerprint snapshots. The A/B framing lived in §1 item 3 and §4 T2, which is what this rev actually edits. The discrepancy is annotated inline in §5 so the next reader does not re-hunt for it. Prior-art: skipped — records an operator decision into an existing kickoff, no new capability Co-authored-by: Test <test@example.com>
artyhoo
added a commit
that referenced
this pull request
Aug 8, 2026
…(stage PR) (#1290) * feat(s-d-prime): per-seat subtraction maps (S-D′ deliverable 1) Single map doc under docs/superpowers/specs/ authoring what each CC seat class STOPS loading — senior main seat / review subagents / Explore-Plan / aif-container / ZCode population table per ADR-2. Per-row cells: cost (measured, cited) · reach (with BASIS — S-H P11 / S-L census / `UNVERIFIED — no probe exists`) · restoration trigger (OBSERVABLE per T-SDP-B) · mechanism + §0.6 agnosticism-behaviour. Key rows: - S-MAIN-INJ — bootstrap injector (FORK E mandatory block), 1,760 + 1,866 B/firing, residency-weighted ~53 KB/session, ~12× P5a lever (S-H §5). PROPOSED DIFF — once-per-session cache pattern with compact_boundary invalidation. - S-MAIN-SKILL — skill_listing 26,696 cp / 8,870 tok (S-L §5 top-ranked, 4.9× any other message-stream row). PROPOSED DIFF — de-list zero- invocation skills. - S-MAIN-AGENT — built-in agent descriptions 2,305 cp (S-L §2.2 built-in subset). Upstream feature request, documented degradation. - S-MAIN-TOOL — deferred_tools + mcp_instructions 7,816 cp combined (S-L §2.1). Per-MCP-server upstream PRs, recommended. §3.1 Tier-0 swap — DECISION: NO SWAP FIRES THIS STAGE. §0.5 priority ordering puts skill_listing (8,870 tok) ahead of the largest Tier-0 rule (build-first-reuse-default ~3,167 tok @ 4 B/t). §2 proposed-diffs carry the senior-seat subtraction; the §3.2 candidate-choice fork PARKED as DECISION-NEEDED for a future stage. §4 Review subagents — 8 in-scope agents enumerated (T10 before T1); reach uniform `UNVERIFIED — no probe exists` per kickoff §3 M2; agent- file edits ship via Task 6 (cross-referenced). §5 Explore/Plan — ALREADY DONE per S-H P11 (REAL verdict: 26,659 tok / 26,783 tok vs control 62,340 tok, no rules / no CLAUDE.md loaded). §0.1 INPUT CONDITION PARKED — no host-side billing-projection snapshot channel exists in this repo; map cites per-block measured figures as BEFORE baseline, DECISION-NEEDED surfaced for PR body. §1.7 self-reflexive note: forward-check + backward-check + recursive- self-application all verified. Stage S-D′ of the arch-v2-context-pipeline umbrella. ADR-8 A/B arm descoped per kickoff §5 Option A (operator verdict 2026-08-07) — a PR with no evaluation arm is conformant. Prior-art: prior-art-evaluations.md#234 (token-economy subtraction maps; verdict per SSOT row, this stage's annotation appended in Task 9). * feat(s-d-prime): review-seat agent replacement prompts + regen snapshots (S-D′ deliverable 2) Replacement system prompts for the 8 in-scope review-seat agents per S-D′ deliverable 2 (kickoff §1 item 2). Each carries reviewer-discipline clauses (§1 role separation + §2 DECISION-NEEDED 4-step), a subtraction-map-row reference (S-D′ §4.2 pointer), and a GO/REVISE/STOP vocab note where the agent's grammar is the source per dispatch-input-checker.md:121. Agents + before→after bytes (per S-D′ §4.2): - adapter-jig-reviewer.md 13,067 → 8,430 (-35%) - backward-sweep-auditor.md 8,221 → 6,413 (-22%) - capability-reuse-auditor.md 8,691 → 6,886 (-21%) - compliance-verifier.md 13,380 → 7,030 (-47%) - dispatch-input-checker.md 12,469 → 9,940 (-20%) [DISPATCH-INPUT grammar at L121 preserved verbatim] - docplan-auditor.md 7,924 → 7,307 (-8%) - fidelity-auditor.md 9,072 → 8,095 (-11%) [FIDELITY grammar + Watch-list schema preserved verbatim] - reviewer-discipline.md 4,892 → 5,091 (+199 B, no-op trim — map §4.2 had flagged "LIKELY NO-OP") Wishful byte targets were not all met: the binding kickoff criteria (b)+(c)+(d) additions (reviewer-discipline clauses, subtraction-map-row ref, GO/REVISE/STOP vocab note ~1,050 B/agent) made some targets infeasible without gutting agent function. Recorded honestly in map §4.1 + §4.2 with a "Wishful-targets finding" block per §3a park-don't-guess contract — actuals cited with percentages, no number gutted to hit a target. Snapshot baselines regenerated (8 fingerprint files across 4 templates × brownfield/greenfield) — the agent file edits shift install fingerprints per kickoff §1 item 2. SNAPSHOT_MODE=compare passes 15/15. host-verify gates (kickoff §3): all three green on host. - snapshot compare: 15 PASS / 0 FAIL - render-rule-index --check: up-to-date - render-rule-channels --check: 40 verdicts, 0 undeclared refusals - Tier-0 swap leg: N/A — no swap fires this stage (map §3.1); skill_listing 8,870 tok > biggest Tier-0 rule ~3,167 tok, so no swap can pay. * docs(s-d-prime): SSOT #234 annotation — trigger (a) fired (S-D′ deliverable 4) Per kickoff §1 item 4: trigger (a) fired — operator-declared expensive-seat budget exhaustion, 2026-08-06 session. Verdict text unchanged (DEFER); annotation appended per the row's own protocol. Why verdict unchanged: S-D′ (the reopened S-D scope) answers the trigger via the SUBTRACTIVE path (per-seat subtraction maps + review-seat replacement system prompts at agents/*.md — see commit e1eb0bab99 for the map and 0f183ba9f9 for the agents), not as the additive L2 build this row scoped. The row's "re-open S-D as a build" clause remains armed for a future ADDITIVE incident. Last reviewed bumped 2026-07-31 → 2026-08-07. * fix(s-d-prime): regen stale capability-reuse-auditor.md snapshots (review d079447b) Review-iteration 1/3 of S-D′ found the snapshot gate RED: 7 PASS / 8 FAIL on `SNAPSHOT_MODE=compare bash tests/install-sh/snapshot.sh`. The committed fingerprints stored hash `6a8829fd…` for `agents/capability-reuse-auditor.md` but the actual install today produces `233fb47b…` across all 8 npm-template baselines (react-next, react-spa, react-native, ts-server × greenfield/brownfield). The python/cargo/go baselines don't ship `.claude/agents/` and already passed. Root cause (per review): the agent file was edited again after its snapshot was captured in `0f183ba9f9` but before commit, and the regen was not re-run. This stacked fix commit re-runs `SNAPSHOT_MODE=capture bash tests/install-sh/snapshot.sh` and re-verifies: $ SNAPSHOT_MODE=compare bash tests/install-sh/snapshot.sh ✓ PASS: ts-server/{greenfield,brownfield} ✓ PASS: react-next/{greenfield,brownfield} ✓ PASS: react-spa/{greenfield,brownfield} ✓ PASS: react-native/{greenfield,brownfield} ✓ PASS: python/{greenfield,brownfield-ruff,brownfield-sgconfig} ✓ PASS: cargo/{greenfield,brownfield-clippy} ✓ PASS: go/{greenfield,brownfield-golangci} Result: 15 pass / 0 fail Diff is a pure one-line hash swap per fingerprint file — no path additions or removals (verified: each diff is exactly the `6a8829fd… → 233fb47b…` line for `.claude/agents/capability-reuse-auditor.md`). The other two host-verify gates are unchanged and still green: $ npx tsx scripts/render-rule-index.mjs --check ✓ rule-index up-to-date $ npx tsx scripts/render-rule-channels.mjs --check ✓ rule-channel matrix up-to-date: 40 verdicts, 0 undeclared refusals Stacked rather than amending `0f183ba9f9` per CLAUDE.md `git-conflict-merge-forward` — force-push is permission-classifier-blocked for agents in every form, so an amend of a published PR-branch commit is a dead end. Not a capability commit (snapshot regen only) — Prior-art trailer skipped per the snapshot-regen escape hatch in CLAUDE.md `Prior-art: trailer syntax`. * fix(s-d-prime): correct stale §4.1/§4.2 AFTER byte counts (review e08389f4177f) Review iteration 2 found the §4.1 AFTER column carried predicted values authored in commit e1eb0bab99 that diverged from the actual agent sizes authored in commit 0f183ba9f9; the map was never reconciled. Corrected cells (verified via `wc -c` at HEAD): - capability-reuse-auditor: 6,886 → 7,854 B (delta −1,805 → −837) - dispatch-input-checker: 9,940 → 10,922 B (delta −2,529 → −1,547) - adapter-jig-reviewer: 8,430 → 8,439 B (delta −4,637 → −4,628) — 9-byte pre-existing typo NOT in the finding, but forced: the finding requires the §4.1 TOTAL row to be accurate, and leaving adapter-jig at 8,430 would make rows sum to 61,142 while true `wc -c` sum is 61,151. - §4.1 TOTAL: 59,192 → 61,151 B (delta −18,524 → −16,565, −24% → −21%) - §4.2 trim cells/percentages updated for the three rows above. §4.1 AFTER column now sums to 61,151 (matches TOTAL); delta column sums to −16,565 (matches TOTAL). Grep confirms zero remaining stale values. No agents/*.md, rules, or snapshots touched — render-rule-index and render-rule-channels gates re-confirmed green. * fix(s-d-prime): restore plugin/agents/compliance-verifier.md twin parity Task 6 rewrote agents/compliance-verifier.md but not its byte-identical plugin twin, breaking the drift guard at packages/core/principles/24-plugin-manifest-integrity.test.ts arm (d) ("every plugin/agents/*.md is byte-identical to its agents/ source"). Copied agents/compliance-verifier.md over plugin/agents/compliance-verifier.md (exact bytes). PERMITTED-FILES DEVIATION (forced): plugin/agents/ sits outside the kickoff §2 allowlist. The edit is not optional — the principle-24 twin invariant makes the plugin copy a mechanical consequence of the allowlisted agents/ edit, and leaving it out ships a RED principle test. Flagged in the PR body as a forced deviation, not a scope expansion. * fix(s-d-prime): replace stale line-number anchors with section anchors Task 6's reflow moved dispatch-input-checker.md's verdict grammar from :121 to :111 and its verdict rule from :134 to :124, leaving 10 citations in 7 sibling agents (and one in the spec's §4.2 row) pointing at the wrong lines. Fixed by anchoring on the stable section heading instead of a line number: "dispatch-input-checker.md §Output grammar" (the heading at :108 owns both the DISPATCH-INPUT block and the K1/K2/K5→STOP, K3/K4→REVISE verdict rule), so the citation survives any future reflow of that file. Sites: adapter-jig-reviewer:25, backward-sweep-auditor:21,88, capability-reuse-auditor:22,74, compliance-verifier:17,131, docplan-auditor:24,103, fidelity-auditor:30, dispatch-input-checker:31 (its own "at line 121" self-reference), spec §4.2 dispatch row. plugin/agents/compliance-verifier.md re-copied in the same commit to keep the principle-24 arm (d) twin invariant green (forced permitted-files deviation, see the previous commit's rationale). * fix(s-d-prime): restore two antecedents the slimming pass dropped adapter-jig-reviewer (T-AJ-A): the trap paragraph kept "cite the real lane" but dropped the verdict mapping, leaving the reader without the consequence. Restored: an arm wired to the fixture but never exercised against the real lane is theatre → flag it INSUFFICIENT. fidelity-auditor (single-block invariant): "the gate rejects both appended-block shapes" had no antecedent after the trim — the two shapes are now named again (an appended `skipped` neutralising a recorded REVISE; an appended `GO` shadowed by the round-1 REVISE above it), and the load-bearing consequence is restored: every line of the block, including the `Evidence:` file:line, must sit inside the section, because hasEvidence() scans only within the section bounds (packages/core/hooks/checks/pr-body-fidelity.ts:113,121-122). * fix(s-d-prime): align liveness fixture with the agent's GO-form summary tests/fixtures/shipped-agent-liveness/compliance-verifier.md:54 modelled a tool-less RED response using the old "§1.7 Forward-check: PASS" summary shape. agents/compliance-verifier.md now emits GO/REVISE tokens ("- Forward-check: GO | REVISE (N issues)"), so the fixture's RED marker no longer mirrored any output the agent can produce. Updated to the current GO-form line; the marker's point (a confident verdict with no tool call) is unchanged. * fix(s-d-prime): re-derive every token figure as a band + correct the S-L quote Three numeric defects, all pointing the same direction (understated cost): C4 — §0.3 misquoted the S-L band as "2.62-3.43 cp/tok for dense tables, 3.43-4.00 cp/tok for Cyrillic": both endpoints and the direction were wrong. The true operative bands (s-l §1.2, :100-101) are bytes 1.835-3.416 B/tok and codepoints 1.835-3.128 cp/tok, with dense ASCII pipe-tables at the LOW end and Cyrillic-rich prose at the HIGH end. The §1.3 unit-binds-to-channel rule is now stated, and the §0.3 table's uniform "@ 3 cp/tok" point estimates are bands with their unit named. skill_listing is relabelled MEASURED, not converted. C3 — every "@ 4 B/t" figure re-derived as a band (bytes / 3.416 floor to bytes / 1.835 ceiling): the two injectors (~515-959 / ~546-1,017), CLAUDE.md (~6,617-12,319), and the three Tier-0 rules. Where S-L §1.1 measured the exact file on a live /context read, the measured value is quoted alongside the band (build-first-reuse-default 4,800 tok at :55; attention-is-not-a-mechanism 1,100 tok at :54). C3 (ordering) — §3.1's "the Tier-0 swap is the fourth lever, not the first" is OVERTURNED by the re-derivation and is withdrawn in place. At the corrected band build-first-reuse-default.md is the SECOND lever (4,800 tok measured, band floor 3,708 at or above every harness block's ceiling); only skill_listing (8,870) is larger. The no-swap outcome is kept, but the ranking is now stated honestly and carries an explicit DECISION-NEEDED (operator) marker: firing the Tier-0 swap is a channel re-scope decision reserved to the operator per kickoff §3a. Reasons (2) and (3) — not the falsified size argument — now carry it. C2 — "~53 KB per session" (§0.4 and the §2.1 cost cell) resurrected the figure its own cited source corrected. Replaced with the measured ~17.3 KB/session (s-h :352-361); the ~53 KB estimate assumed per-turn firing and was overstated ~3×. The "~12× the P5a lever" ratio in the same cell was re-checked and DOES survive: numerator and denominator are both bytes/4 x residency, so a common divisor cancels (s-l §1.6 "band-invariant"). Under per-content divisors it moves upward (~17x), so ~12x is restated as a floor, not a point. * docs(s-d-prime): 18-file agents census, S-E link repair, reclassification stub I4 — §4.1 now carries the complete `ls agents/*.md` census (18 files, T10 enumeration before T1 sampling): the 8 in-scope review seats, the 3 maintainer-owned files, and the remaining 7 each with a read-the-header reason for exclusion. memory-codification-auditor gets an honest classification (it IS an auditor with a verdict; it is out because its subject is the user-scope memory store, not a PR/diff, and it is a @dual-pair twin of .claude/hooks/inject-memory-codification.sh) rather than a wave-off. A boundary note records that the four largest agent files (16-24 KB) are all out of scope, so this stage's −21% does not touch the heaviest prompts in the tree. I5 — §9 links repaired: `../research-patches/…` resolved to nothing from docs/superpowers/specs/ (correct prefix is `../../meta-factory/research-patches/`), and `2026-08-07-s-e-*.md` was a literal glob matching no file. S-E (#1237) shipped no research patch: the §0.2 instrument IS scripts/measure-always-on.sh, with its overlay/observability semantics in the two 2026-08-06 S-E verdict patches. All three cited by real path. I3 — §6 gains the reclassification mechanics the three deleted "Revisit criterion" blocks used to carry (install.sh SHIPPED_DOCS + principle-09 REQUIRED_HEADER_DOCS, drop the setup.d/20-agents.sh:28-30 skip-loop line, regen fingerprints), so prior-art-evaluations.md #195's Trigger-to-revisit no longer dangles. M1 (spec half) — the adapter-jig-reviewer restoration trigger named "a F1-F11 dimension", an arm set the agent does not have; replaced with its real eight conformance groups (A1-A2 / B1-B3 / C1-C4 / D1-D3 / E1-E3 / P1 / G1-G3 / H1-H3). §4.1/§4.2 BEFORE→AFTER byte counts refreshed against the current files after this review round's agent edits (TOTAL 77,716 → 61,774 B, −15,942 B / −20.5%). * chore(s-d-prime): regen install fingerprints after the review-round agent edits Mechanical regen (SNAPSHOT_MODE=capture bash tests/install-sh/snapshot.sh). The four shipped agents this round touched — capability-reuse-auditor, compliance-verifier, docplan-auditor, fidelity-auditor — changed content (section anchors, restored antecedents), so their hashes move in all 8 npm baselines. No file added or removed; only hash lines change. * fix(s-d-prime): r2 delta-review — band-floor overclaim, 6903 ceiling, -20.5% residue Round-2 narrow delta review (cold seat) found the strengthening claim at §3.1 falsified by the table 12 lines above it: the hook injects' band ceiling (3,735) exceeds build-first-reuse-default's band floor (3,708), so '#2 rank' rests on the MEASURED 4,800, not band separation — restated. Rounding: 12667/1.835 = 6902.997 -> 6,903 (3 sites). Prose residue -21% aligned to the table's -20.5%. * fix(s-d-prime): de-link the plugin-context-broken See-also ref + regen fingerprints From plugin/agents/ the relative link ../.claude/rules/phase-research-coverage.md resolves to plugin/.claude/rules/ which does not exist; the diff-scoped dead-link pre-push gate rescans the byte-identical twin on this push and fails. Converted to a code-span (the same file's lines 44/91 form). Twin re-copied (principle 24 arm d), 8 npm-stack fingerprints recaptured. --------- Co-authored-by: Test <test@example.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Extends
.claude/hooks/end-of-turn-reminder.shBranch A (long-text recap, no question) with a recommendation-laziness self-check nudge — mirrors the existing Branch B/C «настоящая развилка» framing for the case where there is noAskUserQuestion.Why: Defer-reflex Stage 2 benchmark (PR #232) REJECTed the regex-based detection mechanism (precision 3%, recall 0/3). The underlying problem (agent says «PR ready, ждёт твой клик» instead of merging — 3 documented incidents in
feedback_no_human_verification_ai_self_verifies.md) is real and uncovered. Maintainer pointed out: Branch B/C already has the «один вариант явно лучше → НЕ спрашивай, сделай» nudge, but it only fires onasked=true. Defer-reflex incidents happen in Branch A turns (long recap, no explicit question). Extending Branch A with the same nudge closes the gap without a regex gate — text-recall reminder fires always, no precision/recall trade-off.Sibling, not regex replacement: This is the text-recall complement to T20 (
inline-verdict-without-evidence) — same family, different action surface. Perrecommendation-laziness-discipline.md §1.12framing.Changes
.claude/hooks/end-of-turn-reminder.shcat <<EOFblock, between «Следующий шаг» and «Любой пункт не выходит конкретным»packages/core/hooks/end-of-turn-reminder.test.tsit(...)block: `expect(payload.reason).toMatch(/рекомендовалNot a capability commit
Hook edit (existing file) + test extension (existing file). No new dep, no new ≥80 LOC packages/ source, no new file under new packages/ subdir. Pre-push
detectCapabilityReasonreturns null → no Prior-art trailer required.How to verify
pnpm vitest run hooks/end-of-turn-reminder.test.tsgreen, including new Branch A nudge assertionbash hook <<< '{"transcript_path":"/dev/null","stop_hook_active":false}'exits 0 silently@cc-only-rationaleannotation preserved — verified: hook line 2 unchanged (internal dev tooling, not shipped to consumer projects)§1.7 Forward/Backward-check applied
Forward-check:
no-paid-llm-in-ci.md §1: deterministic bash, no LLM, no API calls — file:line evidence:.claude/hooks/end-of-turn-reminder.sh:228(text-only insertion in heredoc)dual-implementation-discipline.md §3: hook already carries@cc-only-rationale: internal dev tooling — end-of-turn reminder injection for maintainer's CC session; not shipped to consumer projects via install.shat line 2; extension inherits — no annotation change neededparallel-subwave-isolation.md §1: Worker ran in harness-allocated worktree viaisolation: \"worktree\"recommendation-laziness-discipline.md §1.12— this is exactly the «delivery-channel» implementation of §1.12 «Lead with a reasoned recommendation; act when the best path is clear» for the non-AskUserQuestion caseBackward-check:
ai-laziness-traps.md) — same family, different surface; T20 = inline-verdict-without-evidence (recommendation moment with no preceding tool call); this nudge = «check yourself for laziness in recommendation/deferral within recap moment»recommendation-laziness-discipline.md— that rule stays Class C; this is an additional always-on delivery channelai-laziness-traps.md— no new T-trap added; T21 slot remains free for next claimantRollback plan
Revert single PR — Branch A reverts to pre-nudge wording; recommendation-laziness discipline reverts to T20 + Branch B/C-only coverage (the pre-this-PR state).