mirror of
https://github.com/penpot/penpot.git
synced 2026-10-29 22:10:34 +00:00
An index of identity, type, and topology in datascript, replacing the per-file Ladybug database for reverse and cross-container questions. Entity identity is the (container, shape) pair, never the shape id alone: uuid/zero keys every page's root frame, duplicated pages share non-root ids, and deleted components keep their own copy of the main-instance subtree under the same ids. app.graph.overlay projects a file's data into the index: pages and component containers, shapes, components, and the asset node kinds the Ladybug projection never gained (colors, typographies, token sets, tokens), with their link transforms from beadpot's ledger (UsesColor, UsesTypography, UsesToken) as reference attributes and relation entities. Color references are stored per source (fill, stroke, text content) so the sync path can rebuild each contribution from a single :set operation. app.graph.overlay.queries holds the shared rule set and the standing question set. The four Cypher edge kinds are rules over indexed attributes, so they cannot drift from what they restate. The helpers in app.common.types.component and friends stay the oracle: instance-head? is the [?s :shape/component-id _] clause, never a reimplementation, and the local upward walk stays with ctn/get-parent-heads when the caller holds the document, because the pointer chain beats the rule walk by three orders of magnitude. app.graph.overlay.sync applies Penpot change vectors to the index, pure db-to-db, mirroring app.common.files.changes/process-change per clause, including load-component-objects on soft component deletion. app.graph.overlay.console parses, gates, and formats free-form Datalog: datascript resolves namespace-qualified symbols in call position via resolve, so every call symbol must be a built-in, an aggregate, or a shared rule. The suites pin: overlay answers identical to the helpers on constructed fixtures (177 assertions, beadpot's graph tests backported with each claim verified against a helper), synced index equal to a rebuilt one after every prefix of a 29-change replay covering all 12 supported change types, and the console gate. Measured on the Pencil design system (49 pages, 21 256 shapes, 730 components): build 1.63 s, 157 893 datoms, about 7.5 MB retained, answers identical to the helpers across 724 components, 1 000 sampled parent-head chains, and 5 549 frame subtrees; sync p95 0.28 ms per commit. The Ladybug session tier measured 33 to 43 s and 144 MB for a 20k-shape file the projection can ingest; the projection still rejects every real file at the Path node. AI-assisted-by: claude-fable-5