dsh-logicprobe 0.5.5 → 0.6.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/lib/tool.js CHANGED
@@ -1,57 +1,58 @@
1
- import { defineTool } from '@deepseek-ai/dsh-tools';
2
- import { runVerification } from './engine.js';
3
- export const LOGICPROBE_VERIFY_TOOL_NAME = 'logicprobe_verify';
4
- /**
5
- * Model-visible DSH tool wrapping the bundled TypeScript verification engine.
6
- * The model passes a LogicModelV1 object; the engine validates it and returns
7
- * the 14-check report, or an 18-check report when beforeModel is supplied
8
- * (D1 behavioral preservation, D2 invariant continuity, D3 regression delta,
9
- * D4 deadlock/liveness regression). This is the dsh-native replacement for
10
- * hand-filling the Python template shipped in the skill references.
11
- */
12
- export const logicProbeVerifyTool = defineTool({
13
- name: LOGICPROBE_VERIFY_TOOL_NAME,
14
- description: 'Run executable state-machine verification (logicprobe). Takes a LogicModelV1 object with schemaVersion=1, init, states ({id, terminal?}), transitions ({from, event, to, guard?, updates?}), variables?, invariants?, concurrentPairs?, boundaryChecks?, resourcePairs?, idempotentEvents?, narrative?. Guards are structured ({variable, op, value} | {all} | {any} | {not}); invariants support never-states, var-in-range, event-before-state, leads-to, sequence, and atomicity; variables support monotonic inc/dec. The optional narrative block carries natural-language descriptions of states (narrative.states), events (narrative.events), and (state, event) scenarios (narrative.scenarios: [{from, event, scenario}]); when present it must fully cover the model and is echoed in the report. Returns a report with S1-S8 structural checks and A1-A11 adversarial probes including shortest counterexample paths. If beforeModel is provided, also runs D1-D4 before/after regression checks. See skills/logicprobe/references/dsh-model-schema.md.',
15
- parameters: {
16
- model: {
17
- type: 'json',
18
- required: true,
19
- description: 'LogicModelV1 state machine model to verify.',
20
- },
21
- maxStates: {
22
- type: 'integer',
23
- description: 'Maximum runtime states to explore. Default 10000.',
24
- },
25
- maxPermutationEvents: {
26
- type: 'integer',
27
- description: 'Maximum event count for A3 order permutation. Default 5.',
28
- },
29
- beforeModel: {
30
- type: 'json',
31
- description: 'Optional BEFORE LogicModelV1 state machine model for refactoring/migration regression comparison.',
32
- },
33
- stateMapping: {
34
- type: 'json',
35
- description: 'Optional object mapping BEFORE state ids to AFTER state ids. Omit for identity mapping (same state names).',
36
- },
37
- },
38
- output: {
39
- schema: {
40
- type: 'json',
41
- description: 'logicprobe verification report with summary and per-check findings.',
42
- },
43
- render(_args, value) {
44
- return [{ type: 'text', text: JSON.stringify(value, null, 2) }];
45
- },
46
- },
47
- timeoutMs: 10_000,
48
- isConcurrencySafe: () => true,
49
- async execute(args) {
50
- return runVerification(args.model, {
51
- maxStates: args.maxStates,
52
- maxPermutationEvents: args.maxPermutationEvents,
53
- beforeModel: args.beforeModel,
54
- stateMapping: args.stateMapping,
55
- });
56
- },
57
- });
1
+ import { defineTool } from '@deepseek-ai/dsh-tools';
2
+ import { runVerification } from './engine.js';
3
+ export const LOGICPROBE_VERIFY_TOOL_NAME = 'logicprobe_verify';
4
+ /**
5
+ * Model-visible DSH tool wrapping the bundled TypeScript verification engine.
6
+ * The model passes a LogicModelV1 object; the engine validates it and returns
7
+ * the 22-check report (S1-S8 structural, A1-A14), or a 26-check
8
+ * report when beforeModel is supplied (D1 behavioral preservation, D2
9
+ * invariant continuity, D3 regression delta, D4 deadlock/liveness regression).
10
+ * This is the dsh-native replacement for hand-filling the Python template
11
+ * shipped in the skill references.
12
+ */
13
+ export const logicProbeVerifyTool = defineTool({
14
+ name: LOGICPROBE_VERIFY_TOOL_NAME,
15
+ description: 'Run executable state-machine verification (logicprobe). Takes a LogicModelV1 object with schemaVersion=1, init, states ({id, terminal?}), transitions ({from, event, to, guard?, updates?, cost?}), variables?, invariants?, concurrentPairs?, boundaryChecks?, resourcePairs?, idempotentEvents?, narrative?. Guards are structured ({variable, op, value} | {all} | {any} | {not}); invariants support never-states, var-in-range, event-before-state, leads-to, sequence, atomicity, budget (transition cost defaults to 1; A12 checks every reachable path stays within the declared budget and reports the shortest over-budget counterexample), and probability (transition weight, default 1, makes the model a DTMC; A13 checks P(hit target) against the bound by value iteration). Variables support monotonic inc/dec. The optional narrative block carries natural-language descriptions of states (narrative.states), events (narrative.events), and (state, event) scenarios (narrative.scenarios: [{from, event, scenario}]); when present it must fully cover the model and is echoed in the report. Returns a report with S1-S8 structural checks and A1-A13 adversarial/probability probes including shortest counterexample paths. If beforeModel is provided, also runs D1-D4 before/after regression checks. See skills/logicprobe/references/dsh-model-schema.md.',
16
+ parameters: {
17
+ model: {
18
+ type: 'json',
19
+ required: true,
20
+ description: 'LogicModelV1 state machine model to verify.',
21
+ },
22
+ maxStates: {
23
+ type: 'integer',
24
+ description: 'Maximum runtime states to explore. Default 10000.',
25
+ },
26
+ maxPermutationEvents: {
27
+ type: 'integer',
28
+ description: 'Maximum event count for A3 order permutation. Default 5.',
29
+ },
30
+ beforeModel: {
31
+ type: 'json',
32
+ description: 'Optional BEFORE LogicModelV1 state machine model for refactoring/migration regression comparison.',
33
+ },
34
+ stateMapping: {
35
+ type: 'json',
36
+ description: 'Optional object mapping BEFORE state ids to AFTER state ids. Omit for identity mapping (same state names).',
37
+ },
38
+ },
39
+ output: {
40
+ schema: {
41
+ type: 'json',
42
+ description: 'logicprobe verification report with summary and per-check findings.',
43
+ },
44
+ render(_args, value) {
45
+ return [{ type: 'text', text: JSON.stringify(value, null, 2) }];
46
+ },
47
+ },
48
+ timeoutMs: 10_000,
49
+ isConcurrencySafe: () => true,
50
+ async execute(args) {
51
+ return runVerification(args.model, {
52
+ maxStates: args.maxStates,
53
+ maxPermutationEvents: args.maxPermutationEvents,
54
+ beforeModel: args.beforeModel,
55
+ stateMapping: args.stateMapping,
56
+ });
57
+ },
58
+ });
@@ -0,0 +1,6 @@
1
+ export declare const LOGICPROBE_COMPOSE_TOOL_NAME = "logicprobe_compose_verify";
2
+ /**
3
+ * DSH tool wrapping multi-machine composition verification:
4
+ * product-space reachability with rendezvous handshakes (C1 deadlock, C2 sync).
5
+ */
6
+ export declare const logicProbeComposeTool: import("@deepseek-ai/dsh-tools").ToolDefinition;
@@ -5,6 +5,8 @@ export interface ConcurrencyFinding {
5
5
  line?: number;
6
6
  snippet?: string;
7
7
  keyword: string;
8
+ /** Route to dedicated verification tools when an absolute claim is detected (logicprobe does not prove concurrency safety). */
9
+ suggestions?: string[];
8
10
  }
9
11
  export interface ConcurrencyScanReport {
10
12
  ok: boolean;
@@ -1,189 +1,255 @@
1
- export declare const ENGINE_SCHEMA_VERSION = 1;
2
- export type VarValue = number | boolean;
3
- export type GuardOp = '==' | '!=' | '<' | '<=' | '>' | '>=';
4
- export interface LeafGuard {
5
- variable: string;
6
- op: GuardOp;
7
- value: VarValue;
8
- }
9
- export interface AllGuard {
10
- all: GuardNode[];
11
- }
12
- export interface AnyGuard {
13
- any: GuardNode[];
14
- }
15
- export interface NotGuard {
16
- not: GuardNode;
17
- }
18
- export type GuardNode = LeafGuard | AllGuard | AnyGuard | NotGuard;
19
- export interface StateSpec {
20
- id: string;
21
- terminal?: boolean;
22
- }
23
- export interface UpdateSpec {
24
- variable: string;
25
- op: 'set' | 'inc' | 'dec';
26
- value?: number;
27
- }
28
- export interface TransitionSpec {
29
- from: string;
30
- event: string;
31
- to: string;
32
- /** Absent guard is the else/default branch for the same (from, event) group. */
33
- guard?: GuardNode;
34
- updates?: UpdateSpec[];
35
- }
36
- export interface TransitionScenarioSpec {
37
- from: string;
38
- event: string;
39
- /** Natural language: what this (state, event) combination represents in the real scenario. */
40
- scenario: string;
41
- }
42
- export interface ModelNarrative {
43
- /** Natural-language meaning of each state id. */
44
- states?: Record<string, string>;
45
- /** Natural-language meaning of each event id. */
46
- events?: Record<string, string>;
47
- /** Natural-language scenario for each distinct (from, event) combination. */
48
- scenarios?: TransitionScenarioSpec[];
49
- }
50
- export interface VariableSpec {
51
- name: string;
52
- kind: 'integer' | 'boolean';
53
- init: number | boolean;
54
- min?: number;
55
- max?: number;
56
- monotonic?: 'inc' | 'dec';
57
- }
58
- export type InvariantSpec = {
59
- id: string;
60
- description: string;
61
- kind: 'never-states';
62
- states: string[];
63
- } | {
64
- id: string;
65
- description: string;
66
- kind: 'var-in-range';
67
- variable: string;
68
- min?: number;
69
- max?: number;
70
- } | {
71
- id: string;
72
- description: string;
73
- kind: 'event-before-state';
74
- event: string;
75
- state: string;
76
- } | {
77
- id: string;
78
- description: string;
79
- kind: 'leads-to';
80
- from: string;
81
- to: string;
82
- } | {
83
- id: string;
84
- description: string;
85
- kind: 'sequence';
86
- events: string[];
87
- } | {
88
- id: string;
89
- description: string;
90
- kind: 'atomicity';
91
- events: string[];
92
- commit: string;
93
- rollback?: string;
94
- };
95
- export interface ResourcePairSpec {
96
- resource: string;
97
- acquireEvent: string;
98
- releaseEvent: string;
99
- failEvent?: string;
100
- }
101
- export interface BoundaryCheckSpec {
102
- variable: string;
103
- values: number[];
104
- }
105
- export interface LogicModelV1 {
106
- schemaVersion: 1;
107
- init: string;
108
- states: StateSpec[];
109
- transitions: TransitionSpec[];
110
- variables?: VariableSpec[];
111
- invariants?: InvariantSpec[];
112
- concurrentPairs?: [string, string][];
113
- boundaryChecks?: BoundaryCheckSpec[];
114
- resourcePairs?: ResourcePairSpec[];
115
- idempotentEvents?: string[];
116
- /** Natural-language descriptions of states, events, and (state, event) scenarios. */
117
- narrative?: ModelNarrative;
118
- }
119
- export interface VerificationOptions {
120
- maxStates?: number;
121
- maxPermutationEvents?: number;
122
- beforeModel?: unknown;
123
- stateMapping?: Record<string, string>;
124
- }
125
- export interface PathStep {
126
- from: string;
127
- event: string;
128
- to: string;
129
- }
130
- export interface Finding {
131
- code: string;
132
- severity: 'error' | 'warning';
133
- message: string;
134
- path?: PathStep[];
135
- evidence?: Record<string, unknown>;
136
- }
137
- export interface CheckResult {
138
- id: string;
139
- name: string;
140
- status: 'pass' | 'fail' | 'skip';
141
- detail: string;
142
- findings: Finding[];
143
- }
144
- export interface VerificationReport {
145
- ok: boolean;
146
- schemaVersion: 1;
147
- modelHash: string;
148
- /** Echo of the model's natural-language narrative, when present. */
149
- narrative?: ModelNarrative;
150
- summary: {
151
- states: number;
152
- transitions: number;
153
- errors: number;
154
- warnings: number;
155
- checksRun: number;
156
- truncated?: boolean;
157
- };
158
- checks: CheckResult[];
159
- comparison?: ComparisonSummary;
160
- }
161
- export interface ComparisonSummary {
162
- beforeModelHash: string;
163
- afterModelHash: string;
164
- stateMapping: Record<string, string>;
165
- beforeStates: number;
166
- beforeTransitions: number;
167
- afterStates: number;
168
- afterTransitions: number;
169
- addedStates: string[];
170
- removedStates: string[];
171
- addedEvents: string[];
172
- removedEvents: string[];
173
- addedTransitions: TransitionSpec[];
174
- removedTransitions: TransitionSpec[];
175
- }
176
- export interface RuntimeState {
177
- state: string;
178
- vars: Record<string, VarValue>;
179
- }
180
- export declare function modelHash(model: LogicModelV1): string;
181
- export declare function validateModel(input: unknown): {
182
- ok: true;
183
- model: LogicModelV1;
184
- } | {
185
- ok: false;
186
- errors: string[];
187
- };
188
- export declare function guardVariables(guard: GuardNode | undefined): string[];
189
- export declare function runVerification(input: unknown, options?: VerificationOptions): VerificationReport;
1
+ export declare const ENGINE_SCHEMA_VERSION = 1;
2
+ export type VarValue = number | boolean;
3
+ export type GuardOp = '==' | '!=' | '<' | '<=' | '>' | '>=';
4
+ export interface LeafGuard {
5
+ variable: string;
6
+ op: GuardOp;
7
+ value: VarValue;
8
+ }
9
+ export interface AllGuard {
10
+ all: GuardNode[];
11
+ }
12
+ export interface AnyGuard {
13
+ any: GuardNode[];
14
+ }
15
+ export interface NotGuard {
16
+ not: GuardNode;
17
+ }
18
+ export type GuardNode = LeafGuard | AllGuard | AnyGuard | NotGuard;
19
+ export interface StateSpec {
20
+ id: string;
21
+ terminal?: boolean;
22
+ /** Actions fired automatically when the state is entered. They do not change state or variables; checks such as A4 Pair Symmetry treat them as implicit acquire/release events so lock/unlock hidden inside entry actions is verified. */
23
+ onEntry?: string[];
24
+ /** Actions fired automatically when the state is left. Same semantics as onEntry. */
25
+ onExit?: string[];
26
+ /** Deadline (A14): the state must be left within this many declared tick events of entering it. */
27
+ maxTicks?: number;
28
+ }
29
+ export interface UpdateSpec {
30
+ variable: string;
31
+ op: 'set' | 'inc' | 'dec';
32
+ value?: number;
33
+ }
34
+ export interface TransitionSpec {
35
+ from: string;
36
+ event: string;
37
+ to: string;
38
+ /** Absent guard is the else/default branch for the same (from, event) group. */
39
+ guard?: GuardNode;
40
+ updates?: UpdateSpec[];
41
+ /** Execution cost of firing this transition (e.g. cycles, microseconds). Absent cost defaults to 1, so an unannotated machine keeps step-count semantics. Checked by A12 against budget invariants. */
42
+ cost?: number;
43
+ /** Relative probability weight when a probability invariant is declared (DTMC interpretation). Absent weight = 1; weight 0 means the branch never fires probabilistically. */
44
+ weight?: number;
45
+ }
46
+ export interface TransitionScenarioSpec {
47
+ from: string;
48
+ event: string;
49
+ /** Natural language: what this (state, event) combination represents in the real scenario. */
50
+ scenario: string;
51
+ }
52
+ export interface ModelNarrative {
53
+ /** Natural-language meaning of each state id. */
54
+ states?: Record<string, string>;
55
+ /** Natural-language meaning of each event id. */
56
+ events?: Record<string, string>;
57
+ /** Natural-language scenario for each distinct (from, event) combination. */
58
+ scenarios?: TransitionScenarioSpec[];
59
+ }
60
+ export interface VariableSpec {
61
+ name: string;
62
+ kind: 'integer' | 'boolean';
63
+ init: number | boolean;
64
+ min?: number;
65
+ max?: number;
66
+ monotonic?: 'inc' | 'dec';
67
+ }
68
+ export type InvariantSpec = {
69
+ id: string;
70
+ description: string;
71
+ kind: 'never-states';
72
+ states: string[];
73
+ } | {
74
+ id: string;
75
+ description: string;
76
+ kind: 'var-in-range';
77
+ variable: string;
78
+ min?: number;
79
+ max?: number;
80
+ } | {
81
+ id: string;
82
+ description: string;
83
+ kind: 'event-before-state';
84
+ event: string;
85
+ state: string;
86
+ } | {
87
+ id: string;
88
+ description: string;
89
+ kind: 'leads-to';
90
+ from: string;
91
+ to: string;
92
+ } | {
93
+ id: string;
94
+ description: string;
95
+ kind: 'sequence';
96
+ events: string[];
97
+ } | {
98
+ id: string;
99
+ description: string;
100
+ kind: 'atomicity';
101
+ events: string[];
102
+ commit: string;
103
+ rollback?: string;
104
+ } | {
105
+ id: string;
106
+ description: string;
107
+ kind: 'budget';
108
+ budget: number;
109
+ } | {
110
+ id: string;
111
+ description: string;
112
+ kind: 'probability';
113
+ target: string;
114
+ op: '>=' | '<=' | '>' | '<';
115
+ p: number;
116
+ };
117
+ export interface ResourcePairSpec {
118
+ resource: string;
119
+ acquireEvent: string;
120
+ releaseEvent: string;
121
+ failEvent?: string;
122
+ }
123
+ export interface BoundaryCheckSpec {
124
+ variable: string;
125
+ values: number[];
126
+ }
127
+ export interface LogicModelV1 {
128
+ schemaVersion: 1;
129
+ init: string;
130
+ states: StateSpec[];
131
+ transitions: TransitionSpec[];
132
+ variables?: VariableSpec[];
133
+ invariants?: InvariantSpec[];
134
+ concurrentPairs?: [string, string][];
135
+ boundaryChecks?: BoundaryCheckSpec[];
136
+ resourcePairs?: ResourcePairSpec[];
137
+ idempotentEvents?: string[];
138
+ /** Events that advance the discrete clock by one tick; used by A14 deadline checks. */
139
+ tickEvents?: string[];
140
+ /** Natural-language descriptions of states, events, and (state, event) scenarios. */
141
+ narrative?: ModelNarrative;
142
+ }
143
+ export interface VerificationOptions {
144
+ maxStates?: number;
145
+ maxPermutationEvents?: number;
146
+ beforeModel?: unknown;
147
+ stateMapping?: Record<string, string>;
148
+ }
149
+ export interface PathStep {
150
+ from: string;
151
+ event: string;
152
+ to: string;
153
+ }
154
+ export interface Finding {
155
+ code: string;
156
+ severity: 'error' | 'warning';
157
+ message: string;
158
+ path?: PathStep[];
159
+ evidence?: Record<string, unknown>;
160
+ }
161
+ export interface CheckResult {
162
+ id: string;
163
+ name: string;
164
+ status: 'pass' | 'fail' | 'skip';
165
+ detail: string;
166
+ findings: Finding[];
167
+ }
168
+ export interface VerificationReport {
169
+ ok: boolean;
170
+ schemaVersion: 1;
171
+ modelHash: string;
172
+ /** Echo of the model's natural-language narrative, when present. */
173
+ narrative?: ModelNarrative;
174
+ summary: {
175
+ states: number;
176
+ transitions: number;
177
+ errors: number;
178
+ warnings: number;
179
+ checksRun: number;
180
+ truncated?: boolean;
181
+ };
182
+ checks: CheckResult[];
183
+ comparison?: ComparisonSummary;
184
+ /** Informational notes about semantic dimensions this model references (timing, preemption)
185
+ * that this engine does not verify. Heuristic, vocabulary-based — never a substitute for the checks. */
186
+ coverageNotes?: string[];
187
+ }
188
+ export interface ComparisonSummary {
189
+ beforeModelHash: string;
190
+ afterModelHash: string;
191
+ stateMapping: Record<string, string>;
192
+ beforeStates: number;
193
+ beforeTransitions: number;
194
+ afterStates: number;
195
+ afterTransitions: number;
196
+ addedStates: string[];
197
+ removedStates: string[];
198
+ addedEvents: string[];
199
+ removedEvents: string[];
200
+ addedTransitions: TransitionSpec[];
201
+ removedTransitions: TransitionSpec[];
202
+ }
203
+ export interface RuntimeState {
204
+ state: string;
205
+ vars: Record<string, VarValue>;
206
+ }
207
+ export declare function modelHash(model: LogicModelV1): string;
208
+ export declare function validateModel(input: unknown): {
209
+ ok: true;
210
+ model: LogicModelV1;
211
+ } | {
212
+ ok: false;
213
+ errors: string[];
214
+ };
215
+ export declare function guardVariables(guard: GuardNode | undefined): string[];
216
+ export declare function runVerification(input: unknown, options?: VerificationOptions): VerificationReport;
217
+ export interface CompositionStep {
218
+ event: string;
219
+ /** Indices of the machines that advanced together on this step. */
220
+ machines: number[];
221
+ }
222
+ export interface CompositionOptions {
223
+ /** Events that require a synchronized multi-machine step (handshake). */
224
+ rendezvous?: string[];
225
+ maxStates?: number;
226
+ }
227
+ export interface CompositionSummary {
228
+ machineCount: number;
229
+ machines: Array<{
230
+ modelHash: string;
231
+ states: number;
232
+ transitions: number;
233
+ }>;
234
+ compositeStates: number;
235
+ errors: number;
236
+ warnings: number;
237
+ truncated: boolean;
238
+ }
239
+ export interface CompositionReport {
240
+ ok: boolean;
241
+ summary: CompositionSummary;
242
+ checks: CheckResult[];
243
+ }
244
+ /**
245
+ * N-machine composition semantics (documented in dsh-model-schema.md):
246
+ * - a non-rendezvous event advances exactly ONE non-terminal machine that fires it;
247
+ * - a rendezvous event (handshake) fires only when AT LEAST TWO machines declare it in
248
+ * their alphabet and EVERY such non-terminal machine has it enabled (guards held);
249
+ * all participants then advance simultaneously. A machine that is terminal, or whose
250
+ * alphabet does not include the event, does not participate;
251
+ * - a terminal machine is stopped and takes no further part.
252
+ * Checks: C1 composition deadlock (reachable node where no machine can advance while at
253
+ * least one is not terminal) and C2 rendezvous that can never fire.
254
+ */
255
+ export declare function runCompositionVerification(machinesInput: unknown[], options?: CompositionOptions): CompositionReport;
@@ -0,0 +1,7 @@
1
+ export declare const LOGICPROBE_EXPORT_TOOL_NAME = "logicprobe_export";
2
+ /**
3
+ * DSH tool wrapping the external-tool exporters: turn a LogicModelV1 machine into
4
+ * native input for the tool logicprobe routes to (UPPAAL / TLA+ / PRISM / SPIN).
5
+ * v1 translates the core machine; unrepresentable invariants become warnings.
6
+ */
7
+ export declare const logicProbeExportTool: import("@deepseek-ai/dsh-tools").ToolDefinition;
@@ -0,0 +1,17 @@
1
+ import { type LogicModelV1 } from './engine.js';
2
+ export type ExportFormat = 'uppaal' | 'tla' | 'prism' | 'spin';
3
+ export interface ExportResult {
4
+ format: ExportFormat;
5
+ primary: string;
6
+ extras?: Record<string, string>;
7
+ warnings: string[];
8
+ }
9
+ export interface ExportedModel {
10
+ model: LogicModelV1;
11
+ stateIds: string[];
12
+ indexOf: Map<string, number>;
13
+ initId: string;
14
+ stateIdOf: Map<string, string>;
15
+ }
16
+ export declare function prepareModel(input: unknown): ExportedModel;
17
+ export declare function exportModel(input: unknown, format: ExportFormat): ExportResult;
@@ -2,9 +2,10 @@ export declare const LOGICPROBE_VERIFY_TOOL_NAME = "logicprobe_verify";
2
2
  /**
3
3
  * Model-visible DSH tool wrapping the bundled TypeScript verification engine.
4
4
  * The model passes a LogicModelV1 object; the engine validates it and returns
5
- * the 14-check report, or an 18-check report when beforeModel is supplied
6
- * (D1 behavioral preservation, D2 invariant continuity, D3 regression delta,
7
- * D4 deadlock/liveness regression). This is the dsh-native replacement for
8
- * hand-filling the Python template shipped in the skill references.
5
+ * the 22-check report (S1-S8 structural, A1-A14), or a 26-check
6
+ * report when beforeModel is supplied (D1 behavioral preservation, D2
7
+ * invariant continuity, D3 regression delta, D4 deadlock/liveness regression).
8
+ * This is the dsh-native replacement for hand-filling the Python template
9
+ * shipped in the skill references.
9
10
  */
10
11
  export declare const logicProbeVerifyTool: import("@deepseek-ai/dsh-tools").ToolDefinition;