diff --git a/docs/superpowers/plans/2026-05-27-kompas-fdm-design-skill.md b/docs/superpowers/plans/2026-05-27-kompas-fdm-design-skill.md new file mode 100644 index 0000000..ad2258f --- /dev/null +++ b/docs/superpowers/plans/2026-05-27-kompas-fdm-design-skill.md @@ -0,0 +1,609 @@ +# kompas-fdm-design Skill — Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Also use `superpowers:writing-skills`** when authoring/editing SKILL.md frontmatter & body. + +**Goal:** Создать отдельный навык `kompas-fdm-design` — методику проектирования деталей под FDM-печать в КОМПАС-3D через MCP (правила DFM + лёгкая самопроверка геометрии), без слайсера, с числами, масштабируемыми по `w`/`h`/`θ_max`. + +**Architecture:** Навык — набор Markdown-файлов в `.claude/skills/kompas-fdm-design/`: лёгкий `SKILL.md` (диспетчер) + `references/fdm-rules.md` (полный свод DFM) + `references/geometry-audit.md` (самопроверка + границы). Progressive disclosure. **Полное финальное содержимое всех трёх файлов дано дословно в задачах ниже** (по итогам 3 ревью плана: транскрипция из spec признана риском тихой потери контента — поэтому план self-contained, исполнитель пишет готовый текст, не «переносит» из spec). + +**Tech Stack:** Markdown + YAML frontmatter. Кода/сборки/тестов .NET нет — навык не трогает MCP-сервер (`src/`). Проверка — структурная (`Select-String -SimpleMatch`) + по инвариантам. Опционально: live-обкатка через MCP (требует запущенного КОМПАС). + +**Source of truth (контекст, НЕ копировать вручную):** spec [`docs/superpowers/specs/2026-05-27-kompas-fdm-design-skill-design.md`](../specs/2026-05-27-kompas-fdm-design-skill-design.md) (учтены 3 ревью). Прецеденты: `.claude/skills/kompas-3d/SKILL.md`, `~/.claude/skills/orcaslicer/` (SKILL.md + references/). + +**Критичные инварианты (проверяются в Task 4):** +1. `θ_max` — параметр (от вертикали; дефолт 45° PLA / 40° PETG-ABS; `≈arctan(w/2h)`); нависания/teardrop/фаски/зенковки из него. +2. Teardrop: вершина на **`r / sin θ_max`** над центром, угол **`2·θ_max`** (при 45° → `√2·r`, `0.414r` над верхом окружности). +3. 90°-полка НЕ печатается (≠ «≤6 мм»); мост ≠ полка. +4. Натяг = **отрицательный** зазор (вычесть из номинала); зазоры «на сторону», диаметральный = 2×. +5. Допуск ±0.2 мм — точность изготовления, **НЕ прибавлять** к зазору посадки. +6. Компенсация Ø вертикальных отверстий: +0.2 (<4), +0.2–0.3 (4–10), +0.1–0.2 (>10); к диаметру (радиус +X/2). +7. Z-прочность по материалам (PLA 40–55%, PETG 35–50%, ABS 20–35%); Z-сжатие можно, Z-растяжение/срез — нет. +8. Бор инсёрта `Ø_bore = OD_инсёрта − (0…0.1) мм` (≤ OD). +9. Гео-аудит эвристический, **НЕ доказывает печатнопригодность**; путь нагрузки — из задачи, не из габарита. +10. Экспорт — `export_step`; `export_stl` НЕ вводить. +11. **Имя продукта-слайсера** (OrcaSlicer/Cura/PrusaSlicer/Bambu/…) не упоминается. Понятия «слайсинг/слайсер/g-code» допустимы для описания границ. + +--- + +## Task 1: Скелет навыка + `SKILL.md` + +**Files:** Create `.claude/skills/kompas-fdm-design/SKILL.md` + +- [ ] **Step 1: Создать каталог** + +```powershell +New-Item -ItemType Directory -Force ".claude/skills/kompas-fdm-design/references" | Out-Null +``` + +- [ ] **Step 2: Записать `SKILL.md` дословно** + +````markdown +--- +name: kompas-fdm-design +description: > + Методика проектирования деталей под FDM/FFF 3D-печать в КОМПАС-3D через MCP-сервер этого + проекта: правила DFM (нависания и угол θ_max, толщины стенок n·w, отверстия и teardrop, + посадки/зазоры, ориентация под прочность, elephant foot, бобышки/инсёрты/защёлки) ПЛЮС + лёгкая самопроверка геометрии инструментами осмотра. Используй, когда задача — спроектировать + или ДОВЕСТИ деталь, чтобы она хорошо ПЕЧАТАЛАСЬ на FDM. Триггеры: «сделай деталь + печатнопригодной / под FDM», «спроектируй … под печать», «напечатается ли без поддержек?», + «подбери зазоры для печатной посадки», «как ориентировать деталь под печать», «почему деталь + плохо печатается / где будут нависания», «доведи деталь под FDM». Строит через навык kompas-3d. + НЕ для: механики построения через MCP (это kompas-3d); слайсинга/нарезки/g-code (вне границ); + поиска по справке SDK (субагент kompas-sdk-research). +--- + +# kompas-fdm-design — проектирование деталей под FDM-печать + +## Что это (и чем НЕ является) + +Методический слой **поверх** навыка `kompas-3d`. Отвечает на вопрос **«как спроектировать, чтобы +напечаталось на FDM»**, а не «чем строить». + +- **`kompas-3d`** = *чем и как строить* через MCP (эскиз→операция→осмотр→`validate_part`). Этот + навык **опирается** на него для механики. +- Этот навык = *какие правила геометрии* соблюдать, чтобы FDM-печать удалась. +- **Слайсинг — вне границ.** Навык не нарезает и не оценивает g-code. + +## Когда применять / когда НЕ применять + +**Применять:** «сделай печатнопригодным / под FDM», «спроектируй … под печать», «напечатается без +поддержек?», «подбери зазоры печатной посадки», «как ориентировать под печать», «почему плохо +печатается», «доведи деталь под печать». + +**НЕ применять:** чистая механика построения (→ `kompas-3d`); слайсинг/нарезка/g-code (вне границ); +поиск сигнатур/констант в справке SDK (→ субагент `kompas-sdk-research`). + +## Калибровка (выполни первым шагом) + +Все правила масштабируются от трёх параметров (часть значений — абсолютные эмпирические мм, +помечены «калибровать тестом»): + +- **`w` = ширина линии ≈ диаметр сопла.** Дефолт: сопло 0.4 → `w ≈ 0.4–0.45 мм`. → стенки `n·w`. +- **`h` = высота слоя.** Дефолт `h ≈ 0.5·сопло` (0.2 мм); структурная печать 0.2–0.25. +- **`θ_max` = предельный угол самонесущей поверхности ОТ ВЕРТИКАЛИ.** `θ_max ≈ arctan(w/2h)` + (≈45° при `w`=0.4, `h`=0.2). **Дефолт 45°** (PLA, хороший обдув); **40°** для PETG/ABS или + толстого слоя (`h≥0.3` → ~34°). Нависания, teardrop, фаски, зенковки берут угол из `θ_max`. +- **Материал** (PLA / PETG / ABS) — модификатор зазоров/мостов/коробления/`θ_max`. См. + `references/fdm-rules.md`. + +Если сопло/слой/материал не заданы — прими дефолты (сопло 0.4, `h`=0.2, PLA) и скажи об этом. + +## Два правила (соблюдай всегда) + +**1. Ориентация печати — первое проектное решение.** +- **Спроси у пользователя** (если не задано): главное направление рабочей нагрузки и + косметические/критичные грани. **Путь нагрузки из геометрии не выводится** — его задаёт задача. +- Реши постановку на стол (ось Z = рост слоёв). От неё зависит: где нависания; куда смотрят + отверстия (вертикальные → компенсация Ø; горизонтальные → teardrop); путь нагрузки (**держи в + XY**; Z-сжатие можно, Z-растяжение/срез — нет); плоскости сопряжения (на XY-гранях); «лесенка» на + наклонных функциональных поверхностях; если поддержки неизбежны — чтобы опорные грани были + некритичными/скрытыми. +- Зафиксируй ориентацию и проектируй под неё. + +**2. Чек-лист печатнопригодности перед выдачей** (ниже). Сначала **`validate_part`** (деталь +*валидна*), затем **FDM-чек-лист** (деталь *печатнопригодна*) — разные проверки. **Гео-аудит +эвристический и не доказывает печатнопригодность** (не ловит путь нагрузки/анизотропию). + +## Рабочий цикл + +1. **Калибровка**: сопло→`w`; слой→`h`→`θ_max`; материал→поправки. +2. **Ориентация** (правило 1): опрос (нагрузка/косметика) → постановка, ось слоёв, сопряжения, + «лесенка», поддержки. +3. **Правила эскиза/операции** (строй через `kompas-3d`): стенки `n·w`; нависания → скос под + `θ_max`; горизонтальные отверстия → teardrop; вертикальные → компенсация Ø; фаска у основания; + зазоры посадок (со знаком); заходные фаски; мин. элементы/текст; бобышки/инсёрты/защёлки. + Числа — в `references/fdm-rules.md`. +4. **Гео-аудит** (`references/geometry-audit.md`) — инструментами осмотра. +5. **Предусловия экспорта**: единое тело/манифолд (`boolean_union` при необходимости) → + `validate_part` чисто. +6. **Чек-лист** → экспорт **через `export_step`**. + +## Чек-лист печатнопригодности + +- [ ] Направление нагрузки и косметические грани **получены от пользователя**; ориентация + зафиксирована; нагрузка в XY (или Z только на сжатие); сопряжения на XY-гранях. +- [ ] Стенки кратны `w` (≥2·w; несущие ≥3·w = N периметров); нет «не кратных `w`» (кроме + функциональных). +- [ ] Нет 90°-полок; нависания ≤`θ_max` или заменены скосами; мосты в пределах пролёта по короткой + стороне; внутренним поддержкам — доступ. +- [ ] Горизонтальные отверстия — teardrop/D (геометрия из `θ_max`); вертикальные — компенсация Ø; + глухие — дно ≥2–3 мм. +- [ ] Фаска у основания (elephant foot); внутренние углы ≥R0.5; опорная площадка есть. +- [ ] Посадки по таблице со **знаком** (натяг — вычесть); допуск ±0.2 **НЕ** прибавлен к зазору; + заходные фаски на сопряжениях. +- [ ] Мин. элементы/текст ≥ порогов; аспект тонких выступов ≤4–5×. +- [ ] Бобышки/инсёрты (бор ≤ OD, ставить с Z-грани)/резьба/защёлки (изгиб в XY) по правилам. +- [ ] Полости — дренаж/вент; критичные поверхности не под «лесенкой»/поддержкой. +- [ ] Предусловия экспорта: единое тело/манифолд; `validate_part` чисто. + +## Гео-аудит (кратко) + +Лёгкая самопроверка построенной модели **существующими** инструментами осмотра MCP: +`describe_model` / `list_faces` / `describe_face` (нависания по нормалям нижних граней; цилиндры с +горизонтальной осью → нужен teardrop), `get_bounding_box` (как ось слоёв соотносится с габаритом), +`measure` (номиналы/зазоры), `list_bodies` + `validate_part` (единое тело). **Границы и методика — +`references/geometry-audit.md`.** Аудит эвристический; истинная мин. толщина стенки и полный детект +криволинейных нависаний не решаются — это **не приговор и не доказательство печатнопригодности**. + +## Связанное + +- Полный численный свод DFM: [`references/fdm-rules.md`](references/fdm-rules.md). +- Рецепты самопроверки и границы: [`references/geometry-audit.md`](references/geometry-audit.md). +- Механика построения через MCP: навык **`kompas-3d`**. +- Поиск по справке SDK: субагент **`kompas-sdk-research`**. +- Дизайн навыка: `docs/superpowers/specs/2026-05-27-kompas-fdm-design-skill-design.md`. +```` + +- [ ] **Step 3: Проверить структуру, имя, ссылки, объём** + +```powershell +$skill = ".claude/skills/kompas-fdm-design/SKILL.md" +Test-Path $skill +(Select-String -SimpleMatch -Path $skill -Pattern "name: kompas-fdm-design").Count # 1 +(Select-String -SimpleMatch -Path $skill -Pattern "## Два правила").Count # 1 +(Select-String -SimpleMatch -Path $skill -Pattern "## Чек-лист печатнопригодности").Count # 1 +(Select-String -SimpleMatch -Path $skill -Pattern "references/fdm-rules.md").Count # >=1 +(Select-String -SimpleMatch -Path $skill -Pattern "references/geometry-audit.md").Count # >=1 +(Get-Content $skill | Measure-Object -Line).Lines # <= ~200 (диспетчер лёгкий) +``` +Expected: `True`; счётчики `1,1,1,≥1,≥1`; строк ≤ ~200. + +- [ ] **Step 4: Commit** + +```powershell +git add .claude/skills/kompas-fdm-design/SKILL.md +git commit -m "feat(skill): kompas-fdm-design — диспетчер SKILL.md (правила DFM + гео-аудит)" +``` + +--- + +## Task 2: `references/fdm-rules.md` (полный свод DFM) + +**Files:** Create `.claude/skills/kompas-fdm-design/references/fdm-rules.md` + +- [ ] **Step 1: Записать файл дословно** + +````markdown +# Свод правил DFM для FDM-печати + +> Выверено 3 ревью (pi/glm-5.1, pi/kimi-k2.6, Codex). Числа для `w≈0.4–0.45`, `h≈0.2` (сопло 0.4). +> **Зазоры — на сторону (радиальные)**; диаметральный = 2×. **Угол нависания — от вертикали** +> (вертикаль=0°, горизонталь=90°); самонесущие — ≤ `θ_max`. Параметры `w`/`h`/`θ_max` — см. +> SKILL.md → «Калибровка». Ссылки «§N» ниже — на разделы этого файла. + +## 1. Стенки и оболочки +- Толщина стенки = **`n · w`**. Мин. конструктивная — **2·w (~0.8 мм)**; несущая — **≥3·w**. +- **Маппинг стенка→периметры:** нужно `N` периметров ⇒ стенка **≥ `N·w`** (при `w`=0.45: 3 → 1.35, + 4 → 1.8, 5 → 2.25 мм). +- **Не задавай толщину стенки, не кратную `w`** (напр. 0.6 при `w`=0.45): слайсер оставит зазор + или переэкструдирует. Прыгай на следующий кратный. +- **Caveat:** `n·w` — для конструктивных стенок; внешняя функциональная величина (флексура, + тепловой барьер, посадочный размер) важнее кратности. +- Одиночная стенка `1·w` — только декоративная. Узкий сквозной прорез — **≥2·w (~0.8 мм)**. + +## 2. Нависания, полки, мосты (разделять!) +- **Самонесущие — поверхности ≤ `θ_max` от вертикали.** 45–60° (при дефолте) — печатается с + падением качества; **> `θ_max` существенно — поддержки** → избегать редизайном. +- **90°-полка (консоль, опора с одной стороны) НЕ печатается ни на какой длине** (миф «≤6 мм» + неверен — провисает с первого слоя). Любую горизонтальную полку: **скос под `θ_max`**, либо + **превратить в мост** (две опоры), либо поддержка. +- **Мост (bridge) — пролёт между двумя опорами на одной высоте.** При достаточном обдуве, `h≈0.2`, + консервативно (для ненастроенного слайсера): **PLA ~15–25 мм, PETG ~10–15 мм, ABS ~12–18 мм**. + Длинные прямоугольные проёмы **ориентировать так, чтобы мост шёл по короткой стороне**; концы — + на сплошных опорах. +- Нижнюю функциональную поверхность моста — припуск **0.2–0.3 мм** на провис. *Граница:* величину + провиса из CAD не предсказать (обдув/скорость — настройки печати). +- **Внутренние/потолочные нависания хуже наружных** — потолок пазов аркой/шевроном, не плоским + пролётом > 2 мм. +- **Доступ к поддержкам:** окно во внутренней полости **≥8–10 мм**. + +## 3. Отверстия +- **Вертикальные (ось ∥ Z)** печатаются уже номинала → **увеличить диаметр модели** (радиус на + половину): **+0.2 мм (Ø<4)**, **+0.2–0.3 мм (Ø 4–10)**, **+0.1–0.2 мм (Ø>10)**; калибровать, + критичные — рассверливать. +- **Горизонтальные (ось в XY)** → **teardrop** или **D-отверстие** (плоский верх). Мин. Ø **2 мм**. + Круглая часть тоже печатается уже → **+0.1–0.2 мм** к её Ø. +- **Геометрия teardrop:** боковины касательны окружности под углом `θ_max` к вертикали (с двух + сторон), сходятся в вершине на вертикальной оси. Высота вершины над центром = **`r / sin θ_max`**; + включённый угол при вершине = **`2·θ_max`**. При `θ_max`=45° → `r/sin45° = √2·r ≈ 1.414·r` над + центром (= **`0.414·r` над верхом окружности**), угол 90°. Низ — оставшаяся дуга окружности. +- **Глухое отверстие:** дно = внутренний мост → **толщина дна ≥2–3 мм** или купольное/ + вентилируемое. Сквозные предпочтительнее. +- **Отступ от края** — через остаточную перемычку: стенка между отверстием и краем **≥2–3·w** + (лёгкая нагрузка) / больше под крепёж. + +## 4. Посадки и зазоры (печатная деталь ↔ печатная деталь) +Зазор **на сторону** (радиальный); диаметральный = 2× значения: + +| Посадка | Зазор/сторону | Примечание | +|---|---|---| +| **Натяг (press)** | **−0.05…0 мм** (вычесть из номинала!) | короткий, PLA; иначе snap-fit (§14) | +| Переходная/плотная | 0.05–0.15 мм | | +| Скользящая | 0.15–0.20 мм | PLA↔PLA; контакт ≥20 мм → 0.20; PETG +0.05 | +| Свободная | 0.25–0.35 мм | >0.35/сторону — уже очень слабо | + +- **Знак:** «натяг» = **отрицательный** зазор → вычесть из номинала (вал +/отверстие −). + Положительное число в строке press — ошибка прочтения. +- **ABS↔ABS:** +0.05/сторону. **PETG:** прессовые со временем «расслабляются». +- **Допуск точности (НЕ прибавлять к посадкам):** общий разброс FDM — **XY ±0.2 мм** (±0.1 + калибровано), **Z хуже**. Это точность изготовления, не добавка к зазору. + +## 5. Первый слой / стол +- **Elephant foot** — от притирки первого слоя (низкий Z-offset/переэкструзия; НЕ от высоты слоя). + Фаска по нижним рёбрам: **0.3 × 45° (калибровано)** / **0.5–1.0 × 45° (слабая калибровка)**. +- Внутренние углы у основания — **скругление ≥R0.5**. +- **Опорная площадка:** без «лезвийных» оснований; контакт хотя бы ~3 периметра. Высокие тонкие + детали — **интегральный фланец 1–2 мм** (предпочтительнее brim). + +## 6. Ориентация и прочность +- **Z (межслойная) прочность от XY:** PLA ~40–55%, PETG ~35–50%, **ABS ~20–35% (выброс)**. Несущую + нагрузку — в **XY (вдоль слоёв)**. +- **Z-сжатие допустимо** (слои в сжатии не расслаиваются); избегать **Z-растяжения и Z-среза**. +- Изгиб: слои в растяжении/сжатии, не на срез по линии слоя. +- Z-нагрузка неизбежна → **увеличить несущее сечение** ~×2 относительно XY-расчёта. +- Плоскости сопряжения — на **XY-гранях**, не на Z-боковинах. + +## 7. Минимальные элементы и текст +- Выступ/штифт/ребро — **≥1·w (≥0.5 мм)**; паз/щель — **≥2·w (~0.8 мм)**. +- **Аспект тонких выступов:** высота ≤ ~4–5× базовой ширины; выше — конусность/раскос/редизайн. +- **Выпуклый** текст: штрих **≥0.5 мм**, высота **≥2·h (~0.4 мм)**, sans-serif bold. +- **Гравированный** текст: штрих **≥2·w (~0.8–0.9 мм)** (нужно ≥2 периметра; 0.6 мм не влезает), + глубина **≥2·h (~0.4 мм)**. (pt не используем — геометрия в мм.) + +## 8. «Лесенка» (staircase) — критерий ориентации +- Наклонные/криволинейные поверхности дают ступени: глубина ≈ **`h / tan(α)`** (α — угол от + горизонтали). Пример: α=30°, `h`=0.2 → ~0.35 мм. +- Критичные (скользящие/уплотняющие/оптические) поверхности **ориентировать вертикально или + горизонтально**. Это вход в правило ориентации (SKILL.md, правило 1). +- Большой плоский **верх** без опоры коробит («подушка») — внутренние рёбра каждые ~15–20 мм или + достаточная толщина верха. + +## 9. Бобышки, инсёрты, резьба +- **Саморез/винтонарезной** пилот (M3): ~Ø2.5 PLA / Ø2.6 PETG / Ø2.7 ABS; заход ≥3 мм. +- **Термоинсёрт латунный** (M3): бор **по даташиту** (типично ~Ø4.0, ±0.05); **`Ø_bore = OD_инсёрта + − (0…0.1) мм`** (≤ OD, лёгкий натяг под расплав — НЕ больше OD); стенка бобышки **≥2 мм**; глубина + = длина инсёрта + 0.5 мм; **ставить с верхней (Z) грани** (не в боковину). +- **Бобышка под винт:** OD ≥ 2–3× Ø винта; не делать массивный сплошной объём (карман/оболочка). +- **Сквозное под металлический болт:** радиальный зазор 0.2–0.3 → **+0.4–0.6 мм к номиналу** болта. +- **Резьба:** не моделировать ~½ толщины стенки** сам даёт + нависание > `θ_max` → тогда фаска/ступень. +- **Внутренние углы — всегда скругление ≥R0.5**. + +## 11. Зенковки / цековки +- **Цековка (counterbore)** — большим Ø/полостью **вверх** (дно по телу, не мостом); глубина +0.3 мм. +- **Зенковка (countersink):** конус **вверх**; включённый угол **≤90°** → стенки ≤45° от вертикали + печатается; **>90°** → стенки-нависание → поддержка или замена цилиндрической цековкой. + +## 12. Заходные фаски (assembly relief) +- На штифтах, отверстиях, инсёртах, защёлках, «ласточкиных хвостах» — **заходная фаска** (≈0.5–1 мм + × 45° или ≈ половина зазора) против задиров при сборке. + +## 13. Разбиение детали и сборка из печатных частей +- Конфликт «прочная ориентация vs бесподдержечность», или крупная/коробящаяся деталь → **разбить** + на части с самоустанавливающимися стыками (печатные штифты/шпонки/замки), склейка; стыки на + XY-гранях. Зазор стыка — по §4. + +## 14. Защёлки (snap-fit) / живой шарнир +- Консольная защёлка: толщина балки **≥2–3·w (≈1.0–2.0 мм)**, зацеп/возврат **0.3–0.8 мм**, + длина/толщина **≥5:1** (до 10:1), **скругление в основании ≥R0.5**. +- **Направление слоёв:** балка гнётся **в плоскости XY** (слои перпендикулярны изгибу), **не + поперёк Z** (расслоится с первого нажатия). +- **Живой шарнир** — только PLA/PP-подобные, перемычка **0.3–0.5 мм**; PETG/ABS не годятся. + +## 15. Коробление (геометрия) +- Большие плоскости (>80×80, особенно ABS): скругления углов R3–5 + рёбра/решётка снизу. +- Радиус внешних углов: R2 (ABS) / R1 (PLA/PETG). +- Длинные тонкие пролёты (>60 мм, <2 мм) — рёбра/косынки каждые 30–40 мм; высота ребра ≤5× базы. +- Избегать сплошных кубов/плит → карман/оболочка + рёбра. Усадка: PLA ~0.3%, PETG ~0.5%, ABS ~0.8%. +- Симметрия геометрии уравновешивает усадку. +- *«Мышиные уши» (Ø8–10 мм по углам)* — **крайняя мера адгезии** (по сути brim-геометрия); + предпочтительно интегральный фланец/скругления углов. +- *Граница:* стол/корпус/обдув для ABS — настройки печати, вне навыка; здесь только геометрия. + +## 16. Полые детали и гигиена модели +- **Полости:** дренаж Ø3–5 мм у **низшей** точки + вент у **высшей**. +- Допуски/зазоры — **в геометрию** (слайсер читает модель буквально). +- Раздельные тела — зазор ≥0.2 мм (общая CAD-гигиена; перед выдачей объединять — рабочий цикл, + шаг 5 в SKILL.md). +```` + +- [ ] **Step 2: Структурная проверка (16 разделов + 4 строки таблицы посадок)** + +```powershell +$rules = ".claude/skills/kompas-fdm-design/references/fdm-rules.md" +(Select-String -Path $rules -Pattern "^## \d+\.").Count # 16 (разделы) +(Select-String -SimpleMatch -Path $rules -Pattern "| Натяг (press)").Count # 1 (строка таблицы) +(Select-String -SimpleMatch -Path $rules -Pattern "| Свободная").Count # 1 +``` +Expected: `16, 1, 1`. Если разделов ≠16 — потерян/задвоен раздел. + +- [ ] **Step 3: Проверка инвариантов содержимого (по литералам)** + +```powershell +$rules = ".claude/skills/kompas-fdm-design/references/fdm-rules.md" +foreach ($p in @( + "r / sin θ_max", "2·θ_max", "0.414·r над верхом", # inv2 teardrop + "90°-полка", "НЕ печатается ни на какой длине", # inv3 полка + "вычесть из номинала", "−0.05…0 мм", # inv4 натяг + "НЕ прибавлять к посадкам", # inv5 допуск + "+0.2 мм (Ø<4)", "+0.2–0.3 мм (Ø 4–10)", # inv6 компенсация + "PLA ~40–55%", "ABS ~20–35%", # inv7 Z-прочность + "Ø_bore = OD_инсёрта − (0…0.1) мм" # inv8 инсёрт +)) { "{0,-40} {1}" -f $p, ((Select-String -SimpleMatch -Path $rules -Pattern $p).Count) } +``` +Expected: каждая строка оканчивается `1` (или больше). Любой `0` = потерянный инвариант, исправить. + +- [ ] **Step 4: Commit** + +```powershell +git add .claude/skills/kompas-fdm-design/references/fdm-rules.md +git commit -m "feat(skill): kompas-fdm-design — references/fdm-rules.md (полный свод DFM)" +``` + +--- + +## Task 3: `references/geometry-audit.md` (самопроверка + границы) + +**Files:** Create `.claude/skills/kompas-fdm-design/references/geometry-audit.md` +**Source:** spec §9 (таблица + границы). «Как применять в цикле» — авторский раздел (привязка к +рабочему циклу), содержимое дано ниже дословно (НЕ плейсхолдер). + +- [ ] **Step 1: Записать файл дословно** + +````markdown +# Гео-аудит модели под FDM — что проверяемо инструментами осмотра + +Лёгкая самопроверка построенной модели **существующими** инструментами осмотра MCP. Запускать на +шаге 4 рабочего цикла (см. SKILL.md), перед чек-листом и экспортом. + +## Что проверяемо + +| Проверка | Как | Статус | +|---|---|---| +| Нависания (приближённо) | `list_faces`/`describe_face`: для **нижних** граней угол поверхности от вертикали; > `θ_max` → флаг | ✅ плоские; ⚠️ криволинейные грубо | +| Ориентация (геом. прокси) | `get_bounding_box`: как ось слоёв соотносится с габаритом | ⚠️ длинная ось ≠ путь нагрузки | +| Горизонтальные круглые отверстия | `describe_face`: цилиндр с горизонтальной осью → «нужен teardrop» | ✅ | +| Номиналы / зазоры / габариты | `measure` между гранями; `get_bounding_box` | ✅ | +| Тело / манифолд перед выдачей | `list_bodies` (одно тело?), `validate_part` | ✅ | + +## Граница честности + +- **Угол нависания** мерить в **той же конвенции, что fdm-rules.md** (от вертикали; нижняя грань с + поверхностью > `θ_max` от вертикали = нависание) — не путать с углом нормали от горизонтали. +- **Путь нагрузки агент НЕ выводит из габарита** — берёт из задачи/опроса (правило 1). Длинная ось + ≠ несущая. +- **Истинная мин. толщина стенки и полный детект криволинейных нависаний — не решаются** (нет + thickness/overhang-солвера). +- **Аудит эвристический и НЕ доказывает печатнопригодность** (не ловит анизотропию/путь нагрузки). + Вывод — список флагов для решения, не «приговор». Слайсер навык не зовёт намеренно. + +## Как применять в цикле + +1. После построения и `validate_part` — пройти таблицу выше сверху вниз. +2. Каждый флаг — сверить с соответствующим правилом `fdm-rules.md` и решить: исправить геометрию + или принять осознанно. +3. Путь нагрузки и косметические грани взять из ответа пользователя (правило 1), не из габарита. +4. Затем — чек-лист печатнопригодности (SKILL.md) → экспорт через `export_step`. +```` + +- [ ] **Step 2: Проверка (5 строк таблицы + границы)** + +```powershell +$audit = ".claude/skills/kompas-fdm-design/references/geometry-audit.md" +(Select-String -SimpleMatch -Path $audit -Pattern "| Нависания (приближённо)").Count # 1 +(Select-String -SimpleMatch -Path $audit -Pattern "| Ориентация (геом. прокси)").Count # 1 +(Select-String -SimpleMatch -Path $audit -Pattern "| Тело / манифолд перед выдачей").Count # 1 +(Select-String -SimpleMatch -Path $audit -Pattern "НЕ доказывает печатнопригодность").Count # 1 (inv9) +(Select-String -SimpleMatch -Path $audit -Pattern "берёт из задачи/опроса").Count # 1 (inv9) +``` +Expected: все `1`. + +- [ ] **Step 3: Commit** + +```powershell +git add .claude/skills/kompas-fdm-design/references/geometry-audit.md +git commit -m "feat(skill): kompas-fdm-design — references/geometry-audit.md (самопроверка + границы)" +``` + +--- + +## Task 4: Верификация навыка (инварианты + триггеры + границы scope) + +**Files:** Read `.claude/skills/kompas-fdm-design/**`. + +- [ ] **Step 1: Прогон по инвариантам 1–11 (одна команда, таблица результатов)** + +```powershell +$skill = ".claude/skills/kompas-fdm-design/SKILL.md" +$rules = ".claude/skills/kompas-fdm-design/references/fdm-rules.md" +$audit = ".claude/skills/kompas-fdm-design/references/geometry-audit.md" +$all = @($skill,$rules,$audit) + +# Должны ПРИСУТСТВОВАТЬ (count >=1): +$present = @( + @{n="1 θ_max param"; f=$skill; p="θ_max ≈ arctan(w/2h)"}, + @{n="2 teardrop"; f=$rules; p="r / sin θ_max"}, + @{n="3 полка"; f=$rules; p="НЕ печатается ни на какой длине"}, + @{n="4 натяг знак"; f=$rules; p="вычесть из номинала"}, + @{n="5 допуск"; f=$rules; p="НЕ прибавлять к посадкам"}, + @{n="6 комп. Ø"; f=$rules; p="+0.2 мм (Ø<4)"}, + @{n="7 Z PLA"; f=$rules; p="PLA ~40–55%"}, + @{n="8 инсёрт бор"; f=$rules; p="Ø_bore = OD_инсёрта − (0…0.1) мм"}, + @{n="9 аудит≠доказ"; f=$audit; p="НЕ доказывает печатнопригодность"}, + @{n="10 export_step"; f=$skill; p="export_step"} +) +foreach ($c in $present) { "{0,-16} {1}" -f $c.n, ((Select-String -SimpleMatch -Path $c.f -Pattern $c.p).Count) } + +# Должны ОТСУТСТВОВАТЬ (count = 0): +"10 export_stl {0}" -f ((Select-String -SimpleMatch -Path $all -Pattern "export_stl").Count) +"11 slicer-name {0}" -f ((Select-String -Path $all -Pattern "OrcaSlicer|PrusaSlicer|Cura|Bambu|SuperSlicer|Simplify3D|Slic3r|KISSlicer|ideaMaker").Count) +``` +Expected: блок «present» — все ≥1; `export_stl` = **0**; `slicer-name` = **0**. Любое нарушение — +вернуться в Task 1/2/3, исправить файл, переидти Step. + +- [ ] **Step 2: Тест триггеров `description` (пары + критерий)** + +Критерий: для каждого промпта оценить, перекрывает ли его текст `description` (по ключевым словам/ +смыслу). ✅ = должен сработать `kompas-fdm-design`; ❌ = должен уйти другому навыку/субагенту. + +| Промпт | Ожидание | +|---|---| +| «сделай эту деталь печатнопригодной» | ✅ kompas-fdm-design | +| «как ориентировать кронштейн под FDM» | ✅ kompas-fdm-design | +| «подбери зазор посадки для печати» | ✅ kompas-fdm-design | +| «подбери отверстие под термоинсёрт M3» | ✅ kompas-fdm-design | +| «напечатается ли без поддержек?» | ✅ kompas-fdm-design | +| «построй коробку выдавливанием 20×20×10» | ❌ → kompas-3d | +| «нарежь модель / сколько будет печататься» | ❌ → вне границ (слайсинг) | +| «какая сигнатура у IHole3D» | ❌ → kompas-sdk-research | + +Pass-критерий: все 5 ✅ покрываются триггерами `description`; все 3 ❌ покрываются блоком «НЕ для». +Если граница размыта (ложное ✅/❌) — уточнить формулировки триггеров/«НЕ для» в SKILL.md и +переидти Step 1+2. + +- [ ] **Step 3: Граница scope — не тронут `src/` (инвариант §2 spec: без новых MCP-инструментов)** + +```powershell +git diff --name-only main...HEAD | Where-Object { $_ -like "src/*" } +``` +Expected: **пусто** (навык не меняет MCP-сервер). Если есть `src/*` — ошибка scope. + +- [ ] **Step 4: Commit правок (если были)** + +```powershell +git add .claude/skills/kompas-fdm-design +git commit -m "fix(skill): kompas-fdm-design — уточнения по верификации" +``` +(Если правок не было — шаг пропустить, пустой коммит не делать.) + +--- + +## Task 5: Синхронизация документации проекта + +**Files (правит субагент `docs-maintainer`):** `README.md`, `CLAUDE.md`; при необходимости +`docs/ARCHITECTURE.md`. + +- [ ] **Step 1: Делегировать `docs-maintainer`** + +Через `Agent` (subagent_type `docs-maintainer`) передать сводку: «Добавлен навык +`.claude/skills/kompas-fdm-design/` — методика проектирования под FDM (правила DFM + лёгкий +гео-аудит), отдельный от `kompas-3d`, без слайсера, экспорт через `export_step`. Упомянуть рядом с +описанием навыка `kompas-3d` в `CLAUDE.md` (раздел Principle/skills) и в `README.md` (где +перечислены навыки). Счётчики инструментов/тестов НЕ меняются. presentation.html не трогать.» + +- [ ] **Step 2: Фолбэк, если субагент недоступен (ручная правка)** + +Если `docs-maintainer` недоступен — в `CLAUDE.md` найти строку-якорь: +`On top of MCP — skill **`.claude/skills/kompas-3d/`** with a methodology` и добавить сразу после +предложения: +> Additionally, the **`.claude/skills/kompas-fdm-design/`** skill layers FDM design-for-printing methodology (DFM rules + light geometry audit) on top of `kompas-3d`; standalone, no slicer, exports via `export_step`. + +В `README.md` — в разделе про навыки/skills добавить аналогичную строку про `kompas-fdm-design` +(если такого раздела нет — пропустить README). + +- [ ] **Step 3: Проверить и закоммитить** + +```powershell +(Select-String -SimpleMatch -Path "CLAUDE.md","README.md" -Pattern "kompas-fdm-design").Count # >=1 +git add CLAUDE.md README.md docs/ARCHITECTURE.md +git commit -m "docs: упомянуть навык kompas-fdm-design (проектирование под FDM)" +``` +Expected: счётчик ≥1. + +--- + +## Task 6 (опционально, рекомендуемый follow-up): live-обкатка в `usecases/` + +> **Рационал:** навык — дистилляция знаний, уже выверенная экспертными консультациями + 6 ревью +> (spec×3, план×3). Поэтому live-UC — **рекомендуемая валидация на живой модели, а не гейт** +> существования навыка (в отличие от новых MCP-механик, которые проект требует доказывать в +> `usecases/`). Требует запущенного КОМПАС. `usecases/` в .gitignore — коммит не нужен. + +**Files:** Create `usecases/0003-fdm-bracket-no-supports/case.md` (из `usecases/_TEMPLATE/`). + +- [ ] **Step 1: Завести кейс** + +```powershell +Copy-Item -Recurse "usecases/_TEMPLATE" "usecases/0003-fdm-bracket-no-supports" +``` + +- [ ] **Step 2: Заполнить `case.md`** — Цель: спроектировать простой кронштейн под FDM **без + поддержек**, применяя навык. Проверить на живой модели: ориентацию (правило 1), нависания (скос + под `θ_max`), горизонтальное отверстие (teardrop по `r/sin θ_max`), фаску у основания, гео-аудит, + чек-лист, экспорт `export_step`. Заполнить разделы Цель / Промт / Статус (см. соседние кейсы + `usecases/0001`, `usecases/0002` как образец оформления). + +- [ ] **Step 3: Прогнать сценарий через MCP** (если КОМПАС запущен): построить деталь правилами + навыка через `kompas-3d`, прогнать гео-аудит и чек-лист, сохранить артефакты в `artifacts/`, + экспортировать `export_step`. Зафиксировать находки в «Выводы». Подтверждённые числовые уточнения + — поднять в `references/fdm-rules.md` (и переидти Task 4 Step 1). + +--- + +## Task 7: Финальное ревью навыка и завершение ветки + +- [ ] **Step 1:** `superpowers:requesting-code-review` по диффу ветки (навык + доки) — ясность + формулировок, отсутствие плейсхолдеров, корректность кросс-ссылок. + +- [ ] **Step 2:** `superpowers:writing-skills`-верификация: frontmatter валиден; `description` + срабатывает на целевых триггерах и не перехватывает чужие (Task 4 Step 2); progressive disclosure + соблюдён (SKILL.md лёгкий ≤~200 строк, числа в references). + +- [ ] **Step 3: Финальный коммит (условно)** + +```powershell +if ((git status --porcelain).Length -gt 0) { + git add -A; git commit -m "chore(skill): kompas-fdm-design — финал ревью" +} else { "Нет изменений — коммит не нужен" } +``` + +- [ ] **Step 4:** `superpowers:finishing-a-development-branch` — merge/PR по выбору пользователя. + +--- + +## Self-Review (выполнено автором плана) + +**1. Покрытие spec:** §1–§3 (цель/locked/параметры) → Task 1 (SKILL.md «Калибровка», описание). +§4 (структура файлов) → Tasks 1–3. §5 (два правила) + §6 (цикл) + §10 (чек-лист) → Task 1 (в +SKILL.md дословно). §7 (триггеры) → Task 1 frontmatter + Task 4 Step 2. §8.1–§8.16 → Task 2 (полный +текст). §9 → Task 3 (полный текст). §11 (обкатка) → Task 6 (с рационалом про опциональность). §12 +(non-goals: без слайсера/без MCP-инструментов/без export_stl) → Task 4 Step 1 (export_stl=0, +slicer-name=0) + Step 3 (нет `src/*`). §13 OQ-1/OQ-2 → Task 2 Step 3 (литералы компенсации/EF в +fdm-rules.md); OQ-3 → инв.10 (export_step есть, export_stl нет). Пробелов нет. + +**2. Плейсхолдеры:** все три файла даны дословно (включая «Как применять в цикле» в Task 3 — +авторский, с готовым текстом). Делегирование docs-maintainer снабжено ручным фолбэком (Task 5 +Step 2) с точным якорем и текстом. Task 4 Step 2 имеет явный pass-критерий. «TODO/TBD» нет. + +**3. Согласованность имён/формул:** имя `kompas-fdm-design`, пути файлов, параметры `w`/`h`/`θ_max`, +формула teardrop `r / sin θ_max` и угол `2·θ_max`, строка инсёрта `Ø_bore = OD_инсёрта − (0…0.1) мм`, +знак натяга `−0.05…0` — записаны единообразно в содержимом файлов (Tasks 1–3) и в литералах +проверок (Tasks 2–4). Проверочные `Select-String -SimpleMatch` используют те же литералы, что +записаны в файлы (нет regex-эскейпинга/кодпоинт-хрупкости). Заголовок плана: инварианты проверяются +в **Task 4** (исправлено). diff --git a/docs/superpowers/specs/2026-05-27-kompas-fdm-design-skill-design.md b/docs/superpowers/specs/2026-05-27-kompas-fdm-design-skill-design.md new file mode 100644 index 0000000..dbf52ab --- /dev/null +++ b/docs/superpowers/specs/2026-05-27-kompas-fdm-design-skill-design.md @@ -0,0 +1,342 @@ +# Дизайн навыка `kompas-fdm-design` — проектирование деталей под FDM-печать + +| Поле | Значение | +|------|----------| +| **Статус** | design (учтены 3 ревью: pi/glm-5.1, pi/kimi-k2.6, Codex CLI) | +| **Создан** | 2026-05-27 | +| **Тип** | новый навык (`.claude/skills/kompas-fdm-design/`) | +| **Источники** | консультации pi (`glm-5.1`, `kimi-k2.6`), ревью pi (`glm-5.1`, `kimi-k2.6`) + Codex CLI; прецеденты — навыки `kompas-3d`, `orcaslicer` | + +## 1. Цель + +Навык-**методика**: как проектировать (и доводить) детали так, чтобы они **хорошо печатались на +FDM/FFF** — без поддержек где возможно, с нужной прочностью на нагрузку, рабочими посадками и +компенсацией особенностей послойной печати. Модель строится через MCP-сервер КОМПАС-3D (этот +проект) с опорой на навык `kompas-3d`; новый навык отвечает на вопрос **«как спроектировать, чтобы +напечаталось»**, а не «чем строить». + +## 2. Зафиксированные решения (locked) + +1. **Отдельный навык** — `kompas-fdm-design`, не сливается в `kompas-3d`. +2. **Без слайсера** — навык **не ссылается** на слайсер и не делает слайс-петлю. Слайсинг вне границ. +3. **Границы = методика DFM + лёгкая самопроверка геометрии** существующими инструментами осмотра + MCP. **Никаких новых MCP-инструментов**, никакого thickness/overhang-солвера. +4. **Универсальный FDM.** Правила **масштабируются** по `w` (ширина линии ≈ диаметр сопла) и `h` + (высота слоя); часть значений — **абсолютные эмпирические мм** (компенсация отверстий, зазоры + посадок, фаски, инсёрты, коробление), они помечены как **калибруемые тестом**. «Параметризация» + не означает, что все числа — формулы от `w`/`h`. + +### Принцип проекта соблюдён +`MCP = возможности SDK (чем делать)`, `навык = методика (как делать)`. Правила DFM — методика, +в MCP не идут. Навык опирается на уже реализованные инструменты построения и осмотра. + +## 3. Параметризация + +- **`w` (ширина линии)** — для горизонтальных размеров/стенок. Дефолт: сопло 0.4 → `w ≈ 0.4–0.45 мм`. +- **`h` (высота слоя)** — для вертикали и поведения нависаний/мостов. Дефолт `h ≈ 0.5·сопло` + (0.2 мм); структурная печать `h = 0.2–0.25 мм`. +- **`θ_max` (предельный угол самонесущей поверхности от вертикали)** — **первоклассный параметр**. + Физически `θ_max ≈ arctan(w / 2h)` (≈45° при `w`=0.4, `h`=0.2). **Дефолт 45°** (PLA, хороший + обдув); **40°** для PETG/ABS или толстого слоя (`h≥0.3` → θ_max падает до ~34°). Все правила + нависаний/teardrop/фасок/зенковок берут угол **из `θ_max`**, не хардкодят 45°. +- **Материал** — модификатор: PLA (дефолт, стабилен), PETG (эластичнее, мосты хуже, посадки + «расслабляются», +0.05 мм/сторону к скользящим, θ_max ниже), ABS (усадка/коробление, +зазор, + скругления углов; корпус/обдув — настройки печати, см. границу §12). +- **Калибровочная памятка**: точные числа зависят от калибровки потока/притирки первого слоя/обдува; + навык даёт **разумные дефолты + «проверь печатным тестом»**, а не гарантии. + +## 4. Структура файлов + +``` +.claude/skills/kompas-fdm-design/ +├── SKILL.md ← диспетчер (progressive disclosure) +└── references/ + ├── fdm-rules.md ← полный численный свод DFM + └── geometry-audit.md ← рецепты самопроверки + честные границы +``` + +### 4.1 `SKILL.md` (диспетчер) +- **Frontmatter**: `name`, `description` с триггерами (§7). +- **Когда применять / связь с `kompas-3d`**: kompas-3d = чем строить; этот навык = как + спроектировать под печать. Слайсер не упоминается. +- **Калибровка**: сопло → `w`; высота слоя → `h` → `θ_max`; материал → поправки. +- **Два ключевых правила** (§5), включая **рецепт-опрос** (направление нагрузки, косметические/ + критичные грани) перед фиксацией ориентации. +- **Рабочий цикл** (§6), **чек-лист печатнопригодности** (§10) — компактно. +- **Ссылки** на `references/`. Если SKILL.md перерастает ~180 строк — выносить детали в references + (держать диспетчер лёгким). + +### 4.2 `references/fdm-rules.md` — §8. ### 4.3 `references/geometry-audit.md` — §9. + +## 5. Два ключевых правила навыка + +1. **Ориентация печати — первое проектное решение.** До эскизов: + - **Спроси у пользователя** (если не задано): главное направление рабочей нагрузки и + косметические/критичные грани. Агент **не выводит путь нагрузки из геометрии** — его задаёт + задача. + - Реши, как деталь стоит на столе: ось Z = направление роста слоёв. От ориентации зависит: где + нависания; куда смотрят отверстия (вертикальные по Z → компенсация диаметра; горизонтальные в + XY → teardrop); путь несущей нагрузки (**держи нагрузку в плоскости XY, вдоль слоёв** — + межслойная прочность по Z ниже, см. §8.6; **Z-сжатие допустимо, Z-растяжение/срез — нет**); + плоскости сопряжения (на XY-гранях верх/низ, не на Z-боковинах); «лесенка» на наклонных/ + криволинейных функциональных поверхностях (§8.8); если поддержки неизбежны — чтобы опорные + грани были некритичными/скрытыми. + - Зафиксируй ориентацию и проектируй под неё. +2. **Чек-лист печатнопригодности перед выдачей.** DFM-чек-лист (§10) + лёгкий гео-аудит (§9), и + только потом экспорт. Связка с `kompas-3d`: сначала **`validate_part`** (деталь *валидна*), затем + **FDM-чек-лист** (деталь *печатнопригодна*) — разные проверки. **Гео-аудит эвристический и не + доказывает печатнопригодность** (не ловит путь нагрузки/анизотропию — §9). + +## 6. Рабочий цикл + +1. **Калибровка**: сопло → `w`; слой → `h` → `θ_max`; материал → поправки. +2. **Ориентация** (правило 1): опрос (нагрузка/косметика) → постановка на стол, ось слоёв, + плоскости сопряжения, учёт «лесенки» и поддержек. +3. **Правила эскиза/операции** (через `kompas-3d`): стенки `n·w`; нависания → фаски/скос под + `θ_max`; горизонтальные отверстия → teardrop; вертикальные → компенсация диаметра; фаска у + основания; зазоры посадок; заходные фаски; мин. элементы/текст; бобышки/инсёрты/защёлки. +4. **Гео-аудит** (§9). +5. **Предусловия экспорта**: единое тело/манифолд (`boolean_union` при необходимости) → + `validate_part` чисто. +6. **Чек-лист** (§10) → экспорт. + +## 7. Триггеры (для `description`) + +«сделай деталь печатнопригодной / под FDM», «спроектируй … под печать», «напечатается ли без +поддержек?», «подбери зазоры для печатной посадки», «как ориентировать деталь под печать», «почему +деталь плохо печатается / где будут нависания», «доведи деталь под FDM». + +**НЕ для:** механики построения через MCP (это `kompas-3d`); **слайсинга/нарезки/g-code** (вне +границ, отдельный инструмент слайсинга — по имени не называем); поиска по справке SDK (субагент +`kompas-sdk-research`). + +## 8. Свод правил DFM (`references/fdm-rules.md`) + +> Сведено из двух консультаций (glm-5.1 + kimi-k2.6) и выверено тремя ревью. Где источники +> расходились — взят выверенный дефолт + «калибровать тестом». Числа для `w≈0.4–0.45`, `h≈0.2` +> (сопло 0.4). **Зазоры — на сторону (радиальные)**; диаметральный = 2× табличного. **Угол нависания +> — от вертикали** (вертикаль=0°, горизонталь=90°); самонесущие — ≤ `θ_max`. + +### 8.1 Стенки и оболочки +- Толщина стенки = **`n · w`**. Мин. конструктивная — **2·w (~0.8 мм)**; несущая — **≥3·w**. +- **Маппинг стенка→периметры:** нужно `N` периметров ⇒ стенка **≥ `N·w`** (при `w`=0.45: 3 пер. = + 1.35, 4 = 1.8, 5 = 2.25 мм). +- **Не задавай толщину стенки, не кратную `w`** (напр. 0.6 при `w`=0.45): слайсер оставит зазор или + переэкструдирует → наплыв/размер «уехал». Прыгай на следующий кратный. +- **Caveat:** правило `n·w` — для **конструктивных** стенок; если толщина задана внешней + функциональной величиной (флексура, тепловой барьер, посадочный размер) — она важнее кратности. +- Одиночная стенка `1·w` — только декоративная. Узкий сквозной прорез — **≥2·w (~0.8 мм)**. + +### 8.2 Нависания, полки, мосты (разделять!) +- **Самонесущие — поверхности ≤ `θ_max` от вертикали.** 45–60° (при дефолте) — печатается с + падением качества; **> `θ_max` существенно — поддержки** → избегать редизайном. +- **90°-полка (консоль, опора с одной стороны) НЕ печатается ни на какой длине** — это не «≤6 мм», + а ~0 (один слой провисает). Любую горизонтальную полку: **скос под `θ_max`**, либо **превратить в + мост** (две опоры), либо поддержка. +- **Мост (bridge) — пролёт между двумя опорами на одной высоте.** При достаточном обдуве, `h≈0.2`, + консервативно (для ненастроенного слайсера): **PLA ~15–25 мм, PETG ~10–15 мм, ABS ~12–18 мм**. + Длинные прямоугольные проёмы **ориентировать так, чтобы мост шёл по короткой стороне**; концы + моста — на сплошных опорах. +- Функциональную нижнюю поверхность моста закладывать с припуском **0.2–0.3 мм** на провис. + *Граница:* величину провиса (мм) из CAD не предсказать (зависит от обдува/скорости — настройки + печати); припуск — ориентир, не гарантия. +- **Внутренние/потолочные нависания хуже наружных** (нет обдува) — потолок пазов делать аркой/ + шевроном, не плоским пролётом > 2 мм. +- **Доступ к поддержкам:** если поддержка во внутренней полости неизбежна — окно доступа **≥8–10 мм**. + +### 8.3 Отверстия +- **Вертикальные (ось ∥ Z)** печатаются уже номинала → **увеличить диаметр модели** (радиус на + половину): **+0.2 мм (Ø<4)**, **+0.2–0.3 мм (Ø 4–10)**, **+0.1–0.2 мм (Ø>10)**; калибровать, + критичные — рассверливать. +- **Горизонтальные (ось в XY)** → **teardrop** или **D-отверстие** (плоский верх). Мин. Ø **2 мм**. + Круглая часть тоже печатается уже → **+0.1–0.2 мм** к её Ø. +- **Геометрия teardrop (выверено всеми ревью):** боковины касательны окружности под углом `θ_max` + к вертикали (с двух сторон), сходятся в вершине на вертикальной оси. Высота вершины над центром + = **`r / sin θ_max`**; включённый угол при вершине = **`2·θ_max`**. При `θ_max`=45° → + `r/sin45° = √2·r ≈ 1.414·r` над центром (= **`0.414·r` над верхом окружности**), включённый угол + 90°. Низ — оставшаяся дуга окружности. (Проверка вывода: расстояние от центра до боковой прямой, + проходящей через вершину `(0, d)` с направлением `θ_max` от вертикали, равно `d·sin θ_max`; + приравнивая к `r`, получаем `d = r/sin θ_max`.) +- **Глухое отверстие:** дно — внутренний мост; делать **толщину дна ≥2–3 мм** или купольное/ + вентилируемое. Сквозные предпочтительнее. +- **Отступ от края:** не «2·Ø», а через **остаточную перемычку** — стенка между отверстием и краем + **≥2–3·w** (лёгкая нагрузка) / больше под крепёж. + +### 8.4 Посадки и зазоры (печатная деталь ↔ печатная деталь) +Зазор **на сторону** (радиальный); диаметральный = 2× значения: + +| Посадка | Зазор/сторону | Примечание | +|---|---|---| +| **Натяг (press)** | **−0.05…0 мм** (вычесть из номинала!) | короткий, PLA; иначе snap-fit (§8.14) | +| Переходная/плотная | 0.05–0.15 мм | | +| Скользящая | 0.15–0.20 мм | PLA↔PLA; контакт ≥20 мм → 0.20; PETG +0.05 | +| Свободная | 0.25–0.35 мм | >0.35/сторону — уже очень слабо | + +- **Знак:** «натяг» = **отрицательный** зазор → диаметр вала +/отверстия − относительно номинала. + Положительное число в строке press — ошибка прочтения. +- **ABS↔ABS:** +0.05/сторону. **PETG:** прессовые со временем «расслабляются». +- **Допуск точности (НЕ прибавлять к посадкам):** общий размерный разброс FDM — **XY ±0.2 мм** + (±0.1 на калиброванной), **Z хуже (±0.2…)**. Это точность изготовления, а не добавка к зазору; + критичные сопряжения проектировать на худшую ось. + +### 8.5 Первый слой / контакт со столом +- **Elephant foot** — раздутие нижнего периметра от **притирки первого слоя** (низкий Z-offset/ + переэкструзия; НЕ от высоты слоя). Снимать **фаской по нижним рёбрам**: **0.3 × 45° (калибровано)** + / **0.5–1.0 × 45° (слабая калибровка / сильная притирка)**. +- Внутренние углы у основания — **скругление ≥R0.5**. +- **Опорная площадка:** без «лезвийных» оснований; контакт хотя бы в ~3 периметра. Высокие тонкие + детали — **интегральный фланец 1–2 мм** как геометрия (предпочтительнее всякого brim). + +### 8.6 Ориентация и прочность +- **Z (межслойная) прочность от XY:** PLA ~40–55%, PETG ~35–50%, **ABS ~20–35% (выброс)**. + Несущую нагрузку — в **XY (вдоль слоёв)**. +- **Z-сжатие допустимо** (слои в сжатии не расслаиваются); избегать **Z-растяжения и Z-среза**. +- Изгиб: слои в растяжении/сжатии, не на срез по линии слоя. +- Если Z-нагрузка неизбежна — **увеличить несущее сечение** (площадь, работающую на нагрузку) + ориентировочно ×2 относительно XY-расчёта. +- Плоскости сопряжения — на **XY-гранях** (глаже/точнее), не на Z-боковинах. + +### 8.7 Минимальные элементы и текст +- Выступ/штифт/ребро — **≥1·w (≥0.5 мм)**; паз/щель — **≥2·w (~0.8 мм)**. +- **Аспект тонких выступов:** высота ≤ ~4–5× базовой ширины; выше — конусность/раскос/редизайн. +- **Выпуклый** текст: штрих **≥0.5 мм**, высота **≥2·h (~0.4 мм)**, sans-serif bold. +- **Гравированный** текст: штрих **≥2·w (~0.8–0.9 мм)** (нужно ≥2 периметра; 0.6 мм не влезает), + глубина **≥2·h (~0.4 мм)**. (pt не используем — моделируем геометрию в мм.) + +### 8.8 «Лесенка» (staircase) — критерий ориентации +- Наклонные/криволинейные поверхности дают ступени слоёв: глубина ≈ **`h / tan(α)`** (α — угол от + горизонтали). Пример: α=30°, `h`=0.2 → ~0.35 мм. +- Критичные (скользящие/уплотняющие/оптические) поверхности **ориентировать вертикально или + горизонтально**, не под малым углом. Это вход в правило ориентации (§5). +- Большой плоский **верх** без опоры коробит («подушка») — внутренние рёбра каждые ~15–20 мм или + достаточная толщина верха. + +### 8.9 Бобышки, инсёрты, резьба +- **Саморез/винтонарезной** пилот (M3): ~Ø2.5 PLA / Ø2.6 PETG / Ø2.7 ABS; заход ≥3 мм. +- **Термоинсёрт латунный** (M3): бор **по даташиту** (типично ~Ø4.0, ±0.05); **`Ø_bore = OD_инсёрта + − (0…0.1) мм`** (≤ OD, лёгкий натяг под расплав — НЕ больше OD, иначе нет удержания); стенка бобышки + **≥2 мм**; глубина = длина инсёрта + 0.5 мм; **ставить с верхней (Z) грани** (не в боковину). +- **Бобышка под винт (с инсёртом или само-нарезом):** OD ≥ 2–3× Ø винта; не делать массивный + сплошной объём (карман/оболочка). +- **Сквозное под металлический болт:** радиальный зазор 0.2–0.3 → **+0.4–0.6 мм к номиналу** болта. +- **Резьба:** не моделировать ~½ толщины стенки** сам создаёт зону + нависания > `θ_max` → тогда фаска/ступень. +- **Внутренние углы — всегда скругление ≥R0.5**. + +### 8.11 Зенковки / цековки +- **Цековка (counterbore)** — большим Ø/полостью **вверх** (дно по телу, не мостом); глубина +0.3 мм. +- **Зенковка (countersink):** конус **вверх**; при включённом угле **≤90°** стенки ≤45° от вертикали + — печатается; **>90°** стенки становятся нависанием → поддержка или замена цилиндрической цековкой. + (Не путать с «узким» конусом — он печатается, но как посадка под головку бесполезен.) + +### 8.12 Заходные фаски (assembly relief) +- На штифтах, отверстиях, инсёртах, защёлках, «ласточкиных хвостах» — **заходная фаска** (≈0.5–1 мм + × 45° или ≈ половина зазора) против задиров при первом контакте/сборке. + +### 8.13 Разбиение детали и сборка из печатных частей +- Если оптимальная по прочности ориентация конфликтует с беспод­держечностью, или деталь крупная/ + коробится — **разбить на части** с самоустанавливающимися стыками (печатные штифты/шпонки/замки), + склейка; стыки — на XY-гранях. Зазор стыка — по §8.4. + +### 8.14 Защёлки (snap-fit) / живой шарнир +- Консольная защёлка: толщина балки **≥2–3·w (≈1.0–2.0 мм)**, зацеп/возврат **0.3–0.8 мм**, + отношение длина/толщина **≥5:1** (до 10:1), **скругление в основании ≥R0.5** (концентратор). +- **Направление слоёв:** балка должна гнуться **в плоскости XY** (слои перпендикулярны изгибу), **не + поперёк Z** (расслоится с первого нажатия). +- **Живой шарнир** — только PLA/PP-подобные, толщина перемычки **0.3–0.5 мм**; PETG/ABS не годятся. + +### 8.15 Коробление (геометрия) +- Большие плоскости (>80×80, особенно ABS): скругления углов R3–5 + рёбра/решётка снизу. +- Радиус внешних углов: R2 (ABS) / R1 (PLA/PETG). +- Длинные тонкие пролёты (>60 мм, <2 мм) — рёбра/косынки каждые 30–40 мм; высота ребра ≤5× базы. +- Избегать сплошных кубов/плит → карман/оболочка + рёбра. Усадка: PLA ~0.3%, PETG ~0.5%, ABS ~0.8%. +- Симметрия геометрии уравновешивает усадку. +- *«Мышиные уши» (Ø8–10 мм пятна по углам)* — **крайняя мера адгезии** (по сути brim-геометрия, + ближе к настройке печати); предпочтительно интегральный фланец/скругления углов. +- *Граница:* стол/корпус/обдув для ABS — **настройки печати**, вне навыка; здесь только геометрия. + +### 8.16 Полые детали и общая гигиена модели +- **Полости:** дренаж Ø3–5 мм у **низшей** точки + вент у **высшей**. +- Допуски/зазоры — **в геометрию** (слайсер читает модель буквально, «доводчика» нет). +- Раздельные тела — зазор ≥0.2 мм (это общая CAD-гигиена; перед выдачей объединять — §6 шаг 5). + +## 9. Гео-аудит (`references/geometry-audit.md`) + +Лёгкая самопроверка инструментами осмотра MCP. **Что проверяемо и границы:** + +| Проверка | Как | Статус | +|---|---|---| +| Нависания (приближённо) | `list_faces`/`describe_face`: для **нижних** граней угол поверхности от вертикали; >`θ_max` → флаг | ✅ плоские; ⚠️ криволинейные грубо | +| Ориентация (геом. прокси) | `get_bounding_box`: как ось слоёв соотносится с габаритом | ⚠️ длинная ось ≠ путь нагрузки | +| Горизонтальные круглые отверстия | `describe_face`: цилиндр с горизонтальной осью → «нужен teardrop» | ✅ | +| Номиналы/зазоры/габариты | `measure` между гранями; `get_bounding_box` | ✅ | +| Тело/манифолд перед выдачей | `list_bodies` (одно тело?), `validate_part` | ✅ | + +**Граница честности (явно в навыке):** +- **Угол нависания** мерить в **той же конвенции, что §8** (от вертикали; нижняя грань с поверхностью + > `θ_max` от вертикали = нависание) — не путать с углом нормали от горизонтали. +- **Путь нагрузки агент НЕ выводит из габарита** — берёт из задачи/опроса (§5). Длинная ось ≠ несущая. +- **Истинная мин. толщина стенки и полный детект криволинейных нависаний — не решаются** (нет + солвера). +- **Аудит эвристический и НЕ доказывает печатнопригодность** (не ловит анизотропию/путь нагрузки — + главный риск по ревью Codex). Вывод — список флагов для решения, не «приговор». Слайсер навык не + зовёт намеренно. + +## 10. Чек-лист печатнопригодности (в `SKILL.md`) + +- [ ] Направление нагрузки и косметические грани **получены от пользователя**; ориентация + зафиксирована; нагрузка в XY (или Z только на сжатие); сопряжения на XY-гранях. +- [ ] Стенки кратны `w` (≥2·w; несущие ≥3·w = `N` периметров); нет стенок «не кратных `w`» (кроме + функциональных). +- [ ] Нет 90°-полок; нависания ≤`θ_max` или заменены скосами; мосты в пределах пролёта по короткой + стороне; внутренним поддержкам — доступ. +- [ ] Горизонтальные отверстия — teardrop/D (геометрия из `θ_max`); вертикальные — компенсация Ø; + глухие — дно ≥2–3 мм. +- [ ] Фаска у основания (EF); внутренние углы ≥R0.5; опорная площадка есть. +- [ ] Посадки по таблице со **знаком** (натяг — вычесть); допуск ±0.2 НЕ прибавлен к зазору; + заходные фаски на сопряжениях. +- [ ] Мин. элементы/текст ≥ порогов; аспект тонких выступов ≤4–5×. +- [ ] Бобышки/инсёрты (бор ≤OD, с Z-грани)/резьба/защёлки (изгиб в XY) по правилам. +- [ ] Полости — дренаж/вент; критичные поверхности не под «лесенкой»/поддержкой. +- [ ] Предусловия экспорта: единое тело/манифолд; `validate_part` чисто. + +## 11. Обкатка (конвенция проекта) + +Приёмы доказываем в `usecases/` (полигон, в .gitignore), затем поднимаем в навык — как с `kompas-3d`. +Кандидаты: **UC «FDM-кронштейн без поддержек»** (с нуля; ориентация/нависания/teardrop/защёлка); +**UC «довести деталь под печать»** (реальный материал — Voron, ср. UC-0002). + +## 12. Чего НЕ делаем (YAGNI / non-goals) + +- Не зовём слайсер, не делаем слайс-петлю. +- Не добавляем DFM-инструменты в MCP (методика, не возможности SDK). +- Не строим thickness/overhang-солвер (аудит эвристический). +- Не привязываем числа к одному принтеру/материалу. +- Не дублируем механику построения из `kompas-3d`. +- **Не лезем в настройки печати/слайсера** (периметры, заполнение, температуры, **обдув/скорость**, + корпус, brim как настройка, высота первого слоя) — навык про **геометрию**; настройки только как + граница. + +## 13. Решения по калибровке / открытые вопросы + +- **OQ-1 (решено).** Компенсация Ø вертикальных отверстий: +0.2 (<4), +0.2–0.3 (4–10), +0.1–0.2 + (>10); прибавлять **к диаметру** (радиус +X/2); калибровать. +- **OQ-2 (решено).** Elephant foot: 0.3×45° (калибровано) / 0.5–1.0×45° (слабая калибровка); причина + — притирка первого слоя, не высота слоя. +- **OQ-3 (решено).** Экспорт — **через `export_step`** (B-rep, манифолд гарантирован КОМПАС). + `export_stl` в MCP **не вводим** (вне границ навыка). +- **OQ-4 (закрыто).** Ревью прогнаны: pi/glm-5.1, pi/kimi-k2.6, Codex CLI — учтены. + +## 14. Дальнейшие шаги + +1. ~~Ревью pi + Codex~~ (3 ревью учтены). +2. Self-review спека. +3. **Ревью спека пользователем → отмашка.** +4. `writing-plans` → план реализации (SKILL.md + references/, опц. UC-полигон, синхронизация доков + через субагент `docs-maintainer`). +```