@getbourdon/conformance 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE +157 -0
  2. package/README.md +26 -0
  3. package/dist/index.cjs +65 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +36 -0
  6. package/dist/index.d.ts +36 -0
  7. package/dist/index.js +36 -0
  8. package/dist/index.js.map +1 -0
  9. package/fixtures/README.md +61 -0
  10. package/fixtures/fed_seed_library/agents/claude-code.l5.yaml +63 -0
  11. package/fixtures/fed_seed_library/agents/codex.l5.yaml +35 -0
  12. package/fixtures/l5_manifests/invalid/bad-agent-type-enum.json +8 -0
  13. package/fixtures/l5_manifests/invalid/bad-spec-version-pattern.json +8 -0
  14. package/fixtures/l5_manifests/invalid/entity-bad-visibility-enum.json +14 -0
  15. package/fixtures/l5_manifests/invalid/entity-missing-name.json +13 -0
  16. package/fixtures/l5_manifests/invalid/missing-required-last_updated.json +7 -0
  17. package/fixtures/l5_manifests/invalid/reasons.json +75 -0
  18. package/fixtures/l5_manifests/valid/full.json +60 -0
  19. package/fixtures/l5_manifests/valid/minimal.json +8 -0
  20. package/fixtures/l5_manifests/valid/team-and-private.json +51 -0
  21. package/fixtures/l5_schema.json +209 -0
  22. package/fixtures/l5_todict.json +253 -0
  23. package/fixtures/leak_cases.json +229 -0
  24. package/fixtures/manifest.json +304 -0
  25. package/fixtures/mcp_snapshots/_normalizer.json +134 -0
  26. package/fixtures/mcp_snapshots/commit_to_federation.req.json +19 -0
  27. package/fixtures/mcp_snapshots/commit_to_federation.res.json +12 -0
  28. package/fixtures/mcp_snapshots/compile_codex_turn.req.json +7 -0
  29. package/fixtures/mcp_snapshots/compile_codex_turn.res.json +5 -0
  30. package/fixtures/mcp_snapshots/export_agents.req.json +4 -0
  31. package/fixtures/mcp_snapshots/export_agents.res.json +73 -0
  32. package/fixtures/mcp_snapshots/find_entity.req.json +7 -0
  33. package/fixtures/mcp_snapshots/find_entity.res.json +24 -0
  34. package/fixtures/mcp_snapshots/get_cross_agent_summary.req.json +7 -0
  35. package/fixtures/mcp_snapshots/get_cross_agent_summary.res.json +42 -0
  36. package/fixtures/mcp_snapshots/get_deeper_context.req.json +7 -0
  37. package/fixtures/mcp_snapshots/get_deeper_context.res.json +7 -0
  38. package/fixtures/mcp_snapshots/list_agents.req.json +4 -0
  39. package/fixtures/mcp_snapshots/list_agents.res.json +6 -0
  40. package/fixtures/mcp_snapshots/list_recent_work.req.json +8 -0
  41. package/fixtures/mcp_snapshots/list_recent_work.res.json +38 -0
  42. package/fixtures/mcp_snapshots/prepare_recognition_context.req.json +7 -0
  43. package/fixtures/mcp_snapshots/prepare_recognition_context.res.json +19 -0
  44. package/fixtures/mcp_snapshots/query_agent_memory.req.json +8 -0
  45. package/fixtures/mcp_snapshots/query_agent_memory.res.json +25 -0
  46. package/fixtures/mcp_snapshots/seed_library.json +24 -0
  47. package/fixtures/native_stores/README.json +24 -0
  48. package/fixtures/native_stores/claude_code/expected_l5.json +72 -0
  49. package/fixtures/native_stores/claude_code/store/auto_memory/MEMORY.md +3 -0
  50. package/fixtures/native_stores/claude_code/store/auto_memory/clyde.md +7 -0
  51. package/fixtures/native_stores/claude_code/store/auto_memory/ry-guy.md +6 -0
  52. package/fixtures/native_stores/claude_code/store/brain/LOG/2026-06-28-pc.md +3 -0
  53. package/fixtures/native_stores/claude_code/store/brain/PROJECTS/Bourdon/OVERVIEW.md +3 -0
  54. package/fixtures/native_stores/claude_code/store/brain/PROJECTS/OldThing/OVERVIEW.md +5 -0
  55. package/fixtures/native_stores/claude_code/store/knowledge_graph/memory.jsonl +3 -0
  56. package/fixtures/native_stores/github_copilot/cache/github-copilot/payload.json +21 -0
  57. package/fixtures/native_stores/github_copilot/expected_l5.json +67 -0
  58. package/fixtures/native_stores/hermes/expected_l5.json +108 -0
  59. package/fixtures/native_stores/hermes/store/.hermes/memories/memory.md +2 -0
  60. package/fixtures/native_stores/hermes/store/.hermes/memories/user.md +2 -0
  61. package/fixtures/native_stores/hermes/store/.hermes/state.db +0 -0
  62. package/fixtures/on_disk/audit.jsonl +5 -0
  63. package/fixtures/on_disk/auth_vectors.json +55 -0
  64. package/fixtures/on_disk/federation.yaml +22 -0
  65. package/fixtures/recognition_golden_v1.yaml +106 -0
  66. package/fixtures/recognition_vectors.json +448 -0
  67. package/fixtures/redaction_battery.json +473 -0
  68. package/fixtures/tier_matrix.json +398 -0
  69. package/fixtures/turn_compiler_vectors.json +645 -0
  70. package/package.json +39 -0
@@ -0,0 +1,229 @@
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.",
3
+ "audit_schema_version": "federation-leak-audit/v1",
4
+ "private_tag_families": [
5
+ "credential",
6
+ "family",
7
+ "financial",
8
+ "health",
9
+ "legal",
10
+ "personal",
11
+ "private",
12
+ "secret"
13
+ ],
14
+ "cases": [
15
+ {
16
+ "name": "credential_in_summary",
17
+ "manifest": {
18
+ "known_entities": [
19
+ {
20
+ "name": "API",
21
+ "summary": "the service_role key for supabase",
22
+ "visibility": "team"
23
+ }
24
+ ]
25
+ },
26
+ "expected_findings": [
27
+ {
28
+ "kind": "credential",
29
+ "location": "known_entities[0].summary"
30
+ }
31
+ ]
32
+ },
33
+ {
34
+ "name": "credential_in_files_touched",
35
+ "manifest": {
36
+ "recent_sessions": [
37
+ {
38
+ "date": "2026-06-20",
39
+ "files_touched": [
40
+ "src/app.ts",
41
+ "config/.env"
42
+ ]
43
+ }
44
+ ]
45
+ },
46
+ "expected_findings": [
47
+ {
48
+ "kind": "credential",
49
+ "location": "recent_sessions[0].files_touched[1]"
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ "name": "credential_in_role_narrative",
55
+ "manifest": {
56
+ "agent": {
57
+ "id": "x",
58
+ "type": "code-assistant",
59
+ "role_narrative": "rotate the api_key before every deploy"
60
+ }
61
+ },
62
+ "expected_findings": [
63
+ {
64
+ "kind": "credential",
65
+ "location": "agent.role_narrative"
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ "name": "credential_in_top_level_capabilities",
71
+ "manifest": {
72
+ "capabilities": [
73
+ "state_db",
74
+ "the bearer token is read from .env"
75
+ ]
76
+ },
77
+ "expected_findings": [
78
+ {
79
+ "kind": "credential",
80
+ "location": "capabilities[1]"
81
+ }
82
+ ]
83
+ },
84
+ {
85
+ "name": "private_entity_explicit",
86
+ "manifest": {
87
+ "known_entities": [
88
+ {
89
+ "name": "SecretProj",
90
+ "type": "project",
91
+ "visibility": "private"
92
+ }
93
+ ]
94
+ },
95
+ "expected_findings": [
96
+ {
97
+ "kind": "visibility",
98
+ "location": "known_entities[0]"
99
+ }
100
+ ]
101
+ },
102
+ {
103
+ "name": "private_tag_family_entity",
104
+ "manifest": {
105
+ "known_entities": [
106
+ {
107
+ "name": "Payroll",
108
+ "type": "concept",
109
+ "tags": [
110
+ "financial"
111
+ ]
112
+ }
113
+ ]
114
+ },
115
+ "expected_findings": [
116
+ {
117
+ "kind": "visibility",
118
+ "location": "known_entities[0]"
119
+ }
120
+ ]
121
+ },
122
+ {
123
+ "name": "private_tagged_session",
124
+ "manifest": {
125
+ "recent_sessions": [
126
+ {
127
+ "date": "2026-06-20",
128
+ "tags": [
129
+ "personal"
130
+ ]
131
+ }
132
+ ]
133
+ },
134
+ "expected_findings": [
135
+ {
136
+ "kind": "visibility",
137
+ "location": "recent_sessions[0]"
138
+ }
139
+ ]
140
+ },
141
+ {
142
+ "name": "manifest_declared_private_tag",
143
+ "manifest": {
144
+ "known_entities": [
145
+ {
146
+ "name": "Vault",
147
+ "type": "project",
148
+ "tags": [
149
+ "client-confidential"
150
+ ]
151
+ }
152
+ ],
153
+ "visibility_policy": {
154
+ "default": "team",
155
+ "private_tags": [
156
+ "client-confidential"
157
+ ]
158
+ }
159
+ },
160
+ "expected_findings": [
161
+ {
162
+ "kind": "visibility",
163
+ "location": "known_entities[0]"
164
+ }
165
+ ]
166
+ },
167
+ {
168
+ "name": "clean_manifest",
169
+ "manifest": {
170
+ "known_entities": [
171
+ {
172
+ "name": "Bourdon",
173
+ "type": "project",
174
+ "summary": "memory federation",
175
+ "visibility": "team"
176
+ }
177
+ ],
178
+ "recent_sessions": [
179
+ {
180
+ "date": "2026-06-20",
181
+ "key_actions": [
182
+ "refactored the L6 store"
183
+ ],
184
+ "visibility": "team"
185
+ }
186
+ ]
187
+ },
188
+ "expected_findings": []
189
+ },
190
+ {
191
+ "name": "policy_names_not_self_flagged",
192
+ "manifest": {
193
+ "known_entities": [
194
+ {
195
+ "name": "Bourdon",
196
+ "type": "project",
197
+ "visibility": "team"
198
+ }
199
+ ],
200
+ "visibility_policy": {
201
+ "default": "team",
202
+ "private_tags": [
203
+ "credential",
204
+ "secret",
205
+ "password",
206
+ "private_key"
207
+ ]
208
+ }
209
+ },
210
+ "expected_findings": []
211
+ },
212
+ {
213
+ "name": "garbage_non_dict_manifest",
214
+ "manifest": "not a dict",
215
+ "expected_findings": []
216
+ },
217
+ {
218
+ "name": "garbage_malformed_collections",
219
+ "manifest": {
220
+ "known_entities": "nope",
221
+ "recent_sessions": [
222
+ null,
223
+ 42
224
+ ]
225
+ },
226
+ "expected_findings": []
227
+ }
228
+ ]
229
+ }
@@ -0,0 +1,304 @@
1
+ {
2
+ "_doc": "Index of cross-impl parity fixtures. conformance_version bumps on any fixture change (patch=added cases, minor=new family, major=changed expected-output = a reviewed behavior change). Python is the oracle; this file is generated by tools/gen_conformance.py.",
3
+ "conformance_version": "1.7.0",
4
+ "produced_against": {
5
+ "bourdon_version": "0.11.0"
6
+ },
7
+ "fixtures": [
8
+ {
9
+ "path": "redaction_battery.json",
10
+ "sha256": "dc648b86445165a11f5fd25b7f8c7b7144d3abcaf6bf602ae5eceb60ffe856a2",
11
+ "producer": "tools/gen_conformance.py::redaction_battery"
12
+ },
13
+ {
14
+ "path": "leak_cases.json",
15
+ "sha256": "6a5a100b11ffb138f933f7e8c47a4f6ce49cecd1a4f6dfa4635c1b022b573fc7",
16
+ "producer": "tools/gen_conformance.py::leak_cases"
17
+ },
18
+ {
19
+ "path": "recognition_vectors.json",
20
+ "sha256": "229b25bbf7521d821bb3e36661f47d6dbd837970964774346eee0f6ab8d0e686",
21
+ "producer": "tools/gen_conformance.py::recognition_vectors"
22
+ },
23
+ {
24
+ "path": "recognition_golden_v1.yaml",
25
+ "sha256": "d39272869976e192060eb9b2f0a0c289a18f43f78e15dc32192977876dd682db",
26
+ "producer": "tools/gen_conformance.py::recognition_vectors"
27
+ },
28
+ {
29
+ "path": "l5_schema.json",
30
+ "sha256": "c9bbee36b08656aaddf7584a94c0640ae9933177506be6ce656613fce5800ec7",
31
+ "producer": "tools/gen_conformance.py::l5_schema_and_manifests"
32
+ },
33
+ {
34
+ "path": "l5_manifests/valid/minimal.json",
35
+ "sha256": "2d06070185ed9141f3cfbe969f7e726e07785b3f71a3dc92404debe121e2f606",
36
+ "producer": "tools/gen_conformance.py::l5_schema_and_manifests"
37
+ },
38
+ {
39
+ "path": "l5_manifests/valid/full.json",
40
+ "sha256": "6204750867c74436691db72ba3cd6818d5a3fb6bc57f0447855c39bb607ca1d1",
41
+ "producer": "tools/gen_conformance.py::l5_schema_and_manifests"
42
+ },
43
+ {
44
+ "path": "l5_manifests/valid/team-and-private.json",
45
+ "sha256": "1cc77d236bad1b90f79b7e41e8f1765309bfca68d8fb4cd21138c470387ceec1",
46
+ "producer": "tools/gen_conformance.py::l5_schema_and_manifests"
47
+ },
48
+ {
49
+ "path": "l5_manifests/invalid/missing-required-last_updated.json",
50
+ "sha256": "51b938efb6461f64dc40afe08dcd66dbb910e2985f0f4274122c5d7997b6d1f5",
51
+ "producer": "tools/gen_conformance.py::l5_schema_and_manifests"
52
+ },
53
+ {
54
+ "path": "l5_manifests/invalid/bad-spec-version-pattern.json",
55
+ "sha256": "1a707a3d97c882e1e248690438c956afd2c4da94f17b4dd74ca7119ea1accdb5",
56
+ "producer": "tools/gen_conformance.py::l5_schema_and_manifests"
57
+ },
58
+ {
59
+ "path": "l5_manifests/invalid/bad-agent-type-enum.json",
60
+ "sha256": "1e7f6ac2f8f263edf3d7f8d4a65ff10502ca05d794846b235fc3fc6d9584e3c0",
61
+ "producer": "tools/gen_conformance.py::l5_schema_and_manifests"
62
+ },
63
+ {
64
+ "path": "l5_manifests/invalid/entity-bad-visibility-enum.json",
65
+ "sha256": "5b4c2173fb7a21a2cb0efa0710e9104ce6ba22721746d4d5ceae86eed1230472",
66
+ "producer": "tools/gen_conformance.py::l5_schema_and_manifests"
67
+ },
68
+ {
69
+ "path": "l5_manifests/invalid/entity-missing-name.json",
70
+ "sha256": "6836bb9f6143ee82aa772836850832538ddfa6fc8cd6047e27848418746bd4b6",
71
+ "producer": "tools/gen_conformance.py::l5_schema_and_manifests"
72
+ },
73
+ {
74
+ "path": "l5_manifests/invalid/reasons.json",
75
+ "sha256": "7457175cf3406f910a68d0b72c9b1149d1c5962e2a929ecbdb90984fe92500fd",
76
+ "producer": "tools/gen_conformance.py::l5_schema_and_manifests"
77
+ },
78
+ {
79
+ "path": "l5_todict.json",
80
+ "sha256": "0c83c95cd8f4efb9e32e816d4b28243b06da031079cff3a55440b00f8fcb2b34",
81
+ "producer": "tools/gen_conformance.py::l5_schema_and_manifests"
82
+ },
83
+ {
84
+ "path": "fed_seed_library/agents/claude-code.l5.yaml",
85
+ "sha256": "a38fcc6c2e9d743449b3b969a9bf79b283a0fde24958bcc8f479a6af11d94c58",
86
+ "producer": "tools/gen_conformance.py::fed_seed_library"
87
+ },
88
+ {
89
+ "path": "fed_seed_library/agents/codex.l5.yaml",
90
+ "sha256": "025ced64d65d394f3937b2e1e60fad7495fc395e44c9738e0086eb9fb3c5b428",
91
+ "producer": "tools/gen_conformance.py::fed_seed_library"
92
+ },
93
+ {
94
+ "path": "tier_matrix.json",
95
+ "sha256": "620c762af64132214e1ea7067b24d073a74a981949f787b9dd3e11558d2e9371",
96
+ "producer": "tools/gen_conformance.py::tier_matrix"
97
+ },
98
+ {
99
+ "path": "on_disk/federation.yaml",
100
+ "sha256": "7a3795961d369ec57a6caa6af15e250d016c98e883077e82d7d103bd0c016cfe",
101
+ "producer": "tools/gen_conformance.py::federation_on_disk"
102
+ },
103
+ {
104
+ "path": "on_disk/audit.jsonl",
105
+ "sha256": "b4c5f3980e36f3585ad04d14e2f9e9939900a710e4d5ad6e123f4540cc05f16a",
106
+ "producer": "tools/gen_conformance.py::federation_on_disk"
107
+ },
108
+ {
109
+ "path": "on_disk/auth_vectors.json",
110
+ "sha256": "c48be69e564767155a4414c6723846a6f921d9c032bf1ed927103678d3f2529d",
111
+ "producer": "tools/gen_conformance.py::federation_on_disk"
112
+ },
113
+ {
114
+ "path": "mcp_snapshots/query_agent_memory.req.json",
115
+ "sha256": "596ac7e85eb1afe05da799ea34593c75bd27d56be57ec86706713b469df7e7fc",
116
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
117
+ },
118
+ {
119
+ "path": "mcp_snapshots/query_agent_memory.res.json",
120
+ "sha256": "a16077a6f9105f5d88a32ffbaeb2689e3184aca558f7960ef12f0f4790791808",
121
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
122
+ },
123
+ {
124
+ "path": "mcp_snapshots/list_recent_work.req.json",
125
+ "sha256": "442f2557bcdfb8cd5fbe5e8eaa4aef269fb9a93c9ba1060130a72975dd3f98df",
126
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
127
+ },
128
+ {
129
+ "path": "mcp_snapshots/list_recent_work.res.json",
130
+ "sha256": "ce42ba942bbc368866a0f6deca120a9263058e90c94862bfce88fee299be4d3a",
131
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
132
+ },
133
+ {
134
+ "path": "mcp_snapshots/find_entity.req.json",
135
+ "sha256": "a40e121827a32ed13ed20f361c771d784fc2d1b19c212a3c35d20c7265e52041",
136
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
137
+ },
138
+ {
139
+ "path": "mcp_snapshots/find_entity.res.json",
140
+ "sha256": "b6881e05615333d99d8bb6b0966c4bb233cc35d94ab97d8d6b0bc55949e7141b",
141
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
142
+ },
143
+ {
144
+ "path": "mcp_snapshots/list_agents.req.json",
145
+ "sha256": "80c17300d53998e351d8647f5af0e9660944e657b1ab05c9b3a29a23e170e22c",
146
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
147
+ },
148
+ {
149
+ "path": "mcp_snapshots/list_agents.res.json",
150
+ "sha256": "bd46021a28cc8bd0c17b614f851b33ac5d291ffa8bd9c947254248d9733bc5b7",
151
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
152
+ },
153
+ {
154
+ "path": "mcp_snapshots/export_agents.req.json",
155
+ "sha256": "6c19c751d9279ca021ca229c219272cfb12203abe03d824f82cb8f27d0abd4bc",
156
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
157
+ },
158
+ {
159
+ "path": "mcp_snapshots/export_agents.res.json",
160
+ "sha256": "af70539f49e7882b03eb2018dd34fb748b13bfb11d953a166adbb2d54b354f17",
161
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
162
+ },
163
+ {
164
+ "path": "mcp_snapshots/commit_to_federation.req.json",
165
+ "sha256": "da0faa15708bac21e7d6e551d12a4fa70ac29a1d2aaf025fd91989992d22d938",
166
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
167
+ },
168
+ {
169
+ "path": "mcp_snapshots/commit_to_federation.res.json",
170
+ "sha256": "96b8ee3c0017587a5aee35aaf1553a1786fa6acae9be16294aa1c9590523bfaa",
171
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
172
+ },
173
+ {
174
+ "path": "mcp_snapshots/get_cross_agent_summary.req.json",
175
+ "sha256": "edb772ecf81d4b0ff119aea718c8c087bf527c32b094a3b61aca502229143fc9",
176
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
177
+ },
178
+ {
179
+ "path": "mcp_snapshots/get_cross_agent_summary.res.json",
180
+ "sha256": "ada93fb31ec2981e4a34cf67aaea995a82516ae57d329c5aea72fe01c157c00a",
181
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
182
+ },
183
+ {
184
+ "path": "mcp_snapshots/prepare_recognition_context.req.json",
185
+ "sha256": "524689f2b4d0e6e29fcc30579e36c05e89d5a6bba4db1c6e52abf65f8b63eacf",
186
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
187
+ },
188
+ {
189
+ "path": "mcp_snapshots/prepare_recognition_context.res.json",
190
+ "sha256": "fed8be60118cc027654ce8c2d1bb072482808c62e7997fd236ba276d5a50a580",
191
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
192
+ },
193
+ {
194
+ "path": "mcp_snapshots/compile_codex_turn.req.json",
195
+ "sha256": "681c56c29918c85d4417b562e1e95d3fe9f438a89d0e867f2eabd56e85e3a1d1",
196
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
197
+ },
198
+ {
199
+ "path": "mcp_snapshots/compile_codex_turn.res.json",
200
+ "sha256": "d662fd546ee6ba3315a751d68d2d096b5d21d338cf3c65970f09431f666f5e6b",
201
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
202
+ },
203
+ {
204
+ "path": "mcp_snapshots/get_deeper_context.req.json",
205
+ "sha256": "ca5d6f3472a3a74b1710e8ee093e5648b737bf6635656a21306ef73656fd533f",
206
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
207
+ },
208
+ {
209
+ "path": "mcp_snapshots/get_deeper_context.res.json",
210
+ "sha256": "842926cd013275692fd11daab8553a329f2685c870b59389ee5b075544d5ed49",
211
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
212
+ },
213
+ {
214
+ "path": "mcp_snapshots/seed_library.json",
215
+ "sha256": "64742d18945ed031b09c6ddb784785e7f504b158ed792349fd624e640b84cb14",
216
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
217
+ },
218
+ {
219
+ "path": "mcp_snapshots/_normalizer.json",
220
+ "sha256": "e7eebbd0f68d967a6517d23b7d483a3a9296b109f7b7aff4431931877842c347",
221
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
222
+ },
223
+ {
224
+ "path": "native_stores/hermes/store/.hermes/state.db",
225
+ "sha256": "44742d90bd760657bface83a22a5610b1b6fb3c065cd7035669d2b4a72e2d585",
226
+ "producer": "tools/gen_conformance.py::native_stores"
227
+ },
228
+ {
229
+ "path": "native_stores/hermes/store/.hermes/memories/memory.md",
230
+ "sha256": "45c32c828e96353b409204eeeda1df7b89f75699ec46bffff32df6d3c9781804",
231
+ "producer": "tools/gen_conformance.py::native_stores"
232
+ },
233
+ {
234
+ "path": "native_stores/hermes/store/.hermes/memories/user.md",
235
+ "sha256": "eba3d961098a45f93641a9be6a1abeb07f05bd44caf4a3ba8816cbee9cc6e8ad",
236
+ "producer": "tools/gen_conformance.py::native_stores"
237
+ },
238
+ {
239
+ "path": "native_stores/hermes/expected_l5.json",
240
+ "sha256": "f4360618c6decdeddb0a08afaf2d98dc50fe06264cbab6c02a345fbc38e7a57c",
241
+ "producer": "tools/gen_conformance.py::native_stores"
242
+ },
243
+ {
244
+ "path": "native_stores/claude_code/store/brain/PROJECTS/Bourdon/OVERVIEW.md",
245
+ "sha256": "6e9778f2a4d631ffa93693096d7a223c25eb7290913aa192bf9e8174528b5e5b",
246
+ "producer": "tools/gen_conformance.py::native_stores"
247
+ },
248
+ {
249
+ "path": "native_stores/claude_code/store/brain/PROJECTS/OldThing/OVERVIEW.md",
250
+ "sha256": "81f06ef015753b81914ddd920a5d3cd5a33bd3695f4b0f9cd411352d017c56de",
251
+ "producer": "tools/gen_conformance.py::native_stores"
252
+ },
253
+ {
254
+ "path": "native_stores/claude_code/store/brain/LOG/2026-06-28-pc.md",
255
+ "sha256": "e9265a450bf76800560bb5c0697f85bc3edcd0a9d3642700253fba27427974aa",
256
+ "producer": "tools/gen_conformance.py::native_stores"
257
+ },
258
+ {
259
+ "path": "native_stores/claude_code/store/auto_memory/MEMORY.md",
260
+ "sha256": "d5c49419aa0436c56b3e49d810e67a7fa31fb9c0ba55bc88302059a855b477cf",
261
+ "producer": "tools/gen_conformance.py::native_stores"
262
+ },
263
+ {
264
+ "path": "native_stores/claude_code/store/auto_memory/clyde.md",
265
+ "sha256": "dd0b03ac047fcc377cf104e3be32807d89d4ac59a3d06b283d3b8b48d85a755c",
266
+ "producer": "tools/gen_conformance.py::native_stores"
267
+ },
268
+ {
269
+ "path": "native_stores/claude_code/store/auto_memory/ry-guy.md",
270
+ "sha256": "022cde0d5bfdaf2beae38f9b831b8b2c16e2823e705c1f5ff050a9c72374ee86",
271
+ "producer": "tools/gen_conformance.py::native_stores"
272
+ },
273
+ {
274
+ "path": "native_stores/claude_code/store/knowledge_graph/memory.jsonl",
275
+ "sha256": "6d15efda0caabc52037385908b40fcf6becb3bfa7ead33c13535ab6b6cc401a1",
276
+ "producer": "tools/gen_conformance.py::native_stores"
277
+ },
278
+ {
279
+ "path": "native_stores/claude_code/expected_l5.json",
280
+ "sha256": "09b7431c42caf316b99ba4d743a328e83ad066284b6e325e322c5683bbdc38f7",
281
+ "producer": "tools/gen_conformance.py::native_stores"
282
+ },
283
+ {
284
+ "path": "native_stores/github_copilot/cache/github-copilot/payload.json",
285
+ "sha256": "2e9a1f6d19927417bd78bbdfa4260d11ea4b258f5e2a471549de460c433d3aaa",
286
+ "producer": "tools/gen_conformance.py::native_stores"
287
+ },
288
+ {
289
+ "path": "native_stores/github_copilot/expected_l5.json",
290
+ "sha256": "922e291c19f7729cf39242a31de8ff6e5fddd41d5fb9fce6e8f623b0e7c50824",
291
+ "producer": "tools/gen_conformance.py::native_stores"
292
+ },
293
+ {
294
+ "path": "native_stores/README.json",
295
+ "sha256": "7ba6f1f94f29a126af316c501934d125ba2d90e73e5fc28a3b01a8f63c53c037",
296
+ "producer": "tools/gen_conformance.py::native_stores"
297
+ },
298
+ {
299
+ "path": "turn_compiler_vectors.json",
300
+ "sha256": "add466b02d93cd706c92cdd1f0a2c43b9d633efe19d7ae0319eaa2ade7530f38",
301
+ "producer": "tools/gen_conformance.py::turn_compiler_vectors"
302
+ }
303
+ ]
304
+ }
@@ -0,0 +1,134 @@
1
+ {
2
+ "_doc": "Fixture-tests the MCP snapshot NORMALIZER itself. Each `normalized` is normalize_snapshot(`raw`) computed by the oracle. Rules: sort object keys (write-time), round floats to 4 dp, drop null + empty-list dict fields, freeze {last_updated, generated_at, generated_from, path} -> '<frozen>', drop latency fields {recognition_latency_us, peer_latencies_us}, decode next_cursor base64 -> {offset:N}. The TS canonicalizer must match each pair.",
3
+ "cases": [
4
+ {
5
+ "_doc": "drops null + empty-list fields (to_dict omission parity)",
6
+ "normalized": {
7
+ "kept": "x",
8
+ "zero": 0
9
+ },
10
+ "raw": {
11
+ "agent": null,
12
+ "files_touched": [],
13
+ "kept": "x",
14
+ "zero": 0
15
+ }
16
+ },
17
+ {
18
+ "_doc": "rounds floats to 4 dp; bools are untouched",
19
+ "normalized": {
20
+ "ok": true,
21
+ "ratio": 0.1235,
22
+ "score": 71.6667
23
+ },
24
+ "raw": {
25
+ "ok": true,
26
+ "ratio": 0.1234567,
27
+ "score": 71.66666666
28
+ }
29
+ },
30
+ {
31
+ "_doc": "freezes last_updated / path / generated_from / generated_at",
32
+ "normalized": {
33
+ "generated_at": "<frozen>",
34
+ "generated_from": "<frozen>",
35
+ "last_updated": "<frozen>",
36
+ "path": "<frozen>"
37
+ },
38
+ "raw": {
39
+ "generated_at": "2026-06-30T02:59:09Z",
40
+ "generated_from": "/tmp/x/agents",
41
+ "last_updated": "2026-06-30T02:59:09.096243+00:00",
42
+ "path": "/tmp/x/clyde.l5.yaml"
43
+ }
44
+ },
45
+ {
46
+ "_doc": "drops latency fields wholesale (runtime-dependent)",
47
+ "normalized": {
48
+ "confidence": "medium"
49
+ },
50
+ "raw": {
51
+ "confidence": "medium",
52
+ "peer_latencies_us": {
53
+ "mac": 9.1
54
+ },
55
+ "recognition_latency_us": 140.5
56
+ }
57
+ },
58
+ {
59
+ "_doc": "decodes a base64 next_cursor to its {offset} payload; null cursor drops",
60
+ "normalized": {
61
+ "has_more": true,
62
+ "next_cursor": {
63
+ "offset": 2
64
+ }
65
+ },
66
+ "raw": {
67
+ "has_more": true,
68
+ "next_cursor": "eyJvZmZzZXQiOjJ9"
69
+ }
70
+ },
71
+ {
72
+ "_doc": "null next_cursor (last page) is dropped like any other null",
73
+ "normalized": {
74
+ "has_more": false
75
+ },
76
+ "raw": {
77
+ "has_more": false,
78
+ "next_cursor": null
79
+ }
80
+ },
81
+ {
82
+ "_doc": "nested arrays keep their order; nested null/empty dropped per-field",
83
+ "normalized": {
84
+ "sessions": [
85
+ {
86
+ "agent": "codex",
87
+ "project_focus": [
88
+ "A"
89
+ ]
90
+ },
91
+ {
92
+ "agent": "claude-code",
93
+ "project_focus": [
94
+ "B"
95
+ ]
96
+ }
97
+ ]
98
+ },
99
+ "raw": {
100
+ "sessions": [
101
+ {
102
+ "agent": "codex",
103
+ "cwd": null,
104
+ "files_touched": [],
105
+ "project_focus": [
106
+ "A"
107
+ ]
108
+ },
109
+ {
110
+ "agent": "claude-code",
111
+ "project_focus": [
112
+ "B"
113
+ ]
114
+ }
115
+ ]
116
+ }
117
+ }
118
+ ],
119
+ "cursor_fields": [
120
+ "next_cursor"
121
+ ],
122
+ "drop_latency_fields": [
123
+ "peer_latencies_us",
124
+ "recognition_latency_us"
125
+ ],
126
+ "float_precision": 4,
127
+ "freeze_fields": [
128
+ "generated_at",
129
+ "generated_from",
130
+ "last_updated",
131
+ "path"
132
+ ],
133
+ "frozen_sentinel": "<frozen>"
134
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "args": {
3
+ "agent_id": "clyde",
4
+ "agent_type": "other",
5
+ "entities": [
6
+ {
7
+ "name": "SnapshotEntity",
8
+ "summary": "mcp snapshot probe"
9
+ }
10
+ ],
11
+ "mode": "merge",
12
+ "sessions": [
13
+ {
14
+ "date": "2026-06-09"
15
+ }
16
+ ]
17
+ },
18
+ "tool": "commit_to_federation"
19
+ }