PerryLink/dsh-doublecheck ↗★ 47
dsh-doublecheck
Delivery quality gate for DeepSeek Harness: grill the requirements, test the implementation, prove the delivery, and gate the handoff with a deliverable/rework decision. 适合需要对需求、实现及交付物进行多维度严格审查与重构决策的团队。
Install
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:PerryLink/dsh-doublecheckREADME
Read the full README ↗Configuration
All tunables are Schemastery Config fields (changeable from cordis.yml). An id-targeted override replaces the whole row — restate every key you need. cordis.patch.yml documents each key inline; Schema defaults are the single source of tuning defaults.
| Key | Default | Meaning |
|---|---|---|
specFile | 'doublecheck-spec.md' | Workspace file for the committed spec markdown (grill row). |
reportFile | 'doublecheck-report.md' | Workspace file for the delivery report (grill row). |
reportVerify | true | Run the verification workflow by default (grill row). |
verifyProvider | 'fork' | Subagent provider for the per-dimension checkers (grill row). |
verifyMode | 'all' | all = one parallel checker per dimension; single = one combined checker (grill row). |
intensity | 'remind' | Enforcement strength of the grill, red/green, and review gates (remind / warn / block). |
enableByDefault | true | Master switch for sessions without a /doublecheck on|off record. |
language | 'en' | Injected reminder/deny/review/gate prose language (en / zh). |
guardTools | ['edit', 'write'] | Mutation tool names both gates watch. |
vagueTaskMaxChars | 200 | Longer tasks are never treated as vague. |
remindOnce | true | Inject each reminder at most once per session (durable across restarts). |
testToolNames | ['bash', 'pwsh'] | Shell tool names that can run tests. |
testCommandPatterns | (pnpm/npm/yarn/bun test, pytest, go/cargo/make test, node --test, deno test, uv run pytest) | Regexes a command must match to count as a test run. |
testFilePatterns | (test dirs, *.test.* / *.spec.*) | Regexes identifying test files — always editable, exempt from the red gate. |
modules.grill | true | Off disables the grill gate. |
modules.tdd | true | On enables the red/green evidence gates. |
modules.adversary | false | On enables the forked critic review at green. |
adversaryModel | null | Critic model route; null = main model self-reviews. |
adversaryProvider | 'fork' | Subagent provider the critic runs on. |
adversaryMaxFindings | 5 | Findings cap (1–20) injected into the session. |
adversaryTools | ['read', 'glob', 'grep'] | Critic tool allowlist; keep it read-only. |
adversaryTimeoutMs | 120000 | Hard time budget for one critic run. |
gate.enabled | true | Master switch for the gate panel and the turn-boundary red notice. |
gate.planSuggestion | true | Append the plan-mode re-check suggestion to red reports. |
gate.reportFile | 'gate-report.md' | Workspace file for the gate report. |
gate.requirements.checklist | (six spec-dimension questions) | Pluggable key-question checklist: { id, question, specDimension, required }. |
gate.requirements.minConfirmed | 6 | Minimum required questions that must pass (1..required count). |
gate.requirements.interrogateTool | 'ask_user_question' | Tool name whose calls count as interrogation evidence. |
gate.tests.requirePassingRun | true | A non-passing (or missing) latest test run is a red light. |
gate.tests.allowFailingRuns | 0 | Failing runs after the latest green allowed before red. |
gate.tests.requireCoverage | false | On requires coverage evidence in the test output. |
gate.tests.minCoveragePct | 80 | Minimum coverage percentage (0–100). |
gate.tests.evalReports.enabled | false | On folds the dsh-eval report (dsh-auto-review's eval engine) into the test evidence. |
gate.tests.evalReports.dir | '.eval-reports' | Workspace-relative directory holding the engine's report. |
gate.tests.evalReports.file | 'report.json' | Report file name inside the directory. |
gate.tests.evalReports.required | false | A missing report is a red light exactly when true (a skip otherwise). |
gate.consistency.* | provider: 'fork', model: null, tools: ['read','glob','grep'], timeoutMs: 120000, maxFindings: 5 | The local consistency reviewer's knobs (model: null = main model). |
gate.review.engine | 'auto' | auto = dsh-auto-review verdict records when present, else the local reviewer; local = always local. |
gate.review.provider | 'fork' | The local review reviewer's provider (its model/tools/timeoutMs/maxFindings match gate.consistency.*). |
Every gate.* key above is one live field: the guard row marks the whole
gate block .volatile(), so it is the row's editable settings card (the form
namespace is the row's profile entry id). The remaining keys are ordinary
composition config from the profile patch. The block is read once at load, so an
edit takes effect on the next load — gate.enabled decides whether the
turn-boundary red notice is installed at all. On a host line whose schemastery
predates .volatile() the row still mounts: the card is absent and the block
comes from the profile patch exactly as before.
Misconfiguration fails loud at load: invalid regexes, empty or duplicated name lists, out-of-range thresholds, and duplicate checklist ids throw instead of silently doing nothing. strict.patch.yml is the all-gates-block overlay that restates the guard row at intensity: block with every module on and the coverage requirement enabled.