Answer the prose review: decision lines by goal, item details true after the restructure, defects kept
This commit is contained in:
+14
-10
@@ -30,6 +30,8 @@ teach the exported API belongs above the clause.
|
||||
every other key is a field. Nesting fields under a key, or prefixing options, would tax
|
||||
every template to guard against a misspelt option.
|
||||
|
||||
`todo.md` item 4 deletes `drawGroup`, which this reserves.
|
||||
|
||||
## `{a|b}` stays beside nested choices
|
||||
|
||||
2026-09-02, Lilleman auf Larv.
|
||||
@@ -114,7 +116,7 @@ pins its level, and a fresh draw of a pinned level could show another row. A bui
|
||||
operand holds what it reads for its expansion, references included, so
|
||||
`{uppercase(/p)} {/p}` is one draw, and `{/p}` written twice beside it is a load error.
|
||||
|
||||
Works against goal 4's every-`{…}`-is-a-new-pick aims until `todo.md` item 4 ends it.
|
||||
Goal 4.2 overrides this; `todo.md` item 4 replaces it.
|
||||
|
||||
## Reference sigils follow the filesystem
|
||||
|
||||
@@ -293,7 +295,7 @@ rather than two copies of it. Only references share: a sibling field is local to
|
||||
expansion, so a `first` column does not silently bind to a `first` in the column next to
|
||||
it.
|
||||
|
||||
Works against goal 4's every-`{…}`-is-a-new-pick aims until `todo.md` item 4 ends it.
|
||||
Goal 4.2 overrides this; `todo.md` item 4 replaces it.
|
||||
|
||||
## A draw group name is local to its category
|
||||
|
||||
@@ -304,7 +306,7 @@ joins them by accident, and renaming a group inside one file changes no render
|
||||
elsewhere. The unnamed group still spans categories, since facts that belong together
|
||||
across categories must agree.
|
||||
|
||||
Works against goal 4's every-`{…}`-is-a-new-pick aims until `todo.md` item 4 ends it.
|
||||
`todo.md` item 4 deletes what this decides.
|
||||
|
||||
## The expansion hold and the render's draws are two fences
|
||||
|
||||
@@ -316,7 +318,7 @@ rows agree across a render and its draw groups. Their scopes differ and only the
|
||||
tracks rows and pins, so one walk would carry both scopes and tell them apart at every
|
||||
step.
|
||||
|
||||
Works against goal 4's every-`{…}`-is-a-new-pick aims until `todo.md` item 4 ends it.
|
||||
`todo.md` item 4 deletes what this decides.
|
||||
|
||||
## A render's draws make their maps on the first read
|
||||
|
||||
@@ -329,7 +331,7 @@ cost the cheapest render two heap allocations and 240→390 ns, measured 2026-09
|
||||
Lazily, a render reading a reference path pays those two allocations, a record or struct
|
||||
included, and one reading none pays nothing; goal 11 holds either way.
|
||||
|
||||
Works against goal 4's every-`{…}`-is-a-new-pick aims until `todo.md` item 4 ends it.
|
||||
`todo.md` item 4 deletes what this decides.
|
||||
|
||||
## A category never references itself, and a record's fences run at load
|
||||
|
||||
@@ -346,6 +348,8 @@ reads those fences weigh differs on purpose: a record-only template's inert form
|
||||
renders nothing, so a `drawGroup` on it can never matter and is refused, while one on a
|
||||
rendering format can matter to a caller that bare-references it.
|
||||
|
||||
`todo.md` item 4 deletes the `drawGroup` refusal this names.
|
||||
|
||||
## A record's column set is fixed before the first draw
|
||||
|
||||
2026-09-04, Lilleman auf Larv.
|
||||
@@ -483,7 +487,7 @@ exactly one row.
|
||||
Checked against three simulated template writers from the Audience, who agreed on each
|
||||
case but the last, where two expected a render and all three accepted the refusal.
|
||||
|
||||
Works against goal 4's every-`{…}`-is-a-new-pick aims until `todo.md` item 4 ends it.
|
||||
Goal 4.2 overrides its shared draw beneath a selection and its refusal of an unnamed read; `todo.md` item 4 replaces them.
|
||||
|
||||
## A link column after a row steps up to the parent row, and a path may not end on it
|
||||
|
||||
@@ -513,7 +517,7 @@ Checked against three simulated template writers from the Audience: all three re
|
||||
parent row where a segment followed, and they split between the code and the name where
|
||||
the path ended.
|
||||
|
||||
Works against goal 4's every-`{…}`-is-a-new-pick aims until `todo.md` item 2 ends it.
|
||||
Goal 4.4 overrides this; `todo.md` item 2 replaces it.
|
||||
|
||||
## A table selects by one key column, a code, never a free-form name
|
||||
|
||||
@@ -581,7 +585,7 @@ A `repeat` iteration and a `drawGroup` each draw apart on purpose, but a row tha
|
||||
three localities from other regions is the output the family exists to prevent, so the
|
||||
own-family fence walks through both rather than stopping where the draw fences do.
|
||||
|
||||
Works against goal 4's every-`{…}`-is-a-new-pick aims until `todo.md` item 4 ends it.
|
||||
`todo.md` item 4 deletes what this decides.
|
||||
|
||||
## A cell may read a reference, and each row its own
|
||||
|
||||
@@ -592,7 +596,7 @@ Goal 3: facts that belong together come from one draw, so a shop row's `phone` c
|
||||
format, the same for every row, cannot say that. A restructure for goal 2 keeps the fences
|
||||
that prove such cells safe. Valid while a table's rows need generators of their own.
|
||||
|
||||
Works against goal 4's every-`{…}`-is-a-new-pick aims until `todo.md` item 4 ends it.
|
||||
`todo.md` item 4 deletes the fences this keeps; a cell may still read a reference.
|
||||
|
||||
## Tables carrying token cells stay small
|
||||
|
||||
@@ -604,7 +608,7 @@ its rows: about a second at four thousand rows. No shipped table carries such ce
|
||||
a register is a column set rather than a set of references, so the fence is left as it
|
||||
is until a real data set needs the indexed form.
|
||||
|
||||
Works against goal 4's every-`{…}`-is-a-new-pick aims until `todo.md` item 4 ends it.
|
||||
`todo.md` item 4 deletes what this decides.
|
||||
|
||||
## A path is walked once without drawing before it is walked for real
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
`Bar = 9`
|
||||
|
||||
`Next ID = 62`
|
||||
`Next ID = 64`
|
||||
|
||||
| Goal | W |
|
||||
|---|---|
|
||||
@@ -49,103 +49,103 @@
|
||||
|
||||
| ID | Release | Exempt | Item | R | S | A | G | Goals | Score |
|
||||
|---|---|---|---|---|---|---|---|---|---|
|
||||
| 51 | 0.1.0 | | **Ship prebuilt binaries, a container image, Homebrew and Scoop, so the CLI needs no Go.** | 3 | 6 | 8 | 9 | 1.1, 6 | 29.0 |
|
||||
| 53 | 0.1.0 | | **Ship prebuilt binaries, a container image, Homebrew and Scoop, so the CLI needs no Go.** | 3 | 6 | 8 | 9 | 1.1, 6 | 29.0 |
|
||||
| 1 | 0.1.0 | | **Bind a pick to a name with `{x as n}`, read it with `{n}` and `{n.path}`, and refuse a name bound twice.** | 4 | 6 | 8 | 9 | 4.3, 3.1 | 24.2 |
|
||||
| 3 | 0.1.0 | | **Rewrite the shipped categories so facts that belong together come from one named pick.** | 5 | 5 | 8 | 9 | 3.1 | 23.4 |
|
||||
| 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 | 4.2, 3.1 | 22.2 |
|
||||
| 24 | 0.1.0 | defect | **Draw `en_US.phone`'s `exch` as a NANP central office code, and assert the rule in `TestShippedUSPhone`.** | 2 | 2 | 6 | 8 | 3 | 22.1 |
|
||||
| 50 | 0.1.0 | | **Rewrite `CHANGELOG.md`'s `[Unreleased]` as what v0.1.0 holds.** | 1 | 2 | 6 | 6 | 1.1 | 22.1 |
|
||||
| 23 | 0.1.0 | defect | **Draw `en_US.phone`'s `exch` as a NANP central office code, and assert the rule in `TestShippedUSPhone`.** | 2 | 2 | 6 | 8 | 3 | 22.1 |
|
||||
| 52 | 0.1.0 | | **Rewrite `CHANGELOG.md`'s `[Unreleased]` as what v0.1.0 holds.** | 1 | 2 | 6 | 6 | 1.1 | 22.1 |
|
||||
| 5 | 0.1.0 | | **Run the nine-seat comprehension panel after the draw restructure, and file what it names.** | 1 | 3 | 3 | 9 | 2 | 21.2 |
|
||||
| 25 | 0.1.0 | defect | **Give a `sv_SE.personnummer` over 100 the `+` separator Skatteverket spells, or stop drawing birthdates that reach 100.** | 2 | 2 | 5 | 8 | 3 | 20.1 |
|
||||
| 32 | 0.1.0 | | **Add `{isin()}`, `{cusip()}`, `{aba()}` and `{vin()}`.** | 2 | 4 | 6 | 7 | 3 | 20.1 |
|
||||
| 13 | 0.1.0 | defect | **Strip the whitespace `data-import/territory.py` copies from its register.** | 1 | 1 | 5 | 7 | 3 | 19.8 |
|
||||
| 24 | 0.1.0 | defect | **Give a `sv_SE.personnummer` over 100 the `+` separator Skatteverket spells, or stop drawing birthdates that reach 100.** | 2 | 2 | 5 | 8 | 3 | 20.1 |
|
||||
| 31 | 0.1.0 | | **Add `{isin()}`, `{cusip()}`, `{aba()}` and `{vin()}`.** | 2 | 4 | 6 | 7 | 3 | 20.1 |
|
||||
| 12 | 0.1.0 | defect | **Strip the whitespace `data-import/territory.py` copies from its register.** | 1 | 1 | 5 | 7 | 3 | 19.8 |
|
||||
| 6 | 0.1.0 | question | **Decide how the comprehension gate treats panel noise: identical code scored 5.7 and 5.4.** | 1 | 1 | 3 | 8 | 2 | 19.8 |
|
||||
| 2 | 0.1.0 | decision | **Step up from a row to the row it links to with `..`: `{/city[Oslo]..country.name}` renders `Norway`, and `city[Oslo].country` stays the cell `NO`.** | 4 | 5 | 7 | 8 | 4.4 | 18.7 |
|
||||
| 23 | 0.1.0 | defect | **Stop `misc.territory[EH].tld` rendering `.eh`, the one shipped TLD `misc.tld` does not hold.** | 1 | 1 | 4 | 7 | 3 | 17.8 |
|
||||
| 27 | 0.1.0 | | **Accept a middle name, and draw a `personnummer` whose sex matches a selected sex, by name.** | 4 | 4 | 6 | 7 | 3.1 | 17.6 |
|
||||
| 47 | 0.1.0 | | **Let a table column carry a `datatype`, so `--format json` writes `"safe": true` and `--format sql` a boolean.** | 4 | 5 | 6 | 6 | 3 | 16.2 |
|
||||
| 19 | 0.1.0 | | **Give the address records one column set across countries: `region` and `municipality` as columns on `geo.SE.address` too.** | 4 | 4 | 6 | 6 | 4 | 15.9 |
|
||||
| 48 | 0.1.0 | defect | **Read the tag through `git/ref/tags/{tag}` in `publish_release.py`.** | 2 | 1 | 3 | 6 | 1.1 | 15.4 |
|
||||
| 46 | 0.1.0 | | **Name the file a link error comes from beside its category path, `sub.x (/d/a/sub/x.json): …`.** | 1 | 2 | 5 | 7 | 5 | 15.1 |
|
||||
| 34 | 0.1.0 | | **Report every mistake a load finds in one error, as the decision "A load reports every mistake at once" states.** | 5 | 6 | 7 | 8 | 5 | 15.0 |
|
||||
| 20 | 0.1.0 | defect | **Weight `sv_SE.sex` and `en_US.sex` by bearers, as the README's Data section says they are.** | 2 | 2 | 4 | 6 | 3 | 15.0 |
|
||||
| 38 | 0.1.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 | 4.7 | 14.7 |
|
||||
| 18 | 0.1.0 | | **Give every shipped category building-block columns, and one record shape across the national ids; re-pin the shape.** | 5 | 6 | 6 | 6 | 4 | 14.4 |
|
||||
| 22 | 0.1.0 | defect | **Stop `misc.territory[EH].tld` rendering `.eh`, the one shipped TLD `misc.tld` does not hold.** | 1 | 1 | 4 | 7 | 3 | 17.8 |
|
||||
| 26 | 0.1.0 | | **Accept a middle name, and draw a `personnummer` whose sex matches a sex selected through a named pick.** | 4 | 4 | 6 | 7 | 3.1 | 17.6 |
|
||||
| 48 | 0.1.0 | | **Let a table column carry a `datatype`, so `--format json` writes `"safe": true` and `--format sql` a boolean.** | 4 | 5 | 6 | 6 | 3 | 16.2 |
|
||||
| 18 | 0.1.0 | | **Give the address records one column set across countries: `region` and `municipality` as columns on `geo.SE.address` too.** | 4 | 4 | 6 | 6 | 4 | 15.9 |
|
||||
| 49 | 0.1.0 | defect | **Read the tag through `git/ref/tags/{tag}` in `publish_release.py`.** | 2 | 1 | 3 | 6 | 1.1 | 15.4 |
|
||||
| 47 | 0.1.0 | | **Name the file a link error comes from beside its category path, `sub.x (/d/a/sub/x.json): …`.** | 1 | 2 | 5 | 7 | 5 | 15.1 |
|
||||
| 33 | 0.1.0 | | **Report every mistake a load finds in one error, as the decision "A load reports every mistake at once" states.** | 5 | 6 | 7 | 8 | 5 | 15.0 |
|
||||
| 19 | 0.1.0 | defect | **Weight `sv_SE.sex` and `en_US.sex` by bearers, as the README's Data section says they are.** | 2 | 2 | 4 | 6 | 3 | 15.0 |
|
||||
| 37 | 0.1.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 | 4.7 | 14.7 |
|
||||
| 17 | 0.1.0 | | **Give every shipped category a column for each part its format composes, and one record shape across the national ids; re-pin the shape.** | 5 | 6 | 6 | 6 | 4 | 14.4 |
|
||||
| 43 | 0.1.0 | defect | **Refuse a `Fake` path into a level carrying a `repeat`, as the README's Correlated fields section states.** | 2 | 2 | 4 | 6 | 4 | 14.4 |
|
||||
| 49 | 0.1.0 | | **Document `NewRecordTemplate`, `ErrNoColumns`, `ErrNoData` and `MaxRepeat` in the README's Library section.** | 1 | 2 | 6 | 7 | 10 | 14.1 |
|
||||
| 28 | 0.1.0 | | **Let a path go from a selected row into the template beside its family: `geo.US.locality[1714000].address`.** | 4 | 4 | 5 | 6 | 4 | 13.9 |
|
||||
| 30 | 0.1.0 | | **Add `misc.browser` as the parent of `misc.useragent`, so `misc.browser[Chrome].useragent` resolves.** | 3 | 3 | 4 | 6 | 3.1 | 13.4 |
|
||||
| 7 | 0.1.0 | | **Walk a path in one function: fold `probePath` into `pathCheck.walk`.** | 4 | 4 | 3 | 7 | 2.2 | 13.3 |
|
||||
| 14 | 0.1.0 | defect | **Place xlsx cells by their `r` reference in `data-import/xlsx.py`.** | 2 | 2 | 3 | 6 | 3 | 13.0 |
|
||||
| 11 | 0.1.0 | | **Test that every node kind reaches each switch over node kinds.** | 1 | 3 | 2 | 6 | 2.2 | 12.8 |
|
||||
| 16 | 0.1.0 | | **Add the remaining `misc` tables and templates, one row of the table below per chunk.** | 3 | 9 | 8 | 7 | 13, 12 | 12.4 |
|
||||
| 12 | 0.1.0 | | **Test that every `geo` tree holds the five table names and the `address` columns that port across countries.** | 1 | 2 | 3 | 5 | 3 | 12.4 |
|
||||
| 50 | 0.1.0 | | **Document `NewRecordTemplate`, `ErrNoColumns`, `ErrNoData` and `MaxRepeat` in the README's Library section.** | 1 | 2 | 6 | 7 | 10 | 14.1 |
|
||||
| 27 | 0.1.0 | | **Let a path go from a selected row into the template beside its family: `geo.US.locality[1714000].address`.** | 4 | 4 | 5 | 6 | 4 | 13.9 |
|
||||
| 29 | 0.1.0 | | **Add `misc.browser` as the parent of `misc.useragent`, so `misc.browser[Chrome].useragent` resolves.** | 3 | 3 | 4 | 6 | 3.1 | 13.4 |
|
||||
| 13 | 0.1.0 | defect | **Place xlsx cells by their `r` reference in `data-import/xlsx.py`.** | 2 | 2 | 3 | 6 | 3 | 13.0 |
|
||||
| 10 | 0.1.0 | | **Test that every node kind reaches each switch over node kinds.** | 1 | 3 | 2 | 6 | 2.2 | 12.8 |
|
||||
| 15 | 0.1.0 | | **Add the remaining `misc` tables and templates, one row of its detail's table per chunk.** | 3 | 9 | 8 | 7 | 13, 12 | 12.4 |
|
||||
| 11 | 0.1.0 | | **Test that every `geo` tree holds the five table names and the `address` columns that port across countries.** | 1 | 2 | 3 | 5 | 3 | 12.4 |
|
||||
| 45 | 0.1.0 | | **Reword `prove`'s refusal of a typed column reading a row, `{/region}`.** | 1 | 2 | 4 | 6 | 5 | 12.1 |
|
||||
| 17 | 0.1.0 | | **Add the remaining locale categories: company, phone, finance, vehicle, words.** | 3 | 8 | 8 | 7 | 13 | 11.8 |
|
||||
| 9 | 0.1.0 | | **Move `binding`, `bind` and `checkNodeFences` out of `data.go` into a file of their own.** | 1 | 2 | 2 | 5 | 2.1 | 11.6 |
|
||||
| 10 | 0.1.0 | | **Move `table.route`, `selector`, `step` and `drawStep` from `path.go` to `table.go`.** | 1 | 2 | 2 | 5 | 2.1 | 11.6 |
|
||||
| 29 | 0.1.0 | | **Rename `misc.territory.country` to `sovereign`.** | 3 | 2 | 4 | 7 | 4.8 | 11.5 |
|
||||
| 39 | 0.1.0 | | **Refuse a struct tag's `datatype` naming the Go type that sets it before proving its values, as the README's Library section promises.** | 2 | 2 | 4 | 6 | 5 | 11.1 |
|
||||
| 26 | 0.1.0 | | **Merge `en_US.ip` and `sv_SE.ip`, today byte-identical, into one `misc.ip`.** | 3 | 2 | 4 | 6 | 4.7 | 10.9 |
|
||||
| 15 | 0.1.0 | | **Spell `misc.creditcard`'s digit runs `{digits(n)}`, and refuse a repeat over a lone `{digits(1)}` at `New`, naming that spelling.** | 3 | 3 | 4 | 6 | 4.7 | 10.6 |
|
||||
| 22 | 0.1.0 | | **Give `url` and `email` a path that draws only domains nobody can register, keeping the wide set as the default.** | 3 | 4 | 7 | 8 | 14 | 10.5 |
|
||||
| 36 | 0.1.0 | defect | **Compare `calcParser.binary`'s operator as a rune.** | 1 | 1 | 3 | 6 | 5 | 10.4 |
|
||||
| 41 | 0.1.0 | | **Name the node a selector follows in `stepInto`'s refusal.** | 1 | 1 | 3 | 6 | 5 | 10.4 |
|
||||
| 16 | 0.1.0 | | **Add the remaining locale categories: company, phone, finance, vehicle, words.** | 3 | 8 | 8 | 7 | 13 | 11.8 |
|
||||
| 8 | 0.1.0 | | **Move `binding`, `bind` and `checkNodeFences` out of `data.go` into a file of their own.** | 1 | 2 | 2 | 5 | 2.1 | 11.6 |
|
||||
| 9 | 0.1.0 | | **Move `table.route`, `selector`, `step` and `drawStep` from `path.go` to `table.go`.** | 1 | 2 | 2 | 5 | 2.1 | 11.6 |
|
||||
| 28 | 0.1.0 | | **Rename `misc.territory.country` to `sovereign`.** | 3 | 2 | 4 | 7 | 4.8 | 11.5 |
|
||||
| 38 | 0.1.0 | | **Refuse a struct tag's `datatype` naming the Go type that sets it before proving its values, as the README's Library section promises.** | 2 | 2 | 4 | 6 | 5 | 11.1 |
|
||||
| 25 | 0.1.0 | | **Merge `en_US.ip` and `sv_SE.ip`, today byte-identical, into one `misc.ip`.** | 3 | 2 | 4 | 6 | 4.7 | 10.9 |
|
||||
| 14 | 0.1.0 | | **Spell `misc.creditcard`'s digit runs `{digits(n)}`, and refuse a repeat over a lone `{digits(1)}` at `New`, naming that spelling.** | 3 | 3 | 4 | 6 | 4.7 | 10.6 |
|
||||
| 21 | 0.1.0 | | **Give `url` and `email` a path that draws only domains nobody can register, keeping the wide set as the default.** | 3 | 4 | 7 | 8 | 14 | 10.5 |
|
||||
| 35 | 0.1.0 | defect | **Compare `calcParser.binary`'s operator as a rune.** | 1 | 1 | 3 | 6 | 5 | 10.4 |
|
||||
| 40 | 0.1.0 | | **Name the node a selector follows in `stepInto`'s refusal.** | 1 | 1 | 3 | 6 | 5 | 10.4 |
|
||||
| 44 | 0.1.0 | | **Report a CRLF rows file holding only its header as having no rows.** | 1 | 1 | 3 | 6 | 5 | 10.4 |
|
||||
| 31 | 0.1.0 | | **Group `data/misc` into folders where a group name makes a path easier to guess.** | 4 | 5 | 4 | 5 | 4 | 10.2 |
|
||||
| 37 | 0.1.0 | | **Stop the `columnKinds` suggestion naming a field's own kind or a narrower one.** | 1 | 2 | 3 | 6 | 5 | 10.1 |
|
||||
| 42 | 0.1.0 | | **Report the same error every load for a table with two bad options, and for a folder with two unnamed rows files.** | 2 | 2 | 3 | 7 | 5, 8 | 10.1 |
|
||||
| 33 | 0.1.0 | | **Add `{base64url(n)}` for JWT shapes.** | 1 | 2 | 4 | 5 | 7 | 10.0 |
|
||||
| 21 | 0.1.0 | | **List `title` in both locales, and `sv_SE`'s `birth-number`, in the README's Data list of what each locale carries.** | 1 | 1 | 4 | 6 | 10 | 9.9 |
|
||||
| 8 | 0.1.0 | | **Fill `arm` in one place.** | 4 | 4 | 2 | 6 | 2.2 | 9.6 |
|
||||
| 35 | 0.1.0 | | **Rename `newRand` to `newGeneratorState` and `Generator.rand` to `state`.** | 1 | 1 | 1 | 5 | 2.3 | 9.2 |
|
||||
| 40 | 0.1.0 | | **Call `templateError` a compile failure in its doc.** | 1 | 1 | 1 | 5 | 2.3 | 9.2 |
|
||||
| 55 | 0.2.0 | | **Pair a street with its exact postnummer.** | 3 | 6 | 5 | 8 | 3.1 | 17.7 |
|
||||
| 54 | 0.2.0 | | **Add `{btc()}` and `{eth()}`.** | 2 | 4 | 4 | 6 | 3 | 14.5 |
|
||||
| 52 | 0.2.0 | | **Promise in `Generator`'s godoc that its renders run one at a time.** | 1 | 1 | 5 | 5 | 10 | 11.3 |
|
||||
| 58 | 0.2.0 | | **Cut the README's Layout block to the lines that say what a file name cannot.** | 1 | 1 | 2 | 5 | 2.4 | 10.9 |
|
||||
| 53 | 0.2.0 | | **Add the locales nb_NO, da_DK, fi_FI, de_DE, en_GB, nl_NL, fr_FR and es_ES, and their `geo/` trees.** | 4 | 9 | 8 | 7 | 13 | 10.6 |
|
||||
| 59 | 0.2.0 | | **Cut `AGENTS.md` to the rules only it states, and explain every term its comprehension rule uses.** | 1 | 2 | 1 | 6 | 2.4 | 10.3 |
|
||||
| 57 | 0.2.0 | | **Hold every change `AGENTS.md` says owes a `CHANGELOG.md` entry to one in CI.** | 2 | 3 | 4 | 5 | 4.8 | 10.2 |
|
||||
| 56 | 0.2.0 | | **Give every entry in `docs/decisions.md` the goal it serves, its date, who made it and the premise it rests on.** | 1 | 4 | 1 | 6 | 2.4 | 9.8 |
|
||||
| 60 | 1.0.0 | | **Announce v1.0.0 where a developer choosing a fake-data tool already reads, with a README first screen for someone deciding in a minute.** | 1 | 3 | 7 | 9 | 1.1 | 29.7 |
|
||||
| 61 | 1.0.0 | | **Publish a homepage with an in-browser generator, the library compiled to WebAssembly.** | 3 | 6 | 6 | 6 | 1.1 | 19.1 |
|
||||
| 30 | 0.1.0 | | **Group `data/misc` into folders where a group name makes a path easier to guess.** | 4 | 5 | 4 | 5 | 4 | 10.2 |
|
||||
| 36 | 0.1.0 | | **Stop the `columnKinds` suggestion naming a field's own kind or a narrower one.** | 1 | 2 | 3 | 6 | 5 | 10.1 |
|
||||
| 46 | 0.1.0 | | **Spell a table one way across the errors that name it.** | 1 | 2 | 3 | 6 | 5 | 10.1 |
|
||||
| 41 | 0.1.0 | | **Report the same error every load for a table with two bad options, and for a folder with two unnamed rows files.** | 2 | 2 | 3 | 7 | 5, 8 | 10.1 |
|
||||
| 32 | 0.1.0 | | **Add `{base64url(n)}` for JWT shapes.** | 1 | 2 | 4 | 5 | 7 | 10.0 |
|
||||
| 20 | 0.1.0 | | **List `title` in both locales, and `sv_SE`'s `birth-number`, in the README's Data list of what each locale carries.** | 1 | 1 | 4 | 6 | 10 | 9.9 |
|
||||
| 7 | 0.1.0 | | **Fill `arm` in one place.** | 4 | 4 | 2 | 6 | 2.2 | 9.6 |
|
||||
| 34 | 0.1.0 | | **Rename `newRand` to `newGeneratorState` and `Generator.rand` to `state`.** | 1 | 1 | 1 | 5 | 2.3 | 9.2 |
|
||||
| 39 | 0.1.0 | | **Call `templateError` a compile failure in its doc.** | 1 | 1 | 1 | 5 | 2.3 | 9.2 |
|
||||
| 51 | 0.1.0 | defect | **Build on a manual run of `test.yml`.** | 1 | 1 | 1 | 4 | 1 | 8.8 |
|
||||
| 42 | 0.1.0 | defect | **Refuse a category naming a hidden rows file, `"rows": ".x.tsv"`, as a rows file that is not there.** | 1 | 1 | 2 | 5 | 5 | 7.4 |
|
||||
| 57 | 0.2.0 | | **Pair a street with its exact postnummer.** | 3 | 6 | 5 | 8 | 3.1 | 17.7 |
|
||||
| 56 | 0.2.0 | | **Add `{btc()}` and `{eth()}`.** | 2 | 4 | 4 | 6 | 3 | 14.5 |
|
||||
| 54 | 0.2.0 | | **Promise in `Generator`'s godoc that its renders run one at a time.** | 1 | 1 | 5 | 5 | 10 | 11.3 |
|
||||
| 60 | 0.2.0 | | **Cut the README's Layout block to the lines that say what a file name cannot.** | 1 | 1 | 2 | 5 | 2.4 | 10.9 |
|
||||
| 55 | 0.2.0 | | **Add the locales nb_NO, da_DK, fi_FI, de_DE, en_GB, nl_NL, fr_FR and es_ES, and their `geo/` trees.** | 4 | 9 | 8 | 7 | 13 | 10.6 |
|
||||
| 61 | 0.2.0 | | **Cut `AGENTS.md` to the rules only it states, and explain every term its comprehension rule uses.** | 1 | 2 | 1 | 6 | 2.4 | 10.3 |
|
||||
| 59 | 0.2.0 | | **Hold every change `AGENTS.md` says owes a `CHANGELOG.md` entry to one in CI.** | 2 | 3 | 4 | 5 | 4.8 | 10.2 |
|
||||
| 58 | 0.2.0 | | **Give every entry in `docs/decisions.md` the goal it serves, its date, who made it and the premise it rests on.** | 1 | 4 | 1 | 6 | 2.4 | 9.8 |
|
||||
| 62 | 1.0.0 | | **Announce v1.0.0 where a developer choosing a fake-data tool already reads, with a README first screen for someone deciding in a minute.** | 1 | 3 | 7 | 9 | 1.1 | 29.7 |
|
||||
| 63 | 1.0.0 | | **Publish a homepage with an in-browser generator, the library compiled to WebAssembly.** | 3 | 6 | 6 | 6 | 1.1 | 19.1 |
|
||||
|
||||
## Details
|
||||
|
||||
### 51. Ship prebuilt binaries, a container image, Homebrew and Scoop, so the CLI needs no Go.
|
||||
### 53. Ship prebuilt binaries, a container image, Homebrew and Scoop, so the CLI needs no Go.
|
||||
|
||||
GoReleaser attaches them to the release the tag workflow publishes. A checkout build prints `devel` for `--version`; the binaries carry the stamped tag.
|
||||
|
||||
### 1. Bind a pick to a name with `{x as n}`, read it with `{n}` and `{n.path}`, and refuse a name bound twice.
|
||||
|
||||
- A binding prints nothing: `{/person as p}{p}` renders `Erik Lind`, and `{p.last}` beside it `Lind`.
|
||||
- A name is one pick of everything under it, drawn once: `{/country as k} {k.city.name} ({k.city.population})` is one city of `k`'s country.
|
||||
- A name is visible in the template that binds it and everything that template renders, its sibling fields and a record's columns included, so one field may bind and another read.
|
||||
- A name bound inside a `repeat` level picks again on every iteration; one bound outside it keeps its pick on every line.
|
||||
- Refused at load: a name bound twice in one scope, and a name that is also a field or an option of the template, since options and fields share one namespace.
|
||||
- Lands before item 4 changes what an unnamed `{…}` does, so the shipped data can move to names first (item 3).
|
||||
|
||||
### 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.
|
||||
- Needs items 1 and 2. Every shipped value must still pass its consumer's check before and after item 4.
|
||||
- Needs item 1 and 2. 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 1–3. After it, `{/person} ({/person.first})` renders two people, `{w} {uppercase(w)}` renders `b G`, 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` and the decisions that reverse with them. The remaining load checks are names, paths through names, cycles and the repeat cap.
|
||||
- Needs items 1–3. After it, `{/person} ({/person.first})` renders two people, `{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 and "One draw, one spelling" sections; the Linked tables section says which pick's weights govern a family, since the bound row decides.
|
||||
- Re-pin seeded output and `testdata/shipped_shape.txt` in their own commits; the CHANGELOG names the grammar change.
|
||||
|
||||
### 24. Draw `en_US.phone`'s `exch` as a NANP central office code, and assert the rule in `TestShippedUSPhone`.
|
||||
### 23. Draw `en_US.phone`'s `exch` as a NANP central office code, and assert the rule in `TestShippedUSPhone`.
|
||||
|
||||
`{int(100,999)}` renders a leading 1 in about an eighth of draws, which libphonenumber rejects, and the test proves the shape rather than the rule.
|
||||
|
||||
### 50. Rewrite `CHANGELOG.md`'s `[Unreleased]` as what v0.1.0 holds.
|
||||
### 52. Rewrite `CHANGELOG.md`'s `[Unreleased]` as what v0.1.0 holds.
|
||||
|
||||
Nothing has shipped, so "no longer paths", "where it used to fail" and "where it used to be an empty string" describe versions no reader can have installed.
|
||||
|
||||
@@ -153,15 +153,15 @@ Nothing has shipped, so "no longer paths", "where it used to fail" and "where it
|
||||
|
||||
Needs item 4, and runs as item 6 decides.
|
||||
|
||||
### 25. Give a `sv_SE.personnummer` over 100 the `+` separator Skatteverket spells, or stop drawing birthdates that reach 100.
|
||||
### 24. Give a `sv_SE.personnummer` over 100 the `+` separator Skatteverket spells, or stop drawing birthdates that reach 100.
|
||||
|
||||
The format hard-codes `-`, and the 1930 floor makes the oldest draws invalid from 2031.
|
||||
|
||||
### 32. Add `{isin()}`, `{cusip()}`, `{aba()}` and `{vin()}`.
|
||||
### 31. Add `{isin()}`, `{cusip()}`, `{aba()}` and `{vin()}`.
|
||||
|
||||
`isin`: Luhn over letters expanded to digits. `aba`: 3-7-1 weights. `vin`: position 9 over the whole; a sample taking the WMI, since the check sits mid-string.
|
||||
|
||||
### 13. Strip the whitespace `data-import/territory.py` copies from its register.
|
||||
### 12. Strip the whitespace `data-import/territory.py` copies from its register.
|
||||
|
||||
`misc.territory[CW].capital` renders ` Willemstad`, with a leading space.
|
||||
|
||||
@@ -182,45 +182,45 @@ Two nine-seat runs on `5cb919e`, same briefs, same model, 2026-09-30:
|
||||
| Architect inherited | 6 | 6 |
|
||||
| Mean (Navigation / Locality / Shape / Self-sufficiency) | 5.7 (7.0 / 5.1 / 5.9 / 5.7) | 5.4 (6.3 / 4.8 / 5.8 / 5.3) |
|
||||
|
||||
Both runs named the same hardest units, `drawsApart` and `readFold.reads`. Every score since 2026-09-20 (5.7–6.1) sits inside this spread, and `AGENTS.md`'s "no merge lowers the last score" can block or pass a chunk by chance.
|
||||
Both runs named the same hardest units, `drawsApart` and `readFold.reads`. Scores since 2026-09-20 range 5.7–6.1, wider than this 0.3 spread by only 0.1, so `AGENTS.md`'s "no merge lowers the last score" can block or pass a chunk by chance. The last recorded nine-seat score is 5.7, on 2026-09-30; the ratchet reads it from here until this item is decided.
|
||||
|
||||
### 2. Step up from a row to the row it links to with `..`: `{/city[Oslo]..country.name}` renders `Norway`, and `city[Oslo].country` stays the cell `NO`.
|
||||
|
||||
- `..country` steps up to the nearest ancestor table named `country`, from a selected row, a drawn row or a name bound to a row: `{c..country.name}`.
|
||||
- `..` goes up one level, to the parent table, and the name after it is that parent's: `{c..country.name}`, and from a locality `{l..municipality..region.name}`. Naming any other table is a load error naming the parent.
|
||||
- It steps up from a selected row, a drawn row or a name bound to a row.
|
||||
- After `..`, `.` steps down again: `{c..country.city.name}` is a city of `c`'s country, drawn afresh.
|
||||
- `.country` after a row keeps reading the link column's cell, so the README's `city[Oslo].country` example stays true.
|
||||
- A `Fake` path and `--list` take `..` too; `List` keeps advertising direct descents only.
|
||||
- Replaces the decision "A link column after a row steps up to the parent row, and a path may not end on it".
|
||||
|
||||
### 23. Stop `misc.territory[EH].tld` rendering `.eh`, the one shipped TLD `misc.tld` does not hold.
|
||||
### 22. Stop `misc.territory[EH].tld` rendering `.eh`, the one shipped TLD `misc.tld` does not hold.
|
||||
|
||||
ISO 3166 reserves it for Western Sahara and the root zone has never been delegated it, so no resolver answers for it.
|
||||
|
||||
### 27. Accept a middle name, and draw a `personnummer` whose sex matches a selected sex, by name.
|
||||
### 26. Accept a middle name, and draw a `personnummer` whose sex matches a sex selected through a named pick.
|
||||
|
||||
Needs item 4. Report a struct column's draw conflict with the path spelling a tag takes.
|
||||
Needs item 4.
|
||||
|
||||
### 47. Let a table column carry a `datatype`, so `--format json` writes `"safe": true` and `--format sql` a boolean.
|
||||
### 48. Let a table column carry a `datatype`, so `--format json` writes `"safe": true` and `--format sql` a boolean.
|
||||
|
||||
Today only a JSON field takes one, so `misc.httpmethod`'s booleans are typed in Go and text everywhere else. Typing a shipped column changes what `json` and `sql` write, so the capability is a minor and applying it to `misc.httpmethod` is a major.
|
||||
|
||||
### 48. Read the tag through `git/ref/tags/{tag}` in `publish_release.py`.
|
||||
### 49. Read the tag through `git/ref/tags/{tag}` in `publish_release.py`.
|
||||
|
||||
GitHub answers `tags/{tag}` with 404 whatever exists, so the burnt-version guard never fires and a release lands on a tag already pointing at another commit.
|
||||
|
||||
### 46. Name the file a link error comes from beside its category path, `sub.x (/d/a/sub/x.json): …`.
|
||||
### 47. Name the file a link error comes from beside its category path, `sub.x (/d/a/sub/x.json): …`.
|
||||
|
||||
With several `--data-path` layers the author has to work out which directory won, while a parse error on the same file names it.
|
||||
|
||||
### 34. Report every mistake a load finds in one error, as the decision "A load reports every mistake at once" states.
|
||||
### 33. Report every mistake a load finds in one error, as the decision "A load reports every mistake at once" states.
|
||||
|
||||
`New` and `NewTemplate` stop at the first, so data holding two mistakes takes two runs to fix. Split it into items before starting, one of them the shape a Go caller iterates and the CLI prints, and the order of an inline template's mistakes, which name no path; reword the README's "`New` refuses a mistake in the data" to every mistake.
|
||||
|
||||
### 20. Weight `sv_SE.sex` and `en_US.sex` by bearers, as the README's Data section says they are.
|
||||
### 19. Weight `sv_SE.sex` and `en_US.sex` by bearers, as the README's Data section says they are.
|
||||
|
||||
Neither names a `weight`, so a bare `sex` draws evenly.
|
||||
|
||||
### 38. 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.
|
||||
### 37. 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.
|
||||
|
||||
`geo.SE.municipality[Lund]` and `misc.territory[Sweden]` select a row today. Steps:
|
||||
- Have a selector that misses name the key of every row whose cell spells it, matched without case, else say the table selects by its key: `misc.territory[Sweden]` and `misc.territory[se]` name `[SE]`, `misc.protocol[tcp]` its key, and `misc.loglevel[Error]` `[err]`.
|
||||
@@ -229,33 +229,29 @@ Neither names a `weight`, so a bare `sex` draws evenly.
|
||||
- Drop `key` from `last-name` and `sv_SE.title`, and re-pin `testdata/shipped_shape.txt`.
|
||||
- Leave no selection by name in README.md, CHANGELOG.md, docs/ or `--help`.
|
||||
|
||||
### 18. Give every shipped category building-block columns, and one record shape across the national ids; re-pin the shape.
|
||||
### 17. Give every shipped category a column for each part its format composes, and one record shape across the national ids; re-pin the shape.
|
||||
|
||||
`misc.uuid` → `variant` among them.
|
||||
`misc.uuid` gains `variant`, for one.
|
||||
|
||||
### 43. Refuse a `Fake` path into a level carrying a `repeat`, as the README's Correlated fields section states.
|
||||
|
||||
`probePath` skips `pathCheck.enter`, so `Fake("x.a")` under `"repeat":3` renders one draw.
|
||||
|
||||
### 28. Let a path go from a selected row into the template beside its family: `geo.US.locality[1714000].address`.
|
||||
### 27. Let a path go from a selected row into the template beside its family: `geo.US.locality[1714000].address`.
|
||||
|
||||
Require the path step to reach a sibling category.
|
||||
|
||||
### 7. Walk a path in one function: fold `probePath` into `pathCheck.walk`.
|
||||
|
||||
`probePath` copies `pathCheck.walk`'s loop and `routeSteps` call, differing at a choice and in skipping `enter`; seven seats and both architects named the pair. After item 4.
|
||||
|
||||
### 14. Place xlsx cells by their `r` reference in `data-import/xlsx.py`.
|
||||
### 13. Place xlsx cells by their `r` reference in `data-import/xlsx.py`.
|
||||
|
||||
A sheet omitting an empty cell shifts every later column left.
|
||||
|
||||
### 11. Test that every node kind reaches each switch over node kinds.
|
||||
### 10. Test that every node kind reaches each switch over node kinds.
|
||||
|
||||
Ten switches, from `render` to `columnItems`, must agree, and only `render` and `renderEdges` say so. `tableReadOf` switches over `stepKind` with no default, so a new step kind passes it silently.
|
||||
After item 4; recount the switches then. Today ten, from `render` to `columnItems`, must agree, and only `render` and `renderEdges` say so.
|
||||
|
||||
### 16. Add the remaining `misc` tables and templates, one row of the table below per chunk.
|
||||
### 15. Add the remaining `misc` tables and templates, one row of its detail's table per chunk.
|
||||
|
||||
Read every factual list from a register by a `data-import/` script. Shape: T = table, t = template, c = choice.
|
||||
Shape: T = table, t = template, c = choice.
|
||||
|
||||
| Category | Shape | Source | Licence |
|
||||
|---|---|---|---|
|
||||
@@ -276,7 +272,7 @@ Read every factual list from a register by a `data-import/` script. Shape: T = t
|
||||
| `lorem`, `hacker`, `hipster`, `catchphrase`, `buzzword`, `quote` | T/c | lorem ipsum, LLM-written | — |
|
||||
| `direction`, `continent`, `ulid` | c/t | — | — |
|
||||
|
||||
### 12. Test that every `geo` tree holds the five table names and the `address` columns that port across countries.
|
||||
### 11. Test that every `geo` tree holds the five table names and the `address` columns that port across countries.
|
||||
|
||||
Nothing checks it, and a new country breaks it silently.
|
||||
|
||||
@@ -284,7 +280,7 @@ Nothing checks it, and a new country breaks it silently.
|
||||
|
||||
Say the format is the table's own (`region's format "{name}"`), name the read to write, `{/region.<column>}` with its columns, and stop calling a one-column format, `{code}`, composed text.
|
||||
|
||||
### 17. Add the remaining locale categories: company, phone, finance, vehicle, words.
|
||||
### 16. Add the remaining locale categories: company, phone, finance, vehicle, words.
|
||||
|
||||
Shape: T = table, t = template, c = choice.
|
||||
|
||||
@@ -318,35 +314,35 @@ Shape: T = table, t = template, c = choice.
|
||||
| `word`, `sentence`, `paragraph` | T+t | Moby POS or WordNet | public domain / WordNet |
|
||||
| month and weekday names, `holiday` | t+T | CLDR en | Unicode |
|
||||
|
||||
### 9. Move `binding`, `bind` and `checkNodeFences` out of `data.go` into a file of their own.
|
||||
### 8. Move `binding`, `bind` and `checkNodeFences` out of `data.go` into a file of their own.
|
||||
|
||||
The greenfield architect found the fence pipeline last. After item 4, which shrinks it.
|
||||
The greenfield architect found the fence pipeline last. After item 4, which shrinks the pipeline.
|
||||
|
||||
### 10. Move `table.route`, `selector`, `step` and `drawStep` from `path.go` to `table.go`.
|
||||
### 9. Move `table.route`, `selector`, `step` and `drawStep` from `path.go` to `table.go`.
|
||||
|
||||
The inherited architect's 3am trace crossed four files for one draw.
|
||||
|
||||
### 29. Rename `misc.territory.country` to `sovereign`.
|
||||
### 28. Rename `misc.territory.country` to `sovereign`.
|
||||
|
||||
It holds a code, and `country` collides with the `misc.country` path it replaced.
|
||||
|
||||
### 39. Refuse a struct tag's `datatype` naming the Go type that sets it before proving its values, as the README's Library section promises.
|
||||
### 38. Refuse a struct tag's `datatype` naming the Go type that sets it before proving its values, as the README's Library section promises.
|
||||
|
||||
`datatype: boolean` over `{int(1,2)}` on an `int` field answers `prints an integer, not a boolean`.
|
||||
|
||||
### 15. Spell `misc.creditcard`'s digit runs `{digits(n)}`, and refuse a repeat over a lone `{digits(1)}` at `New`, naming that spelling.
|
||||
### 14. Spell `misc.creditcard`'s digit runs `{digits(n)}`, and refuse a repeat over a lone `{digits(1)}` at `New`, naming that spelling.
|
||||
|
||||
Both render the same run.
|
||||
|
||||
### 22. Give `url` and `email` a path that draws only domains nobody can register, keeping the wide set as the default.
|
||||
### 21. Give `url` and `email` a path that draws only domains nobody can register, keeping the wide set as the default.
|
||||
|
||||
17 of the 40 distinct ones shipped today sit on `.se`, `.nu`, `.io` and `.co`, which anyone may register, and only RFC 2606's `example.com`, `.net`, `.org`, `.test`, `.example`, `.invalid` and `.localhost` provably reach nothing.
|
||||
|
||||
### 36. Compare `calcParser.binary`'s operator as a rune.
|
||||
### 35. Compare `calcParser.binary`'s operator as a rune.
|
||||
|
||||
`byte(p.rs[p.pos])` reads U+012B `ī` as `+`, so `{calc(a ī b)}` compiles as `a + b`.
|
||||
|
||||
### 41. Name the node a selector follows in `stepInto`'s refusal.
|
||||
### 40. Name the node a selector follows in `stepInto`'s refusal.
|
||||
|
||||
`sv_SE.person[1].first` answers `1 is not a table`.
|
||||
|
||||
@@ -354,58 +350,70 @@ Both render the same run.
|
||||
|
||||
`parseRows` answers "line 2 is empty".
|
||||
|
||||
### 37. Stop the `columnKinds` suggestion naming a field's own kind or a narrower one.
|
||||
### 36. Stop the `columnKinds` suggestion naming a field's own kind or a narrower one.
|
||||
|
||||
An `int64` or `float64` field unproven in range is told to become itself, and a `uint64` one to become `int64`.
|
||||
|
||||
### 42. Report the same error every load for a table with two bad options, and for a folder with two unnamed rows files.
|
||||
### 46. Spell a table one way across the errors that name it.
|
||||
|
||||
`pinRow` names `t.path` and `mustRow` panics with `t.category`, so one table is `territory` and `misc.territory`, and the short spelling names no file where two folders hold that name.
|
||||
|
||||
### 41. Report the same error every load for a table with two bad options, and for a folder with two unnamed rows files.
|
||||
|
||||
`readTableOptions` and `loadDir` return on the first in Go's map order.
|
||||
|
||||
### 8. Fill `arm` in one place.
|
||||
### 7. Fill `arm` in one place.
|
||||
|
||||
`splitArm` runs before the link and again after it, and `compileArm` finishes it from `reference.go`, so five seats traced three phases. After item 4.
|
||||
|
||||
### 35. Rename `newRand` to `newGeneratorState` and `Generator.rand` to `state`.
|
||||
### 34. Rename `newRand` to `newGeneratorState` and `Generator.rand` to `state`.
|
||||
|
||||
Both name half of a `generatorState`, hiding its `{seq()}` counters, and `New`'s local `rng` shadows the `rng` interface.
|
||||
|
||||
### 40. Call `templateError` a compile failure in its doc.
|
||||
### 39. Call `templateError` a compile failure in its doc.
|
||||
|
||||
Its doc says render failure, and it wraps what `NewTemplate` and `NewRecordTemplate` refuse.
|
||||
|
||||
### 55. Pair a street with its exact postnummer.
|
||||
### 51. Build on a manual run of `test.yml`.
|
||||
|
||||
`workflow_dispatch` leaves `github.event.before` empty, so the diff compares `HEAD` with itself and skips `docker build`.
|
||||
|
||||
### 42. Refuse a category naming a hidden rows file, `"rows": ".x.tsv"`, as a rows file that is not there.
|
||||
|
||||
`loadDir` indexes hidden TSVs and skips them in two places, so one loads where its comment says a hidden file is never data.
|
||||
|
||||
### 57. Pair a street with its exact postnummer.
|
||||
|
||||
Needs an application to Lantmäteriet; today a street goes to the nearest postal code centroid. It rewrites shipped rows, so it is a major once 1.0 is cut and a minor before that.
|
||||
|
||||
### 54. Add `{btc()}` and `{eth()}`.
|
||||
### 56. Add `{btc()}` and `{eth()}`.
|
||||
|
||||
They need sha256 and keccak for Base58Check and EIP-55.
|
||||
|
||||
### 52. Promise in `Generator`'s godoc that its renders run one at a time.
|
||||
### 54. Promise in `Generator`'s godoc that its renders run one at a time.
|
||||
|
||||
So a caller wanting parallel throughput makes one generator per goroutine.
|
||||
A caller wanting parallel throughput then makes one generator per goroutine.
|
||||
|
||||
### 58. Cut the README's Layout block to the lines that say what a file name cannot.
|
||||
### 60. Cut the README's Layout block to the lines that say what a file name cannot.
|
||||
|
||||
`calc.go`, `doc.go` and `cmd/fejkdata/` restate their names.
|
||||
|
||||
### 53. Add the locales nb_NO, da_DK, fi_FI, de_DE, en_GB, nl_NL, fr_FR and es_ES, and their `geo/` trees.
|
||||
### 55. Add the locales nb_NO, da_DK, fi_FI, de_DE, en_GB, nl_NL, fr_FR and es_ES, and their `geo/` trees.
|
||||
|
||||
Person, address, phone, national id, company and date names each, and the `geo/` trees NO, DK, FI, NL, FR, AU, CA, ES, GB and DE their `address` reads by reference; AU and CA get a tree with no locale of their own.
|
||||
Each locale carries person, address, phone, national id, company and date names. Their `address` reads the `geo/` trees NO, DK, FI, NL, FR, AU, CA, ES, GB and DE by reference; AU and CA get a tree with no locale.
|
||||
|
||||
### 59. Cut `AGENTS.md` to the rules only it states, and explain every term its comprehension rule uses.
|
||||
### 61. Cut `AGENTS.md` to the rules only it states, and explain every term its comprehension rule uses.
|
||||
|
||||
The round procedure stands in `todo.md` and the `gh` rule opens with the README's GitHub decision, so each is a second copy that drifts. The comprehension rule packs the gate, its exceptions, the round and the at-or-above-7.0 regime into one line, and uses "depth 1", "nine-seat", "four-seat" and "answers it in one run" without saying what they mean.
|
||||
The `gh` rule opens with the README's GitHub decision, so it is a second copy that drifts. The comprehension rule packs the gate, its exceptions, the round and the at-or-above-7.0 regime into one line, and uses "depth 1", "nine-seat", "four-seat" and "answers it in one run" without saying what they mean.
|
||||
|
||||
### 57. Hold every change `AGENTS.md` says owes a `CHANGELOG.md` entry to one in CI.
|
||||
### 59. Hold every change `AGENTS.md` says owes a `CHANGELOG.md` entry to one in CI.
|
||||
|
||||
The check covers `data` and `testdata/shipped_shape.txt` alone, where `AGENTS.md` adds a flag, an exit code, an exported name, a fence, a builtin and the lowest Go.
|
||||
|
||||
### 56. Give every entry in `docs/decisions.md` the goal it serves, its date, who made it and the premise it rests on.
|
||||
### 58. Give every entry in `docs/decisions.md` the goal it serves, its date, who made it and the premise it rests on.
|
||||
|
||||
Propose a goal for an entry that serves none.
|
||||
|
||||
### 60. Announce v1.0.0 where a developer choosing a fake-data tool already reads, with a README first screen for someone deciding in a minute.
|
||||
### 62. Announce v1.0.0 where a developer choosing a fake-data tool already reads, with a README first screen for someone deciding in a minute.
|
||||
|
||||
The human cuts v1.0.0 once the shipped data is in its record shape and one full minor has shipped with no breaking change, per the README's Versioning table; v0.2.0 rewrites shipped rows, so a v0.3.0 with no breaking change comes first.
|
||||
|
||||
Reference in New Issue
Block a user