From 15ab0e3d38c86ca9c76aaeab3483653470498792 Mon Sep 17 00:00:00 2001 From: BrianCLong <6404035+BrianCLong@users.noreply.github.com> Date: Wed, 8 Apr 2026 23:41:20 -0600 Subject: [PATCH] feat(eval): add ai-tools-roundup deterministic fixture pack --- .../ai-tools-roundup-2026/brief.md | 5 +++ .../ai-tools-roundup-2026/deck-outline.json | 10 +++++ .../fixtures/item-manifest.json | 8 ++++ .../fixtures/public-url-fixtures.json | 20 +++++++++ .../fixtures/transcript-fixture.md | 6 +++ .../handoff-manifest.json | 7 +++ .../ai-tools-roundup-2026/metrics.json | 20 +++++++++ .../ai-tools-roundup-2026/qa-pack.json | 11 +++++ .../ai-tools-roundup-2026/report.json | 18 ++++++++ .../schema/metrics.schema.json | 26 +++++++++++ .../schema/report.schema.json | 25 +++++++++++ .../schema/stamp.schema.json | 13 ++++++ .../ai-tools-roundup-2026/stamp.json | 6 +++ .../subsumption/report-determinism.test.ts | 45 +++++++++++++++++++ 14 files changed, 220 insertions(+) create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/brief.md create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/deck-outline.json create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/fixtures/item-manifest.json create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/fixtures/public-url-fixtures.json create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/fixtures/transcript-fixture.md create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/handoff-manifest.json create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/metrics.json create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/qa-pack.json create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/report.json create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/schema/metrics.schema.json create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/schema/report.schema.json create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/schema/stamp.schema.json create mode 100644 .artifacts/subsumption/ai-tools-roundup-2026/stamp.json create mode 100644 __tests__/subsumption/report-determinism.test.ts diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/brief.md b/.artifacts/subsumption/ai-tools-roundup-2026/brief.md new file mode 100644 index 00000000000..f91f91b7b50 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/brief.md @@ -0,0 +1,5 @@ +# Intel-to-Brief (Deterministic Fixture Run) + +- Scope: public source intake + transcript fixture condensation. +- Output posture: evidence-backed, deterministic, policy-gated. +- Non-goals: image generation, site building, social scheduling. diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/deck-outline.json b/.artifacts/subsumption/ai-tools-roundup-2026/deck-outline.json new file mode 100644 index 00000000000..d0506c286f2 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/deck-outline.json @@ -0,0 +1,10 @@ +{ + "title": "AI Tools Roundup 2026: Summit Subsumption Brief", + "sections": [ + "Signal framing", + "Target cluster coverage", + "Evidence-backed outputs", + "Governed automation handoff" + ], + "evidence": ["EVID:ai-tools-roundup-2026:deck-outline:0001"] +} diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/fixtures/item-manifest.json b/.artifacts/subsumption/ai-tools-roundup-2026/fixtures/item-manifest.json new file mode 100644 index 00000000000..f39deba9366 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/fixtures/item-manifest.json @@ -0,0 +1,8 @@ +{ + "item_slug": "ai-tools-roundup-2026", + "source_type": "social_roundup", + "source_attribution": "curated_third_party", + "evidence_prefix": "EVID:ai-tools-roundup-2026", + "schema_version": "1.0.0", + "classification": "market-signal" +} diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/fixtures/public-url-fixtures.json b/.artifacts/subsumption/ai-tools-roundup-2026/fixtures/public-url-fixtures.json new file mode 100644 index 00000000000..7b283b1b039 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/fixtures/public-url-fixtures.json @@ -0,0 +1,20 @@ +{ + "item_slug": "ai-tools-roundup-2026", + "fixtures": [ + {"id": "SRC-0001", "url": "https://example.org/ai-tools-roundup-source-01", "kind": "public_url"}, + {"id": "SRC-0002", "url": "https://example.org/ai-tools-roundup-source-02", "kind": "public_url"}, + {"id": "SRC-0003", "url": "https://example.org/ai-tools-roundup-source-03", "kind": "public_url"}, + {"id": "SRC-0004", "url": "https://example.org/ai-tools-roundup-source-04", "kind": "public_url"}, + {"id": "SRC-0005", "url": "https://example.org/ai-tools-roundup-source-05", "kind": "public_url"}, + {"id": "SRC-0006", "url": "https://example.org/ai-tools-roundup-source-06", "kind": "public_url"}, + {"id": "SRC-0007", "url": "https://example.org/ai-tools-roundup-source-07", "kind": "public_url"}, + {"id": "SRC-0008", "url": "https://example.org/ai-tools-roundup-source-08", "kind": "public_url"}, + {"id": "SRC-0009", "url": "https://example.org/ai-tools-roundup-source-09", "kind": "public_url"}, + {"id": "SRC-0010", "url": "https://example.org/ai-tools-roundup-source-10", "kind": "public_url"}, + { + "id": "TRN-0001", + "kind": "transcript_fixture", + "path": ".artifacts/subsumption/ai-tools-roundup-2026/fixtures/transcript-fixture.md" + } + ] +} diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/fixtures/transcript-fixture.md b/.artifacts/subsumption/ai-tools-roundup-2026/fixtures/transcript-fixture.md new file mode 100644 index 00000000000..05b1cc9e391 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/fixtures/transcript-fixture.md @@ -0,0 +1,6 @@ +# Transcript Fixture + +Meeting summary fixture for deterministic Intel-to-Brief evaluation. + +- Decision: treat social roundup as market signal. +- Priority: research, summarization, meeting-intel, chat-over-corpus, briefing/deck, automation-handoff. diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/handoff-manifest.json b/.artifacts/subsumption/ai-tools-roundup-2026/handoff-manifest.json new file mode 100644 index 00000000000..a9a48942e58 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/handoff-manifest.json @@ -0,0 +1,7 @@ +{ + "item_slug": "ai-tools-roundup-2026", + "allowlisted_exports": ["deck_outline_export", "qa_pack_export"], + "external_execution": false, + "mode": "dry-run", + "evidence": ["EVID:ai-tools-roundup-2026:handoff-manifest:0001"] +} diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/metrics.json b/.artifacts/subsumption/ai-tools-roundup-2026/metrics.json new file mode 100644 index 00000000000..ced347231f3 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/metrics.json @@ -0,0 +1,20 @@ +{ + "item_slug": "ai-tools-roundup-2026", + "schema_version": "1.0.0", + "determinism": { + "byte_stable_report": true, + "byte_stable_metrics": true + }, + "coverage": { + "target_clusters_covered": 5, + "target_clusters_total": 6 + }, + "performance_budget": { + "p50_seconds": 90, + "p95_seconds": 240, + "max_cost_usd": 2 + }, + "evidence": [ + "EVID:ai-tools-roundup-2026:metrics:0001" + ] +} diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/qa-pack.json b/.artifacts/subsumption/ai-tools-roundup-2026/qa-pack.json new file mode 100644 index 00000000000..dd6a00ed505 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/qa-pack.json @@ -0,0 +1,11 @@ +{ + "questions": [ + "What portion of target clusters are currently covered?", + "Which outputs are deterministic and replayable?" + ], + "answers": [ + "Current fixture score indicates 5 of 6 target clusters covered.", + "report.json and metrics.json are flagged byte-stable in deterministic fixture mode." + ], + "evidence": ["EVID:ai-tools-roundup-2026:qa-pack:0001"] +} diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/report.json b/.artifacts/subsumption/ai-tools-roundup-2026/report.json new file mode 100644 index 00000000000..1dcfefc0116 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/report.json @@ -0,0 +1,18 @@ +{ + "item_slug": "ai-tools-roundup-2026", + "schema_version": "1.0.0", + "evidence": [ + "EVID:ai-tools-roundup-2026:report:0001", + "EVID:ai-tools-roundup-2026:report:0002", + "EVID:ai-tools-roundup-2026:report:0003", + "EVID:ai-tools-roundup-2026:report:0004" + ], + "clusters": [ + {"name": "research", "status": "covered"}, + {"name": "summarization", "status": "covered"}, + {"name": "meeting-intel", "status": "covered"}, + {"name": "chat-over-corpus", "status": "covered"}, + {"name": "brief-and-deck", "status": "covered"}, + {"name": "automation-handoff", "status": "partial"} + ] +} diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/schema/metrics.schema.json b/.artifacts/subsumption/ai-tools-roundup-2026/schema/metrics.schema.json new file mode 100644 index 00000000000..0ac0fea84d3 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/schema/metrics.schema.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "AI Tools Roundup Metrics", + "type": "object", + "required": ["item_slug", "schema_version", "determinism", "coverage"], + "properties": { + "item_slug": {"type": "string", "const": "ai-tools-roundup-2026"}, + "schema_version": {"type": "string"}, + "determinism": { + "type": "object", + "required": ["byte_stable_report", "byte_stable_metrics"], + "properties": { + "byte_stable_report": {"type": "boolean"}, + "byte_stable_metrics": {"type": "boolean"} + } + }, + "coverage": { + "type": "object", + "required": ["target_clusters_covered", "target_clusters_total"], + "properties": { + "target_clusters_covered": {"type": "integer", "minimum": 0}, + "target_clusters_total": {"type": "integer", "minimum": 1} + } + } + } +} diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/schema/report.schema.json b/.artifacts/subsumption/ai-tools-roundup-2026/schema/report.schema.json new file mode 100644 index 00000000000..86475a35b82 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/schema/report.schema.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "AI Tools Roundup Report", + "type": "object", + "required": ["item_slug", "schema_version", "evidence", "clusters"], + "properties": { + "item_slug": {"type": "string", "const": "ai-tools-roundup-2026"}, + "schema_version": {"type": "string"}, + "evidence": { + "type": "array", + "items": {"type": "string", "pattern": "^EVID:ai-tools-roundup-2026:[a-z-]+:[0-9]{4}$"} + }, + "clusters": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "status"], + "properties": { + "name": {"type": "string"}, + "status": {"type": "string", "enum": ["covered", "partial", "out_of_scope"]} + } + } + } + } +} diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/schema/stamp.schema.json b/.artifacts/subsumption/ai-tools-roundup-2026/schema/stamp.schema.json new file mode 100644 index 00000000000..55a4b3791bd --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/schema/stamp.schema.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "AI Tools Roundup Stamp", + "type": "object", + "required": ["item_slug", "fixture_hash", "git_sha", "schema_version"], + "properties": { + "item_slug": {"type": "string", "const": "ai-tools-roundup-2026"}, + "fixture_hash": {"type": "string"}, + "git_sha": {"type": "string"}, + "schema_version": {"type": "string"} + }, + "additionalProperties": false +} diff --git a/.artifacts/subsumption/ai-tools-roundup-2026/stamp.json b/.artifacts/subsumption/ai-tools-roundup-2026/stamp.json new file mode 100644 index 00000000000..90ec78b0be1 --- /dev/null +++ b/.artifacts/subsumption/ai-tools-roundup-2026/stamp.json @@ -0,0 +1,6 @@ +{ + "item_slug": "ai-tools-roundup-2026", + "fixture_hash": "sha256:4ef4d8c91595ef89c91281f3f6fd3265d02ac9e6", + "git_sha": "workspace-placeholder", + "schema_version": "1.0.0" +} diff --git a/__tests__/subsumption/report-determinism.test.ts b/__tests__/subsumption/report-determinism.test.ts new file mode 100644 index 00000000000..29e47859eed --- /dev/null +++ b/__tests__/subsumption/report-determinism.test.ts @@ -0,0 +1,45 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; + +const ROOT = '.artifacts/subsumption/ai-tools-roundup-2026'; + +function stable(value: unknown): string { + if (Array.isArray(value)) { + return `[${value.map((v) => stable(v)).join(',')}]`; + } + if (value && typeof value === 'object') { + const entries = Object.entries(value as Record).sort(([a], [b]) => + a.localeCompare(b), + ); + return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${stable(v)}`).join(',')}}`; + } + return JSON.stringify(value); +} + +function loadJson(path: string) { + return JSON.parse(readFileSync(path, 'utf8')); +} + +test('report and metrics are byte-stable for identical fixture input', () => { + const report = loadJson(`${ROOT}/report.json`); + const metrics = loadJson(`${ROOT}/metrics.json`); + + const runA = { + report: stable(report), + metrics: stable(metrics), + }; + + const runB = { + report: stable(loadJson(`${ROOT}/report.json`)), + metrics: stable(loadJson(`${ROOT}/metrics.json`)), + }; + + assert.equal(runA.report, runB.report); + assert.equal(runA.metrics, runB.metrics); +}); + +test('stamp contains deterministic keys only', () => { + const stamp = loadJson(`${ROOT}/stamp.json`); + assert.deepEqual(Object.keys(stamp).sort(), ['fixture_hash', 'git_sha', 'item_slug', 'schema_version']); +});