{
  "schema_version": 1,
  "collection": "findings",
  "generated_at": "2026-09-25",
  "source": "https://gxplex.com",
  "notice": "Reports the published status of regulatory documents. No advice or interpretation.",
  "source_terms": "This site compiles publicly available regulatory information. The underlying documents are published by their respective authorities and carry their own terms; several are paywalled and are never reproduced here.",
  "rights": {
    "statement": "Carried in `source_terms` on this envelope. It is the whole of what this record states on the subject.",
    "per_row_field": "licence_class",
    "per_row_field_served_at": "https://gxplex.com/api/v1/instruments.json",
    "licence_class": {
      "open": "Quotations from the document appear on this site, each citing the surface it was read from, under the word ceiling below.",
      "restricted": "No text from the document appears on this site. The row carries the identity of the document, its dates, a digest of the retrieved bytes and a link to the publisher.",
      "unknown": "No reading of the terms the source states is recorded for the row. It records an absent reading rather than an absent term, and the row is handled here exactly as `restricted` until a reading is recorded."
    },
    "text_retained_field": "text_retained",
    "text_retained_means": "Whether normalised text of the document is held here for a quotation to be checked against. Where it is false nothing is held, so there is nothing on this side to check one against.",
    "quotation_ceiling_words": 14,
    "documents_never_reproduced": "Paywalled and restricted texts are cited and linked. They are never excerpted here and never diffed here."
  },
  "schema": "https://gxplex.com/api/v1/schema/findings.json",
  "rights_fields": null,
  "rights_fields_absent": "A finding names a set of entries rather than one, so it has no single terms position. The position of each entry involved is on https://gxplex.com/api/v1/instruments.json, keyed by the ids in `instruments_involved`. No publisher text appears in a finding.",
  "count": 27,
  "items": [
    {
      "id": "ai-agent-blocks",
      "finding_type": "crawlability",
      "headline": "0 source(s) return HTTP 200 to a browser and a non-200 to an AI-agent user-agent",
      "value": "0",
      "method": "Count of sources where the browser user-agent received HTTP 200 and the AI-agent user-agent did not, on the same URL, seconds apart. This archive sent an agent request to 0 of 132 probed sources: it no longer requests a host as an agent that host's robots.txt refuses, so an observed refusal can only come from a host that permits the agent and then declines it.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "ai-agent-declared-exclusions",
      "finding_type": "crawlability",
      "headline": "8 source(s) name an AI agent in robots.txt and disallow it from the whole site",
      "value": "8",
      "method": "Count of sources whose robots.txt carries a group naming an AI agent with `Disallow: /`. Read from the publisher's own file, identifying as this archive. No request is sent to a host that refuses the agent by name.",
      "computed_at": "2026-09-25",
      "instruments_involved": [
        "astm-e2363",
        "astm-e2500",
        "ieee-7000",
        "ispe-gamp-ai",
        "ispe-gamp5-2e",
        "ispe-pharma-4-0",
        "who-ai-health",
        "who-computerised-systems"
      ],
      "superseded_by": null
    },
    {
      "id": "api-sources",
      "finding_type": "archive",
      "headline": "11 of 11 declared API sources observed",
      "value": "11",
      "method": "Count of declared API sources with at least one observation recorded. A source requiring a credential that is not configured is recorded as unobserved on every run rather than omitted, so the gap is visible in the series instead of resembling an empty result.",
      "computed_at": "2026-09-25",
      "instruments_involved": [
        "openfda-drug-enforcement",
        "openfda-device-enforcement",
        "openfda-device-recall",
        "federal-register-ai",
        "federal-register-part11",
        "eurlex-ai-act-metadata",
        "regulations-gov-comments",
        "eudragmdp-noncompliance",
        "fda-warning-letters",
        "nando-notified-bodies",
        "eu-ai-act-sandboxes"
      ],
      "superseded_by": null
    },
    {
      "id": "browser-blocked",
      "finding_type": "crawlability",
      "headline": "0 source(s) return HTTP 200 to an AI-agent user-agent and a non-200 to a browser",
      "value": "0",
      "method": "The inverse of the preceding finding, recorded from the same two probes, and bounded the same way: an agent request was sent to 0 of 132 probed sources.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "change-pipeline",
      "finding_type": "archive",
      "headline": "56 of 74 recorded candidate(s) resolved by rule, 18 with no verdict recorded, 0 confirmed by analysis, 0 confirmed by a person",
      "value": "74",
      "method": "Every change candidate staged or ruled on here, by stage. A candidate's LATEST verdict decides its stage: one carries a person's confirmation, a chair-ordered withdrawal, a discard and a machine decline, and counting receipts would publish a person-confirmed item this record no longer holds. Rule classes come from the receipts' own words, so the vocabulary is the store's, not a list held here.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "committee-scope-quoted",
      "finding_type": "committee",
      "headline": "3 of 6 recorded committees have a scope quoted from their charter",
      "value": "3",
      "method": "Count of body records carrying a non-empty scope. Scope must be the charter's own words; a charter that cannot be retrieved yields no scope rather than a paraphrase.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "crawlability",
      "finding_type": "crawlability",
      "headline": "84 of the 132 sources probed for crawlability return the document to a standard HTTP client (132 instruments are tracked in total)",
      "value": "84",
      "method": "Each source URL is requested twice: once with a desktop browser user-agent and once with an AI-agent user-agent. `yes` means at least one request returned HTTP 200 with 600 or more characters of extractable text. No judgment about the publisher is expressed or implied.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "days-in-status",
      "finding_type": "corpus",
      "headline": "Longest interval between a recorded status date and today: us-21-cfr-part-11, 10,628 days",
      "value": "10628",
      "method": "For each verified instrument, the number of days from the date the SOURCE states for its status to today. This measures the age of the regulatory fact, NOT how long this archive has observed it — the observation series is far younger and its length is reported separately. No weighting is applied.",
      "computed_at": "2026-09-25",
      "instruments_involved": [
        "astm-e2363",
        "astm-e2500",
        "ema-ai-reflection",
        "ema-data-quality-framework",
        "eu-digital-omnibus-ai",
        "eu-ivdr",
        "eu-mdr",
        "health-canada-ml",
        "ich-e6r3",
        "nist-csf",
        "us-21-cfr-part-11"
      ],
      "superseded_by": null
    },
    {
      "id": "front-door",
      "finding_type": "archive",
      "headline": "1 tracked document(s) changed, 4 of 152 observed record(s) not retrieved, 18 of 74 recorded candidate(s) with no verdict recorded",
      "value": "1",
      "method": "The figures in the nightly sentence, re-derived here from the stores rather than read from the page. `changed` counts tracked rows whose DOCUMENT-class observation changed on the run's day carrying no decline receipt for it. `not_retrieved` counts records dated that night whose own error field is non-empty, the population the watcher prints. `pending_review` counts queue candidates with no…",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "front-line",
      "finding_type": "coverage",
      "headline": "3 of 74 recorded candidate(s) are offered as a change",
      "value": "3",
      "method": "Counted from state/triple-projection.json, which derives the three limbs for every file in state/revision-staging/. `offered` is every derivation agreeing; `waiting` is a limb that has not been measured yet; `withheld` is the remainder, each carrying its own reason.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "instruments-per-committee",
      "finding_type": "committee",
      "headline": "13 of 132 tracked instruments name a producing committee",
      "value": "13",
      "method": "Count of distinct instrument ids appearing in the produces list of any body record, intersected with the tracked corpus. Counting only: a committee producing more tracked instruments is the count says how many instruments a committee produced and nothing further about the committee.",
      "computed_at": "2026-09-25",
      "instruments_involved": [
        "iso-iec-22989",
        "iso-iec-23894",
        "iso-iec-24028",
        "iso-iec-38507",
        "iso-iec-42001",
        "iso-iec-42005",
        "iso-iec-5259",
        "iso-iec-sc42-programme",
        "pics-pi041",
        "pren-18229-1",
        "pren-18229-2",
        "pren-18281"
      ],
      "superseded_by": null
    },
    {
      "id": "instruments-without-committee",
      "finding_type": "committee",
      "headline": "119 tracked instruments name no producing committee",
      "value": "119",
      "method": "Count of tracked instruments not appearing in any body produces list. States a gap in this archive's committee coverage; it is not evidence that no committee produced the document.",
      "computed_at": "2026-09-25",
      "instruments_involved": [
        "anvisa-ai",
        "astm-e2363",
        "astm-e2500",
        "astm-e2537",
        "cen-jtc21-programme",
        "cisa-cpg",
        "ema-ai-reflection",
        "ema-annex11-concept-paper",
        "ema-ct-computerised-systems",
        "ema-data-quality-framework",
        "ema-pics-annex15-concept",
        "ema-pics-data-integrity-concept"
      ],
      "superseded_by": null
    },
    {
      "id": "link-rot",
      "finding_type": "observation",
      "headline": "0 source URL(s) retrievable at first observation and not at the last",
      "value": "0",
      "method": "Count of instruments whose most recent observation was not a direct read and which had at least one earlier observation with fetch_method=direct. Three classes are counted and reported separately: refused (fetch_method=blocked), gone (HTTP 404 or 410) and other non-direct. Sources not retrievable from the first observation are not counted as rot.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "median-days-in-status",
      "finding_type": "corpus",
      "headline": "Median days in current status: 1061",
      "value": "1061",
      "method": "Median of (today − status_as_of) in days, over instruments with a verified status and a recorded status date.",
      "computed_at": "2026-09-25",
      "instruments_involved": [
        "astm-e2363",
        "astm-e2500",
        "ema-ai-reflection",
        "ema-data-quality-framework",
        "eu-digital-omnibus-ai",
        "eu-ivdr",
        "eu-mdr",
        "health-canada-ml",
        "ich-e6r3",
        "nist-csf",
        "us-21-cfr-part-11"
      ],
      "superseded_by": null
    },
    {
      "id": "observation-days",
      "finding_type": "archive",
      "headline": "60 days of continuous observation across 150 observed sources (132 instruments tracked)",
      "value": "60",
      "method": "Count of calendar days from the first recorded observation to today, inclusive. Every tracked instrument is fetched and hashed on every run, including runs where nothing changed. The observed-source count exceeds the tracked count because observation records for instruments since removed from scope are retained rather than deleted — the series is not broken by a scope decision.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "provisions-tracked",
      "finding_type": "corpus",
      "headline": "26 provision(s) tracked at article or section level; 0 with an applicability date still in the future",
      "value": "26",
      "method": "Count of records in the provisions collection, and of those whose recorded applicability_date is later than today. Applicability is recorded per provision because instruments phase in across years and a single instrument-level date would be wrong for most of their articles.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "queue-status-packs",
      "finding_type": "coverage",
      "headline": "19 status pack(s) wait and 0 can be pressed",
      "value": "19",
      "method": "Counted from state/packs/_index.json: the queued and withheld entries the confirm queue reads. `keypress` counts those its accept gate would admit; `blocked_on_collector` counts those whose pack states no corroborating passage or no capture, which a keystroke cannot supply.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "revisions-by-class",
      "finding_type": "observation",
      "headline": "0 revisions recorded: the collection holds none",
      "value": "{}",
      "method": "Count of records in the revisions collection by `change_class`. A revision is recorded when the SHA-256 of an instrument's normalised text differs from the previous observation. Detection currently holds 74 candidate(s), 74 unconfirmed; candidates are proposals and are not counted here.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "robots-unreadable",
      "finding_type": "crawlability",
      "headline": "21 of 132 probed sources publish no robots policy this archive can read",
      "value": "21",
      "method": "Count of sources whose /robots.txt could not be retrieved, or returned a body that is not a robots file, when requested with this archive's own user-agent. A policy that cannot be confirmed is not a permission: no agent probe is sent to these hosts.",
      "computed_at": "2026-09-25",
      "instruments_involved": [
        "cen-jtc21-programme",
        "eu-ai-act",
        "eu-cyber-resilience-act",
        "eu-cybersecurity-act",
        "eu-digital-omnibus-ai",
        "eu-ivdr",
        "eu-machinery-regulation",
        "eu-mdr",
        "eu-nis2",
        "ich-e6r3",
        "ich-q12",
        "ich-q13",
        "ich-q14",
        "ich-q2r2",
        "ich-q9r1",
        "nist-ai-600-1",
        "nist-ai-rmf-playbook",
        "nist-csf",
        "nist-sp-800-82",
        "nistir-8183",
        "nmpa-ai"
      ],
      "superseded_by": null
    },
    {
      "id": "silent-revisions",
      "finding_type": "observation",
      "headline": "0 silent revision(s): content changed with no declared version or date change",
      "value": "0",
      "method": "Count of revisions where the normalised text hash changed and no version identifier or declared date differed between the two observations. Version identifiers are matched by pattern in the normalised text. Detection currently holds 74 candidate(s), 74 unconfirmed; candidates are proposals and are not counted here.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "standards-progression",
      "finding_type": "standards",
      "headline": "14 standard(s) tracked by lifecycle stage; 8 with a confirmed stage",
      "value": "14",
      "method": "Count of instruments with at least one standards-progression record. Stage codes are published openly by ISO, CEN/CENELEC and ICH even where the standard's text is paywalled, so progression is observable without reproducing any restricted text.",
      "computed_at": "2026-09-25",
      "instruments_involved": [
        "ich-q12",
        "ich-q13",
        "ich-q14",
        "ich-q2r2",
        "ich-q9r1",
        "iso-iec-23894",
        "iso-iec-42001",
        "ispe-gamp-ai",
        "ispe-gamp5-2e",
        "pic-s",
        "pren-18229-1",
        "pren-18229-2",
        "pren-18281",
        "pren-18282"
      ],
      "superseded_by": null
    },
    {
      "id": "status-distribution",
      "finding_type": "corpus",
      "headline": "Status across the tracked corpus: 74 unknown, 39 final, 13 in-force, 3 draft, 2 withdrawn, 1 superseded",
      "value": "{\"unknown\": 74, \"final\": 39, \"in-force\": 13, \"draft\": 3, \"superseded\": 1, \"withdrawn\": 2}",
      "method": "Count of instruments by the `status` field, as recorded after human verification against the primary source. Instruments never verified are counted as `unknown`.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "status-verification",
      "finding_type": "archive",
      "headline": "16 of 107 recorded status value(s) awaiting a person; 25 row(s) sit off the verification axis in the register tier",
      "value": "16",
      "method": "The verification axis is the tracked corpus minus the register tier, which promises no person-verification and is stated separately rather than folded into a total. A row is awaiting when its status is unknown, it is not frozen, and it records no status basis — three conditions, because a frozen row and a row with a recorded basis are settled rather than pending.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "tier1-coverage",
      "finding_type": "corpus",
      "headline": "55 of 57 recorded tier-1 member(s) carry the assignment; 38 carry a verified status",
      "value": "55",
      "method": "THE POPULATION IS THE RATIFIED RULE, NOT THE DECLARED LIST ALONE. Tier 1 = the declared list in sources/tier1-declared.yaml, union the approved canon in state/canon-candidates.json, union a documented exception in docs/referents/declarations.json. Derived through scripts/tier_identity.py: 37 declared, 40 in the approved canon, 2 documented exception(s); the three overlap, so the union is smaller…",
      "computed_at": "2026-09-25",
      "instruments_involved": [
        "ema-qig",
        "fda-dhcoe"
      ],
      "superseded_by": null
    },
    {
      "id": "tier1-exceptions",
      "finding_type": "corpus",
      "headline": "2 documented exception(s) to the tier-1 rule",
      "value": "2",
      "method": "A row named in the declared tier-1 list that carries no `tier: 1` because it is not a document. Each is recorded in docs/referents/declarations.json with its reason rather than special-cased in code: a name special-cased in code is a name satisfying a condition it does not meet. The reasons, verbatim: ema-qig: declared tier 1 and carries no `tier: 1` row because it is a BODY…",
      "computed_at": "2026-09-25",
      "instruments_involved": [
        "ema-qig",
        "fda-dhcoe"
      ],
      "superseded_by": null
    },
    {
      "id": "tier1-undeclared",
      "finding_type": "corpus",
      "headline": "every instrument assigned tier 1 is admitted by the ratified rule",
      "value": "0",
      "method": "THE POPULATION IS THE RATIFIED RULE. Count of rows literally carrying `tier: 1` whose id is in neither the declared list, nor the approved canon, nor the documented exceptions. A non-zero here means the tier assignment and the rule disagree, and it is reported rather than reconciled silently. A zero means they agree — a measured zero, derived through scripts/tier_identity.py, which is the same…",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    },
    {
      "id": "total-observations",
      "finding_type": "archive",
      "headline": "7899 instrument-days observed",
      "value": "7899",
      "method": "Count of distinct instrument-days observed: one per source per calendar day on which a record was written, whether or not the content changed. The store holds 18012 raw records across those days, because the loop can run more than once in a day.",
      "computed_at": "2026-09-25",
      "instruments_involved": [],
      "superseded_by": null
    }
  ]
}