oficina / sheets Public

docs: say what is built, and name the debt the new work created

PRODUCT.md's capability list said export had no route and nothing
downloaded a file. That was true when it was written and is not now, and
a capability list that has stopped describing the thing it names is the
failure it was written to prevent. CSV is still absent and the line now
says only that.

Two rows added to the spec's §14, both debts this work created rather
than found:

- Formatting is not reachable from the scriptless table view. Seven
  affordances landed in the grid today and none of them is in the table
  view, which by PRODUCT.md's second principle means the table view is
  unfinished. Named here rather than left to be discovered. The format
  route is already scriptless-ready — it takes a rectangle and a patch,
  and a form could post one — so the work is the table view's controls.
- Neither a format write nor a resize appends an event, so neither is
  undoable, and Ctrl-Z after bolding undoes the last value edit instead.
  The UI does not offer undo for either. The fix is a format event kind,
  which changes the undo model.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0182f7QfojuuqdS4Xd2fYFaL
Paul Campbell pushed by paul@keymail.dev 89c515fdbcda7e99237991a31ae613d19c6e67dd parent d6ede48
2 files changed, +28 −11
  • PRODUCT.md +26 −11
  • docs/superpowers/specs/2026-08-30-sheets-design.md +2 −0
diff --git a/PRODUCT.md b/PRODUCT.md
index b9a8e00..1a05d29 100644
--- a/PRODUCT.md
+++ b/PRODUCT.md
@@ -70,19 +70,28 @@ confirmed binding by Paul on 2026-09-01:
## Capabilities and Constraints
-**Built and working as of 2026-09-02:** sign-in, sheet list and creation,
-a grid backed by a Go calc engine, live sync across tabs over SSE, a
-scriptless paginated table view with per-cell editing, XLSX import
-(upload or drag a file onto the list; it runs as a background job and
-lands on the new sheet), and a contrast notice for imported fills.
+**Built and working as of 2026-09-02:** sign-in, sheet list and creation
+with a live preview thumbnail on every row, a grid backed by a Go calc
+engine, live sync across tabs over SSE, a scriptless paginated table
+view with per-cell editing, XLSX import and export (import by upload or
+by dragging a file onto the list; it runs as a background job and lands
+on the new sheet), and a contrast notice for imported fills.
+
+The editing surface is a menu bar (File, Edit, Insert, Format, Data,
+Help), a formatting toolbar, a name box and formula bar, and a tab
+strip. Cells carry bold, italic, alignment, a number format, a fill and
+a text colour; columns and rows can be resized and stay resized. A
+colour picked here is stored as hue and chroma with no lightness, so it
+follows the reader's light/dark choice; a colour an imported file
+authored is painted exactly as the file wrote it.
**Not reachable yet, though the code is there.** This line previously
read "XLSX/CSV import and export", which was true of the converter and
-false of the product: `xlsx.Export` has no route and nothing downloads a
-file, and there is no CSV code in the repo at all. Import was in the
-same state until 2026-09-02 — a tested converter with no way to reach
-it — which is exactly how a capability list stops describing the thing
-it names. Export's HTTP surface and CSV are both still to build.
+false of the product. Import stopped being an example of that on
+2026-09-02 and **export stopped being one the same day** — `xlsx.Export`
+now has a route and File ▸ Download as .xlsx reaches it. What remains
+true is CSV: there is no CSV code in the repo at all, and the line above
+does not claim any.
**Constraints that bind design:**
@@ -135,7 +144,13 @@ beyond the suite theme — see Brand Commitments.
deferred table, each row carrying a written trigger.
- `AGENTS.md` — binding engineering rules, several of them design-facing.
- A working deployment at `https://sheets.bds.oncarlos.com`.
-- `tools/drive/drive.mjs` — drives the real binary in a real browser.
+- `tools/drive/drive.mjs` — drives the real binary in a real browser,
+ for live sync across two tabs.
+- `tools/drive/chrome.mjs` — its sibling, for the editing chrome: the
+ menu bar, the toolbar, the formula bar, the cell paint, export, and
+ the 320px reflow budget. It earned its place on the day it was
+ written, by finding a menu bar that worked perfectly from the keyboard
+ and not at all with a mouse.
**Absences future work must not fabricate:** there are no customers, no
testimonials, no benchmarks, no pricing and no usage numbers. There is no
diff --git a/docs/superpowers/specs/2026-08-30-sheets-design.md b/docs/superpowers/specs/2026-08-30-sheets-design.md
index 7aaa777..c0142e6 100644
--- a/docs/superpowers/specs/2026-08-30-sheets-design.md
+++ b/docs/superpowers/specs/2026-08-30-sheets-design.md
@@ -1049,6 +1049,8 @@ it is a fallback rather than a scramble.
| `client` shape for anything but the grid | A surface genuinely needs client-held keys |
| Print / PDF export | Asked for. docs-e6 keeps its layout engine's page model generic over content boxes so this stays open: paginated grid, repeating header rows, scale-to-width, explicit page breaks, charts as vector |
| Live sheet range embedded in a doc | A known future crossing of two collaboration models |
+| **Formatting from the scriptless table view** | PRODUCT.md's second principle says the scriptless path is the product, not the fallback, and that an affordance in the grid and not in the table view means the table view is unfinished. Bold, italic, alignment, number format, fill, text colour and column widths all landed in the grid on 2026-09-02 and none of them is reachable from the table view, so the principle is currently unmet and this row is the debt, named rather than discovered. The `POST .../format` route is scriptless-ready already — it takes a rectangle and a patch, and a form could post one — so the work is the table view's own controls and not the backend. Trigger: **the next slice that touches the table view**, or Paul asking for it, whichever is first. The grid's menu bar is scriptless wherever it can be meanwhile: File, Data, Help and Edit's undo are links and forms that work with scripting off; only the Format menu and the toolbar are script-driven, and both are hidden rather than shown dead. |
+| **Undo for formatting and for a resize** | Undo replays input events (§7), and neither a format write nor a resize appends one — so Ctrl-Z after bolding undoes the last VALUE edit instead, which is surprising in the way this app tries not to be. The UI therefore does not offer undo for either. Trigger: **a format event kind**, which changes the undo model and is not a thing to do in passing. |
| ~~Surfacing an imported fill/ink pairing that fails WCAG AA~~ | **Trigger fired and built, 2026-09-01.** Plan 2's grid work landed, and with it `Format.InkHex` (the authored font colour, which nothing retained before), a WCAG ratio, and a notice naming the failing cells on both the grid and the table view. Surfaced, never overridden — §11.1's ruling stands. |
---