{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://gxplex.com/api/v1/schema/gxp-obs-v1.json",
  "title": "GXP-OBS v1 — the observation record, and what it does not claim",
  "description": "A versioned, machine-readable description of what an observation IS in this record: its fields, their meanings, the values each has been observed to take, and — for every field — what a reader may not conclude from it and what its absence is. The two `x-gxplex-` annotations on each property carry the second half; a validator ignores them and a consumer reads them.",
  "x-gxplex-spec": {
    "name": "GXP-OBS",
    "version": 1,
    "status": "published",
    "supersedes": null,
    "superseded_by": null,
    "later_versions": [
      {
        "version": 2,
        "address": "https://gxplex.com/api/v1/schema/gxp-obs-v2.json",
        "human_readable": "https://gxplex.com/gxp-obs",
        "adds": "two record families: the signal and the evidence state. v1's two families are carried into v2 unchanged.",
        "withdraws": "nothing. No field statement in v1 is corrected, narrowed or removed by v2."
      }
    ],
    "human_readable": "https://gxplex.com/gxp-obs",
    "versioning": "A later version takes a later address and this one keeps resolving: a published URL is treated as a citation here. The spec version is independent of the API's schema_version and of a record's own schema_version — three numbers that move separately.",
    "relationship_to_the_json_schema": "The floor schema for the same records is served at https://gxplex.com/api/v1/schema/series.json. It states which keys exist and what type each holds. This document states what they mean and what they do not claim, which is the half a validator cannot carry."
  },
  "x-gxplex-record-families": {
    "note": "The published series carries two disjoint families in one file. A consumer that reads them alike will treat a query result as a document observation.",
    "document_observation": {
      "keyed_by": "instrument_id",
      "is": "one retrieval of one address on one day"
    },
    "source_query": {
      "keyed_by": "source_id",
      "is": "one query put to a publisher API on one day"
    },
    "how_to_tell": "Exactly one of `instrument_id` and `source_id` is present on every record. Neither family is a subset of the other."
  },
  "x-gxplex-does-not-claim": [
    "An observation is a record of a RETRIEVAL. It is evidence about what an address returned to this archive on a day, and it is not evidence about what a document required of anyone, at any time.",
    "A day with no observation is not a day on which nothing changed. Absence of a record is absence of a measurement.",
    "A run of unchanged digests is not a statement that a document is stable. It is a statement that this archive's normalisation of one address did not move across the days it looked.",
    "The series begins when this archive began observing, not when the document began. Nothing in it supports a claim about the document before the first record.",
    "No record carries a status, a lifecycle position or an interpretation. Those live on other surfaces of this record, each with its own act and its own date, and none of them is derivable from an observation.",
    "Nothing here is signed. The digests prove what these bytes were once they were retrieved and normalised here; they prove nothing about who published them."
  ],
  "x-gxplex-prov-context": {
    "prov": "http://www.w3.org/ns/prov#"
  },
  "x-gxplex-served-at": {
    "series": "https://gxplex.com/api/v1/series.jsonl",
    "per_subject": "https://gxplex.com/api/v1/observations.json",
    "note": "The series file carries a header record on its first line with the provenance envelope and the corpus figures for that build. Figures are read from there and are not restated in this document: a spec that carried a count would be a description of one build."
  },
  "type": "object",
  "properties": {
    "instrument_id": {
      "type": "string",
      "description": "The id this series was recorded under — a directory name in this archive's observation store.",
      "x-gxplex-does-not-claim": "It does not assert that the subject is a regulatory instrument, and it does not assert that a published page exists for it. This archive also observes listing pages, feed endpoints and redirects, and their series carry ids of the same shape.",
      "x-gxplex-absent-means": "Absent on the source-query family, where `source_id` names the subject instead. The two families are disjoint and both are carried in one file.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "source_id": {
      "type": "string",
      "description": "The id of a queried source, on records that describe a query against a publisher API rather than a retrieval of one document.",
      "x-gxplex-does-not-claim": "A source-query record is not an observation of a document. It records what a query returned, and nothing in it is evidence about any one document's text.",
      "x-gxplex-absent-means": "Absent on the document-observation family, which carries `instrument_id` instead.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "observed_date": {
      "type": [
        "string",
        "null"
      ],
      "format": "date",
      "description": "The day this archive observed the address.",
      "x-gxplex-does-not-claim": "It is not a publication date, not an effective date, not a date the document changed, and not a date the publisher did anything. It is the day a fetch was made from here.",
      "x-gxplex-absent-means": "Never absent on a published observation record: a record with no day is not an observation and is not served.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "observed_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date",
      "description": "The observation instant, projected to the day at the publication boundary.",
      "x-gxplex-does-not-claim": "It carries no time of day. The stored record keeps its instant; retention is not publication, and an intra-day figure would invite a reader to order events this record cannot order.",
      "x-gxplex-absent-means": "Absent where the store holds no instant for the record.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "sequence": {
      "type": "integer",
      "description": "The nth observation of this subject on this day, counted in the order the store recorded them.",
      "x-gxplex-does-not-claim": "A repeated (subject, day) pair is not duplication. This store is append-only with designed same-day revalidation, and `sequence` is what disambiguates several fetches in one day. A repeated (subject, day, digest) triple is a revalidation; only DIFFERING digests on one day are a fork.",
      "x-gxplex-absent-means": "Never absent. A record with no sequence could not be addressed.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "url": {
      "type": "string",
      "description": "The address the fetch was aimed at.",
      "x-gxplex-does-not-claim": "It is testimony about where the request went, not a statement about what answered. Where `final_url` differs, that value is the record's address and this one is the question that was asked.",
      "x-gxplex-absent-means": "Absent on some source-query records, which name their subject by `source_id` and their request by `query`.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "final_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "The address that answered.",
      "x-gxplex-does-not-claim": "A redirect is a publisher's own statement about what supersedes what, and this field reports it. It does not say the two addresses hold the same document, and it does not characterise the relation between them.",
      "x-gxplex-absent-means": "Absent where no answering address was recorded. That is a gap in this record, not evidence that the asked address answered.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "redirected": {
      "type": "boolean",
      "description": "Whether the answering address differs from the asked one.",
      "x-gxplex-does-not-claim": "It says nothing about why, and nothing about whether the document at the two addresses is the same document.",
      "x-gxplex-absent-means": "Absent where no redirect chain was recorded for the fetch.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "http_status": {
      "type": [
        "integer",
        "null"
      ],
      "description": "The status code the response carried.",
      "x-gxplex-observed-values": [
        "200",
        "202",
        "403",
        "404",
        "406",
        "500",
        "503",
        "0"
      ],
      "x-gxplex-does-not-claim": "A status code asserts transport success and never artifact identity: 200 does not assert that the response is the document that was asked for. `0` is not a status — it is the browser path, which records no HTTP code, and reading it as a failure would be reading a method as an outcome.",
      "x-gxplex-absent-means": "Null where no response was received at all. That is an unmeasured result and not a negative one: it does not report that the document is gone.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "fetch_method": {
      "type": "string",
      "description": "How the fetch was made.",
      "x-gxplex-observed-values": [
        "direct",
        "browser",
        "api",
        "blocked",
        "failed",
        "no_adapter",
        "unobserved_no_credential"
      ],
      "x-gxplex-does-not-claim": "The values are not a ranking and not a quality scale. `blocked` records how a host answered this client on that day; it is a measurement of a transport, not a judgement of a publisher. The list is what the store holds today, not a closed set this record claims for the future.",
      "x-gxplex-absent-means": "Absent where no fetch was attempted for the record.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "content_hash": {
      "type": [
        "string",
        "null"
      ],
      "description": "SHA-256 of the NORMALISED text of the retrieval, where text was retrieved.",
      "x-gxplex-does-not-claim": "A normalised text is not the document. The digest covers what the normaliser produced from the response, so two equal digests are two equal normalisations and not two identical documents, and two differing digests may differ over something the normaliser kept and a reader would not have noticed. The digest is also not a signature: it proves what these bytes were, never who published them.",
      "x-gxplex-absent-means": "Null means nothing was retrieved to hash. It does not mean the document was empty, and it does not mean the document was unchanged. An absent digest is an absent measurement.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "previous_hash": {
      "type": [
        "string",
        "null"
      ],
      "description": "The digest this record's digest was compared against.",
      "x-gxplex-does-not-claim": "It names the comparison this record made, not the previous state of the document. Where `series_restarted` is present the comparison crosses a referent change and the two digests are of different things.",
      "x-gxplex-absent-means": "Null on the first record of a series and after a restart. Null is not \"no earlier observation exists\" — it is \"this record compared against nothing\".",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "changed": {
      "type": "boolean",
      "description": "Whether this record's digest differs from the one it was compared against.",
      "x-gxplex-does-not-claim": "It is a fact about two normalisations of one address. `false` does not assert that the document did not change: a change outside the normalised text, a change and a reversion between two observations, or any change on a day with no observation, is invisible to it. `true` does not assert that the publisher revised anything — a template, a date stamp or a session token in the response can move a digest.",
      "x-gxplex-absent-means": "Absent where no digest was taken. Absence is not `false`: nothing was compared.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "content_length": {
      "type": "integer",
      "description": "Characters of normalised content.",
      "x-gxplex-does-not-claim": "It measures the normalisation, not the document, and it is not a measure of how much a document says.",
      "x-gxplex-absent-means": "Written as 0 wherever no digest was taken. A 0 here is the absence of a measurement and never a measured empty document.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "content_type": {
      "type": "string",
      "description": "The media type the response declared.",
      "x-gxplex-observed-values": [
        "text/html",
        "application/pdf",
        "application/json",
        ""
      ],
      "x-gxplex-does-not-claim": "It is the publisher's own declaration, reported. It was not verified against the bytes, and the empty string is a response that declared none rather than a response that was empty.",
      "x-gxplex-absent-means": "Absent where no response was received.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "raw_bytes": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Bytes in the response as received.",
      "x-gxplex-does-not-claim": "It is the size of a response on a day, not the size of a document. A refusal page and a document are both responses.",
      "x-gxplex-absent-means": "Absent where no response was received.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "fetch_duration_ms": {
      "type": "integer",
      "description": "How long this fetch took, in milliseconds.",
      "x-gxplex-does-not-claim": "It is a fact about one network path on one day, not a property of the publisher and not a measure of a service.",
      "x-gxplex-absent-means": "Absent where no fetch completed.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "error": {
      "type": [
        "string",
        "null"
      ],
      "description": "The transport error, where one occurred.",
      "x-gxplex-observed-values": [
        "HTTP 403",
        "HTTP 404",
        "HTTP 500",
        "TimeoutError",
        "URLError",
        "no adapter"
      ],
      "x-gxplex-does-not-claim": "An error is an UNMEASURED result and never a negative one. It does not report that the document is gone, that it is unchanged, or that the publisher refused this record specifically — it reports that no measurement was obtained.",
      "x-gxplex-absent-means": "Null where the fetch returned without a transport error.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "ia_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "A third-party archive copy of this retrieval, where one was made.",
      "x-gxplex-does-not-claim": "It is not this record's copy and this record does not warrant it. A value here says a submission was made and answered, not that the copy still resolves.",
      "x-gxplex-absent-means": "Null where no copy was made from here. It is not evidence that no third-party copy exists.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "ia_submitted_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date",
      "description": "The day the third-party archive submission was made.",
      "x-gxplex-does-not-claim": "It records a submission, not a successful capture.",
      "x-gxplex-absent-means": "Absent where no submission was made.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "ia_unmeasured": {
      "type": "object",
      "description": "Why the third-party archive submission produced no measurement, with the cause and the day.",
      "x-gxplex-does-not-claim": "It is the reason a measurement is missing. It is not a failure of the publisher and not a property of the document.",
      "x-gxplex-absent-means": "Absent where the submission was measured, either way.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "normalised_text_path": {
      "type": [
        "string",
        "null"
      ],
      "description": "Where the normalised text of this retrieval is retained in this archive.",
      "x-gxplex-does-not-claim": "Retention is not publication: the file is not served, and a path here is not an address a consumer can fetch. It is what makes a digest checkable HERE.",
      "x-gxplex-absent-means": "Absent where nothing was retained. That is not evidence that the document has no text — restricted documents are observed and hashed and their text is never published.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "normalised_from": {
      "type": "string",
      "description": "What the normalised text was extracted from, where extraction was not from the response body directly.",
      "x-gxplex-observed-values": [
        "pdf-text"
      ],
      "x-gxplex-does-not-claim": "It names the extraction path, not the fidelity of the extraction. Text taken out of a PDF is a reading of a layout.",
      "x-gxplex-absent-means": "Absent where the normalisation was taken from the response as received.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "series_restarted": {
      "type": "object",
      "description": "That this record begins a new comparison series, with the cause — the referent this archive hashes for the subject moved.",
      "x-gxplex-does-not-claim": "A restart is a change in what this record MEASURES, never a change in the document. A digest before a restart and a digest after it are digests of different things, and comparing them across the boundary would report a document change that did not happen.",
      "x-gxplex-absent-means": "Absent on every record that continues its series.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "referent_assertion": {
      "type": "object",
      "description": "The check that the bytes retrieved are the bytes of the subject this record names — a marker sought in the response, a minimum size, and a verdict.",
      "x-gxplex-does-not-claim": "It confirms that a response is the artifact that was asked for. It does not confirm that the artifact is current, correct or complete, and its absence on a record is not evidence that the referent was wrong.",
      "x-gxplex-absent-means": "Absent on records taken before the check existed and on records where no marker is declared for the subject.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "rescoped_from": {
      "type": "string",
      "description": "The address this subject was observed at before a re-scope.",
      "x-gxplex-does-not-claim": "A re-scope is a correction to what this archive tracks. It says nothing about the publisher.",
      "x-gxplex-absent-means": "Absent on every record of a subject that was never re-scoped.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "rescoped_on": {
      "type": [
        "string",
        "null"
      ],
      "format": "date",
      "description": "The day the subject was re-scoped.",
      "x-gxplex-does-not-claim": "It is a date in this archive's history, not the publisher's.",
      "x-gxplex-absent-means": "Absent on every record of a subject that was never re-scoped.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "rescope_reason": {
      "type": "string",
      "description": "Why the subject was re-scoped, in this archive's own words.",
      "x-gxplex-does-not-claim": "It is this archive's account of its own change. It is a lead and never evidence about the document: evidence is attributable to a voice that is not this one.",
      "x-gxplex-absent-means": "Absent on every record of a subject that was never re-scoped.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "chrome_excluded": {
      "type": "array",
      "description": "Named page furniture removed before normalisation, so a banner that changes daily does not read as a document change.",
      "x-gxplex-does-not-claim": "It records what the normaliser dropped. It does not assert that what remains is the document, and a digest is a digest of what survived this list.",
      "x-gxplex-absent-means": "Absent where nothing was excluded for the subject.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "schema_version": {
      "type": "integer",
      "description": "The version of the RECORD SHAPE this line was written under.",
      "x-gxplex-does-not-claim": "It is not the version of this specification, and not the version of the API. Three version numbers exist here and they move independently.",
      "x-gxplex-absent-means": "Absent on records written before the field existed.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "an observation field records what this record's own collection pass produced at a time; it is not the publisher saying anything"
    },
    "query": {
      "type": "string",
      "description": "The query put to a publisher API.",
      "x-gxplex-does-not-claim": "It records what was asked, not what exists at the publisher.",
      "x-gxplex-absent-means": "Absent on the document-observation family.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "returned": {
      "type": "integer",
      "description": "How many records the query returned.",
      "x-gxplex-does-not-claim": "It counts a response. It is not a count of what the publisher holds, and a zero is a zero for THIS query on THAT day.",
      "x-gxplex-absent-means": "Absent on the document-observation family.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "total_available": {
      "type": [
        "integer",
        "null"
      ],
      "description": "The total the publisher reported for the query.",
      "x-gxplex-does-not-claim": "It is the publisher's own figure, reported. It was not verified here.",
      "x-gxplex-absent-means": "Absent where the publisher reported no total.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "new_since_last_run": {
      "type": "integer",
      "description": "How many returned records this archive had not seen before.",
      "x-gxplex-does-not-claim": "New TO THIS ARCHIVE. It is not a count of what the publisher newly issued, and a record can be new here because a query changed.",
      "x-gxplex-absent-means": "Absent on the document-observation family.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "new_record_ids": {
      "type": "array",
      "description": "The publisher's identifiers for those records.",
      "x-gxplex-does-not-claim": "The identifiers are the publisher's, carried unaltered.",
      "x-gxplex-absent-means": "Absent on the document-observation family.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "api_version": {
      "type": "string",
      "description": "The API version the publisher reported.",
      "x-gxplex-does-not-claim": "Reported, not verified.",
      "x-gxplex-absent-means": "Absent where the publisher reported none.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "api_last_updated": {
      "type": [
        "string",
        "null"
      ],
      "description": "The last-updated value the publisher reported.",
      "x-gxplex-does-not-claim": "It is the publisher's statement about its own data, reported. It is not an observation of a document.",
      "x-gxplex-absent-means": "Absent where the publisher reported none.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "licence_class": {
      "type": "string",
      "description": "What this archive recorded of the terms the queried source states.",
      "x-gxplex-observed-values": [
        "open",
        "restricted",
        "unknown"
      ],
      "x-gxplex-does-not-claim": "It describes this archive's own handling and never what a publisher permits. It is not a licence and not a grant.",
      "x-gxplex-absent-means": "Absent where no reading is recorded.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "jurisdiction": {
      "type": "string",
      "description": "The jurisdiction the queried source belongs to.",
      "x-gxplex-does-not-claim": "A fact about the source, not about any document it returned.",
      "x-gxplex-absent-means": "Absent on the document-observation family.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "sector": {
      "type": "string",
      "description": "The sector the queried source covers, as recorded here.",
      "x-gxplex-observed-values": [
        "cross_sector",
        "pharma",
        "medical_device"
      ],
      "x-gxplex-does-not-claim": "It describes the SOURCE this archive queried. Nothing here classifies any document by product class, by lifecycle position or by reach: that is a judgement, and this record does not make one.",
      "x-gxplex-absent-means": "Absent on the document-observation family.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "source_type": {
      "type": "string",
      "description": "How the source is read.",
      "x-gxplex-observed-values": [
        "api"
      ],
      "x-gxplex-does-not-claim": "It names the access path, not the authority of the source.",
      "x-gxplex-absent-means": "Absent on the document-observation family.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "content_chars": {
      "type": "integer",
      "description": "Characters in the normalised response to the query.",
      "x-gxplex-does-not-claim": "It measures a response, not a corpus.",
      "x-gxplex-absent-means": "Absent where the response was not normalised.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a query field records this record's own request and what it received, never a publisher's statement about the request"
    },
    "status": {
      "type": "integer",
      "description": "An HTTP status code, recorded under this name on two diagnostic records.",
      "x-gxplex-observed-values": [
        "200",
        "500"
      ],
      "x-gxplex-does-not-claim": "It is NOT a document status, a lifecycle position or a verification state. It is a transport code, and this record publishes document statuses on other surfaces with their own acts and dates. Read `http_status` for the transport code of every ordinary record.",
      "x-gxplex-absent-means": "Absent on every record except the two that carry a diagnostic note.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a diagnostic field records how this record's reader behaved, which is a fact about the reader"
    },
    "finding": {
      "type": "string",
      "description": "A short machine token naming what a diagnostic read established about an address.",
      "x-gxplex-observed-values": [
        "http_500",
        "spa_redirects_to_root"
      ],
      "x-gxplex-does-not-claim": "It is this archive's own account of a retrieval problem. It is a lead about this archive's reach, never evidence about the document or the publisher.",
      "x-gxplex-absent-means": "Absent on every ordinary observation.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a diagnostic field records how this record's reader behaved, which is a fact about the reader"
    },
    "note": {
      "type": "string",
      "description": "The same finding in prose, in this archive's own words.",
      "x-gxplex-does-not-claim": "This archive's own prose is reported class by definition, however accurate. It is a lead and never evidence: what counts as evidence here is attributable to a voice that is not this one.",
      "x-gxplex-absent-means": "Absent on every ordinary observation.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a diagnostic field records how this record's reader behaved, which is a fact about the reader"
    },
    "method": {
      "type": "string",
      "description": "How the diagnostic read was made, recorded under this name on two records.",
      "x-gxplex-observed-values": [
        "browser"
      ],
      "x-gxplex-does-not-claim": "It is the same kind of value as `fetch_method` under a second name on two records. Two names for one fact is a defect in the store and it is reported here rather than tidied away, because a spec that hid it would leave a consumer to discover it.",
      "x-gxplex-absent-means": "Absent on every ordinary observation.",
      "x-gxplex-prov-asserts": "prov:wasGeneratedBy",
      "x-gxplex-prov-does-not-assert": "prov:wasAttributedTo",
      "x-gxplex-prov-because": "a diagnostic field records how this record's reader behaved, which is a fact about the reader"
    }
  },
  "required": [
    "observed_date",
    "sequence"
  ],
  "additionalProperties": true
}
