Documentation Index
Fetch the complete documentation index at: https://docs.manthan.systems/llms.txt
Use this file to discover all available pages before exploring further.
What is signal provenance?
Signal provenance is optional metadata attached to governed signals that records where a signal value came from, how it was obtained, and how trustworthy the source is. Provenance answers the question an attestation cannot: “The decision was made deterministically from these signals — but where did the signals come from?” Provenance does not affect policy evaluation. Policy rules evaluate signal values only. Provenance is adjacent metadata — it rides alongside signals for audit and compliance purposes but never enters the deterministic evaluation boundary.The GovernedSignal type
GovernedSignal wraps a raw signal value with optional provenance. When no provenance is attached, the signal is treated identically to a plain value — there is no breaking change.
SignalProvenance fields
SourceType values
TrustLevel values
TrustLevel type exported from @parmanasystems/core is a simplified three-level version ("low", "medium", "high") for application-layer use. ProvenanceTrustLevel is used internally by SignalProvenance.
withProvenance() usage
Wrap a signal value with provenance before passing it toexecuteFromSignals:
extractSignalValues() — the determinism boundary
extractSignalValues strips provenance and returns plain Record<string, unknown>:
execution_fingerprint values.
Provenance is for audit lineage. It never influences the deterministic outcome.
validateProvenance() — trust checking
Before executing, you can validate provenance trust levels and source requirements:validateProvenance performs deterministic local evaluation only. It does not make network calls, fetch remote certificates, or validate real-world truth.
Three adapter helpers
The three most common signal sources in the Indian financial stack have ready-made helpers:accountAggregatorProvenance()
For signals sourced from the RBI Account Aggregator framework:documentProvenance()
For signals extracted by an AI or OCR pipeline from a document:voiceTranscriptProvenance()
For signals extracted from a voice call transcript:Complete example: Account Aggregator income verification
A common pattern in Indian lending — using Account Aggregator data for income verification before a governed loan decision:Why provenance is optional
Provenance is optional by design. Existing code that passes plain signals without provenance continues to work unchanged. There is no breaking change, no forced migration, and no runtime cost when provenance is absent. Adding provenance is an incremental improvement — you can start with unverified signals and progressively add provenance metadata as your integrations mature.Why provenance never enters policy evaluation
Policy evaluation is deterministic. Theexecution_fingerprint is the SHA-256 of { policyId, policyVersion, signals } — not of the provenance. Two executions with identical signal values but different provenance records produce identical decisions, identical fingerprints, and identical attestations.
This is intentional. Provenance is about lineage and audit, not about governance outcomes. If provenance were allowed to influence decisions, the determinism guarantee would be broken — the same business inputs could produce different decisions depending on metadata that changes with each API call.
If you want provenance characteristics to influence governance decisions (e.g. “only accept signals from verified sources”), express them explicitly as signals:
income_source_verified: true only when the AA data is cryptographically verified, and your policy rules use it accordingly.
The execution gap it closes
AnExecutionAttestation proves a governance decision was made correctly. It does not prove that the signals were accurate.
Signal provenance closes part of this gap by providing a traceable record of where each signal came from:
| Without provenance | With provenance |
|---|---|
| ”We decided based on signals" | "We decided based on signals that came from source X, fetched at time T, with evidence hash H” |
| Auditor must trust the caller | Auditor can trace signals to the source system |
| No evidence of data freshness | sourceTimestamp proves data age |
| No lineage of transformations | transformationLineage records each step |
Use Cases
Account Aggregator income verification for personal loans
An NBFC fetches bank statement data via the RBI Account Aggregator framework. The raw FI data is hashed before transformation, the derivedmonthly_income is wrapped with accountAggregatorProvenance, and validateProvenance confirms that all signals meet minimumTrustLevel: "verified" before executeFromSignals runs. The resulting attestation — combined with the provenance metadata — gives the auditor a complete chain: AA consent → raw data hash → derived income signal → governed decision.
AI-extracted signals from bank statements
A loan processor uses Claude to extractmonthly_income and emi_obligations from uploaded bank statement PDFs. Each extracted signal is wrapped with documentProvenance({ modelName: "claude-3-5-sonnet", modelVersion: "20241022", rawDocument: pdfBytes, confidence: 0.95 }). The trust level is "claimed" — the AI extraction is not automatically trusted. The NBFC then validates these signals against Account Aggregator data before execution, or expresses the verification status explicitly in the signal: income_source_verified: true.
Voice KYC for rural lending
A microfinance institution conducts video KYC for rural borrowers via voice call. The call is transcribed by Sarvam-1 and signals are extracted. Each signal is wrapped withvoiceTranscriptProvenance({ callId, sttModel: "sarvam-1", language: "hi-IN", extractedAt, confidence: 0.87 }). The trust level is "claimed". The compliance team can trace every signal back to the specific call recording via the evidenceHash — without embedding the full transcript in the attestation.
Progressive trust adoption
An NBFC starts with plain signals and no provenance. Over time it addsaccountAggregatorProvenance to income signals, then documentProvenance to document-extracted signals. Because provenance is optional and extractSignalValues handles both plain values and GovernedSignal wrappers, there is no breaking change and no flag day — each integration is added incrementally.
See also
- Signal Types — typed signal values that provenance wraps
- The Execution Gap — what provenance closes and what remains open
- Governed Signals — the boundary between AI inference and governance
- API Reference —
extractSignalValues,validateProvenance, adapter functions