{"ok":true,"checkedAt":"2026-06-02T19:14:53.222Z","schemaVersion":"moral-trade-provenance-v0.3","profileVersion":"moral-trade-core-v0.1.6-2026-06","purpose":"Public validator contract for provenance-first Moral Trade evidence objects, review decisions, external entity references, traceability events, activities, and agents.","validation":{"status":"pass","validatorName":"moral-trade-provenance-contract","validatorVersion":"moral-trade-provenance-contract-validator-v0.2","schemaVersion":"moral-trade-provenance-v0.3","checks":[{"id":"object-schema-coverage","label":"Evidence, decision, traceability, activity, and agent schemas are public","status":"pass","evidence":"evidence_artifact, evidence_claim, external_entity_reference, review_decision, match_signal, traceability_event, provenance_activity, provenance_agent, state_transition_event_record"},{"id":"validation-rule-coverage","label":"Published provenance rules match the bundle validator checks","status":"pass","evidence":"artifact-hashes, claim-artifact-links, scope-alignment, one-proof-one-claim, freshness-window, agent-links, traceability-events, audit-question-answers, external-entity-references, prov-triplets"},{"id":"sample-bundle-validation","label":"Synthetic evidence bundle proves the contract is executable","status":"pass","evidence":"1 artifact(s), 1 claim(s), 1 traceability event(s), 0 blocker(s)."},{"id":"agent-reviewed-decisions","label":"Reviewer decisions name provenance agents","status":"pass","evidence":"review-decision-sample:agent-reviewer-sample"},{"id":"persistence-table-coverage","label":"Append-only provenance objects have owner-scoped storage tables","status":"pass","evidence":"moral_trade_provenance_agents:provenance_agent, moral_trade_evidence_artifacts:evidence_artifact, moral_trade_evidence_claims:evidence_claim, moral_trade_evidence_claim_artifacts:evidence_claim, moral_trade_external_entity_references:external_entity_reference, moral_trade_review_decisions:review_decision, moral_trade_provenance_activities:provenance_activity, moral_trade_traceability_events:traceability_event, moral_trade_state_transition_events:state_transition_event_record"},{"id":"contract-tests","label":"Provenance contract test hooks are named","status":"pass","evidence":"provenance_contract_validator, provenance_sample_bundle_smoke, traceability_event_contract_smoke, provenance_persistence_schema_smoke, technical_spec_provenance_contract_smoke"}],"blockers":[]},"publicContract":{"schemaVersion":"moral-trade-provenance-v0.3","purpose":"Public validator contract for provenance-first Moral Trade evidence objects, review decisions, external entity references, traceability events, activities, and agents.","objectSchemas":[{"key":"evidence_artifact","label":"Evidence artifact entity","required":["id","kind","normalizedLocator","mediaType","claimScopes","submittedAt","submittedByAgentId","redactionLevel","sha256"]},{"key":"evidence_claim","label":"Evidence claim","required":["id","proposalId","claimType","artifactIds","claimScope","reviewerConfidence","uniquenessChecked"]},{"key":"external_entity_reference","label":"External entity reference","required":["id","entityType","label","identifierSystem","normalizedIdentifier","dedupeKey","verificationStatus","redactionLevel","sha256"]},{"key":"review_decision","label":"Reviewer decision","required":["id","proposalId","outcome","reasonCodes","summary","reviewerId","idempotencyKey","decisionHash","createdAt"]},{"key":"match_signal","label":"Privacy-safe match signal","required":["id","leftProfileId","rightProfileId","privacyPolicyId","status","factorCodes","confidenceBand","redactedFields","disclosureStage","humanReviewRequired","createdAt"]},{"key":"traceability_event","label":"Interoperable traceability event","required":["id","eventTime","recordedAt","action","businessStep","disposition","what","where","why","agentIds","redactionLevel","auditQuestionAnswers","sha256"]},{"key":"provenance_activity","label":"Provenance activity","required":["id","kind","at","usedEntityIds","generatedEntityIds","agentIds"]},{"key":"provenance_agent","label":"Provenance agent","required":["id","kind","label"]},{"key":"state_transition_event_record","label":"Immutable state transition event record","required":["id","schemaVersion","subjectId","subjectKind","from","to","provenanceActivity","recordedAt","actorAgentId","actorAgentKind","usedEntityIds","generatedEntityIds","idempotencyKey","previousEventHash","auditQuestionAnswers","eventHash"]}],"validationRules":[{"key":"artifact-hashes","label":"Artifacts are content-addressed","rule":"Evidence artifacts and traceability events must carry stable sha256 digests."},{"key":"claim-artifact-links","label":"Claims link to existing artifacts","rule":"Every evidence claim must link to existing artifacts."},{"key":"scope-alignment","label":"Artifact scopes match claims","rule":"Artifact claim scopes must match the claim being reviewed."},{"key":"one-proof-one-claim","label":"Duplicate proof is explicit","rule":"Duplicate proof reuse must be explicit, not silent."},{"key":"freshness-window","label":"Artifact timestamps are reviewable","rule":"Evidence timestamps must be fresh enough for the review context or flagged."},{"key":"agent-links","label":"Artifacts, decisions, and activities name agents","rule":"Artifacts, reviewer decisions, traceability events, and activities must name provenance agents."},{"key":"traceability-events","label":"Traceability records link what, where, and why","rule":"External payment or charity-routing events must link what happened, where it was recorded, why it matters, and which agents touched it."},{"key":"audit-question-answers","label":"Event records answer audit questions","rule":"Traceability and state-transition events must expose explicit answers for what happened, who touched it, and when it was recorded."},{"key":"external-entity-references","label":"External entities have stable identifiers","rule":"External charities, providers, and supplier-like entities need stable identifier references, dedupe keys, and verified registry or reviewer status before traceability reliance."},{"key":"prov-triplets","label":"Bundle has entity/activity/agent structure","rule":"Every reviewed evidence bundle must keep W3C PROV-style entities, activities, and agents distinct."}],"sampleBundleSummary":{"artifactCount":1,"claimCount":1,"reviewDecisionCount":1,"activityCount":2,"agentCount":3,"externalEntityReferenceCount":1,"traceabilityEventCount":1,"validationStatus":"pass"},"persistenceTables":[{"table":"moral_trade_provenance_agents","objectSchemaKey":"provenance_agent","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","agent_key","kind","label","redaction_level","created_at"]},{"table":"moral_trade_evidence_artifacts","objectSchemaKey":"evidence_artifact","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","subject_kind","subject_id","kind","normalized_locator","claim_scopes","submitted_by_agent_id","redaction_level","sha256"]},{"table":"moral_trade_evidence_claims","objectSchemaKey":"evidence_claim","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","subject_kind","subject_id","claim_type","claim_scope","reviewer_confidence","uniqueness_checked","redaction_level"]},{"table":"moral_trade_evidence_claim_artifacts","objectSchemaKey":"evidence_claim","accessModel":"owner_insert_public_pair_read","requiredColumns":["claim_id","artifact_id","owner_profile_id","created_at"]},{"table":"moral_trade_external_entity_references","objectSchemaKey":"external_entity_reference","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","entity_type","identifier_system","normalized_identifier","dedupe_key","verification_status","redaction_level","sha256"]},{"table":"moral_trade_review_decisions","objectSchemaKey":"review_decision","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","subject_kind","subject_id","outcome","reason_codes","summary","reviewer_agent_id","idempotency_key","decision_hash","redaction_level"]},{"table":"moral_trade_provenance_activities","objectSchemaKey":"provenance_activity","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","subject_kind","subject_id","kind","activity_at","used_entity_ids","generated_entity_ids","agent_ids","activity_hash"]},{"table":"moral_trade_traceability_events","objectSchemaKey":"traceability_event","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","event_time","recorded_at","action","business_step","disposition","what","where_recorded","why","agent_ids","redaction_level","audit_question_answers","sha256"]},{"table":"moral_trade_state_transition_events","objectSchemaKey":"state_transition_event_record","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","subject_kind","subject_id","from_status","to_status","provenance_activity","recorded_at","actor_agent_id","idempotency_key","audit_question_answers","event_hash"]}],"contractTests":["provenance_contract_validator","provenance_sample_bundle_smoke","traceability_event_contract_smoke","provenance_persistence_schema_smoke","technical_spec_provenance_contract_smoke"]},"objectSchemas":[{"key":"evidence_artifact","label":"Evidence artifact entity","required":["id","kind","normalizedLocator","mediaType","claimScopes","submittedAt","submittedByAgentId","redactionLevel","sha256"]},{"key":"evidence_claim","label":"Evidence claim","required":["id","proposalId","claimType","artifactIds","claimScope","reviewerConfidence","uniquenessChecked"]},{"key":"external_entity_reference","label":"External entity reference","required":["id","entityType","label","identifierSystem","normalizedIdentifier","dedupeKey","verificationStatus","redactionLevel","sha256"]},{"key":"review_decision","label":"Reviewer decision","required":["id","proposalId","outcome","reasonCodes","summary","reviewerId","idempotencyKey","decisionHash","createdAt"]},{"key":"match_signal","label":"Privacy-safe match signal","required":["id","leftProfileId","rightProfileId","privacyPolicyId","status","factorCodes","confidenceBand","redactedFields","disclosureStage","humanReviewRequired","createdAt"]},{"key":"traceability_event","label":"Interoperable traceability event","required":["id","eventTime","recordedAt","action","businessStep","disposition","what","where","why","agentIds","redactionLevel","auditQuestionAnswers","sha256"]},{"key":"provenance_activity","label":"Provenance activity","required":["id","kind","at","usedEntityIds","generatedEntityIds","agentIds"]},{"key":"provenance_agent","label":"Provenance agent","required":["id","kind","label"]},{"key":"state_transition_event_record","label":"Immutable state transition event record","required":["id","schemaVersion","subjectId","subjectKind","from","to","provenanceActivity","recordedAt","actorAgentId","actorAgentKind","usedEntityIds","generatedEntityIds","idempotencyKey","previousEventHash","auditQuestionAnswers","eventHash"]}],"persistenceTables":[{"table":"moral_trade_provenance_agents","objectSchemaKey":"provenance_agent","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","agent_key","kind","label","redaction_level","created_at"]},{"table":"moral_trade_evidence_artifacts","objectSchemaKey":"evidence_artifact","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","subject_kind","subject_id","kind","normalized_locator","claim_scopes","submitted_by_agent_id","redaction_level","sha256"]},{"table":"moral_trade_evidence_claims","objectSchemaKey":"evidence_claim","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","subject_kind","subject_id","claim_type","claim_scope","reviewer_confidence","uniqueness_checked","redaction_level"]},{"table":"moral_trade_evidence_claim_artifacts","objectSchemaKey":"evidence_claim","accessModel":"owner_insert_public_pair_read","requiredColumns":["claim_id","artifact_id","owner_profile_id","created_at"]},{"table":"moral_trade_external_entity_references","objectSchemaKey":"external_entity_reference","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","entity_type","identifier_system","normalized_identifier","dedupe_key","verification_status","redaction_level","sha256"]},{"table":"moral_trade_review_decisions","objectSchemaKey":"review_decision","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","subject_kind","subject_id","outcome","reason_codes","summary","reviewer_agent_id","idempotency_key","decision_hash","redaction_level"]},{"table":"moral_trade_provenance_activities","objectSchemaKey":"provenance_activity","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","subject_kind","subject_id","kind","activity_at","used_entity_ids","generated_entity_ids","agent_ids","activity_hash"]},{"table":"moral_trade_traceability_events","objectSchemaKey":"traceability_event","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","event_time","recorded_at","action","business_step","disposition","what","where_recorded","why","agent_ids","redaction_level","audit_question_answers","sha256"]},{"table":"moral_trade_state_transition_events","objectSchemaKey":"state_transition_event_record","accessModel":"owner_insert_public_or_owner_read","requiredColumns":["id","owner_profile_id","subject_kind","subject_id","from_status","to_status","provenance_activity","recorded_at","actor_agent_id","idempotency_key","audit_question_answers","event_hash"]}],"validationRules":["Evidence artifacts and traceability events must carry stable sha256 digests.","Every evidence claim must link to existing artifacts.","Artifact claim scopes must match the claim being reviewed.","Duplicate proof reuse must be explicit, not silent.","Evidence timestamps must be fresh enough for the review context or flagged.","Artifacts, reviewer decisions, traceability events, and activities must name provenance agents.","External payment or charity-routing events must link what happened, where it was recorded, why it matters, and which agents touched it.","Traceability and state-transition events must expose explicit answers for what happened, who touched it, and when it was recorded.","External charities, providers, and supplier-like entities need stable identifier references, dedupe keys, and verified registry or reviewer status before traceability reliance.","Every reviewed evidence bundle must keep W3C PROV-style entities, activities, and agents distinct."],"validationRuleCodes":["artifact-hashes","claim-artifact-links","scope-alignment","one-proof-one-claim","freshness-window","agent-links","traceability-events","audit-question-answers","external-entity-references","prov-triplets"],"sampleBundleSummary":{"artifactCount":1,"claimCount":1,"reviewDecisionCount":1,"activityCount":2,"agentCount":3,"externalEntityReferenceCount":1,"traceabilityEventCount":1,"validationStatus":"pass"},"blockers":[]}