@getbourdon/conformance 0.7.0 → 0.8.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Typed loaders for the language-neutral parity fixtures produced by the Python\n * oracle (`~/repos/bourdon/tools/gen_conformance.py`). Python is the source of\n * truth; the @getbourdon/* TypeScript mirror asserts against these exact bytes.\n *\n * Resolution order:\n * 1. `BOURDON_CONFORMANCE_DIR` env var — the oracle checkout (parity tests +\n * oracle dev use this; highest priority so a build always asserts against\n * the live oracle).\n * 2. the fixtures BUNDLED in this package (`<pkg>/fixtures`, shipped in the\n * tarball) — what an installed `@getbourdon/conformance` consumer gets.\n * 3. the sibling Python checkout `../../bourdon/conformance` — dev fallback.\n *\n * The bundled copy is a vendored snapshot refreshed from the oracle by\n * `pnpm --filter @getbourdon/conformance sync-fixtures` (and in the release\n * workflow before publish), so the published package is self-contained.\n */\n\n// `import.meta.url` in ESM; esbuild empties it in the CJS bundle, where the\n// native `__dirname` global is the real directory — fall back to it.\ndeclare const __dirname: string | undefined;\nfunction moduleDir(): string {\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\n return dirname(fileURLToPath(import.meta.url));\n }\n return typeof __dirname !== \"undefined\" ? __dirname : process.cwd();\n}\n\nexport interface RedactionSecretCase {\n /** Joined at load (`assembleSecret`) so no contiguous secret literal lands in git. */\n fragments: string[];\n expect_redacted: string;\n expect_contains_secret: boolean;\n}\n\nexport interface RedactionBenignCase {\n text: string;\n expect_redacted: string;\n expect_contains_secret: boolean;\n}\n\nexport interface RedactionBattery {\n redacted_sentinel: string;\n benign_limit: number;\n secrets: RedactionSecretCase[];\n benign: RedactionBenignCase[];\n}\n\nexport interface ConformanceFixtureMeta {\n path: string;\n sha256: string;\n producer: string;\n}\n\nexport interface ConformanceManifest {\n conformance_version: string;\n produced_against: { bourdon_version: string };\n fixtures: ConformanceFixtureMeta[];\n}\n\nexport function conformanceDir(): string {\n const override = process.env.BOURDON_CONFORMANCE_DIR;\n if (override) return override;\n // Bundled snapshot: <pkg>/fixtures, one level up from src/ or dist/.\n const bundled = resolve(moduleDir(), \"..\", \"fixtures\");\n if (existsSync(resolve(bundled, \"manifest.json\"))) return bundled;\n // Dev fallback: the sibling Python oracle checkout.\n return resolve(process.cwd(), \"..\", \"..\", \"bourdon\", \"conformance\");\n}\n\nfunction loadJson<T>(name: string): T {\n return JSON.parse(readFileSync(resolve(conformanceDir(), name), \"utf8\")) as T;\n}\n\nexport function loadManifest(): ConformanceManifest {\n return loadJson<ConformanceManifest>(\"manifest.json\");\n}\n\nexport interface FixturePin {\n conformance_version: string;\n manifest_sha256: string;\n}\n\n/** The recorded fixture pin committed beside this package: which contract\n * version the vendored snapshot is, and the sha256 the manifest must hash to. */\nexport function loadPin(): FixturePin {\n return JSON.parse(\n readFileSync(resolve(moduleDir(), \"..\", \"fixtures.pin.json\"), \"utf8\"),\n ) as FixturePin;\n}\n\n/** sha256 hex of one file's raw bytes. */\nexport function sha256File(path: string): string {\n return createHash(\"sha256\").update(readFileSync(path)).digest(\"hex\");\n}\n\nexport interface FixtureMismatch {\n path: string;\n expected: string;\n actual: string;\n}\n\n/** Verify every fixture in `dir` against the sha256 its manifest stamps.\n * Returns the mismatches — an empty array is the only passing result. The\n * same routine backs the parity gate AND its mutation test, so the check\n * that guards releases is itself provably able to fail. */\nexport function verifyFixtureHashes(dir: string = conformanceDir()): FixtureMismatch[] {\n const manifest = JSON.parse(\n readFileSync(resolve(dir, \"manifest.json\"), \"utf8\"),\n ) as ConformanceManifest;\n const mismatches: FixtureMismatch[] = [];\n for (const fixture of manifest.fixtures) {\n const actual = sha256File(resolve(dir, fixture.path));\n if (actual !== fixture.sha256) {\n mismatches.push({ path: fixture.path, expected: fixture.sha256, actual });\n }\n }\n return mismatches;\n}\n\nexport function loadRedactionBattery(): RedactionBattery {\n return loadJson<RedactionBattery>(\"redaction_battery.json\");\n}\n\n/** Reconstruct a secret case's runtime string from its fragments. */\nexport function assembleSecret(secret: RedactionSecretCase): string {\n return secret.fragments.join(\"\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA2B;AAC3B,qBAAyC;AACzC,uBAAiC;AACjC,sBAA8B;AAH9B;AA0BA,SAAS,YAAoB;AAC3B,MAAI,OAAO,gBAAgB,eAAe,YAAY,KAAK;AACzD,eAAO,8BAAQ,+BAAc,YAAY,GAAG,CAAC;AAAA,EAC/C;AACA,SAAO,OAAO,cAAc,cAAc,YAAY,QAAQ,IAAI;AACpE;AAkCO,SAAS,iBAAyB;AACvC,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,SAAU,QAAO;AAErB,QAAM,cAAU,0BAAQ,UAAU,GAAG,MAAM,UAAU;AACrD,UAAI,+BAAW,0BAAQ,SAAS,eAAe,CAAC,EAAG,QAAO;AAE1D,aAAO,0BAAQ,QAAQ,IAAI,GAAG,MAAM,MAAM,WAAW,aAAa;AACpE;AAEA,SAAS,SAAY,MAAiB;AACpC,SAAO,KAAK,UAAM,iCAAa,0BAAQ,eAAe,GAAG,IAAI,GAAG,MAAM,CAAC;AACzE;AAEO,SAAS,eAAoC;AAClD,SAAO,SAA8B,eAAe;AACtD;AASO,SAAS,UAAsB;AACpC,SAAO,KAAK;AAAA,QACV,iCAAa,0BAAQ,UAAU,GAAG,MAAM,mBAAmB,GAAG,MAAM;AAAA,EACtE;AACF;AAGO,SAAS,WAAW,MAAsB;AAC/C,aAAO,+BAAW,QAAQ,EAAE,WAAO,6BAAa,IAAI,CAAC,EAAE,OAAO,KAAK;AACrE;AAYO,SAAS,oBAAoB,MAAc,eAAe,GAAsB;AACrF,QAAM,WAAW,KAAK;AAAA,QACpB,iCAAa,0BAAQ,KAAK,eAAe,GAAG,MAAM;AAAA,EACpD;AACA,QAAM,aAAgC,CAAC;AACvC,aAAW,WAAW,SAAS,UAAU;AACvC,UAAM,SAAS,eAAW,0BAAQ,KAAK,QAAQ,IAAI,CAAC;AACpD,QAAI,WAAW,QAAQ,QAAQ;AAC7B,iBAAW,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,uBAAyC;AACvD,SAAO,SAA2B,wBAAwB;AAC5D;AAGO,SAAS,eAAe,QAAqC;AAClE,SAAO,OAAO,UAAU,KAAK,EAAE;AACjC;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Typed loaders for the language-neutral parity fixtures produced by the Python\n * oracle (`~/repos/bourdon/tools/gen_conformance.py`). Python is the source of\n * truth; the @getbourdon/* TypeScript mirror asserts against these exact bytes.\n *\n * Resolution order:\n * 1. `BOURDON_CONFORMANCE_DIR` env var — the oracle checkout (parity tests +\n * oracle dev use this; highest priority so a build always asserts against\n * the live oracle).\n * 2. the fixtures BUNDLED in this package (`<pkg>/fixtures`, shipped in the\n * tarball) — what an installed `@getbourdon/conformance` consumer gets.\n * 3. the sibling Python checkout `../../bourdon/conformance` — dev fallback.\n *\n * The bundled copy is a vendored snapshot refreshed from the oracle by\n * `pnpm --filter @getbourdon/conformance sync-fixtures` (and in the release\n * workflow before publish), so the published package is self-contained.\n */\n\n// `import.meta.url` in ESM; esbuild empties it in the CJS bundle, where the\n// native `__dirname` global is the real directory — fall back to it.\ndeclare const __dirname: string | undefined;\nfunction moduleDir(): string {\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\n return dirname(fileURLToPath(import.meta.url));\n }\n return typeof __dirname !== \"undefined\" ? __dirname : process.cwd();\n}\n\nexport interface RedactionSecretCase {\n /** Joined at load (`assembleSecret`) so no contiguous secret literal lands in git. */\n fragments: string[];\n expect_redacted: string;\n expect_contains_secret: boolean;\n}\n\nexport interface RedactionBenignCase {\n text: string;\n expect_redacted: string;\n expect_contains_secret: boolean;\n}\n\nexport interface RedactionBattery {\n redacted_sentinel: string;\n benign_limit: number;\n secrets: RedactionSecretCase[];\n benign: RedactionBenignCase[];\n}\n\nexport interface ConformanceFixtureMeta {\n path: string;\n sha256: string;\n producer: string;\n}\n\nexport interface ConformanceManifest {\n conformance_version: string;\n produced_against: { bourdon_version: string };\n fixtures: ConformanceFixtureMeta[];\n}\n\nexport function conformanceDir(): string {\n const override = process.env.BOURDON_CONFORMANCE_DIR;\n if (override) return override;\n // Bundled snapshot: <pkg>/fixtures, one level up from src/ or dist/.\n const bundled = resolve(moduleDir(), \"..\", \"fixtures\");\n if (existsSync(resolve(bundled, \"manifest.json\"))) return bundled;\n // Dev fallback: the sibling Python oracle checkout.\n return resolve(process.cwd(), \"..\", \"..\", \"bourdon\", \"conformance\");\n}\n\nfunction loadJson<T>(name: string): T {\n return JSON.parse(readFileSync(resolve(conformanceDir(), name), \"utf8\")) as T;\n}\n\nexport function loadManifest(): ConformanceManifest {\n return loadJson<ConformanceManifest>(\"manifest.json\");\n}\n\nexport interface FixturePin {\n conformance_version: string;\n manifest_sha256: string;\n}\n\n/** The recorded fixture pin committed beside this package: which contract\n * version the vendored snapshot is, and the sha256 the manifest must hash to. */\nexport function loadPin(): FixturePin {\n return JSON.parse(\n readFileSync(resolve(moduleDir(), \"..\", \"fixtures.pin.json\"), \"utf8\"),\n ) as FixturePin;\n}\n\n/** sha256 hex of one file's raw bytes. */\nexport function sha256File(path: string): string {\n return createHash(\"sha256\").update(readFileSync(path)).digest(\"hex\");\n}\n\nexport interface FixtureMismatch {\n path: string;\n expected: string;\n actual: string;\n}\n\n/** Verify every fixture in `dir` against the sha256 its manifest stamps.\n * Returns the mismatches — an empty array is the only passing result. The\n * same routine backs the parity gate AND its mutation test, so the check\n * that guards releases is itself provably able to fail. */\nexport function verifyFixtureHashes(dir: string = conformanceDir()): FixtureMismatch[] {\n const manifest = JSON.parse(\n readFileSync(resolve(dir, \"manifest.json\"), \"utf8\"),\n ) as ConformanceManifest;\n const mismatches: FixtureMismatch[] = [];\n for (const fixture of manifest.fixtures) {\n const actual = sha256File(resolve(dir, fixture.path));\n if (actual !== fixture.sha256) {\n mismatches.push({ path: fixture.path, expected: fixture.sha256, actual });\n }\n }\n return mismatches;\n}\n\nexport function loadRedactionBattery(): RedactionBattery {\n return loadJson<RedactionBattery>(\"redaction_battery.json\");\n}\n\n/** Reconstruct a secret case's runtime string from its fragments. */\nexport function assembleSecret(secret: RedactionSecretCase): string {\n return secret.fragments.join(\"\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,yBAA2B;AAC3B,qBAAyC;AACzC,uBAAiC;AACjC,sBAA8B;AAJ9B;AA2BA,SAAS,YAAoB;AAC3B,MAAI,OAAO,gBAAgB,eAAe,YAAY,KAAK;AACzD,eAAO,8BAAQ,+BAAc,YAAY,GAAG,CAAC;AAAA,EAC/C;AACA,SAAO,OAAO,cAAc,cAAc,YAAY,QAAQ,IAAI;AACpE;AAkCO,SAAS,iBAAyB;AACvC,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,SAAU,QAAO;AAErB,QAAM,cAAU,0BAAQ,UAAU,GAAG,MAAM,UAAU;AACrD,UAAI,+BAAW,0BAAQ,SAAS,eAAe,CAAC,EAAG,QAAO;AAE1D,aAAO,0BAAQ,QAAQ,IAAI,GAAG,MAAM,MAAM,WAAW,aAAa;AACpE;AAEA,SAAS,SAAY,MAAiB;AACpC,SAAO,KAAK,UAAM,iCAAa,0BAAQ,eAAe,GAAG,IAAI,GAAG,MAAM,CAAC;AACzE;AAEO,SAAS,eAAoC;AAClD,SAAO,SAA8B,eAAe;AACtD;AASO,SAAS,UAAsB;AACpC,SAAO,KAAK;AAAA,QACV,iCAAa,0BAAQ,UAAU,GAAG,MAAM,mBAAmB,GAAG,MAAM;AAAA,EACtE;AACF;AAGO,SAAS,WAAW,MAAsB;AAC/C,aAAO,+BAAW,QAAQ,EAAE,WAAO,6BAAa,IAAI,CAAC,EAAE,OAAO,KAAK;AACrE;AAYO,SAAS,oBAAoB,MAAc,eAAe,GAAsB;AACrF,QAAM,WAAW,KAAK;AAAA,QACpB,iCAAa,0BAAQ,KAAK,eAAe,GAAG,MAAM;AAAA,EACpD;AACA,QAAM,aAAgC,CAAC;AACvC,aAAW,WAAW,SAAS,UAAU;AACvC,UAAM,SAAS,eAAW,0BAAQ,KAAK,QAAQ,IAAI,CAAC;AACpD,QAAI,WAAW,QAAQ,QAAQ;AAC7B,iBAAW,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,uBAAyC;AACvD,SAAO,SAA2B,wBAAwB;AAC5D;AAGO,SAAS,eAAe,QAAqC;AAClE,SAAO,OAAO,UAAU,KAAK,EAAE;AACjC;","names":[]}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ // SPDX-License-Identifier: Apache-2.0
1
2
  import { createHash } from "node:crypto";
2
3
  import { existsSync, readFileSync } from "node:fs";
3
4
  import { dirname, resolve } from "node:path";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Typed loaders for the language-neutral parity fixtures produced by the Python\n * oracle (`~/repos/bourdon/tools/gen_conformance.py`). Python is the source of\n * truth; the @getbourdon/* TypeScript mirror asserts against these exact bytes.\n *\n * Resolution order:\n * 1. `BOURDON_CONFORMANCE_DIR` env var — the oracle checkout (parity tests +\n * oracle dev use this; highest priority so a build always asserts against\n * the live oracle).\n * 2. the fixtures BUNDLED in this package (`<pkg>/fixtures`, shipped in the\n * tarball) — what an installed `@getbourdon/conformance` consumer gets.\n * 3. the sibling Python checkout `../../bourdon/conformance` — dev fallback.\n *\n * The bundled copy is a vendored snapshot refreshed from the oracle by\n * `pnpm --filter @getbourdon/conformance sync-fixtures` (and in the release\n * workflow before publish), so the published package is self-contained.\n */\n\n// `import.meta.url` in ESM; esbuild empties it in the CJS bundle, where the\n// native `__dirname` global is the real directory — fall back to it.\ndeclare const __dirname: string | undefined;\nfunction moduleDir(): string {\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\n return dirname(fileURLToPath(import.meta.url));\n }\n return typeof __dirname !== \"undefined\" ? __dirname : process.cwd();\n}\n\nexport interface RedactionSecretCase {\n /** Joined at load (`assembleSecret`) so no contiguous secret literal lands in git. */\n fragments: string[];\n expect_redacted: string;\n expect_contains_secret: boolean;\n}\n\nexport interface RedactionBenignCase {\n text: string;\n expect_redacted: string;\n expect_contains_secret: boolean;\n}\n\nexport interface RedactionBattery {\n redacted_sentinel: string;\n benign_limit: number;\n secrets: RedactionSecretCase[];\n benign: RedactionBenignCase[];\n}\n\nexport interface ConformanceFixtureMeta {\n path: string;\n sha256: string;\n producer: string;\n}\n\nexport interface ConformanceManifest {\n conformance_version: string;\n produced_against: { bourdon_version: string };\n fixtures: ConformanceFixtureMeta[];\n}\n\nexport function conformanceDir(): string {\n const override = process.env.BOURDON_CONFORMANCE_DIR;\n if (override) return override;\n // Bundled snapshot: <pkg>/fixtures, one level up from src/ or dist/.\n const bundled = resolve(moduleDir(), \"..\", \"fixtures\");\n if (existsSync(resolve(bundled, \"manifest.json\"))) return bundled;\n // Dev fallback: the sibling Python oracle checkout.\n return resolve(process.cwd(), \"..\", \"..\", \"bourdon\", \"conformance\");\n}\n\nfunction loadJson<T>(name: string): T {\n return JSON.parse(readFileSync(resolve(conformanceDir(), name), \"utf8\")) as T;\n}\n\nexport function loadManifest(): ConformanceManifest {\n return loadJson<ConformanceManifest>(\"manifest.json\");\n}\n\nexport interface FixturePin {\n conformance_version: string;\n manifest_sha256: string;\n}\n\n/** The recorded fixture pin committed beside this package: which contract\n * version the vendored snapshot is, and the sha256 the manifest must hash to. */\nexport function loadPin(): FixturePin {\n return JSON.parse(\n readFileSync(resolve(moduleDir(), \"..\", \"fixtures.pin.json\"), \"utf8\"),\n ) as FixturePin;\n}\n\n/** sha256 hex of one file's raw bytes. */\nexport function sha256File(path: string): string {\n return createHash(\"sha256\").update(readFileSync(path)).digest(\"hex\");\n}\n\nexport interface FixtureMismatch {\n path: string;\n expected: string;\n actual: string;\n}\n\n/** Verify every fixture in `dir` against the sha256 its manifest stamps.\n * Returns the mismatches — an empty array is the only passing result. The\n * same routine backs the parity gate AND its mutation test, so the check\n * that guards releases is itself provably able to fail. */\nexport function verifyFixtureHashes(dir: string = conformanceDir()): FixtureMismatch[] {\n const manifest = JSON.parse(\n readFileSync(resolve(dir, \"manifest.json\"), \"utf8\"),\n ) as ConformanceManifest;\n const mismatches: FixtureMismatch[] = [];\n for (const fixture of manifest.fixtures) {\n const actual = sha256File(resolve(dir, fixture.path));\n if (actual !== fixture.sha256) {\n mismatches.push({ path: fixture.path, expected: fixture.sha256, actual });\n }\n }\n return mismatches;\n}\n\nexport function loadRedactionBattery(): RedactionBattery {\n return loadJson<RedactionBattery>(\"redaction_battery.json\");\n}\n\n/** Reconstruct a secret case's runtime string from its fragments. */\nexport function assembleSecret(secret: RedactionSecretCase): string {\n return secret.fragments.join(\"\");\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;AAC3B,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,eAAe;AACjC,SAAS,qBAAqB;AAuB9B,SAAS,YAAoB;AAC3B,MAAI,OAAO,gBAAgB,eAAe,YAAY,KAAK;AACzD,WAAO,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,EAC/C;AACA,SAAO,OAAO,cAAc,cAAc,YAAY,QAAQ,IAAI;AACpE;AAkCO,SAAS,iBAAyB;AACvC,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,SAAU,QAAO;AAErB,QAAM,UAAU,QAAQ,UAAU,GAAG,MAAM,UAAU;AACrD,MAAI,WAAW,QAAQ,SAAS,eAAe,CAAC,EAAG,QAAO;AAE1D,SAAO,QAAQ,QAAQ,IAAI,GAAG,MAAM,MAAM,WAAW,aAAa;AACpE;AAEA,SAAS,SAAY,MAAiB;AACpC,SAAO,KAAK,MAAM,aAAa,QAAQ,eAAe,GAAG,IAAI,GAAG,MAAM,CAAC;AACzE;AAEO,SAAS,eAAoC;AAClD,SAAO,SAA8B,eAAe;AACtD;AASO,SAAS,UAAsB;AACpC,SAAO,KAAK;AAAA,IACV,aAAa,QAAQ,UAAU,GAAG,MAAM,mBAAmB,GAAG,MAAM;AAAA,EACtE;AACF;AAGO,SAAS,WAAW,MAAsB;AAC/C,SAAO,WAAW,QAAQ,EAAE,OAAO,aAAa,IAAI,CAAC,EAAE,OAAO,KAAK;AACrE;AAYO,SAAS,oBAAoB,MAAc,eAAe,GAAsB;AACrF,QAAM,WAAW,KAAK;AAAA,IACpB,aAAa,QAAQ,KAAK,eAAe,GAAG,MAAM;AAAA,EACpD;AACA,QAAM,aAAgC,CAAC;AACvC,aAAW,WAAW,SAAS,UAAU;AACvC,UAAM,SAAS,WAAW,QAAQ,KAAK,QAAQ,IAAI,CAAC;AACpD,QAAI,WAAW,QAAQ,QAAQ;AAC7B,iBAAW,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,uBAAyC;AACvD,SAAO,SAA2B,wBAAwB;AAC5D;AAGO,SAAS,eAAe,QAAqC;AAClE,SAAO,OAAO,UAAU,KAAK,EAAE;AACjC;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Typed loaders for the language-neutral parity fixtures produced by the Python\n * oracle (`~/repos/bourdon/tools/gen_conformance.py`). Python is the source of\n * truth; the @getbourdon/* TypeScript mirror asserts against these exact bytes.\n *\n * Resolution order:\n * 1. `BOURDON_CONFORMANCE_DIR` env var — the oracle checkout (parity tests +\n * oracle dev use this; highest priority so a build always asserts against\n * the live oracle).\n * 2. the fixtures BUNDLED in this package (`<pkg>/fixtures`, shipped in the\n * tarball) — what an installed `@getbourdon/conformance` consumer gets.\n * 3. the sibling Python checkout `../../bourdon/conformance` — dev fallback.\n *\n * The bundled copy is a vendored snapshot refreshed from the oracle by\n * `pnpm --filter @getbourdon/conformance sync-fixtures` (and in the release\n * workflow before publish), so the published package is self-contained.\n */\n\n// `import.meta.url` in ESM; esbuild empties it in the CJS bundle, where the\n// native `__dirname` global is the real directory — fall back to it.\ndeclare const __dirname: string | undefined;\nfunction moduleDir(): string {\n if (typeof import.meta !== \"undefined\" && import.meta.url) {\n return dirname(fileURLToPath(import.meta.url));\n }\n return typeof __dirname !== \"undefined\" ? __dirname : process.cwd();\n}\n\nexport interface RedactionSecretCase {\n /** Joined at load (`assembleSecret`) so no contiguous secret literal lands in git. */\n fragments: string[];\n expect_redacted: string;\n expect_contains_secret: boolean;\n}\n\nexport interface RedactionBenignCase {\n text: string;\n expect_redacted: string;\n expect_contains_secret: boolean;\n}\n\nexport interface RedactionBattery {\n redacted_sentinel: string;\n benign_limit: number;\n secrets: RedactionSecretCase[];\n benign: RedactionBenignCase[];\n}\n\nexport interface ConformanceFixtureMeta {\n path: string;\n sha256: string;\n producer: string;\n}\n\nexport interface ConformanceManifest {\n conformance_version: string;\n produced_against: { bourdon_version: string };\n fixtures: ConformanceFixtureMeta[];\n}\n\nexport function conformanceDir(): string {\n const override = process.env.BOURDON_CONFORMANCE_DIR;\n if (override) return override;\n // Bundled snapshot: <pkg>/fixtures, one level up from src/ or dist/.\n const bundled = resolve(moduleDir(), \"..\", \"fixtures\");\n if (existsSync(resolve(bundled, \"manifest.json\"))) return bundled;\n // Dev fallback: the sibling Python oracle checkout.\n return resolve(process.cwd(), \"..\", \"..\", \"bourdon\", \"conformance\");\n}\n\nfunction loadJson<T>(name: string): T {\n return JSON.parse(readFileSync(resolve(conformanceDir(), name), \"utf8\")) as T;\n}\n\nexport function loadManifest(): ConformanceManifest {\n return loadJson<ConformanceManifest>(\"manifest.json\");\n}\n\nexport interface FixturePin {\n conformance_version: string;\n manifest_sha256: string;\n}\n\n/** The recorded fixture pin committed beside this package: which contract\n * version the vendored snapshot is, and the sha256 the manifest must hash to. */\nexport function loadPin(): FixturePin {\n return JSON.parse(\n readFileSync(resolve(moduleDir(), \"..\", \"fixtures.pin.json\"), \"utf8\"),\n ) as FixturePin;\n}\n\n/** sha256 hex of one file's raw bytes. */\nexport function sha256File(path: string): string {\n return createHash(\"sha256\").update(readFileSync(path)).digest(\"hex\");\n}\n\nexport interface FixtureMismatch {\n path: string;\n expected: string;\n actual: string;\n}\n\n/** Verify every fixture in `dir` against the sha256 its manifest stamps.\n * Returns the mismatches — an empty array is the only passing result. The\n * same routine backs the parity gate AND its mutation test, so the check\n * that guards releases is itself provably able to fail. */\nexport function verifyFixtureHashes(dir: string = conformanceDir()): FixtureMismatch[] {\n const manifest = JSON.parse(\n readFileSync(resolve(dir, \"manifest.json\"), \"utf8\"),\n ) as ConformanceManifest;\n const mismatches: FixtureMismatch[] = [];\n for (const fixture of manifest.fixtures) {\n const actual = sha256File(resolve(dir, fixture.path));\n if (actual !== fixture.sha256) {\n mismatches.push({ path: fixture.path, expected: fixture.sha256, actual });\n }\n }\n return mismatches;\n}\n\nexport function loadRedactionBattery(): RedactionBattery {\n return loadJson<RedactionBattery>(\"redaction_battery.json\");\n}\n\n/** Reconstruct a secret case's runtime string from its fragments. */\nexport function assembleSecret(secret: RedactionSecretCase): string {\n return secret.fragments.join(\"\");\n}\n"],"mappings":";AACA,SAAS,kBAAkB;AAC3B,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,eAAe;AACjC,SAAS,qBAAqB;AAuB9B,SAAS,YAAoB;AAC3B,MAAI,OAAO,gBAAgB,eAAe,YAAY,KAAK;AACzD,WAAO,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,EAC/C;AACA,SAAO,OAAO,cAAc,cAAc,YAAY,QAAQ,IAAI;AACpE;AAkCO,SAAS,iBAAyB;AACvC,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,SAAU,QAAO;AAErB,QAAM,UAAU,QAAQ,UAAU,GAAG,MAAM,UAAU;AACrD,MAAI,WAAW,QAAQ,SAAS,eAAe,CAAC,EAAG,QAAO;AAE1D,SAAO,QAAQ,QAAQ,IAAI,GAAG,MAAM,MAAM,WAAW,aAAa;AACpE;AAEA,SAAS,SAAY,MAAiB;AACpC,SAAO,KAAK,MAAM,aAAa,QAAQ,eAAe,GAAG,IAAI,GAAG,MAAM,CAAC;AACzE;AAEO,SAAS,eAAoC;AAClD,SAAO,SAA8B,eAAe;AACtD;AASO,SAAS,UAAsB;AACpC,SAAO,KAAK;AAAA,IACV,aAAa,QAAQ,UAAU,GAAG,MAAM,mBAAmB,GAAG,MAAM;AAAA,EACtE;AACF;AAGO,SAAS,WAAW,MAAsB;AAC/C,SAAO,WAAW,QAAQ,EAAE,OAAO,aAAa,IAAI,CAAC,EAAE,OAAO,KAAK;AACrE;AAYO,SAAS,oBAAoB,MAAc,eAAe,GAAsB;AACrF,QAAM,WAAW,KAAK;AAAA,IACpB,aAAa,QAAQ,KAAK,eAAe,GAAG,MAAM;AAAA,EACpD;AACA,QAAM,aAAgC,CAAC;AACvC,aAAW,WAAW,SAAS,UAAU;AACvC,UAAM,SAAS,WAAW,QAAQ,KAAK,QAAQ,IAAI,CAAC;AACpD,QAAI,WAAW,QAAQ,QAAQ;AAC7B,iBAAW,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,uBAAyC;AACvD,SAAO,SAA2B,wBAAwB;AAC5D;AAGO,SAAS,eAAe,QAAqC;AAClE,SAAO,OAAO,UAAU,KAAK,EAAE;AACjC;","names":[]}
@@ -3,6 +3,7 @@
3
3
  "audit_schema_version": "federation-leak-audit/v1",
4
4
  "private_tag_families": [
5
5
  "client-confidential",
6
+ "confidential",
6
7
  "credential",
7
8
  "family",
8
9
  "financial",
@@ -1,8 +1,8 @@
1
1
  {
2
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": "2.6.0",
3
+ "conformance_version": "5.1.0",
4
4
  "produced_against": {
5
- "bourdon_version": "0.23.0"
5
+ "bourdon_version": "0.24.0"
6
6
  },
7
7
  "fixtures": [
8
8
  {
@@ -12,7 +12,7 @@
12
12
  },
13
13
  {
14
14
  "path": "leak_cases.json",
15
- "sha256": "cb85515a3fbfafecf5a72e0a361a80ce5da1e8cdb5c25cdef3227029d955322f",
15
+ "sha256": "c1a221aa35b2d6a82845ce76fa3885f0187b24a67c37711d9f6f4f6c8cfedc03",
16
16
  "producer": "tools/gen_conformance.py::leak_cases"
17
17
  },
18
18
  {
@@ -137,7 +137,7 @@
137
137
  },
138
138
  {
139
139
  "path": "tier_matrix.json",
140
- "sha256": "9753ad1fd4a092bdf4110b3b24576f2bfe7001d6d6758ef55047ee5da851e25c",
140
+ "sha256": "92954294831c3c5b318b73ae7deae8e338fb2f8d3c4ddfac3b1dd09b9b6b7c0a",
141
141
  "producer": "tools/gen_conformance.py::tier_matrix"
142
142
  },
143
143
  {
@@ -320,6 +320,36 @@
320
320
  "sha256": "d662fd546ee6ba3315a751d68d2d096b5d21d338cf3c65970f09431f666f5e6b",
321
321
  "producer": "tools/gen_conformance.py::mcp_snapshots"
322
322
  },
323
+ {
324
+ "path": "mcp_snapshots/trace_entity.req.json",
325
+ "sha256": "543ae888dedad51fdf2872dc32a130a348deec7bfd19571a5e0ea2235cdf014e",
326
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
327
+ },
328
+ {
329
+ "path": "mcp_snapshots/trace_entity.res.json",
330
+ "sha256": "980c6b6fec01a06453ebc80204da03a553bdfbe3d069ae5ce6c8fa511f1c99cf",
331
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
332
+ },
333
+ {
334
+ "path": "mcp_snapshots/ingest_meeting.req.json",
335
+ "sha256": "7bdac92f1f2374639e1088c7f048e5c5a732c53d32a21766af3555102d420b63",
336
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
337
+ },
338
+ {
339
+ "path": "mcp_snapshots/ingest_meeting.res.json",
340
+ "sha256": "434ccc3f41e274ade88da857eddda5ab550e1fd8ec23328d929cc768c881b6aa",
341
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
342
+ },
343
+ {
344
+ "path": "mcp_snapshots/compile_turn.req.json",
345
+ "sha256": "64e17a2db8d624a4f26a8a0601f3967d1ec96d149b555bf52251d7b6200aea69",
346
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
347
+ },
348
+ {
349
+ "path": "mcp_snapshots/compile_turn.res.json",
350
+ "sha256": "5c35e344307a200e71ad83fef9ff6e7eaed79c1f77cb897f32b59ffa9f5ef282",
351
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
352
+ },
323
353
  {
324
354
  "path": "mcp_snapshots/get_deeper_context.req.json",
325
355
  "sha256": "ca5d6f3472a3a74b1710e8ee093e5648b737bf6635656a21306ef73656fd533f",
@@ -330,6 +360,46 @@
330
360
  "sha256": "c92ec338c23f2cdc3f1215751812c7f5c2c08aa86fb3ff097288e4c831313053",
331
361
  "producer": "tools/gen_conformance.py::mcp_snapshots"
332
362
  },
363
+ {
364
+ "path": "mcp_snapshots/search_federation.req.json",
365
+ "sha256": "ec8da2fb5d95ac050afe2cd3ff3335f10b003338a5f7c832cbb78abc3e77df79",
366
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
367
+ },
368
+ {
369
+ "path": "mcp_snapshots/search_federation.res.json",
370
+ "sha256": "1db5bfed711a2ccba3478a26e4e189d8124edbd83921c1ecf1f87590fac60463",
371
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
372
+ },
373
+ {
374
+ "path": "mcp_snapshots/capture_clip.req.json",
375
+ "sha256": "e640f67b05c7465bc4dc05f3e3e884f12b41861e0cc155bd9e061e75eb100e61",
376
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
377
+ },
378
+ {
379
+ "path": "mcp_snapshots/capture_clip.res.json",
380
+ "sha256": "e6f2f77a7593c8de234d3f1baf50424f267634d0f45ca60b05ac833f2f28acdf",
381
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
382
+ },
383
+ {
384
+ "path": "mcp_snapshots/propose_consensus.req.json",
385
+ "sha256": "e63fb8dfae9b4ba6db1893cd79e0331c82dc32c0e1a57d79859f856282ad9efe",
386
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
387
+ },
388
+ {
389
+ "path": "mcp_snapshots/propose_consensus.res.json",
390
+ "sha256": "357ce9ab7d9ceef757900996050b7758793e6a75880c2f580e42b7a767dd4522",
391
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
392
+ },
393
+ {
394
+ "path": "mcp_snapshots/vote_consensus.req.json",
395
+ "sha256": "c4dcfa2af2c95cff0f97d2e49b3fe197444ede4302e63f1ef55898f3519e0ced",
396
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
397
+ },
398
+ {
399
+ "path": "mcp_snapshots/vote_consensus.res.json",
400
+ "sha256": "b244f65eeed1edfb9468acbbd6d6449a660388bae59bde0b6d4cb9c5d89f06b0",
401
+ "producer": "tools/gen_conformance.py::mcp_snapshots"
402
+ },
333
403
  {
334
404
  "path": "mcp_snapshots/list_memory_versions.req.json",
335
405
  "sha256": "d74a7d4ca7aaef454887f3a84e7db9d01a9141899a2d3a2e4dd43863a09c67df",
@@ -362,12 +432,12 @@
362
432
  },
363
433
  {
364
434
  "path": "mcp_snapshots/seed_library.json",
365
- "sha256": "9438518dadb691feaeb44c7bebf6583958ddf55289df3d3fef8ad7b123500827",
435
+ "sha256": "4315d9be6b52c899d7d3f0449e243fc0a8baa31f53eec141314cd526c9d29095",
366
436
  "producer": "tools/gen_conformance.py::mcp_snapshots"
367
437
  },
368
438
  {
369
439
  "path": "mcp_snapshots/_normalizer.json",
370
- "sha256": "438071a3b1de83fb23083fd9ad2d4a734a27032d84faabf9d5772f14779a1721",
440
+ "sha256": "43db802a917f5ed286384ba175d3ec336a4a72fb48a99257ad9865b826f4c6ea",
371
441
  "producer": "tools/gen_conformance.py::mcp_snapshots"
372
442
  },
373
443
  {
@@ -447,7 +517,7 @@
447
517
  },
448
518
  {
449
519
  "path": "turn_compiler_vectors.json",
450
- "sha256": "add466b02d93cd706c92cdd1f0a2c43b9d633efe19d7ae0319eaa2ade7530f38",
520
+ "sha256": "d8649a227bc4ae0d3760f76dc424a67a4402446742e5d27aa6b31113ce9d7e71",
451
521
  "producer": "tools/gen_conformance.py::turn_compiler_vectors"
452
522
  }
453
523
  ]
@@ -154,6 +154,8 @@
154
154
  "float_precision": 4,
155
155
  "freeze_fields": [
156
156
  "age_s",
157
+ "clip_id",
158
+ "created_at",
157
159
  "digest",
158
160
  "generated_at",
159
161
  "generated_from",
@@ -0,0 +1,7 @@
1
+ {
2
+ "args": {
3
+ "content": "Bourdon research note",
4
+ "title": "Bourdon Note"
5
+ },
6
+ "tool": "capture_clip"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "access_level": "team",
3
+ "agent_id": "operator",
4
+ "clip_id": "<frozen>",
5
+ "ok": true,
6
+ "title": "Bourdon Note"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "args": {
3
+ "access_level": "team",
4
+ "prompt": "Bourdon recognition"
5
+ },
6
+ "tool": "compile_turn"
7
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "_status": "deferred",
3
+ "reason": "compile_turn output is environment-bound (resolves the live cwd, git repo name + remote, and repo-identity scoring) and is not a portable cross-impl parity fixture until a TS universal turn compiler lands. The req pins the tool surface + arg defaults; the res is this deferred stub.",
4
+ "schema_version": "bourdon.turn-brief/v1"
5
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "args": {
3
+ "access_level": "team",
4
+ "content": "# Weekly Sync\nDate: 2026-06-09\nAttendees: ada, grace\n\n## Decisions\n- Adopt the meetings participant\n"
5
+ },
6
+ "tool": "ingest_meeting"
7
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "actions_count": 0,
3
+ "attendees": [
4
+ "ada",
5
+ "grace"
6
+ ],
7
+ "commit": {
8
+ "agent_id": "meetings",
9
+ "digest": "<frozen>",
10
+ "entities_added": 0,
11
+ "entities_updated": 0,
12
+ "last_updated": "<frozen>",
13
+ "mode": "merge",
14
+ "notes_added": 0,
15
+ "notes_updated": 0,
16
+ "path": "<frozen>",
17
+ "sessions_added": 1,
18
+ "sessions_updated": 0,
19
+ "total_entities": 0,
20
+ "total_notes": 0,
21
+ "total_sessions": 1,
22
+ "total_workstreams": 0,
23
+ "workstreams_added": 0,
24
+ "workstreams_updated": 0
25
+ },
26
+ "date": "2026-06-09",
27
+ "decisions_count": 1,
28
+ "entities_count": 0,
29
+ "notes_count": 0,
30
+ "status": "ingested",
31
+ "title": "Weekly Sync",
32
+ "workstreams_count": 0
33
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "args": {
3
+ "options": [
4
+ "Option A",
5
+ "Option B"
6
+ ],
7
+ "proposal_id": "prop_snapshot",
8
+ "topic": "Federation Protocol"
9
+ },
10
+ "tool": "propose_consensus"
11
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "created_at": "<frozen>",
3
+ "metadata": {
4
+ "description": "",
5
+ "strategy": "majority"
6
+ },
7
+ "options": [
8
+ "Option A",
9
+ "Option B"
10
+ ],
11
+ "proposal_id": "prop_snapshot",
12
+ "proposed_by": "operator",
13
+ "quorum": 2,
14
+ "status": "active",
15
+ "topic": "Federation Protocol",
16
+ "votes": {}
17
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "args": {
3
+ "query": "Bourdon",
4
+ "top_k": 5
5
+ },
6
+ "tool": "search_federation"
7
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "query": "Bourdon",
3
+ "total_matches": 0
4
+ }
@@ -5,7 +5,8 @@
5
5
  "tier": "trusted"
6
6
  },
7
7
  "deferred": [
8
- "compile_codex_turn"
8
+ "compile_codex_turn",
9
+ "compile_turn"
9
10
  ],
10
11
  "drift_seed": {
11
12
  "_doc": "prepare_recognition_context_drifting.{req,res}.json were driven under this SEEDED participant drift watermark (written through the real participant_watermark.record writer, stamps then pinned), taken BEFORE the main tool loop and removed afterwards -- the plain prepare_recognition_context.res.json is therefore the healthy half of the pair, with drifting_surfaces ABSENT. The TS mirror must seed the SAME record to reproduce the drifting res.",
@@ -78,7 +79,14 @@
78
79
  "get_cross_agent_summary",
79
80
  "prepare_recognition_context",
80
81
  "compile_codex_turn",
82
+ "trace_entity",
83
+ "ingest_meeting",
84
+ "compile_turn",
81
85
  "get_deeper_context",
86
+ "search_federation",
87
+ "capture_clip",
88
+ "propose_consensus",
89
+ "vote_consensus",
82
90
  "list_memory_versions",
83
91
  "explain_memory_change",
84
92
  "rollback_agent_memory"
@@ -0,0 +1,7 @@
1
+ {
2
+ "args": {
3
+ "access_level": "team",
4
+ "entity": "Bourdon"
5
+ },
6
+ "tool": "trace_entity"
7
+ }
@@ -0,0 +1,133 @@
1
+ {
2
+ "aliases": [
3
+ "Continuo",
4
+ "NeuroLayer"
5
+ ],
6
+ "attributions": [
7
+ {
8
+ "agent_id": "claude-code",
9
+ "aliases": [
10
+ "Continuo",
11
+ "NeuroLayer"
12
+ ],
13
+ "first_seen": "2026-06-28T12:00:00Z",
14
+ "first_version_id": "20260628T120000000000Z-7ec802e0",
15
+ "matching_notes": [
16
+ {
17
+ "date": "2026-06-09",
18
+ "related_entities": [
19
+ "Bourdon"
20
+ ],
21
+ "text": "Public release note.",
22
+ "visibility": "public"
23
+ }
24
+ ],
25
+ "matching_sessions": [
26
+ {
27
+ "cwd": "bourdon",
28
+ "date": "2026-06-08",
29
+ "files_touched": [
30
+ "tools/gen_conformance.py"
31
+ ],
32
+ "key_actions": [
33
+ "wired tier matrix fixtures"
34
+ ],
35
+ "project_focus": [
36
+ "Bourdon"
37
+ ],
38
+ "visibility": "public"
39
+ }
40
+ ],
41
+ "matching_workstreams": [
42
+ {
43
+ "last_touched": "2026-06-10",
44
+ "name": "Release",
45
+ "related_entities": [
46
+ "Bourdon"
47
+ ],
48
+ "status": "active",
49
+ "summary": "Prepare the public Bourdon release.",
50
+ "tags": [
51
+ "launch"
52
+ ],
53
+ "visibility": "public"
54
+ }
55
+ ],
56
+ "provenance_count": 1,
57
+ "summary": "Cross-agent memory federation (granted side).",
58
+ "tags": [
59
+ "infra"
60
+ ],
61
+ "types": [
62
+ "project"
63
+ ],
64
+ "version_count": 1,
65
+ "visibility": "public"
66
+ },
67
+ {
68
+ "agent_id": "codex",
69
+ "matching_notes": [
70
+ {
71
+ "date": "2026-06-10",
72
+ "related_entities": [
73
+ "Bourdon"
74
+ ],
75
+ "text": "Codex public release note.",
76
+ "visibility": "public"
77
+ }
78
+ ],
79
+ "matching_workstreams": [
80
+ {
81
+ "last_touched": "2026-06-11",
82
+ "name": "release",
83
+ "related_entities": [
84
+ "Bourdon"
85
+ ],
86
+ "status": "paused",
87
+ "tags": [
88
+ "coordination"
89
+ ],
90
+ "visibility": "public"
91
+ }
92
+ ],
93
+ "provenance_count": 0,
94
+ "summary": "Federation, codex view.",
95
+ "types": [
96
+ "project"
97
+ ],
98
+ "version_count": 0,
99
+ "visibility": "public"
100
+ }
101
+ ],
102
+ "first_seen": "2026-06-28T12:00:00Z",
103
+ "known_by": [
104
+ "claude-code",
105
+ "codex"
106
+ ],
107
+ "matched": true,
108
+ "name": "Bourdon",
109
+ "schema_version": "bourdon.entity-trace/v1",
110
+ "tags": [
111
+ "infra"
112
+ ],
113
+ "timeline": [
114
+ {
115
+ "agent_id": "claude-code",
116
+ "description": "Bourdon",
117
+ "kind": "session",
118
+ "ref": "bourdon",
119
+ "timestamp": "2026-06-08"
120
+ },
121
+ {
122
+ "agent_id": "claude-code",
123
+ "description": "Entity observed in claude-code memory",
124
+ "kind": "entity_origin",
125
+ "ref": "20260628T120000000000Z-7ec802e0",
126
+ "timestamp": "2026-06-28T12:00:00Z"
127
+ }
128
+ ],
129
+ "types": [
130
+ "project"
131
+ ],
132
+ "visibility": "team"
133
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "args": {
3
+ "choice": "Option A",
4
+ "proposal_id": "prop_snapshot"
5
+ },
6
+ "tool": "vote_consensus"
7
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "ok": true,
3
+ "proposal": {
4
+ "created_at": "<frozen>",
5
+ "metadata": {
6
+ "description": "",
7
+ "strategy": "majority"
8
+ },
9
+ "options": [
10
+ "Option A",
11
+ "Option B"
12
+ ],
13
+ "proposal_id": "prop_snapshot",
14
+ "proposed_by": "operator",
15
+ "quorum": 2,
16
+ "status": "active",
17
+ "topic": "Federation Protocol",
18
+ "votes": {
19
+ "operator": {
20
+ "agent_id": "operator",
21
+ "confidence": 1.0,
22
+ "created_at": "<frozen>",
23
+ "option": "Option A",
24
+ "rationale": ""
25
+ }
26
+ }
27
+ },
28
+ "tally": {
29
+ "is_tie": false,
30
+ "leader": "Option A",
31
+ "margin_weighted": 1.0,
32
+ "options_summary": {
33
+ "Option A": {
34
+ "voters": [
35
+ {
36
+ "agent_id": "operator",
37
+ "confidence": 1.0,
38
+ "rationale": ""
39
+ }
40
+ ],
41
+ "votes": 1,
42
+ "weighted_score": 1.0
43
+ },
44
+ "Option B": {
45
+ "votes": 0,
46
+ "weighted_score": 0.0
47
+ }
48
+ },
49
+ "proposal_id": "prop_snapshot",
50
+ "quorum": 2,
51
+ "quorum_reached": false,
52
+ "status": "active",
53
+ "topic": "Federation Protocol",
54
+ "total_votes": 1
55
+ }
56
+ }
@@ -164,6 +164,39 @@
164
164
  "decision": "allow",
165
165
  "denial": null
166
166
  },
167
+ {
168
+ "tool": "trace_entity",
169
+ "tier": "trusted",
170
+ "namespace": null,
171
+ "granted": null,
172
+ "args": {
173
+ "entity": "Bourdon"
174
+ },
175
+ "decision": "allow",
176
+ "denial": null
177
+ },
178
+ {
179
+ "tool": "compile_turn",
180
+ "tier": "trusted",
181
+ "namespace": null,
182
+ "granted": null,
183
+ "args": {
184
+ "prompt": "what about Bourdon"
185
+ },
186
+ "decision": "allow",
187
+ "denial": null
188
+ },
189
+ {
190
+ "tool": "ingest_meeting",
191
+ "tier": "trusted",
192
+ "namespace": null,
193
+ "granted": null,
194
+ "args": {
195
+ "content": "# Weekly Sync\nDate: 2026-06-09\nAttendees: ada, grace\n\n## Decisions\n- Adopt the meetings participant\n"
196
+ },
197
+ "decision": "allow",
198
+ "denial": null
199
+ },
167
200
  {
168
201
  "tool": "query_agent_memory",
169
202
  "tier": "quarantined",
@@ -393,6 +426,57 @@
393
426
  "tier": "quarantined",
394
427
  "detail": "tier 'quarantined' may not call this tool"
395
428
  }
429
+ },
430
+ {
431
+ "tool": "trace_entity",
432
+ "tier": "quarantined",
433
+ "namespace": null,
434
+ "granted": null,
435
+ "args": {
436
+ "entity": "Bourdon"
437
+ },
438
+ "decision": "deny",
439
+ "denial": {
440
+ "error": "access denied",
441
+ "op": "trace_entity",
442
+ "agent": "openclaw",
443
+ "tier": "quarantined",
444
+ "detail": "tier 'quarantined' may not call this tool"
445
+ }
446
+ },
447
+ {
448
+ "tool": "compile_turn",
449
+ "tier": "quarantined",
450
+ "namespace": null,
451
+ "granted": null,
452
+ "args": {
453
+ "prompt": "what about Bourdon"
454
+ },
455
+ "decision": "deny",
456
+ "denial": {
457
+ "error": "access denied",
458
+ "op": "compile_turn",
459
+ "agent": "openclaw",
460
+ "tier": "quarantined",
461
+ "detail": "tier 'quarantined' may not call this tool"
462
+ }
463
+ },
464
+ {
465
+ "tool": "ingest_meeting",
466
+ "tier": "quarantined",
467
+ "namespace": null,
468
+ "granted": null,
469
+ "args": {
470
+ "content": "# Weekly Sync\nDate: 2026-06-09\nAttendees: ada, grace\n\n## Decisions\n- Adopt the meetings participant\n"
471
+ },
472
+ "decision": "deny",
473
+ "denial": {
474
+ "error": "access denied",
475
+ "op": "ingest_meeting",
476
+ "agent": "openclaw",
477
+ "tier": "quarantined",
478
+ "detail": "tier 'quarantined' may not call this tool"
479
+ }
396
480
  }
397
481
  ]
398
482
  }
@@ -67,6 +67,24 @@
67
67
  "visibility": "public"
68
68
  }
69
69
  ]
70
+ },
71
+ "fable.l5.yaml": {
72
+ "spec_version": "0.1",
73
+ "agent": {
74
+ "id": "fable",
75
+ "type": "code-assistant"
76
+ },
77
+ "last_updated": "2026-06-29T12:00:00+00:00",
78
+ "recent_sessions": [
79
+ {
80
+ "date": "2026-06-27",
81
+ "cwd": "/projects/atlas",
82
+ "key_actions": [
83
+ "- **Atlas ingest** review: walked the phase 1.7 ingest plan end to end, argued the batching semantics, and left the backpressure question open for the next session"
84
+ ],
85
+ "visibility": "public"
86
+ }
87
+ ]
70
88
  }
71
89
  },
72
90
  "codex_cases": [
@@ -132,7 +150,7 @@
132
150
  ],
133
151
  "evidence": [
134
152
  "session date 2026-06-28",
135
- "cwd /projects/bourdon",
153
+ "cwd bourdon",
136
154
  "files touched: core/codex_turn_compiler.py"
137
155
  ]
138
156
  },
@@ -179,7 +197,7 @@
179
197
  ],
180
198
  "evidence": [
181
199
  "session date 2026-06-28",
182
- "cwd /projects/bourdon",
200
+ "cwd bourdon",
183
201
  "files touched: core/codex_turn_compiler.py"
184
202
  ]
185
203
  },
@@ -281,6 +299,166 @@
281
299
  }
282
300
  }
283
301
  },
302
+ {
303
+ "name": "codex_long_action_title",
304
+ "prompt": "what happened with Atlas ingest",
305
+ "cwd": "/projects/atlas",
306
+ "access_level": "team",
307
+ "recognition_confidence": "low",
308
+ "item_scores": [
309
+ {
310
+ "rank": 1,
311
+ "name": "Atlas ingest review: walked the phase 1.7 ingest plan end to end…",
312
+ "kind": "session",
313
+ "source": "l6_federation",
314
+ "score": 67.0
315
+ }
316
+ ],
317
+ "brief": {
318
+ "schema_version": "codex-turn-brief/v1",
319
+ "prompt": "what happened with Atlas ingest",
320
+ "cwd": "/projects/atlas",
321
+ "repo": {
322
+ "name": "atlas",
323
+ "root": null,
324
+ "remote": null
325
+ },
326
+ "health": {
327
+ "native_stage1": "unknown",
328
+ "strategy": "turn_compiled"
329
+ },
330
+ "routing": {
331
+ "mode": "inject",
332
+ "primary_surface": "explicit_pre_turn",
333
+ "surfaces": [
334
+ "explicit_pre_turn",
335
+ "mcp",
336
+ "repo_overlay_candidate"
337
+ ],
338
+ "confidence": "low",
339
+ "reason": "top anchor scored 67.0; source mix spans 1 surface(s); repo identity available as atlas",
340
+ "suppressed_surfaces": [
341
+ "memory_md",
342
+ "fallback_file"
343
+ ],
344
+ "next_action": "prepend delivery.explicit_text before the Codex turn"
345
+ },
346
+ "items": [
347
+ {
348
+ "rank": 1,
349
+ "score": 67.0,
350
+ "kind": "session",
351
+ "name": "Atlas ingest review: walked the phase 1.7 ingest plan end to end…",
352
+ "summary": "- **Atlas ingest** review: walked the phase 1.7 ingest plan end to end, argued the batching semantics, and left the backpressure question open for the next session",
353
+ "reason": "prompt matched Atlas ingest review: walked the phase 1.7 ingest plan end to end…; cwd matched prior Codex thread; repo name matched candidate; cwd basename matched candidate; recent work; continuity evidence",
354
+ "source": "l6_federation",
355
+ "source_agents": [
356
+ "fable"
357
+ ],
358
+ "evidence": [
359
+ "session date 2026-06-27",
360
+ "cwd atlas"
361
+ ]
362
+ }
363
+ ],
364
+ "delivery": {
365
+ "explicit_text": "Bourdon turn recognition brief\nStrategy: turn-scoped compiler; native Stage 1 is unknown.\nRepo: atlas\nUse these as recognition anchors, not as a final answer:\n1. Atlas ingest review: walked the phase 1.7 ingest plan end to end… [session, l6_federation, score 67.0] via fable\n - **Atlas ingest** review: walked the phase 1.7 ingest plan end to end, argued the batching semantics, and left the backpressure question open for the next session\n Why: prompt matched Atlas ingest review: walked the phase 1.7 ingest plan end to end…; cwd matched prior Codex thread; repo name matched candidate; cwd basename matched candidate; recent work; continuity evidence",
366
+ "mcp_payload": {
367
+ "schema_version": "codex-turn-brief/v1",
368
+ "strategy": "turn_compiled",
369
+ "native_stage1": "unknown",
370
+ "repo": {
371
+ "name": "atlas",
372
+ "root": null,
373
+ "remote": null
374
+ },
375
+ "items": [
376
+ {
377
+ "rank": 1,
378
+ "score": 67.0,
379
+ "kind": "session",
380
+ "name": "Atlas ingest review: walked the phase 1.7 ingest plan end to end…",
381
+ "summary": "- **Atlas ingest** review: walked the phase 1.7 ingest plan end to end, argued the batching semantics, and left the backpressure question open for the next session",
382
+ "reason": "prompt matched Atlas ingest review: walked the phase 1.7 ingest plan end to end…; cwd matched prior Codex thread; repo name matched candidate; cwd basename matched candidate; recent work; continuity evidence",
383
+ "source": "l6_federation",
384
+ "source_agents": [
385
+ "fable"
386
+ ],
387
+ "evidence": [
388
+ "session date 2026-06-27",
389
+ "cwd atlas"
390
+ ]
391
+ }
392
+ ],
393
+ "prompt_context": "Bourdon turn recognition brief\nStrategy: turn-scoped compiler; native Stage 1 is unknown.\nRepo: atlas\nUse these as recognition anchors, not as a final answer:\n1. Atlas ingest review: walked the phase 1.7 ingest plan end to end… [session, l6_federation, score 67.0] via fable\n - **Atlas ingest** review: walked the phase 1.7 ingest plan end to end, argued the batching semantics, and left the backpressure question open for the next session\n Why: prompt matched Atlas ingest review: walked the phase 1.7 ingest plan end to end…; cwd matched prior Codex thread; repo name matched candidate; cwd basename matched candidate; recent work; continuity evidence"
394
+ },
395
+ "memory_md_block": "<!-- BEGIN BOURDON TURN BRIEF -->\nBourdon turn recognition brief\nStrategy: turn-scoped compiler; native Stage 1 is unknown.\nRepo: atlas\nUse these as recognition anchors, not as a final answer:\n1. Atlas ingest review: walked the phase 1.7 ingest plan end to end… [session, l6_federation, score 67.0] via fable\n - **Atlas ingest** review: walked the phase 1.7 ingest plan end to end, argued the batching semantics, and left the backpressure question open for the next session\n Why: prompt matched Atlas ingest review: walked the phase 1.7 ingest plan end to end…; cwd matched prior Codex thread; repo name matched candidate; cwd basename matched candidate; recent work; continuity evidence\n<!-- END BOURDON TURN BRIEF -->",
396
+ "fallback_block": "<!-- BEGIN Bourdon Turn Brief -->\nBourdon turn recognition brief\nStrategy: turn-scoped compiler; native Stage 1 is unknown.\nRepo: atlas\nUse these as recognition anchors, not as a final answer:\n1. Atlas ingest review: walked the phase 1.7 ingest plan end to end… [session, l6_federation, score 67.0] via fable\n - **Atlas ingest** review: walked the phase 1.7 ingest plan end to end, argued the batching semantics, and left the backpressure question open for the next session\n Why: prompt matched Atlas ingest review: walked the phase 1.7 ingest plan end to end…; cwd matched prior Codex thread; repo name matched candidate; cwd basename matched candidate; recent work; continuity evidence\n<!-- END Bourdon Turn Brief -->",
397
+ "repo_overlay_block": "<!-- BEGIN BOURDON REPO OVERLAY CANDIDATE -->\nRepo overlay candidate for atlas\nUse only as an explicit, human-reviewed overlay candidate.\n\nBourdon turn recognition brief\nStrategy: turn-scoped compiler; native Stage 1 is unknown.\nRepo: atlas\nUse these as recognition anchors, not as a final answer:\n1. Atlas ingest review: walked the phase 1.7 ingest plan end to end… [session, l6_federation, score 67.0] via fable\n - **Atlas ingest** review: walked the phase 1.7 ingest plan end to end, argued the batching semantics, and left the backpressure question open for the next session\n Why: prompt matched Atlas ingest review: walked the phase 1.7 ingest plan end to end…; cwd matched prior Codex thread; repo name matched candidate; cwd basename matched candidate; recent work; continuity evidence\n<!-- END BOURDON REPO OVERLAY CANDIDATE -->"
398
+ },
399
+ "trace": {
400
+ "routing_decision": {
401
+ "primary_surface": "explicit_pre_turn",
402
+ "confidence": "low",
403
+ "reason": "top anchor scored 67.0; source mix spans 1 surface(s); repo identity available as atlas"
404
+ },
405
+ "surface_health": {
406
+ "native_stage1": "unknown",
407
+ "repo_identity": "available",
408
+ "candidate_count": 1
409
+ },
410
+ "source_mix": {
411
+ "candidates": {
412
+ "l6_federation": 1
413
+ },
414
+ "selected": {
415
+ "l6_federation": 1
416
+ },
417
+ "ignored": {}
418
+ },
419
+ "selected_items": [
420
+ {
421
+ "name": "Atlas ingest review: walked the phase 1.7 ingest plan end to end…",
422
+ "kind": "session",
423
+ "score": 67.0,
424
+ "dominant_components": [
425
+ "cwd_repo",
426
+ "prompt",
427
+ "recency"
428
+ ],
429
+ "reason": "prompt matched Atlas ingest review: walked the phase 1.7 ingest plan end to end…; cwd matched prior Codex thread; repo name matched candidate; cwd basename matched candidate; recent work; continuity evidence"
430
+ }
431
+ ]
432
+ },
433
+ "diagnostics": {
434
+ "scoring_components": {
435
+ "Atlas ingest review: walked the phase 1.7 ingest plan end to end…": {
436
+ "prompt": 24.0,
437
+ "cwd_repo": 25.0,
438
+ "recency": 12.0,
439
+ "cross_agent": 0.0,
440
+ "continuity": 6.0,
441
+ "penalty": 0.0
442
+ }
443
+ },
444
+ "candidate_count": 1,
445
+ "delivery": "all",
446
+ "max_items": 6,
447
+ "max_chars": 1800,
448
+ "stage1_jobs": {
449
+ "total": 0,
450
+ "by_status": {},
451
+ "error_classes": {}
452
+ },
453
+ "exhausted_paths": [
454
+ "native_stage1_primary",
455
+ "static_fallback_primary",
456
+ "l5_export_only",
457
+ "sync_native_only"
458
+ ]
459
+ }
460
+ }
461
+ },
284
462
  {
285
463
  "name": "codex_prompt_only",
286
464
  "prompt": "tell me about the Roadmap",
package/fixtures.pin.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "_doc": "The recorded fixture pin. CI and the package tests assert the vendored fixtures/manifest.json hashes to exactly this value, so the fixture set in any build is provably the reviewed one. Refresh via the re-pin ritual in README.md.",
3
- "conformance_version": "2.6.0",
4
- "manifest_sha256": "0e5f12493974729e203cfeda4a04be39e55af2468510aaced80d3c40a38d3b06"
3
+ "conformance_version": "5.1.0",
4
+ "manifest_sha256": "cae79332b62523f48d9f306ddb74a9271ffceccda13f43ed3eeafc713c2b81bd"
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getbourdon/conformance",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Language-neutral cross-implementation parity fixtures for Bourdon. Python (pip install bourdon) is the oracle; the @getbourdon/* TypeScript mirror asserts against these exact bytes.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -1,65 +0,0 @@
1
- spec_version: '0.1'
2
- agent:
3
- id: lovable
4
- type: code-assistant
5
- instance: cloud
6
- role_narrative: Cloud app-building agent. Ships full-stack web apps from chat.
7
- last_updated: '2026-08-26T12:00:00+00:00'
8
- capabilities:
9
- - app-building
10
- - full-stack-generation
11
- - deploy-preview
12
- known_entities:
13
- - name: Acme Site
14
- type: project
15
- aliases:
16
- - acme.example
17
- summary: Marketing site for Acme, an automation and AI systems studio.
18
- tags:
19
- - lovable
20
- - client
21
- visibility: team
22
- - name: Bourdon
23
- type: project
24
- summary: Recognition-first memory federation (granted side, Lovable view).
25
- tags:
26
- - infra
27
- visibility: public
28
- - name: Client Billing Export
29
- type: concept
30
- summary: Unpublished billing integration details.
31
- tags:
32
- - client-confidential
33
- visibility: private
34
- recent_sessions:
35
- - date: '2026-08-25'
36
- project_focus:
37
- - Acme Site
38
- key_actions:
39
- - rebuilt hero section
40
- files_touched:
41
- - src/routes/index.tsx
42
- visibility: team
43
- - date: '2026-08-24'
44
- project_focus:
45
- - Bourdon
46
- key_actions:
47
- - drafted participant adapter
48
- visibility: public
49
- - date: '2026-08-23'
50
- project_focus:
51
- - Client Billing Export
52
- key_actions:
53
- - private review
54
- visibility: private
55
- visibility_policy:
56
- default: team
57
- private_tags:
58
- - personal
59
- - credential
60
- - secret
61
- - client-confidential
62
- team_tags:
63
- - lovable
64
- - project
65
- - client