diff --git a/AGENTS.md b/AGENTS.md index 410f2ee..30e2534 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -94,7 +94,7 @@ In [docs/decisions.md](docs/decisions.md): - A country's postal codes and streets are siblings under its locality - A locale's `address` reads its country's `geo` tree, so a locale folder is no data set on its own - The default embed holds every Swedish postort the import can place and give a street-delivery code and a street, and the US places of 25,000 or more -- A locale's `address` restates its country record's format +- A locale's `address` binds its country's record once and prints it whole - A postort's kommun comes from its name, its tätort or its codes, never from distance - A highway designation is not a street, and a US postal code belongs to the place holding most of its land inside places - `--list` stays a plain list of paths @@ -119,4 +119,4 @@ In [docs/decisions.md](docs/decisions.md): - `List` advertises direct descents only - A path draws through its compiled steps - A name lives in the category binding it, or in the repeat binding it, and is drawn on its first read -- comprehension floor: every dimension and the overall at 7.0 or above; items 71, 3, 4 and 90 ship with no scoring run, and item 5 scores 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 diff --git a/CHANGELOG.md b/CHANGELOG.md index b888b2d..6de4514 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,9 +69,10 @@ replacement, and each removed path, column or flag. - `geo.SE` and `geo.US`: five linked tables per country, `region`, `municipality`, `locality`, `postal-code` and `street`, weighted by population and address counts and built from SCB, GeoNames, Trafikverket NVDB and the US Census Bureau, and an - `address` record over one consistent draw of them. `sv_SE.address` and - `en_US.address` read those records, so `en_US.address.street` no longer carries - `name` and `suffix`, and a locale folder loads only beside `geo`. + `address` record binding one street and reading its locality, postal code and region + through it. `sv_SE.address` and `en_US.address` bind those records once, so + `en_US.address.street` no longer carries `name` and `suffix`, and a locale folder + loads only beside `geo`. - `{date(from,to,'layout')}` and `{time('layout')}`: a second between two days, or within one, in a single-quoted Go layout, drawn in UTC; `from` may equal `to`. `sv_SE.date`, `en_US.date`, `sv_SE.time` and `en_US.time` render through them, so @@ -80,12 +81,12 @@ replacement, and each removed path, column or flag. `{date(…,'2006')}`. `misc.datetime` is an RFC 3339 instant. - `sex`, `first-name` and `last-name` tables in `sv_SE` and `en_US`, weighted by bearers from SCB, the SSA and the Census Bureau; `first-name` links to `sex`, and a - name both sexes carry is a row under each. `person` reads them, so its columns are - `first`, `last`, `prefix` and `sex`; `person.femalefirst` and `person.malefirst` are - no longer paths — draw `sex[f].first-name` and `sex[m].first-name` instead. - `en_US.title` links to `sex` as well, so `en_US.person.prefix` draws `Mr` or `Ms` - without contradicting the record's `sex`; `sv_SE.title` is an unsexed table of the - same shape. + name both sexes carry is a row under each. `person` binds one first name and reads + its sex through it, and its columns are `first`, `last`, `prefix` and `sex`; + `person.femalefirst` and `person.malefirst` are no longer paths — draw + `sex[f].first-name` and `sex[m].first-name` instead. `en_US.title` links to `sex` as + well, so `en_US.person.prefix` draws `Mr` or `Ms` without contradicting the record's + `sex`; `sv_SE.title` is an unsexed table of the same shape. - `sv_SE.personnummer` and `sv_SE.samordningsnummer`, Skatteverket's test series from a `sv_SE.birth-number` table under `sex`, in place of `sv_SE.ssn`, whose `ssn.mmdd`, `ssn.mmdd.m` and `ssn.mmdd.d` go with it. `en_US.ssn` now draws the diff --git a/README.md b/README.md index c983a51..a2642ef 100644 --- a/README.md +++ b/README.md @@ -231,15 +231,15 @@ code for a sovereign one, or for one the register names no state for. SSA and the Census Bureau. `first-name` links to `sex`, so `sv_SE.sex[f].first-name` draws a woman's name, and a name both sexes carry is a row under each, so `en_US.sex[m].first-name[Taylor]` names the one a `first-name[Taylor]` alone cannot. -`person` reads one draw of the three, so its `first` and `sex` columns agree, and so -does a `personnummer` in the same render: its birth number, `sv_SE.birth-number` -under `sex`, is Skatteverket's test series, 238 for a woman and 239 for a man, which no -real person is ever given. `en_US.title` links to `sex` too, so a person's prefix -never contradicts it. +`person` binds one first name and reads its sex through it, `{.first-name as n}` and +`{n..sex.name}`, so its `first` and `sex` columns agree. `en_US.title` links to `sex` +too, so a person's prefix never contradicts it. A `personnummer`'s birth number, +`sv_SE.birth-number` under `sex`, is Skatteverket's test series, 238 for a woman and 239 +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` — while a shipped `personnummer` agrees with the sex its own render -*drew*, not with one a path selects. That test series is also small: a personnummer +`last-name` — while a shipped `personnummer` draws its own sex, apart from any `person` +beside it. That 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, @@ -249,8 +249,9 @@ your own. `sv_SE.date` and `en_US.date` are uniform over 1970-01-01 to 2029-12-3 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 over one -consistent draw of them, which the locale's `address` reads. +[linked tables](#linked-tables) named alike, and an `address` record binding one street and +reading its locality, postal code and region through it, which the locale's `address` +binds once and prints whole. | Table | `geo.SE` | `geo.US` | Weight | |-------|----------|----------|--------| @@ -743,8 +744,8 @@ anywhere: if `n`'s category has the format `{w}-{w}`, it draws `w` twice, and `{ A name is a pick of its own: `{t.name}` and `{/misc.territory.name}` beside it are two draws. A reference path the picked category reads is still held for the render as usual, so two names -bound to `sv_SE.person`, whose fields read `{.first-name.name}` and `{.last-name.name}`, print -the same first and last name unless their reads sit in two [draw groups](#draw-group). +bound to `sv_SE.person`, whose `last` reads `{.last-name.name}`, print the same last name unless +their reads sit in two [draw groups](#draw-group). A name is drawn on its first read, and lives in the category binding it: any field of the category may read it, and a record's columns read one pick. Each render of the category picks diff --git a/docs/decisions.md b/docs/decisions.md index c0e04f6..0c6258b 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -657,17 +657,16 @@ trees. Withdrawn by the maintainer on 2026-10-03; `todo.md` item 78 replaces it. -## A locale's `address` restates its country record's format +## A locale's `address` binds its country's record once and prints it whole -2026-09-18, Lilleman auf Larv. +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 a reference into it, and the format appears -twice; a column is spelled the same in both, `street-number`, so the two never disagree -on a name. - -`todo.md` item 3 revises this decision: the locale `address` prints `{a}` whole, so the -format appears once. +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. ## A postort's kommun comes from its name, its tätort or its codes, never from distance @@ -927,6 +926,6 @@ the render. 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, 3, 4 and 90 ship with no scoring run, and item 5 scores 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, 3, 4 and 90 are 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 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. diff --git a/todo.md b/todo.md index c0cfe6d..65e9586 100644 --- a/todo.md +++ b/todo.md @@ -70,7 +70,6 @@ | 61 | 0.1.0 | | **Add a locale, with its `geo/` tree, for each of the ten most-spoken languages and each Nordic country.** | 4 | 9 | 9 | 10 | 2.1 | 30.8 | | 16 | 0.1.0 | | **Add the remaining locale categories: company, phone, finance, vehicle, words.** | 3 | 8 | 8 | 9 | 2.2, 15 | 28.1 | | 15 | 0.1.0 | | **Add the remaining `misc` tables and templates, one row of its detail's table per chunk.** | 3 | 9 | 8 | 8 | 2, 15, 14 | 25.9 | -| 3 | 0.1.0 | decision | **Rewrite the shipped categories so facts that belong together come from one named pick.** | 5 | 5 | 8 | 9 | 4.1 | 25.0 | | 4 | 0.1.0 | decision | **Draw every `{…}` afresh, keep a pick only by name, and delete `drawGroup` with the fences that held picks implicitly.** | 7 | 8 | 8 | 10 | 5.2, 4.1 | 24.0 | | 57 | 0.1.0 | | **Rewrite `CHANGELOG.md`'s `[Unreleased]` as what v0.1.0 holds.** | 1 | 2 | 6 | 6 | 1.1 | 22.5 | | 34 | 0.1.0 | | **Add `{isin()}`, `{cusip()}`, `{aba()}` and `{vin()}`.** | 2 | 4 | 6 | 7 | 4 | 20.9 | @@ -225,16 +224,9 @@ Shape: T = table, t = template, c = choice. | `lorem`, `hacker`, `hipster`, `catchphrase`, `buzzword`, `quote` | T/c | lorem ipsum, LLM-written | — | | `direction`, `continent`, `ulid` | c/t | — | — | -### 3. Rewrite the shipped categories so facts that belong together come from one named pick. - -- `sv_SE.person` and `en_US.person` bind the first name and read sex and title through it: `"first": "{.first-name as n}{n.name}"`, `"sex": "{n..sex.name}"`, a title from `{n..sex.title.name}`. -- `geo.SE.address` and `geo.US.address` bind the street and read locality, postal code and region through it; the locale `address` categories bind `/geo.XX.address` once. They print it whole as `{a}`, so the country record's format appears once; revise the decision "A locale's `address` restates its country record's format". -- Every shipped value must still pass its consumer's check before and after item 4. -- Re-pin seeded output in its own commit. - ### 4. Draw every `{…}` afresh, keep a pick only by name, and delete `drawGroup` with the fences that held picks implicitly. -- Needs items 3 and 71. After it, `{/person} ({/person.first})` renders two people, as does `{/sv_SE.person as a}{/sv_SE.person as b}{a} & {b}`. `{w} {uppercase(w)}` renders `b G` where `w` is a choice of letters, and `{/city.name}, {/country[SE].name}` and `{/country[SE].name} / {/country[NO].name}` both load. +- Needs item 71. After it, `{/person} ({/person.first})` renders two people, as does `{/sv_SE.person as a}{/sv_SE.person as b}{a} & {b}`. `{w} {uppercase(w)}` renders `b G` where `w` is a choice of letters, and `{/city.name}, {/country[SE].name}` and `{/country[SE].name} / {/country[NO].name}` both load. - Deletes the token-order rules (`drawsApart`, `readFold`, `branches`, the pairwise replay), the expansion hold fence, `drawGroup`, the own-family fence and the cell-reference fences, and revises the decisions that point here. The remaining draw checks are names, paths through names, cycles and the repeat cap. - 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. @@ -251,7 +243,7 @@ Nothing has shipped, so "no longer paths", "where it used to fail" and "where it ### 5. Run the nine-seat comprehension panel after the draw restructure, and file what it names. -Needs items 71, 3, 4 and 90. The decision "comprehension floor: every dimension and the overall at 7.0 or above; items 71, 3, 4 and 90 ship with no scoring run, and item 5 scores them" suspends every scoring run and panel until then. +Needs items 71, 4 and 90. The decision "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" suspends every scoring run and panel until then. ### 71. Accept a name as a `calc` operand, so `{calc(n * 2)}` computes from the pick `{n}` prints.