Files
discussions/.wiki/concepts/modulair-rag-brainstorm-trace.md
vitya 3f714d1b23 Promote modulair-rag brainstorm trace to .wiki/concepts/
First real run of meeting-room-promote-brainstorm. Process trace classified
as room-meta (domain design already lives in ~/projects/.wiki/). Buffer
archived as 2026-05-05-modulair-rag.md. tasks_create skipped — target
projects (modulair-rag, meeting-room) not yet registered in projects-meta;
3 deferred actions documented in the trace itself.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 14:41:08 +03:00

186 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
date: 2026-05-05
source: .brainstorm/modulair-rag.md
status: promoted
type: room-meta
---
# ModulAIr RAG — brainstorm trace
> Promoted 2026-05-05 from `.brainstorm/modulair-rag.md` (single-agent session inside `.meeting-room/`). Process trace — фиксирует **как развивался брейнсторм**, какие развилки выбрали, что отвергнуто и почему. Доменный design финализирован отдельно в `~/projects/.wiki/concepts/modulair-rag-design.md`.
> Source scenario: `scenarios/modulair.md` (4-agent meeting frontmatter, не запускалось — пользователь предпочёл одного собеседника).
> Prior multi-agent transcript: `.wiki/raw/research/2026-05-03-modulair.md` — там пользователь с другим ассистентом прошёл первый круг и накопил пул tooling-кандидатов (Marker, Repomix, ArchiveBox, Memos, Hermes-agent, и др.).
---
## Контекст ModulAIr
ModulAIr — AI-управляемый секвенсор/контроллер для еврорэка на Pico 2 W. Декомпозирован на 6 sub-projects:
- `modulair-hw` — KiCad PCB (Pico 2 W + DAC + Gate-drivers + ADC + MIDI TRS + audio preamp + eurorack-питание)
- `modulair-fw` — прошивка Pico 2 W
- `modulair-script` — Teletype-style DSL + интерпретатор
- `modulair-mcp` — MCP-мост между LLM и Pico
- **`modulair-rag`** — база знаний ◄ предмет этого брейнсторма
- `modulair-agent` — Hermes-агент как top-level orchestrator
**Сквозная архитектурная развилка решена: Variant A — Pico-autonomous, LLM-conductor.** Pico исполняет скрипты sample-accurate, LLM через MCP мутирует паттерны/скрипты, но не сидит в горячем audio-пути. Wi-Fi latency перестаёт быть проблемой.
## RAG-решения и почему
### Стратегия — c-tiered (а не плоский vector RAG)
Чисто вектор-RAG плох на factual-лукапах в синт-домене:
- Эмбеддинги "08V" / "±5V" / "0V to 10V" близки в семантическом пространстве, но это разные факты
- Отрицание ("у X нет Reset-входа") не работает — ретривер тащит чанки где есть "Reset" и "X" рядом
- Сравнения требуют JOIN, а не top-k retrieval
- Чанкинг ломает таблицы datasheet'ов
**Tier 1** vector (manuals / theory / VCV source / forum threads) — recall-heavy, fuzzy.
**Tier 2** structured Postgres (module specs из ModularGrid + vendor parsers) — precision-heavy, точные ответы.
**Tier 3** ручные аннотации (~50 модулей личного рэка, calibration quirks, undocumented behavior).
### Storage
- **Postgres (cloud, существующий)** для Tier 2/3. **Не MariaDB:** JSONB для переменной формы jack-списков, pgvector как открытая дверь, recursive CTE + lateral joins зрелее, array-типы родные, MCP/ORM-экосистема Postgres-first.
- **LightRAG #2 (новый instance с `working_dir=modulair-rag`)** для Tier 1. Текущий LightRAG-корпус не трогаем — он для других задач.
- **Не pgvector unified** — это потребовало бы миграцию текущего LightRAG.
- **Не Neo4j** — overkill для тысяч модулей; relations моделируются плоскими таблицами.
### Scope первой итерации — (II) MVP на full-scrape ModularGrid
~15k модулей, ~1 месяц. Альтернативы: (I) Top-50 за 2 недели — учиться на знакомом; (III) всё сразу за 1.52 мес. Выбрано (II) — компромисс между амбицией и сроками.
Что меняется при этом скоупе:
- **Per-field provenance обязательна** — без неё не отличить достоверный ±5V от LLM-угадки
- **LLM-extraction как этап pipeline** — jacks/polarity/range живут в свободном тексте описаний и manual PDF, нужен LLM-проход по 15k
- **Validation gates first-class** — voltage standards становятся правилами (audio типично ±5V, anomaly → флаг)
### Pipeline — immutable layered (L1-L4)
```
L1 raw HTML → MinIO bucket, content-addressed (sha256)
L2 DOM extracts → JSONL/run, структурные поля (HP, manufacturer, current_ma)
L3 LLM extracts → JSONL/run, jacks/polarity/range из свободного текста
L4 Postgres → "current state", собран из L2+L3+Tier-3
```
Зачем слоями: на MVP схема меняется ~5×, LLM-промпт ~10×. Без immutable слоёв каждое изменение = повторный scrape (медленно, rate-limit) + LLM-проход (дорого). С immutable — пере-extract из L2/L3 за минуты.
### Source стратегия — multi-source
```
1. Vendor-side parsers (top-10):
pichenettes/eurorack (canonical Mutable), Make Noise, Intellijel,
Doepfer, ALM, Noise Engineering, Befaco, 4ms, Erica, Tiptop
2. ModularGrid scrape (HTML, ≤1 RPS, weekly cron)
robots.txt allow модули и .json; их официальный API паузнут из-за EU copyright reform
3. Tier 3 — ручные аннотации (~50 модулей личного рэка)
```
Не зависимы от ModularGrid одного — фрагильно (DOM может смениться, anti-scrape, юр. неопределённость).
### Extractor LLM — Ollama Cloud sample first, не Haiku
Решение: первый прогон через Ollama Cloud (GLM-5.1 / qwen) на golden set, валидация против Haiku 4.5 как benchmark. Если разница <5pp на ключевых метриках — Ollama, бесплатно. Если ≥10pp — Haiku-tiered с Sonnet 4.6 на flagged записях.
**Golden set protocol** (12 дня ручной работы):
- ~40 модулей: 20 Mutable (pichenettes/eurorack), 10 Doepfer, 5 Make Noise/Intellijel, 5 edge-case
- JSON-эталон per модуль: `{name, direction, signal_type, polarity, range_v_min, range_v_max}`
- Метрики/пороги: F1 signal_type ≥0.85, Acc polarity ≥0.85, MAE range ≤0.5V, hallucination ≤5%, miss ≤15%
- Артефакты в git: `golden/`, `runs/<model>/`, `metrics/`
### Provenance — module_facts + materialized consensus view
```sql
module_facts (
module_id, field, value JSONB, confidence REAL,
source_layer -- 'L2-dom' | 'L3-llm-haiku' | 'L3-llm-sonnet' | 'tier3-manual'
source_ref, -- 'scrape-2026-05-05/mutable-rings.json#desc-jacks'
scraped_at
)
```
Плоские `modules` / `jacks` — materialized view "consensus" поверх highest-confidence values. MCP читает плоский view, валидатор/админка — `module_facts` напрямую. Альтернатива (`<col>_confidence`/`<col>_source` рядом) отвергнута — на 30+ полях шум.
### Tier 1 corpus — phased
**Phase 1 (MVP):** ModularGrid descriptions всех 15k (из L1) + top-100 vendor manuals + VCV Rack Fundamental/Library source + 3050 hand-curated theory статей.
**Phase 2 post-MVP:** vendor manuals top-500, YouTube whisper-транскрипты топ-creator'ов, selected forum threads.
**Phase 3:** long-tail manuals, full forum scrape с quality filter.
### Deploy shape — Docker compose, своё железо
Existing: Postgres, Traefik, Portainer, kicad-mcp (для других sub-projects).
5 новых контейнеров для modulair-rag:
1. `lightrag-modulair` — Tier 1 vector, working_dir отдельный
2. `minio` — L1 raw HTML cache, content-addressed
3. `modulair-pipeline` — scraper + extractor + loader, cron внутри
4. `tier1-converter` — Marker + Repomix + Firecrawl batch jobs
5. `modulair-mcp` — MCP-сервер для Hermes (`module_spec`, `concept_search`, `module_compare`, `module_pairs`, `module_text`, `rack_modules`, `provenance`)
### Orchestration — Hermes, не n8n
Hermes-agent живёт в отдельном sub-project и через MCP зовёт наш `modulair-mcp` + (будущий) `firmware-mcp` + собственные Python-skills для batch (`run_repomix`, `run_marker`). n8n из плана убран — дублирует Hermes.
Phases:
- Phase 1 — cron внутри контейнеров
- Phase 2 — Changedetection.io webhooks → Hermes scheduled-automations
- Phase 3 — расширение Hermes skills (multi-source priorisation, feedback-loop из Memos/Obsidian, vendor-парсеры как skills)
## Что отвергнуто и почему
| Отвергнуто | Причина |
|---|---|
| Pure vector RAG (c-flat) | Factual-лукапы галлюцинируют; embeddings не различают voltage ranges |
| Postgres + pgvector unified (α) | Заставит мигрировать существующий LightRAG-корпус |
| MariaDB | JSONB и pgvector будущего — типпинг-пойнт за Postgres |
| Neo4j | Overkill для тысяч модулей; relations плоско моделируются |
| n8n | Дублирует Hermes-agent |
| markitdown как primary | Marker лучше PDF, Repomix лучше код, Firecrawl лучше JS-сайты |
| tree-sitter primary chunking | Repomix даёт structure-aware MD из коробки |
| DVC | pg_dump + content-addressed MinIO покрывают provenance |
| kicad-mcp в modulair-rag | Out of scope; живёт в modulair-agent / modulair-hw |
| ArchiveBox в MVP | Heavy (Docker+Chrome+Node), своя scraper-реализация дешевле для targeted-scrape |
## Открытые вопросы (не блокируют MVP)
- Финальный размер golden-set (40 принято; ужесточение MAE до 0.2V для CV-модулей — после первого прогона)
- Music theory sources — конкретный список 3050 статей не зафиксирован (упомянуты Allen Strange, Whitwell, SoS Synth Secrets, Eno strategies)
- Phasing для feedback-loop (Memos / Obsidian #feedback) — Phase 2, конкретная реализация позже
- Где физически живёт kicad-mcp (host stdio vs Docker) — релевантно для modulair-agent / modulair-hw, не для modulair-rag
## Tooling из исходного транскрипта 2026-05-03
| Категория | Что взято | Что отвергнуто |
|---|---|---|
| PDF→MD | **Marker** (primary), **LlamaParse** (fallback) | markitdown как primary, Docling (только если Marker не установится) |
| Web→MD | **Firecrawl** (batch), **Jina Reader** (одноразовый) | Trafilatura |
| Code→MD | **Repomix** | tree-sitter с нуля |
| Web archive | **Wallabag** в Phase 2 | ArchiveBox в MVP, Linkwarden, Shiori |
| Change detection | **Changedetection.io** в Phase 2 | (alone, без n8n) |
| Orchestration | **Hermes-agent** | n8n, Huginn |
| Data versioning | `pg_dump` + content-addressed MinIO | DVC |
| Feedback loop | **Memos** или **Obsidian** в Phase 2 | (одно из двух) |
| Container UI | **Portainer** (existing) | Dockge |
| Vector store | **LightRAG** (existing для других, новый instance для modulair) | ChromaDB, Pinecone, GraphRAG |
| Algo composition | **music21** — для modulair-agent, не RAG | — |
| Embedded DSP | Pure Data + hvcc / Faust — для modulair-fw audio sub-project, не RAG | — |
| EDA → MD | **kicad-mcp** существующий, для modulair-hw / modulair-agent | KiCad-CLI / KiBot — out of scope для modulair-rag |
## Меморики, появившиеся за сессию
- `feedback_meeting_room_workspace.md``.meeting-room` это brainstorm-зона, артефакты идут в `.brainstorm/` или global wiki, не через "transit-zone autopilot"
- `project_extend_discipline_for_meeting_room.md` — открытый todo расширить project-discipline под brainstorm-workspaces
- `feedback_read_source_transcripts.md``.meeting-room/source/<date>-<topic>.md` это pre-loaded user research, читать до предложения стэка
## Deferred actions (не созданы как таски)
Целевые проекты `modulair-rag`/`meeting-room` пока не зарегистрированы в `projects-meta` (на 2026-05-05 в `meta_status` — 12 проектов, ни один из них). `tasks_create` в скиле `meeting-room-promote-brainstorm` пропущен. Перевести в backlog при появлении проектов:
1. Брейнсторм per остальным 5 sub-projects (`modulair-hw`, `modulair-fw`, `modulair-script`, `modulair-mcp`, `modulair-agent`) — owner: meeting-room.
2. Когда RAG-implementation начнётся — поднять структуру репозитория `modulair-rag` где-то в `~/projects/`, скелет compose.yml, `.tasks/STATUS.md` под фактический проект — owner: modulair-rag.
3. Заведение golden-set (12 дня ручной работы — это первое что нужно сделать; в MVP это блокирующая зависимость для extractor-валидации) — owner: modulair-rag.