@intentset/verification 0.6.1 → 0.7.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.
Files changed (51) hide show
  1. package/README.md +50 -0
  2. package/dist/adapters/common.d.ts +16 -6
  3. package/dist/adapters/common.d.ts.map +1 -1
  4. package/dist/adapters/common.js +13 -8
  5. package/dist/adapters/common.js.map +1 -1
  6. package/dist/adapters/playwright.d.ts +3 -0
  7. package/dist/adapters/playwright.d.ts.map +1 -0
  8. package/dist/adapters/playwright.js +78 -0
  9. package/dist/adapters/playwright.js.map +1 -0
  10. package/dist/binding.d.ts +31 -0
  11. package/dist/binding.d.ts.map +1 -0
  12. package/dist/binding.js +46 -0
  13. package/dist/binding.js.map +1 -0
  14. package/dist/classify.d.ts +39 -7
  15. package/dist/classify.d.ts.map +1 -1
  16. package/dist/classify.js +208 -14
  17. package/dist/classify.js.map +1 -1
  18. package/dist/fixture.d.ts +18 -2
  19. package/dist/fixture.d.ts.map +1 -1
  20. package/dist/fixture.js +23 -3
  21. package/dist/fixture.js.map +1 -1
  22. package/dist/index.d.ts +4 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +4 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/records.d.ts +8 -1
  27. package/dist/records.d.ts.map +1 -1
  28. package/dist/records.js +24 -1
  29. package/dist/records.js.map +1 -1
  30. package/dist/report.d.ts.map +1 -1
  31. package/dist/report.js +4 -0
  32. package/dist/report.js.map +1 -1
  33. package/dist/stale.d.ts +65 -0
  34. package/dist/stale.d.ts.map +1 -0
  35. package/dist/stale.js +95 -0
  36. package/dist/stale.js.map +1 -0
  37. package/dist/subject.d.ts +130 -0
  38. package/dist/subject.d.ts.map +1 -0
  39. package/dist/subject.js +329 -0
  40. package/dist/subject.js.map +1 -0
  41. package/package.json +9 -2
  42. package/src/adapters/common.ts +26 -11
  43. package/src/adapters/playwright.ts +94 -0
  44. package/src/binding.ts +68 -0
  45. package/src/classify.ts +288 -14
  46. package/src/fixture.ts +36 -3
  47. package/src/index.ts +4 -0
  48. package/src/records.ts +40 -2
  49. package/src/report.ts +4 -0
  50. package/src/stale.ts +160 -0
  51. package/src/subject.ts +383 -0
package/dist/classify.js CHANGED
@@ -1,13 +1,15 @@
1
1
  /**
2
- * Evidence freshness (Core §8, invariant 3). Only a `pass` at the assessed
3
- * commit and graph hash is current; everything else is something else, and
4
- * says which. A failing run at the snapshot stays visible however many older
5
- * passes there are, because the status is decided by the latest run at the
6
- * snapshot and every run is kept in the history.
2
+ * Evidence freshness (Core §8, invariant 3). Only a `pass` whose binding holds
3
+ * is current: under commit binding, at the assessed commit and graph hash;
4
+ * under subject binding, while the subject it checked is unchanged. Everything
5
+ * else is something else, and says which. A failing current run stays visible
6
+ * however many older passes there are, because the status is decided by the
7
+ * latest current run and every run is kept in the history.
7
8
  */
8
- import { sortDiagnostics } from "@intentset/core";
9
+ import { sortDiagnostics, } from "@intentset/core";
9
10
  import { compareStrings, evidenceDiagnostic } from "./diagnostic.js";
10
11
  import { CURRENT, compareRecords } from "./records.js";
12
+ import { partsChangedAmong } from "./subject.js";
11
13
  export const EVIDENCE_STATUSES = [
12
14
  "current-pass",
13
15
  "current-fail",
@@ -18,6 +20,15 @@ export const EVIDENCE_STATUSES = [
18
20
  "unresolved",
19
21
  ];
20
22
  const NOTE_COMMIT_UNKNOWN = "commit unknown; matched on graph hash";
23
+ /** The most files EVID005 lists; the rest are counted. */
24
+ export const UNCLAIMED_LIMIT = 20;
25
+ /** The most verifications EVID006 lists, and the most files it lists for each resource; the rest are counted. */
26
+ export const UNEXERCISED_LIMIT = 20;
27
+ const UNEXERCISED_FILES = 5;
28
+ /** The most verifications EVID007 lists, and the most files it lists for each dependency slice; the rest are counted. */
29
+ export const DEPENDENCY_INTERNALS_LIMIT = 20;
30
+ const DEPENDENCY_INTERNALS_FILES = 5;
31
+ const short = (commit) => commit.slice(0, 9);
21
32
  /** Core §8: classify every verification in the graph against the snapshot. Deterministic for identical inputs. */
22
33
  export function classifyEvidence(graph, records, snapshot, options = {}) {
23
34
  const path = options.evidencePath ?? null;
@@ -69,14 +80,94 @@ export function classifyEvidence(graph, records, snapshot, options = {}) {
69
80
  }
70
81
  inScope.get(record.verificationId)?.push(record);
71
82
  }
83
+ const binding = snapshot.binding ?? "commit";
84
+ if (snapshot.bindingReason === "no-slices") {
85
+ diagnostics.push(evidenceDiagnostic({
86
+ code: "EVID004",
87
+ severity: "warning",
88
+ artifact: null,
89
+ path: null,
90
+ message: "No slice claims files, so there is no subject to bind evidence to: it is judged by commit binding (a record is current only at the assessed commit and graph hash).",
91
+ remediation: "Declare slices with claims (VSA §3) so evidence can stay current while its subject is unchanged, or set `evidence.binding: commit` in .intentset/config.yaml to choose this on purpose (Core §8).",
92
+ }));
93
+ }
72
94
  const verifications = {};
95
+ const unclaimed = new Set();
96
+ const unexercised = new Map();
97
+ const internals = new Map();
73
98
  for (const id of ids) {
74
99
  const artifact = graph.artifacts.get(id);
75
100
  const history = (inScope.get(id) ?? []).sort(compareRecords);
76
- verifications[id] = classifyOne(id, artifact?.meta.verification?.method ?? "automated", history, outOfScope.get(id) ?? 0, snapshot);
101
+ verifications[id] = classifyOne(id, artifact?.meta.verification?.method ?? "automated", history, outOfScope.get(id) ?? 0, snapshot, binding, unclaimed, unexercised, internals);
102
+ }
103
+ // A file of a resource EVID006 reports is not listed here as well: EVID006 says more (which verifications use it).
104
+ for (const entry of unexercised.values())
105
+ for (const file of entry.files)
106
+ unclaimed.delete(file);
107
+ if (unclaimed.size > 0) {
108
+ const files = [...unclaimed].sort(compareStrings);
109
+ const listed = files.slice(0, UNCLAIMED_LIMIT);
110
+ diagnostics.push(evidenceDiagnostic({
111
+ code: "EVID005",
112
+ severity: "warning",
113
+ artifact: null,
114
+ path: null,
115
+ message: `${files.length} file${files.length === 1 ? "" : "s"} changed since the commit of a subject-bound record and no slice claims, no exercised resource names and no global input lists ${files.length === 1 ? "it" : "them"}, so ${files.length === 1 ? "it" : "they"} cannot make any evidence stale: ${listed.join(", ")}${files.length > listed.length ? `, and ${files.length - listed.length} more` : ""}.`,
116
+ remediation: "Claim the file in a slice (the architecture check's unclaimed files rule), name its resource in a verification's `exercises`, or list it in `evidence.globalInputs` if it affects every check (Core §8).",
117
+ }));
118
+ }
119
+ if (unexercised.size > 0) {
120
+ const resources = [...unexercised].sort(([a], [b]) => compareStrings(a, b));
121
+ const all = new Set();
122
+ for (const [, entry] of resources)
123
+ for (const id of entry.verifications)
124
+ all.add(id);
125
+ const verifications = [...all].sort(compareStrings);
126
+ const listed = verifications.slice(0, UNEXERCISED_LIMIT);
127
+ const what = resources.map(([id, entry]) => {
128
+ const files = [...entry.files].sort(compareStrings);
129
+ const shown = files.slice(0, UNEXERCISED_FILES).join(", ");
130
+ return `${id} (${shown}${files.length > UNEXERCISED_FILES ? `, and ${files.length - UNEXERCISED_FILES} more` : ""})`;
131
+ });
132
+ diagnostics.push(evidenceDiagnostic({
133
+ code: "EVID006",
134
+ severity: "warning",
135
+ artifact: null,
136
+ path: null,
137
+ message: `${verifications.length} verification${verifications.length === 1 ? " is" : "s are"} current though a resource ${verifications.length === 1 ? "it uses" : "they use"} and ${verifications.length === 1 ? "does" : "do"} not exercise changed since the commit of ${verifications.length === 1 ? "its" : "their"} record: ${what.join("; ")}; ${listed.join(", ")}${verifications.length > listed.length ? `, and ${verifications.length - listed.length} more` : ""}.`,
138
+ remediation: "Where a check does depend on that resource, name it in the verification's `exercises` so a change to it makes the record stale, or set `evidence.resources: used` to hash every resource a slice lists (Core §8).",
139
+ }));
140
+ }
141
+ if (internals.size > 0) {
142
+ const slices = [...internals].sort(([a], [b]) => compareStrings(a, b));
143
+ const all = new Set();
144
+ for (const [, entry] of slices)
145
+ for (const id of entry.verifications)
146
+ all.add(id);
147
+ const verifications = [...all].sort(compareStrings);
148
+ const listed = verifications.slice(0, DEPENDENCY_INTERNALS_LIMIT);
149
+ const what = slices.map(([id, entry]) => {
150
+ const files = [...entry.files].sort(compareStrings);
151
+ const shown = files.slice(0, DEPENDENCY_INTERNALS_FILES).join(", ");
152
+ return `${id} (${shown}${files.length > DEPENDENCY_INTERNALS_FILES ? `, and ${files.length - DEPENDENCY_INTERNALS_FILES} more` : ""})`;
153
+ });
154
+ diagnostics.push(evidenceDiagnostic({
155
+ code: "EVID007",
156
+ severity: "warning",
157
+ artifact: null,
158
+ path: null,
159
+ message: `${verifications.length} verification${verifications.length === 1 ? " is" : "s are"} current though a slice ${verifications.length === 1 ? "it depends" : "they depend"} on changed outside its entrypoints and contracts since the commit of ${verifications.length === 1 ? "its" : "their"} record: ${what.join("; ")}; ${listed.join(", ")}${verifications.length > listed.length ? `, and ${verifications.length - listed.length} more` : ""}.`,
160
+ remediation: "Where a check does depend on that slice's internals, name the slice in the verification's `exercises` so a change to it makes the record stale, or set `evidence.dependencies: files` to hash every file a dependency claims (Core §8).",
161
+ }));
77
162
  }
78
163
  return {
79
- snapshot: { commit: snapshot.commit, graphHash: snapshot.graphHash, scope },
164
+ snapshot: {
165
+ commit: snapshot.commit,
166
+ graphHash: snapshot.graphHash,
167
+ scope,
168
+ binding,
169
+ bindingReason: snapshot.bindingReason ?? "configured",
170
+ },
80
171
  verifications,
81
172
  ignoredOutOfScope,
82
173
  unknown,
@@ -88,9 +179,10 @@ export function classifyEvidence(graph, records, snapshot, options = {}) {
88
179
  export function atSnapshot(record, snapshot) {
89
180
  return record.graphHash === snapshot.graphHash && (snapshot.commit === null || record.commit === snapshot.commit);
90
181
  }
91
- function classifyOne(verificationId, method, history, outOfScope, snapshot) {
182
+ function classifyOne(verificationId, method, history, outOfScope, snapshot, binding, unclaimed, unexercised, internals) {
92
183
  const counts = { pass: 0, fail: 0, skip: 0, error: 0 };
93
- const base = { verificationId, method, history, atSnapshot: counts, outOfScope };
184
+ const subjectHash = binding === "subject" ? (snapshot.subjects?.get(verificationId)?.hash ?? null) : null;
185
+ const base = { verificationId, method, binding, subject: subjectHash, history, atSnapshot: counts, outOfScope };
94
186
  const ignored = outOfScope > 0 ? `${outOfScope} record${outOfScope === 1 ? "" : "s"} for another product or release ignored` : null;
95
187
  if (history.length === 0) {
96
188
  return withNote({ ...base, status: "missing", latest: null }, [ignored]);
@@ -103,23 +195,125 @@ function classifyOne(verificationId, method, history, outOfScope, snapshot) {
103
195
  ignored,
104
196
  ]);
105
197
  }
106
- const current = history.filter((record) => atSnapshot(record, snapshot));
198
+ const subject = snapshot.subjects?.get(verificationId);
199
+ if (binding === "subject" && subject === undefined) {
200
+ return withNote({ ...base, status: "unresolved", latest: history[history.length - 1] }, [
201
+ "subject binding is in force but no subject could be computed for this verification",
202
+ ignored,
203
+ ]);
204
+ }
205
+ const current = binding === "subject"
206
+ ? history.filter((record) => record.binding === "subject" && record.subjectHash === subject?.hash)
207
+ : history.filter((record) => record.binding !== "subject" && atSnapshot(record, snapshot));
107
208
  for (const record of current)
108
209
  counts[record.result]++;
109
210
  if (current.length === 0) {
110
- return withNote({ ...base, status: "stale", latest: history[history.length - 1] }, [ignored]);
211
+ const latest = history[history.length - 1];
212
+ return withNote({ ...base, status: "stale", latest }, [staleNote(latest, binding, subject, snapshot), ignored]);
111
213
  }
112
214
  const latest = current[current.length - 1];
113
215
  const status = latest.result === "pass" ? "current-pass" : latest.result === "fail" ? "current-fail" : latest.result;
114
- return withNote({ ...base, status, latest }, [snapshot.commit === null ? NOTE_COMMIT_UNKNOWN : null, ignored]);
216
+ const notes = [];
217
+ if (binding === "subject") {
218
+ const unlisted = collectUnclaimed(latest, snapshot, unclaimed);
219
+ collectUnexercised(verificationId, latest, subject, snapshot, unexercised);
220
+ collectInternals(verificationId, latest, subject, snapshot, internals);
221
+ notes.push(`judged by subject binding; the run was at commit ${short(latest.commit)}${unlisted}`);
222
+ }
223
+ else if (snapshot.commit === null)
224
+ notes.push(NOTE_COMMIT_UNKNOWN);
225
+ notes.push(ignored);
226
+ return withNote({ ...base, status, latest }, notes);
227
+ }
228
+ /** Why the latest record is not current under the binding in force, with what moved when that can be said. */
229
+ function staleNote(latest, binding, subject, snapshot) {
230
+ if (binding === "commit") {
231
+ return latest.binding === "subject"
232
+ ? "latest record is bound to a subject, not to a commit; a gate that asks for commit binding needs a run imported at this commit with commit binding"
233
+ : null;
234
+ }
235
+ if (latest.binding !== "subject") {
236
+ return `latest record is bound to commit ${short(latest.commit)}, not to a subject, so subject binding judges it stale; it can be re-imported to bind it to the subject`;
237
+ }
238
+ if (snapshot.changedSince === undefined || subject === undefined)
239
+ return "the subject changed since the run";
240
+ const changed = snapshot.changedSince(latest.commit);
241
+ if (changed === null) {
242
+ return `the subject changed since the run; which part moved is unknown, because commit ${short(latest.commit)} is not an ancestor of the assessed commit or git is unavailable`;
243
+ }
244
+ const parts = partsChangedAmong(subject, new Set(changed));
245
+ return parts.length === 0
246
+ ? `the subject changed since the run at commit ${short(latest.commit)}, in a part no changed file names (a file that left the subject, or a record moved)`
247
+ : `the subject changed since the run at commit ${short(latest.commit)}: ${parts.slice(0, 5).join(", ")}${parts.length > 5 ? `, and ${parts.length - 5} more` : ""}`;
248
+ }
249
+ /** Collects what changed outside every subject since a current record's commit (EVID005), and says when that cannot be known. */
250
+ function collectUnclaimed(latest, snapshot, unclaimed) {
251
+ if (snapshot.changedSince === undefined || snapshot.covers === undefined)
252
+ return "";
253
+ const changed = snapshot.changedSince(latest.commit);
254
+ if (changed === null) {
255
+ return `; files changed since then could not be listed, because the commit is not an ancestor of the assessed commit or git is unavailable`;
256
+ }
257
+ for (const path of changed)
258
+ if (!snapshot.covers(path))
259
+ unclaimed.add(path);
260
+ return "";
261
+ }
262
+ /**
263
+ * Collects the resources a current record's verification uses without exercising (EVID006) whose files changed since
264
+ * the record's commit: the subject cannot see them, so the record stays current, and the report says so. It asks for
265
+ * the same `changedSince` as EVID005, and has nothing to say when that cannot be answered (EVID005's note says so).
266
+ */
267
+ function collectUnexercised(verificationId, latest, subject, snapshot, unexercised) {
268
+ if (snapshot.changedSince === undefined || subject === undefined || subject.unexercised.length === 0)
269
+ return;
270
+ const changed = snapshot.changedSince(latest.commit);
271
+ if (changed === null || changed.length === 0)
272
+ return;
273
+ const moved = new Set(changed);
274
+ for (const resource of subject.unexercised) {
275
+ const files = resource.files.filter((path) => moved.has(path));
276
+ if (files.length === 0)
277
+ continue;
278
+ const entry = unexercised.get(resource.id) ?? { files: new Set(), verifications: new Set() };
279
+ for (const path of files)
280
+ entry.files.add(path);
281
+ entry.verifications.add(verificationId);
282
+ unexercised.set(resource.id, entry);
283
+ }
284
+ }
285
+ /**
286
+ * Collects the dependency slices a current record's verification counts only through their entrypoints and contracts
287
+ * (EVID007) whose other files changed since the record's commit: the subject cannot see them, so the record stays
288
+ * current, and the report says so. Like EVID006 it has nothing to say when git cannot answer.
289
+ */
290
+ function collectInternals(verificationId, latest, subject, snapshot, internals) {
291
+ if (snapshot.changedSince === undefined || subject === undefined || subject.dependencyInternals.length === 0)
292
+ return;
293
+ const changed = snapshot.changedSince(latest.commit);
294
+ if (changed === null || changed.length === 0)
295
+ return;
296
+ const moved = new Set(changed);
297
+ for (const slice of subject.dependencyInternals) {
298
+ const files = slice.files.filter((path) => moved.has(path));
299
+ if (files.length === 0)
300
+ continue;
301
+ const entry = internals.get(slice.id) ?? { files: new Set(), verifications: new Set() };
302
+ for (const path of files)
303
+ entry.files.add(path);
304
+ entry.verifications.add(verificationId);
305
+ internals.set(slice.id, entry);
306
+ }
115
307
  }
116
308
  function withNote(evidence, notes) {
117
309
  const present = notes.filter((note) => note !== null);
118
- const { verificationId, method, status, latest, history, atSnapshot: counts, outOfScope } = evidence;
310
+ const { verificationId, method, binding, subject, status, latest, history, atSnapshot: counts, outOfScope, } = evidence;
119
311
  return {
120
312
  verificationId,
121
313
  method,
122
314
  status,
315
+ binding,
316
+ subject,
123
317
  ...(present.length > 0 ? { note: present.join("; ") } : {}),
124
318
  latest,
125
319
  history,
@@ -1 +1 @@
1
- {"version":3,"file":"classify.js","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"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"}
package/dist/fixture.d.ts CHANGED
@@ -12,9 +12,19 @@
12
12
  * 4. Check locators against the tree's paths (documents and sources) only
13
13
  * when the case supplies `sources`; a case without them has no tree to
14
14
  * check against, and its locators are reported unresolved instead.
15
- * 5. The case's diagnostics are validation's plus the reader's plus the check's.
15
+ * 5. Decide the binding (`resolveBinding`): the case's `.intentset/config.yaml`
16
+ * `evidence.binding`, else subject where the graph has slice claims, else
17
+ * commit with EVID004. Under subject binding the driver resolves what the
18
+ * architecture package knows (claimed files, import closures) over the
19
+ * tree of documents and sources into a `SubjectSource`, and every
20
+ * verification's subject is computed from it (`subjectsFor`).
21
+ * 6. The case's `changedSince`, when it has one, answers the question git
22
+ * would: the files changed between a record's commit and the snapshot.
23
+ * A commit it does not list is one that is not an ancestor.
24
+ * 7. The case's diagnostics are validation's plus the reader's plus the check's.
16
25
  */
17
- import { type Diagnostic, type Graph, type Level } from "@intentset/core";
26
+ import { type Diagnostic, type EvidenceBinding, type Graph, type Level } from "@intentset/core";
27
+ import { type SubjectSource } from "./binding.ts";
18
28
  import { type EvidenceCheck } from "./check.ts";
19
29
  import type { EvidenceSnapshot } from "./classify.ts";
20
30
  export declare const FIXTURE_EVIDENCE_PATH = "evidence.json";
@@ -33,6 +43,12 @@ export interface FixtureEvidenceInput {
33
43
  documents: Iterable<string>;
34
44
  /** Paths of the case's `sources`. */
35
45
  sources: Iterable<string>;
46
+ /** `evidence.binding` of the case's configuration; null or absent when it states none. */
47
+ configuredBinding?: EvidenceBinding | null;
48
+ /** What the architecture package resolved over the tree; needed only when the binding in force is subject. */
49
+ subjectSource?: SubjectSource;
50
+ /** The case's `changedSince`: for a commit, the files changed between it and the snapshot. */
51
+ changedSince?: Readonly<Record<string, readonly string[]>>;
36
52
  }
37
53
  export interface FixtureEvidenceRun extends EvidenceCheck {
38
54
  snapshot: EvidenceSnapshot;
@@ -1 +1 @@
1
- {"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,KAAK,EAAa,KAAK,KAAK,EAAmB,MAAM,iBAAiB,CAAC;AACtG,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItD,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,yDAAyD;IACzD,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,mEAAmE;IACnE,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACvD,8CAA8C;IAC9C,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,qCAAqC;IACrC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,sGAAsG;IACtG,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,GAAG,kBAAkB,CAmBpF"}
1
+ {"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EACL,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,KAAK,EAEV,KAAK,KAAK,EAEX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAkC,KAAK,aAAa,EAAe,MAAM,cAAc,CAAC;AAC/F,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItD,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,yDAAyD;IACzD,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,mEAAmE;IACnE,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACvD,8CAA8C;IAC9C,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,qCAAqC;IACrC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,0FAA0F;IAC1F,iBAAiB,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3C,8GAA8G;IAC9G,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,8FAA8F;IAC9F,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,sGAAsG;IACtG,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,GAAG,kBAAkB,CA6BpF"}
package/dist/fixture.js CHANGED
@@ -12,19 +12,39 @@
12
12
  * 4. Check locators against the tree's paths (documents and sources) only
13
13
  * when the case supplies `sources`; a case without them has no tree to
14
14
  * check against, and its locators are reported unresolved instead.
15
- * 5. The case's diagnostics are validation's plus the reader's plus the check's.
15
+ * 5. Decide the binding (`resolveBinding`): the case's `.intentset/config.yaml`
16
+ * `evidence.binding`, else subject where the graph has slice claims, else
17
+ * commit with EVID004. Under subject binding the driver resolves what the
18
+ * architecture package knows (claimed files, import closures) over the
19
+ * tree of documents and sources into a `SubjectSource`, and every
20
+ * verification's subject is computed from it (`subjectsFor`).
21
+ * 6. The case's `changedSince`, when it has one, answers the question git
22
+ * would: the files changed between a record's commit and the snapshot.
23
+ * A commit it does not list is one that is not an ancestor.
24
+ * 7. The case's diagnostics are validation's plus the reader's plus the check's.
16
25
  */
17
- import { graphHash, sortDiagnostics } from "@intentset/core";
26
+ import { graphHash, sortDiagnostics, } from "@intentset/core";
27
+ import { hasSliceClaims, resolveBinding, subjectsFor } from "./binding.js";
18
28
  import { checkEvidence } from "./check.js";
19
29
  import { bindPlaceholders, FIXTURE_COMMIT, requestedScope } from "./placeholders.js";
20
30
  import { readRunRecords } from "./records.js";
21
31
  export const FIXTURE_EVIDENCE_PATH = "evidence.json";
22
32
  export function checkFixtureEvidence(input) {
23
- const snapshot = {
33
+ const decision = resolveBinding(input.configuredBinding ?? null, hasSliceClaims(input.graph));
34
+ const base = {
24
35
  commit: FIXTURE_COMMIT,
25
36
  graphHash: graphHash(input.graph),
26
37
  scope: requestedScope(input.request),
27
38
  };
39
+ const snapshot = { ...base, binding: decision.binding, bindingReason: decision.reason };
40
+ if (decision.binding === "subject" && input.subjectSource !== undefined) {
41
+ snapshot.subjects = subjectsFor(input.graph, input.subjectSource);
42
+ snapshot.covers = input.subjectSource.covers;
43
+ if (input.changedSince !== undefined) {
44
+ const changed = input.changedSince;
45
+ snapshot.changedSince = (commit) => changed[commit] ?? null;
46
+ }
47
+ }
28
48
  const read = readRunRecords(bindPlaceholders(input.evidence, snapshot), FIXTURE_EVIDENCE_PATH);
29
49
  const sources = [...input.sources];
30
50
  const files = sources.length > 0 ? new Set([...input.documents, ...sources]) : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"fixture.js","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAA+B,SAAS,EAAc,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACtG,OAAO,EAAsB,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAsBrD,MAAM,UAAU,oBAAoB,CAAC,KAA2B;IAC9D,MAAM,QAAQ,GAAqB;QACjC,MAAM,EAAE,cAAc;QACtB,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QACjC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;KACrC,CAAC;IACF,MAAM,IAAI,GAAG,cAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAC/F,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE;QACjE,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK;QACL,YAAY,EAAE,qBAAqB;KACpC,CAAC,CAAC;IACH,OAAO;QACL,GAAG,OAAO;QACV,QAAQ;QACR,WAAW,EAAE,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;KAC5E,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"fixture.js","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAIL,SAAS,EAET,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAsB,WAAW,EAAE,MAAM,cAAc,CAAC;AAC/F,OAAO,EAAsB,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AA4BrD,MAAM,UAAU,oBAAoB,CAAC,KAA2B;IAC9D,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,iBAAiB,IAAI,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9F,MAAM,IAAI,GAAqB;QAC7B,MAAM,EAAE,cAAc;QACtB,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QACjC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;KACrC,CAAC;IACF,MAAM,QAAQ,GAAqB,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC1G,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACxE,QAAQ,CAAC,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QAClE,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;QAC7C,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC;YACnC,QAAQ,CAAC,YAAY,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,cAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAC/F,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE;QACjE,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK;QACL,YAAY,EAAE,qBAAqB;KACpC,CAAC,CAAC;IACH,OAAO;QACL,GAAG,OAAO;QACV,QAAQ;QACR,WAAW,EAAE,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;KAC5E,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,7 +6,9 @@
6
6
  */
7
7
  export * from "./adapters/common.ts";
8
8
  export * from "./adapters/node-test.ts";
9
+ export * from "./adapters/playwright.ts";
9
10
  export * from "./adapters/vitest.ts";
11
+ export * from "./binding.ts";
10
12
  export * from "./check.ts";
11
13
  export * from "./classify.ts";
12
14
  export * from "./coverage.ts";
@@ -14,4 +16,6 @@ export * from "./fixture.ts";
14
16
  export * from "./placeholders.ts";
15
17
  export * from "./records.ts";
16
18
  export * from "./report.ts";
19
+ export * from "./stale.ts";
20
+ export * from "./subject.ts";
17
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -6,7 +6,9 @@
6
6
  */
7
7
  export * from "./adapters/common.js";
8
8
  export * from "./adapters/node-test.js";
9
+ export * from "./adapters/playwright.js";
9
10
  export * from "./adapters/vitest.js";
11
+ export * from "./binding.js";
10
12
  export * from "./check.js";
11
13
  export * from "./classify.js";
12
14
  export * from "./coverage.js";
@@ -14,4 +16,6 @@ export * from "./fixture.js";
14
16
  export * from "./placeholders.js";
15
17
  export * from "./records.js";
16
18
  export * from "./report.js";
19
+ export * from "./stale.js";
20
+ export * from "./subject.js";
17
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
package/dist/records.d.ts CHANGED
@@ -12,12 +12,15 @@
12
12
  import { type Diagnostic } from "@intentset/core";
13
13
  export declare const RUN_RESULTS: readonly ["pass", "fail", "skip", "error"];
14
14
  export type RunResult = (typeof RUN_RESULTS)[number];
15
+ /** What a record is bound to (Core §8): the subject the run checked, or the commit and graph hash it ran at. */
16
+ export declare const RUN_BINDINGS: readonly ["subject", "commit"];
17
+ export type RunBinding = (typeof RUN_BINDINGS)[number];
15
18
  /** The literal a fixture writes for "the snapshot's commit" or "the snapshot's graph hash". */
16
19
  export declare const CURRENT = "@current";
17
20
  export interface RunScope {
18
21
  /** The product's artifact ID. */
19
22
  product: string;
20
- /** The exact release label; v0.1 matches release labels exactly (Core §7). */
23
+ /** The exact release label; v0.2 matches release labels exactly (Core §7). */
21
24
  release: string;
22
25
  }
23
26
  export interface RunTool {
@@ -42,6 +45,10 @@ export interface RunRecord {
42
45
  finishedAt: string;
43
46
  result: RunResult;
44
47
  uri: string;
48
+ /** Absent means commit binding, as every record written before the field existed. */
49
+ binding?: RunBinding;
50
+ /** SHA-256 of the subject the run checked (subject.ts); present on every subject-binding record. */
51
+ subjectHash?: string;
45
52
  rationale?: string;
46
53
  /** Namespaced extensions (`org.example/key`), preserved and never interpreted. */
47
54
  extensions?: Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../src/records.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAiB,KAAK,UAAU,EAA+B,MAAM,iBAAiB,CAAC;AAG9F,eAAO,MAAM,WAAW,YAAI,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AACtE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,+FAA+F;AAC/F,eAAO,MAAM,OAAO,aAAa,CAAC;AAElC,MAAM,WAAW,QAAQ;IACvB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,6EAA6E;AAC7E,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,wGAAwG;IACxG,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,CAAC;IAChB,uGAAuG;IACvG,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,6GAA6G;IAC7G,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAwBD,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAQ9D;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAMjE;AAED,MAAM,WAAW,cAAc;IAC7B,2FAA2F;IAC3F,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,8CAA8C;IAC9C,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAwC1E"}
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../src/records.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAiB,KAAK,UAAU,EAA+B,MAAM,iBAAiB,CAAC;AAG9F,eAAO,MAAM,WAAW,YAAI,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AACtE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,gHAAgH;AAChH,eAAO,MAAM,YAAY,YAAI,SAAS,EAAE,QAAQ,CAAU,CAAC;AAC3D,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,+FAA+F;AAC/F,eAAO,MAAM,OAAO,aAAa,CAAC;AAElC,MAAM,WAAW,QAAQ;IACvB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,6EAA6E;AAC7E,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,wGAAwG;IACxG,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,CAAC;IAChB,uGAAuG;IACvG,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,6GAA6G;IAC7G,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,oGAAoG;IACpG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAwBD,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAQ9D;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAMjE;AAED,MAAM,WAAW,cAAc;IAC7B,2FAA2F;IAC3F,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,8CAA8C;IAC9C,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAwC1E"}
package/dist/records.js CHANGED
@@ -12,6 +12,8 @@
12
12
  import { canonicalJson, ID_PATTERN, sortDiagnostics } from "@intentset/core";
13
13
  import { compareStrings, evidenceDiagnostic, pointerToken } from "./diagnostic.js";
14
14
  export const RUN_RESULTS = ["pass", "fail", "skip", "error"];
15
+ /** What a record is bound to (Core §8): the subject the run checked, or the commit and graph hash it ran at. */
16
+ export const RUN_BINDINGS = ["subject", "commit"];
15
17
  /** The literal a fixture writes for "the snapshot's commit" or "the snapshot's graph hash". */
16
18
  export const CURRENT = "@current";
17
19
  const REQUIRED = [
@@ -28,7 +30,7 @@ const REQUIRED = [
28
30
  "result",
29
31
  "uri",
30
32
  ];
31
- const KNOWN = new Set([...REQUIRED, "rationale", "extensions"]);
33
+ const KNOWN = new Set([...REQUIRED, "binding", "subjectHash", "rationale", "extensions"]);
32
34
  const TIMESTAMP = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,9}))?Z$/;
33
35
  const GRAPH_HASH = /^[0-9a-f]{64}$/;
34
36
  const NO_SPACE = /^\S+$/;
@@ -169,6 +171,23 @@ function readRecord(entry, index, problems) {
169
171
  else
170
172
  problem("result", `\`result\` of run record ${index} must be pass, fail, skip or error, but it is ${describe(entry.result)}.`, "Record one of the four results; anything else is not evidence (Core §8).");
171
173
  }
174
+ let binding;
175
+ if (Object.hasOwn(entry, "binding")) {
176
+ if (RUN_BINDINGS.includes(entry.binding))
177
+ binding = entry.binding;
178
+ else
179
+ problem("binding", `\`binding\` of run record ${index} must be subject or commit, but it is ${describe(entry.binding)}.`, "Write `binding: subject` for a record bound to its subject, or leave it out for a commit-binding record (Core §8).");
180
+ }
181
+ let subjectHash;
182
+ if (Object.hasOwn(entry, "subjectHash")) {
183
+ if (typeof entry.subjectHash === "string" && GRAPH_HASH.test(entry.subjectHash))
184
+ subjectHash = entry.subjectHash;
185
+ else
186
+ problem("subjectHash", `\`subjectHash\` of run record ${index} must be 64 lowercase hex characters, but it is ${describe(entry.subjectHash)}.`, "Record the subject hash `intentset evidence import` computed for the verification (Core §8).");
187
+ }
188
+ if (binding === "subject" && !Object.hasOwn(entry, "subjectHash")) {
189
+ problem("subjectHash", `Run record ${index} has binding subject but no \`subjectHash\`, so nothing says what it was bound to.`, "Add the subject hash, or leave `binding` out to make it a commit-binding record (Core §8).");
190
+ }
172
191
  let rationale;
173
192
  if (Object.hasOwn(entry, "rationale")) {
174
193
  if (typeof entry.rationale === "string" && /\S/.test(entry.rationale))
@@ -222,6 +241,10 @@ function readRecord(entry, index, problems) {
222
241
  result: result,
223
242
  uri: uri,
224
243
  };
244
+ if (binding !== undefined)
245
+ record.binding = binding;
246
+ if (subjectHash !== undefined)
247
+ record.subjectHash = subjectHash;
225
248
  if (rationale !== undefined)
226
249
  record.rationale = rationale;
227
250
  if (extensions !== undefined)