dsh-logicprobe 0.5.6 → 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.
@@ -19,6 +19,12 @@ export type GuardNode = LeafGuard | AllGuard | AnyGuard | NotGuard;
19
19
  export interface StateSpec {
20
20
  id: string;
21
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;
22
28
  }
23
29
  export interface UpdateSpec {
24
30
  variable: string;
@@ -32,6 +38,10 @@ export interface TransitionSpec {
32
38
  /** Absent guard is the else/default branch for the same (from, event) group. */
33
39
  guard?: GuardNode;
34
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;
35
45
  }
36
46
  export interface TransitionScenarioSpec {
37
47
  from: string;
@@ -91,6 +101,18 @@ export type InvariantSpec = {
91
101
  events: string[];
92
102
  commit: string;
93
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;
94
116
  };
95
117
  export interface ResourcePairSpec {
96
118
  resource: string;
@@ -113,6 +135,8 @@ export interface LogicModelV1 {
113
135
  boundaryChecks?: BoundaryCheckSpec[];
114
136
  resourcePairs?: ResourcePairSpec[];
115
137
  idempotentEvents?: string[];
138
+ /** Events that advance the discrete clock by one tick; used by A14 deadline checks. */
139
+ tickEvents?: string[];
116
140
  /** Natural-language descriptions of states, events, and (state, event) scenarios. */
117
141
  narrative?: ModelNarrative;
118
142
  }
@@ -157,6 +181,9 @@ export interface VerificationReport {
157
181
  };
158
182
  checks: CheckResult[];
159
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[];
160
187
  }
161
188
  export interface ComparisonSummary {
162
189
  beforeModelHash: string;
@@ -187,3 +214,42 @@ export declare function validateModel(input: unknown): {
187
214
  };
188
215
  export declare function guardVariables(guard: GuardNode | undefined): string[];
189
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;
package/package.json CHANGED
@@ -1,103 +1,106 @@
1
- {
2
- "name": "dsh-logicprobe",
3
- "version": "0.5.6",
4
- "description": "Design document & plan claim verification — enumerate claims, verify against codebase facts, then escalate to state-machine verification (S1-S8/A1-A11) and data-model verification (DS/DA/DD) for behavioral claims. Supports before/after regression, idempotency/monotonic/sequence/leads-to/atomicity constraints, and concurrency risk mining. Ships a native DeepSeek Harness (dsh) bundle that injects the claim-verification gate into the first model step.",
5
- "type": "module",
6
- "main": "lib/index.js",
7
- "types": "lib/types/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./lib/types/index.d.ts",
11
- "default": "./lib/index.js"
12
- },
13
- "./cordis.patch.yml": "./cordis.patch.yml",
14
- "./package.json": "./package.json"
15
- },
16
- "files": [
17
- "lib",
18
- "src",
19
- "skills",
20
- "cordis.patch.yml"
21
- ],
22
- "dsh": {
23
- "engines": {
24
- "dsh": ">=0.1.0-rc.7"
25
- },
26
- "category": "skill",
27
- "displayName": "逻辑探针",
28
- "bundle": {
29
- "patch": "./cordis.patch.yml"
30
- },
31
- "compatibility": {
32
- "dsh": "^0.1.0-rc.7 || ^0.1.1-rc.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4",
33
- "dshReleases": {
34
- "0.1.0-rc.7": "compatible",
35
- "0.1.0-rc.8": "compatible",
36
- "0.1.1-rc.1": "compatible",
37
- "0.1.1-rc.2": "compatible",
38
- "0.1.2-alpha.2": "compatible",
39
- "0.1.2-alpha.3": "compatible",
40
- "0.1.2-alpha.4": "compatible"
41
- },
42
- "profiles": [
43
- "headless"
44
- ]
45
- }
46
- },
47
- "scripts": {
48
- "build": "tsc -p tsconfig.json",
49
- "typecheck": "tsc -p tsconfig.json --noEmit",
50
- "bump": "node scripts/bump-version.mjs",
51
- "test:engine": "npm run build && node tests/engine/run.mjs && node tests/data-engine/run.mjs && node tests/concurrency/run.mjs && node tests/apply-smoke.mjs",
52
- "test:full": "npm run build && node tests/full-suite.mjs"
53
- },
54
- "peerDependencies": {
55
- "@deepseek-ai/cordis": "^4.0.1",
56
- "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
57
- "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
58
- "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
59
- "@deepseek-ai/dsh-skill-filesystem": "^0.1.0-rc.8",
60
- "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
61
- "@deepseek-ai/schemastery": "^3.18.1"
62
- },
63
- "devDependencies": {
64
- "@deepseek-ai/cordis": "^4.0.1",
65
- "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
66
- "@deepseek-ai/dsh-cordis-host-runner": "^0.1.0-rc.8",
67
- "@deepseek-ai/dsh-home-paths": "^0.1.0-rc.8",
68
- "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
69
- "@deepseek-ai/dsh-scope": "^0.1.0-rc.6",
70
- "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
71
- "@deepseek-ai/dsh-skill": "^0.1.0-rc.6",
72
- "@deepseek-ai/dsh-skill-filesystem": "^0.1.0-rc.8",
73
- "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
74
- "@deepseek-ai/dsh-timeout": "^0.1.0-rc.6",
75
- "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
76
- "@deepseek-ai/schemastery": "^3.18.1",
77
- "@types/node": "^26.3.0",
78
- "typescript": "^7.0.2"
79
- },
80
- "author": {
81
- "name": "Amethyst Luna",
82
- "url": "https://github.com/AmethystLuna"
83
- },
84
- "license": "MIT",
85
- "repository": "https://github.com/AmethystLuna/logicprobe",
86
- "keywords": [
87
- "verification",
88
- "fact-check",
89
- "design-review",
90
- "plan-review",
91
- "state-machine",
92
- "logic-verification",
93
- "adversarial",
94
- "refactoring",
95
- "model-checking",
96
- "agentskills",
97
- "plugin",
98
- "dsh"
99
- ],
100
- "engines": {
101
- "node": ">=20"
102
- }
103
- }
1
+ {
2
+ "name": "dsh-logicprobe",
3
+ "version": "0.6.0",
4
+ "description": "Design document & plan claim verification — enumerate claims, verify against codebase facts, then escalate to state-machine verification (S1-S8/A1-A12, including budget/worst-case path-cost checks) and data-model verification (DS/DA/DD) for behavioral claims. Supports before/after regression, idempotency/monotonic/sequence/leads-to/atomicity constraints, and concurrency risk mining. Ships a native DeepSeek Harness (dsh) bundle that injects the claim-verification gate into the first model step.",
5
+ "type": "module",
6
+ "main": "lib/index.js",
7
+ "types": "lib/types/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/types/index.d.ts",
11
+ "default": "./lib/index.js"
12
+ },
13
+ "./cordis.patch.yml": "./cordis.patch.yml",
14
+ "./package.json": "./package.json"
15
+ },
16
+ "files": [
17
+ "lib",
18
+ "src",
19
+ "skills",
20
+ "cordis.patch.yml"
21
+ ],
22
+ "dsh": {
23
+ "engines": {
24
+ "dsh": ">=0.1.0-rc.7"
25
+ },
26
+ "category": "skill",
27
+ "displayName": "逻辑探针",
28
+ "bundle": {
29
+ "patch": "./cordis.patch.yml"
30
+ },
31
+ "compatibility": {
32
+ "dsh": "^0.1.0-rc.7 || ^0.1.1-rc.1 || ^0.1.2-alpha.2 || ^0.1.2-alpha.3 || ^0.1.2-alpha.4 || ^0.1.2-alpha.5 || ^0.1.2-rc.1",
33
+ "dshReleases": {
34
+ "0.1.0-rc.7": "compatible",
35
+ "0.1.0-rc.8": "compatible",
36
+ "0.1.1-rc.1": "compatible",
37
+ "0.1.1-rc.2": "compatible",
38
+ "0.1.2-alpha.2": "compatible",
39
+ "0.1.2-alpha.3": "compatible",
40
+ "0.1.2-alpha.4": "compatible",
41
+ "0.1.2-alpha.5": "compatible",
42
+ "0.1.2-rc.1": "compatible"
43
+ },
44
+ "profiles": [
45
+ "headless"
46
+ ]
47
+ }
48
+ },
49
+ "scripts": {
50
+ "build": "tsc -p tsconfig.json",
51
+ "typecheck": "tsc -p tsconfig.json --noEmit",
52
+ "bump": "node scripts/bump-version.mjs",
53
+ "test:engine": "npm run build && node tests/engine/run.mjs && node tests/data-engine/run.mjs && node tests/concurrency/run.mjs && node tests/apply-smoke.mjs && node tests/exporters/run.mjs && node tests/external/run.mjs && node tests/python/run.mjs",
54
+ "test:full": "npm run build && node tests/full-suite.mjs",
55
+ "test:python": "npm run build && node tests/python/run.mjs"
56
+ },
57
+ "peerDependencies": {
58
+ "@deepseek-ai/cordis": "^4.0.1",
59
+ "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
60
+ "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
61
+ "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
62
+ "@deepseek-ai/dsh-skill-filesystem": "^0.1.0-rc.8",
63
+ "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
64
+ "@deepseek-ai/schemastery": "^3.18.1"
65
+ },
66
+ "devDependencies": {
67
+ "@deepseek-ai/cordis": "^4.0.1",
68
+ "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
69
+ "@deepseek-ai/dsh-cordis-host-runner": "^0.1.0-rc.8",
70
+ "@deepseek-ai/dsh-home-paths": "^0.1.0-rc.8",
71
+ "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
72
+ "@deepseek-ai/dsh-scope": "^0.1.0-rc.6",
73
+ "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
74
+ "@deepseek-ai/dsh-skill": "^0.1.0-rc.6",
75
+ "@deepseek-ai/dsh-skill-filesystem": "^0.1.0-rc.8",
76
+ "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
77
+ "@deepseek-ai/dsh-timeout": "^0.1.0-rc.6",
78
+ "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
79
+ "@deepseek-ai/schemastery": "^3.18.1",
80
+ "@types/node": "^26.3.0",
81
+ "typescript": "^7.0.2"
82
+ },
83
+ "author": {
84
+ "name": "Amethyst Luna",
85
+ "url": "https://github.com/AmethystLuna"
86
+ },
87
+ "license": "MIT",
88
+ "repository": "https://github.com/AmethystLuna/logicprobe",
89
+ "keywords": [
90
+ "verification",
91
+ "fact-check",
92
+ "design-review",
93
+ "plan-review",
94
+ "state-machine",
95
+ "logic-verification",
96
+ "adversarial",
97
+ "refactoring",
98
+ "model-checking",
99
+ "agentskills",
100
+ "plugin",
101
+ "dsh"
102
+ ],
103
+ "engines": {
104
+ "node": ">=20"
105
+ }
106
+ }
@@ -44,7 +44,7 @@ This step is NOT skippable — it creates an explicit, auditable record of what
44
44
  |-------|----------|
45
45
  | LIGHTWEIGHT | All 5 checklist items (file paths, API/type names, line numbers, behavioral claims, mechanism feasibility) answered in context with explicit results per item |
46
46
  | STANDARD | Phase 1-2: enumerate every verifiable claim → verify each against codebase with evidence |
47
- | ESCALATED | Full pipeline: Phase 1-5 including Logic Primitive Verification (Phase 2a + 2b, 14 checks) |
47
+ | ESCALATED | Full pipeline: Phase 1-5 including Logic Primitive Verification (Phase 2a + 2b, 22 checks) |
48
48
 
49
49
  ### Plan Verification Block
50
50
 
@@ -131,12 +131,13 @@ When Phase 2 triggers escalation, do NOT proceed to Phase 3 until the verificati
131
131
  ```text
132
132
  Document claims → Extract model → Runtime check:
133
133
  ├── DSH + `logicprobe_verify` tool available → build Model schema v1 (references/dsh-model-schema.md) → call the tool → structured report
134
- ├── Python available → fill in references/verification-harness.py → run → report
134
+ ├── Python available + LogicModelV1 JSON at hand → references/logicprobe-engine.py verify model.json (S1-S8/A1-A14/D1-D4; subcommands compose / export add C1-C2 and UPPAAL/TLA+/PRISM/SPIN output)
135
+ ├── Python available + model only as extracted dicts → fill in references/verification-harness.py → run → report
135
136
  └── No Python → Manual Verification Mode (see references/logic-verification-guide.md#manual-verification-mode)
136
137
 
137
138
  Refactoring variant:
138
139
  Old code + Refactoring plan → Extract BEFORE model + AFTER model
139
- → Run pipeline on AFTER model (14 checks)
140
+ → Run pipeline on AFTER model (22 checks)
140
141
  → Compare BEFORE vs AFTER: behavioral preservation, regression, complexity delta
141
142
  → Flag any invariant that held in BEFORE but fails in AFTER
142
143
  ```
@@ -148,7 +149,7 @@ When the document under review is a refactoring plan (modifying existing state m
148
149
  1. **Extract the BEFORE model** from the existing codebase (not the plan — verify what the code actually does, not what the plan claims it does)
149
150
  2. **Extract the AFTER model** from the refactoring plan
150
151
  3. **Show both tables AND their model narratives** to the user side by side and confirm the delta is intentional
151
- 4. **Run Phase 2a + 2b on the AFTER model** — same 14 checks as new design
152
+ 4. **Run Phase 2a + 2b on the AFTER model** — same 22 checks as new design
152
153
  5. **Compare BEFORE vs AFTER**:
153
154
 
154
155
  | Check | Method | Severity if Violated |
@@ -171,9 +172,9 @@ When the document under review is a refactoring plan (modifying existing state m
171
172
 
172
173
  Do NOT attempt to install Python — the user's embedded development machine may be air-gapped or locked down.
173
174
 
174
- In DSH, prefer the native `logicprobe_verify` tool (model JSON, structured guard DSL, path-aware invariants) — see `references/dsh-model-schema.md`. For non-DSH hosts, the reusable Python harness is `references/verification-harness.py`. For detailed probe patterns, model extraction methodology, and manual verification procedures, load `references/logic-verification-guide.md`.
175
+ In DSH, prefer the native `logicprobe_verify` tool (model JSON, structured guard DSL, path-aware invariants) — see `references/dsh-model-schema.md`. For non-DSH hosts: when the model is already a LogicModelV1 JSON, run the standalone JSON engine `references/logicprobe-engine.py` (verify | compose | export — an exact Python mirror of the DSH tools, cross-checked byte-for-byte by tests/python/run.mjs); when the model exists only as extracted dicts, fill in the reusable template `references/verification-harness.py`. For detailed probe patterns, model extraction methodology, and manual verification procedures, load `references/logic-verification-guide.md`.
175
176
 
176
- ### Phase 2a: Structural Primitives (7 Checks)
177
+ ### Phase 2a: Structural Primitives (8 Checks)
177
178
 
178
179
  Run these FIRST. They establish basic well-formedness before adversarial probing.
179
180
 
@@ -188,7 +189,7 @@ Run these FIRST. They establish basic well-formedness before adversarial probing
188
189
  | S7 | **Invariant validity** | Does every reachable state satisfy the plan's stated "always/never/guaranteed" assertions? | Error — plan claim is false |
189
190
  | S8 | **Monotonic variables** | If a variable is declared `monotonic: inc/dec`, do all updates respect that direction? | Error — counter can move backwards |
190
191
 
191
- ### Phase 2b: Adversarial Probes (7 Attacks)
192
+ ### Phase 2b: Adversarial Probes (14 Attacks)
192
193
 
193
194
  Run these SECOND. Each probe actively tries to BREAK the model. If any probe succeeds (finds a violation), the plan has a behavior gap.
194
195
 
@@ -197,7 +198,7 @@ Run these SECOND. Each probe actively tries to BREAK the model. If any probe suc
197
198
  | A1 | **Unexpected event** | For each state S, inject every event E where no transition is defined for (S, E). Log whether the model silently ignores or crashes. | "All events are handled in all states" |
198
199
  | A2 | **Race interleaving** | For every pair of concurrent events (E1, E2), simulate arrival in both orders: E1-then-E2 vs E2-then-E1. Flag if terminal state differs. | "Behavior is independent of event ordering" |
199
200
  | A3 | **Order permutation** | For N independent events, permute arrival order. Flag if different permutations produce different final states or violate invariants. | "Outcome is order-independent" |
200
- | A4 | **Pair symmetry** | Match every `start/stop`, `lock/unlock`, `alloc/free` pair. Flag if any state allows a path where a pair is unbalanced (start without stop, lock without unlock). | "Resources are always released" |
201
+ | A4 | **Pair symmetry** | Match every `start/stop`, `lock/unlock`, `alloc/free` pair. Flag if any state allows a path where a pair is unbalanced (start without stop, lock without unlock). State `onEntry`/`onExit` actions are treated as implicit acquire/release. | "Resources are always released" |
201
202
  | A5 | **Boundary blast** | Probe counters at 0, 1, max-1, max, max+1. Probe timestamps at 0, tick_wraparound. Flag overflow, underflow, or undefined behavior. | "Handles all counter/timer values" |
202
203
  | A6 | **Resource injection** | Simulate `malloc→NULL`, `queue→full`, `semaphore→timeout` at each state that calls them. Flag if any state has no recovery path. | "Graceful degradation under resource pressure" |
203
204
  | A7 | **Minimal counter-example** | For any invariant that fails, find the SHORTEST event sequence that violates it (BFS from init to violating state). Output the exact path. | "This invariant holds" → refuted by shortest path |
@@ -205,6 +206,9 @@ Run these SECOND. Each probe actively tries to BREAK the model. If any probe suc
205
206
  | A9 | **Leads-to** | From a declared source state, every path must eventually reach the target state. | "This state always progresses to completion" |
206
207
  | A10 | **Sequence order** | Events declared in a sequence must occur in the specified order. | "backup before modify before commit" |
207
208
  | A11 | **Atomicity** | Once an atomic event starts, the machine must commit or roll back before leaving the scope or terminating. | "all-or-nothing transaction" |
209
+ | A12 | **Budget (worst-case path cost)** | With `cost` on transitions (absent = 1) and a `budget` invariant, every reachable path must stay within budget; reports the shortest over-budget counterexample and flags reachable positive-cost cycles as unbounded. | "Worst-case path cost ≤ budget" |
210
+ | A13 | **Probability reachability (DTMC)** | With `weight` on transitions (absent = 1) and a `probability` invariant, P(ever hitting the target) must satisfy the bound; solved by value iteration over the absorbing chain. | "≥ 90% of runs reach SAFE" |
211
+ | A14 | **Deadline (discrete tick clock)** | State `maxTicks` plus top-level `tickEvents`: a tick step may not keep a state resident past its deadline; reports the over-residency path. | "must leave within 2 ticks" |
208
212
 
209
213
  ### Integration Back to Phase 3
210
214
 
@@ -323,6 +327,8 @@ logicprobe does **not** prove concurrency safety. It mines documents and plans f
323
327
 
324
328
  In DSH, use the `logicprobe_concurrency_scan` tool. For manual review, follow `references/concurrency-risk-guide.md`.
325
329
 
330
+ For routing claims in dimensions logicprobe does not verify — hard real time (deadlines/periods), preemptive concurrency, hybrid control stability, probabilistic reliability, and execution-cost budgets — to dedicated tools, see `references/gap-routing-guide.md`. In `logicprobe_verify` reports, matching models carry informational `coverageNotes` with the same routing.
331
+
326
332
  ---
327
333
 
328
334
  ## Rules
@@ -52,3 +52,5 @@ Manual checklist:
52
52
  - Java: JCStress, Java PathFinder
53
53
  - General: TLA+, SPIN, Alloy
54
54
  - Rust: loom, Shuttle
55
+
56
+ Other semantic dimensions (hard real time, hybrid control, probability/reliability, execution cost) route through the same pattern — see `references/gap-routing-guide.md`.