dsh-doublecheck 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/README.es.md +259 -34
- package/README.hi.md +265 -40
- package/README.md +236 -27
- package/README.pt.md +259 -34
- package/README.zh.md +326 -115
- package/lib/domain/evidence.d.ts +4 -1
- package/lib/domain/evidence.js +7 -2
- package/lib/domain/gate.d.ts +263 -0
- package/lib/domain/gate.js +658 -0
- package/lib/domain/projection.d.ts +5 -0
- package/lib/domain/projection.js +12 -0
- package/lib/domain/vocabulary.d.ts +2 -0
- package/lib/domain/vocabulary.js +4 -0
- package/lib/events.d.ts +44 -2
- package/lib/grill/index.js +8 -1
- package/lib/guard/command.d.ts +7 -0
- package/lib/guard/command.js +28 -21
- package/lib/guard/gate.d.ts +170 -0
- package/lib/guard/gate.js +518 -0
- package/lib/guard/index.d.ts +14 -0
- package/lib/guard/index.js +93 -7
- package/lib/guard/prose.d.ts +64 -0
- package/lib/guard/prose.js +79 -0
- package/lib/guard/review.d.ts +8 -0
- package/lib/guard/review.js +20 -20
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/invariant.d.ts +2 -0
- package/lib/invariant.js +17 -3
- package/lib/types.d.ts +7 -0
- package/lib/types.js +2 -0
- package/package.json +56 -6
- package/skills/delivery-proof/SKILL.md +12 -0
- package/strict.patch.yml +70 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-doublecheck",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"description": "Delivery quality gate for DeepSeek Harness: grill the requirements, test the implementation, prove the delivery, and gate the handoff with a deliverable/rework decision.",
|
|
5
5
|
"packageManager": "pnpm@11.7.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -27,12 +27,21 @@
|
|
|
27
27
|
"types": "./lib/guard/index.d.ts",
|
|
28
28
|
"import": "./lib/guard/index.js"
|
|
29
29
|
},
|
|
30
|
+
"./invariant": {
|
|
31
|
+
"types": "./lib/invariant.d.ts",
|
|
32
|
+
"import": "./lib/invariant.js"
|
|
33
|
+
},
|
|
30
34
|
"./package.json": "./package.json"
|
|
31
35
|
},
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"sideEffects": false,
|
|
32
40
|
"files": [
|
|
33
41
|
"lib",
|
|
34
42
|
"skills",
|
|
35
43
|
"cordis.patch.yml",
|
|
44
|
+
"strict.patch.yml",
|
|
36
45
|
"CHANGELOG.md",
|
|
37
46
|
"README.md",
|
|
38
47
|
"README.zh.md",
|
|
@@ -58,7 +67,9 @@
|
|
|
58
67
|
"engineering-discipline",
|
|
59
68
|
"requirements",
|
|
60
69
|
"guard",
|
|
61
|
-
"skill"
|
|
70
|
+
"skill",
|
|
71
|
+
"quality-gate",
|
|
72
|
+
"delivery-gate"
|
|
62
73
|
],
|
|
63
74
|
"author": "PerryLink",
|
|
64
75
|
"license": "Apache-2.0",
|
|
@@ -70,6 +81,45 @@
|
|
|
70
81
|
"patch": "./cordis.patch.yml"
|
|
71
82
|
}
|
|
72
83
|
},
|
|
84
|
+
"dshWorkshop": {
|
|
85
|
+
"schema": "omdsh-workshop-package/v1",
|
|
86
|
+
"type": "plugin",
|
|
87
|
+
"integration": {
|
|
88
|
+
"protocol": "harness-profile",
|
|
89
|
+
"artifact": "cordis.patch.yml"
|
|
90
|
+
},
|
|
91
|
+
"install": {
|
|
92
|
+
"mode": "transactional",
|
|
93
|
+
"adapter": "profile-bundle",
|
|
94
|
+
"failurePolicy": "generation-rollback",
|
|
95
|
+
"touchesCurrentBeforeActivation": false
|
|
96
|
+
},
|
|
97
|
+
"lifecycle": {
|
|
98
|
+
"activation": "restart-profile",
|
|
99
|
+
"dispose": "supported"
|
|
100
|
+
},
|
|
101
|
+
"permissions": [
|
|
102
|
+
"filesystem:read",
|
|
103
|
+
"filesystem:write"
|
|
104
|
+
],
|
|
105
|
+
"compatibility": {
|
|
106
|
+
"dshVersions": [
|
|
107
|
+
"0.1.0-rc.6"
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
"capability": {
|
|
111
|
+
"id": "doublecheck",
|
|
112
|
+
"kind": "command",
|
|
113
|
+
"invocation": "send /gate status in a session with the plugin rows loaded",
|
|
114
|
+
"expected": "a reply reporting the live checklist progress (requirements/test evidence phases), the latest gate run verdict with red items, and the plan-mode state"
|
|
115
|
+
},
|
|
116
|
+
"evidence": {
|
|
117
|
+
"install": null,
|
|
118
|
+
"failureIsolation": null,
|
|
119
|
+
"hotReload": null,
|
|
120
|
+
"remove": null
|
|
121
|
+
}
|
|
122
|
+
},
|
|
73
123
|
"peerDependencies": {
|
|
74
124
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
75
125
|
"@deepseek-ai/dsh-agent": "0.1.0-rc.6",
|
|
@@ -82,7 +132,8 @@
|
|
|
82
132
|
"@deepseek-ai/schemastery": "^3.18.1"
|
|
83
133
|
},
|
|
84
134
|
"dependencies": {
|
|
85
|
-
"typescript": "^5.7.0"
|
|
135
|
+
"typescript": "^5.7.0",
|
|
136
|
+
"zod": "^4.4.3"
|
|
86
137
|
},
|
|
87
138
|
"devDependencies": {
|
|
88
139
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
@@ -103,7 +154,6 @@
|
|
|
103
154
|
"@vitest/coverage-v8": "^3.2.0",
|
|
104
155
|
"eslint": "^9.30.0",
|
|
105
156
|
"typescript-eslint": "^8.35.0",
|
|
106
|
-
"vitest": "^3.2.0"
|
|
107
|
-
"zod": "^4.4.3"
|
|
157
|
+
"vitest": "^3.2.0"
|
|
108
158
|
}
|
|
109
159
|
}
|
|
@@ -32,6 +32,18 @@ for a proof, a delivery summary, or a "what did we actually do" record.
|
|
|
32
32
|
proven and must not be described as such; `unverified` means not every
|
|
33
33
|
dimension returned a verdict.
|
|
34
34
|
|
|
35
|
+
## Passing the delivery gate
|
|
36
|
+
|
|
37
|
+
Before claiming the delivery is ready to ship, run the quality gate:
|
|
38
|
+
|
|
39
|
+
1. Run `/gate run`. It settles the four-phase checklist — requirements
|
|
40
|
+
interrogation, test evidence, implementation consistency, and the review
|
|
41
|
+
conclusion — and returns a markdown report with a binary decision:
|
|
42
|
+
**deliverable** or **rework required**.
|
|
43
|
+
2. On a rework verdict, fix the red items and re-run `/gate run`; the report
|
|
44
|
+
suggests re-opening the work in plan mode to re-check. Paste the final
|
|
45
|
+
report into the PR description when the decision is deliverable.
|
|
46
|
+
|
|
35
47
|
## Reading the verdict
|
|
36
48
|
|
|
37
49
|
- **grill / draft / red** — the discipline loop is not complete. State what
|
package/strict.patch.yml
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# dsh-doublecheck strict overlay: every discipline gate ON at `block` intensity.
|
|
2
|
+
#
|
|
3
|
+
# Apply this patch AFTER the bundle patch (later layers win by position), e.g.:
|
|
4
|
+
# dsh --profile <name> --patch ./strict.patch.yml
|
|
5
|
+
# A patch replaces the row's WHOLE config — Schema defaults are NOT re-applied
|
|
6
|
+
# on override — so every key the guard row needs is restated here. The grill
|
|
7
|
+
# row keeps its defaults and is not restated.
|
|
8
|
+
- id: doublecheck-guard
|
|
9
|
+
config:
|
|
10
|
+
intensity: block
|
|
11
|
+
modules:
|
|
12
|
+
grill: true
|
|
13
|
+
tdd: true
|
|
14
|
+
adversary: true
|
|
15
|
+
adversaryModel: null
|
|
16
|
+
adversaryProvider: fork
|
|
17
|
+
adversaryMaxFindings: 5
|
|
18
|
+
adversaryTools: ['read', 'glob', 'grep']
|
|
19
|
+
adversaryTimeoutMs: 120000
|
|
20
|
+
guardTools: ['edit', 'write']
|
|
21
|
+
vagueTaskMaxChars: 200
|
|
22
|
+
remindOnce: true
|
|
23
|
+
language: en
|
|
24
|
+
enableByDefault: true
|
|
25
|
+
testToolNames: ['bash', 'pwsh']
|
|
26
|
+
testCommandPatterns:
|
|
27
|
+
- '(?:^|[;&|]\s*)(?:(?:pnpm|npm|npx|yarn|bun)(?:\s+run)?\s+(?:test|vitest|jest|mocha)(?:\s|$))'
|
|
28
|
+
- '(?:^|[;&|]\s*)(?:(?:pytest|go\s+test|cargo\s+test|make\s+test|ctest)(?:\s|$))'
|
|
29
|
+
- '(?:^|[;&|]\s*)(?:node\s+--test(?:\s|$))'
|
|
30
|
+
- '(?:^|[;&|]\s*)(?:deno\s+test|uv\s+run\s+pytest)(?:\s|$)'
|
|
31
|
+
testFilePatterns:
|
|
32
|
+
- '(^|[\\/])(tests?|__tests__|specs?)([\\/]|$)'
|
|
33
|
+
- '\\.(test|spec)\\.[A-Za-z0-9]+$'
|
|
34
|
+
gate:
|
|
35
|
+
enabled: true
|
|
36
|
+
planSuggestion: true
|
|
37
|
+
reportFile: 'gate-report.md'
|
|
38
|
+
requirements:
|
|
39
|
+
enabled: true
|
|
40
|
+
checklist:
|
|
41
|
+
- { id: goal, question: 'What outcome must the delivery produce?', specDimension: goal, required: true }
|
|
42
|
+
- { id: scope, question: 'What is in scope, and what is out of scope?', specDimension: scope, required: true }
|
|
43
|
+
- { id: acceptance, question: 'Which observable checks prove the work is done?', specDimension: acceptanceCriteria, required: true }
|
|
44
|
+
- { id: failureModes, question: 'What can go wrong, and what is the correct behavior in each case?', specDimension: failureModes, required: true }
|
|
45
|
+
- { id: priorities, question: 'What is traded when goals conflict; what is optional?', specDimension: priorities, required: true }
|
|
46
|
+
- { id: nonGoals, question: 'What does the user explicitly not want?', specDimension: nonGoals, required: true }
|
|
47
|
+
minConfirmed: 6
|
|
48
|
+
interrogateTool: 'ask_user_question'
|
|
49
|
+
tests:
|
|
50
|
+
enabled: true
|
|
51
|
+
requirePassingRun: true
|
|
52
|
+
allowFailingRuns: 0
|
|
53
|
+
requireCoverage: true
|
|
54
|
+
minCoveragePct: 80
|
|
55
|
+
coveragePattern: 'coverage[^\\d]{0,40}(\\d+(?:\\.\\d+)?)\\s*%'
|
|
56
|
+
consistency:
|
|
57
|
+
enabled: true
|
|
58
|
+
provider: fork
|
|
59
|
+
model: null
|
|
60
|
+
tools: ['read', 'glob', 'grep']
|
|
61
|
+
timeoutMs: 120000
|
|
62
|
+
maxFindings: 5
|
|
63
|
+
review:
|
|
64
|
+
enabled: true
|
|
65
|
+
engine: auto
|
|
66
|
+
provider: fork
|
|
67
|
+
model: null
|
|
68
|
+
tools: ['read', 'glob', 'grep']
|
|
69
|
+
timeoutMs: 120000
|
|
70
|
+
maxFindings: 5
|