Skip to content

The tree opened into nothing, and 1003 tests could not see it - #218

Merged
dmitrat merged 1 commit into
mainfrom
studio-phase0
Aug 19, 2026
Merged

dmitrat merged 1 commit into
mainfrom
studio-phase0

Conversation

@dmitrat

@dmitrat dmitrat commented Aug 19, 2026

Copy link
Copy Markdown
Owner

Phase 0 of the fix plan: the probes that need a running Studio. Studio 1007 green, 1003 before —
and those numbers are the point, because every defect below was invisible to all of them.

What the run confirmed

Every phase-1 answer Studio could show was right: the recent list carried the LSM folder
database, the tree said 7 indexes where it used to say 8, the footer said page 1, the drop
confirmation quoted with straight quotes. The phase-3 menus were all there — Edit ▸ Find and
replace…
, View ▸ Database…, a folder offering only Create and Refresh, a connection root offering
Close Database. A table opens into Id INTEGER, CustomerId INTEGER, … with the NOT NULL names in
bold.

Finding 20, answered by measurement

A parse error is marked: a squiggle one character wide, under the first letter of the token —
while a missing table is underlined across its whole name. That is why the report said nothing was
marked. The fix is the token's length, not the wiring, and it is not in this PR.

What the pass broke open

the tree opened into an empty row two links missing, one in each direction: the row's IsExpanded is bound to the node's in a style setter, which does not push back — so the model never heard; and Children was a List, so replacing the placeholder notified nobody. Every test read Children directly and set IsExpanded itself — the ViewModel's side of a binding that only ever worked one way
Create ▸ hidden on a table phase 3's halves contradicted each other: the trigger item is offered on a table, and the submenu holding it was not
the read-only banner cut off the shape of findings 26 and 31: text that wraps or trims inside a horizontal StackPanel, which measures with infinite width. A rule now names it — and found four more (export, import and query error banners, query read-only banner). An element with its own width is exempt: a width is an edge
the strikethrough did nothing a decoration set from a row style never reaches the cell text. What a deleted row gets — dimmed, warning colour down its left edge — is what the screen shows; the style claiming the rest is deleted rather than left lying

What automation could not answer

The MCP click prefers the Invoke pattern, which bypasses real pointer routing — so the palette's
click-outside and click-to-run (finding 18) and the double click that opens a table's data are
unverified. The double click was seen to be broken by the placeholder (the row toggles its own
expansion); the change for it is written but unmeasured. Both need a hand on the mouse.

🤖 Generated with Claude Code

Phase 0 of the fix plan: the probes that need a running Studio. Studio 1007 green, 1003 before - and
the four numbers are the point, because every defect below was invisible to every one of them.

**Finding 20 is answered by measurement.** A parse error IS marked: a squiggle one character wide,
under the first letter of the token, while a missing table is underlined across its whole name. That
is why the report said nothing was marked. The fix is the token's length rather than the wiring, and
it is NOT in this commit - it belongs with the underline work.

**The tree opened into an empty row.** Phase 5 gave a table a placeholder so that it would draw an
expander, and the expander opened onto nothing. Two links were missing, one in each direction:

- view to model: the row's IsExpanded is bound to the node's in a STYLE setter, and a binding in a
  style setter does not push back. The row opened; the model never heard; the columns were never read.
- model to view: Children was a List, so replacing the placeholder with the columns notified nobody.

Every test read Children directly and set IsExpanded itself - which is the ViewModel's side of a
binding that only ever worked one way. Both halves are now held by a fixture that says so.

**Create was hidden exactly where its only item applies.** Phase 3's two halves contradicted each
other: a trigger is created on a table, and the submenu holding that item was not shown on one.

**The read-only banner was cut off mid-sentence**, and it had asked to wrap since it was written. The
cause is the shape findings 26 and 31 had: text that wraps or trims inside a horizontal StackPanel,
which measures its children with infinite width - so it can do neither. A rule now names that shape,
and it found four more of it: the export, import and query error banners, and the query read-only
banner. An element with a width of its own is exempt, because a width is an edge - which is how the
nine settings labels of phase 6 work.

**The strikethrough did nothing.** A decoration set from a row style never reaches the cell text,
because the cells build their own TextBlocks. What a deleted row actually gets - dimmed, with the
warning colour down its left edge - is what the screen shows, and the style that claimed the rest is
deleted rather than left saying something untrue. The case records the measurement.

What automation could NOT answer: the MCP click prefers the Invoke pattern, which bypasses real
pointer routing, so the palette's click-outside and click-to-run and the double click that opens a
table's data are unverified. The double click was seen to be broken by the placeholder - the row
toggles its own expansion - and the change for it is written but unmeasured. Both need a hand on the
mouse.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@dmitrat
dmitrat merged commit 7b3333b into main Aug 19, 2026
1 check passed
@dmitrat
dmitrat deleted the studio-phase0 branch August 19, 2026 08:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant