@getbourdon/conformance 0.2.0 → 0.2.2

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 (36) hide show
  1. package/dist/index.d.ts +11 -9
  2. package/dist/index.js +28 -25
  3. package/fixtures/README.md +3 -3
  4. package/fixtures/fed_seed_library/agents/claude-code.l5.yaml +31 -4
  5. package/fixtures/fed_seed_library/agents/codex.l5.yaml +15 -0
  6. package/fixtures/l5_manifests/invalid/bad-agent-type-enum.json +1 -1
  7. package/fixtures/l5_manifests/invalid/bad-spec-version-pattern.json +1 -1
  8. package/fixtures/l5_manifests/invalid/entity-bad-visibility-enum.json +1 -1
  9. package/fixtures/l5_manifests/invalid/entity-missing-name.json +1 -1
  10. package/fixtures/l5_manifests/invalid/missing-required-last_updated.json +1 -1
  11. package/fixtures/l5_manifests/valid/full.json +2 -2
  12. package/fixtures/l5_manifests/valid/minimal.json +1 -1
  13. package/fixtures/l5_manifests/valid/team-and-private.json +1 -1
  14. package/fixtures/l5_schema.json +93 -3
  15. package/fixtures/l5_todict.json +10 -10
  16. package/fixtures/leak_cases.json +1 -1
  17. package/fixtures/manifest.json +51 -31
  18. package/fixtures/mcp_snapshots/_normalizer.json +31 -2
  19. package/fixtures/mcp_snapshots/commit_to_federation.req.json +13 -1
  20. package/fixtures/mcp_snapshots/commit_to_federation.res.json +8 -2
  21. package/fixtures/mcp_snapshots/export_agents.res.json +47 -1
  22. package/fixtures/mcp_snapshots/get_cross_agent_summary.res.json +1 -1
  23. package/fixtures/mcp_snapshots/list_notes.req.json +8 -0
  24. package/fixtures/mcp_snapshots/list_notes.res.json +28 -0
  25. package/fixtures/mcp_snapshots/list_recent_work.res.json +1 -1
  26. package/fixtures/mcp_snapshots/list_workstreams.req.json +6 -0
  27. package/fixtures/mcp_snapshots/list_workstreams.res.json +23 -0
  28. package/fixtures/mcp_snapshots/seed_library.json +45 -1
  29. package/fixtures/native_stores/claude_code/expected_l5.json +8 -8
  30. package/fixtures/native_stores/claude_code/store/auto_memory/{clyde.md → alpha-agent.md} +2 -2
  31. package/fixtures/native_stores/claude_code/store/auto_memory/{ry-guy.md → example-user.md} +2 -2
  32. package/fixtures/native_stores/claude_code/store/knowledge_graph/memory.jsonl +2 -2
  33. package/fixtures/recognition_golden_v1.yaml +17 -17
  34. package/fixtures/recognition_vectors.json +23 -23
  35. package/fixtures/tier_matrix.json +2 -2
  36. package/package.json +2 -2
package/dist/index.d.ts CHANGED
@@ -1,34 +1,36 @@
1
- export interface RedactionSecretCase {
1
+ interface RedactionSecretCase {
2
2
  /** Joined at load (`assembleSecret`) so no contiguous secret literal lands in git. */
3
3
  fragments: string[];
4
4
  expect_redacted: string;
5
5
  expect_contains_secret: boolean;
6
6
  }
7
- export interface RedactionBenignCase {
7
+ interface RedactionBenignCase {
8
8
  text: string;
9
9
  expect_redacted: string;
10
10
  expect_contains_secret: boolean;
11
11
  }
12
- export interface RedactionBattery {
12
+ interface RedactionBattery {
13
13
  redacted_sentinel: string;
14
14
  benign_limit: number;
15
15
  secrets: RedactionSecretCase[];
16
16
  benign: RedactionBenignCase[];
17
17
  }
18
- export interface ConformanceFixtureMeta {
18
+ interface ConformanceFixtureMeta {
19
19
  path: string;
20
20
  sha256: string;
21
21
  producer: string;
22
22
  }
23
- export interface ConformanceManifest {
23
+ interface ConformanceManifest {
24
24
  conformance_version: string;
25
25
  produced_against: {
26
26
  bourdon_version: string;
27
27
  };
28
28
  fixtures: ConformanceFixtureMeta[];
29
29
  }
30
- export declare function conformanceDir(): string;
31
- export declare function loadManifest(): ConformanceManifest;
32
- export declare function loadRedactionBattery(): RedactionBattery;
30
+ declare function conformanceDir(): string;
31
+ declare function loadManifest(): ConformanceManifest;
32
+ declare function loadRedactionBattery(): RedactionBattery;
33
33
  /** Reconstruct a secret case's runtime string from its fragments. */
34
- export declare function assembleSecret(secret: RedactionSecretCase): string;
34
+ declare function assembleSecret(secret: RedactionSecretCase): string;
35
+
36
+ export { type ConformanceFixtureMeta, type ConformanceManifest, type RedactionBattery, type RedactionBenignCase, type RedactionSecretCase, assembleSecret, conformanceDir, loadManifest, loadRedactionBattery };
package/dist/index.js CHANGED
@@ -1,33 +1,36 @@
1
- import { existsSync, readFileSync } from "node:fs";
2
- import { dirname, resolve } from "node:path";
3
- import { fileURLToPath } from "node:url";
1
+ // src/index.ts
2
+ import { existsSync, readFileSync } from "fs";
3
+ import { dirname, resolve } from "path";
4
+ import { fileURLToPath } from "url";
4
5
  function moduleDir() {
5
- if (typeof import.meta !== "undefined" && import.meta.url) {
6
- return dirname(fileURLToPath(import.meta.url));
7
- }
8
- return typeof __dirname !== "undefined" ? __dirname : process.cwd();
6
+ if (typeof import.meta !== "undefined" && import.meta.url) {
7
+ return dirname(fileURLToPath(import.meta.url));
8
+ }
9
+ return typeof __dirname !== "undefined" ? __dirname : process.cwd();
9
10
  }
10
- export function conformanceDir() {
11
- const override = process.env.BOURDON_CONFORMANCE_DIR;
12
- if (override)
13
- return override;
14
- // Bundled snapshot: <pkg>/fixtures, one level up from src/ or dist/.
15
- const bundled = resolve(moduleDir(), "..", "fixtures");
16
- if (existsSync(resolve(bundled, "manifest.json")))
17
- return bundled;
18
- // Dev fallback: the sibling Python oracle checkout.
19
- return resolve(process.cwd(), "..", "..", "bourdon", "conformance");
11
+ function conformanceDir() {
12
+ const override = process.env.BOURDON_CONFORMANCE_DIR;
13
+ if (override) return override;
14
+ const bundled = resolve(moduleDir(), "..", "fixtures");
15
+ if (existsSync(resolve(bundled, "manifest.json"))) return bundled;
16
+ return resolve(process.cwd(), "..", "..", "bourdon", "conformance");
20
17
  }
21
18
  function loadJson(name) {
22
- return JSON.parse(readFileSync(resolve(conformanceDir(), name), "utf8"));
19
+ return JSON.parse(readFileSync(resolve(conformanceDir(), name), "utf8"));
23
20
  }
24
- export function loadManifest() {
25
- return loadJson("manifest.json");
21
+ function loadManifest() {
22
+ return loadJson("manifest.json");
26
23
  }
27
- export function loadRedactionBattery() {
28
- return loadJson("redaction_battery.json");
24
+ function loadRedactionBattery() {
25
+ return loadJson("redaction_battery.json");
29
26
  }
30
- /** Reconstruct a secret case's runtime string from its fragments. */
31
- export function assembleSecret(secret) {
32
- return secret.fragments.join("");
27
+ function assembleSecret(secret) {
28
+ return secret.fragments.join("");
33
29
  }
30
+ export {
31
+ assembleSecret,
32
+ conformanceDir,
33
+ loadManifest,
34
+ loadRedactionBattery
35
+ };
36
+ //# sourceMappingURL=index.js.map
@@ -19,7 +19,7 @@ uncommitted diff (`git diff --exit-code -- conformance/`).
19
19
  python tools/gen_conformance.py # rewrites conformance/ + manifest.json
20
20
  ```
21
21
 
22
- After changing a pattern in `core.redaction` (or any oracle), regenerate, review the
22
+ After changing a pattern in `bourdon.core.redaction` (or any oracle), regenerate, review the
23
23
  diff, and bump `conformance_version` in `tools/gen_conformance.py` (patch = added cases,
24
24
  minor = new family, major = a changed expected-output = a reviewed behavior change).
25
25
 
@@ -44,7 +44,7 @@ dict. `on_disk/` holds Python-written artifacts the TS side must parse identical
44
44
  never a contiguous literal), and an append-only audit log produced by the real `record()` with frozen
45
45
  timestamps. Both pytest (`tests/test_federation_conformance.py`) and the TS vitest suite assert these.
46
46
 
47
- The `mcp_snapshots/` family pins the **JSON-in-TextContent wire contract** for all 10 L6
47
+ The `mcp_snapshots/` family pins the **JSON-in-TextContent wire contract** for all 12 L6
48
48
  MCP tools. Each `*.res.json` is the live tool's payload (as `RemoteL6Client` recovers it:
49
49
  `json.loads` of the single `TextContent.text` = `json.dumps(payload)`) run through one codified
50
50
  NORMALIZER — sort object keys, round floats to 4dp, drop null/empty-list fields (to_dict
@@ -57,5 +57,5 @@ Token-shaped secrets are stored as **fragment arrays** joined at load time, so n
57
57
  contiguous secret literal ever lands in git (GitHub push-protection scans literals).
58
58
  Both loaders `"".join(fragments)`.
59
59
 
60
- See the master plan: `claude-brain/PROJECTS/NEUROLAYER/PLAN_TS_MIRROR_2026-06-29.md` and
60
+ See the master plan: `agent-brain/PROJECTS/NEUROLAYER/PLAN_TS_MIRROR_2026-06-29.md` and
61
61
  the `bourdon-parity-fixture-harness` / `bourdon-py-to-ts-port` skills.
@@ -2,7 +2,7 @@ spec_version: '0.1'
2
2
  agent:
3
3
  id: claude-code
4
4
  type: code-assistant
5
- instance: pc-threadripper
5
+ instance: workstation-01
6
6
  role_narrative: Lead code-assistant on the federation substrate.
7
7
  last_updated: '2026-06-29T12:00:00+00:00'
8
8
  capabilities:
@@ -32,7 +32,7 @@ known_entities:
32
32
  visibility: private
33
33
  recent_sessions:
34
34
  - date: '2026-06-08'
35
- cwd: /c/Users/cumul/repos/bourdon
35
+ cwd: /home/example/repos/bourdon
36
36
  project_focus:
37
37
  - Bourdon
38
38
  key_actions:
@@ -41,19 +41,46 @@ recent_sessions:
41
41
  - tools/gen_conformance.py
42
42
  visibility: public
43
43
  - date: '2026-06-07'
44
- cwd: /c/Users/cumul/repos/bourdon
44
+ cwd: /home/example/repos/bourdon
45
45
  project_focus:
46
46
  - Roadmap
47
47
  key_actions:
48
48
  - team planning
49
49
  visibility: team
50
50
  - date: '2026-06-06'
51
- cwd: /c/Users/cumul/repos/bourdon
51
+ cwd: /home/example/repos/bourdon
52
52
  project_focus:
53
53
  - Quarterly Revenue
54
54
  key_actions:
55
55
  - private review
56
56
  visibility: private
57
+ known_workstreams:
58
+ - name: Release
59
+ summary: Prepare the public Bourdon release.
60
+ status: active
61
+ last_touched: '2026-06-10'
62
+ related_entities:
63
+ - Bourdon
64
+ tags:
65
+ - launch
66
+ visibility: public
67
+ - name: Private Planning
68
+ status: paused
69
+ last_touched: '2026-06-09'
70
+ tags:
71
+ - financial
72
+ visibility: private
73
+ notes:
74
+ - date: '2026-06-09'
75
+ text: Public release note.
76
+ related_entities:
77
+ - Bourdon
78
+ visibility: public
79
+ - date: '2026-06-08'
80
+ text: Team release note.
81
+ tags:
82
+ - team
83
+ visibility: team
57
84
  visibility_policy:
58
85
  default: public
59
86
  private_tags:
@@ -33,3 +33,18 @@ recent_sessions:
33
33
  key_actions:
34
34
  - codex private
35
35
  visibility: team
36
+ known_workstreams:
37
+ - name: release
38
+ status: paused
39
+ last_touched: '2026-06-11'
40
+ related_entities:
41
+ - Bourdon
42
+ tags:
43
+ - coordination
44
+ visibility: public
45
+ notes:
46
+ - date: '2026-06-10'
47
+ text: Codex public release note.
48
+ related_entities:
49
+ - Bourdon
50
+ visibility: public
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "spec_version": "0.1",
3
3
  "agent": {
4
- "id": "clyde",
4
+ "id": "alpha-agent",
5
5
  "type": "wizard"
6
6
  },
7
7
  "last_updated": "2026-06-29T12:00:00+00:00"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "spec_version": "0.1.0",
3
3
  "agent": {
4
- "id": "clyde",
4
+ "id": "alpha-agent",
5
5
  "type": "note-capture"
6
6
  },
7
7
  "last_updated": "2026-06-29T12:00:00+00:00"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "spec_version": "0.1",
3
3
  "agent": {
4
- "id": "clyde",
4
+ "id": "alpha-agent",
5
5
  "type": "note-capture"
6
6
  },
7
7
  "last_updated": "2026-06-29T12:00:00+00:00",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "spec_version": "0.1",
3
3
  "agent": {
4
- "id": "clyde",
4
+ "id": "alpha-agent",
5
5
  "type": "note-capture"
6
6
  },
7
7
  "last_updated": "2026-06-29T12:00:00+00:00",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "spec_version": "0.1",
3
3
  "agent": {
4
- "id": "clyde",
4
+ "id": "alpha-agent",
5
5
  "type": "note-capture"
6
6
  }
7
7
  }
@@ -3,7 +3,7 @@
3
3
  "agent": {
4
4
  "id": "claude-code",
5
5
  "type": "code-assistant",
6
- "instance": "pc-threadripper",
6
+ "instance": "workstation-01",
7
7
  "spec_version_compat": ">=0.1",
8
8
  "role_narrative": "Lead code-assistant. Organizes project code."
9
9
  },
@@ -16,7 +16,7 @@
16
16
  "recent_sessions": [
17
17
  {
18
18
  "date": "2026-06-28",
19
- "cwd": "/c/Users/cumul/repos/bourdon",
19
+ "cwd": "/home/example/repos/bourdon",
20
20
  "project_focus": [
21
21
  "bourdon"
22
22
  ],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "spec_version": "0.1",
3
3
  "agent": {
4
- "id": "clyde",
4
+ "id": "alpha-agent",
5
5
  "type": "note-capture"
6
6
  },
7
7
  "last_updated": "2026-06-29T12:00:00+00:00"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "spec_version": "0.1",
3
3
  "agent": {
4
- "id": "clair",
4
+ "id": "beta-agent",
5
5
  "type": "note-capture"
6
6
  },
7
7
  "last_updated": "2026-06-29T12:00:00+00:00",
@@ -22,7 +22,7 @@
22
22
  "pattern": "^[a-z0-9][a-z0-9_-]*$",
23
23
  "minLength": 1,
24
24
  "maxLength": 64,
25
- "examples": ["clyde", "claude-code", "codex", "clair"]
25
+ "examples": ["alpha-agent", "claude-code", "codex", "beta-agent"]
26
26
  },
27
27
  "type": {
28
28
  "description": "Agent category. Informs L6 query routing and UI grouping.",
@@ -43,7 +43,7 @@
43
43
  "description": "Optional machine/deployment identifier. Helps federate memory across multiple instances of the same agent on different machines.",
44
44
  "type": "string",
45
45
  "maxLength": 128,
46
- "examples": ["pc-threadripper", "mac-m1max"]
46
+ "examples": ["workstation-01", "laptop-01"]
47
47
  },
48
48
  "spec_version_compat": {
49
49
  "description": "Version range of Bourdon specs this manifest is compatible with. Uses npm-style semver ranges. If omitted, assumed equal to spec_version.",
@@ -58,7 +58,7 @@
58
58
  "Agentic manager and code-assistant. Coordinates the agent fleet, reviews PRs, and consults on solutions.",
59
59
  "Lead code-assistant. Organizes project code and executes prime code. Consults with Claude on solutions, problems, and issues via PR or Slack #agents channel.",
60
60
  "Code-assistant invoked for debugging, issues, quick fixes, and short-task throwaway sessions.",
61
- "General-purpose RADLAB assistant with deep project memory."
61
+ "General-purpose personal assistant with deep project memory."
62
62
  ]
63
63
  }
64
64
  }
@@ -93,6 +93,18 @@
93
93
  "items": { "$ref": "#/$defs/Entity" },
94
94
  "maxItems": 1000
95
95
  },
96
+ "known_workstreams": {
97
+ "description": "Ongoing multi-session initiatives, distinct from a single dated Session and from a named glossary Entity. A workstream has a status and accrues sessions/entities over time. L6 uses this to answer 'what's currently in flight?' style queries.",
98
+ "type": "array",
99
+ "items": { "$ref": "#/$defs/Workstream" },
100
+ "maxItems": 200
101
+ },
102
+ "notes": {
103
+ "description": "Freestanding unstructured notes not tied to a specific named entity or a single session's action log. Closer to a journal entry than a glossary term.",
104
+ "type": "array",
105
+ "items": { "$ref": "#/$defs/Note" },
106
+ "maxItems": 1000
107
+ },
96
108
  "visibility_policy": {
97
109
  "description": "Default visibility rules applied when an entity does not declare its own visibility.",
98
110
  "type": "object",
@@ -204,6 +216,84 @@
204
216
  "description": "Overrides visibility_policy.default for this entity. Private entities MUST be omitted from federated L6 stores."
205
217
  }
206
218
  }
219
+ },
220
+ "Workstream": {
221
+ "type": "object",
222
+ "required": ["name", "status"],
223
+ "properties": {
224
+ "name": {
225
+ "description": "Human-readable workstream name.",
226
+ "type": "string",
227
+ "minLength": 1,
228
+ "maxLength": 128
229
+ },
230
+ "summary": {
231
+ "description": "Short description of what this workstream is (~1-3 sentences, <500 chars).",
232
+ "type": "string",
233
+ "maxLength": 2000
234
+ },
235
+ "status": {
236
+ "description": "Current lifecycle state.",
237
+ "type": "string",
238
+ "enum": ["active", "paused", "done", "archived"]
239
+ },
240
+ "started": {
241
+ "description": "ISO 8601 date this workstream began.",
242
+ "type": "string",
243
+ "format": "date"
244
+ },
245
+ "last_touched": {
246
+ "description": "ISO 8601 date of the most recent activity on this workstream.",
247
+ "type": "string",
248
+ "format": "date"
249
+ },
250
+ "related_entities": {
251
+ "description": "Entity names this workstream references. Cross-references known_entities.",
252
+ "type": "array",
253
+ "items": { "type": "string" },
254
+ "maxItems": 32
255
+ },
256
+ "tags": {
257
+ "description": "Free-text tags. Used for visibility_policy matching and L6 query filtering.",
258
+ "type": "array",
259
+ "items": { "type": "string" }
260
+ },
261
+ "visibility": {
262
+ "$ref": "#/$defs/Visibility",
263
+ "description": "Overrides visibility_policy.default for this workstream. Private workstreams MUST be omitted from federated L6 stores."
264
+ }
265
+ }
266
+ },
267
+ "Note": {
268
+ "type": "object",
269
+ "required": ["date", "text"],
270
+ "properties": {
271
+ "date": {
272
+ "description": "ISO 8601 date the note was written.",
273
+ "type": "string",
274
+ "format": "date"
275
+ },
276
+ "text": {
277
+ "description": "Freeform note content. Larger than a Session.key_actions line -- this is a journal entry, not an action log.",
278
+ "type": "string",
279
+ "maxLength": 4000
280
+ },
281
+ "related_entities": {
282
+ "description": "Entity names this note references. Cross-references known_entities. Optional.",
283
+ "type": "array",
284
+ "items": { "type": "string" },
285
+ "maxItems": 16
286
+ },
287
+ "tags": {
288
+ "description": "Free-text tags. Used for visibility_policy matching and L6 query filtering.",
289
+ "type": "array",
290
+ "items": { "type": "string" }
291
+ },
292
+ "visibility": {
293
+ "$ref": "#/$defs/Visibility",
294
+ "description": "Overrides visibility_policy.default for this note. Private notes MUST be omitted from federated L6 stores."
295
+ }
296
+ }
207
297
  }
208
298
  }
209
299
  }
@@ -6,7 +6,7 @@
6
6
  "input": {
7
7
  "spec_version": "0.1",
8
8
  "agent": {
9
- "id": "clyde",
9
+ "id": "alpha-agent",
10
10
  "type": "note-capture",
11
11
  "instance": null
12
12
  },
@@ -19,7 +19,7 @@
19
19
  "expected": {
20
20
  "spec_version": "0.1",
21
21
  "agent": {
22
- "id": "clyde",
22
+ "id": "alpha-agent",
23
23
  "type": "note-capture"
24
24
  },
25
25
  "last_updated": "2026-06-29T12:00:00+00:00"
@@ -30,7 +30,7 @@
30
30
  "input": {
31
31
  "spec_version": "0.1",
32
32
  "agent": {
33
- "id": "clair",
33
+ "id": "beta-agent",
34
34
  "type": "note-capture"
35
35
  },
36
36
  "last_updated": "2026-06-29T12:00:00+00:00",
@@ -53,7 +53,7 @@
53
53
  "expected": {
54
54
  "spec_version": "0.1",
55
55
  "agent": {
56
- "id": "clair",
56
+ "id": "beta-agent",
57
57
  "type": "note-capture"
58
58
  },
59
59
  "last_updated": "2026-06-29T12:00:00+00:00",
@@ -79,7 +79,7 @@
79
79
  "input": {
80
80
  "spec_version": "0.1",
81
81
  "agent": {
82
- "id": "clyde",
82
+ "id": "alpha-agent",
83
83
  "type": "note-capture"
84
84
  },
85
85
  "last_updated": "2026-06-29T12:00:00+00:00",
@@ -96,7 +96,7 @@
96
96
  "expected": {
97
97
  "spec_version": "0.1",
98
98
  "agent": {
99
- "id": "clyde",
99
+ "id": "alpha-agent",
100
100
  "type": "note-capture"
101
101
  },
102
102
  "last_updated": "2026-06-29T12:00:00+00:00",
@@ -114,7 +114,7 @@
114
114
  "input": {
115
115
  "spec_version": "0.1",
116
116
  "agent": {
117
- "id": "clyde",
117
+ "id": "alpha-agent",
118
118
  "type": "note-capture"
119
119
  },
120
120
  "last_updated": "2026-06-29T12:00:00+00:00",
@@ -123,7 +123,7 @@
123
123
  "expected": {
124
124
  "spec_version": "0.1",
125
125
  "agent": {
126
- "id": "clyde",
126
+ "id": "alpha-agent",
127
127
  "type": "note-capture"
128
128
  },
129
129
  "last_updated": "2026-06-29T12:00:00+00:00",
@@ -139,7 +139,7 @@
139
139
  "agent": {
140
140
  "id": "claude-code",
141
141
  "type": "code-assistant",
142
- "instance": "pc-threadripper",
142
+ "instance": "workstation-01",
143
143
  "spec_version_compat": ">=0.1",
144
144
  "role_narrative": "Lead code-assistant."
145
145
  },
@@ -196,7 +196,7 @@
196
196
  "agent": {
197
197
  "id": "claude-code",
198
198
  "type": "code-assistant",
199
- "instance": "pc-threadripper",
199
+ "instance": "workstation-01",
200
200
  "spec_version_compat": ">=0.1",
201
201
  "role_narrative": "Lead code-assistant."
202
202
  },
@@ -1,5 +1,5 @@
1
1
  {
2
- "_doc": "Cross-impl federation leak-audit parity. Oracle = core.leak_audit.audit_manifest. Each case feeds `manifest` through the auditor; `expected_findings` pins [{kind, location}] in the oracle's emission order (visibility entities, visibility sessions, then the total credential walk). kind in {'credential','visibility'}; location is a json-path like 'known_entities[0].summary'. audit_manifest NEVER raises -- garbage manifests yield []. Credential cases use keyword-shaped triggers only; no token literal is committed.",
2
+ "_doc": "Cross-impl federation leak-audit parity. Oracle = bourdon.core.leak_audit.audit_manifest. Each case feeds `manifest` through the auditor; `expected_findings` pins [{kind, location}] in the oracle's emission order (visibility entities, visibility sessions, then the total credential walk). kind in {'credential','visibility'}; location is a json-path like 'known_entities[0].summary'. audit_manifest NEVER raises -- garbage manifests yield []. Credential cases use keyword-shaped triggers only; no token literal is committed.",
3
3
  "audit_schema_version": "federation-leak-audit/v1",
4
4
  "private_tag_families": [
5
5
  "credential",