3e6f609dda
Source governance schema: append-only source_approval table enforcing approval before ingestion. Dataset manifest hardened to support FROZEN state, requiring approval timestamps. Boundaries tested (6/6 passing). Server-side resolver (DapperApprovedModelContextReader) now guards both model and dataset approval. P2–P6 deferred: Dataset freeze command, maker-checker review, evaluation/proposal orchestration remain pending human decision package (source allow-list, license/SLA, metric versions, roles). No source/model seeded per CLAUDE.md governance. Migrations 0033–0034 idempotency verified fresh/upgrade/re-run on isolated test DB. AGENTS.md: Maturity (contract-first); Necessity (governance prerequisite). Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
66 lines
2.2 KiB
JSON
66 lines
2.2 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://kartsell.taxbaik.com/contracts/data/source-approval.v1.proposed.json",
|
|
"title": "Governed Data Source Approval Contract",
|
|
"description": "Proposal only. This contract does not authorize ingestion until a human approval record exists.",
|
|
"contractVersion": "source-approval.v1-proposed",
|
|
"status": "DESIGN_PROPOSAL",
|
|
"automationBoundary": {
|
|
"allowedModes": ["EVALUATION_ONLY", "PROPOSAL_ONLY", "DRILL_ONLY"],
|
|
"forbiddenEffects": [
|
|
"AUTO_MODEL_ACTIVATION",
|
|
"AUTO_MODEL_PROMOTION",
|
|
"AUTO_PARAMETER_CHANGE",
|
|
"AUTO_ORDER",
|
|
"KIS_SUBMISSION",
|
|
"CLIENT_PUBLICATION"
|
|
]
|
|
},
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"sourceId",
|
|
"sourceVersion",
|
|
"domain",
|
|
"owner",
|
|
"steward",
|
|
"licenseReference",
|
|
"availabilitySla",
|
|
"freshnessSla",
|
|
"timezone",
|
|
"calendarId",
|
|
"unitContract",
|
|
"schemaContractVersion",
|
|
"status",
|
|
"contentHash",
|
|
"approvedBy",
|
|
"approvedAt"
|
|
],
|
|
"properties": {
|
|
"sourceId": {"type": "string", "minLength": 1},
|
|
"sourceVersion": {"type": "string", "minLength": 1},
|
|
"domain": {"type": "string", "minLength": 1},
|
|
"owner": {"type": "string", "minLength": 1},
|
|
"steward": {"type": "string", "minLength": 1},
|
|
"licenseReference": {"type": "string", "minLength": 1},
|
|
"availabilitySla": {"type": "string", "minLength": 1},
|
|
"freshnessSla": {"type": "string", "minLength": 1},
|
|
"timezone": {"type": "string", "minLength": 1},
|
|
"calendarId": {"type": "string", "minLength": 1},
|
|
"unitContract": {"type": "string", "minLength": 1},
|
|
"schemaContractVersion": {"type": "string", "minLength": 1},
|
|
"status": {"enum": ["CANDIDATE", "APPROVED", "SUSPENDED", "RETIRED", "QUARANTINED"]},
|
|
"contentHash": {"type": "string", "pattern": "^[A-Fa-f0-9]{64}$"},
|
|
"approvedBy": {"type": "string", "minLength": 1},
|
|
"approvedAt": {"type": "string", "format": "date-time"},
|
|
"publishedAt": {"type": "string", "format": "date-time"},
|
|
"revision": {"type": "integer", "minimum": 1}
|
|
},
|
|
"allOf": [
|
|
{
|
|
"if": {"properties": {"status": {"const": "APPROVED"}}},
|
|
"then": {"required": ["publishedAt", "revision"]}
|
|
}
|
|
]
|
|
}
|