Проблема
После последних изменений pkg/sqlite стал канонической точкой сборки MetaDSL в SQLite:
- схема собирается из корневых
*.sql;
relation() раскладывает meta, fields, superposition, processes, reactions, matter по реляционным таблицам;
- AST-слой убран из текущего пути подготовки данных. :contentReference[oaicite:0]{index=0} :contentReference[oaicite:1]{index=1}
Но dark всё ещё живёт от raw DSL:
dark/load.ts загружает meta.json и строит Meta напрямую из объекта;
- в
Dark ещё осталась завязка на MetaAST / старый AST-слой. :contentReference[oaicite:2]{index=2} :contentReference[oaicite:3]{index=3}
В итоге сейчас SQLite уже хранит каноническое описание, но данные для тёмной материи из него ещё не подготавливаются.
Что нужно сделать
Нужно перевести подготовку данных для Dark на SQLite и сделать отдельную dark-проекцию из канонической реляционной схемы.
Важно:
- не делать raw DSL вторым источником истины;
- не дублировать канонические данные в новых persist-таблицах без необходимости;
- использовать SQLite как канонический слой, а в TypeScript собирать из него dark-пакет для materialization.
Цель
Сделать так, чтобы Dark получал не сырой TS/JSON DSL, а уже подготовленный нормализованный пакет данных из SQLite, пригодный для сборки тёмной топологии.
Текущее состояние, которое нужно учесть
1. Канонический SQLite-слой уже есть
pkg/sqlite/sqlite.ts собирает общую схему из отдельных SQL-модулей и открывает БД как каноническую MetaDSL-базу. relation.ts уже пишет в неё meta, fields, superposition, process, reactions, matter. :contentReference[oaicite:4]{index=4} :contentReference[oaicite:5]{index=5}
2. matter-схема уже рассчитана на более полную проекцию, чем реально записывается сейчас
DDL уже содержит:
matter_node
matter_edge
matter_binding
matter_binding_dep
matter_meta
matter_condition
matter_logical
matter_map
matter_attr
matter_attr_binding
matter_attr_part
matter_style_prop
matter_event_update :contentReference[oaicite:6]{index=6}
Но текущий relationMatter() фактически пишет только:
- узлы,
- рёбра,
src_binding для meta-узлов. :contentReference[oaicite:7]{index=7}
То есть схема уже позволяет хранить нормализованное topology/matter-представление, но write-side пока доведён не до конца.
3. process тоже записывается не полностью
DDL уже содержит:
process_action
process_action_read
process_action_write
process_finally
process_finally_read :contentReference[oaicite:8]{index=8} :contentReference[oaicite:9]{index=9}
Но текущий relationProcess() сохраняет только:
- запись в
process
env в process_env. :contentReference[oaicite:10]{index=10}
4. Поля уже движутся в правильную сторону для topology-слоя
enum и array уже сохраняются по позициям, а значения приводятся к текстовой форме. Это подходит для topology-уровня, где важнее порядок, связь и вариант, чем исходный scalar-type. :contentReference[oaicite:11]{index=11} :contentReference[oaicite:12]{index=12}
Архитектурное решение
Нужен отдельный projector/assembler в pkg/sqlite, который:
- читает канонические строки из SQLite;
- собирает из них нормализованный dark-bundle;
- возвращает его в
dark/load для дальнейшей materialization.
То есть источник истины остаётся один — SQLite.
Dark получает уже готовую скрытую топологию, а не raw DSL.
Предлагаемое направление проекции
Смысловая проекция должна быть такой:
matter_node.node_kind = 'meta' → Wimp
matter_node.node_kind = 'cond' → Fuzzy
matter_node.node_kind = 'log' → Axion
matter_node.node_kind = 'map' → Macho
Bindings при этом должны собираться в нормализованную форму:
static
variable
dynamic + deps + expr
то есть без потери различия между:
- литералом,
- ссылкой на путь,
- вычисляемым выражением с зависимостями.
Что именно нужно реализовать
Этап 1. Довести запись канонического слоя до полноты
Дописать сохранение в SQLite для matter:
matter_meta.fields_binding
matter_meta.mass_binding
matter_condition.predicate_binding
matter_logical.predicate_binding
matter_map.collection_binding
- ветвление
then / else
matter_attr
matter_attr_binding
matter_attr_part
matter_style_prop
matter_event_update
Дописать сохранение для process:
process_action
process_action_read
process_action_write
process_finally
process_finally_read
Этап 2. Добавить dark read-model поверх SQLite
Добавить в pkg/sqlite новый модуль, например:
с публичной функцией вида:
которая возвращает нормализованный пакет для Dark.
Этап 3. Перевести dark/load на SQLite
Заменить прямую загрузку raw DSL на чтение из SQLite:
- либо полностью,
- либо сначала параллельным путём под тесты и миграцию.
Ожидаемый результат
После выполнения задачи:
-
pkg/sqlite становится не только write-side канонического DSL-слоя, но и точкой подготовки данных для Dark;
-
Dark перестаёт зависеть от прямой загрузки raw DSL / meta.json;
-
тёмная материя начинает materialize-иться из канонической SQLite-схемы;
-
канонический источник истины остаётся один;
-
появляется чёткое разделение:
- SQLite — каноническая плоскость,
- TypeScript — сборка dark-проекции,
- Dark — materialization скрытой связности.
Критерии приёмки
-
matter записывается в SQLite полностью, без потери src / fields / mass / predicate / collection / attrs / events / branches;
-
process записывается полностью, включая action/finally/read/write;
-
из SQLite можно собрать dark-bundle без обращения к raw DSL;
-
dark/load может построить Meta и topology из SQLite-проекции;
-
тесты покрывают:
- meta → sqlite
- sqlite → dark-bundle
- dark-bundle → materialization
-
raw DSL больше не является обязательным runtime-источником для Dark.
Дополнительно
На этом этапе не нужно:
- заводить отдельные persist-таблицы
dark_*, если проекция может собираться из канонических таблиц;
- дублировать source of truth;
- возвращать AST назад в новый путь.
Проблема
После последних изменений
pkg/sqliteстал канонической точкой сборки MetaDSL в SQLite:*.sql;relation()раскладываетmeta,fields,superposition,processes,reactions,matterпо реляционным таблицам;Но
darkвсё ещё живёт от raw DSL:dark/load.tsзагружаетmeta.jsonи строитMetaнапрямую из объекта;Darkещё осталась завязка наMetaAST/ старый AST-слой. :contentReference[oaicite:2]{index=2} :contentReference[oaicite:3]{index=3}В итоге сейчас SQLite уже хранит каноническое описание, но данные для тёмной материи из него ещё не подготавливаются.
Что нужно сделать
Нужно перевести подготовку данных для
Darkна SQLite и сделать отдельную dark-проекцию из канонической реляционной схемы.Важно:
Цель
Сделать так, чтобы
Darkполучал не сырой TS/JSON DSL, а уже подготовленный нормализованный пакет данных из SQLite, пригодный для сборки тёмной топологии.Текущее состояние, которое нужно учесть
1. Канонический SQLite-слой уже есть
pkg/sqlite/sqlite.tsсобирает общую схему из отдельных SQL-модулей и открывает БД как каноническую MetaDSL-базу.relation.tsуже пишет в неёmeta,fields,superposition,process,reactions,matter. :contentReference[oaicite:4]{index=4} :contentReference[oaicite:5]{index=5}2.
matter-схема уже рассчитана на более полную проекцию, чем реально записывается сейчасDDL уже содержит:
matter_nodematter_edgematter_bindingmatter_binding_depmatter_metamatter_conditionmatter_logicalmatter_mapmatter_attrmatter_attr_bindingmatter_attr_partmatter_style_propmatter_event_update:contentReference[oaicite:6]{index=6}Но текущий
relationMatter()фактически пишет только:src_bindingдляmeta-узлов. :contentReference[oaicite:7]{index=7}То есть схема уже позволяет хранить нормализованное topology/matter-представление, но write-side пока доведён не до конца.
3.
processтоже записывается не полностьюDDL уже содержит:
process_actionprocess_action_readprocess_action_writeprocess_finallyprocess_finally_read:contentReference[oaicite:8]{index=8} :contentReference[oaicite:9]{index=9}Но текущий
relationProcess()сохраняет только:processenvвprocess_env. :contentReference[oaicite:10]{index=10}4. Поля уже движутся в правильную сторону для topology-слоя
enumиarrayуже сохраняются по позициям, а значения приводятся к текстовой форме. Это подходит для topology-уровня, где важнее порядок, связь и вариант, чем исходный scalar-type. :contentReference[oaicite:11]{index=11} :contentReference[oaicite:12]{index=12}Архитектурное решение
Нужен отдельный projector/assembler в
pkg/sqlite, который:dark/loadдля дальнейшей materialization.То есть источник истины остаётся один — SQLite.
Dark получает уже готовую скрытую топологию, а не raw DSL.
Предлагаемое направление проекции
Смысловая проекция должна быть такой:
matter_node.node_kind = 'meta'→Wimpmatter_node.node_kind = 'cond'→Fuzzymatter_node.node_kind = 'log'→Axionmatter_node.node_kind = 'map'→MachoBindings при этом должны собираться в нормализованную форму:
staticvariabledynamic + deps + exprто есть без потери различия между:
Что именно нужно реализовать
Этап 1. Довести запись канонического слоя до полноты
Дописать сохранение в SQLite для
matter:matter_meta.fields_bindingmatter_meta.mass_bindingmatter_condition.predicate_bindingmatter_logical.predicate_bindingmatter_map.collection_bindingthen/elsematter_attrmatter_attr_bindingmatter_attr_partmatter_style_propmatter_event_updateДописать сохранение для
process:process_actionprocess_action_readprocess_action_writeprocess_finallyprocess_finally_readЭтап 2. Добавить dark read-model поверх SQLite
Добавить в
pkg/sqliteновый модуль, например:pkg/sqlite/dark.tsс публичной функцией вида:
которая возвращает нормализованный пакет для
Dark.Этап 3. Перевести
dark/loadна SQLiteЗаменить прямую загрузку raw DSL на чтение из SQLite:
Ожидаемый результат
После выполнения задачи:
pkg/sqliteстановится не только write-side канонического DSL-слоя, но и точкой подготовки данных дляDark;Darkперестаёт зависеть от прямой загрузки raw DSL /meta.json;тёмная материя начинает materialize-иться из канонической SQLite-схемы;
канонический источник истины остаётся один;
появляется чёткое разделение:
Критерии приёмки
matterзаписывается в SQLite полностью, без потериsrc / fields / mass / predicate / collection / attrs / events / branches;processзаписывается полностью, включая action/finally/read/write;из SQLite можно собрать dark-bundle без обращения к raw DSL;
dark/loadможет построитьMetaи topology из SQLite-проекции;тесты покрывают:
raw DSL больше не является обязательным runtime-источником для
Dark.Дополнительно
На этом этапе не нужно:
dark_*, если проекция может собираться из канонических таблиц;