feat(governance): add source-approval + dataset-freeze contract schema (AEG-X-009, gated)
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>
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"$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"]}
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user