diff --git a/.github/workflows/house-style.yml b/.github/workflows/house-style.yml index 40ebfab..1dc52dd 100644 --- a/.github/workflows/house-style.yml +++ b/.github/workflows/house-style.yml @@ -39,3 +39,8 @@ jobs: run: node marketplace/marketplace.test.js - name: Search ranking and escaping run: node search/search.test.js + + - name: Capability evidence rendering and freshness + run: | + node --test scripts/render-capabilities.test.mjs + node scripts/render-capabilities.mjs --check diff --git a/data/capabilities.json b/data/capabilities.json new file mode 100644 index 0000000..faeaf63 --- /dev/null +++ b/data/capabilities.json @@ -0,0 +1,38 @@ +{ + "reviewed_at": "2026-10-21", + "entries": [ + { + "project": "cA2A", + "repository": "ca2a", + "capability": "Compare the official A2A TCK baseline with the extension enabled", + "revision": "d312e90307c0fe679101afb28a43a6d19554d3f0", + "pull_request": 266, + "run": 39665799848, + "evidence_class": "synthetic", + "result": "Paired TCK runs passed 79 tests each; protected handlers were not invoked.", + "limits": "Draft, unmerged implementation. Each run skipped 156 tests and deselected 30. This is bounded interoperability evidence, not full TCK conformance or live deployment acceptance." + }, + { + "project": "TRACE Registry", + "repository": "trace-registry", + "capability": "Persist witness publication intent and fail closed on journal recovery errors", + "revision": "e70c10c05ab2b0c4f482d65332d0b8a91fc5882b", + "pull_request": 144, + "run": 39665123383, + "evidence_class": "synthetic", + "result": "The 413-test suite passed, including seven new durable-journal regression tests.", + "limits": "Draft, unmerged implementation. No live witness deployment or automated retry reconciliation is demonstrated; witness policy remains an operator decision." + }, + { + "project": "Telemetry", + "repository": "agentrust-telemetry", + "capability": "Exercise Python and TypeScript exporters through a real OpenTelemetry Collector", + "revision": "27141868bbe729c23ddd97a99aa19fe43251cc59", + "pull_request": 100, + "run": 39665486568, + "evidence_class": "synthetic", + "result": "Twelve collector cases passed across healthy delivery, 503, lost acknowledgement, partial success, duplicate replay and restart.", + "limits": "Draft, unmerged implementation. Inputs and backend are synthetic. Row-count checks and backend deduplication do not prove exactly-once delivery, full projection fidelity, queue saturation or in-flight restart behavior." + } + ] +} diff --git a/scripts/render-capabilities.mjs b/scripts/render-capabilities.mjs new file mode 100644 index 0000000..bdff59b --- /dev/null +++ b/scripts/render-capabilities.mjs @@ -0,0 +1,56 @@ +import { readFile, writeFile } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; + +const start = ''; +const end = ''; +const escape = value => String(value).replaceAll('&', '&').replaceAll('<', '<') + .replaceAll('>', '>').replaceAll('"', '"').replaceAll("'", '''); + +export function render(data) { + if (!/^\d{4}-\d{2}-\d{2}$/.test(data.reviewed_at) || !Array.isArray(data.entries) || !data.entries.length) { + throw new Error('A dated, nonempty evidence inventory is required'); + } + const seen = new Set(); + const rows = data.entries.map(item => { + for (const field of ['project', 'capability', 'result', 'limits']) { + if (typeof item[field] !== 'string' || !item[field].trim()) throw new Error(`Missing ${field}`); + } + if (!/^[a-z0-9-]+$/.test(item.repository) || !/^[a-f0-9]{40}$/.test(item.revision) + || !Number.isSafeInteger(item.run) || item.run <= 0 + || !Number.isSafeInteger(item.pull_request) || item.pull_request <= 0 + || !['synthetic', 'captured', 'live'].includes(item.evidence_class)) throw new Error('Invalid evidence reference'); + const key = `${item.repository}:${item.capability}`; + if (seen.has(key)) throw new Error('Duplicate capability'); + seen.add(key); + const repo = `https://github.com/agentrust-io/${item.repository}`; + return `
Selected contributions with revision-specific execution evidence, reviewed ${escape(data.reviewed_at)}. These are draft implementations, not a released-product support matrix. Follow each pull request for current status.
+Synthetic means controlled fixtures or workloads; captured means previously collected evidence; live means a documented live operation. A real collector does not make its synthetic workload live evidence. Missing rows mean not assessed here, not unsupported.
+| Project | Capability and source | Validation evidence | Limits |
|---|
Run artifacts can expire. A passing run supports its recorded scope only; it does not establish conformance, production acceptance or hardware provenance. Canonical requirements remain in each project's specification.
+