@intentset/verification 0.6.1 → 0.7.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.
Files changed (51) hide show
  1. package/README.md +50 -0
  2. package/dist/adapters/common.d.ts +6 -0
  3. package/dist/adapters/common.d.ts.map +1 -1
  4. package/dist/adapters/common.js +2 -0
  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 +35 -7
  15. package/dist/classify.d.ts.map +1 -1
  16. package/dist/classify.js +104 -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 +92 -0
  38. package/dist/subject.d.ts.map +1 -0
  39. package/dist/subject.js +247 -0
  40. package/dist/subject.js.map +1 -0
  41. package/package.json +9 -2
  42. package/src/adapters/common.ts +8 -0
  43. package/src/adapters/playwright.ts +94 -0
  44. package/src/binding.ts +68 -0
  45. package/src/classify.ts +165 -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 +277 -0
package/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # @intentset/verification
2
+
3
+ Run records and what they prove (Core §8): reading and checking records, classifying each as current, stale or
4
+ missing against the snapshot it ran at, coverage that counts links and current passes separately, and adapters that
5
+ turn a Vitest JSON report or node's TAP output into records.
6
+
7
+ ## Install
8
+
9
+ ```sh
10
+ npm install @intentset/verification
11
+ pnpm add @intentset/verification
12
+ ```
13
+
14
+ ## Example
15
+
16
+ In CI, after the tests, turn the report into run records bound to this commit and graph, through the CLI,
17
+ `@intentset/cli`:
18
+
19
+ ```sh
20
+ npx -p @intentset/cli intentset evidence import --from vitest reports/vitest.json \
21
+ --out .intentset/evidence/ci.json --product PRD-X --release <label>
22
+ npx -p @intentset/cli intentset validate --level L3 --product PRD-X --release <label>
23
+ ```
24
+
25
+ With pnpm, `pnpm dlx --package=@intentset/cli intentset …`, or `pnpm exec intentset …` once `@intentset/cli` is
26
+ installed. The command is always `@intentset/cli`'s: this package has no `intentset` binary, and npx asked
27
+ for `intentset` alone would fetch an unrelated unscoped package from the registry.
28
+
29
+ From code:
30
+
31
+ ```ts
32
+ import { readFile } from "node:fs/promises";
33
+ import { readRunRecords } from "@intentset/verification";
34
+
35
+ const path = ".intentset/evidence/ci.json";
36
+ const { records, diagnostics } = readRunRecords(JSON.parse(await readFile(path, "utf8")), path);
37
+ // a record with any problem is reported as EVID001 and left out, so it never counts as evidence
38
+ ```
39
+
40
+ Only a `pass` whose binding holds is current. Under subject binding, the default where slices claim files, a record carries the hash of its verification's subject (`computeSubject`) and stays current while that is unchanged; under commit binding, which a repository or a gate asks for, it is current only at the assessed commit and graph hash. Keep run records out of the commit they assess.
41
+
42
+ ## Learn more
43
+
44
+ Part of [Intentset](https://intentset.org/), which keeps product intent connected to the code that delivers it and the
45
+ checks that verify it, as readable Markdown files in a repository. The specifications are at
46
+ https://intentset.org/specifications/ and the source at https://github.com/intentset/intentset.
47
+
48
+ ## Licence
49
+
50
+ MIT
@@ -23,6 +23,12 @@ export interface ToRunRecordsOptions {
23
23
  finishedAt: string;
24
24
  /** Where the run's report lives; each record's uri is this plus `#` and the verification ID. */
25
25
  uriBase: string;
26
+ /**
27
+ * Verification ID -> the hash of its subject, when the effective binding is subject (Core §8): a record is then
28
+ * written with `binding: "subject"` and that hash, and the commit and graph hash stay as provenance. A
29
+ * verification with no entry, or no map at all, gets a commit-binding record.
30
+ */
31
+ subjects?: ReadonlyMap<string, string>;
26
32
  }
27
33
  export interface ConvertedRun {
28
34
  /** One record per verification at least one test matched, by verification ID. */
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/adapters/common.ts"],"names":[],"mappings":"AAQA,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAE5G,MAAM,WAAW,UAAU;IACzB,yGAAyG;IACzG,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,iGAAiG;IACjG,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,6EAA6E;IAC7E,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,iFAAiF;IACjF,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,+GAA+G;IAC/G,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAKD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAYxE;AAED,8HAA8H;AAC9H,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AAED,wEAAwE;AACxE,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,SAAS,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAiD1F"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/adapters/common.ts"],"names":[],"mappings":"AAQA,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAE5G,MAAM,WAAW,UAAU;IACzB,yGAAyG;IACzG,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,iGAAiG;IACjG,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,6EAA6E;IAC7E,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,iFAAiF;IACjF,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,+GAA+G;IAC/G,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAKD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAYxE;AAED,8HAA8H;AAC9H,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AAED,wEAAwE;AACxE,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,SAAS,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAmD1F"}
@@ -70,6 +70,7 @@ export function toRunRecords(parsed, options) {
70
70
  .map(([r, n]) => `${n} ${r}`)
71
71
  .join(", ");
72
72
  const names = [...selectors].sort(compareStrings).join(", ");
73
+ const subjectHash = options.subjects?.get(verificationId);
73
74
  records.push({
74
75
  evidenceId: deriveEvidenceId(verificationId, options.commit, options.graphHash, options.finishedAt),
75
76
  verificationId,
@@ -83,6 +84,7 @@ export function toRunRecords(parsed, options) {
83
84
  finishedAt: options.finishedAt,
84
85
  result,
85
86
  uri: `${options.uriBase}#${encodeURIComponent(verificationId)}`,
87
+ ...(subjectHash === undefined ? {} : { binding: "subject", subjectHash }),
86
88
  rationale: `${results.length} test${results.length === 1 ? "" : "s"} matched ${names}: ${counts}.`,
87
89
  });
88
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/adapters/common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/adapters/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ParsedRun } from "./common.ts";
2
+ export declare function parsePlaywrightJson(json: unknown): ParsedRun;
3
+ //# sourceMappingURL=playwright.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../src/adapters/playwright.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,aAAa,CAAC;AAEzD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAgB5D"}
@@ -0,0 +1,78 @@
1
+ export function parsePlaywrightJson(json) {
2
+ if (!isRecord(json) || !Array.isArray(json.suites)) {
3
+ throw new TypeError("This is not Playwright JSON reporter output: expected an object with a suites array.");
4
+ }
5
+ const tests = [];
6
+ const problems = [];
7
+ if (Array.isArray(json.errors)) {
8
+ for (const error of json.errors) {
9
+ problems.push(`The run reported an error: ${firstLine(isRecord(error) ? error.message : error) || "no message"}`);
10
+ }
11
+ }
12
+ json.suites.forEach((file, index) => {
13
+ if (!isRecord(file))
14
+ throw new TypeError(`suites[${index}] is not an object.`);
15
+ walk(file, [], tests, problems);
16
+ });
17
+ return { tests, problems };
18
+ }
19
+ function walk(suite, ancestors, tests, problems) {
20
+ for (const spec of Array.isArray(suite.specs) ? suite.specs : []) {
21
+ if (!isRecord(spec))
22
+ throw new TypeError("A spec in the report is not an object.");
23
+ const title = typeof spec.title === "string" ? spec.title : "";
24
+ const fullName = [...ancestors, title].join(" > ");
25
+ for (const test of Array.isArray(spec.tests) ? spec.tests : []) {
26
+ if (!isRecord(test))
27
+ throw new TypeError(`${fullName} has a test entry that is not an object.`);
28
+ const result = resultOf(test, fullName, problems);
29
+ tests.push({ fullName, result, durationMs: durationOf(test) });
30
+ }
31
+ }
32
+ for (const child of Array.isArray(suite.suites) ? suite.suites : []) {
33
+ if (!isRecord(child))
34
+ throw new TypeError("A suite in the report is not an object.");
35
+ const title = typeof child.title === "string" ? child.title : "";
36
+ walk(child, title === "" ? ancestors : [...ancestors, title], tests, problems);
37
+ }
38
+ }
39
+ function resultOf(test, fullName, problems) {
40
+ switch (test.status) {
41
+ case "expected":
42
+ case "flaky":
43
+ return "pass";
44
+ case "skipped":
45
+ return "skip";
46
+ case "unexpected":
47
+ return failureKind(lastResult(test));
48
+ default:
49
+ problems.push(`${fullName} has the unknown status ${JSON.stringify(test.status)}, read as error`);
50
+ return "error";
51
+ }
52
+ }
53
+ /** A timeout or an interrupted run is an error; an assertion that did not hold is a fail; anything else thrown is an error. */
54
+ function failureKind(last) {
55
+ if (last === undefined)
56
+ return "fail";
57
+ if (last.status === "timedOut" || last.status === "interrupted")
58
+ return "error";
59
+ const error = isRecord(last.error) ? last.error : undefined;
60
+ const message = typeof error?.message === "string" ? error.message : "";
61
+ return /\bexpect\(|AssertionError/.test(message) || message === "" ? "fail" : "error";
62
+ }
63
+ function lastResult(test) {
64
+ const results = Array.isArray(test.results) ? test.results : [];
65
+ const last = results[results.length - 1];
66
+ return isRecord(last) ? last : undefined;
67
+ }
68
+ function durationOf(test) {
69
+ const duration = lastResult(test)?.duration;
70
+ return typeof duration === "number" && Number.isFinite(duration) ? duration : null;
71
+ }
72
+ function firstLine(value) {
73
+ return typeof value === "string" ? (value.trim().split("\n")[0] ?? "") : "";
74
+ }
75
+ function isRecord(value) {
76
+ return typeof value === "object" && value !== null && !Array.isArray(value);
77
+ }
78
+ //# sourceMappingURL=playwright.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.js","sourceRoot":"","sources":["../../src/adapters/playwright.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Which binding judges run evidence (Core §8, ADR 0013) and the subjects it
3
+ * needs. The decision is pure: the repository's configuration and whether it
4
+ * has slice claims. Computing a subject needs what the architecture package
5
+ * resolves (claimed files, import closures), which this package does not
6
+ * depend on, so a caller hands it in as a `SubjectSource`.
7
+ */
8
+ import type { EvidenceBinding, EvidenceBindingReason, Graph } from "@intentset/core";
9
+ import { type Subject, type SubjectInput } from "./subject.ts";
10
+ export interface BindingDecision {
11
+ binding: EvidenceBinding;
12
+ /** `configured`, `default` (subject, since slices exist) or `no-slices` (commit, since there is nothing to hash). */
13
+ reason: EvidenceBindingReason;
14
+ }
15
+ /**
16
+ * Core §8: `binding: subject` is the default wherever the repository has slice
17
+ * claims; `binding: commit` is the stricter mode a repository or gate asks
18
+ * for; a repository with no slice claims is judged by commit binding unless it
19
+ * asked for that, and says so (EVID004), whatever it asked for.
20
+ */
21
+ export declare function resolveBinding(configured: EvidenceBinding | null, hasSlices: boolean): BindingDecision;
22
+ /** True when some slice that is not retired claims files: the repository has a subject to hash. */
23
+ export declare function hasSliceClaims(graph: Graph): boolean;
24
+ /** What a caller resolves for the subject hash: the architecture package's claims and imports, over one tree. */
25
+ export type SubjectSource = Omit<SubjectInput, "graph" | "verificationId"> & {
26
+ /** True for a file that can move some subject: a slice's, a used resource's, a global input, a test, a record. */
27
+ covers: (path: string) => boolean;
28
+ };
29
+ /** The subject of every verification in the graph, by ID, with each file hashed once. */
30
+ export declare function subjectsFor(graph: Graph, source: SubjectSource): Map<string, Subject>;
31
+ //# sourceMappingURL=binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAErF,OAAO,EAA0B,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAGvF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,eAAe,CAAC;IACzB,qHAAqH;IACrH,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,EAAE,SAAS,EAAE,OAAO,GAAG,eAAe,CAItG;AAED,mGAAmG;AACnG,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAUpD;AAED,iHAAiH;AACjH,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,gBAAgB,CAAC,GAAG;IAC3E,kHAAkH;IAClH,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC,CAAC;AAEF,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBrF"}
@@ -0,0 +1,46 @@
1
+ import { compareStrings } from "./diagnostic.js";
2
+ import { ABSENT, computeSubject } from "./subject.js";
3
+ import { sha256Hex } from "@intentset/core";
4
+ /**
5
+ * Core §8: `binding: subject` is the default wherever the repository has slice
6
+ * claims; `binding: commit` is the stricter mode a repository or gate asks
7
+ * for; a repository with no slice claims is judged by commit binding unless it
8
+ * asked for that, and says so (EVID004), whatever it asked for.
9
+ */
10
+ export function resolveBinding(configured, hasSlices) {
11
+ if (configured === "commit")
12
+ return { binding: "commit", reason: "configured" };
13
+ if (!hasSlices)
14
+ return { binding: "commit", reason: "no-slices" };
15
+ return { binding: "subject", reason: configured === "subject" ? "configured" : "default" };
16
+ }
17
+ /** True when some slice that is not retired claims files: the repository has a subject to hash. */
18
+ export function hasSliceClaims(graph) {
19
+ for (const artifact of graph.artifacts.values()) {
20
+ if (artifact.meta.type === "slice" &&
21
+ artifact.meta.status !== "retired" &&
22
+ (artifact.meta.slice?.claims.length ?? 0) > 0)
23
+ return true;
24
+ }
25
+ return false;
26
+ }
27
+ /** The subject of every verification in the graph, by ID, with each file hashed once. */
28
+ export function subjectsFor(graph, source) {
29
+ const hashes = new Map();
30
+ const fileHash = (path) => {
31
+ let hash = hashes.get(path);
32
+ if (hash === undefined) {
33
+ const bytes = source.readFile(path);
34
+ hash = bytes === undefined ? ABSENT : sha256Hex(bytes);
35
+ hashes.set(path, hash);
36
+ }
37
+ return hash;
38
+ };
39
+ const subjects = new Map();
40
+ const ids = [...graph.artifacts.keys()].filter((id) => graph.artifacts.get(id)?.meta.type === "verification");
41
+ for (const id of ids.sort(compareStrings)) {
42
+ subjects.set(id, computeSubject({ ...source, graph, verificationId: id, fileHash }));
43
+ }
44
+ return subjects;
45
+ }
46
+ //# sourceMappingURL=binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.js","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAmC,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkC,EAAE,SAAkB;IACnF,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAChF,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAClE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC7F,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,cAAc,CAAC,KAAY;IACzC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QAChD,IACE,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO;YAC9B,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;YAClC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;YAE7C,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAQD,yFAAyF;AACzF,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,MAAqB;IAC7D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE;QACxC,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACvD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC5C,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;IAC9G,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1C,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,12 +1,14 @@
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 { type Diagnostic, type Graph } from "@intentset/core";
9
+ import { type Diagnostic, type EvidenceBinding, type EvidenceBindingReason, type Graph } from "@intentset/core";
9
10
  import { type RunRecord, type RunResult, type RunScope } from "./records.ts";
11
+ import { type Subject } from "./subject.ts";
10
12
  export declare const EVIDENCE_STATUSES: readonly ["current-pass", "current-fail", "stale", "skip", "error", "missing", "unresolved"];
11
13
  export type EvidenceStatus = (typeof EVIDENCE_STATUSES)[number];
12
14
  /** What evidence is assessed against: a commit and graph hash, and the product and release it is for. */
@@ -17,12 +19,33 @@ export interface EvidenceSnapshot {
17
19
  graphHash: string;
18
20
  /** The exact product and release under assessment. Absent or null considers records of every scope, and reports that it did. */
19
21
  scope?: RunScope | null;
22
+ /** The binding in force (Core §8); commit when absent, as before the field existed. */
23
+ binding?: EvidenceBinding;
24
+ /**
25
+ * Why the binding is the one in force: `configured` (the repository asked), `default` (subject, because slices
26
+ * exist) or `no-slices` (commit, because the repository has no slice claims to hash and did not ask for it,
27
+ * which EVID004 says). Absent reads as `configured`.
28
+ */
29
+ bindingReason?: EvidenceBindingReason;
30
+ /** Under subject binding: the subject of each verification at the snapshot, by verification ID. */
31
+ subjects?: ReadonlyMap<string, Subject>;
32
+ /**
33
+ * The files changed between a record's commit and the assessed commit, or null when the commit is not an
34
+ * ancestor of it or git is unavailable. Optional: it only makes the notes and EVID005 more specific.
35
+ */
36
+ changedSince?: (commit: string) => readonly string[] | null;
37
+ /** True for a file that can move some subject: claimed, a used resource's, a global input, a test, a record. */
38
+ covers?: (path: string) => boolean;
20
39
  }
21
40
  export type ResultCounts = Record<RunResult, number>;
22
41
  export interface VerificationEvidence {
23
42
  verificationId: string;
24
43
  method: "automated" | "manual";
25
44
  status: EvidenceStatus;
45
+ /** The binding that judged this verification. */
46
+ binding: EvidenceBinding;
47
+ /** Under subject binding, the hash of the subject it was judged at; null under commit binding and when none could be computed. */
48
+ subject: string | null;
26
49
  /** Why the status is qualified or what was set aside, when anything was. */
27
50
  note?: string;
28
51
  /** The record that decided the status: the latest at the snapshot, else the latest in scope; null when there is none. */
@@ -43,6 +66,9 @@ export interface Classification {
43
66
  commit: string | null;
44
67
  graphHash: string;
45
68
  scope: RunScope | null;
69
+ binding: EvidenceBinding;
70
+ /** Why this binding is in force (`configured` when the caller did not say). */
71
+ bindingReason: EvidenceBindingReason;
46
72
  };
47
73
  /** One entry per verification artifact in the graph, keyed and ordered by ID. */
48
74
  verifications: Record<string, VerificationEvidence>;
@@ -52,13 +78,15 @@ export interface Classification {
52
78
  unknown: RunRecord[];
53
79
  /** Records that cannot be evidence for the verification they name (EVID001), by evidence ID. */
54
80
  rejected: RejectedRecord[];
55
- /** EVID001 and EVID002, sorted. */
81
+ /** EVID001, EVID002, EVID004 and EVID005, sorted. */
56
82
  diagnostics: Diagnostic[];
57
83
  }
58
84
  export interface ClassifyOptions {
59
85
  /** The file the records were read from, for diagnostics; null when they did not come from one. */
60
86
  evidencePath?: string | null;
61
87
  }
88
+ /** The most files EVID005 lists; the rest are counted. */
89
+ export declare const UNCLAIMED_LIMIT = 20;
62
90
  /** Core §8: classify every verification in the graph against the snapshot. Deterministic for identical inputs. */
63
91
  export declare function classifyEvidence(graph: Graph, records: readonly RunRecord[], snapshot: EvidenceSnapshot, options?: ClassifyOptions): Classification;
64
92
  /** True when a record was made at the snapshot: same graph hash, and same commit unless the snapshot's is unknown. */
@@ -1 +1 @@
1
- {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,KAAK,EAAmB,MAAM,iBAAiB,CAAC;AAE/E,OAAO,EAA2B,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEtG,eAAO,MAAM,iBAAiB,YAC5B,cAAc,EACd,cAAc,EACd,OAAO,EACP,MAAM,EACN,OAAO,EACP,SAAS,EACT,YAAY,CACJ,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,yGAAyG;AACzG,MAAM,WAAW,gBAAgB;IAC/B,kHAAkH;IAClH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,gIAAgI;IAChI,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yHAAyH;IACzH,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,+FAA+F;IAC/F,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,kGAAkG;IAClG,UAAU,EAAE,YAAY,CAAC;IACzB,mGAAmG;IACnG,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAA;KAAE,CAAC;IAC/E,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACpD,uFAAuF;IACvF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8FAA8F;IAC9F,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,gGAAgG;IAChG,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,mCAAmC;IACnC,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,kGAAkG;IAClG,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAID,kHAAkH;AAClH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,GAAE,eAAoB,GAC5B,cAAc,CAgFhB;AAED,sHAAsH;AACtH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAE7G"}
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"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"}
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,9 @@ 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
+ const short = (commit) => commit.slice(0, 9);
21
26
  /** Core §8: classify every verification in the graph against the snapshot. Deterministic for identical inputs. */
22
27
  export function classifyEvidence(graph, records, snapshot, options = {}) {
23
28
  const path = options.evidencePath ?? null;
@@ -69,14 +74,44 @@ export function classifyEvidence(graph, records, snapshot, options = {}) {
69
74
  }
70
75
  inScope.get(record.verificationId)?.push(record);
71
76
  }
77
+ const binding = snapshot.binding ?? "commit";
78
+ if (snapshot.bindingReason === "no-slices") {
79
+ diagnostics.push(evidenceDiagnostic({
80
+ code: "EVID004",
81
+ severity: "warning",
82
+ artifact: null,
83
+ path: null,
84
+ 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).",
85
+ 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).",
86
+ }));
87
+ }
72
88
  const verifications = {};
89
+ const unclaimed = new Set();
73
90
  for (const id of ids) {
74
91
  const artifact = graph.artifacts.get(id);
75
92
  const history = (inScope.get(id) ?? []).sort(compareRecords);
76
- verifications[id] = classifyOne(id, artifact?.meta.verification?.method ?? "automated", history, outOfScope.get(id) ?? 0, snapshot);
93
+ verifications[id] = classifyOne(id, artifact?.meta.verification?.method ?? "automated", history, outOfScope.get(id) ?? 0, snapshot, binding, unclaimed);
94
+ }
95
+ if (unclaimed.size > 0) {
96
+ const files = [...unclaimed].sort(compareStrings);
97
+ const listed = files.slice(0, UNCLAIMED_LIMIT);
98
+ diagnostics.push(evidenceDiagnostic({
99
+ code: "EVID005",
100
+ severity: "warning",
101
+ artifact: null,
102
+ path: null,
103
+ message: `${files.length} file${files.length === 1 ? "" : "s"} changed since the commit of a subject-bound record and no slice claims, no used 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` : ""}.`,
104
+ remediation: "Claim the file in a slice (the architecture check's unclaimed files rule), name its resource in `usesResources`, or list it in `evidence.globalInputs` if it affects every check (Core §8).",
105
+ }));
77
106
  }
78
107
  return {
79
- snapshot: { commit: snapshot.commit, graphHash: snapshot.graphHash, scope },
108
+ snapshot: {
109
+ commit: snapshot.commit,
110
+ graphHash: snapshot.graphHash,
111
+ scope,
112
+ binding,
113
+ bindingReason: snapshot.bindingReason ?? "configured",
114
+ },
80
115
  verifications,
81
116
  ignoredOutOfScope,
82
117
  unknown,
@@ -88,9 +123,10 @@ export function classifyEvidence(graph, records, snapshot, options = {}) {
88
123
  export function atSnapshot(record, snapshot) {
89
124
  return record.graphHash === snapshot.graphHash && (snapshot.commit === null || record.commit === snapshot.commit);
90
125
  }
91
- function classifyOne(verificationId, method, history, outOfScope, snapshot) {
126
+ function classifyOne(verificationId, method, history, outOfScope, snapshot, binding, unclaimed) {
92
127
  const counts = { pass: 0, fail: 0, skip: 0, error: 0 };
93
- const base = { verificationId, method, history, atSnapshot: counts, outOfScope };
128
+ const subjectHash = binding === "subject" ? (snapshot.subjects?.get(verificationId)?.hash ?? null) : null;
129
+ const base = { verificationId, method, binding, subject: subjectHash, history, atSnapshot: counts, outOfScope };
94
130
  const ignored = outOfScope > 0 ? `${outOfScope} record${outOfScope === 1 ? "" : "s"} for another product or release ignored` : null;
95
131
  if (history.length === 0) {
96
132
  return withNote({ ...base, status: "missing", latest: null }, [ignored]);
@@ -103,23 +139,77 @@ function classifyOne(verificationId, method, history, outOfScope, snapshot) {
103
139
  ignored,
104
140
  ]);
105
141
  }
106
- const current = history.filter((record) => atSnapshot(record, snapshot));
142
+ const subject = snapshot.subjects?.get(verificationId);
143
+ if (binding === "subject" && subject === undefined) {
144
+ return withNote({ ...base, status: "unresolved", latest: history[history.length - 1] }, [
145
+ "subject binding is in force but no subject could be computed for this verification",
146
+ ignored,
147
+ ]);
148
+ }
149
+ const current = binding === "subject"
150
+ ? history.filter((record) => record.binding === "subject" && record.subjectHash === subject?.hash)
151
+ : history.filter((record) => record.binding !== "subject" && atSnapshot(record, snapshot));
107
152
  for (const record of current)
108
153
  counts[record.result]++;
109
154
  if (current.length === 0) {
110
- return withNote({ ...base, status: "stale", latest: history[history.length - 1] }, [ignored]);
155
+ const latest = history[history.length - 1];
156
+ return withNote({ ...base, status: "stale", latest }, [staleNote(latest, binding, subject, snapshot), ignored]);
111
157
  }
112
158
  const latest = current[current.length - 1];
113
159
  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]);
160
+ const notes = [];
161
+ if (binding === "subject") {
162
+ const unlisted = collectUnclaimed(latest, snapshot, unclaimed);
163
+ notes.push(`judged by subject binding; the run was at commit ${short(latest.commit)}${unlisted}`);
164
+ }
165
+ else if (snapshot.commit === null)
166
+ notes.push(NOTE_COMMIT_UNKNOWN);
167
+ notes.push(ignored);
168
+ return withNote({ ...base, status, latest }, notes);
169
+ }
170
+ /** Why the latest record is not current under the binding in force, with what moved when that can be said. */
171
+ function staleNote(latest, binding, subject, snapshot) {
172
+ if (binding === "commit") {
173
+ return latest.binding === "subject"
174
+ ? "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"
175
+ : null;
176
+ }
177
+ if (latest.binding !== "subject") {
178
+ 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`;
179
+ }
180
+ if (snapshot.changedSince === undefined || subject === undefined)
181
+ return "the subject changed since the run";
182
+ const changed = snapshot.changedSince(latest.commit);
183
+ if (changed === null) {
184
+ 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`;
185
+ }
186
+ const parts = partsChangedAmong(subject, new Set(changed));
187
+ return parts.length === 0
188
+ ? `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)`
189
+ : `the subject changed since the run at commit ${short(latest.commit)}: ${parts.slice(0, 5).join(", ")}${parts.length > 5 ? `, and ${parts.length - 5} more` : ""}`;
190
+ }
191
+ /** Collects what changed outside every subject since a current record's commit (EVID005), and says when that cannot be known. */
192
+ function collectUnclaimed(latest, snapshot, unclaimed) {
193
+ if (snapshot.changedSince === undefined || snapshot.covers === undefined)
194
+ return "";
195
+ const changed = snapshot.changedSince(latest.commit);
196
+ if (changed === null) {
197
+ return `; files changed since then could not be listed, because the commit is not an ancestor of the assessed commit or git is unavailable`;
198
+ }
199
+ for (const path of changed)
200
+ if (!snapshot.covers(path))
201
+ unclaimed.add(path);
202
+ return "";
115
203
  }
116
204
  function withNote(evidence, notes) {
117
205
  const present = notes.filter((note) => note !== null);
118
- const { verificationId, method, status, latest, history, atSnapshot: counts, outOfScope } = evidence;
206
+ const { verificationId, method, binding, subject, status, latest, history, atSnapshot: counts, outOfScope, } = evidence;
119
207
  return {
120
208
  verificationId,
121
209
  method,
122
210
  status,
211
+ binding,
212
+ subject,
123
213
  ...(present.length > 0 ? { note: present.join("; ") } : {}),
124
214
  latest,
125
215
  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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"}