Data readiness
Before any prediction is tested, the records behind it have to be checked. This page shows that check working on invented records. It answers one question: are these records well formed and honestly described? It does not say whether any prediction works.
The synthetic set through the gate
Passes every structural check Declared synthetic. Passing means the records are well formed. It does not mean any prediction works.
| Check | Result | What was seen |
|---|---|---|
| The validator knows exactly the fields the registry lists | Pass | 41 fields |
| Every store read could be used: none missing, unreadable, empty, without the guard, all damaged, or not the reader's shape | Pass | 276 reads: 276 ok |
| No line failed to open. A line that fails is a record of unknown content, not an absent one | Pass | 0 damaged lines |
| Every record passed the strict schema, allowlist, time and consistency rules | Pass | 0 of 1146 processed failed a rule (0 excluded alone, 0 inside conflicting groups) |
| No request identifier appears with different contents (identical repeats are collapsed and counted) | Pass | 0 conflicting groups, 0 identical repeats collapsed |
| Every kept record is complete: none cut short by the service, none with an unclosed group | Pass | 0 incomplete of 1146 |
| Every kept record has an ingestion time that could have held it | Pass | 0 without one |
| The declared provenance is not contradicted by what the identifiers look like. Declared provenance is a label, not proof | Pass | declared synthetic |
What the gate looks at
| Check | What it catches | What happens |
|---|---|---|
| Types | A number is a number, a yes or no is a real true or false, and a time is a real UTC time. Something that only looks like one, such as the text "false", is refused. | Excluded |
| The allowlist | Only the fields the contract lists, holding only the values it allows. Anything else is refused, including text that looks like an identifier, and the name of an unlisted field is never shown. | Excluded |
| Times and order | Steps happen in order and nothing ends before it starts or after the request ended. Records may be written out of start order, so that is not refused. | Excluded |
| Consistency | Counts add up, flags agree with the numbers they summarise, and a group cannot list more transfers than URLs it asked for. | Excluded |
| Missing is not zero | A value the service may leave empty is unknown, and is never counted as zero. A failed transfer that measured 0 ms is called not measured. | Noted |
| Duplicates | An identical repeat is counted once. The same identifier with different contents, even only a different type, excludes every copy, whichever came first. | Collapsed, or excluded |
| Cut short and damaged | A record the service cut short is valid but marked incomplete. A line that would not open is counted, never guessed at, and the set stays visibly partial. | Marked |
| When it could be used | Availability is the time the reader ingested the record. It is never worked out from the record's own stamps or the file's time. | Recorded |
| Where it came from | Each batch carries one declared label, synthetic or measured, given by whoever supplies it. The gate does not verify that the label is true. | Labelled |
Broken and unusual records
Each row is an invented record, or set of reads, with one thing wrong or one thing unusual. 38 of 38 behave as they must. A record that fails is excluded whole: nothing is repaired, and it never reaches the kept set.
| Case | What was done | Kept | Excluded | What the gate said | As it must |
|---|---|---|---|---|---|
| A clean set | Twelve well-formed records in two reads. | 12 | 0 | Nothing to report | Yes |
| The same day file read twice | Every record appears again in a later read. That is a repeat, not new evidence: it is counted once, and known from the first read. | 12 | 0 | Nothing to report | Yes |
| Records written out of start order | A record that started earlier is written after one that started later. Nothing requires a file to be in start order (a long request is written when it finishes), so this is not rejected. | 12 | 0 | Nothing to report | Yes |
| A flight-plan check with nothing to list | No stages, cache events or lookup groups: the lists are empty, and that is valid. | 12 | 0 | Nothing to report | Yes |
| Fewer transfers than URLs asked for | A group asked for 4 addresses and lists 3 transfers. A failed measurement can cause that, so it is valid. | 12 | 0 | Nothing to report | Yes |
| Identifiers made only of digits | Valid identifiers that look like numbers, including one that looks like a number in scientific notation. They stay identifiers. | 12 | 0 | Nothing to report | Yes |
| Case | What was done | Kept | Excluded | What the gate said | As it must |
|---|---|---|---|---|---|
| Values the writer may leave empty | The clock gap before the script, the HTTP status and the hand-off time are empty. They are unknown, and are never counted as zero. | 12 | 0 | Missing is not zero | Yes |
| A record the service cut short | A list reached its limit of 64 and the service said so. It is well formed, but it is not complete. | 12 | 0 | Completeness | Yes |
| A group of lookups never closed | The end and duration of one group are empty. How long it took is unknown, and is not zero. | 12 | 0 | Completeness | Yes |
| No ingestion time | The read carries records but no time when it was ingested. Nobody can say when they could first have been used, and none is guessed from their own stamps. | 12 | 0 | Availability | Yes |
| Read before it existed | The read says it was ingested before any of its records were assembled. Those clocks disagree, so no availability is claimed. (A read that is only earlier than some of them is believed for the rest.) | 12 | 0 | Availability | Yes |
| Case | What was done | Kept | Excluded | What the gate said | As it must |
|---|---|---|---|---|---|
| A time written as text | A cache time is the text "310.0" instead of a number. Some code would quietly accept it. | 11 | 1 | Schema | Yes |
| A yes/no written as text | A cache hit is the text "false". Read loosely it counts as a hit. | 11 | 1 | Schema | Yes |
| A count written as a yes/no | A time-to-live is true instead of a whole number of seconds. | 11 | 1 | Schema | Yes |
| A field nobody listed | A top-level field the contract does not have, holding a tail-number-like text. It is not kept, and its name is not shown. | 11 | 1 | Allowlist | Yes |
| A field nobody listed, inside a group | An extra field inside the request block. Nested fields are held to the same list. | 11 | 1 | Allowlist | Yes |
| A feed name nobody listed | A lookup counted under a name that is not one of the fixed feed names. The name is a field name in disguise, so it is not shown. | 11 | 1 | Allowlist | Yes |
| Contact-like text in a fixed-name field | The purpose field holds text with a tail number, a place and a phone-like number. It may only hold a fixed name. | 11 | 1 | Allowlist | Yes |
| An airport in a stage name | A stage name that carries an airport identifier. | 11 | 1 | Allowlist | Yes |
| An empty value where one is needed | The request time is empty. A request time that is unknown cannot be treated as short. | 11 | 1 | Schema | Yes |
| A required block is missing | The whole budget block is gone. An empty list is fine; an absent block is not. | 11 | 1 | Schema | Yes |
| A date that does not exist | The start time is 30 February. | 11 | 1 | Time | Yes |
| Finished before it started | The record says it was put together before the request began. | 11 | 1 | Time | Yes |
| Stages out of sequence | A later stage is stamped earlier than the one before it. | 11 | 1 | Time | Yes |
| A group that ends before it starts | A lookup group ends at 100 ms after starting at 300 ms. | 11 | 1 | Schema | Yes |
| Counts that disagree | Five transfers, of which one worked and one failed. | 11 | 1 | Consistency | Yes |
| Skipped, yet transfers recorded | A group marked as skipped for lack of time that also lists transfers, and the skip count does not match. | 11 | 1 | Consistency | Yes |
| Says it was cut, but no list is full | Marked as cut short although no list is anywhere near its limit. | 11 | 1 | Consistency | Yes |
| A list longer than the service can write | 65 stages, when the service stops at 64. | 11 | 1 | Structure | Yes |
| A huge, deeply nested record | A very long text nested many levels deep. It is refused unread. | 11 | 1 | Structure | Yes |
| The generator's hidden truth inside a record | The synthetic world's hidden "true slow" answer placed inside the record. It belongs outside; a record that carries it is refused. | 11 | 1 | Allowlist | Yes |
| Handed off before the script ended | The hand-off is stamped at 1 ms although the script ran for over a second. Both come from one clock, so that cannot be. | 11 | 1 | Time | Yes |
| More transfers than URLs asked for | A group that asked for 1 address lists 2 transfers. That cannot happen. | 11 | 1 | Consistency | Yes |
| Case | What was done | Kept | Excluded | What the gate said | As it must |
|---|---|---|---|---|---|
| One identifier, two different records | The same identifier appears twice with different contents, in different reads. Neither can be trusted, so both are excluded, whichever came first. | 11 | 2 | Duplicates | Yes |
| A valid record and its twin that differs only in type | The same record twice, but in one the budget is the whole number 15000 and in the other the decimal 15000.0. The contract requires a whole number, so one is invalid. Both are excluded, in either order. | 11 | 2 | Duplicates Schema | Yes |
| A conflict that hides a broken twin | A valid record and a same-identifier copy that also carries an unlisted field. The conflict is reported, and so is the unlisted field: neither hides the other. | 11 | 2 | Duplicates Allowlist | Yes |
| Case | What was done | Kept | Excluded | What the gate said | As it must |
|---|---|---|---|---|---|
| Every kind of unusable read, told apart | One good read beside a missing file, an unreadable one, an empty one, one without the guard, one whose lines all failed to open, one partly damaged, and one that is not the reader's shape. | 12 | 0 | partial × 1 corrupt × 1 missing × 1 unreadable × 1 empty × 1 wrong guard × 1 malformed × 1 | Yes |
| Declared measured, but the identifiers are a counter | Records whose identifiers count 1, 2, 3 (the demonstration generator's habit) declared as measured. Provenance is a label; this is a tripwire, not proof. | 12 | 0 | Provenance | Yes |
Stores that could not be read are told apart
A file that is missing is not a day with no requests, and a file that is damaged is not an empty one. Each state is counted on its own, and none is treated as zero.
| State | Meaning | In the demonstration |
|---|---|---|
| ok | Read, and every line opened | 1 |
| partial | Read, but some lines would not open: the records that did are kept, and the gap is shown | 1 |
| corrupt | The file was there and no line would open: not an empty day | 1 |
| no records | Opened, with nothing written yet | 0 |
| missing | No such file: not zero requests | 1 |
| unreadable | The file exists and could not be read | 1 |
| empty | A file with nothing in it | 1 |
| wrong guard | A file that does not start with the exit guard: not read as a store | 1 |
| malformed | Not the shape the reader returns, so it is never looked into | 1 |
Predictive readiness: not assessed
Predictive validation Not measured
Whether these records could support a fair test of a prediction is not assessed here. The structural checks say only that records are well formed.
What would measure it: A frozen prediction and a decision time for each record, supplied to the checker, and an evaluation on measured records that scores later outcomes against them. This checker is not given those, and that evaluation is not built. (The synthetic prediction engine on the Predictions page is separate, and only ever uses synthetic records.)
Request coverage Not measured
No independent request total is supplied, so what share of requests left a record cannot be worked out. Coverage is unknown, not zero.
What would measure it: A counter updated at the start of each request, separate from the timing record (see Q-08 in the improvement queue).
- No independent request total is supplied, so coverage cannot be worked out: nothing here counts requests apart from their records (see Q-08 in the improvement queue).
- No frozen predictions and no decision times are supplied to this checker, so nothing can be scored against these records here.
- An outcome can arrive after the decision it scores. Scoring it later is fair only against a prediction frozen first, and nothing here checks that.
- Whether there are enough still-running requests, and enough long ones, for a fair holdout is not assessed: that needs an evaluation set-up for measured records, which is not built.
- Whether any model works is not assessed. A set that passes the structural checks says only that its records are well formed.
Where records come from
| Kind | Records | Status |
|---|---|---|
| Synthetic | 1,146 | Made by a generator for this demonstration. Declared synthetic. |
| Measured | None | No store was read and none was supplied. |
Provenance is a label given by whoever supplies the records. The gate does not verify it. It only raises a warning when records declared as measured carry the identifiers a generator makes. The list of allowed fields limits what a record may hold. It is not a privacy or compliance certification.
Engineering details: schema, finding codes, limits and notes
| Name | Value |
|---|---|
| Validator version | rd-0.1 |
| Records in one batch (a local capacity choice, not a measured volume) | 10,000 |
| Reads in one batch | 2,000 |
| Nodes in one record | 6,500 |
| Depth of one record | 6 |
| Length of one text | 64 |
| Largest duration or gap, ms | 3,600,000 |
| Group duration against end minus start, ms | 0.002 |
| Out-of-time flag against time left, ms | 0.1 |
| A transfer against its group, ms | 5 |
| Fingerprint of the kept records | 8e5bc55b1f1623e0db0f418ca2355967ad4c61b3b0eeffc6b2fc443872199453 |
- Real request volume has never been read or counted here, so no figure on this page says how many records a real day holds.
- The existing reader's leaf walker (tm_leaves) keeps self-referencing garbage until PHP collects it, so a bulk loop over thousands of records should collect cycles as it goes. The reader is unchanged. This is a limit of using it in bulk, not something this page fixes.
- Passing these checks is a statement about how records are formed. It is not a clearance to train, to score or to deploy anything.
| Code | Level | Family | Meaning |
|---|---|---|---|
| RD-SHAPE | reject | Structure | Not the shape of a timing record (not a record, a list where a group belongs, too long, too deep or too large) |
| RD-UNKNOWN | reject | Allowlist | Carries a field the contract does not list (its name is withheld) |
| RD-MISSING | reject | Schema | A field the contract requires is absent |
| RD-TYPE | reject | Schema | A field has the wrong kind of value (a number written as text, a yes/no written as a number, and so on) |
| RD-NULL | reject | Schema | A field that may never be empty is empty |
| RD-VALUE | reject | Schema | A value outside what the field may hold (not one of the allowed names, out of range, not a finite number) |
| RD-IDENT | reject | Allowlist | Text that looks like an identifier, a link or a contact detail sits in a field that may only hold a fixed name |
| RD-TIME-FORMAT | reject | Time | A clock reading that is not a real UTC time in the fixed format |
| RD-TIME-ORDER | reject | Time | Times that cannot be true together (a step before the request began, after it ended, or out of sequence) |
| RD-CONSISTENCY | reject | Consistency | Two fields of one record contradict each other |
| RD-CONFLICT | reject | Duplicates | The same request identifier appears with different contents, so none of them can be trusted |
| RD-TRUNCATED | incomplete | Completeness | The service cut this record short (a list reached its limit): valid, but not complete |
| RD-OPEN-GROUP | incomplete | Completeness | A group of lookups was never closed, so its end and duration are unknown (not zero) |
| RD-AVAIL-UNKNOWN | info | Availability | The read has no ingestion time, so nobody can say when these records could first have been used |
| RD-NOT-RECORDED | info | Missing is not zero | A value the writer may leave empty is empty: it is unknown, and is never counted as zero |
| RD-W-AVAIL-ORDER | warn | Availability | Every read that held this record is stamped as ingested before the record was assembled: those clocks disagree, so no availability is claimed |
| RD-W-CURL | warn | Consistency | A transfer reports a longer time than the group that contains it |
| RD-W-CURL-ZERO | warn | Missing is not zero | A failed transfer reports 0 ms: that is not measured, not instant |
| RD-W-BUDGET | warn | Consistency | Time left at the end does not match the budget less the request time |
| RD-W-ASSEMBLY | warn | Time | The gap between the start and assembly stamps differs from the request time by over a second |
| RD-W-ZERO | warn | Missing is not zero | A request time of exactly zero: recorded, not measured |
| RD-W-SYNTH-MARK | warn | Provenance | Declared as measured, but the identifiers look like the demonstration generator's counter |
| Field | Kind | May be empty | Allowed | Role | Dated by |
|---|---|---|---|---|---|
| schema | fixed text | No | fs.telemetry.request.v0 | meta | record_assembly |
| scope | fixed text | No | server_request | meta | record_assembly |
| request_id | 16 lowercase hex characters | No | meta | request_start | |
| event_time_utc | UTC time, fixed format | No | feature_candidate | request_start | |
| record_assembled_at_utc | UTC time, fixed format | No | meta | record_assembly | |
| truncated | true or false | No | meta | request_end | |
| clock.durations | fixed text | No | hrtime_monotonic | meta | record_assembly |
| clock.wall | fixed text | No | system_utc | meta | record_assembly |
| clock.budget_clock_skew_ms | number, may be negative | No | meta | request_start | |
| clock.pre_script_wall_ms | number, may be negative | Yes | meta | request_start | |
| request.action | one of a list | No | briefing, flight-plan | feature_candidate | request_start |
| request.channel_hint | one of a list | No | tool_header, none | feature_candidate | request_start |
| request.purpose | one of a list | No | standard, alternate, other | feature_candidate | request_start |
| stages[].stage | one of a list | No | idents_resolved, endpoints_fetched, hazards_done, route_weather_done, tfrs_done, response_built | feature_candidate | at_ms |
| stages[].at_ms | number, 0 or more | No | feature_candidate | at_ms | |
| cache[].source | one of a list | No | noaa.metar, noaa.taf, noaa.windtemp, noaa.airsigmet, noaa.gairmet, noaa.cwa, noaa.pirep, noaa.isigmet, noaa.airmet, noaa.airport, noaa.other, noaa.stations_table, faa.tfr_list, faa.tfr_detail, faa.other, other, winds.fb_table, ident.index | feature_candidate | at_ms |
| cache[].ttl_s | whole number, 0 or more | No | feature_candidate | at_ms | |
| cache[].hit | true or false | No | feature_candidate | at_ms | |
| cache[].at_ms | number, 0 or more | No | feature_candidate | at_ms | |
| fetch_groups[].seq | whole number, 0 or more | No | meta | start_ms | |
| fetch_groups[].start_ms | number, 0 or more | No | feature_candidate | start_ms | |
| fetch_groups[].n_urls | whole number, 0 or more | No | feature_candidate | start_ms | |
| fetch_groups[].retry_allowed | true or false | No | feature_candidate | start_ms | |
| fetch_groups[].retry_pass | true or false | No | feature_candidate | start_ms | |
| fetch_groups[].cap_ms | whole number, 0 or more | No | feature_candidate | start_ms | |
| fetch_groups[].budget_left_before_ms | number, may be negative | No | feature_candidate | start_ms | |
| fetch_groups[].skipped_for_budget | true or false | No | outcome | end_ms | |
| fetch_groups[].end_ms | number, 0 or more | Yes | outcome | end_ms | |
| fetch_groups[].dur_ms | number, 0 or more | Yes | outcome | end_ms | |
| fetch_groups[].sources.*.n | whole number, 0 or more | No | outcome | end_ms | |
| fetch_groups[].sources.*.ok | whole number, 0 or more | No | outcome | end_ms | |
| fetch_groups[].sources.*.failed | whole number, 0 or more | No | outcome | end_ms | |
| fetch_groups[].sources.*.max_curl_ms | number, 0 or more | No | outcome | end_ms | |
| budget.budget_ms | whole number, 0 or more | No | meta | request_start | |
| budget.left_at_end_ms | number, may be negative | No | outcome | request_end | |
| budget.out_of_time_at_end | true or false | No | outcome | request_end | |
| budget.groups_skipped | whole number, 0 or more | No | outcome | request_end | |
| server.http_status | whole number 100 to 599 | Yes | outcome | request_end | |
| server.script_end_ms | number, 0 or more | No | outcome | request_end | |
| server.handoff | one of a list | No | fastcgi_finish, flush | meta | request_end |
| server.handoff_ms | number, 0 or more | Yes | outcome | request_end |