Commit Graph
930 Commits
Author SHA1 Message Date
Codex a8aeecc32c fix: judge order dependence by the area in force, close the stuck drag
Review CODE-REVIEW-220-r1.

H1: markersNeedingPlacement decided who depends on the order by reading
marker.area alone, while resolveExplicitMarkerPlacement reads
`marker.area || <area of the HA device>`. The ordinary marker — bind an HA
device, store neither field — is anchored by the registry and never depended
on the order, yet it was being written a space it never asked for. Dormant
today, and the day that HA area changes it moves the marker to whatever space
used to be first. The resolver now asks for the area actually in force.

M1: a mouse released past the panel left the gesture stuck, swallowing the
next click. Pointer capture is the usual answer and is now taken, but it is
not a guarantee — the browser grants it only for a live pointer. The window
listener is what actually closes the gesture.

M2: the fifth mutant from the spec is registered, plus a sixth for the stuck
drag above.

Writing the smoke for M1 turned up why the first attempt passed against
broken code: synthetic PointerEvents default to composed:false and never
leave the shadow root, so nothing outside the panel could ever hear them.
Real pointer events are composed; the smoke now says so.

Issue: #220
User-Visible: no
2026-08-21 00:50:15 +03:00
claude[bot] 90a00670a7 docs: review document for #220
Issue: #220
User-Visible: no
2026-08-20 21:41:11 +00:00
Codex 8369c0e839 feat: reorder space tabs by dragging one to a new position
The order of config.spaces used to be whatever order the spaces were created
in, and there was no way back other than deleting a space and drawing it
again.

The gesture is deliberately narrow — mouse, editors only. The same tabs are
the primary way to switch spaces in View, where touch is first class, so a
drag there would compete with the tap that switches. Recorded in the spec as
"Touch editor: not exposed".

The part that needed care is not the drag. Position in the array feeds three
things: the marker placement fallback, the swipe neighbour and a positional
`floor`. So the write that stores the new order also writes down the
placement that used to depend on it: a marker with neither an explicit space
nor an area that names one gets the space it has right now. Both changes go in
one save; splitting them would leave a window in which markers move on their
own. The positional `floor` cannot be fixed from here, so the card says so
once.

Issue: #220
User-Visible: yes
2026-08-21 00:27:35 +03:00
claude[bot] 30bf18f508 docs: review document for #220
Issue: #220
User-Visible: no
2026-08-20 20:37:09 +00:00
Codex 5ba46dfd97 docs: take the atomic write out of the "free to change" block (#220 M3)
The assumptions section is explicitly labelled "technical, free to change",
and it held a requirement that AC3 and a mutant already test as a fact. Read
literally, it invited splitting the write in two — reopening the very window
in which markers move. The point now states the opposite: everything else in
that section is free, this one is normative and lives in section 8.3.

Issue: #220
User-Visible: no
2026-08-20 23:28:26 +03:00
claude[bot] 48308209c2 docs: review document for #220
Issue: #220
User-Visible: no
2026-08-20 20:27:01 +00:00
Codex e57e1d920c docs: close M1 and M2 from the spec review of #220
M1: the spec now carries the touch classification TOUCH-SUPPORT.md asks every
editor feature for — "Touch editor: not exposed", with the reason it is a
decision rather than an omission.

M2: the first draft denied adding a config field in one section while planning
to store an anchor in settings in another. Resolved by dropping the anchor:
reordering materialises the placement that was implicit, giving those markers
an explicit space in the same write. No new field, no schema change, and the
marker stays exactly where the user saw it.

Issue: #220
User-Visible: no
2026-08-20 23:20:31 +03:00
claude[bot] c3278ddd07 docs: review document for #220
Issue: #220
User-Visible: no
2026-08-20 20:17:57 +00:00
Codex 0fd2331d4a docs: spec for space tab reordering
Written on the owner's product decisions of 2026-08-20: mouse only and only in
the editor modes, one warning about the positional `floor` from #210, no
keyboard alternative.

The spec carries the part that is easy to miss — the order of `config.spaces`
is not decoration. It feeds the marker placement fallback, the swipe
neighbour and the numeric `floor`, so reordering tabs must not move a single
marker. That is a named acceptance criterion with a mutant behind it.

Issue: #220
User-Visible: no
2026-08-20 23:08:07 +03:00
claude[bot] 7763af6b8e docs: review document for #223
Issue: #223
User-Visible: no
2026-08-20 19:32:16 +00:00
Sergey Matyuninandclaude[bot] d486c64576 fix: canonicalize near-grid coordinates exactly
Issue: #223
User-Visible: yes
2026-08-20 19:32:16 +00:00
claude[bot] 603bb3647f docs: review document for #223
Issue: #223
User-Visible: no
2026-08-20 19:32:16 +00:00
Sergey Matyuninandclaude[bot] fb6d7ea693 docs: clarify optimize report terminology
Issue: #223
User-Visible: no
2026-08-20 19:32:15 +00:00
claude[bot] 73eb92257e docs: review document for #223
Issue: #223
User-Visible: no
2026-08-20 19:32:15 +00:00
Sergey Matyuninandclaude[bot] 62f398d359 docs: address coordinate spec review
Issue: #223
User-Visible: no
2026-08-20 19:32:15 +00:00
claude[bot]andclaude[bot] 38e6869c90 docs: review document for #223
Issue: #223
User-Visible: no
2026-08-20 19:32:15 +00:00
Sergey Matyuninandclaude[bot] 86778ed452 docs: specify exact coordinate canonicalization
Issue: #223
User-Visible: no
2026-08-20 19:32:15 +00:00
Codex 812e5ff391 Merge issue #225 into dev
Import of a backup holding PDF attachments: the content resolver parses a url
as a url, and the three mutants guarding it are registered. The user-visible
change is documented in 4a84734, which carries both changelog entries — this
merge adds no behaviour of its own.

Code review r2 green (docs/reviews/CODE-REVIEW-225-r2.md). The third pass was
a rebase over #226, not a fix — owner arbitration on the review-4 the cycle
counter raised for it (PROCESS.md §4; counter defect filed as #227).

Issue: #225
User-Visible: no
2026-08-20 22:14:36 +03:00
claude[bot]andCodex 810ad01ce9 docs: review document for #225
Issue: #225
User-Visible: no
2026-08-20 22:00:22 +03:00
Codex 2935c293e1 fix: reject absolute urls in the content resolver, register the mutants
Review CODE-REVIEW-225-r1.

M1: urlsplit(url).path was trusted even when the url carried a scheme or an
authority, so "https://evil.example/houseplan_files/files/m1/doc.pdf"
resolved onto a local file while _looks_internal kept calling it external —
the mirror image of the inconsistency this resolver exists to prevent. Only a
same-document reference is resolved by its path now.

M2: the three mutants the spec described are registered in
scripts/mutation-gate.mjs instead of living as a one-off manual run. The
traversal entry drops both structural checks at once on purpose: taken one at
a time the defence is layered (sanitize_marker_id turns ".." into "misc") and
the mutant would be equivalent — established by running it.

Issue: #225
User-Visible: no
2026-08-20 22:00:22 +03:00
claude[bot]andCodex cb1e4cea64 docs: review document for #225
Issue: #225
User-Visible: no
2026-08-20 22:00:22 +03:00
Codex 4a84734b18 fix: resolve internal content urls by path, not by string
A backup holding a PDF attachment could not be imported back: legacy links
carry a cache-buster (".../files/m1/doc.pdf?v=1783170649"), and the resolver
compared the raw tail with its sanitized form, so the query made the name
differ from itself. The reference then read as internal by prefix and
non-canonical by name, which is exactly the combination _content_state must
refuse — every such document failed with invalid_content.

Parse the url as a url: the path addresses the file, the query and the
fragment address the transfer. Path segments keep doing the guarding, so
dropping the query cannot widen what a segment is allowed to be.

Issue: #225
User-Visible: yes
2026-08-20 22:00:22 +03:00
claude[bot] a0716dc404 docs: review document for #226
Issue: #226
User-Visible: no
2026-08-20 18:48:01 +00:00
Sergey Matyuninandclaude[bot] 442731e8eb fix: deduplicate entity markers from parent devices
Issue: #226
User-Visible: yes
2026-08-20 18:48:01 +00:00
claude[bot] 723ebb8f61 docs: review document for #226
Issue: #226
User-Visible: no
2026-08-20 18:48:01 +00:00
Sergey Matyuninandclaude[bot] 8e0358e7dd docs: define hidden-only device residual
Issue: #226
User-Visible: no
2026-08-20 18:48:01 +00:00
claude[bot] 0cb38e5562 docs: review document for #226
Issue: #226
User-Visible: no
2026-08-20 18:48:01 +00:00
Sergey Matyuninandclaude[bot] ea50548b70 docs: specify entity parent deduplication
Issue: #226
User-Visible: no
2026-08-20 18:48:01 +00:00
claude[bot] 5f000cb6fb docs: review document for #225
Issue: #225
User-Visible: no
2026-08-20 18:23:36 +00:00
claude[bot] be0277f5f5 docs: review document for #225
Validate / docs (push) Failing after 22s
Validate / reuse (push) Successful in 51s
Validate / changes (push) Successful in 1m10s
Validate / provenance (push) Successful in 1m14s
Validate / process-gate (push) Successful in 1m16s
Validate / hacs (push) Failing after 13s
Validate / hassfest (push) Failing after 24s
Validate / frontend (push) Successful in 8m14s
Validate / backend (push) Failing after 8m22s
Validate / golden (push) Failing after 10m59s
Validate / performance_smoke (push) Failing after 14m6s
Validate / smoke (push) Failing after 33m13s
Issue: #225
User-Visible: no
2026-08-20 18:14:55 +00:00
Sergey Matyunin a20dd54ba6 test: retarget the LQI mutation guard
Validate / docs (push) Failing after 47s
Validate / provenance (push) Successful in 1m41s
Validate / process-gate (push) Failing after 1m52s
Validate / changes (push) Successful in 1m7s
Validate / reuse (push) Successful in 37s
Validate / hacs (push) Failing after 13s
Validate / hassfest (push) Failing after 15s
Validate / frontend (push) Successful in 7m29s
Validate / backend (push) Failing after 9m12s
Validate / golden (push) Failing after 13m36s
Validate / performance_smoke (push) Failing after 14m19s
Validate / smoke (push) Failing after 35m6s
Full Performance / performance (push) Failing after 1h57m49s
Issue: #222
User-Visible: no
v1.66.0
2026-08-20 16:26:29 +03:00
Sergey Matyunin 3af04840a9 build: promote v1.66.0 after beta.1
Issue: #221
User-Visible: yes
2026-08-20 16:05:55 +03:00
Sergey Matyunin d68e958c0d test: align lock smokes with issue 219 palette
Issue: #219
User-Visible: no
v1.66.0-beta.1
2026-08-20 15:30:57 +03:00
Sergey Matyunin e0b3c4715d test: accept reviewed v1.66.0-beta.1 goldens
Issue: #217
Issue: #218
Issue: #219
User-Visible: no
Release: v1.66.0-beta.1
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/32368355958
2026-08-20 15:25:07 +03:00
Sergey Matyunin 4aa9d1b2bb docs: refresh v1.66.0-beta.1 screenshot fingerprint
Issue: #217
Issue: #218
Issue: #219
User-Visible: no
2026-08-20 15:20:37 +03:00
Sergey Matyunin d55e0dd298 Release v1.66.0-beta.1 candidate
Issue: #217
Issue: #218
Issue: #219
User-Visible: yes
2026-08-20 15:18:43 +03:00
claude[bot] ce400859f3 docs: review document for #219
Issue: #219
User-Visible: no
2026-08-20 12:09:51 +00:00
Sergey Matyunin bc75e00c2d fix: unify lock and orange icon colors
Issue: #219
User-Visible: yes
2026-08-20 14:56:21 +03:00
claude[bot] 84fa434a64 docs: review document for #219
Issue: #219
User-Visible: no
2026-08-20 11:48:34 +00:00
Sergey Matyunin 16c8a28aaf docs: require user guide palette update
Issue: #219
User-Visible: no
2026-08-20 14:44:35 +03:00
claude[bot] 6786c48a0e docs: review document for #219
Issue: #219
User-Visible: no
2026-08-20 11:43:39 +00:00
Sergey Matyunin 28d6b9ccd9 docs: specify lock and orange icon palette
Issue: #219
User-Visible: no
2026-08-20 14:38:35 +03:00
claude[bot] b56e122b07 docs: review document for #218
Issue: #218
User-Visible: no
2026-08-20 11:24:46 +00:00
Sergey Matyunin 3d11758e2b fix: keep Glow visible with noisy floor geometry
Stabilize polygon-boolean inputs at render time and isolate residual
room failures without weakening fail-dark clipping.

Issue: #218
User-Visible: yes
2026-08-20 14:05:22 +03:00
claude[bot] 4c512fa59f docs: review document for #218
Issue: #218
User-Visible: no
2026-08-20 10:47:39 +00:00
Sergey Matyunin 72275de567 docs: add risk analysis for glow geometry
Issue: #218
User-Visible: no
2026-08-20 13:43:20 +03:00
claude[bot] f9accc1198 docs: review document for #218
Issue: #218
User-Visible: no
2026-08-20 10:41:59 +00:00
Sergey Matyunin c6ff34cea3 docs: specify resilient glow floor geometry
Issue: #218
User-Visible: no
2026-08-20 13:35:09 +03:00
claude[bot] 9e8393f874 docs: review document for #217
Validate / docs (push) Successful in 26s
Validate / provenance (push) Successful in 52s
Validate / process-gate (push) Failing after 1m1s
Validate / changes (push) Successful in 53s
Validate / hacs (push) Skipped
Validate / hassfest (push) Skipped
Validate / reuse (push) Successful in 58s
Validate / backend (push) Skipped
Validate / frontend (push) Successful in 6m44s
Validate / golden (push) Failing after 11m20s
Validate / performance_smoke (push) Failing after 12m44s
Validate / smoke (push) Failing after 31m10s
Issue: #217
User-Visible: no
2026-08-20 10:30:27 +00:00
Sergey Matyunin 39456dc44c fix: restore capsule outline for text markers
Issue: #217
User-Visible: yes
2026-08-20 13:21:40 +03:00