docs(clients): the editable-is-the-id list still named two kinds

A fact stated twice is changed by a grep, and this copy was missed. The
"four decisions that are silent when wrong" list in context/code/clients.md
enumerated CellId::Record and CellId::Aggregate and then said None is "not
aggregate" — written when those were the only two kinds. There are now four,
and a reader of that list would have concluded a Derived or a Create cell must
be a None.

Found by grepping for the claim after PR #47 put web/demo.improv on the site's
front door, which is also how the remaining stale copies were located: two in
prolog-sessions/kb.pl and two in context/repo-map.md, both orchestrator-only
files, reported as text in the hand-back.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Edward Langley
2026-09-20 11:42:00 -07:00
parent a31c3d2dce
commit 7b2e9d8606
+10 -5
View File
@@ -669,11 +669,16 @@ rows of cells that each already know whether they are editable, numeric,
erroneous and selected. The page's job is `document.createElement`.
- **Editable is a fact about the id, not about the text.** Only
`CellId::Record` may be written (ADR 002). `CellId::Aggregate` is a *drill*
target and `Drill` is not on the wire yet, so it renders as non-editable
rather than as a control that does nothing. And `None` is **not**
"aggregate" — it is "no projected cell here": a padded slot, a blanked one, or
a records-mode column that renames a coordinate across the whole row rather
`CellId::Record` may be written (ADR 002), and there are now **four** kinds,
each naming a permission. `CellId::Aggregate` is a *drill* target and `Drill`
is not on the wire yet, so it renders as non-editable rather than as a control
that does nothing. `CellId::Derived { target }` is a cell a formula owns
(improvise-ir7l): `i` on one names the formula rather than opening an editor,
because a write there lands and is then shadowed forever by `formula_cache`.
`CellId::Create(kind)` is a records-mode `+`/`+cat` column (improvise-poia),
where what the user types is a **name**, not a value. And `None` is **not**
any of those — it is "no projected cell here": a padded slot, a blanked one,
or a records-mode column that renames a coordinate across the whole row rather
than writing one.
- **The selection is absolute and the grid is not.** `GridCache` is indexed by
position *within the viewport*, while `selected` and `row_offset`/`col_offset`