Machine-readable JSON
{ "contract": { "accountability": { "authors": [ { "kind": "system", "name": "Semiotic documentation fixture" } ], "codeRef": "docs/src/pages/artifacts/ArtifactContractsOverviewPage.jsx", "dataSources": [ "Inline documentation fixture" ], "generatedBy": "Deterministic example module" }, "artifact": { "component": "LineChart", "configFingerprint": "sha256:4fd84bedd8b0b4e7eb92ee4cee2b974f23457a13059317558e5590bd40474234", "createdAt": "2026-09-01T00:00:00.000Z", "dataFingerprint": "sha256:2330965d494a6bfa40812f2191c9d9eb2c194f2bf7d5d0c1120a3e7455488aa3", "id": "artifact-contract-strict-example", "kind": "chart", "title": "Example measure by year" }, "claims": [ { "asOf": "2025-12-31T23:59:59.000Z", "authoredBy": { "kind": "system", "name": "Semiotic documentation fixture" }, "evidenceIds": [ "fixture.rows" ], "id": "fixture.trend", "kind": "observation", "scope": { "firstYear": 2022, "lastYear": 2025, "unit": "fixture value" }, "status": "supported", "text": "The fixture ends higher in 2025 than it begins in 2022.", "uncertainty": { "description": "The statement is descriptive; it does not estimate a population effect.", "kind": "qualitative" } } ], "contestability": { "alternativeViews": [ { "id": "fixture-table", "label": "Exact-value table", "rationale": "Use when exact lookup matters more than shape." } ], "sourceRequestsAllowed": true }, "contractVersion": "0.1", "evidence": [ { "dataVersion": "artifact-overview-fixture-v1", "fingerprint": "sha256:2330965d494a6bfa40812f2191c9d9eb2c194f2bf7d5d0c1120a3e7455488aa3", "id": "fixture.rows", "label": "Inline documentation rows", "observedAt": "2025-12-31T23:59:59.000Z", "relationship": "descriptive", "role": "source-data" } ], "form": { "chartFamily": "xy", "rejectedAlternatives": [ { "reason": "A table preserves exact values but makes the overall direction slower to scan.", "representation": "Table" } ], "risks": [ "A connected line can invite interpolation between annual observations." ], "whyThisForm": "A line connects ordered yearly observations without implying more precision." }, "inheritance": { "preservation": "full-fidelity", "privacy": "public", "rawDataDefault": "exclude", "requiredPaths": [ "purpose", "claims", "evidence", "time", "contestability" ] }, "purpose": { "allowedUses": [ "Learn the artifact contract workflow" ], "communicativeAct": "Show the direction and year-to-year variation in an example measure.", "decisionContext": "Documentation only", "intents": [ { "id": "trend", "source": "author", "strength": "primary" } ], "prohibitedUses": [ "Treat the fixture as evidence about a real population" ], "stakes": "informational" }, "reception": { "channels": [ { "channel": "visual", "disclosure": "standard", "navigation": true }, { "channel": "screen-reader", "disclosure": "detailed", "navigation": true }, { "channel": "agent", "disclosure": "detailed", "rawData": "bounded" } ], "dataFallback": true, "description": "A four-year line series from an inline documentation fixture.", "manualChecks": [ "Confirm that the wording fits the intended audience." ] }, "time": { "completeness": { "basis": "All four authored fixture rows are present.", "status": "settled" }, "eventTime": { "field": "year", "granularity": "year", "timezone": "UTC" }, "freshness": { "basis": "This fixed fixture is not a live source.", "checkedAt": "2026-09-01T00:00:00.000Z", "status": "stale" }, "observedAt": "2025-12-31T23:59:59.000Z", "presentation": { "label": "Historical fixture through 2025", "state": "historical" }, "processedAt": "2026-09-01T00:00:00.000Z", "revision": { "status": "original" }, "snapshotAt": "2026-09-01T00:00:00.000Z", "window": { "end": "2025-12-31T23:59:59.000Z", "start": "2022-01-01T00:00:00.000Z", "status": "settled" } } }, "evaluation": { "alternatives": [ { "id": "table", "kind": "table", "label": "Data table", "reasons": [ "A table preserves exact values for this bounded dataset." ] }, { "id": "text", "kind": "text", "label": "Bounded text summary", "reasons": [ "The declared claims can be stated without implying an additional visual comparison." ] } ], "manualChecks": [ "Confirm that the wording fits the intended audience.", "Low contrast", "Visual presents seizure risk", "No interaction cues or instructions", "Does not conform to standards", "Semantically invalid", "Zoom and reflow are not supported", "Mark colors come from the theme/CSS variables — contrast can't be verified statically.", "No flashing detected statically. Confirm no element flashes more than 3×/sec.", "Chart is interactive and has descriptive text. Confirm that text explains how to interact (keyboard + pointer).", "WCAG 2.1 / Section 508 conformance can't be settled from config alone.", "Whether interactive elements expose correct roles/names is a render-time, screen-reader question.", "Fixed width/height — verify the chart survives browser zoom and reflow without clipping or loss of function." ], "obligations": [ { "id": "identity.component", "message": "The contract component matches the evaluated chart.", "path": "artifact.component", "relation": "accountability", "status": "pass" }, { "id": "identity.configuration", "message": "The configuration fingerprint matches the evaluated chart.", "path": "artifact.configFingerprint", "relation": "accountability", "status": "pass" }, { "id": "identity.data", "message": "The data fingerprint matches the evaluated data.", "path": "artifact.dataFingerprint", "relation": "claim-support", "status": "pass" }, { "id": "chart.understandable.axis-labels", "message": "Missing axis label: xLabel, yLabel. Ticks alone may not name the variable.", "relation": "reception", "repair": "Set xLabel and yLabel to name each axis's variable and units.", "status": "warn" }, { "id": "chart.compromising.table-static", "message": "The data table is read-only — not downloadable, sortable, or filterable.", "relation": "reception", "repair": "Wrap the chart in a ChartContainer and enable its data-download action (opt-in, so deployments can withhold it where export isn't allowed).", "status": "warn" }, { "id": "chart.perceivable.low-contrast", "message": "Mark colors come from the theme/CSS variables — contrast can't be verified statically.", "relation": "reception", "repair": "Confirm geometries/large text have ≥ 3:1 and regular text ≥ 4.5:1 contrast against the background.", "status": "manual" }, { "id": "chart.perceivable.seizure-risk", "message": "No flashing detected statically. Confirm no element flashes more than 3×/sec.", "relation": "reception", "repair": "Manual check — most static charts pass trivially.", "status": "manual" }, { "id": "chart.operable.interaction-cues", "message": "Chart is interactive and has descriptive text. Confirm that text explains how to interact (keyboard + pointer).", "relation": "reception", "repair": "State the interaction model in summary, e.g. \"Use arrow keys to move between points.\"", "status": "manual" }, { "id": "chart.robust.conforms-to-standards", "message": "WCAG 2.1 / Section 508 conformance can't be settled from config alone.", "relation": "reception", "repair": "Run an automated checker (axe) on the rendered output and test with real assistive tech.", "status": "manual" }, { "id": "chart.robust.semantically-valid", "message": "Whether interactive elements expose correct roles/names is a render-time, screen-reader question.", "relation": "reception", "repair": "Verify with a screen reader that buttons read as buttons, the chart as an image/group, etc.", "status": "manual" }, { "id": "chart.flexible.zoom-reflow", "message": "Fixed width/height — verify the chart survives browser zoom and reflow without clipping or loss of function.", "relation": "reception", "repair": "Use responsiveWidth/responsiveHeight so the chart reflows to its container.", "status": "manual" }, { "id": "policy.render-evidence-required", "message": "The active policy requires render evidence, but no renderer was provided.", "path": "render", "relation": "claim-support", "repair": "Evaluate with a renderChartWithEvidence-compatible renderer before release.", "status": "fail" }, { "id": "claims.model-review.fixture.trend", "message": "Generated claim \"fixture.trend\" is marked supported without an attributable, timestamped review.", "path": "claims[0].review", "relation": "accountability", "repair": "Record the reviewer and review time, or leave the claim provisional or unknown.", "status": "fail" }, { "evidenceIds": [ "fixture.rows" ], "id": "claims.references-valid.fixture.trend", "message": "Claim \"fixture.trend\" links to existing evidence records.", "path": "claims[0].evidenceIds", "relation": "claim-support", "status": "pass" }, { "id": "time.clock.order", "message": "Known event, observation, ingestion, processing, and publication clocks are ordered.", "path": "time", "relation": "time", "status": "pass" }, { "id": "time.window.completeness", "message": "Window and completeness states are compatible.", "path": "time.window", "relation": "time", "status": "pass" }, { "id": "contract.form", "message": "The artifact declares its form rationale.", "path": "form", "relation": "representation-fit", "status": "pass" }, { "id": "contract.reception", "message": "The artifact declares its reception contract.", "path": "reception", "relation": "reception", "status": "pass" }, { "id": "contract.contestability", "message": "The artifact declares its challenge and correction path.", "path": "contestability", "relation": "challenge-and-correction", "status": "pass" }, { "id": "contract.accountability", "message": "The artifact declares its authorship and review history.", "path": "accountability", "relation": "accountability", "status": "pass" }, { "id": "contract.inheritance", "message": "The artifact declares its preservation contract.", "path": "inheritance", "relation": "preservation", "status": "pass" }, { "id": "reception.manual-check.1", "message": "Confirm that the wording fits the intended audience.", "path": "reception.manualChecks[0]", "relation": "reception", "status": "manual" }, { "id": "policy.relation.claim-support", "message": "The artifact declares information for the required claim-support relation.", "relation": "claim-support", "status": "pass" }, { "id": "policy.relation.representation-fit", "message": "The artifact declares information for the required representation-fit relation.", "relation": "representation-fit", "status": "pass" }, { "id": "policy.relation.reception", "message": "The artifact declares information for the required reception relation.", "relation": "reception", "status": "pass" }, { "id": "policy.relation.time", "message": "The artifact declares information for the required time relation.", "relation": "time", "status": "pass" }, { "id": "policy.relation.abstention", "message": "The artifact declares information for the required abstention relation.", "relation": "abstention", "status": "pass" }, { "id": "policy.relation.challenge-and-correction", "message": "The artifact declares information for the required challenge-and-correction relation.", "relation": "challenge-and-correction", "status": "pass" }, { "id": "policy.relation.accountability", "message": "The artifact declares information for the required accountability relation.", "relation": "accountability", "status": "pass" }, { "id": "policy.relation.preservation", "message": "The artifact declares information for the required preservation relation.", "relation": "preservation", "status": "pass" }, { "id": "policy.stakes-context", "message": "Declared stakes meet the informational policy context.", "path": "purpose.stakes", "relation": "abstention", "status": "pass" } ], "policy": { "appliedExceptions": [], "id": "editorial", "rejectedExceptions": [], "version": "0.1" }, "status": "refuse" }, "format": "semiotic-artifact-inspection/v1" }