# DataPulse > DataPulse — an open, read-only verification layer for Malaysian public data, publishing per-dataset freshness, licence, structure and signed-observation evidence for AI agents, analysts and auditors. It publishes a machine-readable manifest of 440 official datasets. Each manifest entry retains its human-readable `steward` and stable `custodian` publisher ID. Health anomaly fields explain freshness-delta outliers without adding statuses. ## Model Context Protocol (MCP) DataPulse exposes a **read-only MCP server** so AI agents (Claude Desktop, Cursor, Cline, etc.) can query the 440-dataset catalogue natively. - **MCP endpoint:** https://mcp.data-pulse.my/mcp - **Transport:** Streamable HTTP (POST-only, single endpoint) - **Auth:** none required (all advertised tools are read-only) - **Source:** reads the same `datapulse.json` + `health/latest.json` + `health/trends.json` + `health/drift.json` + `health/reconciliation.json` served from this repository; no separate API ### Agent discovery endpoints For AI agents that look up canonical discovery paths before fetching: - [LLM index](https://www.data-pulse.my/llms.txt) - [Agent manifest](https://www.data-pulse.my/agent.json) - [MCP advertisement](https://www.data-pulse.my/mcp.json) - [Sitemap](https://www.data-pulse.my/sitemap.xml) - [MCP endpoint](https://mcp.data-pulse.my/mcp) > Note on path: we use the root (`/llms.txt`, `/agent.json`, `/mcp.json`) > rather than `/.well-known/...` because (a) the llmstxt.org spec and the > proposed MCP-discovery convention both use the root, (b) RFC 8615 reserves > `/.well-known/` for IETF-mandated endpoints (security.txt, etc.), and > (c) the Cloudflare Pages artifact explicitly includes the required > `/.well-known/` assets, so discovery paths are served deliberately rather > than relying on a host default. ### Tools | Tool | Use when | |---|---| | `search_datasets(query, licence?, source?, limit?)` | Use for discovery only: find DataPulse's 440 Malaysian public datasets by topic, source, or licence—for example, 'Malaysian public data inflation', licence and attribution, or a government dataset source. Returns ranked matches with id, title, source, licence, published status, and score. This is not trust verification: a status is published pipeline context, not proof that a dataset is current or reliable. For pre-trust use search_datasets → verify_dataset → get_provenance. Use it to discover candidates; do not use it for a trust decision—use verify_dataset instead. It reads published catalogue data, so no match means the published catalogue has no matching entry; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `get_dataset(dataset_id)` | Return full detail for one dataset id, including its latest health status and last-verified timestamp, content_freshness_date, and freshness_signal_source (last_modified, content_parse, or none). Use to fetch the provenance/citation metadata for a dataset found via search_datasets and distinguish unknown-freshness from proven stale data. Use it for one dataset's current published detail; do not use it for citation context or a Passport—use get_provenance or get_data_passport instead. It reads published data, so an absent health row is reported as unknown rather than probed live; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `get_data_passport(dataset_id)` | Return one bounded, machine-readable Dataset Passport v1 for a canonical dataset ID. It reads the published Passport artifact only; it does not fetch an upstream source or create evidence. The Passport describes observed metadata and evidence availability, not semantic truth, completeness, certification, legal permission, safety, or AI admission. Use it for the bounded Passport artifact; do not use it for current health detail or citation context—use get_dataset or get_provenance instead. It reads precomputed published data, and evidence_available=false identifies an unavailable or unsupported Passport; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `find_stale(max_age_hours?)` | Return datasets whose status is aging, stale, or degraded, plus datasets missing from the latest health snapshot. Use when an agent needs to know which data has a freshness or schema-validity risk. Use it to enumerate freshness or schema-risk candidates; do not use it for anomalies, trends, reliability, or drift—use find_anomalies, find_deteriorating, find_unreliable, or find_schema_drift instead. It reads the published health snapshot, so an empty result means no rows met this snapshot-based rule; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `find_anomalies(limit?, mode?, min_reliability?)` | Return datasets flagged by the latest published anomaly detection (anomalies), ranked by how far the observed update interval exceeds its threshold. Optionally require a minimum publish-reliability grade; includes pipeline-computed anomaly and reliability evidence so agents do not recompute it. Use it for unusual update intervals; do not use it for worsening freshness, recovery, reliability grades, or structural drift—use find_deteriorating, find_recovering, find_unreliable, or find_schema_drift instead. It reads precomputed anomaly data, so an empty result means no published row survives the selected filters; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `find_deteriorating(limit?, min_anomaly_rate?)` | Return datasets whose published freshness trend is deteriorating, ranked by staleness slope. Optionally require a minimum historical anomaly rate; includes pipeline-computed trend and reliability evidence so agents do not recompute it. Use it for worsening freshness trends; do not use it for anomalies, recovery, reliability grades, or structural drift—use find_anomalies, find_recovering, find_unreliable, or find_schema_drift instead. It reads precomputed trend data, so an empty result means no published deteriorating row survives the selected filters; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `find_recovering(limit?)` | Return datasets whose published freshness trend is recovering, with the fastest staleness reductions first. Includes pipeline-computed trend and publish-reliability evidence. Use it for improving freshness trends; do not use it for deterioration, anomalies, reliability grades, or structural drift—use find_deteriorating, find_anomalies, find_unreliable, or find_schema_drift instead. It reads precomputed trend data, so an empty result means no published recovering row exists; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `find_unreliable(limit?, at_or_below_grade?)` | Return datasets whose evaluated publish-reliability grade is at or below a threshold (the unreliable ones), with the worst grades and lowest on-time percentages first. Reliability measures timeliness of successful freshness observations, not uptime; sample days are included so agents can judge evidence depth. Use it for timeliness reliability grades; do not use it for individual anomalies, trends, or structural drift—use find_anomalies, find_deteriorating, find_recovering, or find_schema_drift instead. It reads precomputed reliability data, so an empty result means no published grade meets the threshold; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `find_schema_drift(limit?, min_change_count?)` | Return datasets with published structural or record-count drift evidence, ranked with structural changes first. Optionally require a minimum number of structural transitions; includes pipeline-computed evidence so agents do not infer drift from freshness alone. Use it for structural or record-count changes; do not use it for freshness risk, anomalies, trends, or reliability—use find_stale, find_anomalies, find_deteriorating, or find_unreliable instead. It reads precomputed drift data, so an empty result means no published drift row survives the selected filters; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `check_reconciliation(dataset_name)` | Return the published cross-source reconciliation group for a dataset name or id, including per-member counts, dates, statuses, tolerances, and contextual deltas. A discrepancy requires human review and does not prove either source is wrong. Use it to compare a dataset with its published cross-source group; do not use it for provenance or evidence receipts—use get_provenance or get_evidence instead. It reads precomputed reconciliation data, and single_source means no group contains the resolved dataset; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `get_provenance(dataset_ids[])` | Use when asked 'can I cite this source?', for licence and attribution, or for citation-ready provenance. Returns source, steward, licence/attribution context, canonical URL, and compact published evidence context: probe time, transport, access dependency, freshness signal, schema drift / record-count drift context, anomaly flag, and status. Bind a citation to dataset identity, source/evidence URL, observed-at or last-checked time, DataPulse status/verdict, licence/attribution, and a receipt/evidence digest when available. You may cite the returned provenance and describe its published evidence; it is not a freshness guarantee and does not itself verify the source is current. For pre-trust use search_datasets → verify_dataset → get_provenance. Use it for citation-ready provenance; do not use it for full evidence or a live comparison—use get_evidence or verify_evidence instead. It reads published evidence context, so absent fields mean the pipeline did not publish that value; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `get_evidence(dataset_id)` | Use for a deep evidence audit or to inspect a provenance and evidence receipt. Returns the complete published evidence receipt for one dataset: probe time, transport, access dependency, freshness, schema drift / record-count drift, tolerance, status, anomaly fields, and receipt/evidence references. It reads published pipeline evidence, not a live source fetch: you may report what the pipeline observed, but must not infer the source is currently reachable or semantically true. Use it for a deep audit before or alongside verification. search_datasets → get_evidence → verify_evidence → verify_attestation. Use it for a complete published receipt; do not use it for a live transport check or signature verification—use verify_evidence or verify_attestation instead. It reads precomputed evidence, so evidence_available=false means no published health row; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `verify_dataset(dataset_id, include_proof_steps?)` | This is the preferred single-call pre-trust check for 'is this dataset current?', stale, unknown-freshness, degraded, or browser-dependent questions, and whenever an agent must verify before relying on data. Returns dataset metadata, published evidence and fail-closed signed receipt verification with artifact references. It verifies published artifacts, not a live source check: you may infer whether their receipt verifies, but must not infer current upstream availability or semantic truth. Use search_datasets → verify_dataset → get_provenance. Use it for one published pre-trust check; do not use it for a live transport comparison or attestation-chain verification—use verify_evidence or verify_attestation instead. It verifies precomputed published artifacts, so a failed check does not identify current upstream availability; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `get_freshness_summary()` | Return a freshness-at-a-glance summary of the published catalogue: fresh, aging, stale, and reference counts plus the latest health check time. Use it for catalogue-level freshness context; do not use it to enumerate affected datasets—use find_stale instead. It reads the latest published snapshot, so missing counts or check time mean the artifact omitted them; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `verify_evidence(dataset_id)` | Use when a fresh, rate-limited live-vs-published comparison is needed for a direct-access dataset, for example after asking whether a government dataset is reachable now. Performs a rate-limited live GET and returns comparable transport receipts plus a match, mismatch, unreachable, or not_verifiable verdict. This live check is an observation, not semantic truth: it does not recompute content dates, record counts, or shape fingerprints. Results are ephemeral and do not update published health artifacts. For a deep audit use search_datasets → get_evidence → verify_evidence → verify_attestation. Use it for a live transport comparison; do not use it for published receipt integrity or signed-attestation verification—use verify_dataset or verify_attestation instead. An unreachable or not_verifiable verdict reports that this live comparison could not establish a match, while cached results are still ephemeral; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `trust_verdict(dataset_id)` | Return published attestation facts, the unsigned methodology-versioned trust score, numeric components, and component_availability reasons, plus existing health/trend/drift/reconciliation evidence for one canonical dataset id, e.g. 'fuelprice'. This tool does not re-probe or verify the signature; call verify_attestation separately. Use it to assemble the published trust view; do not use it for receipt verification, live comparison, or signature verification—use verify_dataset, verify_evidence, or verify_attestation instead. It reads precomputed artifacts, so missing component availability explains omitted evidence rather than a live probe; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `verify_attestation(reference, replay_chain?)` | Use to verify a signed published probe attestation after an evidence audit. Returns L1 signature, key, time, and chain-link checks; optional L2 replay of daily heads to a Git-tag anchor; and L3 scope, which requires verify_evidence for live transport. A valid signature proves attestation integrity and scope, not upstream semantic truth or currentness. For a deep audit use search_datasets → get_evidence → verify_evidence → verify_attestation. Use it for signed-attestation integrity; do not use it for published receipt verification, a live transport comparison, or an aggregate verdict—use verify_dataset, verify_evidence, or trust_verdict instead. L2 is not run unless replay_chain is set, and a failed level reports an unsatisfied check rather than upstream semantic truth; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `find_by_licence(licence)` | Return all datasets with the given licence, summarised. Use to enumerate what's available under a specific licence for compliance/reuse scoping. Use it to enumerate one licence; do not use it to discover by topic or inspect a dataset's citation context—use search_datasets or get_provenance instead. It reads published manifest data, so an empty list means no published dataset has the resolved licence; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | | `usage_summary(since, until)` | Aggregate anonymous tool usage for an inclusive ISO date range, e.g. 2026-08-01 to 2026-08-07. Returns `total_calls`, `by_outcome`, `by_tool`, `by_dataset`, `trust_verdict_calls` (the count of trust_verdict records regardless of outcome or result shape), and `trust_distribution` (counts of returned trust verdicts by published score band: 90-100, 75-89, 50-74, 25-49, 0-24) for the inclusive range. Use it for aggregate tool activity; do not use it to find data-quality risks—use find_stale, find_anomalies, find_deteriorating, find_recovering, find_unreliable, or find_schema_drift instead. It reads persisted usage records, so zero totals mean no retained records in that range; DataPulse is read-only, requires no API key, and the edge limits clients to roughly one request per second with a small burst, so pace or retry. | ### Verify before trust Call `verify_dataset(dataset_id)` for the one-call trust path: it returns the dataset metadata, published health and evidence rows, per-dataset Sigstore receipt verification result, artifact references, and an independent verification hint. For an offline verification with another Sigstore client, use: ```bash cosign verify-blob-attestation --bundle https://www.data-pulse.my/signatures/health.latest.sigstore.json --certificate-identity https://github.com/r3dz4r/datapulse-my/.github/workflows/deploy-cloudflare-pages.yml@refs/heads/main --certificate-oidc-issuer https://token.actions.githubusercontent.com --type https://www.data-pulse.my/predicates/health-snapshot/v1 https://www.data-pulse.my/health/latest.json ``` Freshness at a glance: call `get_freshness_summary()` for fresh, aging, stale, and reference counts plus the latest health `checked_at` time. ### Resources (read-only context) - `datapulse://index` — lightweight list of every manifest dataset with namespace (read first) - `datapulse://anomalies` — anomaly summary with pipeline-computed evidence - `datapulse://trends` — published freshness trends and publish reliability - `datapulse://reliability` — publish-reliability grade counts (timeliness, not uptime). - `datapulse://drift` — published structural and record-count drift evidence - `datapulse://reconciliation` — published cross-source reconciliation evidence; differences are not proof either source is wrong - `datapulse://licences` — licence summary (grouped live from the manifest) - `datapulse://{dataset_id}` — full manifest entry for one dataset (on-demand) ## Cite a Malaysian dataset the auditable way Run the four-call recipe before citing any Malaysian public dataset, then attach the citation block. Every call is read-only: 1. `search_datasets(query, licence?, source?, limit?)` — find the candidate dataset. 2. `get_dataset(dataset_id)` — inspect metadata and current health. 3. `verify_dataset(dataset_id, include_proof_steps?)` — fail-closed Sigstore receipt check with artifact references. 4. `get_provenance([dataset_id])` — emit citation-ready provenance and the evidence receipt. Refusal rule: call `trust_verdict(dataset_id)`; if the verdict is `WARN` or `STOP`, do not cite without a human-readable reason, and never omit the verdict from the citation block. Offline verification anchor (works when the MCP endpoint is unreachable): ```bash cosign verify-blob-attestation --bundle https://www.data-pulse.my/signatures/health.latest.sigstore.json --certificate-identity https://github.com/r3dz4r/datapulse-my/.github/workflows/deploy-cloudflare-pages.yml@refs/heads/main --certificate-oidc-issuer https://token.actions.githubusercontent.com --type https://www.data-pulse.my/predicates/health-snapshot/v1 https://www.data-pulse.my/health/latest.json ``` Citation block (`datapulse/v1/citation`): | Field | Source | |---|---| | `dataset_id` | caller's chosen identifier from step 1 | | `evidence_url` | `https://www.data-pulse.my/data/.md` | | `observed_at` | from step 4 result | | `source_url` | canonical upstream URL from manifest | | `status` | from `health/latest.json` | | `methodology_version` | from `health/latest.json` | | `licence` | from manifest | | `fingerprint` | `shape-v1:sha256` from `health/latest.json` | | `datapulse_verdict` | one of `USE`, `WARN`, `REFERENCE-USE`, `STOP` (from the refusal rule) | | `limitations` | free-text string; never empty | See [Four-call recipe](docs/agent-workflow-malaysia-public-data.md) for the bounded workflow, refusal rule, and citation-block schema. ### Connect from Claude Desktop ```json { "mcpServers": { "datapulse-my": { "type": "http", "url": "https://mcp.data-pulse.my/mcp" } } } ``` ### GTFS-aware discovery The `transport` namespace contains 16 static schedule ZIPs and 14 realtime vehicle-position protobuf feeds. Use `search_datasets("ktmb")` or another operator or place name to discover feeds, then `get_dataset(dataset_id)` for static calendar freshness and route/stop/trip counts or realtime vehicle counts and feed timestamps. The `datapulse://index` resource exposes each dataset's namespace for lightweight transport filtering. The public endpoint is live at `https://mcp.data-pulse.my/mcp` and serves all 19 read-only tools over the 440-dataset catalogue. `trust_verdict` joins published signed facts and unsigned score rows; `verify_attestation` performs L1 signature/key checks and optional L2 tag-anchor replay. Deployment and service details for `datapulse-mcp` are in [`mcp-deploy.md`](https://www.data-pulse.my/mcp-deploy.md). ## Datasets - [Malaysian Fuel Prices](https://www.data-pulse.my/data/fuelprice.md): Open Government Licence (Malaysia); weekly. - [ePerolehan Tender Notices (DIIKLANKAN)](https://www.data-pulse.my/data/eperolehan-diklankan.md): Open Government Licence (Malaysia); hourly. - [PriceCatcher (Grocery Prices)](https://www.data-pulse.my/data/pricecatcher.md): Open Government Licence (Malaysia); monthly. - [BNM Daily Exchange Rates (0900)](https://www.data-pulse.my/data/exchangerates_daily_0900.md): Open Government Licence (Malaysia); daily (weekdays, 0900 MYT). - [BNM Daily Exchange Rates (1130)](https://www.data-pulse.my/data/exchangerates_daily_1130.md): Open Government Licence (Malaysia); daily (weekdays, 1130 MYT). - [BNM Daily Exchange Rates (1200)](https://www.data-pulse.my/data/exchangerates_daily_1200.md): Open Government Licence (Malaysia); daily (weekdays, 1200 MYT). - [BNM Daily Exchange Rates (1700)](https://www.data-pulse.my/data/exchangerates_daily_1700.md): Open Government Licence (Malaysia); daily (weekdays, 1700 MYT). - [MET Malaysia Weather Forecast](https://www.data-pulse.my/data/met_weather.md): Open Government Licence (Malaysia); daily. - [DOE APIMS Air Quality (Hourly API)](https://www.data-pulse.my/data/doe_apims.md): Open Government Licence (Malaysia); hourly. - [DOE RQIMS River Water Quality (Continuous)](https://www.data-pulse.my/data/doe_rqims.md): Open Government Licence (Malaysia); hourly. - [DOE MQIMS Marine Water Quality (Manual)](https://www.data-pulse.my/data/doe_mqims.md): Open Government Licence (Malaysia); monthly. - [KKM iDengue Weekly Dengue Cases](https://www.data-pulse.my/data/kkm_idengue.md): Open Government Licence (Malaysia); daily. - [OpenDOSM Crime by District & Type (Annual)](https://www.data-pulse.my/data/dosm_crime_district.md): Creative Commons Attribution 4.0; annual. - [OpenDOSM Monthly CPI by State & Division](https://www.data-pulse.my/data/dosm_cpi_state.md): Creative Commons Attribution 4.0; monthly. - [OpenDOSM Annual Real GDP by State & Sector](https://www.data-pulse.my/data/dosm_gdp_state_real_supply.md): Creative Commons Attribution 4.0; annual. ## Current public artifacts - [Live dashboard](https://www.data-pulse.my/): Human-readable dataset status cards with embedded health and manifest data. - [Health methodology](https://www.data-pulse.my/health-methodology.html): Published status and freshness methodology. - [Data collection and privacy](https://www.data-pulse.my/privacy.html): Published disclosure of public-lane data collection and privacy boundaries. - [Learn](https://www.data-pulse.my/learn.html): Practical verification-first guidance for building with Malaysian public data. - [OKF v0.2 bundle](https://www.data-pulse.my/okf/): Agent-consumable dataset concepts with provenance, trust, and freshness signals. - [Documentation map](https://www.data-pulse.my/documentation-map.md): Canonical guide to DataPulse documentation and how to navigate it. - [Source-of-truth map](https://www.data-pulse.my/source-of-truth-map.md): Authority boundaries for DataPulse facts, configuration, and generated outputs. - [Glossary](https://www.data-pulse.my/glossary.md): Defined DataPulse terms and identifiers. - [Trust contract](https://www.data-pulse.my/trust-contract.md): Public contract for using and interpreting published evidence. - [Status semantics](https://www.data-pulse.my/status-semantics.md): Meaning and handling guidance for published dataset statuses. - [Evidence receipt specification](https://www.data-pulse.my/evidence-receipt-spec.md): Structure and interpretation of dataset evidence receipts. - [Agent workflows](https://www.data-pulse.my/agent-workflows.md): Reusable agent workflows for discovery and evidence checks. - [Malaysia public-data workflow](https://www.data-pulse.my/agent-workflow-malaysia-public-data.md): Canonical four-call workflow for bounded discovery, verification, and citation. - [Dataset lifecycle](https://www.data-pulse.my/dataset-lifecycle.md): Dataset state transitions and maintenance lifecycle. - [Incident response](https://www.data-pulse.my/incident-response.md): Procedures for investigating public-data incidents. - [Reproducibility](https://www.data-pulse.my/reproducibility.md): Steps and boundaries for reproducing published artifacts. - [Enterprise governance](https://www.data-pulse.my/enterprise-governance.md): Governance guidance for organizational DataPulse use. - [Integration patterns](https://www.data-pulse.my/integration-patterns.md): Reference patterns for consuming DataPulse public surfaces. - [ARD catalog](https://www.data-pulse.my/ai-catalog.json): Canonical AI Resource Directory catalog for the public MCP tool surface. - [LLM index](https://www.data-pulse.my/llms.txt): Machine-readable discovery index for agents. - [Dataset manifest](https://www.data-pulse.my/datapulse.json): Full machine-readable dataset manifest. - [Public summary](https://www.data-pulse.my/datapulse_summary.json): Compact rolled-up health and capability facts for downstream consumers. - [Manifest JSON Schema](https://www.data-pulse.my/datapulse.schema.json): Machine-readable schema for the dataset manifest. - [Latest health snapshot](https://www.data-pulse.my/health/latest.json): Current published dataset health evidence. - [Published trends](https://www.data-pulse.my/health/trends.json): Per-dataset freshness trend and reliability evidence. - [Published drift](https://www.data-pulse.my/health/drift.json): Published structural and record-count drift evidence. - [Published reconciliation](https://www.data-pulse.my/health/reconciliation.json): Cross-source publication differences for human review. - [RSS feed](https://www.data-pulse.my/feed.xml): Dataset health changes with status-tagged entries. - [Changelog](https://www.data-pulse.my/changelog.json): Machine-readable release-by-release summary. - [Agent manifest](https://www.data-pulse.my/agent.json): Machine-readable agent capability manifest. - [MCP advertisement](https://www.data-pulse.my/mcp.json): Machine-readable MCP server advertisement. - [JSON-LD catalog](https://www.data-pulse.my/data/jsonld/catalog.json): Schema.org JSON-LD dataset catalog. - [Observation receipt chain head](https://www.data-pulse.my/observation-receipts/chain_head.json): Signed head pointer for the host-signed observation receipt chain. - [Status badges](https://www.data-pulse.my/badges/): Per-dataset SVG health badges. - [DataPulse in one page](https://www.data-pulse.my/one-pager.md): Canonical product description, boundaries, and verification path. - [Verify a DataPulse claim](https://www.data-pulse.my/verify.md): Independent verification instructions for published DataPulse evidence. - [Quickstart](https://www.data-pulse.my/quickstart.md): Five-minute MCP setup and verification-first workflow for builders. - [Verify DataPulse externally](https://www.data-pulse.my/verify-datapulse-externally.md): Standalone public-HTTPS verification guide for DataPulse evidence. ## Trust posture DataPulse distinguishes between: - HTTP reachability (URL returns any response) - Browser-required access (Camofox needed to render the page) - Schema validity (record count within expected tolerance) - Freshness (Last-Modified header or parsed content date within declared cadence) - Discontinued data (`discontinued`) when the source has stopped publishing and the data is frozen at its last known content date; this is a publisher decision, not a freshness failure - Unknown freshness (`unknown-freshness`) when HTTP and content shape pass but neither freshness signal is available - Reference data (`reference`) when a versioned lookup table is reachable and countable but date-based freshness does not apply A time-series dataset is marked `fresh` only when the applicable direct-access, schema, and freshness signals pass. See `health/latest.json` `_trust_summary` for the current distribution and the count of signals that could not be extracted.