Skip to content

Commit acbbf11

Browse files
committed
T1.25b fix 1 docs: DT-16 and DT-17 approved by the owner
The owner approved DT-16 and DT-17 on 2026-10-11, relayed by the orchestrator during fix round 1 ("approve both", as recommended, including refusing a lone ambiguous date rather than reading it month first). The register records both as approved by the owner under E68, DT-16's approval taking in the open orders this round moved from DT-15; E68, as-built and the tracker's row and Journey row say so. DT-6's reversal of owner decision 30 stays named for the owner. Signed-off-by: Adi Wadaskar <awadaskar@nvidia.com>
1 parent 328bcc5 commit acbbf11

4 files changed

Lines changed: 29 additions & 24 deletions

File tree

‎docs/design/rust-core/phase-1/as-built.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,14 +227,14 @@ As built at T1.25b (E68), each claim with its mechanism:
227227

228228
- The spec is one place: `date-rules.md`'s "The core's text formats" (the formats, what a value reads as, the order of day and month, the three readings); `sdm_engine::time::text`'s module comment points to it. `Reader::column` (with `each` its reading not to UTC), `share` and `day_first_format` follow it: `text_shapes` finds a value's shape (the client's two patterns, unchanged), `format` gives the `strtime` format of the list it is written in or nothing (two separators, a second past 59, a fraction past nine digits, an offset of a day or more or minutes past 59, a zone named other than `UTC` or `GMT`), and `jiff::fmt::strtime::parse` reads the fields, `BrokenDownTime::set_year` placing a two-digit year (`Reader::century`) and `to_datetime` refusing a day the month lacks; `decided_order` is the client's `day_comes_first`; a year written outside 1 to 9999, or an instant outside those years in UTC, is outside (the year written checked from fix round 1). `text.rs` is 624 lines, 884 before (438 outside its tests, 706 before).
229229
- Held to the spec: `tests/text_times.rs` compares all 2,360 columns of `text-times.json` four ways (the values, to UTC, the share, the day-first format), none skipped, and fails closed on a perturbed instant, a refusal said read and a read said refused, another refusal named, a share or format changed, evidence missing, empty or retyped, and a run comparing fewer columns (`the_check_fails_closed`); `the_vectors_hold_every_answer` requires each kind of answer to be held. `text_times_record.py` reads the spec apart from the Rust reader, with Python's `re` and `datetime` only, every year-first ISO value cross-checked with `datetime.fromisoformat` to the microsecond. Seeded faults each fail the vectors (a format dropped, an offset's sign or minutes misread, the day-first rule flipped, the pivot moved; counts in the T1.25b commit text), and the Rust reader agrees with the Python reading on all 13,456 columns T1.25 recorded.
230-
- Against the reference: `text-times-differential.json`, recorded from pandas 3.0.6 by `text_times_differential.py` over T1.25's 13,456 columns, compares the four outcomes the reference reaches (a SQL source's value-by-value reading, the time column's choice, inference's decision under a name that says time and one that does not, the day-first warning) and classes every difference: `a`, refused outside the list (DT-15, approved by the owner's T1.25b answer); `b.order_open`, `b.order_decided`, `b.format_guess`, `b.offsets`, `b.range`, `b.order_rule` and their mixtures, values in the list read, refused or warned of otherwise (DT-16, proposed for the owner); `c`, inference's text outside the client's shapes under a name that does not say time (DT-17, proposed). Counts: materialize 1,667 of 13,456 agree, 10,623 `a`, 1,166 `b`; the time column's choice 1,630 agree, 10,623 `a`, 1,203 `b`; inference 7,236 of 26,908 agree, 18,815 `a`, 398 `b` (41 of them `b.order_open`), 459 `c`; the warning 2,438 of 2,810 agree, 372 `b.order_rule`. A class `a` answer is made by a value outside the list in both orders: the classifier asserts one for each (`record.column` says `outside`), and `the_differential_reports_the_core_as_it_reads` holds every example's core answer to the core, each reference answer to differ from it, every `a` example to such a value (`made_outside`), and the counts to add up; `an_open_order_in_the_list_is_not_a_refusal_outside_it` is the negative control (`03/15/99`, `15/11/00`: `text_time_order`, never `a`), as is the classifier's own self-check. The old file's 2 MB of pandas readings are gone; `text_times_differential.py` is a protected path beside the recorder.
230+
- Against the reference: `text-times-differential.json`, recorded from pandas 3.0.6 by `text_times_differential.py` over T1.25's 13,456 columns, compares the four outcomes the reference reaches (a SQL source's value-by-value reading, the time column's choice, inference's decision under a name that says time and one that does not, the day-first warning) and classes every difference: `a`, refused outside the list (DT-15, approved by the owner's T1.25b answer); `b.order_open`, `b.order_decided`, `b.format_guess`, `b.offsets`, `b.range`, `b.order_rule` and their mixtures, values in the list read, refused or warned of otherwise (DT-16); `c`, inference's text outside the client's shapes under a name that does not say time (DT-17); both approved by the owner on 2026-10-11 (E68), relayed at fix round 1. Counts: materialize 1,667 of 13,456 agree, 10,623 `a`, 1,166 `b`; the time column's choice 1,630 agree, 10,623 `a`, 1,203 `b`; inference 7,236 of 26,908 agree, 18,815 `a`, 398 `b` (41 of them `b.order_open`), 459 `c`; the warning 2,438 of 2,810 agree, 372 `b.order_rule`. A class `a` answer is made by a value outside the list in both orders: the classifier asserts one for each (`record.column` says `outside`), and `the_differential_reports_the_core_as_it_reads` holds every example's core answer to the core, each reference answer to differ from it, every `a` example to such a value (`made_outside`), and the counts to add up; `an_open_order_in_the_list_is_not_a_refusal_outside_it` is the negative control (`03/15/99`, `15/11/00`: `text_time_order`, never `a`), as is the classifier's own self-check. The old file's 2 MB of pandas readings are gone; `text_times_differential.py` is a protected path beside the recorder.
231231
- Inference: `infer::TextTimes` has `share` (fewest, the values read in either order, most, and how many values lie outside the client's shapes) in place of `never_read`; `text_holds_dates` refuses `text_time_order` where the values read in either order decide the score otherwise than the fewest (an order left open, DT-16), else decides by the score at fewest and at most, the most counting every value outside the list under a name that says time (`names::says_time`), and refuses `text_time` where the two differ (DT-15); `sdm-schema`'s `tests/time_choice.rs` holds the score's edges, the refusal where values could make it, codes under each kind of name, and offsets mixed with a stand-in reader. The time column's choice reads to UTC and refuses only where it asks where a column starts, as before, an open order under `text_time_order` (`TextUnread::Order`, fix round 1). `DATES_READ_DAY_FIRST` names the first day-first value's format where the client's rule decides the day comes first (`Reader::day_first_format`, `assemble::day_first`).
232232
- `materialize`: `Times` reads a fetched text column by the provider's `text_times` (DT-7, unchanged, contract version 16), refusing through `text_unread`: `text_time` (a value outside the list), `text_time_order`, `text_time_zones`; a blank value is dropped and warned of (`TIME_VALUES_UNREAD`). `sdm-core`'s `tests/materialize.rs` refuses each by name and holds the blank's warning.
233233
- No pandas-derived rule remains: `grep -rnE "WORDS|unknown_word|cannot_be_a_date|never_read|fn guess\b|guess_datetime|leap|strptime|dateutil|MISSING: \[" rust/crates/sdm-engine/src/time rust/crates/sdm-schema/src/infer.rs rust/crates/sdm-core/src/materialize.rs` finds the Gregorian leap year of civil arithmetic and the module comment saying no rule follows pandas or `dateutil`, nothing else. H21's question is answered as built (E68) and `dependencies.md`'s row is the core's own spec over `jiff`.
234234
- The client's pins (`tests/test_the_schema_route.py`): two DuckDB system views the core refused (`text_time`, P1B-2) are described as the reference describes them (columns, keys, time column), the one-table `duckdb_tables` meets `column_type` (P1B-10) as the shop's does, and an offset of a day or more or with minutes past 59 is refused by name (DT-15) where the reference reads one or none.
235235
- The differential through the public calls (E49): 60 generated DuckDB sources, 30 text formats each as the orders' time column and as a users feature, on the old route and the core: 24 as the reference, 10 the source's CAST failing (DT-12), 13 refused `text_time` outside the list (DT-15), 13 otherwise in the list (DT-16); 22 changed against T1.25's core. The T0.6 corpus's 121 column cases as source columns under two names, `happened_at` and `label`, neither of which says time to the score (242): 60 described as the reference describes them, 36 decided no timestamp as the reference decides and then refused `multicategorical`, 98 refused `text_time` (each column holding a value outside the list that could make the score), 14 `text_time_zones` (6 where the reference raises, DT-11), 34 otherwise in the list (DT-16).
236236
- Reach: every refusal map, rewritten from both runners (`refusal_map.py write` with `sdm-testkit`'s `tests/refusal_map.rs` observations), is unchanged: the time family's cases reach what T1.25 recorded (the in-format ISO and declared text time columns reach `predict`'s result; the US dates and the unreadable value meet the source's CAST, DT-12), and the AdventureWorks journey reaches `predict`'s result on both hosts without `inference_config`, its codes, names and UUIDs no timestamp.
237-
- The gate: no baselined outcome changes, so no register transition is needed; no contract case is affected by DT-16 or DT-17, so none waits for admission.
237+
- The gate: no baselined outcome changes, so no register transition is needed; no contract case is affected by DT-16 or DT-17, which the owner approved on 2026-10-11 (E68).
238238
- Fix round 1 (review of 90a4202): an inference refusal of values in the list whose order of day and month is open was named `text_time` and counted as class `a`, approved under DT-15; it is `text_time_order` (`Share::listed`, the values read in either order, against `fewest`), in inference and the time column's choice as in `materialize`, and class `b.order_open` under DT-16 (41 inference decisions moved); class `a` needs a value outside the list in both orders, asserted by the classifier and the Rust check. The year written is held to 1 to 9999 before an offset moves the instant (`0000-12-31T23:00-02:00` was read as 0001-01-01T01:00Z), in the reader and the recorder; the vectors hold it and its 9999 mirror (`9999-12-31T23:00-02:00`) with their neighbours inside the list, and the client's `test_text_the_list_does_not_decide_is_refused_under_its_rule` and `test_a_year_the_list_holds_after_an_offset_reads` hold them through `Schema.from_source`. The 11 day-first warning differences DT-17 claimed are in-list order-rule differences, DT-16. Two more seeded faults fail the vectors (the year written unchecked: 25 differ; the values read in either order counted in one: 184); the reader still equals the spec's Python reading on all 13,456 old columns; the probes' counts are unchanged.
239239
- Carried: T1.18's floor-cell waiver (E65(c)) is removed from `ci.yml`, dead since T1.18's landing; `tests/test_contract_ci_gate.py`'s `test_every_cell_gates_a_failing_comparator` is the control, the waiver's own case failing the step in all three cells. T1.18's tracker row says E66(f) answered T1.15's cut.
240240

0 commit comments

Comments
 (0)