# ЁЯдЦ dsh-auto-review **DeepSeek Harness рдХреЗ рд▓рд┐рдП рджреНрд╡рд┐рддреАрдп-рдореЙрдбрд▓ AI рдЕрдиреБрдореЛрджрди тАФ рдПрдХ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдореАрдХреНрд╖рдХ рдЙрдк-рдПрдЬреЗрдВрдЯ рдЕрдиреБрдореЛрджрди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рдЕрдиреБрдорддрд┐/рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдгрдп рдХрд░рддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓-рдмрдВрджред** *рдЬрдм рдХреЛрдИ рдХреНрд░рд┐рдпрд╛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕реАрдорд╛ рдкрд╛рд░ рдХрд░рддреА рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рдореЙрдбрд▓ рд╕рд╛рдХреНрд╖реНрдп рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдХрд╛рд░рдг рд╕рд╣рд┐рдд рдирд┐рд░реНрдгрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИ тАФ рддрд╛рдХрд┐ рдордиреБрд╖реНрдп рдХреБрдЫ рднреА рд╕реНрд╡реАрдХреГрдд рди рдХрд░реЗрдВ рдФрд░ рдХреБрдЫ рднреА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЫреВрдЯ рди рдЬрд╛рдПред* [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) [![DSH plugin](https://img.shields.io/badge/dsh-plugin-тЬЕ-green)](https://github.com/topics/dsh-plugin) [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#) [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-auto-review/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-auto-review/actions) [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-auto-review?label=version)](https://github.com/PerryLink/dsh-auto-review/releases) [![npm version](https://img.shields.io/npm/v/dsh-auto-review)](https://www.npmjs.com/package/dsh-auto-review) [![npm downloads](https://img.shields.io/npm/dm/dsh-auto-review)](https://www.npmjs.com/package/dsh-auto-review) [English](README.md) ┬╖ [чоАф╜Уф╕нцЦЗ](README.zh.md) ┬╖ [Espa├▒ol](README.es.md) ┬╖ [Portugu├кs](README.pt.md) ┬╖ [рд╣рд┐рдиреНрджреА](README.hi.md)
--- ## рдЕрдиреБрдХреВрд▓рддрд╛ | рд╕рддрд╣ | рд╕реНрдерд┐рддрд┐ | |---|---| | Harness | DeepSeek Harness `0.1.0-rc.7` (peers `0.1.0-rc.7` рдкрд░ рдкрд┐рди рдХрд┐рдП рдЧрдП) | | Node | `^22.19.0 \|\| >=24.0.0` | | рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо | рд╕рднреА (рд╣реЛрд╕реНрдЯ answerer; рд╕рддреНрд░-рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдХреНрд╖рдорддрд╛ рдХреЗ рдЬрд╝рд░рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡реЗрдм рд╕рдореАрдХреНрд╖рд╛ рдкреИрдирд▓) | | рдореЙрдбрд▓ | рдХреЛрдИ рднреА (рд╕рдореАрдХреНрд╖рдХ рд╕рддреНрд░ рдПрдЬреЗрдВрдЯ рдХрд╛ рдорд╛рд░реНрдЧ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ; `reviewerModel` рдЙрд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ) | ## рдЖрдкрдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ `dsh-auto-review` `approval/request` answerer рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рджреВрд╕рд░рд╛ рдореЙрдбрд▓ рд░рдЦрддрд╛ рд╣реИ: 1. **рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реАрдо** тАФ рдПрдХ answerer рдЬреЛ рдХреЗрд╡рд▓ рдЕрдкрдиреА рд╕реАрдорд╛ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ (`ai` рдиреАрддрд┐) рдХреЛ рдЕрдкрдирд╛рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдХреА рд╕рдм `next()` рд╕реЗ рд╕реМрдВрдк рджреЗрддрд╛ рд╣реИ; рдорд╛рдирд╡ рдЕрдиреБрдореЛрджрди рдкреНрд░рд╡рд╛рд╣ рдХрднреА рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ред 2. **рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдореАрдХреНрд╖рдХ рдЙрдк-рдПрдЬреЗрдВрдЯ** тАФ `read`/`glob`/`grep` рдЯреВрд▓ рдЕрдиреБрдорддрд┐-рд╕реВрдЪреА рд╡рд╛рд▓рд╛ рдПрдХ-рдмрд╛рд░ рдХрд╛ fork рд╕рдВрд░рдЪрд┐рдд рдирд┐рд░реНрдгрдп `{ decision, reason, riskLevel }` рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╕рдореАрдХреНрд╖рдХ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд╣рдЪрд╛рди рд╕реЗ рдкрд╣рдЪрд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реМрдВрдк рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ; `maxDepth` + рдЕрдиреБрдорддрд┐-рд╕реВрдЪреА рд╕рдореАрдХреНрд╖рдХ рдХреЛ рдЧреИрд░-рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрдХ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВред 3. **рд╡рд┐рдлрд▓-рдмрдВрдж** тАФ рд╕рдореАрдХреНрд╖рдХ рдХреНрд░реИрд╢, рдЯрд╛рдЗрдордЖрдЙрдЯ рдпрд╛ рд╕реНрдХреАрдорд╛ рдмреЗрдореЗрд▓ `fallbackPolicy` (рдбрд┐рдлрд╝реЙрд▓реНрдЯ `rejected`) рд╕реЗ рд╣рд▓ рд╣реЛрддрд╛ рд╣реИ; рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдирд┐рд░реНрдгрдп рдЕрдкрдирд╛ рдХрд╛рд░рдг рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдХреЛ рд▓реМрдЯрд╛ рджреЗрддрд╛ рд╣реИред 4. **рдХреЙрдиреНрдлрд╝рд┐рдЧ-рдЪрд╛рд▓рд┐рдд рд░реВрдЯрд┐рдВрдЧ** тАФ рдкреНрд░рддрд┐-рдЯреВрд▓ рдиреАрддрд┐рдпрд╛рдБ (`ai`/`human`/`never`) рдФрд░ regex рдЬреЛрдЦрд┐рдо рдирд┐рдпрдо, рд╕рдм cordis.yml рд╕реЗ рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред 5. **рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдХрд╛рд░рдг рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ** тАФ рд╕рдореАрдХреНрд╖рдХ рдХрд╛ рдХрд╛рд░рдг рдЕрд╕реНрд╡реАрдХреГрдд рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (callId-рд▓рд┐рдВрдХреНрдб); fallback рдФрд░ `never`-рдиреАрддрд┐ рдЕрд╕реНрд╡реАрдХреГрддрд┐рдпрд╛рдБ рднреА рдСрдбрд┐рдЯ-рдпреЛрдЧреНрдп рдорд╛рд░реНрдХрд░ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреА рд╣реИрдВ (`[auto-review]` / `[auto-review-fallback]` / `[auto-review-never]`)ред 6. **рдкреВрд░реНрдг рдСрдбрд┐рдЯ рдЯреНрд░реЗрд▓** тАФ рдХреЗрд╡рд▓-рд▓реЙрдЧ `autoReview/verdict` + `autoReview/rejection` рд╕рддреНрд░ рдШрдЯрдирд╛рдПрдБ (рд▓рд┐рдлрд╝рд╛рдлрд╝рд╛ `ignorable: true`) рдФрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ invariant рд╕рд╛рдереА рдЬреЛ рдорд╛рд░реНрдХрд░ тЯ║ рдШрдЯрдирд╛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред 7. **рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдВрддреНрд░рдг** тАФ рдЕрд╕реНрд╡реАрдХреГрддрд┐ рд╕рд░реНрдХрд┐рдЯ рдмреНрд░реЗрдХрд░ (3 рд▓рдЧрд╛рддрд╛рд░ рдЕрд╕реНрд╡реАрдХреГрддрд┐рдпрд╛рдБ, рдпрд╛ рдЕрдВрддрд┐рдо 10 рдирд┐рд░реНрдгрдпреЛрдВ рдореЗрдВ рд╕реЗ 6, рдкреНрд░рддрд┐ рдЯрд░реНрди), рдПрдХ рдЬреЛрдЦрд┐рдо-рд╕реНрддрд░ рдиреАрддрд┐, рдПрдХ-рдмрд╛рд░ рдХрд╛ `/auto-review approve` рдУрд╡рд░рд░рд╛рдЗрдб, рдФрд░ рдПрдХ `never`-рдиреАрддрд┐ рдХрдареЛрд░ рдЕрдХреНрд╖рдорддрд╛ рдЬреЛ рдореЙрдбрд▓ рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдордЭрд╛рддреА рд╣реИред 8. **рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдореАрдХреНрд╖рдХ рд╕рдВрджрд░реНрдн** тАФ рдПрдХ рд╕реАрдорд┐рдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ (`contextBudget`) рдФрд░ рдПрдХ Codex-рд╢реИрд▓реА Markdown рдирд┐рд░реНрдгрдп-рдиреАрддрд┐ (`reviewerPolicyText`)ред рд╣рд░ рдирд┐рд░реНрдгрдп рд╕рддреНрд░ рд▓реЙрдЧ рд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд┐рдд рд╣реЛрддрд╛ рд╣реИ: `approval/asked` тЖТ `autoReview/verdict` (рдпрд╛ `autoReview/rejection`) тЖТ `approval/decided`ред ## рдирд┐рдпрдореЛрдВ рдХреЗ рдмрдЬрд╛рдп рджреВрд╕рд░рд╛ рдореЙрдбрд▓ рдХреНрдпреЛрдВ? рдкреИрдЯрд░реНрди-рдЖрдзрд╛рд░рд┐рдд рд╕реНрд╡рддрдГ-рдЕрдиреБрдореЛрджрдХ рдкреНрд░реЗрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ, рдмрд┐рдирд╛ рд╕рд╛рдХреНрд╖реНрдп рдХреЗ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред `dsh-auto-review` рдирд┐рд░реНрдгрдп рдПрдХ **рд╕рдореАрдХреНрд╖рдХ рдЙрдк-рдПрдЬреЗрдВрдЯ** рдХреЛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд░реНрдХрд╕реНрдкреЗрд╕ (рдЕрдкрдиреЗ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдЯреВрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЬрд╝рд░рд┐рдП), рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдХрд┐рдП рдЧрдП рдЯреВрд▓-рдХреЙрд▓ рддрд░реНрдХ (рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдорд╛рди рд╕рдВрд╢реЛрдзрд┐рдд), рдЕрдиреБрд░реЛрдз рдХрд╛ рдХрд╛рд░рдг рдФрд░ рдЖрдкрдХреЗ рдЬреЛрдЦрд┐рдо рдирд┐рдпрдо рдкрдврд╝рддрд╛ рд╣реИ тАФ рдлрд┐рд░ рд╕рдВрд░рдЪрд┐рдд рдирд┐рд░реНрдгрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдирд┐рд░реНрдгрдп рдЕрдкрдирд╛ **рдХрд╛рд░рдг рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдХреЛ рд▓реМрдЯрд╛ рджреЗрддрд╛ рд╣реИ**, рддрд╛рдХрд┐ рдПрдЬреЗрдВрдЯ рдЕрдВрдзрд╛рдзреБрдВрдз рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд╛рд░рдг рд╕реАрдЦреЗред ## рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд ```sh # 1. рдЕрдкрдиреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрдВрдбрд▓ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ dsh plugin --profile web add "github:PerryLink/dsh-auto-review#main" # рдпрд╛ npm рд╕реЗ (рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд▓реАрдЬрд╝) dsh plugin --profile web add dsh-auto-review # 2. рдкреБрдирдГ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ рдФрд░ рдкрдВрдХреНрддрд┐ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ dsh --profile web --dump-config | grep -A4 'id: auto-review' ``` рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╢рд┐рдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреИрдЪ `bash` рдФрд░ `write` рдХреА AI рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ; рдмрд╛рдХреА рд╕рднреА рдЯреВрд▓ (`edit` тАФ рдЗрди-рдкреНрд▓реЗрд╕ рд╕рдВрд╢реЛрдзрди тАФ рд╕рд╣рд┐рдд) рдорд╛рдирд╡ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕реМрдВрдк рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд▓реВрдк рдореЗрдВ рдмрд┐рдирд╛ рдорд╛рдирд╡ рдХреЗ рдЗрди-рдкреНрд▓реЗрд╕ рд╕рдВрдкрд╛рджрди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ `edit: ai` рдЬреЛрдбрд╝реЗрдВред ## рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ - **git рдЪреИрдирд▓** (рдирд╡реАрдирддрдо `main`): `dsh plugin --profile web add "github:PerryLink/dsh-auto-review#main"` тАФ рдкреГрдердХ `prepare` рдмрд┐рд▓реНрдб рдХреЛ рд╡рд╣ рдПрдХрд▓ `allowBuilds: { esbuild: true }` рдХреБрдВрдЬреА рдЪрд╛рд╣рд┐рдП рдЬреЛ `dsh` CLI `dsh-auto-review` рдХреЗ рд▓рд┐рдП рдЫрд╛рдкрддрд╛ рд╣реИред - **npm рдЪреИрдирд▓** (рдкреНрд░рдХрд╛рд╢рд┐рдд рд░рд┐рд▓реАрдЬрд╝): `dsh plugin --profile web add dsh-auto-review`ред - **tarball рдЪреИрдирд▓**: рдЗрд╕ рд░реЗрдкреЛ рдореЗрдВ `pnpm pack`, рдлрд┐рд░ `dsh plugin --profile web add ./dsh-auto-review-.tgz`ред - **рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓**: `dsh plugin --profile web remove dsh-auto-review` (рдпрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреИрдЪ рд╕реЗ рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛рдПрдБ)ред ## рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рднреА рдЯреНрдпреВрдиреЗрдмрд▓ Schemastery `Config` рдлрд╝реАрд▓реНрдб рд╣реИрдВ (cordis.yml рд╕реЗ рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред id-рд▓рдХреНрд╖рд┐рдд рдУрд╡рд░рд░рд╛рдЗрдб рдкреВрд░реА рдкрдВрдХреНрддрд┐ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ тАФ рд╣рд░ рдЬрд╝рд░реВрд░реА рдХреБрдВрдЬреА рджреЛрдмрд╛рд░рд╛ рд▓рд┐рдЦреЗрдВред | рдХреБрдВрдЬреА | рдбрд┐рдлрд╝реЙрд▓реНрдЯ | рдЕрд░реНрде | |---|---|---| | `enableByDefault` | `true` | рд╕рддреНрд░ auto-review рд╕рдХреНрд╖рдо рд╣реЛрдХрд░ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ; `/auto-review on\|off` рдПрдХ рдЯрд┐рдХрд╛рдК рдУрд╡рд░рд░рд╛рдЗрдб рд▓рд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдкрд░ рднрд╛рд░реА рдкрдбрд╝рддрд╛ рд╣реИ | | `toolsPolicy.default` | `human` | рдЕрд╕реВрдЪреАрдмрджреНрдз рдЯреВрд▓ рдХреА рдиреАрддрд┐ (рдорд╛рдирд╡ answerer рдХреЛ рд╕реМрдВрдкрдирд╛) | | `toolsPolicy.overrides` | `{}` | рдкреНрд░рддрд┐-рдЯреВрд▓ рдиреАрддрд┐: `ai` / `human` / `never` | | `riskRules` | `[]` | рдЯреВрд▓ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдкрд╣рд▓реЗ рдорд┐рд▓рд╛рдпрд╛ рдЧрдпрд╛ `{pattern, policy, field?}`; `field` рдЪреБрдирддрд╛ рд╣реИ `reason` (рдбрд┐рдлрд╝реЙрд▓реНрдЯ), `toolName` рдпрд╛ `arguments` | | `reviewerProvider` | `fork` | рд╕рдореАрдХреНрд╖рдХ рдХрд╛ рдЙрдк-рдПрдЬреЗрдВрдЯ рдкреНрд░рджрд╛рддрд╛ (рдЗрди-рдкреНрд░реЛрд╕реЗрд╕ fork рдмреИрдХрдПрдВрдб) | | `reviewerModel` | *(рд╡рд┐рд░рд╛рд╕рдд)* | рд╕рдореАрдХреНрд╖рдХ рдореЙрдбрд▓ id; рдЦрд╛рд▓реА рд╣реЛрдиреЗ рдкрд░ рд╕рддреНрд░ рдПрдЬреЗрдВрдЯ рдХрд╛ рдорд╛рд░реНрдЧ рд▓реЗрддрд╛ рд╣реИ | | `reviewerTimeoutMs` | `60000` | рдирд┐рд░реНрдгрдп рдХреА рд╕рдордп-рд╕реАрдорд╛; рд╕рдорд╛рдкреНрддрд┐ рдкрд░ fallback рдиреАрддрд┐ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ | | `reviewerTools` | `[read, glob, grep]` | рд╕рдореАрдХреНрд╖рдХ рдЪрд╛рдЗрд▓реНрдб рдХреА рдЯреВрд▓ рдЕрдиреБрдорддрд┐-рд╕реВрдЪреА (рдЧреИрд░-рд░рд┐рдХреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП) | | `fallbackPolicy` | `rejected` | рд╕рдореАрдХреНрд╖рдХ рд╡рд┐рдлрд▓рддрд╛: `rejected` (рд╡рд┐рдлрд▓-рдмрдВрдж) / `delegate` / `allow-once` | | `maxReviewsPerTurn` | `10` | рдкреНрд░рддрд┐ рдЦреБрд▓реЗ рдЯрд░реНрди рд╡рд╛рд╕реНрддрд╡рд┐рдХ AI-рдирд┐рд░реНрдгрдп рдмрдЬрдЯ; рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдкрд░ рдЕрдиреБрд░реЛрдз рд╕реМрдВрдк рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ | | `maxFailuresPerTurn` | `10` | рдкреНрд░рддрд┐ рдЦреБрд▓реЗ рдЯрд░реНрди рд╕рдореАрдХреНрд╖рдХ-рд╡рд┐рдлрд▓рддрд╛ рдмрдЬрдЯ | | `reasonMaxChars` | `2000` | рд╕рдореАрдХреНрд╖рдХ рдХрд╛рд░рдгреЛрдВ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рддрд░реНрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреА рд╕реАрдорд╛ | | `reviewerGuidance` | *(рдХреЛрдИ рдирд╣реАрдВ)* | рд╕рдореАрдХреНрд╖рдХ рдкреНрд░реЙрдореНрдкреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рд▓рд╛рд╣рдХрд╛рд░ рдорд╛рд░реНрдЧрджрд░реНрд╢рди | | `reviewerPolicyText` | *(рдХреЛрдИ рдирд╣реАрдВ)* | рд╕рдореАрдХреНрд╖рдХ рдкреНрд░реЙрдореНрдкреНрдЯ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХреА рдЧрдИ Markdown рдирд┐рд░реНрдгрдп-рдиреАрддрд┐ (Codex рд╢реИрд▓реА) | | `denyGuidance` | *(рдкрд░рд┐рд╣рд╛рд░-рд╡рд┐рд░реЛрдзреА рдкрд╛рда)* | рд╣рд░ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдХрд╛рд░рдг рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рди | | `contextBudget` | `{turns: 0, maxChars: 4000}` | рд╕рдореАрдХреНрд╖рдХ рдкреНрд░реЙрдореНрдкреНрдЯ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ рдмрдЬрдЯ; `turns: 0` рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ | | `riskPolicy` | `{maxAutoAllow: high, onHighRisk: delegate}` | `maxAutoAllow` рд╕реЗ рдКрдкрд░ рдХреЗ `allow` рдирд┐рд░реНрдгрдп рд╕реМрдВрдкрддреЗ рдпрд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ | | `circuitBreaker` | `{consecutiveDenies: 3, windowDenies: 6, windowSize: 10, action: delegate}` | рдЕрд╕реНрд╡реАрдХреГрддрд┐ рд╕рд░реНрдХрд┐рдЯ рдмреНрд░реЗрдХрд░ | | `overrideTtlMs` | `300000` | `/auto-review approve` рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рддрдиреА рджреЗрд░ рдЙрдкрдпреЛрдЧреА рд░рд╣рддрд╛ рд╣реИ | | `language` | `en` | `/auto-review` рдХрдорд╛рдВрдб рдЖрдЙрдЯрдкреБрдЯ рдХреА UI рднрд╛рд╖рд╛ (`en` \| `zh`) | | `allowUnmarkedAudit` | `false` | `ignorable` рдорд╛рд░реНрдХрд░ рдЫреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рд╣реЛрд╕реНрдЯ рдкрд░ рд╕рддреНрд░-рд▓реЙрдЧ рдСрдбрд┐рдЯ рдмрд▓рдкреВрд░реНрд╡рдХ рдЪрд╛рд▓реВ рдХрд░реЗрдВ (рдЦрддрд░рдирд╛рдХ: рдмрд┐рдирд╛ рдорд╛рд░реНрдХрд░ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдПрдБ рдЕрдиреНрдп рд╣реЛрд╕реНрдЯ рдкрд░ рд╕рддреНрд░ рдЕрдкреНрд░рд╛рдкреНрдп рдмрдирд╛рддреА рд╣реИрдВ); рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд╣рдЪрд╛рди-рдФрд░-рдбрд┐рдЧреНрд░реЗрдб рд╣реИ | рдЙрджрд╛рд╣рд░рдг (рдЯрд┐рдкреНрдкрдгреА-рдпреБрдХреНрдд рдкреВрд░реНрдг рд░реВрдк: `fixtures/config/config-full.yaml`): ```yaml - insert: - id: auto-review name: dsh-auto-review config: toolsPolicy: overrides: { bash: ai, write: ai } riskRules: - pattern: '(?i)(rm\s+(-[a-z]+\s+)*/|git\s+push\s+--force)' policy: never - pattern: 'write' policy: never field: toolName reviewerTimeoutMs: 30000 fallbackPolicy: delegate riskPolicy: { maxAutoAllow: medium, onHighRisk: delegate } circuitBreaker: { consecutiveDenies: 3, windowDenies: 6, windowSize: 10, action: delegate } ``` ## рдЙрдкрдХрд░рдг рдФрд░ рд╕рддрд╣реЗрдВ | рд╕рддрд╣ | рдкреНрд░рдХрд╛рд░ | рдиреЛрдЯреНрд╕ | |---|---|---| | `auto-review` | answerer | `approval/request` рдХреИрд╕реНрдХреЗрдб answerer тАФ `ai`-рдиреАрддрд┐ рдЕрдиреБрд░реЛрдз рдЕрдкрдирд╛рддрд╛ рд╣реИ, рдмрд╛рдХреА `next()` рд╕реЗ рд╕реМрдВрдкрддрд╛ рд╣реИ | | `/auto-review` | рдХрдорд╛рдВрдб | `on\|off\|status\|approve [n]` тАФ рдЯрд┐рдХрд╛рдК рдкреНрд░рддрд┐-рд╕рддреНрд░ рдУрд╡рд░рд░рд╛рдЗрдб, рдмрдЬрдЯ рдФрд░ рд╕рдВрдЪрдпреА рдЖрдБрдХрдбрд╝реЗ | | рдЕрд╕реНрд╡реАрдХреГрддрд┐-рдХрд╛рд░рдг рдЗрдВрдЬреЗрдХреНрд╢рди | рд╢реНрд░реЛрддрд╛ | `tools/post-execute` тАФ рдирд┐рд░реНрдгрдп / fallback / `never` рдХрд╛рд░рдг рдЕрд╕реНрд╡реАрдХреГрдд рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд▓реМрдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ | | `autoReview` | рд╕рддреНрд░ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди | рдХреЗрд╡рд▓-рд▓реЙрдЧ `autoReview/*` рдШрдЯрдирд╛рдУрдВ рд╕реЗ рдореЛрдбрд╝рд╛ рдЧрдпрд╛ | | рд╡реЗрдм рд╕рдореАрдХреНрд╖рд╛ рдкреИрдирд▓ | рдХреНрд▓рд╛рдЗрдВрдЯ | рд╕рддреНрд░-рд╢реАрд░реНрд╖рдХ рдХреНрд░рд┐рдпрд╛: рд╕реНрд╡рд┐рдЪ, рдмрдЬрдЯ, рдЖрдБрдХрдбрд╝реЗ, рд╣рд╛рд▓ рдХреЗ рдирд┐рд░реНрдгрдп, рдПрдХ-рдмрд╛рд░ рд╕реНрд╡реАрдХреГрддрд┐ | | `dsh-eval` | CLI | YAML-рдЪрд╛рд▓рд┐рдд рдПрдЬреЗрдВрдЯ рдореВрд▓реНрдпрд╛рдВрдХрди рдЗрдВрдЬрди (`bin/dsh-eval.mjs`) | | invariant рд╕рд╛рдереА | invariant | `dsh-auto-review/invariant` (рд╡реИрдХрд▓реНрдкрд┐рдХ; `invariants` рд╕реЗрд╡рд╛ рдЪрд╛рд╣рд┐рдП) | ## рд╕рддреНрд░ рдХрдорд╛рдВрдб ``` /auto-review on|off|status|approve [n] ``` `on`/`off` рдЯрд┐рдХрд╛рдК `autoReview/state` рдУрд╡рд░рд░рд╛рдЗрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдореЛрдбрд╝ рдкреБрдирдГ рдкреНрд░рд╛рд░рдВрдн/рдкреБрдирдГ рдЖрд░рдВрдн рдХреЗ рдмрд╛рдж рднреА рдмрдЪрд╛ рд░рд╣рддрд╛ рд╣реИ тАФ рдкреБрдирд░реНрдкреНрд▓реЗ рд╣реА рд╕реНрдерд┐рддрд┐ рд╣реИ) рдФрд░ рдПрдХ рд╕реНрд╡рд┐рдЪ рд╕реВрдЪрдирд╛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдореЙрдбрд▓ рджреЗрдЦрддрд╛ рд╣реИ (рдПрдХ `user/message` рдШрдЯрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред `status` рдкреНрд░рднрд╛рд╡реА рд╕реНрдерд┐рддрд┐, рджреЛрдиреЛрдВ рдкреНрд░рддрд┐-рдЯрд░реНрди рдмрдЬрдЯ (AI рдирд┐рд░реНрдгрдп рдФрд░ рд╕рдореАрдХреНрд╖рдХ рд╡рд┐рдлрд▓рддрд╛рдПрдБ), рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдЯреНрд░рд┐рдк рд╣реБрдЖ рд╕рд░реНрдХрд┐рдЯ рдмреНрд░реЗрдХрд░, рдФрд░ рд╕рддреНрд░ рдХреЗ рд╕рдВрдЪрдпреА рдЖрдБрдХрдбрд╝реЗ (рдЕрдиреБрдорддрд┐рдпрд╛рдБ/рдЕрд╕реНрд╡реАрдХреГрддрд┐рдпрд╛рдБ/fallbacks/`never` рдЕрд╕реНрд╡реАрдХреГрддрд┐рдпрд╛рдБ, рдФрд╕рдд рдЕрд╡рдзрд┐, рд╣рд╛рд▓ рдХреЗ рдирд┐рд░реНрдгрдп) рдмрддрд╛рддрд╛ рд╣реИред `approve [n]` n-рд╡реЗрдВ рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рдЕрд╕реНрд╡реАрдХреГрддрд┐ (1 = рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛) рдХреЗ рд▓рд┐рдП рдПрдХрд▓-рдЙрдкрдпреЛрдЧ `autoReview/override` рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ: `overrideTtlMs` рдХреЗ рднреАрддрд░ рдЙрд╕реА рдЯреВрд▓ рдХреА рдЕрдЧрд▓реА рд╕рдореАрдХреНрд╖рд╛ рд╕рдореАрдХреНрд╖рдХ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд▓реЗрдХрд░ рдЪрд▓рддреА рд╣реИ тАФ рд╕рдореАрдХреНрд╖рдХ рдлрд┐рд░ рднреА рдирд┐рд░реНрдгрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдЙрд╕ рд╕рдореАрдХреНрд╖рд╛ рджреНрд╡рд╛рд░рд╛ рдЙрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдкрднреЛрдЧ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ## рд╡реЗрдм рд╕рдореАрдХреНрд╖рд╛ рдкреИрдирд▓ рд╡реЗрдм GUI (web рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓) рдореЗрдВ, рдкреИрдХреЗрдЬ рдПрдХ рд╕рддреНрд░-рд╢реАрд░реНрд╖рдХ рдХреНрд░рд┐рдпрд╛ (**AI Review**) рдпреЛрдЧрджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рддреНрд░ рдХреА auto-review рд╕реНрдерд┐рддрд┐ рд╡рд╛рд▓рд╛ рдПрдХ рдкреИрдирд▓ рдЦреЛрд▓рддреА рд╣реИ: on/off рдмрдЯрди рд╡рд╛рд▓рд╛ рд╕реНрд╡рд┐рдЪ (рд╡реЗ `/auto-review on|off` рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ), рджреЛрдиреЛрдВ рдкреНрд░рддрд┐-рдЯрд░реНрди рдмрдЬрдЯ, рд╕рдВрдЪрдпреА рдЖрдБрдХрдбрд╝реЗ (рдХрдареЛрд░-рдЕрдХреНрд╖рдорддрд╛ рдЕрд╕реНрд╡реАрдХреГрддрд┐рдпрд╛рдБ рд╕рд╣рд┐рдд), рд╕рд░реНрдХрд┐рдЯ рдЯреНрд░рд┐рдк, рд╣рд╛рд▓ рдХреЗ рдирд┐рд░реНрдгрдп, рдФрд░ рд╣рд╛рд▓ рдХреА рдЕрд╕реНрд╡реАрдХреГрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ-рдмрд╛рд░ **approve** рдмрдЯрди (рд╡реЗ `/auto-review approve [n]` рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ)ред рдпрд╣ рдХреИрд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ: - рд╣реЛрд╕реНрдЯ рдПрдХ `autoReview` **рд╕рддреНрд░ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди** рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ (рдХреЗрд╡рд▓-рд▓реЙрдЧ `autoReview/*` рдШрдЯрдирд╛рдУрдВ рд╕реЗ рдореЛрдбрд╝рд╛ рдЧрдпрд╛) рдФрд░ рдЙрд╕реЗ рд╕рддреНрд░-рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдЪреИрдирд▓ рдХреЗ рдЬрд╝рд░рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред - рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд╛рд▓рд╛ рдЖрдзрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдПрдХ **рдХреНрд▓рд╛рдЗрдВрдЯ рдореЙрдбреНрдпреВрд▓** рд╣реИ (`dsh.client` рдШреЛрд╖рдгрд╛ рд╕реЗ рд╕реНрд╡рддрдГ-рдЦреЛрдЬрд╛ рдЧрдпрд╛) рдЬреЛ `conversation.session.header.actions` рд╕реАрдЯ рдкрд░ рдкрдВрдЬреАрдХреГрдд рд╣реИред - рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрдЪ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ: рдкреИрдирд▓ рддрдм рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬрдм рднреА рдкреНрд▓рдЧрдЗрди рдХрд┐рд╕реА рдРрд╕реЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛ рдЬрд┐рд╕рдХрд╛ web рдмрд┐рд▓реНрдб рд╕рддреНрд░-рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (web рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХрд░рддрд╛ рд╣реИ)ред рдЙрд╕ рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛ рдкреИрдирд▓ рд╕реНрд╡рдпрдВ рдХреЛ рдЕрдиреБрдкрд▓рдмреНрдз рдмрддрд╛рддрд╛ рд╣реИ; answerer рдЕрдкреНрд░рднрд╛рд╡рд┐рдд рд░рд╣рддрд╛ рд╣реИред рдкреИрдирд▓ рдХреЗрд╡рд▓ рд╕рдВрдкреВрд░реНрдг рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдорд╛рди рдкрдврд╝рддрд╛ рд╣реИ тАФ рдЙрд╕реЗ рдХрдЪреНрдЪреА рд╕рддреНрд░ рдШрдЯрдирд╛ рдзрд╛рд░рд╛ рдХрднреА рдирд╣реАрдВ рдорд┐рд▓рддреАред ## рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ```text approval/request waterfall (answerer chain) тФВ тФМтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФ┤тФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФР тФВ dsh-auto-review answerer тФВ тФВ ┬╖ session enabled? ┬╖ policy = ai? тФВ no тФАтФА next() тФАтФАтЦ╢ human answerer (UI) тФВ ┬╖ risk rules тЖТ toolsPolicy тЖТ default тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФмтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФШ тФВ yes тЦ╝ тФМтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФР тФВ reviewer subagent (fork, one-shot)тФВ тФВ ┬╖ toolFilter: read/glob/grep тФВ тФВ ┬╖ outputSchema: {decision, тФВ тФВ reason, riskLevel} тФВ тФВ ┬╖ timeout + req.signal abort тФВ тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФмтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФШ тФВ verdict / failure (fail-closed fallback) тЦ╝ allow тЖТ allowed-once deny тЖТ rejected + reason injected into the denied tool result (callId-linked) тФВ never тЖТ rejected + [auto-review-never] feedback тФВ (hard disable, no reviewer runs) тЦ╝ audit: approval/asked тЖТ autoReview/verdict | autoReview/rejection тЖТ approval/decided (session events, log-only, invariant-checked) ``` **рд░рдЪрдирд╛ рдХреНрд░рдоред** answerer рдХреИрд╕реНрдХреЗрдб рдореЗрдВ рдЕрдкрдиреА рдкрдВрдЬреАрдХрд░рдг рд╕реНрдерд┐рддрд┐ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ: рдпрджрд┐ рдХреЛрдИ рдорд╛рдирд╡ UI answerer `auto-review` рдкрдВрдХреНрддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рд░рдЪрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдорд╛рдирд╡ рдкрд╣рд▓реЗ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╕рдореАрдХреНрд╖рдХ рдХреЗрд╡рд▓ рд╡рд╣реА рджреЗрдЦрддрд╛ рд╣реИ рдЬреЛ рдЖрдЧреЗ рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИред `dsh --profile --dump-config` рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЬрдм рдЖрдк рдЪрд╛рд╣реЗрдВ рдХрд┐ ai-рдиреАрддрд┐ рдЯреВрд▓ рдкрд╣рд▓реЗ рд╕рдореАрдХреНрд╖рдХ рдХреЛ рднреЗрдЬреЗ рдЬрд╛рдПрдБ рддреЛ `auto-review` рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдиреЗ рдорд╛рдирд╡ answerer рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд░рдЦреЗрдВред ## dsh-eval тАФ рдПрдЬреЗрдВрдЯ рдореВрд▓реНрдпрд╛рдВрдХрди рдЗрдВрдЬрди рдЕрдиреБрдореЛрджрди рд╕рдореАрдХреНрд╖рдХ рд╕реЗ рдкрд░реЗ, `dsh-auto-review` `dsh-eval` рд╢рд┐рдк рдХрд░рддрд╛ рд╣реИ: рдПрдХ YAML-рдЪрд╛рд▓рд┐рдд рдПрдЬреЗрдВрдЯ рдореВрд▓реНрдпрд╛рдВрдХрди рдордВрдЪ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реЗрдбрд▓реЗрд╕ DSH рд╕рддреНрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ (рдкреНрд░рддрд┐ рдХреЗрд╕ рдПрдХ рдкреГрдердХ рдПрдЬреЗрдВрдЯ + рдЕрд╕реНрдерд╛рдпреА рд╡рд░реНрдХрд╕реНрдкреЗрд╕, рдЖрдзрд╛рд░рднреВрдд рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЙрдореНрдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Minimal рд╡реНрдпрдХреНрддрд┐рддреНрд╡), рд╕рддреНрд░ рдШрдЯрдирд╛ рд▓реЙрдЧ рд╕реЗ рдЯреВрд▓-рдХреЙрд▓ рдЯреНрд░реЗрд╕ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрд░рдЪрд┐рдд рджрд╛рд╡реЛрдВ рддрдерд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреНрд╡рд┐рддреАрдп-рдореЙрдбрд▓ рд╕рдореАрдХреНрд╖рд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ тАФ рд╡рд╣реА рд╕рдореАрдХреНрд╖рдХ рд╕реАрдо рдЬреЛ рдЕрдиреБрдореЛрджрди answerer рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред ```yaml # eval/cases/demo.yaml (рд╕рдВрдХреНрд╖рд┐рдкреНрдд) suite: name: my-suite cases: - id: math-output input: Solve 17 ├Ч 24 and reply with only the final number, nothing else. expect: output: { contains: "408" } - id: glob-trace seedFrom: '.' input: Use the glob tool with pattern "src/**" to list the source filesтАж expect: toolCalls: [{ tool: glob, arguments: { contains: { pattern: "src" } } }] results: [{ tool: glob, contains: "index.ts" }] ``` рдЗрд╕реЗ рдЪрд▓рд╛рдПрдБ (рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдХ DeepSeek API рдХреБрдВрдЬреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП): ```sh dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports ``` CI рджреНрд╡рд╛рд░: рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд╡рд▓ рддрднреА 0 рд╕реЗ рдирд┐рдХрд▓рддреА рд╣реИ рдЬрдм рд╣рд░ рд╕реБрдЗрдЯ рдХрд╛ рд╣рд░ рдХреЗрд╕ рдкрд╛рд╕ рд╣реЛ тАФ рдЗрд╕реЗ GitHub Action рдЪрд░рдг рдореЗрдВ рдбрд╛рд▓реЗрдВ рдФрд░ рдЕрд╕рдлрд▓ рдореВрд▓реНрдпрд╛рдВрдХрди рдмрд┐рд▓реНрдб рдХреЛ рдЕрд╕рдлрд▓ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рд╣рд░ рдХреЗрд╕ `report.md`/`report.json` рдХреЗ рдкрд╛рд╕ рдПрдХ рдкреБрдирдГ-рдЪрд▓рд╛рдиреЗ рдпреЛрдЧреНрдп рд╕рддреНрд░ JSONL рдФрд░ рдПрдХ рдЯреНрд░реЗрд╕ JSON рдЫреЛрдбрд╝рддрд╛ рд╣реИ; рджрд╛рд╡рд╛ рдкрд░рд┐рдгрд╛рдо, рдЯреЛрдХрди рдЙрдкрдпреЛрдЧ рдФрд░ рд╕рдореАрдХреНрд╖рд╛ рдирд┐рд░реНрдгрдп рд╕рднреА рд░рд┐рдкреЛрд░реНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред ## рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдФрд░ рдбреЗрдЯрд╛ - **рдЕрдиреБрдорддрд┐рдпрд╛рдБ**: workshop рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ `session:append`, `approval:answer`, `subagent:spawn`, `command:register` рдФрд░ `tools:observe` рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред - **рдбреЗрдЯрд╛**: рдбрд┐рд╕реНрдХ рдкрд░ рдХреБрдЫ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛; рд░рд┐рдкреЛрд░реНрдЯ рд░рд┐рдВрдЧ рдмрдлрд╝рд░ рдореЗрдореЛрд░реА рдореЗрдВ рдФрд░ рд╕реАрдорд┐рдд рд╣реИред рдЕрдкрдиреА рдУрд░ рд╕реЗ рдХреЛрдИ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВред - **рд╕рддреНрд░ рд▓реЙрдЧ**: `autoReview/*` рдШрдЯрдирд╛рдПрдБ рд╕рдореАрдХреНрд╖рдХ рдкрд╣рдЪрд╛рди, рдирд┐рд░реНрдгрдп, рдХрд╛рд░рдг, рдЬреЛрдЦрд┐рдо рдФрд░ рдЕрд╡рдзрд┐ рд░рдЦрддреА рд╣реИрдВ тАФ рд▓рд┐рдлрд╝рд╛рдлрд╝реЗ рдХреЗ `ignorable: true` рдорд╛рд░реНрдХрд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИрдВ рддрд╛рдХрд┐ рдХреЛрдИ рднреА рдмрд┐рд▓реНрдб рд▓реЙрдЧ рд▓реЛрдб рдХрд░ рд╕рдХреЗред рдЬрд┐рди рд╣реЛрд╕реНрдЯ рдХрд╛ `Session.append` рдорд╛рд░реНрдХрд░ рд╕реЗ рдкреБрд░рд╛рдирд╛ рд╣реИ (`0.1.0-rc.7` рддрдХ рдХреА рд╣рд░ рд░рд┐рд▓реАрдЬрд╝ rc рд▓рд╛рдЗрди тАФ рдХреЛрдИ рд░рд┐рд▓реАрдЬрд╝ рдЕрднреА рдорд╛рд░реНрдХрд░ рдирд╣реАрдВ рдЫрд╛рдкрддреА) рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ append рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкрд╣рдЪрд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (peer рд╕рдВрд╕реНрдХрд░рдг рдкреВрд░реНрд╡-рдЬрд╛рдБрдЪ, рдлрд┐рд░ рд▓реМрдЯреЗ рд▓рд┐рдлрд╝рд╛рдлрд╝реЗ рдХреА рдЬрд╛рдБрдЪ) рдФрд░ рдСрдбрд┐рдЯ рдмрд┐рдирд╛ рдорд╛рд░реНрдХрд░ рд╡рд╛рд▓реЗ рдлреАрдбрдмреИрдХ рдХреЗ рд╕рд╛рде рдЗрди-рдореЗрдореЛрд░реА рдорд┐рд░рд░ рдореЗрдВ рдбрд┐рдЧреНрд░реЗрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ тАФ рд╕рддреНрд░ рд╣рд░ рдЬрдЧрд╣ рд▓реЛрдб рд╣реЛрдиреЗ рдпреЛрдЧреНрдп рд░рд╣рддреЗ рд╣реИрдВред ## рд╕реБрд░рдХреНрд╖рд╛ рд╕реАрдорд╛рдПрдБ - **рд╕рдореАрдХреНрд╖рдХ рдПрдХ рдореЙрдбрд▓ рд╣реИред** рдЙрд╕рдХреЗ рдирд┐рд░реНрдгрдп рд╕рд▓рд╛рд╣рдХрд╛рд░ рдиреАрддрд┐ рд╣реИрдВ, рд╕реБрд░рдХреНрд╖рд╛ рдХрд░реНрдиреЗрд▓ рдирд╣реАрдВ; рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП `human`/`never` рдирд┐рдпрдо рдЪреБрдиреЗрдВред - **рд╡рд┐рдлрд▓-рдмрдВрджред** рд╣рд░ рдЕрд╕рд╛рдорд╛рдиреНрдп рдорд╛рд░реНрдЧ (рдкреНрд░рджрд╛рддрд╛ рдЕрдиреБрдкрд╕реНрдерд┐рдд, рдХреНрд╖рдорддрд╛ рдЕрдВрддрд░рд╛рд▓, рдкреНрд░рд╛рд░рдВрдн рдЕрд╕реНрд╡реАрдХреГрддрд┐, рдЯрд╛рдЗрдордЖрдЙрдЯ, рдЧреИрд░-`completed` рд╕реНрдЯреЙрдк рдХрд╛рд░рдг, рдЕрдиреБрдкрд╕реНрдерд┐рдд/рд╡рд┐рдХреГрдд рдирд┐рд░реНрдгрдп, рдСрдбрд┐рдЯ-рд╕рд╣рд╕рдВрдмрдВрдз рд╡рд┐рдлрд▓рддрд╛) `fallbackPolicy` рд╕реЗ рд╣рд▓ рд╣реЛрддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ `rejected` тАФ рдФрд░ рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдореЙрдбрд▓ рдХреЛ рдПрдХ рдСрдбрд┐рдЯ-рдпреЛрдЧреНрдп рдХрд╛рд░рдг рд▓реМрдЯрд╛рддреА рд╣реИред `allow-once` рдмрд┐рдирд╛ рд╢рд░реНрдд рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; рдпрд╣ рдХреЗрд╡рд▓ рдЙрди рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдкрд░рд┐рдирд┐рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд┐рдирдХрд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЙрд╕ рдЬреЛрдЦрд┐рдо рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред - **рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдореАрдХреНрд╖рдХред** рд╕рдореАрдХреНрд╖рдХ рдХреА `toolFilter` рдЕрдиреБрдорддрд┐-рд╕реВрдЪреА (`read`/`glob`/`grep`) рд▓рд┐рдЦ, рд╕рдВрдкрд╛рджрд┐рдд, bash рдЪрд▓рд╛, рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрдпреЛрдЧ рдпрд╛ рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА (`maxDepth` = рдЙрд╕рдХреА рдЕрдкрдиреА рдЧрд╣рд░рд╛рдИ)ред рдЙрд╕рдХрд╛ рд╕рддреНрд░ рд▓реЙрдЧ рд╕реНрдерд╛рдпреА рдФрд░ рдСрдбрд┐рдЯ-рдпреЛрдЧреНрдп рд╣реИред - **рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рддрд░реНрдХ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ** (рдХреБрдВрдЬреА-рдирд╛рдо рдорд┐рд▓рд╛рди: `token`, `password`, `api_key`, `Authorization`, рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓, рдирд┐рдЬреА рдХреБрдВрдЬрд┐рдпрд╛рдБ тАж) рд╕рдореАрдХреНрд╖рдХ рдкреНрд░реЙрдореНрдкреНрдЯ рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ; рдкреНрд▓рдЧрдЗрди рд╕рдореАрдХреНрд╖рд┐рдд рддрд░реНрдХреЛрдВ рдХреЛ рдХрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ред рд╕рдВрд╢реЛрдзрди рдХреБрдВрдЬреА-рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рд╕рд╛рдордЧреНрд░реА-рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ тАФ рдЙрди рдЯреВрд▓ рдХреА AI рд╕рдореАрдХреНрд╖рд╛ рди рдХрд░реЗрдВ рдЬрд┐рдирдХреЗ рддрд░реНрдХ рдорд╛рди рдЖрдк рдХрд┐рд╕реА рдореЙрдбрд▓ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдирд╣реАрдВ рдЙрдард╛ рд╕рдХрддреЗред - **рдХрдареЛрд░ рдЕрдХреНрд╖рдорддрд╛рдПрдБ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рдордЭрд╛рддреА рд╣реИрдВред** рдПрдХ `never` рдЯреВрд▓ рдпрд╛ рдЬреЛрдЦрд┐рдо рдирд┐рдпрдо рдирд┐рд░реНрдзрд╛рд░рдХ рд░реВрдк рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдХреЗрд╡рд▓-рд▓реЙрдЧ `autoReview/rejection` рдШрдЯрдирд╛ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЕрд╕реНрд╡реАрдХреГрдд рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдПрдХ `[auto-review-never]` рдорд╛рд░реНрдХрд░ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ тАФ рдореЙрдбрд▓ рд╕реАрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреНрд░рд┐рдпрд╛ рдХрдареЛрд░ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рд╣реИ рдмрдЬрд╛рдп рдЙрд╕реЗ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ (invariant-рдЬрд╛рдБрдЪрд╛ рдЧрдпрд╛: рдорд╛рд░реНрдХрд░ тЯ║ рдШрдЯрдирд╛)ред - **рдЕрд╕реНрд╡реАрдХреГрддрд┐ рд╕рд░реНрдХрд┐рдЯ рдмреНрд░реЗрдХрд░ред** рдПрдХ рдЯрд░реНрди рдореЗрдВ рдЕрд╕реНрд╡реАрдХреГрддрд┐рдпреЛрдВ рдХреА рдПрдХ рд╢реГрдВрдЦрд▓рд╛ рдмреНрд░реЗрдХрд░ рдХреЛ рдЯреНрд░рд┐рдк рдХрд░рддреА рд╣реИ (`windowSize` рдХреЗ рднреАрддрд░ `consecutiveDenies` / `windowDenies`), рдЬреЛ рдПрдХ рдХреЗрд╡рд▓-рд▓реЙрдЧ `autoReview/circuit` рдШрдЯрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рд╣реЛрддреА рд╣реИ; рдмрд╛рдж рдХреЗ рдЕрдиреБрд░реЛрдз рдЙрд╕рдХреА `action` (`delegate` / `reject` / `abort-turn`) рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред - **рд╕рдореАрдХреНрд╖рдХ рд╕рдВрджрд░реНрдн рдкреНрд░рд╕реНрддреБрдд рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ рд╣реИред** `contextBudget` рд╕рдореАрдХреНрд╖рдХ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рд╕рддреНрд░ рд╕рд╛рдордЧреНрд░реА рдЦрд┐рд▓рд╛рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдорд╛рди-рдорд╛рд░реНрдЧ рд╕рдореАрдХреНрд╖рдХ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рд╡рд╣ рд╕рд╛рдордЧреНрд░реА рдПрдХ рд╣реА рдкреНрд░рджрд╛рддрд╛ рдХреЗ рднреАрддрд░ рд░рд╣рддреА рд╣реИ; `reviewerModel` рдХреЛ рдХрд┐рд╕реА рднрд┐рдиреНрди рдкреНрд░рджрд╛рддрд╛ рдкрд░ рддрднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдЬрдм рдЖрдк рдЙрд╕ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЙрд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реЛрдВред - **`never` рдЗрд╕ рдкрд░рдд рдкрд░ рдПрдХ-рддрд░рдлрд╝рд╛ рд╣реИред** рдПрдХ `never` рдЯреВрд▓ рдпрд╛ рдЬреЛрдЦрд┐рдо рдирд┐рдпрдо рдорд╛рдирд╡ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рджреЗрдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ тАФ рдПрдХ рд▓реЙрдХрдбрд╛рдЙрди рдирд┐рдпрдВрддреНрд░рдг, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВред ## рдЬреНрдЮрд╛рдд рд╕реАрдорд╛рдПрдБ - рд╕рдореАрдХреНрд╖рдХ рдХреЛ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ LLM рдорд╛рд░реНрдЧ рдЪрд╛рд╣рд┐рдП (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд); рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╣рд░ рд╕рдореАрдХреНрд╖рд╛ `fallbackPolicy` рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЧрд┐рд░рддреА рд╣реИ тАФ рдХрднреА рдореМрди рдЕрдиреБрдорддрд┐ рдирд╣реАрдВред - `reviewerTools` рдирд╛рдо рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП; рдЕрдЬреНрдЮрд╛рдд рдирд╛рдо рд╕рдореАрдХреНрд╖рдХ рдЪрд╛рдЗрд▓реНрдб рдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рдкрд░ рдЬрд╝реЛрд░ рд╕реЗ рд╡рд┐рдлрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ fallback рд╣реЛрддрд╛ рд╣реИред - рдЬреЛрдЦрд┐рдо рдирд┐рдпрдо рдЕрдкрдиреЗ `field` рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрд░реЛрдз рдХреЗ `reason`, `toolName` рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХреЙрд▓ `arguments` рд╕реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ; рдмрд╛рдХреА рд╢рд░реНрддреЗрдВ `toolsPolicy.overrides` рдореЗрдВ рд░рдЦреЗрдВред - `/auto-review approve` рдУрд╡рд░рд░рд╛рдЗрдб рдЙрд╕реА рдЯреВрд▓ рдХреА рдЕрдЧрд▓реА рд╕рдореАрдХреНрд╖рд╛ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рддрд╛ рд╣реИ, рдЙрд╕ рд╕рдЯреАрдХ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХреЙрд▓ рдХреЛ рдирд╣реАрдВ; рдЙрд╕реА рдЯреВрд▓ рдкрд░ рдПрдХ рднрд┐рдиреНрди рдХреНрд░рд┐рдпрд╛ рдЙрд╕реЗ рдЙрдкрднреЛрдЧ рдХрд░ рд▓реЗрддреА рд╣реИред - рдирд┐рд░реНрдгрдп рдШрдЯрдирд╛рдПрдБ рдХреЗрд╡рд▓-рд▓реЙрдЧ рд╣реИрдВ; рд╡реЗрдм рд╕рдореАрдХреНрд╖рд╛ рдкреИрдирд▓ рдореБрдбрд╝рд╛ рд╣реБрдЖ `autoReview` рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдкрдврд╝рддрд╛ рд╣реИ (рдХрдЪреНрдЪреА рдШрдЯрдирд╛ рдзрд╛рд░рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд▓рдЧрдЗрди рддрдХ рдХрднреА рдирд╣реАрдВ рдкрд╣реБрдБрдЪрддреА)ред - рдорд╛рд░реНрдХрд░ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реЛрд╕реНрдЯ рдкрд░ `autoReview/state` рдФрд░ `autoReview/verdict` рд▓рд┐рдлрд╝рд╛рдлрд╝реЗ рдХреЗ `ignorable: true` рдорд╛рд░реНрдХрд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдХреЛрдИ рднреА harness рдмрд┐рд▓реНрдб рд▓реЙрдЧ рд▓реЛрдб рдХрд░реЗ тАФ рдЬреЛ рдкрд╛рдардХ рд░реЗрдкреЛ-рдмрд╛рд╣рд░реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╡реЗ рдЙрди рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдмрд╕ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рд░рд┐рд▓реАрдЬрд╝ рдХрд┐рдП рдЧрдП rc рд╣реЛрд╕реНрдЯ (rc.1тАУrc.7) рдкрд░ runtime рдЫреВрдЯреЗ рдорд╛рд░реНрдХрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдХрд░ рдпреЗ рдШрдЯрдирд╛рдПрдБ рдХрднреА рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ (рдЗрди-рдореЗрдореЛрд░реА рдорд┐рд░рд░ рдХрдорд╛рдВрдб, рдмрдЬрдЯ, рдмреНрд░реЗрдХрд░ рдФрд░ `approve` рдХреЛ рд╕рддреНрд░ рднрд░ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ); 0.5.1 рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рджреВрд╖рд┐рдд рд╕рддреНрд░ `dsh-permission-rules` рдХреЗ `scripts/repair-session-logs.mjs` рд╕реЗ рдорд░рдореНрдордд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯ рд╕рднреА рдкрд╛рдБрдЪ `autoReview/*` рдШрдЯрдирд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ)ред - git рдЪреИрдирд▓ рдХреЛ рд╡рд╣ рдПрдХрд▓ `allowBuilds` рдХреБрдВрдЬреА рдЪрд╛рд╣рд┐рдП рдЬреЛ `dsh` CLI рд╕реНрд╡рдпрдВ `dsh-auto-review` рдХреЗ рд▓рд┐рдП рдЫрд╛рдкрддрд╛ рд╣реИред рд░реЗрдкреЛ рдЕрдкрдирд╛ `pnpm-workspace.yaml` `allowBuilds: { esbuild: true }` рдХреЗ рд╕рд╛рде рд╢рд┐рдк рдХрд░рддрд╛ рд╣реИ; `typescript` + `tsdown` рдирд┐рдпрдорд┐рдд `dependencies` рд╣реИрдВред - рд╡реИрдХрд▓реНрдкрд┐рдХ invariant рд╕рд╛рдереА рдХреЛ `invariants` рд╕реЗрд╡рд╛ рдЪрд╛рд╣рд┐рдП (agent-spine рд░рдЪрдирд╛рдПрдБ рдЬреИрд╕реЗ headless/ACP); рд╕рд╛рджрд╛ web рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╡рд╣ рдирд╣реАрдВ рджреЗрддрд╛, рдЗрд╕рд▓рд┐рдП рдкрдВрдХреНрддрд┐ рдмрдВрдбрд▓ рдкреИрдЪ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА-рдмрдВрдж рд╢рд┐рдк рд╣реЛрддреА рд╣реИред ## рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп - [Andy8647/dsh-auto-approval](https://github.com/Andy8647/dsh-auto-approval) тАФ `tools/pre-execute` рдХреИрд╕реНрдХреЗрдб рдкрд░ рдлрд╝рд╛рдЗрд▓-рд▓реЙрдЧ рдСрдбрд┐рдЯ рдХреЗ рд╕рд╛рде рджреЛ-рд╕реНрдерд┐рддрд┐ allow/deny рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛ред `dsh-auto-review` рдЬрд╛рди-рдмреВрдЭрдХрд░ рднрд┐рдиреНрди рд╣реИ: рдЖрдзрд┐рдХрд╛рд░рд┐рдХ **answerer** рд╢реНрд░реГрдВрдЦрд▓рд╛, рд╣рдореЗрд╢рд╛ рд╡рд╣реА рд╕реМрдВрдкрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕рдХрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рдВрд░рдЪрд┐рдд рдирд┐рд░реНрдгрдп рд╡рд╛рд▓рд╛ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ рджреВрд╕рд░рд╛ рдореЙрдбрд▓, рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдХрд╛рд░рдг рдореЙрдбрд▓ рдХреЛ рд▓реМрдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╕рддреНрд░-рд▓реЙрдЧ рдСрдбрд┐рдЯред - [ACP automation bridge](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/acp/acp) тАФ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ ACP-рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ-рдмрд╛рд░ рдорд╢реАрди рдирд┐рд░реНрдгрдпред `dsh-auto-review` рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ harness рдХреЗ рд▓рд┐рдП рд╕рддреНрд░- рдФрд░ рдЯреВрд▓-рдиреАрддрд┐-рджрд╛рдпрд░реЗ рд╡рд╛рд▓рд╛ рд╣реИ; рдпрд╣ рдХрднреА рдЯрд┐рдХрд╛рдК рдЕрдиреБрджрд╛рди рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рддрд╛ред ## рд╡рд┐рдХрд╛рд╕ ```sh pnpm install # node ^22.19 || >=24 pnpm run typecheck # tsc: src + tests, рд╕реНрдерд╛рдиреАрдп harness checkout рдХреЗ рд╡рд┐рд░реБрджреНрдз pnpm test # vitest: 190 рдкрд░реАрдХреНрд╖рдг, 14 рдлрд╝рд╛рдЗрд▓реЗрдВ pnpm run build # tsc рдШреЛрд╖рдгрд╛рдПрдБ + tsdown рдмрдВрдбрд▓ (lib/, рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдВрдбрд▓ рд╕рд╣рд┐рдд) pnpm run verify:self-contained pnpm pack # рдкреНрд░рдХрд╛рд╢рд┐рдд tarball ``` рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рд▓реЗрдЖрдЙрдЯ: `src/index.ts` (рдкреНрд▓рдЧрдЗрди рдЕрдиреБрдмрдВрдз) ┬╖ `src/config.ts` (Schemastery рд╕реНрдХреАрдорд╛ + рд╕рдорд╛рдзрд╛рди) ┬╖ `src/runtime.ts` (answerer, рдХрдорд╛рдВрдб, рдЕрд╕реНрд╡реАрдХреГрддрд┐-рдХрд╛рд░рдг рдЗрдВрдЬреЗрдХреНрд╢рди) ┬╖ `src/review.ts` (рд╕рдореАрдХреНрд╖рдХ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди, рдкреНрд░реЙрдореНрдкреНрдЯ, рд╕реНрд╡рдЪреНрдЫрддрд╛) ┬╖ `src/events.ts` (рд╕рддреНрд░-рдШрдЯрдирд╛ рд╢рдмреНрджрд╛рд╡рд▓реА + рдореЛрдбрд╝) ┬╖ `src/projection.ts` + `src/projection-types.ts` (`autoReview` рд╕рддреНрд░ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди) ┬╖ `src/invariant.ts` (invariant рд╕рд╛рдереА) ┬╖ `src/eval/` (dsh-eval рдЗрдВрдЬрди) ┬╖ `eval/` (рд╢рд┐рдк рдХреА рдЧрдИ рдореВрд▓реНрдпрд╛рдВрдХрди рд░рдЪрдирд╛) ┬╖ `bin/dsh-eval.mjs` (CLI рд▓реЙрдиреНрдЪрд░) ┬╖ `src/client/` (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдзрд╛) ┬╖ `test/` ┬╖ `fixtures/`ред ## рд╡рд┐рд╖рдп `deepseek-harness`, `dsh`, `dsh-plugin`, `cordis`, `approval`, `auto-review`, `second-model`, `ai-safety`, `sandbox`, `subagent` ## рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ - [@PerryLink](https://github.com/PerryLink) тАФ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдЕрдиреБрд░рдХреНрд╖рдХ: рдЕрдиреБрдореЛрджрди answerer, рд╕рдореАрдХреНрд╖рдХ рдЙрдк-рдПрдЬреЗрдВрдЯ, рдЬреЛрдЦрд┐рдо рдиреАрддрд┐ рдФрд░ рд╕рд░реНрдХрд┐рдЯ рдмреНрд░реЗрдХрд░, рд╕рддреНрд░-рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рд╕рдореАрдХреНрд╖рд╛ рдкреИрдирд▓, invariant рд╕рд╛рдереА, dsh-eval, рдФрд░ рдкрд╛рдБрдЪ-рднрд╛рд╖рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред ## PerryLink DSH рдкреНрд▓рдЧрдЗрди рдкрд░рд┐рд╡рд╛рд░ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ [PerryLink](https://github.com/PerryLink) рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░рдХреНрд╖рд┐рдд DeepSeek Harness рдкреНрд▓рдЧрдЗрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрджрд┐ рдпрд╣ рдЖрдкрдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмрд╛рдХреА рднреА рд╕рдВрднрд╡рддрдГ рдХрд░реЗрдВрдЧреЗ: | рдкреНрд▓рдЧрдЗрди | рдПрдХ-рдкрдВрдХреНрддрд┐ рд╡рд┐рд╡рд░рдг | |---|---| | [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ MCP рд░рдирдЯрд╛рдЗрдо рдкреИрдирд▓: /mcp рдХрдорд╛рдВрдб + рд╕реНрдерд┐рддрд┐, рдЯреВрд▓ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╡рд╛рд▓рд╛ Settings рдЯреИрдм | | [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ-рдЕрдиреБрд╢рд╛рд╕рди рд░рдХреНрд╖рдХ: рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рдкреВрдЫрддрд╛рдЫ, рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░, рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рд╕рдореАрдХреНрд╖рд╛ | | [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | рд╡реЗрдм UI рд╕рд╛рдЗрдбрдмрд╛рд░, рд╕рдВрджреЗрд╢ рдФрд░ рдЕрд╡рд░реЛрдзрди рдХреЗ рд╕рд╛рде рдЯрд┐рдХрд╛рдК рдкреГрд╖реНрдарднреВрдорд┐ рдЪрд╛рдЗрд▓реНрдб рдПрдЬреЗрдВрдЯ | | [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | рднрд╛рд╖рд╛ рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ LSP рдирд┐рджрд╛рди, рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ, рдкреВрд░реНрдгрддрд╛, рдХреЛрдб рдХреНрд░рд┐рдпрд╛рдПрдБ рдФрд░ рдирд╛рдо рдмрджрд▓рдирд╛ | | [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Claude Code outputStyles-рд╕рдорддреБрд▓реНрдп рд░рдирдЯрд╛рдЗрдо рд╢реИрд▓реА рдмрджрд▓рд╛рд╡ | | [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Claude Code /rewind-рд╕рдорддреБрд▓реНрдп: рд╕реНрдиреИрдкрд╢реЙрдЯ, рд╕рддреНрд░ рдлрд╝реЙрд░реНрдХ, рдПрдХ-рдмрд╛рд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ | | [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | рдСрдбрд┐рдЯ рдХреЗ рд╕рд╛рде Claude Code-рд╢реИрд▓реА рдШреЛрд╖рдгрд╛рддреНрдордХ allow/deny/ask рдЕрдиреБрдорддрд┐ рдирд┐рдпрдо | | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | рдЕрдиреБрдореЛрджрди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рджреНрд╡рд┐рддреАрдп-рдореЙрдбрд▓ рд╕реНрд╡рддрдГ-рд╕рдореАрдХреНрд╖рд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓-рдмрдВрдж | | [dsh-memento](https://github.com/PerryLink/dsh-memento) | рдЕрдиреБрдореЛрджрди-рджреНрд╡рд╛рд░рд┐рдд рдХреНрд░реЙрд╕-рд╕рддреНрд░ рдореЗрдореЛрд░реА: ctx.memory рд╕реАрдо + SQLite + рдореЗрдореЛрд░реА рдЯреВрд▓ | | [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | рд╕реБрд░рдХреНрд╖рд╛-рдСрдбрд┐рдЯ рдХреМрд╢рд▓ рдкреИрдХ: рдЧреБрдкреНрдд рд╕реНрдХреИрди, рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдЖрдкреВрд░реНрддрд┐-рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рдореАрдХреНрд╖рд╛ | | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | рдЯрд┐рдХрд╛рдК рдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╡реЗрдм рд╕рд╛рдЗрдбрдмрд╛рд░ рдореЗрдВ рд╕рддреНрд░ рдкрд┐рди рдХрд░реЗрдВ | | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | рд╡реЗрдм рдХрдВрдкреЛрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓-рд╢реИрд▓реА рдЗрдирдкреБрдЯ рдЗрддрд┐рд╣рд╛рд╕: рддреАрд░, Ctrl+R рдЦреЛрдЬ | | [dsh-github](https://github.com/PerryLink/dsh-github) | DSH рдХреЗ рд▓рд┐рдП GitHub PR/issues рдПрдХреАрдХрд░рдг, рд╣рд░ рд▓реЗрдЦрди рдЕрдиреБрдореЛрджрди-рджреНрд╡рд╛рд░рд┐рдд | | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | рдорд╛рдБрдЧ рдкрд░ рдПрдЬреЗрдВрдЯ рдХреМрд╢рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд▓рдЧрдЗрди-рд╡рд┐рдХрд╛рд╕ рдЬреНрдЮрд╛рди рдЖрдзрд╛рд░ | | [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Claude Code рд╕рддреНрд░, рдореЗрдореЛрд░реА, рдХреМрд╢рд▓ рдФрд░ CLAUDE.md рдХреЛ DSH рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ | ## рд▓рд╛рдЗрд╕реЗрдВрд╕ [Apache License 2.0](LICENSE) ┬й 2026 dsh-auto-review contributors