diff --git a/README.md b/README.md index acc75d2..63cdb77 100644 --- a/README.md +++ b/README.md @@ -238,8 +238,8 @@ too, so a person's prefix never contradicts it. A `personnummer`'s birth number, for a man, which no real person is ever given. A person of a chosen sex is assembled from the tables — `sex[f].first-name` beside -`last-name`. `person` and `personnummer` each draw their own sex, so where a name and a -number must agree, read both through one bound `sex`: +`last-name`. `person` and `personnummer` draw apart, so where a name and a number must +agree, read both through one bound `sex`, `{/sv_SE.sex[f] as s}` for a woman: ```json { "format": "{first} {last}, {pnr}", @@ -248,14 +248,15 @@ number must agree, read both through one bound `sex`: "pnr": "{date(1930-01-01,2025-12-31,'060102')}-{s.birth-number.number}{luhn()}" } ``` -Renders e.g. `Anne Grönberg, 011012-2389`. Skatteverket's test series is also small: a personnummer -is one of about 70,000 values, a day in 1930–2025 against the two birth numbers, so a -fixture past a few hundred rows repeats one and a `UNIQUE` column needs a category of -your own. `sv_SE.date` and `en_US.date` are uniform over 1970-01-01 to 2029-12-31, -`misc.datetime` over 2000-01-01 to 2029-12-31. What the two locales do not share: -`en_US.address` carries a `region` column the Swedish one has no use for, and -`sv_SE.title` has no `parent`, so it is selected as `sv_SE.title[dr]` rather than -inside a sex. +Renders e.g. `Anne Grönberg, 011012-2389`. + +Skatteverket's test series is small: a personnummer is one of about 70,000 values, a day +in 1930–2025 against the two birth numbers, so a fixture past a few hundred rows repeats +one and a `UNIQUE` column needs a category of your own. `sv_SE.date` and `en_US.date` +are uniform over 1970-01-01 to 2029-12-31, `misc.datetime` over 2000-01-01 to 2029-12-31. +What the two locales do not share: `en_US.address` carries a `region` column the Swedish +one has no use for, and `sv_SE.title` has no `parent`, so it is selected as +`sv_SE.title[dr]` rather than inside a sex. A `geo` folder holds one tree per country under its alpha-2 code: five [linked tables](#linked-tables) named alike, and an `address` record binding one locality diff --git a/docs/decisions.md b/docs/decisions.md index 39a2e4b..5c69c13 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -662,11 +662,10 @@ Withdrawn by the maintainer on 2026-10-03; `todo.md` item 78 replaces it. 2026-09-18, Lilleman auf Larv; revised 2026-10-05. Goal 4.1. A record cannot read another whole and keep its columns, so `sv_SE.address` names the -same four columns as `geo.SE.address`. Each reads one name, `{/geo.SE.address as a}`, -which the format prints whole as `{a}`, so the country's format is written once and -every column describes the address printed. A column is spelled the same in both, -`street-number`, so the two never disagree on a name. Valid while a record cannot read -another whole and keep its columns. +same four columns as `geo.SE.address`. Its format binds one name, +`{/geo.SE.address as a}`, and prints it whole as `{a}`. Each column reads one part of it, +`{a.street}`, so the country's format is written once and every column describes the +address printed. Valid while a record cannot read another whole and keep its columns. ## A postort's kommun comes from its name, its tätort or its codes, never from distance @@ -860,10 +859,10 @@ name is an error listing both keys; select by type instead. A Luhn-valid personnummer over a random birth number may be a living person's; 238 and 239 after any date are blocked from assignment, so the shipped `personnummer` and -`samordningsnummer` use those. They sit in a `birth-number` table under `sex` rather -than as a column of it, so a pick of a sex can read the number; `todo.md` item 28 has -`personnummer` read it that way, to agree with a person's sex, and `sex` stays one shape across locales instead of -collecting every sex-keyed id fact. A samordningsnummer's day, the birthday plus 60, is +`samordningsnummer` use those. They sit in a `birth-number` table under `sex`, not in a +column of it, so a pick of a sex can read the number, and `sex` keeps one shape across +locales. `todo.md` item 28 has `personnummer` read it that way, so the number agrees +with the person's sex. A samordningsnummer's day, the birthday plus 60, is drawn from 61 to 88, valid in every month, rather than computed from the date drawn. ## The US given names come from a mirror of the SSA file @@ -928,4 +927,4 @@ Valid while names are read only inside the category binding them. ## comprehension floor: every dimension and the overall at 7.0 or above; items 71, 4 and 90 ship with no scoring run, and item 5 scores them -2026-10-04, Lilleman auf Larv. Serves goal 3. The nine-seat panels in `todo.md`'s git history, 2026-09-22 to 2026-09-30, held the score between 5.2 and 6.1, with Locality lowest at every seat, and the hardest units are the draw fences item 4 deletes. Items 4 and 90 delete or move what the earlier items touch, so a scoring run before item 90 merges would score code about to go. Items 71, 4 and 90 finish the round `AGENTS.md`'s comprehension rule lets merge below the floor, a restructure the maintainer approved. No scoring run or panel runs until item 5, which runs the nine-seat panel and larv-review's scoring run. The scoring run writes this entry's first scores. Valid until item 5 runs. +2026-10-04, Lilleman auf Larv. Serves goal 3. The nine-seat panels in `todo.md`'s git history, 2026-09-22 to 2026-09-30, held the score between 5.2 and 6.1, with Locality lowest at every seat, and the hardest units are the draw fences item 4 deletes. Items 4 and 90 delete or move what item 71 touches, so a scoring run before item 90 merges would score code about to go. Items 71, 4 and 90 finish the round `AGENTS.md`'s comprehension rule lets merge below the floor, a restructure the maintainer approved. No scoring run or panel runs until item 5, which runs the nine-seat panel and larv-review's scoring run. The scoring run writes this entry's first scores. Valid until item 5 runs. diff --git a/todo.md b/todo.md index 99c8dd4..c2590ce 100644 --- a/todo.md +++ b/todo.md @@ -86,7 +86,7 @@ | 88 | 0.2.0 | | **Add a 12-digit `YYYYMMDDNNNC` form of `sv_SE.personnummer` and `sv_SE.samordningsnummer`, the form Skatteverket's testpersonnummer series and many systems store.** | 2 | 3 | 6 | 6 | 4 | 19.4 | | 41 | 0.2.0 | | **Key every table by one key column, as the decision "A table selects by one key column, a code, never a free-form name" states.** | 6 | 7 | 7 | 8 | 5.7 | 19.1 | | 52 | 0.2.0 | | **Name the file a link error comes from beside its category path, `sub.x (/d/a/sub/x.json): …`.** | 1 | 2 | 5 | 7 | 6 | 19.0 | -| 28 | 0.2.0 | | **Accept a middle name, and draw a `personnummer` whose sex matches a sex selected through a named pick.** | 4 | 4 | 6 | 7 | 4.1 | 18.9 | +| 28 | 0.2.0 | decision | **Accept a middle name, and draw a `personnummer` whose sex matches a sex selected through a named pick.** | 4 | 4 | 6 | 7 | 4.1 | 18.9 | | 24 | 0.2.0 | defect | **Stop `misc.territory[EH].tld` rendering `.eh`, the one shipped TLD `misc.tld` does not hold.** | 1 | 1 | 4 | 7 | 4 | 18.6 | | 53 | 0.2.0 | | **Let a table column carry a `datatype`, so `--format json` writes `"safe": true` and `--format sql` a boolean.** | 4 | 5 | 6 | 6 | 4 | 16.9 | | 55 | 0.2.0 | | **Document `NewRecordTemplate`, `ErrNoColumns`, `ErrNoData` and `MaxRepeat` in the README's Library section.** | 1 | 2 | 6 | 7 | 12 | 16.8 | @@ -231,7 +231,7 @@ Shape: T = table, t = template, c = choice. - Fixes on the way: `{/sel}|{/sel}` panics out of `Fake` today where two draws land on rows whose cells select different rows of another table; it must render. - Rewrites the README's References, Draw group, Correlated fields, Linked tables, Names and "One draw, one spelling" sections; the Linked tables section says which pick's weights govern a family, since the bound row decides. - Widens the refusal of a name read once to every binding, a path into it or a reference path bound included, since `{n.x}` read once is then `{/ref.x}`, and deletes the names fence over draw groups and nested repeats (`checkUses`, `readsHeld`). -- Say how a record's columns and a struct's tags read one pick, so `sv_SE.person.first` and `sv_SE.person.sex` beside each other still describe one person. +- Say how a record's columns and a struct's tags read one pick, so the `first` and `sex` columns of one `sv_SE.person` record, or one struct's tags reading them, still describe one person. - Re-pin seeded output and `testdata/shipped_shape.txt` in their own commits; the CHANGELOG names the grammar change. ### 57. Rewrite `CHANGELOG.md`'s `[Unreleased]` as what v0.1.0 holds.