{"ok":true,"checkedAt":"2026-06-02T19:11:19.900Z","contractVersion":"moral-trade-disclosure-grants-v0.1","purpose":"Public contract for consent-gated disclosure and privacy grants: publish broad previews first, require purpose-bound field grants for exact wishes and source summaries, require introduced-stage contact disclosure, and keep raw source notes and private feeds out of public matching.","validation":{"status":"pass","validatorName":"moral-trade-disclosure-grant-contract","validatorVersion":"moral-trade-disclosure-grants-validator-v0.1","contractVersion":"moral-trade-disclosure-grants-v0.1","checks":[{"id":"lattice-coverage","label":"Contract publishes disclosure stages, access levels, and grant statuses","status":"pass","evidence":"hidden, broad, specific, contact | registry, consent, introduced | draft, granted, revoked"},{"id":"field-contract-coverage","label":"Contract publishes field-level disclosure boundaries","status":"pass","evidence":"cause_areas, exact_wish, exact_ask, capabilities, constraints, verification_preferences, coarse_location, source_summary, contact_email"},{"id":"sample-decision-validation","label":"Sample disclosure decision validates","status":"pass","evidence":"grant_ready; blockers 0"},{"id":"stage-and-contact-invariants","label":"Contract preserves broad preview, consent, and introduced-stage boundaries","status":"pass","evidence":"Registry-stage disclosure is limited to broad previews such as cause areas and coarse location. | Exact wishes, exact asks, capabilities, constraints, verification preferences, and source summaries require the consent stage and a narrow purpose. | Contact details require the introduced stage, explicit owner approval, and an active MFA step-up before live grant approval. | Raw source notes, private feed payloads, exact private wishes before consent, and sensitive constraints in public previews stay redacted. | Disclosure grants are field-level, purpose-bound, stage-bound, expiry-aware, and scoped to owner, counterparty, or match context. | Registry search must enforce query budgets, sparse-result privacy floors, redacted overlap tokens, and risk-signal logging before broad previews can be relied on. | Detail requests must suppress repeated same-owner probing over a seven-day window and log only counts, stages, and field totals. | Evaluators cannot disclose, introduce, contact, approve, revoke, or mutate records; live grants require authenticated owner-controlled actions."},{"id":"redaction-invariants","label":"Contract preserves raw-source and private-field redactions","status":"pass","evidence":"exact_private_wishes_before_consent, exact_asks_before_consent, contact_details_before_introduction, raw_source_notes, sensitive_constraints_in_public_preview, private_feed_payloads"},{"id":"search-privacy-controls","label":"Contract publishes query budget, sparse-result, fingerprint, overlap-token, and risk controls","status":"pass","evidence":"daily_registry_query_budget, sparse_result_privacy_floor, stable_query_fingerprint, redacted_overlap_tokens, risk_signal_logging, detail_request_probe_limit"},{"id":"detail-request-probing-controls","label":"Contract publishes repeated detail-request probing limits","status":"pass","evidence":"privacy_access_request; 7d"},{"id":"nonmutating-owner-control","label":"Contract evaluator is non-mutating and owner-controlled","status":"pass","evidence":"deterministic_disclosure_grant_scope_only; stateMutation false"},{"id":"approved-factor-codes","label":"Contract publishes approved disclosure factor codes","status":"pass","evidence":"purpose_bound_disclosure, field_level_grant, stage_lattice_enforced, registry_broad_preview_only, mutual_consent_required, introduced_contact_only, raw_source_notes_redacted, owner_approval_required, step_up_auth_required, no_private_feed_mining, non_mutating_evaluation, expiry_window_named"},{"id":"contract-tests","label":"Disclosure contract test hooks are named","status":"pass","evidence":"disclosure_grant_contract_validator, disclosure_grant_evaluate_route_contract, disclosure_query_budget_contract_smoke, background_disclosure_lattice_smoke, disclosure_contact_step_up_contract_smoke, privacy_access_request_cadence_smoke, technical_spec_disclosure_grant_smoke"}],"blockers":[]},"publicContract":{"decisioningMode":"deterministic_disclosure_grant_scope_only","stateMutation":false,"accessLevels":["hidden","broad","specific","contact"],"audienceStages":["registry","consent","introduced"],"grantStatuses":["draft","granted","revoked"],"disclosureFields":[{"description":"Broad cause areas and high-level interests only.","key":"cause_areas","label":"Cause areas","maxLevel":"broad","minStage":"registry"},{"description":"The exact change someone hopes a counterparty might help with.","key":"exact_wish","label":"Exact wish","maxLevel":"specific","minStage":"consent"},{"description":"The concrete ask being considered for this match.","key":"exact_ask","label":"Exact ask","maxLevel":"specific","minStage":"consent"},{"description":"Resources, skills, or commitments the profile owner says they can offer.","key":"capabilities","label":"Capabilities","maxLevel":"specific","minStage":"consent"},{"description":"Constraints that could rule out a proposal or require extra care.","key":"constraints","label":"Constraints","maxLevel":"specific","minStage":"consent"},{"description":"Evidence or attestation preferences for a possible agreement.","key":"verification_preferences","label":"Verification preferences","maxLevel":"specific","minStage":"consent"},{"description":"Coarse location only, never precise address or live location.","key":"coarse_location","label":"Coarse location","maxLevel":"broad","minStage":"registry"},{"description":"Manual source summaries, excluding raw notes and source payloads.","key":"source_summary","label":"Manual source summary","maxLevel":"specific","minStage":"consent"},{"description":"Contact details for a mutually approved introduction.","key":"contact_email","label":"Contact email","maxLevel":"contact","minStage":"introduced"}],"redactedFields":["exact_private_wishes_before_consent","exact_asks_before_consent","contact_details_before_introduction","raw_source_notes","sensitive_constraints_in_public_preview","private_feed_payloads"],"searchPrivacyControls":[{"key":"daily_registry_query_budget","label":"Daily registry query budget","scope":"registry_search","dailyLimit":80,"cost":1,"rule":"Every registry search spends a bounded daily query budget before broad previews are returned."},{"key":"sparse_result_privacy_floor","label":"Sparse-result privacy floor","minResultCount":3,"minSpecificity":3,"rule":"Highly specific searches with fewer than three results return no profiles and ask the user to broaden the query."},{"key":"stable_query_fingerprint","label":"Stable query fingerprint","rule":"Normalized query and filter tuples are hashed for budget accounting without storing raw query text as the budget identity."},{"key":"redacted_overlap_tokens","label":"Redacted overlap tokens","rule":"Search results expose broad overlap labels instead of exact matching words from private or semi-private wish text."},{"key":"risk_signal_logging","label":"Risk signal logging","rule":"Budget pressure and sparse searches are logged as redacted risk signals for operator review without revealing exact wishes."},{"key":"detail_request_probe_limit","label":"Repeated detail-request limit","pendingLimit":3,"scope":"privacy_access_request","similarPendingLimit":1,"similarWeeklyLimit":3,"weeklyLimit":6,"windowDays":7,"rule":"Repeated same-owner detail requests are checked over a seven-day window; pending duplicate field/stage requests are blocked and probing pressure is logged with counts only."}],"approvedFactorCodes":["purpose_bound_disclosure","field_level_grant","stage_lattice_enforced","registry_broad_preview_only","mutual_consent_required","introduced_contact_only","raw_source_notes_redacted","owner_approval_required","step_up_auth_required","no_private_feed_mining","non_mutating_evaluation","expiry_window_named"],"invariants":["Registry-stage disclosure is limited to broad previews such as cause areas and coarse location.","Exact wishes, exact asks, capabilities, constraints, verification preferences, and source summaries require the consent stage and a narrow purpose.","Contact details require the introduced stage, explicit owner approval, and an active MFA step-up before live grant approval.","Raw source notes, private feed payloads, exact private wishes before consent, and sensitive constraints in public previews stay redacted.","Disclosure grants are field-level, purpose-bound, stage-bound, expiry-aware, and scoped to owner, counterparty, or match context.","Registry search must enforce query budgets, sparse-result privacy floors, redacted overlap tokens, and risk-signal logging before broad previews can be relied on.","Detail requests must suppress repeated same-owner probing over a seven-day window and log only counts, stages, and field totals.","Evaluators cannot disclose, introduce, contact, approve, revoke, or mutate records; live grants require authenticated owner-controlled actions."],"sampleDecision":{"status":"grant_ready","allowedFields":["exact_wish","source_summary"],"deniedFields":[],"factorCodes":["purpose_bound_disclosure","field_level_grant","stage_lattice_enforced","owner_approval_required","no_private_feed_mining","non_mutating_evaluation","expiry_window_named","mutual_consent_required"],"ownerApprovalRequired":true,"stepUpAuthRequired":false,"stateMutation":false,"accessLevel":"specific","stage":"consent","grantStatus":"draft","expiryDays":30,"privacyActions":["Return only the approved field keys for the named purpose, stage, counterparty, and match scope."],"blockers":[]},"contractTests":["disclosure_grant_contract_validator","disclosure_grant_evaluate_route_contract","disclosure_query_budget_contract_smoke","background_disclosure_lattice_smoke","disclosure_contact_step_up_contract_smoke","privacy_access_request_cadence_smoke","technical_spec_disclosure_grant_smoke"]},"blockers":[]}