diff --git a/README.md b/README.md index 9179c19..d77e181 100644 --- a/README.md +++ b/README.md @@ -829,8 +829,9 @@ the output. Semver tags on `main`, `v0.1.0` first; one version covers the shipped data, the library and the CLI, and [`CHANGELOG.md`](CHANGELOG.md) names what each release -changed. A consumer's data, code and scripts keep working across a minor or a patch: -a minor only adds, and a major is the only release that changes what exists. +changed. A consumer's data, code and scripts keep working across a minor or a patch, +except output pinned to a seed. A minor only adds, and a major is the only release that +changes what exists. | Surface | Major | Minor | |---------|-------|-------| @@ -843,9 +844,11 @@ a minor only adds, and a major is the only release that changes what exists. A patch changes no row of this table: performance, docs, or a fix inside a promised behaviour that adds or removes no value and changes no path, format or spelling. -Any release, a patch too, may change what a seed draws, so pin seeded fixtures to one -version. An error's wording may -improve in a minor; the path, rejected spelling and replacement it names may not. +Any release, a patch too, may change what a seed draws, so regenerate seeded fixtures +whenever the fejkdata version changes. + +An error's wording may improve in a minor; the path, rejected spelling and replacement +it names may not. Before `v1.0.0` a minor is the breaking unit: `0.(x+1).0` may carry a major's changes, each named in the changelog, and a `0.x.y` patch may not. `v1.0.0` is diff --git a/cmd/fejkdata/main.go b/cmd/fejkdata/main.go index 36e116f..49b621c 100644 --- a/cmd/fejkdata/main.go +++ b/cmd/fejkdata/main.go @@ -48,7 +48,7 @@ array, one JSON object per line, one CSV row (after a header), or one INSERT. --list list the paths the data offers, then exit --no-shipped-data load only the --data-path directories -n, --repeat N render the value N times, 1..1048576 (default 1) - -s, --seed N seed for reproducible output + -s, --seed N seed: the same seed, version and data give identical output --separator S string between repeated values (default newline) --table T the INSERT target for --format sql (default: the path's last segment, or records for an inline template) --version print the version, then exit diff --git a/fejkdata.go b/fejkdata.go index d3c8bdb..7ca6300 100644 --- a/fejkdata.go +++ b/fejkdata.go @@ -57,8 +57,8 @@ type config struct { // Option configures a [Generator]. type Option func(*config) -// WithSeed makes output reproducible: two generators with the same seed and data -// emit identical sequences. +// WithSeed makes output reproducible: two generators with the same seed, version and +// data emit identical sequences. func WithSeed(seed uint64) Option { return func(c *config) { c.seed, c.seeded = seed, true } } diff --git a/todo.md b/todo.md index acaadf2..7a3c2b8 100644 --- a/todo.md +++ b/todo.md @@ -135,7 +135,7 @@ ### 77. Split the shipped data into Go modules per locale and country, which a library imports by choice, and embed every one in the CLI. -The CLI binary carries every module and may grow to hundreds of MB; a library imports only what it uses, as it imports any dependency, and nothing is fetched at run time. Goal 2 says what ships where. The maintainer decided on 2026-10-04: one module per locale, one per country's `geo/` tree, and one for `misc`. A module registers nothing when imported; the library passes it to `New` as an option, per the technical principles "Compose, do not entangle" and "Explicit over implicit". Still to decide: what a bare `New()` loads; whether a module's data is an `fs.FS` passed to the existing `WithDataFS` or a new option such as `WithData(svse.Data)`; and whether `WithoutShippedData` goes. Before the module API ships, a panel of the README's audience personas tries pulling in data with it. +The CLI binary carries every module and may grow to hundreds of MB; a library imports only what it uses, as it imports any dependency, and nothing is fetched at run time. Goal 2 says what ships where. The maintainer decided on 2026-10-04: one module per locale, one per country's `geo/` tree, and one for `misc`. A module registers nothing when imported; the code importing it passes it to `New` as an option, per the technical principles "Compose, do not entangle" and "Explicit over implicit". Still to decide: what a bare `New()` loads; whether a module's data is an `fs.FS` passed to the existing `WithDataFS` or a new option such as `WithData(svse.Data)`; and whether `WithoutShippedData` goes. Before the module API ships, a panel of the README's audience personas tries pulling in data with it. ### 78. Ship 10% of every place's streets, at least 10, and 10% of all US places drawn by population, each place weighted by population.