changingwang/dsh-stage-gate
Stage-gate governance tools: model-callable gate_open / gate_check / gate_list / gate_close for in-memory, per-session acceptance checks with PASS/BLOCK conclusions.
Listed
1
Tools
Bundle verified
Preview
What it does
Stage-gate governance tools: model-callable gate_open / gate_check / gate_list / gate_close for in-memory, per-session acceptance checks with PASS/BLOCK conclusions.
Best for
- Agents performing multi-phase work that need explicit acceptance checklists and PASS/BLOCK conclusions.
- Per-session workflows where the model should open, verify, list, and close stage gates itself.
- Teams that need lightweight governance without persisting custom events into DSH session logs.
Not ideal for
- Workflows requiring gates to survive a Harness restart; all gate state is in memory and resets.
- Non-Web profiles or DSH versions earlier than 0.1.0-rc.5.
- Compliance processes that require durable, externally enforced approvals rather than model-callable session tools.
README
dsh-stage-gate
Stage-gate governance tools for DeepSeek Harness.
Model-callable stage gates: create an acceptance checklist, verify it with evidence, and get a clear PASS / BLOCK conclusion — a governance layer for agents that run multi-phase work. State is in-memory, scoped per session.
| English | 中文 |
What it does
Registers four tools on ctx.tools:
| Tool | Purpose |
|---|---|
gate_open(gateId, title, stage?, items) |
Create a stage gate with its full acceptance checklist (status open). |
gate_check(gateId, items) |
Verify the gate: send the ENTIRE item list (whole-value replacement); each item carries met/unmet/n/a and optional evidence. The gate is blocked while any item is unmet, passed when all are met/n/a. |
gate_list() |
List every gate in the session with its lifecycle status. |
gate_close(gateId, reason?) |
Close a gate (closed). A closed gate rejects further gate_check unless allowReopen is set. |
Lifecycle
open → in_review → passed (all items met/n/a)
│ │
│ └── blocked (any item unmet) → (allowReopen) → open
└────────────────────────────→ closed (gate_close)
-
statuson the gate is the lifecycle state machine. -
conclusionon the latestgate/checkrecords the most recent verification result.
Install
dsh plugin --profile web add dsh-stage-gate
dsh web
The tools become model-visible in the Web UI. Model keys and a DeepSeek provider must already be configured (see the DeepSeek Harness Web UI guide).
Configuration
allowReopen (default true): whether a gate_check on a closed gate is accepted. When false, checking a closed gate throws Error: gate "<id>" is closed.
Override in your profile’s cordis.patch.yml:
- id: tool-stage-gate
config:
allowReopen: false
How it works
Gate state is kept in memory, scoped per agent session (gate_open /
gate_check / gate_close mutate an in-memory map keyed by session + gate id).
This package deliberately does not write custom session events
(gate/*). DeepSeek Harness’s session persistence refuses to reload a log
containing an event type outside its known-event whitelist unless the event is
marked ignorable, and Session.append has no API to set that marker. Custom
plugin events would make sessions unloadable after restart — see
docs/BUG-2026-08-17-session-log-pollution.md.
Trade-off: gate state resets when the harness restarts. This is the correct cost for an out-of-repo plugin until the harness opens a registration surface for downstream plugin events.
Development
pnpm install
pnpm test # vitest (14 tests)
pnpm typecheck # strict tsc
pnpm build # emit lib/
Compatibility
- Requires DeepSeek Harness
>=0.1.0-rc.5. - Web profile only (tools are model-facing).
- Gate state is in-memory and resets on harness restart (see How it works).
License
MIT © 2026 changingwang
Frequently Asked QuestionsFAQ
Use the verified command dsh plugin --profile default add github:changingwang/dsh-stage-gate in a DSH-enabled shell. The command resolves the public package metadata and keeps the plugin attached to the catalog identity shown on this page.
Compatibility follows the bundle and profile status shown above. If a profile is not detected, keep the plugin disabled there and check the repository documentation before enabling it in production.
The GitHub link and activity metadata are the source of truth for releases and maintenance. Revisit this page after a new release to confirm the catalog has observed the latest version.