Read-only MVR preflight for trust, permission, evidence gaps, and African market-entry readiness.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use after evidence capture to separate safe from unsafe inferences across formal, field, market, trust, and stakeholder context. It compiles context; it does not authorize action. Use when: Use when evidence is mixed and the agent needs safe claims versus unsafe claims before a verdict. Do not use when: Do not use as a go/no-go decision. Submit only consented, data-minimized, redacted or aggregated evidence; never raw confidential datasets, secrets, credentials, or personal identifiers. Evidence input location: arguments.payload. evidence_pack: object array. String fields: evidence_type, source_class, stakeholder_class, verification_status, source_date, source_doc_id. geography: string/object; evidence_geography: object; district: nonblank string; districts: nonblank strings array. source_date/freshness_date: YYYY, YYYY-MM, YYYY-MM-DD or ISO timestamp with timezone. source_date_range: {earliest,latest}, same-precision ordered bounds within supplied dates. analysis_date stays exact. Intervals have age_days:null and age_days_min/max; unresolved window/future overlap excludes coverage. Omit unknown dates/references, never null or invented. verification_status: unverified if unchecked. *_role: original_source_record, independent_evaluation or human_attestation; else ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. collection_context + provenance_ledger: see schema/feedback. Keep adverse facts; never relabel to pass.
Resolved subject, market scope, and mixed evidence to compile into safe and unsafe inferences.
Use after evidence capture to separate safe from unsafe inferences across formal, field, market, trust, and stakeholder context. It compiles context; it does not authorize action. Use when: Use when evidence is mixed and the agent needs safe claims versus unsafe claims before a verdict. Do not use when: Do not use as a go/no-go decision. Submit only consented, data-minimized, redacted or aggregated evidence; never raw confidential datasets, secrets, credentials, or personal identifiers. Evidence input location: arguments.payload. evidence_pack: object array. String fields: evidence_type, source_class, stakeholder_class, verification_status, source_date, source_doc_id. geography: string/object; evidence_geography: object; district: nonblank string; districts: nonblank strings array. source_date/freshness_date: YYYY, YYYY-MM, YYYY-MM-DD or ISO timestamp with timezone. source_date_range: {earliest,latest}, same-precision ordered bounds within supplied dates. analysis_date stays exact. Intervals have age_days:null and age_days_min/max; unresolved window/future overlap excludes coverage. Omit unknown dates/references, never null or invented. verification_status: unverified if unchecked. *_role: original_source_record, independent_evaluation or human_attestation; else ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. collection_context + provenance_ledger: see schema/feedback. Keep adverse facts; never relabel to pass.
| Argument | Type | Description |
|---|---|---|
| payload* | object | Resolved subject, market scope, and mixed evidence to compile into safe and unsafe inferences. |
{
"type": "object",
"required": [
"payload"
],
"properties": {
"payload": {
"type": "object",
"properties": {
"stage": {
"type": "string",
"description": "Free-text venture stage, for example pre-MVP, pilot, grant-funded programme or scaling. No closed enum."
},
"claims": {
"type": "array",
"items": {
"type": "object",
"required": [
"claim_id",
"claim"
],
"properties": {
"claim": {
"type": "string",
"description": "Minimal public-safe target proposition."
},
"claim_id": {
"type": "string",
"description": "Opaque claim identifier."
},
"support_links": {
"type": "array",
"items": {
"type": "object",
"required": [
"claim_id",
"evidence_id",
"relationship",
"locator"
],
"properties": {
"locator": {
"type": "string",
"description": "Specific page, cell or section. A locator is not proof."
},
"claim_id": {
"type": "string",
"description": "Must match the containing claim."
},
"evidence_id": {
"type": "string",
"description": "Must identify an item in this complete evidence pack."
},
"relationship": {
"enum": [
"direct_support",
"qualifies",
"contradicts",
"context_only"
],
"type": "string"
},
"review_event_id": {
"type": "string",
"description": "Only the licensed review service can check this event; ignored as authority by public preflight."
}
}
}
}
}
},
"description": "Optional explicit target claims and source-specific support links. Reuses the governed claim-audit vocabulary. Public links are caller declarations, never authenticated reviewer attestations."
},
"subject": {
"type": "object",
"properties": {
"sector": {
"type": "string"
},
"entity_id": {
"type": "string"
},
"entity_name": {
"type": "string"
},
"entity_archetype": {
"type": "string"
}
},
"description": "Resolved or supplied entity under assessment.",
"additionalProperties": true
},
"market_scope": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared target city."
},
"region": {
"type": "string",
"description": "Declared target region."
},
"country": {
"type": "string",
"description": "Declared target country, not the source country."
},
"corridor": {
"type": "string",
"description": "Declared target corridor."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank target district; not verified source coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Target districts as nonblank strings; empty is allowed but does not declare subnational scope."
},
"town_or_zone": {
"type": "string",
"description": "Declared target town or zone."
},
"micro_context": {
"type": "string",
"description": "Explicit local decision context."
},
"decision_scope_level": {
"enum": [
"country",
"subnational"
],
"type": "string",
"description": "Explicit decision scope. Subnational needs declared locality. A country-only decision must be declared, not inferred from absent districts."
}
},
"description": "Declared decision geography, not source geography. Supply district/districts or decision_scope_level country/subnational; subnational requires locality. A bounded Uganda target-name cross-check can require scope review, never insert districts or establish field coverage.",
"additionalProperties": true
},
"target_claim": {
"type": "string"
},
"analysis_date": {
"type": "string",
"description": "Optional YYYY-MM-DD or ISO timestamp with timezone, no later than today in analysis_timezone (UTC by default). Defaults to the current date in that calendar. Carried through the public handoff."
},
"evidence_pack": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Optional item identifier. Does not establish a distinct source."
},
"claim": {
"type": "string",
"description": "Minimal, non-confidential claim supported by the item; do not send raw private interviews."
},
"status": {
"type": "string",
"description": "Legacy alias for verification_status."
},
"geography": {
"type": [
"string",
"object"
],
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"description": "Source country name/code or broader description, or an object with country, city, region and town_or_zone strings, a nonblank district string and a districts array of nonblank strings (empty allowed). Known country conflicts, including conflicting evidence_geography.country, are flagged; local applicability is not authenticated.",
"additionalProperties": true
},
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual sample size; required for collector-administered modes, including groups. Group sample cannot exceed session_count times participants_per_session. All supplied aliases must agree; never invent a sample for documentary or self-administered evidence."
},
"source_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"source_hash": {
"type": "string",
"description": "Optional SHA-256 source hash, 64 hexadecimal characters; a hash does not authenticate its origin."
},
"load_bearing": {
"type": "boolean",
"description": "True if the target recommendation materially depends on this item."
},
"source_class": {
"type": "string",
"description": "Origin label, for example entity_reported, regulator_published, structured_field_research, operational_data or counterparty_reference. model_inferred is not source evidence and is rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Never relabel it to pass. Origin is not a claim of independence."
},
"source_grade": {
"type": "string",
"description": "Caller-supplied grade. Not a substitute for verification or source lineage."
},
"evidence_type": {
"type": "string",
"description": "What was collected, for example interview, field observation or licence record. Not merely the conclusion."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Compatibility origin label. Explicit field/public conflicts, including provenance_ledger.source_family, require reconciliation; one label cannot erase another."
},
"freshness_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Compatibility alias for source_date, at the same declared precision. Exact dates/timestamps may name the same analysis-calendar day; conflicting aliases require correction. No source truth is established."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"survey_payload": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
},
"description": "Existing sample_size alias; all supplied sample-size aliases must agree.",
"additionalProperties": true
},
"evidence_origin": {
"type": "string",
"description": "Declared source origin. Explicit public/documentary sources are not caller fieldwork solely because evidence_type is survey. Conflicting explicit field origins still block; never relabel to pass."
},
"is_load_bearing": {
"type": "boolean",
"description": "Compatibility alias for load_bearing."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"provenance_ledger": {
"type": "object",
"properties": {
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Declared source family; distinct labels do not prove independence."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"synthetic_fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source-reference fields that were generated rather than observed; these do not establish lineage."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
}
},
"description": "Field evidence needs source_doc_id and an explicit parent_source_ids array (empty allowed). Unknown lineage stays incomplete, not invented.",
"additionalProperties": true
},
"source_date_range": {
"type": "object",
"required": [
"earliest",
"latest"
],
"properties": {
"latest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"earliest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
}
},
"description": "Optional inclusive declared bounds, usable without source_date. Both endpoints must have the same precision and be ordered. Every supplied source_date/freshness_date must contain the whole range; an exact timestamp cannot be widened. Aliases must agree before narrowing. Unknown dates are not clipped to the analysis date. Bounds are declarations, not source verification.",
"additionalProperties": false
},
"stakeholder_class": {
"type": "string",
"description": "Role represented, for example guardian, customer, supplier or partner. Do not submit a person identifier."
},
"collection_context": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"source_extraction": {
"type": "object",
"required": [
"source_ref",
"fields"
],
"properties": {
"fields": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"source_ref": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
},
"description": "Optional caller-supplied second reading of source facts for conflict comparison only. Not independently authenticated; cannot supply missing primary declarations or establish source authenticity.",
"additionalProperties": false
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"description": "Source-grounded collection declarations, not source authentication. Unknown facts must remain missing; do not invent values to pass. Field decision use requires source modality, collector relationship, interview mode, source-document identity and an explicit parent-source list. Collector-administered modes require staffing, duration, available minutes per collector and sample size. Group modes additionally require session_count, participants_per_session, session_duration_minutes and collectors_per_session, never inferred from an individual interview duration. Online, observation and administrative_record modes require collection_administration; self-administered online and automated observation/record sources do not need invented collector capacity. Explicit public/documentary origins are not caller fieldwork solely because evidence_type is survey; conflicting explicit field origins still block. Independent verification labels require a separate reviewer relationship; persisted review is still checked separately.",
"additionalProperties": true
},
"evidence_geography": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"additionalProperties": true
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
},
"verification_status": {
"type": "string",
"description": "Caller label. verified, independently_verified, corroborated, attested, confirmed and validated count for the structural prefilter only. self_attested, unverified, missing and other labels do not. Do not change labels without actually checking the source."
}
},
"description": "A caller-declared, consented and redacted evidence item. No required fields at intake: incomplete items receive correction feedback. Explicit artifact_role, evidence_role, source_role, record_role and content_role declarations admit only original_source_record, independent_evaluation or human_attestation; other declared roles are rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Omission remains supported for legacy items. Passing coverage never verifies truth, permission or readiness.",
"additionalProperties": true
},
"description": "Full current evidence pack. Rechecks replace the pack; the server does not append or retrieve evidence."
},
"decision_stage": {
"type": "string"
},
"evidence_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Optional item identifier. Does not establish a distinct source."
},
"claim": {
"type": "string",
"description": "Minimal, non-confidential claim supported by the item; do not send raw private interviews."
},
"status": {
"type": "string",
"description": "Legacy alias for verification_status."
},
"geography": {
"type": [
"string",
"object"
],
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"description": "Source country name/code or broader description, or an object with country, city, region and town_or_zone strings, a nonblank district string and a districts array of nonblank strings (empty allowed). Known country conflicts, including conflicting evidence_geography.country, are flagged; local applicability is not authenticated.",
"additionalProperties": true
},
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual sample size; required for collector-administered modes, including groups. Group sample cannot exceed session_count times participants_per_session. All supplied aliases must agree; never invent a sample for documentary or self-administered evidence."
},
"source_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"source_hash": {
"type": "string",
"description": "Optional SHA-256 source hash, 64 hexadecimal characters; a hash does not authenticate its origin."
},
"load_bearing": {
"type": "boolean",
"description": "True if the target recommendation materially depends on this item."
},
"source_class": {
"type": "string",
"description": "Origin label, for example entity_reported, regulator_published, structured_field_research, operational_data or counterparty_reference. model_inferred is not source evidence and is rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Never relabel it to pass. Origin is not a claim of independence."
},
"source_grade": {
"type": "string",
"description": "Caller-supplied grade. Not a substitute for verification or source lineage."
},
"evidence_type": {
"type": "string",
"description": "What was collected, for example interview, field observation or licence record. Not merely the conclusion."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Compatibility origin label. Explicit field/public conflicts, including provenance_ledger.source_family, require reconciliation; one label cannot erase another."
},
"freshness_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Compatibility alias for source_date, at the same declared precision. Exact dates/timestamps may name the same analysis-calendar day; conflicting aliases require correction. No source truth is established."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"survey_payload": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
},
"description": "Existing sample_size alias; all supplied sample-size aliases must agree.",
"additionalProperties": true
},
"evidence_origin": {
"type": "string",
"description": "Declared source origin. Explicit public/documentary sources are not caller fieldwork solely because evidence_type is survey. Conflicting explicit field origins still block; never relabel to pass."
},
"is_load_bearing": {
"type": "boolean",
"description": "Compatibility alias for load_bearing."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"provenance_ledger": {
"type": "object",
"properties": {
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Declared source family; distinct labels do not prove independence."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"synthetic_fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source-reference fields that were generated rather than observed; these do not establish lineage."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
}
},
"description": "Field evidence needs source_doc_id and an explicit parent_source_ids array (empty allowed). Unknown lineage stays incomplete, not invented.",
"additionalProperties": true
},
"source_date_range": {
"type": "object",
"required": [
"earliest",
"latest"
],
"properties": {
"latest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"earliest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
}
},
"description": "Optional inclusive declared bounds, usable without source_date. Both endpoints must have the same precision and be ordered. Every supplied source_date/freshness_date must contain the whole range; an exact timestamp cannot be widened. Aliases must agree before narrowing. Unknown dates are not clipped to the analysis date. Bounds are declarations, not source verification.",
"additionalProperties": false
},
"stakeholder_class": {
"type": "string",
"description": "Role represented, for example guardian, customer, supplier or partner. Do not submit a person identifier."
},
"collection_context": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"source_extraction": {
"type": "object",
"required": [
"source_ref",
"fields"
],
"properties": {
"fields": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"source_ref": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
},
"description": "Optional caller-supplied second reading of source facts for conflict comparison only. Not independently authenticated; cannot supply missing primary declarations or establish source authenticity.",
"additionalProperties": false
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"description": "Source-grounded collection declarations, not source authentication. Unknown facts must remain missing; do not invent values to pass. Field decision use requires source modality, collector relationship, interview mode, source-document identity and an explicit parent-source list. Collector-administered modes require staffing, duration, available minutes per collector and sample size. Group modes additionally require session_count, participants_per_session, session_duration_minutes and collectors_per_session, never inferred from an individual interview duration. Online, observation and administrative_record modes require collection_administration; self-administered online and automated observation/record sources do not need invented collector capacity. Explicit public/documentary origins are not caller fieldwork solely because evidence_type is survey; conflicting explicit field origins still block. Independent verification labels require a separate reviewer relationship; persisted review is still checked separately.",
"additionalProperties": true
},
"evidence_geography": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"additionalProperties": true
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
},
"verification_status": {
"type": "string",
"description": "Caller label. verified, independently_verified, corroborated, attested, confirmed and validated count for the structural prefilter only. self_attested, unverified, missing and other labels do not. Do not change labels without actually checking the source."
}
},
"description": "A caller-declared, consented and redacted evidence item. No required fields at intake: incomplete items receive correction feedback. Explicit artifact_role, evidence_role, source_role, record_role and content_role declarations admit only original_source_record, independent_evaluation or human_attestation; other declared roles are rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Omission remains supported for legacy items. Passing coverage never verifies truth, permission or readiness.",
"additionalProperties": true
},
"description": "Alias for evidence_pack. Supply one field, not conflicting copies."
},
"review_case_ref": {
"type": "object",
"required": [
"case_id",
"tenant_id",
"workspace_id",
"reference_secret"
],
"writeOnly": true,
"properties": {
"case_id": {
"type": "string",
"pattern": "^RC-[a-f0-9]{64}$"
},
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"reference_secret": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"writeOnly": true
}
},
"description": "Host-private, case-bound read reference. Never put its secret into prompts, URLs, logs or exports. Grants no write or action authority.",
"additionalProperties": false
},
"attestation_refs": {
"type": "array",
"items": {
"type": "object",
"required": [
"attestation_id",
"tenant_id",
"workspace_id",
"reference_secret"
],
"properties": {
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"attestation_id": {
"type": "string",
"pattern": "^ATT-[a-f0-9]{64}$"
},
"reference_secret": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"writeOnly": true,
"description": "256-bit random bearer secret. Keep host-private, out of URLs/logs/prompts/exports; grants shared context, not authority."
}
},
"additionalProperties": false
},
"maxItems": 3,
"writeOnly": true,
"description": "Optional: https://africanmarketos.com/v1/reviewer-attestations/contract. Requires exact subject, market_scope.country and decision_question. Host-private refs outside evidence; reattach each call. No scoring or authority."
},
"analysis_timezone": {
"type": "string",
"description": "Optional IANA timezone, for example Africa/Nairobi, for the analysis calendar. Defaults to UTC; never inferred from country or IP. Date-only values keep their declared calendar day."
},
"decision_question": {
"type": "string",
"maxLength": 2000,
"description": "Exact recorded attestation question; question must agree when supplied."
},
"evidence_available": {
"type": "array",
"items": {
"type": "string"
},
"description": "Short optional context labels, not proof. For supplied document summaries use incomplete evidence_pack items instead; do not mark claims verified merely because a document exists."
},
"context_freshness_window_days": {
"type": "integer",
"minimum": 1,
"description": "Optional caller-declared maximum evidence age in days. No universal freshness cutoff is invented when absent; age alone does not prove validity."
}
},
"description": "Resolved subject, market scope, and mixed evidence to compile into safe and unsafe inferences.",
"additionalProperties": true
}
},
"additionalProperties": false
}Use after evidence completeness to route a structurally complete pack toward licensed MVR scoring or abstain on missing proof. This public tool does not compute market, pilot, or scale readiness. Use when: Use after evidence completeness to determine whether the pack can be routed to licensed MVR scoring or still requires proof. Do not use when: Do not use as readiness, pilot, credit, legal, regulatory, or scale authorization. Submit only consented, data-minimized, redacted or aggregated evidence; never secrets, credentials, or personal identifiers. Evidence input location: arguments.payload. evidence_pack: object array. String fields: evidence_type, source_class, stakeholder_class, verification_status, source_date, source_doc_id. geography: string/object; evidence_geography: object; district: nonblank string; districts: nonblank strings array. source_date/freshness_date: YYYY, YYYY-MM, YYYY-MM-DD or ISO timestamp with timezone. source_date_range: {earliest,latest}, same-precision ordered bounds within supplied dates. analysis_date stays exact. Intervals have age_days:null and age_days_min/max; unresolved window/future overlap excludes coverage. Omit unknown dates/references, never null or invented. verification_status: unverified if unchecked. *_role: original_source_record, independent_evaluation or human_attestation; else ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. collection_context + provenance_ledger: see schema/feedback. Keep adverse facts; never relabel to pass.
| Argument | Type | Description |
|---|---|---|
| payload* | object | Decision question, resolved subject, market scope, and evidence for a bounded recommendation or abstention. |
{
"type": "object",
"required": [
"payload"
],
"properties": {
"payload": {
"type": "object",
"properties": {
"stage": {
"type": "string",
"description": "Free-text venture stage, for example pre-MVP, pilot, grant-funded programme or scaling. No closed enum."
},
"claims": {
"type": "array",
"items": {
"type": "object",
"required": [
"claim_id",
"claim"
],
"properties": {
"claim": {
"type": "string",
"description": "Minimal public-safe target proposition."
},
"claim_id": {
"type": "string",
"description": "Opaque claim identifier."
},
"support_links": {
"type": "array",
"items": {
"type": "object",
"required": [
"claim_id",
"evidence_id",
"relationship",
"locator"
],
"properties": {
"locator": {
"type": "string",
"description": "Specific page, cell or section. A locator is not proof."
},
"claim_id": {
"type": "string",
"description": "Must match the containing claim."
},
"evidence_id": {
"type": "string",
"description": "Must identify an item in this complete evidence pack."
},
"relationship": {
"enum": [
"direct_support",
"qualifies",
"contradicts",
"context_only"
],
"type": "string"
},
"review_event_id": {
"type": "string",
"description": "Only the licensed review service can check this event; ignored as authority by public preflight."
}
}
}
}
}
},
"description": "Optional explicit target claims and source-specific support links. Reuses the governed claim-audit vocabulary. Public links are caller declarations, never authenticated reviewer attestations."
},
"subject": {
"type": "object",
"properties": {
"sector": {
"type": "string"
},
"entity_id": {
"type": "string"
},
"entity_name": {
"type": "string"
},
"entity_archetype": {
"type": "string"
}
},
"description": "Resolved or supplied entity under assessment.",
"additionalProperties": true
},
"target_use": {
"type": "string",
"description": "Internal planning, pilot design, customer-facing, investor-facing, or rollout use."
},
"market_scope": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared target city."
},
"region": {
"type": "string",
"description": "Declared target region."
},
"country": {
"type": "string",
"description": "Declared target country, not the source country."
},
"corridor": {
"type": "string",
"description": "Declared target corridor."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank target district; not verified source coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Target districts as nonblank strings; empty is allowed but does not declare subnational scope."
},
"town_or_zone": {
"type": "string",
"description": "Declared target town or zone."
},
"micro_context": {
"type": "string",
"description": "Explicit local decision context."
},
"decision_scope_level": {
"enum": [
"country",
"subnational"
],
"type": "string",
"description": "Explicit decision scope. Subnational needs declared locality. A country-only decision must be declared, not inferred from absent districts."
}
},
"description": "Declared decision geography, not source geography. Supply district/districts or decision_scope_level country/subnational; subnational requires locality. A bounded Uganda target-name cross-check can require scope review, never insert districts or establish field coverage.",
"additionalProperties": true
},
"target_claim": {
"type": "string",
"description": "Exact claim or readiness question to authorize, limit, or abstain on."
},
"analysis_date": {
"type": "string",
"description": "Optional YYYY-MM-DD or ISO timestamp with timezone, no later than today in analysis_timezone (UTC by default). Defaults to the current date in that calendar. Carried through the public handoff."
},
"evidence_pack": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Optional item identifier. Does not establish a distinct source."
},
"claim": {
"type": "string",
"description": "Minimal, non-confidential claim supported by the item; do not send raw private interviews."
},
"status": {
"type": "string",
"description": "Legacy alias for verification_status."
},
"geography": {
"type": [
"string",
"object"
],
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"description": "Source country name/code or broader description, or an object with country, city, region and town_or_zone strings, a nonblank district string and a districts array of nonblank strings (empty allowed). Known country conflicts, including conflicting evidence_geography.country, are flagged; local applicability is not authenticated.",
"additionalProperties": true
},
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual sample size; required for collector-administered modes, including groups. Group sample cannot exceed session_count times participants_per_session. All supplied aliases must agree; never invent a sample for documentary or self-administered evidence."
},
"source_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"source_hash": {
"type": "string",
"description": "Optional SHA-256 source hash, 64 hexadecimal characters; a hash does not authenticate its origin."
},
"load_bearing": {
"type": "boolean",
"description": "True if the target recommendation materially depends on this item."
},
"source_class": {
"type": "string",
"description": "Origin label, for example entity_reported, regulator_published, structured_field_research, operational_data or counterparty_reference. model_inferred is not source evidence and is rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Never relabel it to pass. Origin is not a claim of independence."
},
"source_grade": {
"type": "string",
"description": "Caller-supplied grade. Not a substitute for verification or source lineage."
},
"evidence_type": {
"type": "string",
"description": "What was collected, for example interview, field observation or licence record. Not merely the conclusion."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Compatibility origin label. Explicit field/public conflicts, including provenance_ledger.source_family, require reconciliation; one label cannot erase another."
},
"freshness_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Compatibility alias for source_date, at the same declared precision. Exact dates/timestamps may name the same analysis-calendar day; conflicting aliases require correction. No source truth is established."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"survey_payload": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
},
"description": "Existing sample_size alias; all supplied sample-size aliases must agree.",
"additionalProperties": true
},
"evidence_origin": {
"type": "string",
"description": "Declared source origin. Explicit public/documentary sources are not caller fieldwork solely because evidence_type is survey. Conflicting explicit field origins still block; never relabel to pass."
},
"is_load_bearing": {
"type": "boolean",
"description": "Compatibility alias for load_bearing."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"provenance_ledger": {
"type": "object",
"properties": {
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Declared source family; distinct labels do not prove independence."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"synthetic_fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source-reference fields that were generated rather than observed; these do not establish lineage."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
}
},
"description": "Field evidence needs source_doc_id and an explicit parent_source_ids array (empty allowed). Unknown lineage stays incomplete, not invented.",
"additionalProperties": true
},
"source_date_range": {
"type": "object",
"required": [
"earliest",
"latest"
],
"properties": {
"latest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"earliest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
}
},
"description": "Optional inclusive declared bounds, usable without source_date. Both endpoints must have the same precision and be ordered. Every supplied source_date/freshness_date must contain the whole range; an exact timestamp cannot be widened. Aliases must agree before narrowing. Unknown dates are not clipped to the analysis date. Bounds are declarations, not source verification.",
"additionalProperties": false
},
"stakeholder_class": {
"type": "string",
"description": "Role represented, for example guardian, customer, supplier or partner. Do not submit a person identifier."
},
"collection_context": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"source_extraction": {
"type": "object",
"required": [
"source_ref",
"fields"
],
"properties": {
"fields": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"source_ref": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
},
"description": "Optional caller-supplied second reading of source facts for conflict comparison only. Not independently authenticated; cannot supply missing primary declarations or establish source authenticity.",
"additionalProperties": false
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"description": "Source-grounded collection declarations, not source authentication. Unknown facts must remain missing; do not invent values to pass. Field decision use requires source modality, collector relationship, interview mode, source-document identity and an explicit parent-source list. Collector-administered modes require staffing, duration, available minutes per collector and sample size. Group modes additionally require session_count, participants_per_session, session_duration_minutes and collectors_per_session, never inferred from an individual interview duration. Online, observation and administrative_record modes require collection_administration; self-administered online and automated observation/record sources do not need invented collector capacity. Explicit public/documentary origins are not caller fieldwork solely because evidence_type is survey; conflicting explicit field origins still block. Independent verification labels require a separate reviewer relationship; persisted review is still checked separately.",
"additionalProperties": true
},
"evidence_geography": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"additionalProperties": true
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
},
"verification_status": {
"type": "string",
"description": "Caller label. verified, independently_verified, corroborated, attested, confirmed and validated count for the structural prefilter only. self_attested, unverified, missing and other labels do not. Do not change labels without actually checking the source."
}
},
"description": "A caller-declared, consented and redacted evidence item. No required fields at intake: incomplete items receive correction feedback. Explicit artifact_role, evidence_role, source_role, record_role and content_role declarations admit only original_source_record, independent_evaluation or human_attestation; other declared roles are rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Omission remains supported for legacy items. Passing coverage never verifies truth, permission or readiness.",
"additionalProperties": true
},
"description": "Full current evidence pack. Rechecks replace the pack; the server does not append or retrieve evidence."
},
"decision_stage": {
"type": "string",
"description": "Idea, pre-entry, pilot, launch, expansion, or scale stage."
},
"evidence_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Optional item identifier. Does not establish a distinct source."
},
"claim": {
"type": "string",
"description": "Minimal, non-confidential claim supported by the item; do not send raw private interviews."
},
"status": {
"type": "string",
"description": "Legacy alias for verification_status."
},
"geography": {
"type": [
"string",
"object"
],
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"description": "Source country name/code or broader description, or an object with country, city, region and town_or_zone strings, a nonblank district string and a districts array of nonblank strings (empty allowed). Known country conflicts, including conflicting evidence_geography.country, are flagged; local applicability is not authenticated.",
"additionalProperties": true
},
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual sample size; required for collector-administered modes, including groups. Group sample cannot exceed session_count times participants_per_session. All supplied aliases must agree; never invent a sample for documentary or self-administered evidence."
},
"source_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"source_hash": {
"type": "string",
"description": "Optional SHA-256 source hash, 64 hexadecimal characters; a hash does not authenticate its origin."
},
"load_bearing": {
"type": "boolean",
"description": "True if the target recommendation materially depends on this item."
},
"source_class": {
"type": "string",
"description": "Origin label, for example entity_reported, regulator_published, structured_field_research, operational_data or counterparty_reference. model_inferred is not source evidence and is rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Never relabel it to pass. Origin is not a claim of independence."
},
"source_grade": {
"type": "string",
"description": "Caller-supplied grade. Not a substitute for verification or source lineage."
},
"evidence_type": {
"type": "string",
"description": "What was collected, for example interview, field observation or licence record. Not merely the conclusion."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Compatibility origin label. Explicit field/public conflicts, including provenance_ledger.source_family, require reconciliation; one label cannot erase another."
},
"freshness_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Compatibility alias for source_date, at the same declared precision. Exact dates/timestamps may name the same analysis-calendar day; conflicting aliases require correction. No source truth is established."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"survey_payload": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
},
"description": "Existing sample_size alias; all supplied sample-size aliases must agree.",
"additionalProperties": true
},
"evidence_origin": {
"type": "string",
"description": "Declared source origin. Explicit public/documentary sources are not caller fieldwork solely because evidence_type is survey. Conflicting explicit field origins still block; never relabel to pass."
},
"is_load_bearing": {
"type": "boolean",
"description": "Compatibility alias for load_bearing."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"provenance_ledger": {
"type": "object",
"properties": {
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Declared source family; distinct labels do not prove independence."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"synthetic_fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source-reference fields that were generated rather than observed; these do not establish lineage."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
}
},
"description": "Field evidence needs source_doc_id and an explicit parent_source_ids array (empty allowed). Unknown lineage stays incomplete, not invented.",
"additionalProperties": true
},
"source_date_range": {
"type": "object",
"required": [
"earliest",
"latest"
],
"properties": {
"latest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"earliest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
}
},
"description": "Optional inclusive declared bounds, usable without source_date. Both endpoints must have the same precision and be ordered. Every supplied source_date/freshness_date must contain the whole range; an exact timestamp cannot be widened. Aliases must agree before narrowing. Unknown dates are not clipped to the analysis date. Bounds are declarations, not source verification.",
"additionalProperties": false
},
"stakeholder_class": {
"type": "string",
"description": "Role represented, for example guardian, customer, supplier or partner. Do not submit a person identifier."
},
"collection_context": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"source_extraction": {
"type": "object",
"required": [
"source_ref",
"fields"
],
"properties": {
"fields": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"source_ref": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
},
"description": "Optional caller-supplied second reading of source facts for conflict comparison only. Not independently authenticated; cannot supply missing primary declarations or establish source authenticity.",
"additionalProperties": false
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"description": "Source-grounded collection declarations, not source authentication. Unknown facts must remain missing; do not invent values to pass. Field decision use requires source modality, collector relationship, interview mode, source-document identity and an explicit parent-source list. Collector-administered modes require staffing, duration, available minutes per collector and sample size. Group modes additionally require session_count, participants_per_session, session_duration_minutes and collectors_per_session, never inferred from an individual interview duration. Online, observation and administrative_record modes require collection_administration; self-administered online and automated observation/record sources do not need invented collector capacity. Explicit public/documentary origins are not caller fieldwork solely because evidence_type is survey; conflicting explicit field origins still block. Independent verification labels require a separate reviewer relationship; persisted review is still checked separately.",
"additionalProperties": true
},
"evidence_geography": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"additionalProperties": true
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
},
"verification_status": {
"type": "string",
"description": "Caller label. verified, independently_verified, corroborated, attested, confirmed and validated count for the structural prefilter only. self_attested, unverified, missing and other labels do not. Do not change labels without actually checking the source."
}
},
"description": "A caller-declared, consented and redacted evidence item. No required fields at intake: incomplete items receive correction feedback. Explicit artifact_role, evidence_role, source_role, record_role and content_role declarations admit only original_source_record, independent_evaluation or human_attestation; other declared roles are rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Omission remains supported for legacy items. Passing coverage never verifies truth, permission or readiness.",
"additionalProperties": true
},
"description": "Alias for evidence_pack. Supply one field, not conflicting copies."
},
"review_case_ref": {
"type": "object",
"required": [
"case_id",
"tenant_id",
"workspace_id",
"reference_secret"
],
"writeOnly": true,
"properties": {
"case_id": {
"type": "string",
"pattern": "^RC-[a-f0-9]{64}$"
},
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"reference_secret": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"writeOnly": true
}
},
"description": "Host-private, case-bound read reference. Never put its secret into prompts, URLs, logs or exports. Grants no write or action authority.",
"additionalProperties": false
},
"attestation_refs": {
"type": "array",
"items": {
"type": "object",
"required": [
"attestation_id",
"tenant_id",
"workspace_id",
"reference_secret"
],
"properties": {
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"attestation_id": {
"type": "string",
"pattern": "^ATT-[a-f0-9]{64}$"
},
"reference_secret": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"writeOnly": true,
"description": "256-bit random bearer secret. Keep host-private, out of URLs/logs/prompts/exports; grants shared context, not authority."
}
},
"additionalProperties": false
},
"maxItems": 3,
"writeOnly": true,
"description": "Optional: https://africanmarketos.com/v1/reviewer-attestations/contract. Requires exact subject, market_scope.country and decision_question. Host-private refs outside evidence; reattach each call. No scoring or authority."
},
"analysis_timezone": {
"type": "string",
"description": "Optional IANA timezone, for example Africa/Nairobi, for the analysis calendar. Defaults to UTC; never inferred from country or IP. Date-only values keep their declared calendar day."
},
"decision_question": {
"type": "string",
"maxLength": 2000,
"description": "Exact recorded attestation question; question must agree when supplied."
},
"evidence_available": {
"type": "array",
"items": {
"type": "string"
},
"description": "Short optional context labels, not proof. For supplied document summaries use incomplete evidence_pack items instead; do not mark claims verified merely because a document exists."
},
"context_freshness_window_days": {
"type": "integer",
"minimum": 1,
"description": "Optional caller-declared maximum evidence age in days. No universal freshness cutoff is invented when absent; age alone does not prove validity."
}
},
"description": "Decision question, resolved subject, market scope, and evidence for a bounded recommendation or abstention.",
"additionalProperties": true
}
},
"additionalProperties": false
}Use when a startup, venture, programme, company, partner, or market actor must be resolved to a country, sector, and archetype before relational-readiness evidence is assessed. Use when: Use immediately after mvr_first_call when the user gives a company, venture, sector, country, or ambiguous market actor name, so the subject and target geography are resolved before evidence is assessed. Do not use when: Do not use as a readiness verdict or for unrelated entity lookup. Never submit secrets, personal identifiers, raw private interviews, or confidential evidence. Evidence input location: arguments.payload. evidence_pack: object array. String fields: evidence_type, source_class, stakeholder_class, verification_status, source_date, source_doc_id. geography: string/object; evidence_geography: object; district: nonblank string; districts: nonblank strings array. source_date/freshness_date: YYYY, YYYY-MM, YYYY-MM-DD or ISO timestamp with timezone. source_date_range: {earliest,latest}, same-precision ordered bounds within supplied dates. analysis_date stays exact. Intervals have age_days:null and age_days_min/max; unresolved window/future overlap excludes coverage. Omit unknown dates/references, never null or invented. verification_status: unverified if unchecked. *_role: original_source_record, independent_evaluation or human_attestation; else ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. collection_context + provenance_ledger: see schema/feedback. Keep adverse facts; never relabel to pass.
| Argument | Type | Description |
|---|---|---|
| payload* | object | Entity and market context to canonicalize before evidence assessment. |
{
"type": "object",
"required": [
"payload"
],
"properties": {
"payload": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Free-text entity description when no stable name exists."
},
"stage": {
"type": "string",
"description": "Free-text venture stage, for example pre-MVP, pilot, grant-funded programme or scaling. No closed enum."
},
"claims": {
"type": "array",
"items": {
"type": "object",
"required": [
"claim_id",
"claim"
],
"properties": {
"claim": {
"type": "string",
"description": "Minimal public-safe target proposition."
},
"claim_id": {
"type": "string",
"description": "Opaque claim identifier."
},
"support_links": {
"type": "array",
"items": {
"type": "object",
"required": [
"claim_id",
"evidence_id",
"relationship",
"locator"
],
"properties": {
"locator": {
"type": "string",
"description": "Specific page, cell or section. A locator is not proof."
},
"claim_id": {
"type": "string",
"description": "Must match the containing claim."
},
"evidence_id": {
"type": "string",
"description": "Must identify an item in this complete evidence pack."
},
"relationship": {
"enum": [
"direct_support",
"qualifies",
"contradicts",
"context_only"
],
"type": "string"
},
"review_event_id": {
"type": "string",
"description": "Only the licensed review service can check this event; ignored as authority by public preflight."
}
}
}
}
}
},
"description": "Optional explicit target claims and source-specific support links. Reuses the governed claim-audit vocabulary. Public links are caller declarations, never authenticated reviewer attestations."
},
"sector": {
"type": "string",
"description": "Sector or operating category when known."
},
"country": {
"type": "string",
"description": "ISO country code or country name when known."
},
"subject": {
"type": "object",
"properties": {
"entity_id": {
"type": "string"
},
"entity_name": {
"type": "string"
}
},
"description": "Exact recorded subject for attestation_refs; entity_name or entity_id required.",
"additionalProperties": true
},
"entity_name": {
"type": "string",
"description": "Venture, company, market actor, or hypothetical entity name."
},
"market_scope": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared target city."
},
"region": {
"type": "string",
"description": "Declared target region."
},
"country": {
"type": "string",
"description": "Declared target country, not the source country."
},
"corridor": {
"type": "string",
"description": "Declared target corridor."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank target district; not verified source coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Target districts as nonblank strings; empty is allowed but does not declare subnational scope."
},
"town_or_zone": {
"type": "string",
"description": "Declared target town or zone."
},
"micro_context": {
"type": "string",
"description": "Explicit local decision context."
},
"decision_scope_level": {
"enum": [
"country",
"subnational"
],
"type": "string",
"description": "Explicit decision scope. Subnational needs declared locality. A country-only decision must be declared, not inferred from absent districts."
}
},
"description": "Declared decision geography, not source geography. Supply district/districts or decision_scope_level country/subnational; subnational requires locality. A bounded Uganda target-name cross-check can require scope review, never insert districts or establish field coverage.",
"additionalProperties": true
},
"analysis_date": {
"type": "string",
"description": "Optional YYYY-MM-DD or ISO timestamp with timezone, no later than today in analysis_timezone (UTC by default). Defaults to the current date in that calendar. Carried through the public handoff."
},
"evidence_pack": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Optional item identifier. Does not establish a distinct source."
},
"claim": {
"type": "string",
"description": "Minimal, non-confidential claim supported by the item; do not send raw private interviews."
},
"status": {
"type": "string",
"description": "Legacy alias for verification_status."
},
"geography": {
"type": [
"string",
"object"
],
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"description": "Source country name/code or broader description, or an object with country, city, region and town_or_zone strings, a nonblank district string and a districts array of nonblank strings (empty allowed). Known country conflicts, including conflicting evidence_geography.country, are flagged; local applicability is not authenticated.",
"additionalProperties": true
},
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual sample size; required for collector-administered modes, including groups. Group sample cannot exceed session_count times participants_per_session. All supplied aliases must agree; never invent a sample for documentary or self-administered evidence."
},
"source_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"source_hash": {
"type": "string",
"description": "Optional SHA-256 source hash, 64 hexadecimal characters; a hash does not authenticate its origin."
},
"load_bearing": {
"type": "boolean",
"description": "True if the target recommendation materially depends on this item."
},
"source_class": {
"type": "string",
"description": "Origin label, for example entity_reported, regulator_published, structured_field_research, operational_data or counterparty_reference. model_inferred is not source evidence and is rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Never relabel it to pass. Origin is not a claim of independence."
},
"source_grade": {
"type": "string",
"description": "Caller-supplied grade. Not a substitute for verification or source lineage."
},
"evidence_type": {
"type": "string",
"description": "What was collected, for example interview, field observation or licence record. Not merely the conclusion."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Compatibility origin label. Explicit field/public conflicts, including provenance_ledger.source_family, require reconciliation; one label cannot erase another."
},
"freshness_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Compatibility alias for source_date, at the same declared precision. Exact dates/timestamps may name the same analysis-calendar day; conflicting aliases require correction. No source truth is established."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"survey_payload": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
},
"description": "Existing sample_size alias; all supplied sample-size aliases must agree.",
"additionalProperties": true
},
"evidence_origin": {
"type": "string",
"description": "Declared source origin. Explicit public/documentary sources are not caller fieldwork solely because evidence_type is survey. Conflicting explicit field origins still block; never relabel to pass."
},
"is_load_bearing": {
"type": "boolean",
"description": "Compatibility alias for load_bearing."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"provenance_ledger": {
"type": "object",
"properties": {
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Declared source family; distinct labels do not prove independence."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"synthetic_fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source-reference fields that were generated rather than observed; these do not establish lineage."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
}
},
"description": "Field evidence needs source_doc_id and an explicit parent_source_ids array (empty allowed). Unknown lineage stays incomplete, not invented.",
"additionalProperties": true
},
"source_date_range": {
"type": "object",
"required": [
"earliest",
"latest"
],
"properties": {
"latest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"earliest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
}
},
"description": "Optional inclusive declared bounds, usable without source_date. Both endpoints must have the same precision and be ordered. Every supplied source_date/freshness_date must contain the whole range; an exact timestamp cannot be widened. Aliases must agree before narrowing. Unknown dates are not clipped to the analysis date. Bounds are declarations, not source verification.",
"additionalProperties": false
},
"stakeholder_class": {
"type": "string",
"description": "Role represented, for example guardian, customer, supplier or partner. Do not submit a person identifier."
},
"collection_context": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"source_extraction": {
"type": "object",
"required": [
"source_ref",
"fields"
],
"properties": {
"fields": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"source_ref": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
},
"description": "Optional caller-supplied second reading of source facts for conflict comparison only. Not independently authenticated; cannot supply missing primary declarations or establish source authenticity.",
"additionalProperties": false
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"description": "Source-grounded collection declarations, not source authentication. Unknown facts must remain missing; do not invent values to pass. Field decision use requires source modality, collector relationship, interview mode, source-document identity and an explicit parent-source list. Collector-administered modes require staffing, duration, available minutes per collector and sample size. Group modes additionally require session_count, participants_per_session, session_duration_minutes and collectors_per_session, never inferred from an individual interview duration. Online, observation and administrative_record modes require collection_administration; self-administered online and automated observation/record sources do not need invented collector capacity. Explicit public/documentary origins are not caller fieldwork solely because evidence_type is survey; conflicting explicit field origins still block. Independent verification labels require a separate reviewer relationship; persisted review is still checked separately.",
"additionalProperties": true
},
"evidence_geography": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"additionalProperties": true
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
},
"verification_status": {
"type": "string",
"description": "Caller label. verified, independently_verified, corroborated, attested, confirmed and validated count for the structural prefilter only. self_attested, unverified, missing and other labels do not. Do not change labels without actually checking the source."
}
},
"description": "A caller-declared, consented and redacted evidence item. No required fields at intake: incomplete items receive correction feedback. Explicit artifact_role, evidence_role, source_role, record_role and content_role declarations admit only original_source_record, independent_evaluation or human_attestation; other declared roles are rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Omission remains supported for legacy items. Passing coverage never verifies truth, permission or readiness.",
"additionalProperties": true
},
"description": "Full current evidence pack. Rechecks replace the pack; the server does not append or retrieve evidence."
},
"evidence_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Optional item identifier. Does not establish a distinct source."
},
"claim": {
"type": "string",
"description": "Minimal, non-confidential claim supported by the item; do not send raw private interviews."
},
"status": {
"type": "string",
"description": "Legacy alias for verification_status."
},
"geography": {
"type": [
"string",
"object"
],
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"description": "Source country name/code or broader description, or an object with country, city, region and town_or_zone strings, a nonblank district string and a districts array of nonblank strings (empty allowed). Known country conflicts, including conflicting evidence_geography.country, are flagged; local applicability is not authenticated.",
"additionalProperties": true
},
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual sample size; required for collector-administered modes, including groups. Group sample cannot exceed session_count times participants_per_session. All supplied aliases must agree; never invent a sample for documentary or self-administered evidence."
},
"source_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"source_hash": {
"type": "string",
"description": "Optional SHA-256 source hash, 64 hexadecimal characters; a hash does not authenticate its origin."
},
"load_bearing": {
"type": "boolean",
"description": "True if the target recommendation materially depends on this item."
},
"source_class": {
"type": "string",
"description": "Origin label, for example entity_reported, regulator_published, structured_field_research, operational_data or counterparty_reference. model_inferred is not source evidence and is rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Never relabel it to pass. Origin is not a claim of independence."
},
"source_grade": {
"type": "string",
"description": "Caller-supplied grade. Not a substitute for verification or source lineage."
},
"evidence_type": {
"type": "string",
"description": "What was collected, for example interview, field observation or licence record. Not merely the conclusion."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Compatibility origin label. Explicit field/public conflicts, including provenance_ledger.source_family, require reconciliation; one label cannot erase another."
},
"freshness_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Compatibility alias for source_date, at the same declared precision. Exact dates/timestamps may name the same analysis-calendar day; conflicting aliases require correction. No source truth is established."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"survey_payload": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
},
"description": "Existing sample_size alias; all supplied sample-size aliases must agree.",
"additionalProperties": true
},
"evidence_origin": {
"type": "string",
"description": "Declared source origin. Explicit public/documentary sources are not caller fieldwork solely because evidence_type is survey. Conflicting explicit field origins still block; never relabel to pass."
},
"is_load_bearing": {
"type": "boolean",
"description": "Compatibility alias for load_bearing."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"provenance_ledger": {
"type": "object",
"properties": {
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Declared source family; distinct labels do not prove independence."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"synthetic_fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source-reference fields that were generated rather than observed; these do not establish lineage."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
}
},
"description": "Field evidence needs source_doc_id and an explicit parent_source_ids array (empty allowed). Unknown lineage stays incomplete, not invented.",
"additionalProperties": true
},
"source_date_range": {
"type": "object",
"required": [
"earliest",
"latest"
],
"properties": {
"latest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"earliest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
}
},
"description": "Optional inclusive declared bounds, usable without source_date. Both endpoints must have the same precision and be ordered. Every supplied source_date/freshness_date must contain the whole range; an exact timestamp cannot be widened. Aliases must agree before narrowing. Unknown dates are not clipped to the analysis date. Bounds are declarations, not source verification.",
"additionalProperties": false
},
"stakeholder_class": {
"type": "string",
"description": "Role represented, for example guardian, customer, supplier or partner. Do not submit a person identifier."
},
"collection_context": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"source_extraction": {
"type": "object",
"required": [
"source_ref",
"fields"
],
"properties": {
"fields": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"source_ref": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
},
"description": "Optional caller-supplied second reading of source facts for conflict comparison only. Not independently authenticated; cannot supply missing primary declarations or establish source authenticity.",
"additionalProperties": false
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"description": "Source-grounded collection declarations, not source authentication. Unknown facts must remain missing; do not invent values to pass. Field decision use requires source modality, collector relationship, interview mode, source-document identity and an explicit parent-source list. Collector-administered modes require staffing, duration, available minutes per collector and sample size. Group modes additionally require session_count, participants_per_session, session_duration_minutes and collectors_per_session, never inferred from an individual interview duration. Online, observation and administrative_record modes require collection_administration; self-administered online and automated observation/record sources do not need invented collector capacity. Explicit public/documentary origins are not caller fieldwork solely because evidence_type is survey; conflicting explicit field origins still block. Independent verification labels require a separate reviewer relationship; persisted review is still checked separately.",
"additionalProperties": true
},
"evidence_geography": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"additionalProperties": true
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
},
"verification_status": {
"type": "string",
"description": "Caller label. verified, independently_verified, corroborated, attested, confirmed and validated count for the structural prefilter only. self_attested, unverified, missing and other labels do not. Do not change labels without actually checking the source."
}
},
"description": "A caller-declared, consented and redacted evidence item. No required fields at intake: incomplete items receive correction feedback. Explicit artifact_role, evidence_role, source_role, record_role and content_role declarations admit only original_source_record, independent_evaluation or human_attestation; other declared roles are rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Omission remains supported for legacy items. Passing coverage never verifies truth, permission or readiness.",
"additionalProperties": true
},
"description": "Alias for evidence_pack. Supply one field, not conflicting copies."
},
"review_case_ref": {
"type": "object",
"required": [
"case_id",
"tenant_id",
"workspace_id",
"reference_secret"
],
"writeOnly": true,
"properties": {
"case_id": {
"type": "string",
"pattern": "^RC-[a-f0-9]{64}$"
},
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"reference_secret": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"writeOnly": true
}
},
"description": "Host-private, case-bound read reference. Never put its secret into prompts, URLs, logs or exports. Grants no write or action authority.",
"additionalProperties": false
},
"attestation_refs": {
"type": "array",
"items": {
"type": "object",
"required": [
"attestation_id",
"tenant_id",
"workspace_id",
"reference_secret"
],
"properties": {
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"attestation_id": {
"type": "string",
"pattern": "^ATT-[a-f0-9]{64}$"
},
"reference_secret": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"writeOnly": true,
"description": "256-bit random bearer secret. Keep host-private, out of URLs/logs/prompts/exports; grants shared context, not authority."
}
},
"additionalProperties": false
},
"maxItems": 3,
"writeOnly": true,
"description": "Optional: https://africanmarketos.com/v1/reviewer-attestations/contract. Requires exact subject, market_scope.country and decision_question. Host-private refs outside evidence; reattach each call. No scoring or authority."
},
"entity_archetype": {
"type": "string",
"description": "Known MVR archetype, if already identified."
},
"analysis_timezone": {
"type": "string",
"description": "Optional IANA timezone, for example Africa/Nairobi, for the analysis calendar. Defaults to UTC; never inferred from country or IP. Date-only values keep their declared calendar day."
},
"decision_question": {
"type": "string",
"maxLength": 2000,
"description": "Exact recorded attestation question; question must agree when supplied."
},
"organization_type": {
"type": "string",
"description": "Founder, SME, corporate, investor, institution, or other operator type when relevant."
},
"evidence_available": {
"type": "array",
"items": {
"type": "string"
},
"description": "Short optional context labels, not proof. For supplied document summaries use incomplete evidence_pack items instead; do not mark claims verified merely because a document exists."
},
"context_freshness_window_days": {
"type": "integer",
"minimum": 1,
"description": "Optional caller-declared maximum evidence age in days. No universal freshness cutoff is invented when absent; age alone does not prove validity."
}
},
"description": "Entity and market context to canonicalize before evidence assessment.",
"minProperties": 1,
"additionalProperties": true
}
},
"additionalProperties": false
}Use after entity resolution and before any readiness claim to check verification status, source-family diversity, stakeholder coverage, and missing proof. Do not treat completeness as authorization. Use when: Use after entity resolution and before any verdict when evidence may be incomplete or one-sided. Do not use when: Do not treat completeness as readiness or authorization. Submit only consented, data-minimized, redacted or aggregated evidence; never raw private interviews, secrets, credentials, or personal identifiers. Evidence input location: arguments.payload. evidence_pack: object array. String fields: evidence_type, source_class, stakeholder_class, verification_status, source_date, source_doc_id. geography: string/object; evidence_geography: object; district: nonblank string; districts: nonblank strings array. source_date/freshness_date: YYYY, YYYY-MM, YYYY-MM-DD or ISO timestamp with timezone. source_date_range: {earliest,latest}, same-precision ordered bounds within supplied dates. analysis_date stays exact. Intervals have age_days:null and age_days_min/max; unresolved window/future overlap excludes coverage. Omit unknown dates/references, never null or invented. verification_status: unverified if unchecked. *_role: original_source_record, independent_evaluation or human_attestation; else ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. collection_context + provenance_ledger: see schema/feedback. Keep adverse facts; never relabel to pass.
| Argument | Type | Description |
|---|---|---|
| payload* | object | Evidence pack and decision context to test for missing proof. |
{
"type": "object",
"required": [
"payload"
],
"properties": {
"payload": {
"type": "object",
"properties": {
"stage": {
"type": "string",
"description": "Free-text venture stage, for example pre-MVP, pilot, grant-funded programme or scaling. No closed enum."
},
"claims": {
"type": "array",
"items": {
"type": "object",
"required": [
"claim_id",
"claim"
],
"properties": {
"claim": {
"type": "string",
"description": "Minimal public-safe target proposition."
},
"claim_id": {
"type": "string",
"description": "Opaque claim identifier."
},
"support_links": {
"type": "array",
"items": {
"type": "object",
"required": [
"claim_id",
"evidence_id",
"relationship",
"locator"
],
"properties": {
"locator": {
"type": "string",
"description": "Specific page, cell or section. A locator is not proof."
},
"claim_id": {
"type": "string",
"description": "Must match the containing claim."
},
"evidence_id": {
"type": "string",
"description": "Must identify an item in this complete evidence pack."
},
"relationship": {
"enum": [
"direct_support",
"qualifies",
"contradicts",
"context_only"
],
"type": "string"
},
"review_event_id": {
"type": "string",
"description": "Only the licensed review service can check this event; ignored as authority by public preflight."
}
}
}
}
}
},
"description": "Optional explicit target claims and source-specific support links. Reuses the governed claim-audit vocabulary. Public links are caller declarations, never authenticated reviewer attestations."
},
"subject": {
"type": "object",
"properties": {
"sector": {
"type": "string"
},
"entity_id": {
"type": "string"
},
"entity_name": {
"type": "string"
},
"entity_archetype": {
"type": "string"
}
},
"description": "Resolved or supplied entity under assessment.",
"additionalProperties": true
},
"market_scope": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared target city."
},
"region": {
"type": "string",
"description": "Declared target region."
},
"country": {
"type": "string",
"description": "Declared target country, not the source country."
},
"corridor": {
"type": "string",
"description": "Declared target corridor."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank target district; not verified source coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Target districts as nonblank strings; empty is allowed but does not declare subnational scope."
},
"town_or_zone": {
"type": "string",
"description": "Declared target town or zone."
},
"micro_context": {
"type": "string",
"description": "Explicit local decision context."
},
"decision_scope_level": {
"enum": [
"country",
"subnational"
],
"type": "string",
"description": "Explicit decision scope. Subnational needs declared locality. A country-only decision must be declared, not inferred from absent districts."
}
},
"description": "Declared decision geography, not source geography. Supply district/districts or decision_scope_level country/subnational; subnational requires locality. A bounded Uganda target-name cross-check can require scope review, never insert districts or establish field coverage.",
"additionalProperties": true
},
"target_claim": {
"type": "string",
"description": "Claim or readiness question the evidence is meant to support."
},
"analysis_date": {
"type": "string",
"description": "Optional YYYY-MM-DD or ISO timestamp with timezone, no later than today in analysis_timezone (UTC by default). Defaults to the current date in that calendar. Carried through the public handoff."
},
"evidence_pack": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Optional item identifier. Does not establish a distinct source."
},
"claim": {
"type": "string",
"description": "Minimal, non-confidential claim supported by the item; do not send raw private interviews."
},
"status": {
"type": "string",
"description": "Legacy alias for verification_status."
},
"geography": {
"type": [
"string",
"object"
],
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"description": "Source country name/code or broader description, or an object with country, city, region and town_or_zone strings, a nonblank district string and a districts array of nonblank strings (empty allowed). Known country conflicts, including conflicting evidence_geography.country, are flagged; local applicability is not authenticated.",
"additionalProperties": true
},
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual sample size; required for collector-administered modes, including groups. Group sample cannot exceed session_count times participants_per_session. All supplied aliases must agree; never invent a sample for documentary or self-administered evidence."
},
"source_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"source_hash": {
"type": "string",
"description": "Optional SHA-256 source hash, 64 hexadecimal characters; a hash does not authenticate its origin."
},
"load_bearing": {
"type": "boolean",
"description": "True if the target recommendation materially depends on this item."
},
"source_class": {
"type": "string",
"description": "Origin label, for example entity_reported, regulator_published, structured_field_research, operational_data or counterparty_reference. model_inferred is not source evidence and is rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Never relabel it to pass. Origin is not a claim of independence."
},
"source_grade": {
"type": "string",
"description": "Caller-supplied grade. Not a substitute for verification or source lineage."
},
"evidence_type": {
"type": "string",
"description": "What was collected, for example interview, field observation or licence record. Not merely the conclusion."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Compatibility origin label. Explicit field/public conflicts, including provenance_ledger.source_family, require reconciliation; one label cannot erase another."
},
"freshness_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Compatibility alias for source_date, at the same declared precision. Exact dates/timestamps may name the same analysis-calendar day; conflicting aliases require correction. No source truth is established."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"survey_payload": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
},
"description": "Existing sample_size alias; all supplied sample-size aliases must agree.",
"additionalProperties": true
},
"evidence_origin": {
"type": "string",
"description": "Declared source origin. Explicit public/documentary sources are not caller fieldwork solely because evidence_type is survey. Conflicting explicit field origins still block; never relabel to pass."
},
"is_load_bearing": {
"type": "boolean",
"description": "Compatibility alias for load_bearing."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"provenance_ledger": {
"type": "object",
"properties": {
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Declared source family; distinct labels do not prove independence."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"synthetic_fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source-reference fields that were generated rather than observed; these do not establish lineage."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
}
},
"description": "Field evidence needs source_doc_id and an explicit parent_source_ids array (empty allowed). Unknown lineage stays incomplete, not invented.",
"additionalProperties": true
},
"source_date_range": {
"type": "object",
"required": [
"earliest",
"latest"
],
"properties": {
"latest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"earliest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
}
},
"description": "Optional inclusive declared bounds, usable without source_date. Both endpoints must have the same precision and be ordered. Every supplied source_date/freshness_date must contain the whole range; an exact timestamp cannot be widened. Aliases must agree before narrowing. Unknown dates are not clipped to the analysis date. Bounds are declarations, not source verification.",
"additionalProperties": false
},
"stakeholder_class": {
"type": "string",
"description": "Role represented, for example guardian, customer, supplier or partner. Do not submit a person identifier."
},
"collection_context": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"source_extraction": {
"type": "object",
"required": [
"source_ref",
"fields"
],
"properties": {
"fields": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"source_ref": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
},
"description": "Optional caller-supplied second reading of source facts for conflict comparison only. Not independently authenticated; cannot supply missing primary declarations or establish source authenticity.",
"additionalProperties": false
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"description": "Source-grounded collection declarations, not source authentication. Unknown facts must remain missing; do not invent values to pass. Field decision use requires source modality, collector relationship, interview mode, source-document identity and an explicit parent-source list. Collector-administered modes require staffing, duration, available minutes per collector and sample size. Group modes additionally require session_count, participants_per_session, session_duration_minutes and collectors_per_session, never inferred from an individual interview duration. Online, observation and administrative_record modes require collection_administration; self-administered online and automated observation/record sources do not need invented collector capacity. Explicit public/documentary origins are not caller fieldwork solely because evidence_type is survey; conflicting explicit field origins still block. Independent verification labels require a separate reviewer relationship; persisted review is still checked separately.",
"additionalProperties": true
},
"evidence_geography": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"additionalProperties": true
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
},
"verification_status": {
"type": "string",
"description": "Caller label. verified, independently_verified, corroborated, attested, confirmed and validated count for the structural prefilter only. self_attested, unverified, missing and other labels do not. Do not change labels without actually checking the source."
}
},
"description": "A caller-declared, consented and redacted evidence item. No required fields at intake: incomplete items receive correction feedback. Explicit artifact_role, evidence_role, source_role, record_role and content_role declarations admit only original_source_record, independent_evaluation or human_attestation; other declared roles are rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Omission remains supported for legacy items. Passing coverage never verifies truth, permission or readiness.",
"additionalProperties": true
},
"description": "Full current evidence pack. Rechecks replace the pack; the server does not append or retrieve evidence."
},
"decision_stage": {
"type": "string",
"description": "Idea, pre-entry, pilot, launch, expansion, or scale stage."
},
"evidence_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Optional item identifier. Does not establish a distinct source."
},
"claim": {
"type": "string",
"description": "Minimal, non-confidential claim supported by the item; do not send raw private interviews."
},
"status": {
"type": "string",
"description": "Legacy alias for verification_status."
},
"geography": {
"type": [
"string",
"object"
],
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"description": "Source country name/code or broader description, or an object with country, city, region and town_or_zone strings, a nonblank district string and a districts array of nonblank strings (empty allowed). Known country conflicts, including conflicting evidence_geography.country, are flagged; local applicability is not authenticated.",
"additionalProperties": true
},
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual sample size; required for collector-administered modes, including groups. Group sample cannot exceed session_count times participants_per_session. All supplied aliases must agree; never invent a sample for documentary or self-administered evidence."
},
"source_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"source_hash": {
"type": "string",
"description": "Optional SHA-256 source hash, 64 hexadecimal characters; a hash does not authenticate its origin."
},
"load_bearing": {
"type": "boolean",
"description": "True if the target recommendation materially depends on this item."
},
"source_class": {
"type": "string",
"description": "Origin label, for example entity_reported, regulator_published, structured_field_research, operational_data or counterparty_reference. model_inferred is not source evidence and is rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Never relabel it to pass. Origin is not a claim of independence."
},
"source_grade": {
"type": "string",
"description": "Caller-supplied grade. Not a substitute for verification or source lineage."
},
"evidence_type": {
"type": "string",
"description": "What was collected, for example interview, field observation or licence record. Not merely the conclusion."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Compatibility origin label. Explicit field/public conflicts, including provenance_ledger.source_family, require reconciliation; one label cannot erase another."
},
"freshness_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Compatibility alias for source_date, at the same declared precision. Exact dates/timestamps may name the same analysis-calendar day; conflicting aliases require correction. No source truth is established."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"survey_payload": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
},
"description": "Existing sample_size alias; all supplied sample-size aliases must agree.",
"additionalProperties": true
},
"evidence_origin": {
"type": "string",
"description": "Declared source origin. Explicit public/documentary sources are not caller fieldwork solely because evidence_type is survey. Conflicting explicit field origins still block; never relabel to pass."
},
"is_load_bearing": {
"type": "boolean",
"description": "Compatibility alias for load_bearing."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"provenance_ledger": {
"type": "object",
"properties": {
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Declared source family; distinct labels do not prove independence."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"synthetic_fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source-reference fields that were generated rather than observed; these do not establish lineage."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
}
},
"description": "Field evidence needs source_doc_id and an explicit parent_source_ids array (empty allowed). Unknown lineage stays incomplete, not invented.",
"additionalProperties": true
},
"source_date_range": {
"type": "object",
"required": [
"earliest",
"latest"
],
"properties": {
"latest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"earliest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
}
},
"description": "Optional inclusive declared bounds, usable without source_date. Both endpoints must have the same precision and be ordered. Every supplied source_date/freshness_date must contain the whole range; an exact timestamp cannot be widened. Aliases must agree before narrowing. Unknown dates are not clipped to the analysis date. Bounds are declarations, not source verification.",
"additionalProperties": false
},
"stakeholder_class": {
"type": "string",
"description": "Role represented, for example guardian, customer, supplier or partner. Do not submit a person identifier."
},
"collection_context": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"source_extraction": {
"type": "object",
"required": [
"source_ref",
"fields"
],
"properties": {
"fields": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"source_ref": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
},
"description": "Optional caller-supplied second reading of source facts for conflict comparison only. Not independently authenticated; cannot supply missing primary declarations or establish source authenticity.",
"additionalProperties": false
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"description": "Source-grounded collection declarations, not source authentication. Unknown facts must remain missing; do not invent values to pass. Field decision use requires source modality, collector relationship, interview mode, source-document identity and an explicit parent-source list. Collector-administered modes require staffing, duration, available minutes per collector and sample size. Group modes additionally require session_count, participants_per_session, session_duration_minutes and collectors_per_session, never inferred from an individual interview duration. Online, observation and administrative_record modes require collection_administration; self-administered online and automated observation/record sources do not need invented collector capacity. Explicit public/documentary origins are not caller fieldwork solely because evidence_type is survey; conflicting explicit field origins still block. Independent verification labels require a separate reviewer relationship; persisted review is still checked separately.",
"additionalProperties": true
},
"evidence_geography": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"additionalProperties": true
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
},
"verification_status": {
"type": "string",
"description": "Caller label. verified, independently_verified, corroborated, attested, confirmed and validated count for the structural prefilter only. self_attested, unverified, missing and other labels do not. Do not change labels without actually checking the source."
}
},
"description": "A caller-declared, consented and redacted evidence item. No required fields at intake: incomplete items receive correction feedback. Explicit artifact_role, evidence_role, source_role, record_role and content_role declarations admit only original_source_record, independent_evaluation or human_attestation; other declared roles are rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Omission remains supported for legacy items. Passing coverage never verifies truth, permission or readiness.",
"additionalProperties": true
},
"description": "Alias for evidence_pack. Supply one field, not conflicting copies."
},
"review_case_ref": {
"type": "object",
"required": [
"case_id",
"tenant_id",
"workspace_id",
"reference_secret"
],
"writeOnly": true,
"properties": {
"case_id": {
"type": "string",
"pattern": "^RC-[a-f0-9]{64}$"
},
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"reference_secret": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"writeOnly": true
}
},
"description": "Host-private, case-bound read reference. Never put its secret into prompts, URLs, logs or exports. Grants no write or action authority.",
"additionalProperties": false
},
"attestation_refs": {
"type": "array",
"items": {
"type": "object",
"required": [
"attestation_id",
"tenant_id",
"workspace_id",
"reference_secret"
],
"properties": {
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"attestation_id": {
"type": "string",
"pattern": "^ATT-[a-f0-9]{64}$"
},
"reference_secret": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"writeOnly": true,
"description": "256-bit random bearer secret. Keep host-private, out of URLs/logs/prompts/exports; grants shared context, not authority."
}
},
"additionalProperties": false
},
"maxItems": 3,
"writeOnly": true,
"description": "Optional: https://africanmarketos.com/v1/reviewer-attestations/contract. Requires exact subject, market_scope.country and decision_question. Host-private refs outside evidence; reattach each call. No scoring or authority."
},
"analysis_timezone": {
"type": "string",
"description": "Optional IANA timezone, for example Africa/Nairobi, for the analysis calendar. Defaults to UTC; never inferred from country or IP. Date-only values keep their declared calendar day."
},
"decision_question": {
"type": "string",
"maxLength": 2000,
"description": "Exact recorded attestation question; question must agree when supplied."
},
"evidence_available": {
"type": "array",
"items": {
"type": "string"
},
"description": "Short optional context labels, not proof. For supplied document summaries use incomplete evidence_pack items instead; do not mark claims verified merely because a document exists."
},
"context_freshness_window_days": {
"type": "integer",
"minimum": 1,
"description": "Optional caller-declared maximum evidence age in days. No universal freshness cutoff is invented when absent; age alone does not prove validity."
}
},
"description": "Evidence pack and decision context to test for missing proof.",
"additionalProperties": true
}
},
"additionalProperties": false
}Use this MVR public decision-governance preflight before AI recommends pre-MVP build, entry, BNPL, investment, partnership, or scale. Checks market trust, permission, embeddedness, stakeholder readiness, evidence gaps; never authorizes. Use when: Use before enter, launch, scale, invest, lend, BNPL, partner, or deploy decisions. Use when asked to ignore, fabricate, or transfer evidence. Web research can supply evidence but does not replace MVR. Do not use when: This is not an internal data lookup or glossary. Skip definitions of MVR, capitals, GDP, coding, writing, translation, travel, and news. Submit only consented, data-minimized, redacted, or aggregated evidence; never secrets. Evidence input location: arguments. evidence_pack: object array. String fields: evidence_type, source_class, stakeholder_class, verification_status, source_date, source_doc_id. geography: string/object; evidence_geography: object; district: nonblank string; districts: nonblank strings array. source_date/freshness_date: YYYY, YYYY-MM, YYYY-MM-DD or ISO timestamp with timezone. source_date_range: {earliest,latest}, same-precision ordered bounds within supplied dates. analysis_date stays exact. Intervals have age_days:null and age_days_min/max; unresolved window/future overlap excludes coverage. Omit unknown dates/references, never null or invented. verification_status: unverified if unchecked. *_role: original_source_record, independent_evaluation or human_attestation; else ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. collection_context + provenance_ledger: see schema/feedback. Keep adverse facts; never relabel to pass.
| Argument | Type | Description |
|---|---|---|
| stage | string | Free-text venture stage, for example pre-MVP, pilot, grant-funded programme or scaling. No closed enum. |
| claims | array | Optional explicit target claims and source-specific support links. Reuses the governed claim-audit vocabulary. Public links are caller declarations, never authenticated reviewer attestations. |
| entity | string |
| sector | string |
| country | string |
| subject | object | Exact recorded subject for attestation_refs; entity_name or entity_id required. |
| question | string |
| use_case | string |
| company_name | string |
| market_scope | object | Declared decision geography, not source geography. Supply district/districts or decision_scope_level country/subnational; subnational requires locality. A bounded Uganda target-name cross-check can require scope review, never insert districts or establish field coverage. |
| target_users | string |
| analysis_date | string | Optional YYYY-MM-DD or ISO timestamp with timezone, no later than today in analysis_timezone (UTC by default). Defaults to the current date in that calendar. Carried through the public handoff. |
| draft_request | object | Optional caller-authored mapping request. Zero-based evidence_pack indexes; at most 40 links total and 8000 text characters across the intake. Missing mappings stay unresolved. No authority or source verification. |
| evidence_pack | array | Full current evidence pack. Rechecks replace the pack; the server does not append or retrieve evidence. |
| evidence_items | array | Alias for evidence_pack. Supply one field, not conflicting copies. |
| known_partners | array |
| relevance_check | boolean | Check relevance only; no workflow. |
| review_case_ref | object | Host-private, case-bound read reference. Never put its secret into prompts, URLs, logs or exports. Grants no write or action authority. |
| attestation_refs | array | Optional: https://africanmarketos.com/v1/reviewer-attestations/contract. Requires exact subject, market_scope.country and decision_question. Host-private refs outside evidence; reattach each call. No scoring or authority. |
| analysis_timezone | string | Optional IANA timezone, for example Africa/Nairobi, for the analysis calendar. Defaults to UTC; never inferred from country or IP. Date-only values keep their declared calendar day. |
| decision_question | string | Exact recorded attestation question; question must agree when supplied. |
| evidence_available | array | Short optional context labels, not proof. For supplied document summaries use incomplete evidence_pack items instead; do not mark claims verified merely because a document exists. |
| context_freshness_window_days | integer | Optional caller-declared maximum evidence age in days. No universal freshness cutoff is invented when absent; age alone does not prove validity. |
{
"type": "object",
"properties": {
"stage": {
"type": "string",
"description": "Free-text venture stage, for example pre-MVP, pilot, grant-funded programme or scaling. No closed enum."
},
"claims": {
"type": "array",
"items": {
"type": "object",
"required": [
"claim_id",
"claim"
],
"properties": {
"claim": {
"type": "string",
"description": "Minimal public-safe target proposition."
},
"claim_id": {
"type": "string",
"description": "Opaque claim identifier."
},
"support_links": {
"type": "array",
"items": {
"type": "object",
"required": [
"claim_id",
"evidence_id",
"relationship",
"locator"
],
"properties": {
"locator": {
"type": "string",
"description": "Specific page, cell or section. A locator is not proof."
},
"claim_id": {
"type": "string",
"description": "Must match the containing claim."
},
"evidence_id": {
"type": "string",
"description": "Must identify an item in this complete evidence pack."
},
"relationship": {
"enum": [
"direct_support",
"qualifies",
"contradicts",
"context_only"
],
"type": "string"
},
"review_event_id": {
"type": "string",
"description": "Only the licensed review service can check this event; ignored as authority by public preflight."
}
}
}
}
}
},
"description": "Optional explicit target claims and source-specific support links. Reuses the governed claim-audit vocabulary. Public links are caller declarations, never authenticated reviewer attestations."
},
"entity": {
"type": "string"
},
"sector": {
"type": "string"
},
"country": {
"type": "string"
},
"subject": {
"type": "object",
"properties": {
"entity_id": {
"type": "string"
},
"entity_name": {
"type": "string"
}
},
"description": "Exact recorded subject for attestation_refs; entity_name or entity_id required.",
"additionalProperties": true
},
"question": {
"type": "string"
},
"use_case": {
"type": "string"
},
"company_name": {
"type": "string"
},
"market_scope": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared target city."
},
"region": {
"type": "string",
"description": "Declared target region."
},
"country": {
"type": "string",
"description": "Declared target country, not the source country."
},
"corridor": {
"type": "string",
"description": "Declared target corridor."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank target district; not verified source coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Target districts as nonblank strings; empty is allowed but does not declare subnational scope."
},
"town_or_zone": {
"type": "string",
"description": "Declared target town or zone."
},
"micro_context": {
"type": "string",
"description": "Explicit local decision context."
},
"decision_scope_level": {
"enum": [
"country",
"subnational"
],
"type": "string",
"description": "Explicit decision scope. Subnational needs declared locality. A country-only decision must be declared, not inferred from absent districts."
}
},
"description": "Declared decision geography, not source geography. Supply district/districts or decision_scope_level country/subnational; subnational requires locality. A bounded Uganda target-name cross-check can require scope review, never insert districts or establish field coverage.",
"additionalProperties": true
},
"target_users": {
"type": "string"
},
"analysis_date": {
"type": "string",
"description": "Optional YYYY-MM-DD or ISO timestamp with timezone, no later than today in analysis_timezone (UTC by default). Defaults to the current date in that calendar. Carried through the public handoff."
},
"draft_request": {
"type": "object",
"required": [
"claims"
],
"properties": {
"claims": {
"type": "array",
"items": {
"type": "object",
"required": [
"text",
"sources"
],
"properties": {
"text": {
"type": "string",
"pattern": "\\S",
"maxLength": 8000,
"minLength": 1
},
"sources": {
"type": "array",
"items": {
"type": "object",
"required": [
"evidence_index",
"relationship",
"locator"
],
"properties": {
"locator": {
"type": "string",
"pattern": "\\S",
"maxLength": 8000,
"minLength": 1
},
"relationship": {
"enum": [
"direct_support",
"qualifies",
"contradicts",
"context_only"
],
"type": "string"
},
"evidence_index": {
"type": "integer",
"maximum": 39,
"minimum": 0
}
},
"additionalProperties": false
},
"maxItems": 40
}
},
"additionalProperties": false
},
"maxItems": 20
}
},
"description": "Optional caller-authored mapping request. Zero-based evidence_pack indexes; at most 40 links total and 8000 text characters across the intake. Missing mappings stay unresolved. No authority or source verification.",
"additionalProperties": false
},
"evidence_pack": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Optional item identifier. Does not establish a distinct source."
},
"claim": {
"type": "string",
"description": "Minimal, non-confidential claim supported by the item; do not send raw private interviews."
},
"status": {
"type": "string",
"description": "Legacy alias for verification_status."
},
"geography": {
"type": [
"string",
"object"
],
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"description": "Source country name/code or broader description, or an object with country, city, region and town_or_zone strings, a nonblank district string and a districts array of nonblank strings (empty allowed). Known country conflicts, including conflicting evidence_geography.country, are flagged; local applicability is not authenticated.",
"additionalProperties": true
},
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual sample size; required for collector-administered modes, including groups. Group sample cannot exceed session_count times participants_per_session. All supplied aliases must agree; never invent a sample for documentary or self-administered evidence."
},
"source_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"source_hash": {
"type": "string",
"description": "Optional SHA-256 source hash, 64 hexadecimal characters; a hash does not authenticate its origin."
},
"load_bearing": {
"type": "boolean",
"description": "True if the target recommendation materially depends on this item."
},
"source_class": {
"type": "string",
"description": "Origin label, for example entity_reported, regulator_published, structured_field_research, operational_data or counterparty_reference. model_inferred is not source evidence and is rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Never relabel it to pass. Origin is not a claim of independence."
},
"source_grade": {
"type": "string",
"description": "Caller-supplied grade. Not a substitute for verification or source lineage."
},
"evidence_type": {
"type": "string",
"description": "What was collected, for example interview, field observation or licence record. Not merely the conclusion."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Compatibility origin label. Explicit field/public conflicts, including provenance_ledger.source_family, require reconciliation; one label cannot erase another."
},
"freshness_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Compatibility alias for source_date, at the same declared precision. Exact dates/timestamps may name the same analysis-calendar day; conflicting aliases require correction. No source truth is established."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"survey_payload": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
},
"description": "Existing sample_size alias; all supplied sample-size aliases must agree.",
"additionalProperties": true
},
"evidence_origin": {
"type": "string",
"description": "Declared source origin. Explicit public/documentary sources are not caller fieldwork solely because evidence_type is survey. Conflicting explicit field origins still block; never relabel to pass."
},
"is_load_bearing": {
"type": "boolean",
"description": "Compatibility alias for load_bearing."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"provenance_ledger": {
"type": "object",
"properties": {
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Declared source family; distinct labels do not prove independence."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"synthetic_fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source-reference fields that were generated rather than observed; these do not establish lineage."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
}
},
"description": "Field evidence needs source_doc_id and an explicit parent_source_ids array (empty allowed). Unknown lineage stays incomplete, not invented.",
"additionalProperties": true
},
"source_date_range": {
"type": "object",
"required": [
"earliest",
"latest"
],
"properties": {
"latest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"earliest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
}
},
"description": "Optional inclusive declared bounds, usable without source_date. Both endpoints must have the same precision and be ordered. Every supplied source_date/freshness_date must contain the whole range; an exact timestamp cannot be widened. Aliases must agree before narrowing. Unknown dates are not clipped to the analysis date. Bounds are declarations, not source verification.",
"additionalProperties": false
},
"stakeholder_class": {
"type": "string",
"description": "Role represented, for example guardian, customer, supplier or partner. Do not submit a person identifier."
},
"collection_context": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"source_extraction": {
"type": "object",
"required": [
"source_ref",
"fields"
],
"properties": {
"fields": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"source_ref": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
},
"description": "Optional caller-supplied second reading of source facts for conflict comparison only. Not independently authenticated; cannot supply missing primary declarations or establish source authenticity.",
"additionalProperties": false
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"description": "Source-grounded collection declarations, not source authentication. Unknown facts must remain missing; do not invent values to pass. Field decision use requires source modality, collector relationship, interview mode, source-document identity and an explicit parent-source list. Collector-administered modes require staffing, duration, available minutes per collector and sample size. Group modes additionally require session_count, participants_per_session, session_duration_minutes and collectors_per_session, never inferred from an individual interview duration. Online, observation and administrative_record modes require collection_administration; self-administered online and automated observation/record sources do not need invented collector capacity. Explicit public/documentary origins are not caller fieldwork solely because evidence_type is survey; conflicting explicit field origins still block. Independent verification labels require a separate reviewer relationship; persisted review is still checked separately.",
"additionalProperties": true
},
"evidence_geography": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"additionalProperties": true
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
},
"verification_status": {
"type": "string",
"description": "Caller label. verified, independently_verified, corroborated, attested, confirmed and validated count for the structural prefilter only. self_attested, unverified, missing and other labels do not. Do not change labels without actually checking the source."
}
},
"description": "A caller-declared, consented and redacted evidence item. No required fields at intake: incomplete items receive correction feedback. Explicit artifact_role, evidence_role, source_role, record_role and content_role declarations admit only original_source_record, independent_evaluation or human_attestation; other declared roles are rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Omission remains supported for legacy items. Passing coverage never verifies truth, permission or readiness.",
"additionalProperties": true
},
"description": "Full current evidence pack. Rechecks replace the pack; the server does not append or retrieve evidence."
},
"evidence_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Optional item identifier. Does not establish a distinct source."
},
"claim": {
"type": "string",
"description": "Minimal, non-confidential claim supported by the item; do not send raw private interviews."
},
"status": {
"type": "string",
"description": "Legacy alias for verification_status."
},
"geography": {
"type": [
"string",
"object"
],
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"description": "Source country name/code or broader description, or an object with country, city, region and town_or_zone strings, a nonblank district string and a districts array of nonblank strings (empty allowed). Known country conflicts, including conflicting evidence_geography.country, are flagged; local applicability is not authenticated.",
"additionalProperties": true
},
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual sample size; required for collector-administered modes, including groups. Group sample cannot exceed session_count times participants_per_session. All supplied aliases must agree; never invent a sample for documentary or self-administered evidence."
},
"source_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"source_hash": {
"type": "string",
"description": "Optional SHA-256 source hash, 64 hexadecimal characters; a hash does not authenticate its origin."
},
"load_bearing": {
"type": "boolean",
"description": "True if the target recommendation materially depends on this item."
},
"source_class": {
"type": "string",
"description": "Origin label, for example entity_reported, regulator_published, structured_field_research, operational_data or counterparty_reference. model_inferred is not source evidence and is rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Never relabel it to pass. Origin is not a claim of independence."
},
"source_grade": {
"type": "string",
"description": "Caller-supplied grade. Not a substitute for verification or source lineage."
},
"evidence_type": {
"type": "string",
"description": "What was collected, for example interview, field observation or licence record. Not merely the conclusion."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Compatibility origin label. Explicit field/public conflicts, including provenance_ledger.source_family, require reconciliation; one label cannot erase another."
},
"freshness_date": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Compatibility alias for source_date, at the same declared precision. Exact dates/timestamps may name the same analysis-calendar day; conflicting aliases require correction. No source truth is established."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"survey_payload": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
},
"description": "Existing sample_size alias; all supplied sample-size aliases must agree.",
"additionalProperties": true
},
"evidence_origin": {
"type": "string",
"description": "Declared source origin. Explicit public/documentary sources are not caller fieldwork solely because evidence_type is survey. Conflicting explicit field origins still block; never relabel to pass."
},
"is_load_bearing": {
"type": "boolean",
"description": "Compatibility alias for load_bearing."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"provenance_ledger": {
"type": "object",
"properties": {
"source_url": {
"type": "string",
"description": "Source reference only; the sandbox does not fetch or authenticate it."
},
"source_doc_id": {
"type": "string",
"description": "Opaque source-document reference, not an evidence-item ID or personal identifier."
},
"source_family": {
"type": "string",
"description": "Declared source family; distinct labels do not prove independence."
},
"source_locator": {
"type": "string",
"description": "Redacted document-specific locator, not the shared folder holding unrelated documents. Never invent a locator. Genuine shared upstream references count together."
},
"synthetic_fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source-reference fields that were generated rather than observed; these do not establish lineage."
},
"parent_source_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
}
},
"description": "Field evidence needs source_doc_id and an explicit parent_source_ids array (empty allowed). Unknown lineage stays incomplete, not invented.",
"additionalProperties": true
},
"source_date_range": {
"type": "object",
"required": [
"earliest",
"latest"
],
"properties": {
"latest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
},
"earliest": {
"type": "string",
"maxLength": 32,
"minLength": 4,
"description": "Declared source date at its actual precision: YYYY, YYYY-MM, YYYY-MM-DD, or ISO timestamp with seconds and timezone (up to 6 fractional digits). Years 0001-9999; real calendar dates only. Partial dates describe inclusive calendar bounds, never an invented day. Source truth and current applicability remain unverified."
}
},
"description": "Optional inclusive declared bounds, usable without source_date. Both endpoints must have the same precision and be ordered. Every supplied source_date/freshness_date must contain the whole range; an exact timestamp cannot be widened. Aliases must agree before narrowing. Unknown dates are not clipped to the analysis date. Bounds are declarations, not source verification.",
"additionalProperties": false
},
"stakeholder_class": {
"type": "string",
"description": "Role represented, for example guardian, customer, supplier or partner. Do not submit a person identifier."
},
"collection_context": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"source_extraction": {
"type": "object",
"required": [
"source_ref",
"fields"
],
"properties": {
"fields": {
"type": "object",
"properties": {
"sample_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"session_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Actual number of group sessions in the source records."
},
"interview_mode": {
"enum": [
"face_to_face",
"telephone",
"online",
"focus_group",
"group_interview",
"observation",
"administrative_record",
"unknown"
],
"type": "string"
},
"source_modality": {
"enum": [
"direct_observation",
"documentary",
"secondary_summary",
"unknown"
],
"type": "string"
},
"enumerator_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"source_ref": {
"type": "string",
"maxLength": 512,
"minLength": 1
}
},
"description": "Optional caller-supplied second reading of source facts for conflict comparison only. Not independently authenticated; cannot supply missing primary declarations or establish source authenticity.",
"additionalProperties": false
},
"reviewer_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collector_relationship": {
"enum": [
"independent",
"employee",
"company_staff",
"internal",
"contractor",
"partner",
"self_collected",
"unknown"
],
"type": "string"
},
"collectors_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Collectors required concurrently for each group session, drawn from enumerator_count. No default facilitator count is assumed."
},
"fieldwork_window_minutes": {
"type": "number",
"description": "Total available collection minutes per collector across the entire period, not daily or team-person-minutes.",
"exclusiveMinimum": 0
},
"participants_per_session": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Source-grounded maximum participants in any session. Sample size cannot exceed session_count times this bound; no default group size is assumed."
},
"session_duration_minutes": {
"type": "number",
"description": "Source-recorded duration of each group session in this declaration, not an alias for individual interview duration.",
"exclusiveMinimum": 0
},
"collection_administration": {
"enum": [
"collector_administered",
"self_administered",
"automated",
"unknown"
],
"type": "string",
"description": "Source-grounded administration, required for online, observation and administrative_record modes. self_administered is supported for online; automated for observation or administrative_record. Face-to-face, telephone and group modes are collector-administered and cannot opt out."
},
"interview_duration_minutes": {
"type": "number",
"description": "Collector time per individual interview or per observed/processed sample record for collector-administered non-group modes.",
"exclusiveMinimum": 0
}
},
"description": "Source-grounded collection declarations, not source authentication. Unknown facts must remain missing; do not invent values to pass. Field decision use requires source modality, collector relationship, interview mode, source-document identity and an explicit parent-source list. Collector-administered modes require staffing, duration, available minutes per collector and sample size. Group modes additionally require session_count, participants_per_session, session_duration_minutes and collectors_per_session, never inferred from an individual interview duration. Online, observation and administrative_record modes require collection_administration; self-administered online and automated observation/record sources do not need invented collector capacity. Explicit public/documentary origins are not caller fieldwork solely because evidence_type is survey; conflicting explicit field origins still block. Independent verification labels require a separate reviewer relationship; persisted review is still checked separately.",
"additionalProperties": true
},
"evidence_geography": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Declared source city."
},
"region": {
"type": "string",
"description": "Declared source region."
},
"country": {
"type": "string",
"description": "Declared source country, not the target country."
},
"district": {
"type": "string",
"pattern": "\\S",
"description": "Nonblank declared source district, not verified local coverage."
},
"districts": {
"type": "array",
"items": {
"type": "string",
"pattern": "\\S"
},
"description": "Declared source districts, each a nonblank string. An empty array is allowed. Not verified fieldwork or representative coverage."
},
"town_or_zone": {
"type": "string",
"description": "Declared source town or zone."
}
},
"additionalProperties": true
},
"upstream_source_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Disclose shared upstream sources; distinct identifiers do not prove independence."
},
"verification_status": {
"type": "string",
"description": "Caller label. verified, independently_verified, corroborated, attested, confirmed and validated count for the structural prefilter only. self_attested, unverified, missing and other labels do not. Do not change labels without actually checking the source."
}
},
"description": "A caller-declared, consented and redacted evidence item. No required fields at intake: incomplete items receive correction feedback. Explicit artifact_role, evidence_role, source_role, record_role and content_role declarations admit only original_source_record, independent_evaluation or human_attestation; other declared roles are rejected with ARTIFACT_ROLE_NOT_SOURCE_EVIDENCE. Omission remains supported for legacy items. Passing coverage never verifies truth, permission or readiness.",
"additionalProperties": true
},
"description": "Alias for evidence_pack. Supply one field, not conflicting copies."
},
"known_partners": {
"type": "array",
"items": {
"type": "string"
}
},
"relevance_check": {
"type": "boolean",
"description": "Check relevance only; no workflow."
},
"review_case_ref": {
"type": "object",
"required": [
"case_id",
"tenant_id",
"workspace_id",
"reference_secret"
],
"writeOnly": true,
"properties": {
"case_id": {
"type": "string",
"pattern": "^RC-[a-f0-9]{64}$"
},
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"reference_secret": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"writeOnly": true
}
},
"description": "Host-private, case-bound read reference. Never put its secret into prompts, URLs, logs or exports. Grants no write or action authority.",
"additionalProperties": false
},
"attestation_refs": {
"type": "array",
"items": {
"type": "object",
"required": [
"attestation_id",
"tenant_id",
"workspace_id",
"reference_secret"
],
"properties": {
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"workspace_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"attestation_id": {
"type": "string",
"pattern": "^ATT-[a-f0-9]{64}$"
},
"reference_secret": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"writeOnly": true,
"description": "256-bit random bearer secret. Keep host-private, out of URLs/logs/prompts/exports; grants shared context, not authority."
}
},
"additionalProperties": false
},
"maxItems": 3,
"writeOnly": true,
"description": "Optional: https://africanmarketos.com/v1/reviewer-attestations/contract. Requires exact subject, market_scope.country and decision_question. Host-private refs outside evidence; reattach each call. No scoring or authority."
},
"analysis_timezone": {
"type": "string",
"description": "Optional IANA timezone, for example Africa/Nairobi, for the analysis calendar. Defaults to UTC; never inferred from country or IP. Date-only values keep their declared calendar day."
},
"decision_question": {
"type": "string",
"maxLength": 2000,
"description": "Exact recorded attestation question; question must agree when supplied."
},
"evidence_available": {
"type": "array",
"items": {
"type": "string"
},
"description": "Short optional context labels, not proof. For supplied document summaries use incomplete evidence_pack items instead; do not mark claims verified merely because a document exists."
},
"context_freshness_window_days": {
"type": "integer",
"minimum": 1,
"description": "Optional caller-declared maximum evidence age in days. No universal freshness cutoff is invented when absent; age alone does not prove validity."
}
},
"additionalProperties": true
}