From 021a95c1147768af0163e457bc67a47d6b54d220 Mon Sep 17 00:00:00 2001 From: Lilleman auf Larv Date: Tue, 22 Sep 2026 22:21:20 +0200 Subject: [PATCH] File the 2026-09-22 nine-seat panel run --- todo.md | 72 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/todo.md b/todo.md index fd97a1d..f4c2a06 100644 --- a/todo.md +++ b/todo.md @@ -14,14 +14,52 @@ nine-seat one: the round is meant to buy architectural change, and the four-seat scoring run names too little to steer one. A fresh run replaces the items below. Scores, newest last: 5.9 on 2026-09-20 (Navigation 7.0, Locality 5.2, Shape 5.9, -Self-sufficiency 5.7), eight of nine seats capped by Locality or Self-sufficiency, all -nine naming `hold.go`, `draw.go` — now split into `holdset.go` and `drawfence.go` — and -`family.go` first for reading cost: 1,138 lines in which each file carried both a -load-time fence and render-time machinery, so no file name said whether a unit ran at -`New` or at `Fake`. +Self-sufficiency 5.7); 5.8 on 2026-09-22 (Navigation 6.7, Locality 5.0, Shape 5.9, +Self-sufficiency 5.6), every seat capped by Locality or Self-sufficiency. Eight of nine +named `drawWalk.walk` and `rowSet` or `checkFamilies` hardest and least wanted to modify: +a load-time copy of the pinning `hold.pin` and `hold.rowOf` do at render, tied to them +by nothing but tests, whose premise lives only in the README's Decisions. This round, in order: +- Gather the family fence in `family.go`: `alternatives`, `rowSet` and `checkOwnFamily` + beside `checkFamilies`, and the `drawGroup` option parsing out of `drawfence.go`, so + one question about a family opens one file. +- Give render and the draw fences one pin model: a pin set `hold.pin`, `hold.rowOf` + and the fence's `rowSet` all use, so a change to how a render pins rows cannot leave + the fence proving the old rule, and `hold` stops being a proof scratchpad whenever its + session is nil. +- Move the README's Decisions section to `docs/decisions.md`, leaving a one-line index + of the titles in `AGENTS.md`, and drop the `AGENTS.md` line pointing decisions at the + README. Give each fence a bare link to the entry it enforces: every seat needed + "The rows of a table are alternatives", "The expansion hold and the render's draws + are two fences" or "A table read into is pinned" and found it by grepping 470 lines. + Carry the timezone weight's premise in with it: weighting by GeoNames city + population moved 300 seeded draws of `misc.territory[US].timezone` from 44 landing on + the four zones most Americans live in to 278, and dropped `America/Indiana/Petersburg` + (pop. 2,400) from 17 draws to 0. Carry in the decision `linkTemplateRefs`'s doc holds + today, which no entry records: a category is a unit, so a reference back into it + describes a draw other than the fields beside it, which is what goal 3 asks for. +- Keep reference bindings out of `template.fields`, so no walk over a template's fields + needs the `isRef` filter `named`, `paths`, `recordColumns` and `template.field` carry. +- Compile a template's format once: `compileFormat` runs again from `linkTemplateRefs`, + so `ops`, `bound` and `held` are provisional until linking and its fences run twice. +- Parse a format once and have the fences read `t.ops`: `eachToken` rescans the format + in `fieldTokens`, `operandTokens`, `boundReaders`, `renderEdges`, `loneRef`, + `operandReader`, `checkNoRepeatedRead` and `compileOps`, and function-versus-field is + decided by `indexOutside(body, '(')` in two of them and by `funcCall` in the rest. +- Name `pathWalk`'s modes: render, probe, check and cover are chosen today by which + callbacks are nil and whether `pins.s` is, and `walkChoice` returns `nil, nil` where + none is set. +- Register a transform once: `transforms` restates the `lowercase`, `uppercase` and + `ascii` entries in `builtins`, and `valueProof.template` classifies by the first while + render calls the second. Derive the numeric builtins `valueProof.template` lists in + its error text from `builtin.number` while there. +- Split `drawCheck.reads`'s six-term condition into named predicates. +- Rename what names two things: `template.go` holds the token grammar while `template` + is `node.go`'s type and `Template` `inline.go`'s; `kind` `'b'` is a brace body in + `ftoken` and a builtin in `op`; `hold`'s receiver is `d`; `drawAt.alt` holds the rows + a walk entered. - Run the nine-seat panel again and file what it names here. ### Data @@ -29,6 +67,10 @@ This round, in order: Shape: T = table, t = template, c = choice. Read every factual list from a register by a `data-import/` script, as README goal 12 asks. +- Place xlsx cells by their `r` reference in `data-import/xlsx.py`: a sheet omitting an + empty cell shifts every later column left. +- 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. - Add the remaining `misc` tables and templates, one row of the table below per chunk. - Read `misc.emoji` from the Unicode `emoji-test.txt` register, and `misc.car` from an international make and model source; vPIC and Mobility Sweden are national, so they @@ -137,6 +179,8 @@ by a `data-import/` script, as README goal 12 asks. ### Library and CLI +- Report the same error every load for a table with two bad options: + `readTableOptions` returns on the first in Go's map order. - Refuse two whole reads of one table family in one render, which goal 5 promises is a load error: `{/sel}|{/sel}` panics out of `Fake` with "a fence should have refused this at New" where the two draws land on rows whose cells select different rows of another @@ -198,14 +242,11 @@ by a `data-import/` script, as README goal 12 asks. ### Release -- Move the README's Decisions section to `docs/decisions.md`, leaving a one-line index - of the titles in `AGENTS.md`, and drop the `AGENTS.md` line pointing decisions at the - README. Carry the timezone weight's premise in with it: weighting by GeoNames city - population moved 300 seeded draws of `misc.territory[US].timezone` from 44 landing on - the four zones most Americans live in to 278, and dropped `America/Indiana/Petersburg` - (pop. 2,400) from 17 draws to 0. Carry in the decision `linkTemplateRefs`'s doc holds - today, which no entry records: a category is a unit, so a reference back into it - describes a draw other than the fields beside it, which is what goal 3 asks for. +- 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. +- Document `NewRecordTemplate` in the README's Library section, the one exported name + it does not name. - 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. @@ -246,6 +287,11 @@ because pairing a street with its exact postnummer rewrites shipped rows. ## Not release-bound +- Hold every change the charter 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. +- Measure the allocation gate over the shipped `geo` trees too: `hold.pins [8]` is sized + for them, and `perf_test.go` checks a synthetic five-deep tree only. - Make a named draw group's hold lazy, `&hold{s: s}` in `renderScope.hold`: it escapes to the heap anyway, so its two eager maps buy no stack and cost two allocations per group that may never read through them. Check it against the alloc tests.