diff --git a/todo.md b/todo.md index d9b17a6..b38ca2a 100644 --- a/todo.md +++ b/todo.md @@ -6,7 +6,7 @@ `Bar = 9` -`Next ID = 255` +`Next ID = 258` | Goal | W | |---|---| @@ -178,6 +178,9 @@ | 174 | 0.2.0 | | **Spell once the fact that a walk's next step leaves a selected row, which `pathPos.fromRow` and `tableRoute.nextLinked` each spell today.** | 1 | 1 | 3 | 1 | 5 | 3.2 | 9.8 | | 108 | 0.2.0 | defect | **Name item 26 in the decision "No builtin reads the clock, so a date is bounded by days, never by an age", as the item that ends its conflict with goal 4.** | 1 | 1 | 1 | 1 | 4 | 3.4 | 8.0 | | 169 | 0.2.0 | question | **Reword the decision "A parent row with no child row is a load error" to say what each geo import does with such a row: drop it, or exit where `geo-se.py` would lose a kommun or a län.** | 1 | 1 | 2 | 1 | 4 | 3 | 8.0 | +| 255 | 0.3.0 | | **Let a repeat or a choice item bind a name to a path through an enclosing name, `{a.object as o}`, so each iteration draws a fresh row inside the enclosing pick.** | 4 | 4 | 7 | 6 | 7 | 4.1, 5.3 | 18.9 | +| 256 | 0.3.0 | | **Let `repeat` take a range, such as 5 to 15, drawing the count on each render.** | 2 | 3 | 3 | 6 | 6 | 5 | 18.9 | +| 257 | 0.3.0 | | **Add a transform that writes a value escaped for a JSON string, so a text template spelling JSON stays valid whatever a drawn value holds.** | 2 | 2 | 3 | 5 | 6 | 4, 5 | 17.7 | | 253 | 0.3.0 | | **Let `date()` take bounds relative to the date the caller gives, such as 30 days before it to 14 days after it.** | 2 | 3 | 4 | 6 | 6 | 7.3, 10.1 | 17.6 | | 254 | 0.3.0 | | **Let a choice deal its items in exact counts across a run's renders, so 200 issues hold exactly 4 in progress, where weights only approach it.** | 3 | 4 | 6 | 6 | 6 | 5, 10 | 17.6 | | 38 | 0.3.0 | defect | **Compare `calcParser.binary`'s operator as a rune.** | 1 | 1 | 2 | 3 | 6 | 6 | 13.8 | @@ -673,6 +676,18 @@ Item 26 revises the decision, but the decision does not point back to it. Its entry says "The import script drops or fills such rows". There are two geo imports, and `geo-se.py` exits when `geo.fence` drops a kommun or a län, while `geo-us.py` drops counties and states. Rewording a decision is the maintainer's call. +### 255. Let a repeat or a choice item bind a name to a path through an enclosing name, `{a.object as o}`, so each iteration draws a fresh row inside the enclosing pick. + +A template spelling a parent with its children, an epic and its stories, binds the parent's area once, `{/jira.area as a}`, and wants each child in a `repeat` to name a different object of that area. Today `{a.object}` keeps one pick for every iteration, since a name keeps every level its reads pass, and `{a.object as o}` inside the repeat is refused: `no field "a"; … a binding names a field, or a reference`. The way round is one run per parent, selecting the area by key in a template the caller writes. Revise the decision "Every `{…}` draws afresh, and only a name keeps a pick", whose binding list leaves out a path through a name, and state how the new pick sits beside the enclosing name's memo (`drawMemo.stepDownPins` and "A pick keeps only the levels a read of the name addresses"). `readName` and `keptInPick` are places the comprehension seats found hard; make them easier to read where the change touches them. + +### 256. Let `repeat` take a range, such as 5 to 15, drawing the count on each render. + +An epic holds between 5 and 15 stories, an order between 1 and 8 lines. Today `repeat` is one integer, so a varied count takes a weighted choice of templates that differ only in their `repeat`. The repeat cap counts a range's upper bound. Bench the spelling with the bulk fixture author and the data author, such as `"repeat": [5, 15]` or `"repeat": "{int(5,15)}"`; the README's Repeat section and the decision "The repeat cap bounds renders, not bytes" name it. + +### 257. Add a transform that writes a value escaped for a JSON string, so a text template spelling JSON stays valid whatever a drawn value holds. + +A nested structure, a parent with an array of children, renders as one text template whose format spells JSON (`{{"summary":"{s}"}}`), since a record's columns are flat. A drawn value holding `"`, `\` or a newline breaks that JSON, as a company name or a sentence may. A transform such as `{json(s)}` writes the value with JSON's string escapes, beside `lowercase`, `uppercase` and `ascii`. Bench its name with the bulk fixture author. + ### 253. Let `date()` take bounds relative to the date the caller gives, such as 30 days before it to 14 days after it. Needs item 26, which makes the caller give the date and revises the decision "No builtin reads the clock, so a date is bounded by days, never by an age". Today a due date or a sprint window "around now" is two fixed days, re-pinned whenever the fixture should look current. A relative bound reads the caller's date, never the clock, so the same seed and date still give the same output (goal 10). Bench the spelling with the hand fixture author and the bulk fixture author, such as `date(-30d,+14d,'2006-01-02')`; the README's Functions row and the clock decision change with it.