{"ok":true,"checkedAt":"2026-06-02T19:08:36.354Z","contractVersion":"moral-trade-match-signal-contract-v0.3-2026-06","purpose":"Public contract for redacted profile match previews: determine potential matchability from explicit cause, mode, verification, location, privacy, and exclusion factors without private inference or autonomous disclosure.","validation":{"status":"pass","validatorName":"moral-trade-match-signal-contract","validatorVersion":"moral-trade-match-signal-contract-validator-v0.2","contractVersion":"moral-trade-match-signal-contract-v0.3-2026-06","checks":[{"id":"input-field-boundary","label":"Contract names only redacted profile input fields","status":"pass","evidence":"profileId, causeAreas, tradeModes, verificationPreferences, locationSensitivity, privacyStage, privacyConstraints, statedExclusions, offeredCauseAreas, requestedCauseAreas, locationRegion, locationCity"},{"id":"approved-factor-codes","label":"Contract publishes the approved match explanation factor codes","status":"pass","evidence":"cause_area_overlap, cause_area_complementarity, trade_mode_compatible, verification_preference_compatible, location_constraint_satisfied, privacy_safe_preview, privacy_stage_compatible, stated_exclusions_clear, human_review_required"},{"id":"signal-field-contract","label":"Sample signal carries id, profile ids, privacy policy, disclosure stage, and creation time","status":"pass","evidence":"match_signal_c2990cce2803eba3dae05927, sample-left, sample-right, moral-trade-redacted-profile-match-preview-v0.1, broad_preview"},{"id":"redaction-boundary","label":"Contract preserves exact wish, contact, source-note, and inference redactions","status":"pass","evidence":"exact_private_wishes, contact_details, sensitive_constraints, raw_profile_notes, protected_traits, ideology_or_psychology_inferences"},{"id":"sample-signal-validation","label":"Synthetic redacted-profile pair produces a valid match signal","status":"pass","evidence":"matchable; blockers 0"},{"id":"nonmutating-human-review","label":"Match previews cannot disclose, contact, rely, or mutate state","status":"pass","evidence":"redacted_profile_match_preview_only; stateMutation false"},{"id":"no-private-inference","label":"Contract forbids private inference and hidden preference fields","status":"pass","evidence":"Use only redacted profile fields: cause areas, trade modes, verification preferences, location sensitivity, privacy constraints, and stated exclusions. | Do not infer protected traits, ideology, psychology, hidden preferences, exact private wishes, raw notes, or contact details. | A matchable signal is only a preview and always requires human review before disclosure, contact, reliance, or state changes. | Factor codes must include cause overlap or complementarity, trade-mode compatibility, and verification compatibility before matchable status. | Privacy-safe preview requires compatible privacy stages, an explicit disclosure stage, a privacy policy id, and named redacted fields."},{"id":"participant-explanation-template","label":"Contract publishes participant copy that names match basis, redactions, and human review","status":"pass","evidence":"Why you are seeing this match; Exact wishes, contact details, sensitive constraints, raw profile notes, protected traits, and ideology or psychology inferences stay hidden until a valid consent stage."},{"id":"contract-tests","label":"Match signal contract test hooks are named","status":"pass","evidence":"match_signal_contract_validator, redacted_profile_match_signal_smoke, participant_explanation_copy_smoke, match_signal_evaluate_route_contract, technical_spec_match_signal_smoke"}],"blockers":[]},"publicContract":{"decisioningMode":"redacted_profile_match_preview_only","stateMutation":false,"requiredInputFields":["profileId","causeAreas","tradeModes","verificationPreferences","locationSensitivity","privacyStage","privacyConstraints","statedExclusions"],"optionalInputFields":["offeredCauseAreas","requestedCauseAreas","locationRegion","locationCity"],"privacyPolicyId":"moral-trade-redacted-profile-match-preview-v0.1","disclosureStages":["broad_preview","detail_request","mutual_consent"],"approvedFactorCodes":["cause_area_overlap","cause_area_complementarity","trade_mode_compatible","verification_preference_compatible","location_constraint_satisfied","privacy_safe_preview","privacy_stage_compatible","stated_exclusions_clear","human_review_required"],"redactedFields":["exact_private_wishes","contact_details","sensitive_constraints","raw_profile_notes","protected_traits","ideology_or_psychology_inferences"],"participantExplanationTemplate":{"matchableHeadline":"Why you are seeing this match","notMatchableHeadline":"Why this match is paused","matchableSummary":"You are seeing this suggestion because public cause areas, trade mode, and verification preferences are compatible. Exact wishes and contact details are still hidden.","notMatchableSummary":"This profile pair is not matchable yet because one or more public compatibility checks are unresolved. Exact wishes and contact details are still hidden.","redactionNotice":"Exact wishes, contact details, sensitive constraints, raw profile notes, protected traits, and ideology or psychology inferences stay hidden until a valid consent stage.","humanReviewNotice":"Human review is mandatory before disclosure, contact, reliance, or state changes."},"invariants":["Use only redacted profile fields: cause areas, trade modes, verification preferences, location sensitivity, privacy constraints, and stated exclusions.","Do not infer protected traits, ideology, psychology, hidden preferences, exact private wishes, raw notes, or contact details.","A matchable signal is only a preview and always requires human review before disclosure, contact, reliance, or state changes.","Factor codes must include cause overlap or complementarity, trade-mode compatibility, and verification compatibility before matchable status.","Privacy-safe preview requires compatible privacy stages, an explicit disclosure stage, a privacy policy id, and named redacted fields."],"sampleSignal":{"id":"match_signal_c2990cce2803eba3dae05927","signalVersion":"moral-trade-match-signal-v0.3","leftProfileId":"sample-left","rightProfileId":"sample-right","privacyPolicyId":"moral-trade-redacted-profile-match-preview-v0.1","status":"matchable","confidenceBand":"high","factorCodes":["cause_area_overlap","cause_area_complementarity","trade_mode_compatible","verification_preference_compatible","location_constraint_satisfied","privacy_stage_compatible","privacy_safe_preview","stated_exclusions_clear","human_review_required"],"redactedFields":["exact_private_wishes","contact_details","sensitive_constraints","raw_profile_notes","protected_traits","ideology_or_psychology_inferences"],"disclosureStage":"broad_preview","humanReviewRequired":true,"createdAt":"2026-06-02T19:08:36.354Z","participantExplanation":{"headline":"Why you are seeing this match","summary":"You are seeing this suggestion because public cause areas, trade mode, and verification preferences are compatible. Exact wishes and contact details are still hidden.","visibleFactorCodes":["cause_area_overlap","cause_area_complementarity","trade_mode_compatible","verification_preference_compatible","location_constraint_satisfied","privacy_stage_compatible","privacy_safe_preview","stated_exclusions_clear"],"redactionNotice":"Exact wishes, contact details, sensitive constraints, raw profile notes, protected traits, and ideology or psychology inferences stay hidden until a valid consent stage. Redacted fields: exact_private_wishes, contact_details, sensitive_constraints, raw_profile_notes, protected_traits, ideology_or_psychology_inferences.","humanReviewNotice":"Human review is mandatory before disclosure, contact, reliance, or state changes."},"counts":{"sharedCauseAreas":1,"causeAreaComplementarity":2,"compatibleTradeModes":1,"compatibleVerificationPreferences":1},"blockers":[]},"contractTests":["match_signal_contract_validator","redacted_profile_match_signal_smoke","participant_explanation_copy_smoke","match_signal_evaluate_route_contract","technical_spec_match_signal_smoke"]},"blockers":[]}