@cavelang/solver 0.27.14 → 0.29.1

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/Authors.md ADDED
@@ -0,0 +1,5 @@
1
+ # Authors
2
+
3
+ By adding their name to this file, all listed authors confirm they have copyright over their contributions to this project and are waiving these rights, placing their work in the public domain in accordance with the CC0 1.0 Universal Public Domain Dedication.
4
+
5
+ - Mirek Rusin (Switzerland)
package/License.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
2
2
 
3
- To the extent possible under law, the authors listed in the repository's
4
- `Authors.md` have waived all copyright and related or neighboring rights to
5
- this software and associated documentation files (the "Software").
3
+ To the extent possible under law, the authors listed in [Authors.md](./Authors.md) have waived all copyright and related or neighboring rights to this software and associated documentation files (the "Software").
6
4
 
7
- For more information, see:
5
+ For more information, please see:
8
6
  https://creativecommons.org/publicdomain/zero/1.0/
package/README.md CHANGED
@@ -6,7 +6,7 @@ resource limits; canonical model digests; result states; and linear-subset
6
6
  recognition. It does not depend on Z3, HiGHS, SQLite, or another CAVE package.
7
7
 
8
8
  ```ts
9
- import { Adapter, Model, Solve } from '@cavelang/solver'
9
+ import { Adapter, Explain, Model, Solve } from '@cavelang/solver'
10
10
 
11
11
  const model: Model.t = {
12
12
  schema: Model.schema,
@@ -93,3 +93,97 @@ only then invokes it. Results are disjoint:
93
93
  A feasible assignment returned after an optimization timeout is `unknown`,
94
94
  not `optimal`. A timeout or unsupported capability is never rendered as proof
95
95
  that the model is infeasible.
96
+
97
+ ## Provenance and explanations
98
+
99
+ Variables, constraints, soft constraints, and objectives may carry a stable
100
+ declaration URI/line/column, exact CAVE evidence row IDs, and scenario input
101
+ IDs. These fields and human descriptions never affect the canonical model
102
+ digest.
103
+
104
+ `Solve.runWithExplanation` wraps any adapter result in versioned, plain JSON.
105
+ The report records the canonical digest, backend/version, resolved limits,
106
+ diagnostics, optional frozen snapshot and authored inputs, assignments,
107
+ evaluated hard and soft constraints, objective contributions, or a mapped
108
+ unsatisfiable core. Cores are explicitly not promised minimal and `unknown`
109
+ keeps its structured reason.
110
+
111
+ ```ts
112
+ const report = await Solve.runWithExplanation(adapter, model, {
113
+ unsatCore: true,
114
+ limits: { timeoutMs: 2_000 }
115
+ }, {
116
+ snapshot: { transactionTime: '019c…', validTime: '2026-08-01' },
117
+ inputs: [{
118
+ id: 'team-size',
119
+ query: 'system HAS team-size: ?n',
120
+ value: { kind: 'integer', value: '12', unit: 'people' },
121
+ authoredValue: '0.012K people',
122
+ evidenceRowIds: ['019c…'],
123
+ scenarioClaimIds: []
124
+ }]
125
+ })
126
+
127
+ process.stdout.write(Explain.render(report))
128
+ ```
129
+
130
+ The renderer is a deterministic human view over the same JSON report. Neither
131
+ building nor rendering an explanation writes to the CAVE store.
132
+
133
+ ## Backend evaluations
134
+
135
+ Z3 is the only shipped adapter. The [MiniZinc](MINIZINC-EVALUATION.md) and
136
+ [direct HiGHS](HIGHS-EVALUATION.md) evaluations record why neither candidate
137
+ currently crosses the portable boundary. MiniZinc lacks a motivating
138
+ solver-neutral finite-domain schema. HiGHS materially outperforms Z3 on
139
+ representative LP/MIP workloads and is much smaller, but its synchronous
140
+ binary64 wrapper cannot yet honor CAVE's exact-result, cancellation, and
141
+ working-memory contracts.
142
+
143
+ ## Verification workflows
144
+
145
+ `Workflow` gives feasibility, optimization, counterexample, and bounded
146
+ sensitivity distinct public semantics while keeping one validated model,
147
+ snapshot context, adapter limits, and result vocabulary.
148
+
149
+ ```ts
150
+ import { Workflow } from '@cavelang/solver'
151
+
152
+ const feasible = await Workflow.feasibility(adapter, model, {
153
+ limits: { timeoutMs: 2_000 }
154
+ }, context)
155
+
156
+ const best = await Workflow.optimization(adapter, model, {}, context)
157
+ const witness = await Workflow.counterexample(
158
+ adapter, model, 'declared-invariant-id', {}, context
159
+ )
160
+ const boundary = await Workflow.sensitivity(adapter, model, {
161
+ variableId: 'team-size',
162
+ samples: [
163
+ { sort: 'int', value: '4' },
164
+ { sort: 'int', value: '8' },
165
+ { sort: 'int', value: '12' }
166
+ ],
167
+ observe: ['architecture'],
168
+ operation: 'optimization',
169
+ maxRuns: 3
170
+ }, {}, context)
171
+ ```
172
+
173
+ Workflows require every real variable to have explicit lower and upper bounds.
174
+ Sensitivity accepts an explicit, typed sample list and refuses more than
175
+ `maxRuns` checks. Its report includes adjacent result transitions and
176
+ contiguous `unknown` regions rather than interpolating across timeouts.
177
+
178
+ Backend model choices are made deterministic with lexicographic objectives in
179
+ stable variable-ID order: false before true, smaller exact numbers first, and
180
+ enum values in lexical order. In optimization, authored objectives retain
181
+ their declared order, explicitly weighted soft constraints follow, and the
182
+ tie-break objectives come last. These generated objectives count against
183
+ `maxObjectives`; the workflow fails preflight rather than silently dropping
184
+ determinism. A merely feasible backend result is never promoted to `optimal`.
185
+
186
+ Counterexample checks replace one declared invariant with its negation. A
187
+ model is a concrete witness; an unsatisfied result means only that the
188
+ invariant holds within the report's named assumptions, bounded domains, and
189
+ declared Boolean/integer/rational/enum theories. `unknown` remains unknown.
@@ -0,0 +1,106 @@
1
+ import type { Backend, Diagnostic, Limits, Result, UnknownReason } from './adapter.ts';
2
+ import * as Exact from './exact.ts';
3
+ import type { Declaration, Model, Value } from './model.ts';
4
+ export declare const schema: "cave.solver/explanation@1";
5
+ export type Json = null | boolean | number | string | readonly Json[] | {
6
+ readonly [key: string]: Json | undefined;
7
+ };
8
+ export type Snapshot = {
9
+ readonly transactionTime: string | null;
10
+ readonly validTime?: string;
11
+ readonly aliases?: 'exact' | 'closure';
12
+ readonly resolution?: 'coexisting' | 'winner';
13
+ readonly minimumConfidence?: number;
14
+ };
15
+ export type Input = {
16
+ readonly id: string;
17
+ readonly query?: string;
18
+ readonly value?: Json;
19
+ readonly authoredValue?: Json;
20
+ readonly evidenceRowIds: readonly string[];
21
+ readonly scenarioClaimIds: readonly string[];
22
+ };
23
+ export type Scenario = {
24
+ readonly id: string;
25
+ readonly inputDigest: string;
26
+ readonly overlayDigest: string;
27
+ };
28
+ export type Context = {
29
+ /** Reject accidentally replaying bindings against a different model. */
30
+ readonly modelDigest?: string;
31
+ readonly scenario?: Scenario;
32
+ readonly snapshot?: Snapshot;
33
+ readonly inputs?: readonly Input[];
34
+ };
35
+ export type Run = {
36
+ readonly modelDigest: string;
37
+ readonly backend: Backend;
38
+ readonly elapsedMs: number;
39
+ readonly limits: Limits;
40
+ readonly diagnostics: readonly Diagnostic[];
41
+ readonly scenario?: Scenario;
42
+ readonly snapshot?: Snapshot;
43
+ readonly inputs: readonly Input[];
44
+ };
45
+ export type Element = {
46
+ readonly id: string;
47
+ readonly description?: string;
48
+ readonly declaration?: Declaration;
49
+ readonly evidenceRowIds: readonly string[];
50
+ readonly scenarioInputIds: readonly string[];
51
+ };
52
+ export type AssignmentValue = Element & {
53
+ /** False exposes an adapter value that has no matching model declaration. */
54
+ readonly declared: boolean;
55
+ readonly value: Value;
56
+ };
57
+ export type Constraint = Element & {
58
+ readonly evaluation: 'satisfied' | 'violated' | 'indeterminate';
59
+ };
60
+ export type SoftConstraintResult = Element & {
61
+ readonly evaluation: 'accepted' | 'violated' | 'indeterminate';
62
+ readonly weight: ReturnType<typeof Exact.rational>;
63
+ };
64
+ export type ObjectiveResult = Element & {
65
+ /** False exposes an adapter value that has no matching model declaration. */
66
+ readonly declared: boolean;
67
+ readonly direction: 'minimize' | 'maximize' | 'unknown';
68
+ readonly value: Value;
69
+ readonly bound?: Value;
70
+ };
71
+ export type CoreConstraint = Element & {
72
+ /** False means the backend returned an ID absent from the submitted model. */
73
+ readonly declared: boolean;
74
+ };
75
+ type Feasible = {
76
+ readonly assignments: readonly AssignmentValue[];
77
+ readonly hardConstraints: readonly Constraint[];
78
+ readonly softConstraints: readonly SoftConstraintResult[];
79
+ };
80
+ export type Outcome = ({
81
+ readonly status: 'satisfied';
82
+ } & Feasible) | ({
83
+ readonly status: 'optimal';
84
+ readonly objectives: readonly ObjectiveResult[];
85
+ readonly optimalityProved: true;
86
+ } & Feasible) | {
87
+ readonly status: 'unsatisfied';
88
+ readonly core?: readonly CoreConstraint[];
89
+ /** Solver cores explain one contradiction, but are not promised minimal. */
90
+ readonly coreMinimal: false;
91
+ readonly infeasibilityProved: true;
92
+ } | {
93
+ readonly status: 'unknown';
94
+ readonly reason: UnknownReason;
95
+ };
96
+ export type Report = {
97
+ readonly schema: typeof schema;
98
+ readonly run: Run;
99
+ readonly outcome: Outcome;
100
+ };
101
+ /** Build stable JSON data without mutating the model, scenario, or CAVE store. */
102
+ export declare const report: (model: Model, result: Result, limits: Limits, context?: Context) => Report;
103
+ /** Render the same report as concise, deterministic plain text. */
104
+ export declare const render: (value: Report) => string;
105
+ export {};
106
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../src/explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,256 @@
1
+ import * as Canonical from "./canonical.js";
2
+ import * as Exact from "./exact.js";
3
+ export const schema = 'cave.solver/explanation@1';
4
+ const compareText = (left, right) => left < right ? -1 : left > right ? 1 : 0;
5
+ const normalize = (numerator, denominator) => {
6
+ if (denominator === 0n)
7
+ throw new TypeError('cannot explain division by zero');
8
+ const exact = Exact.rational({ numerator: String(numerator), denominator: String(denominator) });
9
+ return { kind: 'number', numerator: BigInt(exact.numerator), denominator: BigInt(exact.denominator) };
10
+ };
11
+ const number = (value) => {
12
+ const exact = Exact.rational(value);
13
+ return { kind: 'number', numerator: BigInt(exact.numerator), denominator: BigInt(exact.denominator) };
14
+ };
15
+ const numeric = (value) => {
16
+ if (value.kind !== 'number')
17
+ throw new TypeError(`expected a numeric explanation value, received ${value.kind}`);
18
+ return value;
19
+ };
20
+ const bool = (value) => {
21
+ if (value.kind !== 'bool')
22
+ throw new TypeError(`expected a Boolean explanation value, received ${value.kind}`);
23
+ return value.value;
24
+ };
25
+ const add = (left, right) => normalize(left.numerator * right.denominator + right.numerator * left.denominator, left.denominator * right.denominator);
26
+ const multiply = (left, right) => normalize(left.numerator * right.numerator, left.denominator * right.denominator);
27
+ const compare = (left, right) => {
28
+ const difference = left.numerator * right.denominator - right.numerator * left.denominator;
29
+ return difference < 0n ? -1 : difference > 0n ? 1 : 0;
30
+ };
31
+ const equal = (left, right) => {
32
+ if (left.kind === 'number' && right.kind === 'number')
33
+ return compare(left, right) === 0;
34
+ if (left.kind !== right.kind)
35
+ return false;
36
+ if (left.kind === 'bool' && right.kind === 'bool')
37
+ return left.value === right.value;
38
+ if (left.kind === 'enum' && right.kind === 'enum')
39
+ return left.domain === right.domain && left.value === right.value;
40
+ return false;
41
+ };
42
+ const assigned = (value) => {
43
+ switch (value.sort) {
44
+ case 'bool': return { kind: 'bool', value: value.value };
45
+ case 'int': return number({ numerator: value.value, denominator: '1' });
46
+ case 'real': return number({ numerator: value.numerator, denominator: value.denominator });
47
+ case 'enum': return { kind: 'enum', domain: value.domain, value: value.value };
48
+ }
49
+ };
50
+ const evaluate = (expression, assignment) => {
51
+ const run = (value) => evaluate(value, assignment);
52
+ switch (expression.kind) {
53
+ case 'literal':
54
+ switch (expression.sort) {
55
+ case 'bool': return { kind: 'bool', value: expression.value };
56
+ case 'int': return number({ numerator: String(Exact.integer(expression.value)), denominator: '1' });
57
+ case 'real': return number(expression.value);
58
+ case 'enum': return { kind: 'enum', domain: expression.domain, value: expression.value };
59
+ }
60
+ case 'variable': {
61
+ const value = assignment[expression.id];
62
+ if (value === undefined)
63
+ throw new TypeError(`assignment omits ${JSON.stringify(expression.id)}`);
64
+ return assigned(value);
65
+ }
66
+ case 'not': return { kind: 'bool', value: !bool(run(expression.value)) };
67
+ case 'and': return { kind: 'bool', value: expression.operands.every(value => bool(run(value))) };
68
+ case 'or': return { kind: 'bool', value: expression.operands.some(value => bool(run(value))) };
69
+ case 'implies': return { kind: 'bool', value: !bool(run(expression.left)) || bool(run(expression.right)) };
70
+ case 'eq': return { kind: 'bool', value: equal(run(expression.left), run(expression.right)) };
71
+ case 'neq': return { kind: 'bool', value: !equal(run(expression.left), run(expression.right)) };
72
+ case 'lt': return { kind: 'bool', value: compare(numeric(run(expression.left)), numeric(run(expression.right))) < 0 };
73
+ case 'lte': return { kind: 'bool', value: compare(numeric(run(expression.left)), numeric(run(expression.right))) <= 0 };
74
+ case 'gt': return { kind: 'bool', value: compare(numeric(run(expression.left)), numeric(run(expression.right))) > 0 };
75
+ case 'gte': return { kind: 'bool', value: compare(numeric(run(expression.left)), numeric(run(expression.right))) >= 0 };
76
+ case 'add': return expression.operands.map(run).map(numeric).reduce(add);
77
+ case 'multiply': return expression.operands.map(run).map(numeric).reduce(multiply);
78
+ case 'subtract': {
79
+ const left = numeric(run(expression.left));
80
+ const right = numeric(run(expression.right));
81
+ return add(left, normalize(-right.numerator, right.denominator));
82
+ }
83
+ case 'divide': {
84
+ const left = numeric(run(expression.left));
85
+ const right = numeric(run(expression.right));
86
+ return normalize(left.numerator * right.denominator, left.denominator * right.numerator);
87
+ }
88
+ case 'negate': {
89
+ const value = numeric(run(expression.value));
90
+ return normalize(-value.numerator, value.denominator);
91
+ }
92
+ case 'if': return bool(run(expression.condition)) ? run(expression.then) : run(expression.else);
93
+ }
94
+ };
95
+ const sorted = (values) => [...new Set(values ?? [])].sort();
96
+ const element = (value) => ({
97
+ id: value.id,
98
+ ...(value.description === undefined ? {} : { description: value.description }),
99
+ ...(value.declaration === undefined ? {} : { declaration: value.declaration }),
100
+ evidenceRowIds: sorted(value.evidenceRowIds),
101
+ scenarioInputIds: sorted(value.scenarioInputIds)
102
+ });
103
+ const constraint = (value, assignment) => {
104
+ let evaluation = 'indeterminate';
105
+ try {
106
+ evaluation = bool(evaluate(value.expression, assignment)) ? 'satisfied' : 'violated';
107
+ }
108
+ catch { /* Keep the solver result usable when a backend uses totalized arithmetic. */ }
109
+ return { ...element(value), evaluation };
110
+ };
111
+ const softConstraint = (value, assignment) => ({
112
+ ...element(value),
113
+ evaluation: (() => {
114
+ try {
115
+ return bool(evaluate(value.expression, assignment)) ? 'accepted' : 'violated';
116
+ }
117
+ catch {
118
+ return 'indeterminate';
119
+ }
120
+ })(),
121
+ weight: Exact.rational(value.weight)
122
+ });
123
+ const assignments = (model, assignment) => {
124
+ const variables = new Map(model.variables.map(variable => [variable.id, variable]));
125
+ return Object.entries(assignment)
126
+ .sort(([left], [right]) => compareText(left, right))
127
+ .map(([id, value]) => {
128
+ const variable = variables.get(id);
129
+ return { ...element(variable ?? { id }), declared: variable !== undefined, value };
130
+ });
131
+ };
132
+ const feasible = (model, assignment) => ({
133
+ assignments: assignments(model, assignment),
134
+ hardConstraints: model.constraints.map(value => constraint(value, assignment)),
135
+ softConstraints: (model.softConstraints ?? []).map(value => softConstraint(value, assignment))
136
+ });
137
+ const objective = (declaration, result) => ({
138
+ ...element(declaration ?? { id: result.objectiveId }),
139
+ declared: declaration !== undefined,
140
+ direction: declaration?.direction ?? 'unknown',
141
+ value: result.value,
142
+ ...(result.bound === undefined ? {} : { bound: result.bound })
143
+ });
144
+ const outcome = (model, result) => {
145
+ switch (result.status) {
146
+ case 'satisfied': return { status: result.status, ...feasible(model, result.assignment) };
147
+ case 'optimal': {
148
+ const declarations = new Map((model.objectives ?? []).map(value => [value.id, value]));
149
+ return {
150
+ status: result.status,
151
+ ...feasible(model, result.assignment),
152
+ objectives: result.objectives.map(value => objective(declarations.get(value.objectiveId), value)),
153
+ optimalityProved: result.optimalityProved
154
+ };
155
+ }
156
+ case 'unsatisfied': {
157
+ const declarations = new Map(model.constraints.map(value => [value.id, value]));
158
+ return {
159
+ status: result.status,
160
+ ...(result.core === undefined ? {} : {
161
+ core: result.core.map(id => {
162
+ const declaration = declarations.get(id);
163
+ return { ...element(declaration ?? { id }), declared: declaration !== undefined };
164
+ })
165
+ }),
166
+ coreMinimal: false,
167
+ infeasibilityProved: result.infeasibilityProved
168
+ };
169
+ }
170
+ case 'unknown': return { status: result.status, reason: result.reason };
171
+ }
172
+ };
173
+ /** Build stable JSON data without mutating the model, scenario, or CAVE store. */
174
+ export const report = (model, result, limits, context = {}) => {
175
+ const modelDigest = Canonical.digest(model);
176
+ if (context.modelDigest !== undefined && context.modelDigest !== modelDigest) {
177
+ throw new TypeError(`scenario model digest ${context.modelDigest} does not match ${modelDigest}`);
178
+ }
179
+ return {
180
+ schema,
181
+ run: {
182
+ modelDigest,
183
+ backend: result.backend,
184
+ elapsedMs: result.elapsedMs,
185
+ limits,
186
+ diagnostics: result.diagnostics,
187
+ ...(context.scenario === undefined ? {} : { scenario: context.scenario }),
188
+ ...(context.snapshot === undefined ? {} : { snapshot: context.snapshot }),
189
+ inputs: [...(context.inputs ?? [])].sort((left, right) => compareText(left.id, right.id))
190
+ },
191
+ outcome: outcome(model, result)
192
+ };
193
+ };
194
+ const evidence = (value) => {
195
+ const parts = [
196
+ value.declaration === undefined ? undefined : `${value.declaration.uri}${value.declaration.line === undefined ? '' : `:${value.declaration.line}${value.declaration.column === undefined ? '' : `:${value.declaration.column}`}`}`,
197
+ value.evidenceRowIds.length === 0 ? undefined : `rows ${value.evidenceRowIds.join(', ')}`,
198
+ value.scenarioInputIds.length === 0 ? undefined : `inputs ${value.scenarioInputIds.join(', ')}`
199
+ ].filter((part) => part !== undefined);
200
+ return parts.length === 0 ? '' : ` — ${parts.join('; ')}`;
201
+ };
202
+ const valueText = (value) => {
203
+ switch (value.sort) {
204
+ case 'bool': return String(value.value);
205
+ case 'int': return value.value;
206
+ case 'real': return `${value.numerator}/${value.denominator}`;
207
+ case 'enum': return value.value;
208
+ }
209
+ };
210
+ /** Render the same report as concise, deterministic plain text. */
211
+ export const render = (value) => {
212
+ const lines = [
213
+ `Solver result: ${value.outcome.status}`,
214
+ `Model: ${value.run.modelDigest}`,
215
+ `Backend: ${value.run.backend.name} ${value.run.backend.version}`,
216
+ `Elapsed: ${value.run.elapsedMs} ms`
217
+ ];
218
+ if (value.run.snapshot !== undefined) {
219
+ lines.push(`Snapshot: transaction ${value.run.snapshot.transactionTime ?? 'empty'}${value.run.snapshot.validTime === undefined ? '' : `, valid ${value.run.snapshot.validTime}`}`);
220
+ }
221
+ if (value.run.scenario !== undefined)
222
+ lines.push(`Scenario: ${value.run.scenario.id} (${value.run.scenario.inputDigest})`);
223
+ for (const input of value.run.inputs) {
224
+ lines.push(`Input ${input.id}: ${JSON.stringify(input.value)}${input.query === undefined ? '' : ` via ${input.query}`}`);
225
+ }
226
+ switch (value.outcome.status) {
227
+ case 'satisfied':
228
+ case 'optimal':
229
+ for (const assignment of value.outcome.assignments) {
230
+ lines.push(`Assignment ${assignment.id} = ${valueText(assignment.value)}${assignment.declared ? '' : ' (undeclared backend ID)'}${evidence(assignment)}`);
231
+ }
232
+ for (const constraint of value.outcome.hardConstraints) {
233
+ lines.push(`Hard constraint ${constraint.id}: ${constraint.evaluation}${evidence(constraint)}`);
234
+ }
235
+ for (const constraint of value.outcome.softConstraints) {
236
+ lines.push(`Soft constraint ${constraint.id}: ${constraint.evaluation}, weight ${constraint.weight.numerator}/${constraint.weight.denominator}${evidence(constraint)}`);
237
+ }
238
+ if (value.outcome.status === 'optimal') {
239
+ for (const objective of value.outcome.objectives) {
240
+ lines.push(`Objective ${objective.id} (${objective.direction}) = ${valueText(objective.value)}${objective.declared ? '' : ' (undeclared backend ID)'}${evidence(objective)}`);
241
+ }
242
+ }
243
+ break;
244
+ case 'unsatisfied':
245
+ lines.push('Infeasibility proved. Unsatisfiable cores are not necessarily minimal.');
246
+ for (const constraint of value.outcome.core ?? []) {
247
+ lines.push(`Core constraint ${constraint.id}${constraint.declared ? '' : ' (undeclared backend ID)'}${evidence(constraint)}`);
248
+ }
249
+ break;
250
+ case 'unknown':
251
+ lines.push(`Unknown: ${value.outcome.reason.kind} — ${value.outcome.reason.message}`);
252
+ break;
253
+ }
254
+ return `${lines.join('\n')}\n`;
255
+ };
256
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/explain.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Solver-neutral formal reasoning contracts for CAVE.
2
+ * Solver-neutral formal reasoning contracts and bounded workflows for CAVE.
3
3
  *
4
4
  * This package contains no solver implementation and never imports Z3 or
5
5
  * another backend. Adapters receive only validated portable model data.
@@ -8,8 +8,10 @@ export * as Adapter from './adapter.ts';
8
8
  export * as Canonical from './canonical.ts';
9
9
  export * as Capability from './capability.ts';
10
10
  export * as Exact from './exact.ts';
11
+ export * as Explain from './explain.ts';
11
12
  export * as Linear from './linear.ts';
12
13
  export * as Model from './model.ts';
13
14
  export * as Solve from './solve.ts';
14
15
  export * as Validate from './validate.ts';
16
+ export * as Workflow from './workflow.ts';
15
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA"}
package/dist/src/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Solver-neutral formal reasoning contracts for CAVE.
2
+ * Solver-neutral formal reasoning contracts and bounded workflows for CAVE.
3
3
  *
4
4
  * This package contains no solver implementation and never imports Z3 or
5
5
  * another backend. Adapters receive only validated portable model data.
@@ -8,8 +8,10 @@ export * as Adapter from "./adapter.js";
8
8
  export * as Canonical from "./canonical.js";
9
9
  export * as Capability from "./capability.js";
10
10
  export * as Exact from "./exact.js";
11
+ export * as Explain from "./explain.js";
11
12
  export * as Linear from "./linear.js";
12
13
  export * as Model from "./model.js";
13
14
  export * as Solve from "./solve.js";
14
15
  export * as Validate from "./validate.js";
16
+ export * as Workflow from "./workflow.js";
15
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA"}
@@ -10,29 +10,37 @@ export type EnumDomain = {
10
10
  readonly id: string;
11
11
  readonly values: readonly string[];
12
12
  readonly description?: string;
13
+ readonly declaration?: Declaration;
13
14
  };
14
- export type Variable = {
15
+ export type Declaration = {
16
+ /** Stable model source. Prefer a repository-relative URI over a machine-local path. */
17
+ readonly uri: string;
18
+ readonly line?: number;
19
+ readonly column?: number;
20
+ };
21
+ export type Provenance = {
22
+ readonly description?: string;
23
+ readonly declaration?: Declaration;
24
+ readonly evidenceRowIds?: readonly string[];
25
+ readonly scenarioInputIds?: readonly string[];
26
+ };
27
+ type VariableDeclaration = {
15
28
  readonly id: string;
29
+ } & Provenance;
30
+ export type Variable = VariableDeclaration & ({
16
31
  readonly sort: 'bool';
17
- readonly description?: string;
18
32
  } | {
19
- readonly id: string;
20
33
  readonly sort: 'int';
21
34
  readonly min: Integer;
22
35
  readonly max: Integer;
23
- readonly description?: string;
24
36
  } | {
25
- readonly id: string;
26
37
  readonly sort: 'real';
27
38
  readonly min?: Rational;
28
39
  readonly max?: Rational;
29
- readonly description?: string;
30
40
  } | {
31
- readonly id: string;
32
41
  readonly sort: 'enum';
33
42
  readonly domain: string;
34
- readonly description?: string;
35
- };
43
+ });
36
44
  export type Literal = {
37
45
  readonly kind: 'literal';
38
46
  readonly sort: 'bool';
@@ -84,22 +92,18 @@ export type Expression = Literal | {
84
92
  readonly then: Expression;
85
93
  readonly else: Expression;
86
94
  };
87
- export type HardConstraint = {
95
+ export type HardConstraint = Provenance & {
88
96
  readonly id: string;
89
97
  readonly expression: Expression;
90
- readonly description?: string;
91
- readonly evidenceRowIds?: readonly string[];
92
98
  };
93
99
  export type SoftConstraint = HardConstraint & {
94
100
  /** Deliberate preference weight; never inferred from CAVE confidence. */
95
101
  readonly weight: Rational;
96
102
  };
97
- export type Objective = {
103
+ export type Objective = Provenance & {
98
104
  readonly id: string;
99
105
  readonly direction: 'minimize' | 'maximize';
100
106
  readonly expression: Expression;
101
- readonly description?: string;
102
- readonly evidenceRowIds?: readonly string[];
103
107
  };
104
108
  export type Model = {
105
109
  readonly schema: typeof schema;
@@ -127,4 +131,5 @@ export type Value = {
127
131
  readonly value: string;
128
132
  };
129
133
  export type Assignment = Readonly<Record<string, Value>>;
134
+ export {};
130
135
  //# sourceMappingURL=model.d.ts.map