Commit Graph
613 Commits
Author SHA1 Message Date
claude[bot] 10d5b5a288 docs: review document for #229
Issue: #229
User-Visible: no
2026-08-21 09:57:36 +00:00
Codex 50a00e41a1 docs: refresh documentation screenshots (#229)
`scripts/check-docs.mjs` держит скриншоты в соответствии с исходниками через
отпечаток `src/**`. Отпечаток был просрочен ещё до этой задачи — проверено
исполнением на чистом dev, — так что перезахват закрывает чужой долг заодно с
изменением, которое отпечаток всё равно бы сдвинуло. Содержательно кадры те
же: меняется только шум рендера.

Issue: #229
User-Visible: no
2026-08-21 12:40:41 +03:00
Codex e6be43b90f feat: a straight wall is one record, not a row of seams (#229)
Рисование прямой стены в несколько кликов оставляло по записи на каждый
отрезок. Швы невидимы, пока их не тронешь: выделение хватает кусок,
перетаскивание ломает стену пополам, толщина задаётся пофрагментно. У стен
комнат этого давно нет — `normalizeWallIntervals` схлопывает каждый сплошной
участок одной толщины. Независимые перегородки жили по другому правилу.

Новый чистый модуль `src/wall-merge.ts` даёт им то же правило:

- `mergeCollinearPartitions` сращивает соседей одинаковой толщины и
  направления до неподвижной точки, но только там, где узел никому не нужен.
  Узел остаётся, если в него приходит третья перегородка, стена комнаты
  (стороной, а не только вершиной), колонна или конец сохранённого черновика.
- Направление выжившей записи канонизируется лексикографически: иначе одна и
  та же физическая стена выходила то a→b, то b→a в зависимости от порядка
  входа, и каждый host.t вдоль неё переворачивался вместе с ней.
- `applyOpeningMoves` переносит проёмы на выжившую запись: и авторитетный
  `host`, и legacy-проекцию `x/y/angle`, которую рисует старый читатель
  конфига (docs/CONFIG-COMPATIBILITY.md, #132). Проекция здесь не кэш —
  канонизация направления разворачивает угол на 180°.

Рисование сращивает только свою цепочку и то, чего она коснулась (§8.6 ТЗ):
молча править чужие швы в стороне оно не вправе — для этого есть
«Оптимизировать планы» с предпросмотром, отчётом и отменой. Оптимизация
проходит по всему пространству без seed-ограничения и отдельной строкой
сообщает, сколько записей исчезло.

Issue: #229
User-Visible: yes
2026-08-21 12:40:34 +03:00
claude[bot] 483c29cc39 docs: review document for #229
Issue: #229
User-Visible: no
2026-08-21 09:01:53 +00:00
Codex 1ecd267138 docs: a room junction is a side, not just a corner (#229 r2 M1)
The tolerance fix in r2 named the room's nearest polygon vertex as the point
of contact, which silently excluded the T-junction — a partition meeting the
middle of a room wall. That is a documented product case (141-wall-junctions
§13.1) and the code already measures distance to the edge, not the vertex
(distToSegment over roomEdges). Merging would have run straight through a
legitimate node.

AC2 now proves the room case with a T-junction into the middle of a long
side, and a mutant restores the vertex-only search.

Issue: #229
User-Visible: no
2026-08-21 11:55:51 +03:00
claude[bot] 5c560df1a2 docs: review document for #229
Issue: #229
User-Visible: no
2026-08-21 08:54:11 +00:00
Codex ecc3d6a88b docs: close M1, M2 and M3 from the spec review of #229
M1: "merge across the whole space when a chain ends" quietly overreached the
owner's split — drawing fixes its own seam, the optimiser fixes what has piled
up, and only the latter comes with a report and an undo. Section 8.6 now scopes
it to the connected component the new chain belongs to.

M2: the tolerance for "something else meets here" was only defined for a
partition-to-partition joint. Room edges, columns and drafts now use the same
EPS_JOIN — a gap cannot be a junction in one case and not in another.

M3: an opening also carries a materialised x/y/angle projection that
CONFIG-COMPATIBILITY (#132) requires to stay in step with its host, and the
code already re-materialises it after every host change. Merging is such a
change; AC3 now fails if only host.t is recomputed and the projection goes
stale.

Issue: #229
User-Visible: no
2026-08-21 11:46:36 +03:00
claude[bot] 5b8b6899da docs: review document for #229
Issue: #229
User-Visible: no
2026-08-21 08:43:01 +00:00
Codex 81210f7afc docs: spec for merging collinear wall segments
Written on the owner's decisions of 2026-08-21: merge as the chain is
finished, sweep already-drawn plans from "Optimise plans", and keep merging
even when an opening sits on the seam.

The part that is easy to miss is that last one. An opening stores its
position as a fraction of its host's length, so merging two partitions
changes the length under it and moves the door unless the fraction is
recomputed. AC3 therefore checks the door's coordinates in plan units, not
that a field was rewritten.

Issue: #229
User-Visible: no
2026-08-21 11:32:07 +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
claude[bot]andCodex 810ad01ce9 docs: review document for #225
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 3af04840a9 build: promote v1.66.0 after beta.1
Issue: #221
User-Visible: yes
2026-08-20 16:05:55 +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