@behavproof/cli 0.0.0-stage → 0.1.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/README.md +14 -2
- package/dist/api.d.ts +6 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +5 -0
- package/dist/api.js.map +1 -0
- package/dist/check.d.ts +272 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +220 -0
- package/dist/check.js.map +1 -0
- package/dist/formal-evaluation.d.ts +108 -0
- package/dist/formal-evaluation.d.ts.map +1 -0
- package/dist/formal-evaluation.js +78 -0
- package/dist/formal-evaluation.js.map +1 -0
- package/dist/formal-worker.d.ts +2 -0
- package/dist/formal-worker.d.ts.map +1 -0
- package/dist/formal-worker.js +32 -0
- package/dist/formal-worker.js.map +1 -0
- package/dist/formal.d.ts +148 -0
- package/dist/formal.d.ts.map +1 -0
- package/dist/formal.js +99 -0
- package/dist/formal.js.map +1 -0
- package/dist/impact.d.ts +20 -0
- package/dist/impact.d.ts.map +1 -0
- package/dist/impact.js +23 -0
- package/dist/impact.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +151 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline.d.ts +38 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +46 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/project.d.ts +97 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +101 -0
- package/dist/project.js.map +1 -0
- package/dist/registration.d.ts +595 -0
- package/dist/registration.d.ts.map +1 -0
- package/dist/registration.js +112 -0
- package/dist/registration.js.map +1 -0
- package/dist/report.d.ts +23 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +34 -0
- package/dist/report.js.map +1 -0
- package/dist/scopes.d.ts +48 -0
- package/dist/scopes.d.ts.map +1 -0
- package/dist/scopes.js +60 -0
- package/dist/scopes.js.map +1 -0
- package/dist/trust.d.ts +533 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +130 -0
- package/dist/trust.js.map +1 -0
- package/package.json +51 -4
- package/presets/basic-v1.json +21 -0
- package/presets/critical-v1.json +39 -0
- package/presets/standard-v1.json +21 -0
- package/schemas/config.schema.json +492 -0
- package/schemas/evidence.schema.json +3612 -0
- package/schemas/manifest.schema.json +225 -0
- package/schemas/policy.schema.json +21 -0
- package/schemas/registration.schema.json +1065 -0
- package/schemas/registry.schema.json +307 -0
- package/schemas/trust-root.schema.json +1445 -0
- package/templates/audit.yml +28 -0
- package/templates/protected-github-producer.yml +58 -0
- package/templates/protected-github-publisher.yml +111 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { type Config, type RegistrySnapshot, type Approval, type Policy, type EvidenceStatus } from '@behavproof/core';
|
|
2
|
+
type Options = {
|
|
3
|
+
root: string;
|
|
4
|
+
config: Config;
|
|
5
|
+
protectedConfig?: Config;
|
|
6
|
+
baseline?: RegistrySnapshot;
|
|
7
|
+
registry: RegistrySnapshot;
|
|
8
|
+
obligations: RegistrySnapshot;
|
|
9
|
+
approvals: Approval[];
|
|
10
|
+
intentStatus: ReadonlyMap<string, string>;
|
|
11
|
+
policy: Policy;
|
|
12
|
+
inputs: readonly string[];
|
|
13
|
+
trusted: (ref: string | undefined) => boolean;
|
|
14
|
+
readJson: (ref: string) => Promise<unknown>;
|
|
15
|
+
readBytes: (ref: string) => Promise<Uint8Array>;
|
|
16
|
+
};
|
|
17
|
+
export declare function formalEvaluations(o: Options): Promise<{
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
models: {
|
|
20
|
+
modelId: string;
|
|
21
|
+
contractId: string;
|
|
22
|
+
risk: "basic" | "standard" | "critical";
|
|
23
|
+
model: {
|
|
24
|
+
status: "unknown" | "pass" | "fail";
|
|
25
|
+
reasons: string[];
|
|
26
|
+
scope: {
|
|
27
|
+
modelId: string;
|
|
28
|
+
model: string;
|
|
29
|
+
contractId: string;
|
|
30
|
+
properties: string[];
|
|
31
|
+
maxSteps: number;
|
|
32
|
+
maxSamples: number;
|
|
33
|
+
seed: string;
|
|
34
|
+
unbounded: false;
|
|
35
|
+
};
|
|
36
|
+
stages: {
|
|
37
|
+
stage: "parse" | "typecheck" | "test" | "run" | "verify";
|
|
38
|
+
status: "unknown" | "pass" | "fail";
|
|
39
|
+
complete: boolean;
|
|
40
|
+
exitCode: number | null;
|
|
41
|
+
toolVersion: string;
|
|
42
|
+
backend: "quint" | "typescript" | "rust" | "apalache" | "tlc";
|
|
43
|
+
method: "parse" | "typecheck" | "spec_test" | "simulation" | "bounded_model_check" | "finite_state_check";
|
|
44
|
+
properties: string[];
|
|
45
|
+
diagnostics: string[];
|
|
46
|
+
maxSteps?: number | undefined;
|
|
47
|
+
maxSamples?: number | undefined;
|
|
48
|
+
seed?: string | undefined;
|
|
49
|
+
traceSeed?: string | undefined;
|
|
50
|
+
backendVersion?: string | undefined;
|
|
51
|
+
stdoutHash?: string | undefined;
|
|
52
|
+
stderrHash?: string | undefined;
|
|
53
|
+
artifacts?: {
|
|
54
|
+
ref: string;
|
|
55
|
+
sha256: string;
|
|
56
|
+
}[] | undefined;
|
|
57
|
+
}[];
|
|
58
|
+
};
|
|
59
|
+
conformance: {
|
|
60
|
+
status: "unknown" | "pass" | "fail";
|
|
61
|
+
reasons: string[];
|
|
62
|
+
scope: {
|
|
63
|
+
modelId: string;
|
|
64
|
+
model: string;
|
|
65
|
+
contractId: string;
|
|
66
|
+
properties: string[];
|
|
67
|
+
maxSteps: number;
|
|
68
|
+
maxSamples: number;
|
|
69
|
+
seed: string;
|
|
70
|
+
unbounded: false;
|
|
71
|
+
};
|
|
72
|
+
counts: {
|
|
73
|
+
replayedTraces: number;
|
|
74
|
+
replayedSteps: number;
|
|
75
|
+
comparedSteps: number;
|
|
76
|
+
implementationCalls: number;
|
|
77
|
+
actions: Record<string, number>;
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
binding: {
|
|
81
|
+
status: "unknown" | "pass";
|
|
82
|
+
reasons: string[];
|
|
83
|
+
};
|
|
84
|
+
}[];
|
|
85
|
+
evaluations: {
|
|
86
|
+
ruleId: string;
|
|
87
|
+
severity: "error" | "off" | "warn";
|
|
88
|
+
status: "unknown" | "pass" | "fail" | "not_applicable";
|
|
89
|
+
evidenceIds: string[];
|
|
90
|
+
scope: string[];
|
|
91
|
+
message: string;
|
|
92
|
+
remediation?: string | undefined;
|
|
93
|
+
notApplicable?: {
|
|
94
|
+
reason: string;
|
|
95
|
+
allowedReasons: string[];
|
|
96
|
+
evidenceIds: string[];
|
|
97
|
+
} | undefined;
|
|
98
|
+
}[];
|
|
99
|
+
states: Map<string, {
|
|
100
|
+
status: EvidenceStatus;
|
|
101
|
+
message: string;
|
|
102
|
+
evidenceIds: string[];
|
|
103
|
+
}>;
|
|
104
|
+
policyChanged: boolean;
|
|
105
|
+
conformanceObserved: "unknown" | "pass" | "fail" | "not_applicable";
|
|
106
|
+
}>;
|
|
107
|
+
export {};
|
|
108
|
+
//# sourceMappingURL=formal-evaluation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formal-evaluation.d.ts","sourceRoot":"","sources":["../src/formal-evaluation.ts"],"names":[],"mappings":"AAAA,OAAM,EAAoH,KAAK,MAAM,EAAC,KAAK,gBAAgB,EAAC,KAAK,QAAQ,EAAC,KAAK,MAAM,EAAiB,KAAK,cAAc,EAAiD,MAAI,kBAAkB,CAAC;AAIjS,KAAK,OAAO,GAAC;IAAC,IAAI,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,eAAe,CAAC,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,EAAC,gBAAgB,CAAC;IAAA,QAAQ,EAAC,gBAAgB,CAAC;IAAA,WAAW,EAAC,gBAAgB,CAAC;IAAA,SAAS,EAAC,QAAQ,EAAE,CAAC;IAAA,YAAY,EAAC,WAAW,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,SAAS,MAAM,EAAE,CAAC;IAAA,OAAO,EAAC,CAAC,GAAG,EAAC,MAAM,GAAC,SAAS,KAAG,OAAO,CAAC;IAAA,QAAQ,EAAC,CAAC,GAAG,EAAC,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAAA,SAAS,EAAC,CAAC,GAAG,EAAC,MAAM,KAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CAAC,CAAC;AACnX,wBAAsB,iBAAiB,CAAC,CAAC,EAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAgDkgK,CAAC;0BAAwC,CAAC;oBAAkC,CAAC;yBAAuC,CAAC;8BAA4C,CAAC;0BAAwC,CAAC;0BAAwC,CAAC;yBAAuC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAP1yK,cAAc;iBAAS,MAAM;qBAAa,MAAM,EAAE;;;;GAKtF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { hash, FormalModelReportSchema, ModelConformanceReportSchema, evaluateFormalModel, evaluateModelConformance, resolveRisk } from '@behavproof/core';
|
|
2
|
+
import { formalAdapters, formalInputIdentity, formalTraceInputs, replayCommandHash, traceReceiptRef } from './formal.js';
|
|
3
|
+
import { exists } from './project.js';
|
|
4
|
+
const worst = (s) => s.includes('fail') ? 'fail' : s.length && s.every(x => x === 'pass') ? 'pass' : 'unknown';
|
|
5
|
+
export async function formalEvaluations(o) {
|
|
6
|
+
const adopted = o.protectedConfig?.formal?.models ?? [], candidate = o.config.formal?.models ?? [];
|
|
7
|
+
const models = [...adopted, ...candidate.filter(m => !adopted.some(p => p.id === m.id))];
|
|
8
|
+
const policyChanged = adopted.some(m => !candidate.some(c => c.id === m.id && hash(c) === hash(m)));
|
|
9
|
+
const evaluations = [], rows = [];
|
|
10
|
+
for (const model of models) {
|
|
11
|
+
const m = FormalModelConfigCopy(model), contract = o.registry.contracts.find(c => c.id === m.contractId), target = { path: m.model, ...(contract ? { contractKind: contract.kind } : {}), ...(contract?.risk ? { declaredRisk: contract.risk } : {}) };
|
|
12
|
+
const risk = resolveRisk(o.config, target, o.protectedConfig ? resolveRisk(o.protectedConfig, target) : undefined);
|
|
13
|
+
const effective = risk === 'critical' ? { ...m, requireCanary: true } : m;
|
|
14
|
+
let identity, problem;
|
|
15
|
+
try {
|
|
16
|
+
await formalAdapters();
|
|
17
|
+
identity = await formalInputIdentity(o.root, m);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error.code !== 'ENOENT' && !error.message.startsWith('Optional formal adapters unavailable'))
|
|
21
|
+
throw error;
|
|
22
|
+
problem = error.message;
|
|
23
|
+
}
|
|
24
|
+
const required = [m.model, ...m.modelSources, ...(m.driver ? [m.driver, ...(m.driverSources ?? [])] : []), ...(m.implementation ? [m.implementation, ...m.implementationSources] : []), ...(m.canary ? [m.canary.implementation] : [])];
|
|
25
|
+
if (required.some(ref => !o.inputs.includes(ref)))
|
|
26
|
+
problem = 'Protected input scope omits formal model/Driver/implementation inputs';
|
|
27
|
+
const placeholder = '0'.repeat(64), expectedIdentity = identity?.model ?? { modelHash: placeholder, configHash: hash(m), commandHash: placeholder };
|
|
28
|
+
const current = o.obligations.contracts.find(c => c.id === m.contractId), binding = contract?.formal;
|
|
29
|
+
const approval = !!contract && (o.baseline?.contracts.some(c => c.id === contract.id && c.revisionHash === contract.revisionHash) || o.approvals.some(a => a.status === 'pass' && a.target.kind === 'contract' && a.target.id === contract.id && a.target.contentHash === contract.revisionHash));
|
|
30
|
+
const bindingMatches = !!identity && !!binding && binding.modelId === m.id && binding.modelHash === identity.model.modelHash && hash([...binding.propertyIds].sort()) === hash([...m.properties].sort()) && (!m.driver || binding.driverHash === identity.driverHash) && current?.revisionHash === contract?.revisionHash;
|
|
31
|
+
const bindingStatus = bindingMatches && approval && contract.intentIds.every(id => o.intentStatus.get(id) === 'pass') ? 'pass' : 'unknown';
|
|
32
|
+
const bindingResult = { status: bindingStatus, reasons: bindingStatus === 'pass' ? [] : ['Model/Driver/property mapping must match an independently approved current Contract and Intent'] };
|
|
33
|
+
const modelReport = await exists(o.root, m.report) ? FormalModelReportSchema.parse(await o.readJson(m.report)) : undefined;
|
|
34
|
+
const modelResult = evaluateFormalModel(modelReport, { model: m, identity: expectedIdentity, authenticated: !problem && o.trusted(m.report) });
|
|
35
|
+
let trace, traceProblem;
|
|
36
|
+
if (identity && await exists(o.root, traceReceiptRef(m))) {
|
|
37
|
+
try {
|
|
38
|
+
trace = await formalTraceInputs(o.root, m, o.readJson, o.readBytes);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (/identity mismatch|digest mismatch/.test(error.message))
|
|
42
|
+
traceProblem = error.message;
|
|
43
|
+
else
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const conformanceReport = m.conformanceReport && await exists(o.root, m.conformanceReport) ? ModelConformanceReportSchema.parse(await o.readJson(m.conformanceReport)) : undefined;
|
|
48
|
+
const conformanceIdentity = { ...expectedIdentity, commandHash: replayCommandHash(m), ...(identity?.driverHash ? { driverHash: identity.driverHash } : {}), ...(identity?.implementationHash ? { implementationHash: identity.implementationHash } : {}), ...(trace ? { traceHash: trace.traceHash } : {}) };
|
|
49
|
+
const conformanceTrusted = !problem && !traceProblem && !!trace && o.trusted(traceReceiptRef(m)) && trace.receipt.traces.every(a => o.trusted(a.ref)) && o.trusted(m.conformanceReport);
|
|
50
|
+
const conformanceResult = evaluateModelConformance(conformanceReport, { model: effective, identity: conformanceIdentity, authenticated: conformanceTrusted, ...(identity?.canaryImplementationHash ? { canaryImplementationHash: identity.canaryImplementationHash } : {}) });
|
|
51
|
+
if (problem) {
|
|
52
|
+
modelResult.reasons.push(problem);
|
|
53
|
+
conformanceResult.reasons.push(problem);
|
|
54
|
+
}
|
|
55
|
+
if (traceProblem)
|
|
56
|
+
conformanceResult.reasons.push(traceProblem);
|
|
57
|
+
const currentModelReport = modelReport?.modelId === m.id && ['modelHash', 'configHash', 'commandHash'].every(key => modelReport.identity[key] === expectedIdentity[key]);
|
|
58
|
+
const stageState = (stage) => { const row = modelReport?.stages.find(s => s.stage === stage); return !problem && currentModelReport && o.trusted(m.report) && row?.complete && row.toolVersion === m.quint.version && row.method === stage && (row.status === 'pass' && row.exitCode === 0 || row.status === 'fail' && row.exitCode === 1) ? row.status : 'unknown'; };
|
|
59
|
+
const facts = { formalSyntax: { status: stageState('parse'), reasons: ['Syntax parsing is separate from model property checking'] }, formalTypecheck: { status: stageState('typecheck'), reasons: ['Typechecking is separate from model property checking'] }, formalModel: modelResult, implementationConformance: conformanceResult, formalBinding: bindingResult };
|
|
60
|
+
for (const [ruleId, fact] of Object.entries(facts)) {
|
|
61
|
+
const required = ruleId === 'formalSyntax' || ruleId === 'formalTypecheck' || ruleId === 'formalBinding' || risk === 'critical';
|
|
62
|
+
const selected = o.policy.rules[ruleId]?.severity;
|
|
63
|
+
const severity = required ? 'error' : selected ?? 'warn';
|
|
64
|
+
const bounds = `model=${m.id}; maxSteps=${m.maxSteps}; maxSamples=${m.maxSamples}; seed=${m.seed}; unbounded=false`;
|
|
65
|
+
const method = ruleId === 'formalModel' ? `; recorded methods: ${modelResult.stages.map(s => `${s.stage}/${s.backend}/${s.method}`).join(', ')}` : ruleId === 'implementationConformance' ? `; traces=${conformanceResult.counts.replayedTraces}; comparedStates=${conformanceResult.counts.comparedSteps}; calls=${conformanceResult.counts.implementationCalls}` : '';
|
|
66
|
+
evaluations.push({ ruleId, severity, status: fact.status, scope: ['model', m.id], evidenceIds: [...(ruleId === 'implementationConformance' && m.conformanceReport ? [m.conformanceReport, traceReceiptRef(m)] : ruleId === 'formalBinding' && contract ? [contract.sourceRef] : [m.report])], message: `${fact.reasons.join('; ') || `Current ${ruleId} evidence within the selected model scope`}; ${bounds}${method}`, remediation: 'Collect current model, trace and observed replay reports with the protected producer; retain configured bounds and obtain model/Driver mapping approval separately.' });
|
|
67
|
+
}
|
|
68
|
+
rows.push({ modelId: m.id, contractId: m.contractId, risk, model: modelResult, conformance: conformanceResult, binding: bindingResult });
|
|
69
|
+
}
|
|
70
|
+
const states = new Map();
|
|
71
|
+
for (const id of ['formalSyntax', 'formalTypecheck', 'formalModel', 'implementationConformance', 'formalBinding']) {
|
|
72
|
+
const selected = evaluations.filter(e => e.ruleId === id);
|
|
73
|
+
states.set(id, { status: worst(selected.map(e => e.status)), message: 'Per-model formal evidence; model properties, observed conformance and approved meaning are independent', evidenceIds: [...new Set(selected.flatMap(e => e.evidenceIds))] });
|
|
74
|
+
}
|
|
75
|
+
return { enabled: models.length > 0, models: rows, evaluations, states, policyChanged, conformanceObserved: worst(rows.map(r => worst([r.conformance.status, r.binding.status]))) };
|
|
76
|
+
}
|
|
77
|
+
const FormalModelConfigCopy = (m) => structuredClone(m);
|
|
78
|
+
//# sourceMappingURL=formal-evaluation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formal-evaluation.js","sourceRoot":"","sources":["../src/formal-evaluation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formal-worker.d.ts","sourceRoot":"","sources":["../src/formal-worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { pathToFileURL } from 'node:url';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { safeRead, hash, canonicalJson, FormalModelConfigSchema, evaluateModelConformance } from '@behavproof/core';
|
|
4
|
+
import { formalInputIdentity, formalTraceInputs, replayCommandHash, formalAdapters } from './formal.js';
|
|
5
|
+
import { writeScoped } from './project.js';
|
|
6
|
+
async function main() {
|
|
7
|
+
const root = process.argv[2];
|
|
8
|
+
if (!root)
|
|
9
|
+
throw Error('Replay root unavailable');
|
|
10
|
+
const m = FormalModelConfigSchema.parse(JSON.parse(process.argv[3] ?? 'null'));
|
|
11
|
+
if (!m.driver || !m.implementation || !m.conformanceReport)
|
|
12
|
+
throw Error('Incomplete replay selection');
|
|
13
|
+
const before = await formalInputIdentity(root, m), trace = await formalTraceInputs(root, m);
|
|
14
|
+
const load = async (ref) => { await safeRead(root, ref); return import(pathToFileURL(join(root, ref)).href); };
|
|
15
|
+
const driver = await load(m.driver), implementation = await load(m.implementation);
|
|
16
|
+
if (typeof driver.createDriver !== 'function')
|
|
17
|
+
throw Error('Driver must export createDriver(implementation)');
|
|
18
|
+
const identity = { ...before.model, commandHash: replayCommandHash(m), driverHash: before.driverHash, implementationHash: before.implementationHash, traceHash: trace.traceHash };
|
|
19
|
+
const { replay } = await formalAdapters();
|
|
20
|
+
const report = await replay.replayTraces({ modelId: m.id, identity, traces: trace.traces, implementation, createDriver: driver.createDriver, ...(m.canary ? { canary: { faultId: m.canary.faultId, implementationHash: before.canaryImplementationHash, implementation: await load(m.canary.implementation) } } : {}) });
|
|
21
|
+
if (hash(before) !== hash(await formalInputIdentity(root, m)) || trace.traceHash !== (await formalTraceInputs(root, m)).traceHash)
|
|
22
|
+
throw Error('Replay inputs changed during execution');
|
|
23
|
+
const output = process.argv[4];
|
|
24
|
+
if (!output)
|
|
25
|
+
throw Error('Fresh replay output required');
|
|
26
|
+
await writeScoped(root, output, canonicalJson(report) + '\n', true);
|
|
27
|
+
const evaluation = evaluateModelConformance(report, { model: m, identity, authenticated: true, ...(before.canaryImplementationHash ? { canaryImplementationHash: before.canaryImplementationHash } : {}) });
|
|
28
|
+
process.stdout.write(canonicalJson({ status: evaluation.status, scope: evaluation.scope, counts: evaluation.counts }) + '\n');
|
|
29
|
+
return evaluation.status === 'pass' ? 0 : 1;
|
|
30
|
+
}
|
|
31
|
+
main().then(code => { process.exitCode = code; }).catch(error => { process.stderr.write(`Formal replay: ${error.message}\n`); process.exitCode = 2; });
|
|
32
|
+
//# sourceMappingURL=formal-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formal-worker.js","sourceRoot":"","sources":["../src/formal-worker.ts"],"names":[],"mappings":"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"}
|
package/dist/formal.d.ts
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { type FormalModelConfig } from '@behavproof/core';
|
|
2
|
+
export declare const traceReceiptRef: (m: FormalModelConfig) => string;
|
|
3
|
+
export declare const traceDirectory: (m: FormalModelConfig) => string;
|
|
4
|
+
export declare const replayCommandHash: (m: FormalModelConfig) => string;
|
|
5
|
+
export declare function formalAdapters(): Promise<{
|
|
6
|
+
quint: typeof import("@behavproof/adapter-quint");
|
|
7
|
+
replay: typeof import("@behavproof/adapter-model-test");
|
|
8
|
+
}>;
|
|
9
|
+
export declare function formalInputIdentity(root: string, m: FormalModelConfig): Promise<{
|
|
10
|
+
canaryImplementationHash?: string;
|
|
11
|
+
implementationHash?: string;
|
|
12
|
+
driverHash?: string;
|
|
13
|
+
model: {
|
|
14
|
+
modelHash: string;
|
|
15
|
+
configHash: string;
|
|
16
|
+
commandHash: string;
|
|
17
|
+
};
|
|
18
|
+
}>;
|
|
19
|
+
export declare function formalTraceInputs(root: string, m: FormalModelConfig, readJson?: (ref: string) => Promise<unknown>, readBytes?: (ref: string) => Promise<Uint8Array>): Promise<{
|
|
20
|
+
receipt: {
|
|
21
|
+
schemaVersion: 1;
|
|
22
|
+
modelId: string;
|
|
23
|
+
identity: {
|
|
24
|
+
modelHash: string;
|
|
25
|
+
configHash: string;
|
|
26
|
+
commandHash: string;
|
|
27
|
+
driverHash?: string | undefined;
|
|
28
|
+
implementationHash?: string | undefined;
|
|
29
|
+
traceHash?: string | undefined;
|
|
30
|
+
};
|
|
31
|
+
toolVersion: string;
|
|
32
|
+
backend: "typescript" | "rust";
|
|
33
|
+
maxSteps: number;
|
|
34
|
+
maxSamples: number;
|
|
35
|
+
seed: string;
|
|
36
|
+
traces: {
|
|
37
|
+
ref: string;
|
|
38
|
+
sha256: string;
|
|
39
|
+
}[];
|
|
40
|
+
};
|
|
41
|
+
traces: import("@behavproof/adapter-model-test").ReplayInputTrace[];
|
|
42
|
+
traceHash: string;
|
|
43
|
+
}>;
|
|
44
|
+
export declare function executeFormal(root: string, action: string, values: Record<string, unknown>): Promise<{
|
|
45
|
+
exitCode: number;
|
|
46
|
+
report: {
|
|
47
|
+
models: {
|
|
48
|
+
id: string;
|
|
49
|
+
model: string;
|
|
50
|
+
contractId: string;
|
|
51
|
+
properties: string[];
|
|
52
|
+
maxSteps: number;
|
|
53
|
+
seed: string;
|
|
54
|
+
missing: string[];
|
|
55
|
+
}[];
|
|
56
|
+
discovered: string[];
|
|
57
|
+
notice: string;
|
|
58
|
+
};
|
|
59
|
+
} | {
|
|
60
|
+
exitCode: number;
|
|
61
|
+
report: {
|
|
62
|
+
models: ({
|
|
63
|
+
schemaVersion: 1;
|
|
64
|
+
modelId: string;
|
|
65
|
+
identity: {
|
|
66
|
+
modelHash: string;
|
|
67
|
+
configHash: string;
|
|
68
|
+
commandHash: string;
|
|
69
|
+
driverHash?: string | undefined;
|
|
70
|
+
implementationHash?: string | undefined;
|
|
71
|
+
traceHash?: string | undefined;
|
|
72
|
+
};
|
|
73
|
+
stages: {
|
|
74
|
+
stage: "parse" | "typecheck" | "test" | "run" | "verify";
|
|
75
|
+
status: "unknown" | "pass" | "fail";
|
|
76
|
+
complete: boolean;
|
|
77
|
+
exitCode: number | null;
|
|
78
|
+
toolVersion: string;
|
|
79
|
+
backend: "quint" | "typescript" | "rust" | "apalache" | "tlc";
|
|
80
|
+
method: "parse" | "typecheck" | "spec_test" | "simulation" | "bounded_model_check" | "finite_state_check";
|
|
81
|
+
properties: string[];
|
|
82
|
+
diagnostics: string[];
|
|
83
|
+
maxSteps?: number | undefined;
|
|
84
|
+
maxSamples?: number | undefined;
|
|
85
|
+
seed?: string | undefined;
|
|
86
|
+
traceSeed?: string | undefined;
|
|
87
|
+
backendVersion?: string | undefined;
|
|
88
|
+
stdoutHash?: string | undefined;
|
|
89
|
+
stderrHash?: string | undefined;
|
|
90
|
+
artifacts?: {
|
|
91
|
+
ref: string;
|
|
92
|
+
sha256: string;
|
|
93
|
+
}[] | undefined;
|
|
94
|
+
}[];
|
|
95
|
+
} | {
|
|
96
|
+
schemaVersion: 1;
|
|
97
|
+
modelId: string;
|
|
98
|
+
identity: {
|
|
99
|
+
modelHash: string;
|
|
100
|
+
configHash: string;
|
|
101
|
+
commandHash: string;
|
|
102
|
+
driverHash?: string | undefined;
|
|
103
|
+
implementationHash?: string | undefined;
|
|
104
|
+
traceHash?: string | undefined;
|
|
105
|
+
};
|
|
106
|
+
runner: string;
|
|
107
|
+
observation: "module-functions" | "unverified";
|
|
108
|
+
complete: boolean;
|
|
109
|
+
diagnostics: string[];
|
|
110
|
+
traces: {
|
|
111
|
+
id: string;
|
|
112
|
+
complete: boolean;
|
|
113
|
+
steps: {
|
|
114
|
+
index: number;
|
|
115
|
+
action: string;
|
|
116
|
+
status: "unknown" | "pass" | "fail";
|
|
117
|
+
expected: import("zod").JSONType;
|
|
118
|
+
comparisonCount: number;
|
|
119
|
+
implementationCalls: number;
|
|
120
|
+
parameters?: import("zod").JSONType | undefined;
|
|
121
|
+
actual?: import("zod").JSONType | undefined;
|
|
122
|
+
diagnostic?: string | undefined;
|
|
123
|
+
}[];
|
|
124
|
+
}[];
|
|
125
|
+
canary?: {
|
|
126
|
+
faultId: string;
|
|
127
|
+
implementationHash: string;
|
|
128
|
+
originalImplementationHash: string;
|
|
129
|
+
driverHash: string;
|
|
130
|
+
traceHash: string;
|
|
131
|
+
observedCalls: number;
|
|
132
|
+
comparedSteps: number;
|
|
133
|
+
detectedMismatches: number;
|
|
134
|
+
failure?: {
|
|
135
|
+
traceId: string;
|
|
136
|
+
index: number;
|
|
137
|
+
action: string;
|
|
138
|
+
implementationCalls: number;
|
|
139
|
+
expected: import("zod").JSONType;
|
|
140
|
+
actual: import("zod").JSONType;
|
|
141
|
+
} | undefined;
|
|
142
|
+
} | undefined;
|
|
143
|
+
})[];
|
|
144
|
+
notice: string;
|
|
145
|
+
discovered?: never;
|
|
146
|
+
};
|
|
147
|
+
}>;
|
|
148
|
+
//# sourceMappingURL=formal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formal.d.ts","sourceRoot":"","sources":["../src/formal.ts"],"names":[],"mappings":"AACA,OAAM,EAA0J,KAAK,iBAAiB,EAA0B,MAAI,kBAAkB,CAAC;AAEvO,eAAO,MAAM,eAAe,GAAE,GAAE,iBAAiB,WAA4C,CAAC;AAC9F,eAAO,MAAM,cAAc,GAAE,GAAE,iBAAiB,WAAyG,CAAC;AAC1J,eAAO,MAAM,iBAAiB,GAAE,GAAE,iBAAiB,WAA0E,CAAC;AAC9H,wBAAsB,cAAc;;;GAGnC;AACD,wBAAsB,mBAAmB,CAAC,IAAI,EAAC,MAAM,EAAC,CAAC,EAAC,iBAAiB;;;;;;;;;GAOxE;AACD,wBAAsB,iBAAiB,CAAC,IAAI,EAAC,MAAM,EAAC,CAAC,EAAC,iBAAiB,EAAC,QAAQ,GAAC,CAAC,GAAG,EAAC,MAAM,KAAG,OAAO,CAAC,OAAO,CAA6B,EAAC,SAAS,GAAC,CAAC,GAAG,EAAC,MAAM,KAAG,OAAO,CAAC,UAAU,CAAyB;;;;;;;;;;;;;;;;;;;;;;;;GAU9M;AACD,wBAAsB,aAAa,CAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,MAAM,EAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6B1F"}
|
package/dist/formal.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { safeRead, safeReadJson, hash, hashBytes, canonicalJson, FormalModelReportSchema, FormalTraceReceiptSchema, ModelConformanceReportSchema } from '@behavproof/core';
|
|
5
|
+
import { config, fileList, writeScoped } from './project.js';
|
|
6
|
+
export const traceReceiptRef = (m) => m.traceReceipt ?? `${m.report}.traces.json`;
|
|
7
|
+
export const traceDirectory = (m) => m.traceDirectory ?? join(dirname(m.report), `${hash({ id: m.id }).slice(0, 16)}.traces`).replaceAll('\\', '/');
|
|
8
|
+
export const replayCommandHash = (m) => hash({ adapter: '@behavproof/adapter-model-test/1', nodeMajor: 24, model: m });
|
|
9
|
+
export async function formalAdapters() {
|
|
10
|
+
try {
|
|
11
|
+
return { quint: await import('@behavproof/adapter-quint'), replay: await import('@behavproof/adapter-model-test') };
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND')
|
|
15
|
+
throw Error('Optional formal adapters unavailable; explicitly install @behavproof/adapter-quint and @behavproof/adapter-model-test');
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function formalInputIdentity(root, m) {
|
|
20
|
+
const { quint } = await formalAdapters(), sources = await quint.readModelInputs(root, m);
|
|
21
|
+
const sourceMap = async (paths) => { const out = Object.create(null); for (const ref of [...new Set(paths)].sort())
|
|
22
|
+
out[ref] = hashBytes(await safeRead(root, ref)); return out; };
|
|
23
|
+
const driver = m.driver ? hash(await sourceMap([m.driver, ...(m.driverSources ?? [])])) : undefined;
|
|
24
|
+
const implementation = m.implementation ? hash(await sourceMap([m.implementation, ...m.implementationSources])) : undefined;
|
|
25
|
+
const canary = m.canary ? hash(await sourceMap([m.canary.implementation, ...m.implementationSources, ...(m.implementation ? [m.implementation] : [])])) : undefined;
|
|
26
|
+
return { model: { modelHash: sources.modelHash, configHash: hash(m), commandHash: quint.quintCommandHash(m) }, ...(driver ? { driverHash: driver } : {}), ...(implementation ? { implementationHash: implementation } : {}), ...(canary ? { canaryImplementationHash: canary } : {}) };
|
|
27
|
+
}
|
|
28
|
+
export async function formalTraceInputs(root, m, readJson = ref => safeReadJson(root, ref), readBytes = ref => safeRead(root, ref)) {
|
|
29
|
+
const { replay, quint } = await formalAdapters(), receipt = FormalTraceReceiptSchema.parse(await readJson(traceReceiptRef(m))), current = await quint.readModelInputs(root, m);
|
|
30
|
+
if (receipt.modelId !== m.id || receipt.identity.modelHash !== current.modelHash || receipt.identity.configHash !== hash(m) || receipt.identity.commandHash !== quint.quintCommandHash(m) || receipt.toolVersion !== m.quint.version || receipt.maxSteps !== m.maxSteps || receipt.maxSamples !== m.maxSamples || receipt.seed !== m.seed)
|
|
31
|
+
throw Error('Trace generation/model/config identity mismatch');
|
|
32
|
+
const prefix = traceDirectory(m) + '/', traces = [];
|
|
33
|
+
for (const a of receipt.traces) {
|
|
34
|
+
if (!a.ref.startsWith(prefix) || !/^trace_\d+\.itf\.json$/.test(a.ref.slice(prefix.length)))
|
|
35
|
+
throw Error('Trace artifact outside configured trace directory');
|
|
36
|
+
const bytes = await readBytes(a.ref);
|
|
37
|
+
if (hashBytes(bytes) !== a.sha256)
|
|
38
|
+
throw Error('Trace artifact digest mismatch');
|
|
39
|
+
traces.push(replay.readITF(JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes)), { id: a.ref.slice(prefix.length) }));
|
|
40
|
+
}
|
|
41
|
+
return { receipt, traces, traceHash: hash(traces) };
|
|
42
|
+
}
|
|
43
|
+
export async function executeFormal(root, action, values) {
|
|
44
|
+
const cfg = await config(root, values.config, values.profile), files = await fileList(root), models = cfg.formal?.models ?? [];
|
|
45
|
+
if (action === 'discover')
|
|
46
|
+
return { exitCode: 0, report: { models: models.map(m => ({ id: m.id, model: m.model, contractId: m.contractId, properties: m.properties, maxSteps: m.maxSteps, seed: m.seed, missing: [m.model, ...m.modelSources, ...(m.driver ? [m.driver] : []), ...(m.implementation ? [m.implementation] : [])].filter(p => !files.includes(p)) })), discovered: files.filter(p => p.endsWith('.qnt')), notice: 'Static inventory only; no model, Driver or tool was executed.' } };
|
|
47
|
+
if (!['check', 'replay'].includes(action))
|
|
48
|
+
throw Error('Expected formal discover|check|replay');
|
|
49
|
+
const selected = models.filter(m => !values.model || m.model === values.model || m.id === values.model);
|
|
50
|
+
if (!selected.length || values.model && selected.length !== 1)
|
|
51
|
+
throw Error('Select a configured formal model with --model; formal support is opt-in');
|
|
52
|
+
const { quint } = await formalAdapters(), results = [];
|
|
53
|
+
let exitCode = 0;
|
|
54
|
+
for (const m of selected) {
|
|
55
|
+
if (action === 'check') {
|
|
56
|
+
const stages = [], before = await formalInputIdentity(root, m), runId = randomUUID();
|
|
57
|
+
for (const stage of m.checks) {
|
|
58
|
+
const result = await quint.runQuint({ root, model: m, stage, outputDirectory: `.behavproof/formal-runs/${runId}/${stage}` });
|
|
59
|
+
stages.push(result.result);
|
|
60
|
+
if (stage === 'run' && result.result.status === 'pass') {
|
|
61
|
+
const traces = [];
|
|
62
|
+
for (const artifact of result.result.artifacts ?? []) {
|
|
63
|
+
if (!/\/trace_\d+\.itf\.json$/.test(artifact.ref))
|
|
64
|
+
continue;
|
|
65
|
+
const ref = `${traceDirectory(m)}/${artifact.ref.split('/').at(-1)}`, bytes = await safeRead(root, artifact.ref);
|
|
66
|
+
await writeScoped(root, ref, new TextDecoder('utf-8', { fatal: true }).decode(bytes));
|
|
67
|
+
traces.push({ ref, sha256: hashBytes(bytes) });
|
|
68
|
+
}
|
|
69
|
+
await writeScoped(root, traceReceiptRef(m), canonicalJson({ schemaVersion: 1, modelId: m.id, identity: result.identity, toolVersion: m.quint.version, backend: 'typescript', maxSteps: m.maxSteps, maxSamples: m.maxSamples, seed: m.seed, traces }) + '\n');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (hash(before) !== hash(await formalInputIdentity(root, m)))
|
|
73
|
+
throw Error('Formal inputs changed during execution');
|
|
74
|
+
const report = FormalModelReportSchema.parse({ schemaVersion: 1, modelId: m.id, identity: before.model, stages });
|
|
75
|
+
await writeScoped(root, m.report, canonicalJson(report) + '\n');
|
|
76
|
+
results.push(report);
|
|
77
|
+
if (stages.some(s => s.status === 'unknown'))
|
|
78
|
+
exitCode = 2;
|
|
79
|
+
else if (exitCode === 0 && stages.some(s => s.status === 'fail'))
|
|
80
|
+
exitCode = 1;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
if (!m.driver || !m.implementation || !m.conformanceReport)
|
|
84
|
+
throw Error('Model replay requires configured Driver, implementation and conformanceReport');
|
|
85
|
+
const worker = fileURLToPath(new URL('./formal-worker.js', import.meta.url));
|
|
86
|
+
const freshReport = `.behavproof/formal-replays/${randomUUID()}.json`;
|
|
87
|
+
const result = await quint.runBounded(process.execPath, [worker, root, canonicalJson(m), freshReport], { cwd: root, timeoutMs: m.timeoutMs });
|
|
88
|
+
if (!result.completed || result.exitCode !== 0 && result.exitCode !== 1)
|
|
89
|
+
throw Error(`Formal replay infrastructure: ${result.diagnostics.join('; ') || result.stderr || 'worker did not complete'}`);
|
|
90
|
+
const report = ModelConformanceReportSchema.parse(await safeReadJson(root, freshReport));
|
|
91
|
+
await writeScoped(root, m.conformanceReport, canonicalJson(report) + '\n');
|
|
92
|
+
results.push(report);
|
|
93
|
+
if (result.exitCode !== 0 && exitCode === 0)
|
|
94
|
+
exitCode = 1;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return { exitCode, report: { models: results, notice: 'Explicit local tool/Driver execution. Gate authority and human-approved model meaning require independent authenticated registration.' } };
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=formal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formal.js","sourceRoot":"","sources":["../src/formal.ts"],"names":[],"mappings":"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"}
|
package/dist/impact.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type RegistrySnapshot, type Risk, type Severity, type RulePolicy } from '@behavproof/core';
|
|
2
|
+
/** Static candidates and explicit unknowns; never behavioral equivalence. */
|
|
3
|
+
export declare function currentImpact(root: string, inputs: readonly string[], files: readonly string[], changed: readonly string[], registry: RegistrySnapshot, diffKnown: boolean, claimScopes?: readonly {
|
|
4
|
+
contractId: string;
|
|
5
|
+
targetRef: string;
|
|
6
|
+
}[]): Promise<{
|
|
7
|
+
status: "unknown" | "pass";
|
|
8
|
+
unknown: string[];
|
|
9
|
+
scope: string[];
|
|
10
|
+
message: string;
|
|
11
|
+
affectedFiles: string[];
|
|
12
|
+
contractIds: string[];
|
|
13
|
+
calls: {
|
|
14
|
+
file: string;
|
|
15
|
+
callee: string;
|
|
16
|
+
}[];
|
|
17
|
+
}>;
|
|
18
|
+
export declare function impactSeverity(risk: Risk, rule?: RulePolicy): Severity;
|
|
19
|
+
export declare const impactRemediation = "Review changed files, affected contracts and unresolved dependencies; complete the hashed source scope or supported mappings, then rerun check. Passing tests alone cannot resolve unknown impact.";
|
|
20
|
+
//# sourceMappingURL=impact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../src/impact.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,gBAAgB,EAAC,KAAK,IAAI,EAAC,KAAK,QAAQ,EAAC,KAAK,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAGxG,6EAA6E;AAC7E,wBAAsB,aAAa,CAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,SAAS,MAAM,EAAE,EAAC,KAAK,EAAC,SAAS,MAAM,EAAE,EAAC,OAAO,EAAC,SAAS,MAAM,EAAE,EAAC,QAAQ,EAAC,gBAAgB,EAAC,SAAS,EAAC,OAAO,EAAC,WAAW,GAAC,SAAS;IAAC,UAAU,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAA;CAAC,EAAK;;;;;;;;;;;GASpO;AACD,wBAAgB,cAAc,CAAC,IAAI,EAAC,IAAI,EAAC,IAAI,CAAC,EAAC,UAAU,GAAE,QAAQ,CAAoF;AACvJ,eAAO,MAAM,iBAAiB,uMAAqM,CAAC"}
|
package/dist/impact.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { analyzeImpact } from '@behavproof/contract-registry';
|
|
2
|
+
import { safeRead } from '@behavproof/core';
|
|
3
|
+
const isCode = (path) => /\.[cm]?[jt]sx?$/.test(path);
|
|
4
|
+
/** Static candidates and explicit unknowns; never behavioral equivalence. */
|
|
5
|
+
export async function currentImpact(root, inputs, files, changed, registry, diffKnown, claimScopes = []) {
|
|
6
|
+
const sources = {}, mappings = {};
|
|
7
|
+
for (const path of inputs.filter(isCode))
|
|
8
|
+
sources[path] = (await safeRead(root, path)).toString('utf8');
|
|
9
|
+
for (const c of registry.contracts) {
|
|
10
|
+
const path = c.sourceRef.replace(/:\d+(?::\d+)?$/, '');
|
|
11
|
+
(mappings[path] ??= []).push(c.id);
|
|
12
|
+
}
|
|
13
|
+
for (const s of claimScopes)
|
|
14
|
+
if (registry.contracts.some(c => c.id === s.contractId))
|
|
15
|
+
(mappings[s.targetRef.split('#')[0]] ??= []).push(s.contractId);
|
|
16
|
+
const result = analyzeImpact(sources, changed.filter(isCode), mappings);
|
|
17
|
+
const unknown = [...result.unknown, ...files.filter(path => isCode(path) && !inputs.includes(path)).map(path => `${path}: source is outside the hashed impact inventory`), ...changed.filter(path => isCode(path) && !Object.hasOwn(sources, path)).map(path => `${path}: changed/deleted source is unavailable to the current graph`), ...(!diffKnown ? ['Git comparison or tested-commit graph is unverified'] : [])].sort();
|
|
18
|
+
const noCodeChange = diffKnown && !changed.some(isCode);
|
|
19
|
+
return { ...result, status: noCodeChange || unknown.length === 0 ? 'pass' : 'unknown', unknown: noCodeChange ? [] : unknown, scope: inputs.filter(isCode), message: noCodeChange ? 'No code changes in the verified Git comparison' : unknown.length ? `Static impact is unresolved: ${unknown.join('; ')}` : 'Static dependency candidates resolved; behavioral equivalence is not established' };
|
|
20
|
+
}
|
|
21
|
+
export function impactSeverity(risk, rule) { return risk === 'critical' ? 'error' : rule?.severity ?? (risk === 'standard' ? 'warn' : 'off'); }
|
|
22
|
+
export const impactRemediation = 'Review changed files, affected contracts and unresolved dependencies; complete the hashed source scope or supported mappings, then rerun check. Passing tests alone cannot resolve unknown impact.';
|
|
23
|
+
//# sourceMappingURL=impact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.js","sourceRoot":"","sources":["../src/impact.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|