dsh-loopx-plugin
loopx-project/loopxLoopX——面向长周期 Agent 的提供商中立、本地优先状态内核与控制平面:在 DeepSeek Harness 执行层之上持久化 Goal、Todo、门禁、证据、配额、恢复与交接状态;插件负责引导安装 CLI 与技能、准入有界的同会话续跑,并为精确绑定的工作循环提供本地 GoalBar。
工程纪律守门:动笔前审讯需求,红绿测试证据门,交付后对抗评审,并汇总交付报告与逐维度核对。
npm i -g dsh1024 once, then dsh1024 plugin --profile web add dsh-doublecheck (counts toward the deepseek1024.com install ranking).The delivery quality gate for DeepSeek Harness: grill the requirements, test the implementation, prove the delivery — then gate the handoff with a deliverable/rework decision.
*Requirements get interrogated before the first edit; delivery is proven, never claimed.*
English · 简体中文 · Español · Português · हिन्दी
dsh plugin --profile <name> add dsh-doublecheck📖 Ecosystem knowledge base — measured data, not marketing: plugin development guide · plugin-selection data · maintenance criteria.
main): dsh plugin --profile web add github:PerryLink/dsh-doublecheck — the prepare script builds with production dependencies only.dsh plugin --profile web add dsh-doublecheck.pnpm pack in this repo, then dsh plugin --profile web add ./dsh-doublecheck-.tgz.dsh plugin --profile web remove dsh-doublecheck (or remove the rows from the profile patch).For a zero-configuration strict mode (every gate on at block intensity, gate coverage required), apply the shipped overlay on top of the bundle patch: dsh --profile web --patch ./node_modules/dsh-doublecheck/strict.patch.yml.
这个插件是 DSH 插件家族的一员(95 个,全部 Apache-2.0)。如果你在用,给个 star —— 它不会解锁任何功能,但会让下一个人在搜索里更容易找到它。
*English:* part of a 95 plugin family for DeepSeek Harness. If it is useful, a star helps the next person find it — nothing is gated behind it.
The delivery quality gate for DeepSeek Harness: grill the requirements, test the implementation, prove the delivery — then gate the handoff with a deliverable/rework decision.
Requirements get interrogated before the first edit; delivery is proven, never claimed.
*Workflow overview: request → policy / review → verdict. The examples below use the real command surface.*
Surface · Status Harness · DeepSeek Harness dsh-v0.2.1-rc.2 (verified 2026-10-18): engines.dsh >=0.2.1-0 =24.0.0 Platforms · All (pure host; no native code, no direct network requests of its own) Model · Any (the guard itself never calls a model; the critic and reviewer phases run as harness subagents)
dsh-doublecheck installs two plugin rows that read and enforce from the same durable session log:
grill-requirements skill plus the model-facing doublecheck_skills, doublecheck_spec, and doublecheck_report tools and the per-dimension verification workflow./doublecheck and /gate commands, the live gate settings card, and the four-phase delivery gate.Together they enforce the discipline loop — *grill → design → red → green → review → verify*:
grill ──▶ design ──▶ red ──▶ green ──▶ review ──▶ verify
│
└─ six requirement dimensions, consensus gate,
structured spec committed to the session + workspaceStage · Meaning grill · Interrogate the six requirement dimensions; refuse to implement until consensus. design · The settled spec is committed via doublecheck_spec. red · A failing test run proves the gap before implementation edits. green · A passing test run after the edits closes the loop. review · A forked adversary critic audits the delivery against the spec. verify · doublecheck_report + a per-dimension verification workflow prove the delivery.
dsh plugin --profile web add github:PerryLink/dsh-doublecheck# 1. install the bundle into your profile
dsh plugin --profile web add github:PerryLink/dsh-doublecheck
# or from npm (published releases)
dsh plugin --profile web add dsh-doublecheck
# 2. restart and verify the row
dsh --profile web --dump-config | grep -E -A3 'id: doublecheck-(grill|guard)'Both rows (doublecheck-grill and doublecheck-guard) activate automatically with the profile.
These are the plugin's real entry points; install once, then call one.
Command
~~~sh /gate run ~~~
Output
~~~text
Verdict: rework required — 2 red item(s)
The gate is red. Re-open the work in plan mode to re-check the open items before delivering.
~~~
*Observed from README.md §Example report (lines 243-251)*
Input
~~~text /doublecheck maybe ~~~
Output
~~~text Unknown /doublecheck argument "maybe". Usage: /doublecheck status|report|on|off ~~~
*Observed from plugins/dsh-doublecheck/src/guard/prose.ts:191-192; plugins/dsh-doublecheck/src/guard/command.ts:156; plugins/dsh-doublecheck/tests/command.spec.ts:201-208*
doublecheck_skillsdoublecheck_specAll 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.
Surface · Kind · Notes doublecheck_skills · tool · Lists and loads the package's four bundled skills through the skill registry seam. doublecheck_spec · tool · Commits the grilled six-dimension spec to the session log and a workspace markdown copy. doublecheck_report · tool · Folds the discipline evidence into a delivery report (optional per-dimension verification workflow). /doublecheck status\ · report\ · on\ · off · command · Switch, modules, intensity, stage facts, folded report, and the durable on/off override. /gate status\ · run\ · config · command · Live checklist progress, the settled deliverable/rework report, and the effective config. grill-requirements, red-green-tdd, delivery-review, delivery-proof · skill · Bundled discipline skills covering all six loop stages. gate · live config field · The pluggable checklist is the guard row's one .volatile() field: it is edited from the row's settings card (namespace = the row's profile entry id) and read once at load. strict.patch.yml · overlay · Every gate on at block intensity plus the coverage requirement, in one patch layer. dsh-doublecheck/invariant · companion row · Reports package-owned write-path contradictions through the host invariants registry. doublecheck · session projection · One bounded status line a client renders: stage, latest gate verdict, red-light count, edits, spec/review flags. See Reading the status line.
The doublecheck session projection is a plain string, and it is deliberately one line — the whole point is that a client can show it without cutting anything off. A chat bridge's /status, a status bar, or any custom consumer renders it as it is:
gate:rework r2 | stage:green | test:green edits:12 spec:yes review:yes | goal:ship parser fixSegment · Reads as gate: r · The latest delivery-gate verdict — none before any run, deliverable, or rework — and its red-light count r. stage: · The discipline stage reached on durable evidence: grill, design, red, green, review, verify. test: · The latest test-run color: none, red, green. edits: · Implementation edits folded from the session log (test-file writes are not counted). spec:yes / spec:no · Whether a committed doublecheck_spec exists. review:yes / review:no · Whether an adversary review record exists. goal: · The committed spec goal, clipped. Present only when spec:yes.
The line is bounded by construction, so no renderer truncates it:
9999 red lights or 99999 edits print as 9999+ / 99999+ instead of growing without bound; a non-finite or negative count prints as 0.goal: is the one lossy segment. It is flattened to a single line (newlines and control characters become spaces, | becomes /) and clipped to the budget that is left, at most 40 characters, ending in … when it was clipped. The complete goal is in /doublecheck status and the delivery report./gate status and /doublecheck status render the full state.The projection's stateVersion is 3. Bumping it discards a persisted projection-cache row written by an older version and refolds the key from the session log, so an upgraded session recomputes the line instead of showing a stale one. The persisted fold state itself is unchanged, and a pre-upgrade session never fails to load.
The delivery gate aggregates the session's durable evidence into a configurable four-phase checklist and settles one deliverable / rework required decision. Every phase folds the session log alone (replay IS the state), so a run re-derives identically after resume or fork.
Phase · Checks · Evidence source · Model cost Requirements interrogation · Key-question checklist confirmed item by item (six spec-dimension questions by default) · Committed doublecheck_spec + ask_user_question calls · none Test evidence · Latest run color, failing runs after green, optional coverage threshold, optional dsh-eval report · Shell test runs in the session log ([exit code: N], coverage percentages); the dsh-eval report file when gate.tests.evalReports.enabled · none Implementation consistency · Diff ↔ requirement mapping: every edit must serve a spec dimension · Local forked reviewer (structured findings, read-only tools) · one subagent Review conclusion · The delivery verdict; engine: auto consumes dsh-auto-review's durable verdict records when present, else the local reviewer · autoReview/verdict / autoReview/rejection events, or the local forked reviewer · one subagent (local)
Red lights are failed checks (a missing spec, a failing latest run, coverage below minimum, an unmapped edit, blocker/major findings) — each carries a rework suggestion. Warnings and skips never flip the decision. The gate integrates dsh-auto-review as a weak dependency: review.engine: auto folds its verdict records when present and degrades to the local reviewer otherwise; gate.tests.evalReports.enabled folds its eval engine's dsh-eval report (prompt-regression / stress / fairness suites) into the test evidence and skips honestly when no report exists. The gate never synthesizes approval requests.
/gate run returns this markdown — paste it into a PR description:
# Delivery gate report
> **Verdict: rework required** — 2 red item(s)
> The gate is red. Re-open the work in plan mode to re-check the open items before delivering.
## 1. Requirements interrogation — PASS
- [✔] **What outcome must the delivery produce?** — spec dimension "goal" committed
- [✔] **What is in scope, and what is out of scope?** — spec dimension "scope" committed
- [✔] **Which observable checks prove the work is done?** — spec dimension "acceptanceCriteria" committed
- [✔] **What can go wrong, and what is the correct behavior in each case?** — spec dimension "failureModes" committed
- [✔] **What is traded when goals conflict; what is optional?** — spec dimension "priorities" committed
- [✔] **What does the user explicitly not want?** — spec dimension "nonGoals" committed
## 2. Test evidence — FAIL
- [✔] **passing test run** — latest test run passed
- [✔] **failing cases after green** — 0 failing run(s) after green (allowed: 0)
- [✖] **coverage evidence** — 61% coverage below the 80% minimum — rework: raise coverage above the configured minimum
## 3. Implementation consistency — WARN
- [⚠] **[minor] src/telemetry.ts touched without a requirement** — [minor] the edit adds a metric no spec dimension covers
## 4. Review conclusion — PASS
- [✔] **dsh-auto-review conclusion** — 3 call(s) approved by dsh-auto-review (latest risk: low)
## Red items
1. **tests/coverage** — 61% coverage below the 80% minimum — *rework: raise coverage above the configured minimum*
2. **consistency/finding-1** — [minor] the edit adds a metric no spec dimension covers — *rework: src/telemetry.ts touched without a requirement*
## Audit
- review engine: dsh-auto-review
- generated at: 2026-08-14T12:00:00.000Z
- counts, ids, and verdicts only: no file contents or session text are embedded, and recognized secrets are redacted./gate run also writes a gate-report.json (the same settled state as lossless JSON, next to gate-report.md). The doublecheck-gate CLI turns that file into machine-readable output for GitHub Actions:
# JSON (PR comment / status payload)
doublecheck-gate --format json --input gate-report.json
# SARIF 2.1.0 (code-scanning upload / status check)
doublecheck-gate --format sarif < gate-report.jsonThe CLI only serializes the already-settled GateState — it never re-runs the four-phase gate or the evidence folds. Its exit code maps the verdict: 0 = deliverable, 1 = rework, 2 = usage/parse error.
tool/call / tool/result / tool/ptc-dispatch, injected user/message sources, and the foreign autoReview/* verdict records) in-process only; the optional plan-mode service state. PTC sub-dispatches carry the predecessor tool/code-dispatch label on hosts before the V3 rename; both labels fold identically. Injected notices carry the producer-owned dsh-doublecheck message-source kind; logs recorded before that kind existed arrive as plugin:dsh-doublecheck (the harness's V3→V4 migration on a released catch-all wrapper) or as the released plugin wrapper, and all three fold identically.doublecheck-spec.md, doublecheck-report.md, gate-report.md, and gate-report.json in the session workspace (paths configurable) through the ctx.fs seam; the durable doublecheck/state and doublecheck/gate session events./gate run), the optional adversary review, and the doublecheck_report verification workflow start subagent runs; nothing else calls a model or the network.filesystem:read and filesystem:write only. Gate reports carry counts, ids, and verdicts only; recognized secrets in reviewer texts are redacted before storage or display.SessionEventMap members.apply (assertions throw); a reviewer or adversary seam that cannot run settles as an honest "unavailable"/skip notice instead of a fake verdict./doublecheck on\|off → doublecheck/state and /gate run → doublecheck/gate ride the host's ignorable append surface (post-rc.6 through 0.1.1-rc.2). On hosts without that surface (rc.6/rc.8, and 0.1.2-alpha.1, which removed the envelope — 0.1.2-rc.1 restores the field for stored-log read compatibility only and still cannot stamp it), the writes are skipped and the switch stays process-local.