Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
b74d67d
feat(ui): 5 экранов инструментов — автозагрузка, чипы-пресеты, мобайл…
ilyautov Jun 29, 2026
3b17a81
feat(ui): навигация и кросс-ссылки между инструментами
ilyautov Jun 29, 2026
8b0e0da
docs: WORKLOG #43 + CHANGELOG — расширение инструментов для завода
ilyautov Jun 29, 2026
88b22eb
feat(ui): кросс-ссылки в мобильной QR-карточке и хабе safety — навига…
ilyautov Jun 29, 2026
6aa3537
docs: WORKLOG — навигационная сеть замкнута (card + safety)
ilyautov Jun 29, 2026
53c5a8a
merge: инструменты для завода — СИЗ/склад/инспектор/класс отхода/дисп…
ilyautov Jun 29, 2026
7ea6e39
feat: 6-й инструмент «реакция на превышение» (мастер смены)
ilyautov Jun 30, 2026
cea4f0d
docs: лендинг-копи инструментов + WORKLOG/CHANGELOG #44
ilyautov Jun 30, 2026
d80daf5
merge: реакция на превышение + лендинг-копи
ilyautov Jun 30, 2026
3698ce0
docs: брошюра + слайд-дек HEFEST (исходники + сборка)
ilyautov Jun 30, 2026
5ab51cc
merge: презентационные PDF — брошюра + слайд-дек
ilyautov Jun 30, 2026
43dda5e
chore: подготовка репозитория к открытой публикации
ilyautov Aug 29, 2026
2960de5
chore(make): автоопределение рабочего интерпретатора
ilyautov Aug 29, 2026
2d4b67d
docs: сверить счёт повреждённых CAS в LIMITATIONS с данными
ilyautov Aug 29, 2026
318a066
chore: убрать сведения о юридических лицах из поставки
ilyautov Aug 29, 2026
33eb04f
design: зафиксировать дизайн-систему и привести к ней 18 экранов
ilyautov Aug 29, 2026
be288ac
chore: закрыть три канала утечки перед открытой публикацией
ilyautov Aug 29, 2026
5ef6268
merge: подготовка к открытой публикации — обезличивание, сторож, диза…
ilyautov Aug 29, 2026
590c2da
docs: вернуть демо-сценарий (пострадал при вычистке истории)
ilyautov Aug 29, 2026
58a7b82
build(deps): Bump actions/checkout from 4 to 7
dependabot[bot] Aug 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Ошибка в работе
description: Система падает, отвечает не так, как заявлено, или ведёт себя непредсказуемо.
title: "баг: "
labels: ["баг"]
body:
- type: markdown
attributes:
value: |
Неверное нормативное ЗНАЧЕНИЕ — это отдельный шаблон «Спор о нормативном значении».
Здесь — про поведение программы.
- type: textarea
id: what
attributes:
label: Что происходит и что ожидалось
description: Точный текст ошибки, если он короткий.
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Как воспроизвести
description: Минимальная последовательность команд или запросов.
validations:
required: true
- type: input
id: env
attributes:
label: Окружение
description: ОС, версия Python, режим запуска (лексический / семантический).
placeholder: "macOS 15, Python 3.11, лексический режим"
validations:
required: true
- type: textarea
id: health
attributes:
label: Вывод /health и /quality
description: Помогает понять, на какой базе воспроизводится. Секреты уберите.
render: json
- type: checkboxes
id: confirm
attributes:
label: Подтверждение
options:
- label: Офлайн-сьют прогнан (`make test`), результат приложен или описан.
- label: В issue нет паспортов предприятия, ключей и персональных данных.
required: true
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Вопрос по установке и использованию
url: https://github.com/ilyautov/hefest/discussions
about: Спросите в обсуждениях, не публикуя данные предприятия.
- name: Уязвимость или подозрение на утечку данных
url: https://github.com/ilyautov/hefest/security/advisories/new
about: Сообщайте приватно. Не создавайте публичный issue.
28 changes: 28 additions & 0 deletions .github/ISSUE_TEMPLATE/feature.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: Предложение
description: Предложить возможность или изменение поведения.
title: "предложение: "
labels: ["предложение"]
body:
- type: textarea
id: problem
attributes:
label: Какую задачу это решает
description: Начните с задачи специалиста (эколог, ОТ/ПБ, мастер смены, диспетчер), а не с решения.
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Предлагаемое поведение
validations:
required: true
- type: textarea
id: safety
attributes:
label: Влияние на контур честности
description: |
Обязательный пункт. Требует ли предложение выводить значение, которого нет в источнике,
пересчитывать единицы, присваивать класс при неполных данных или показывать типовое
как паспортное? Если да — объясните, почему это безопасно.
validations:
required: true
60 changes: 60 additions & 0 deletions .github/ISSUE_TEMPLATE/normative-dispute.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: Спор о нормативном значении
description: Оспорить ПДК, класс опасности, номер ООН, IDLH, раздел ГОСТ или иное нормативное значение.
title: "норматив: "
labels: ["данные", "требует сверки"]
body:
- type: markdown
attributes:
value: |
Это самый ценный вид вклада в проект: сверка с бумажным первоисточником.
Не прикладывайте паспорта безопасности предприятия и персональные данные.
Уязвимости контура честности — в SECURITY.md, не сюда.
- type: input
id: substance
attributes:
label: Вещество и поле
description: Название вещества (или CAS) и какое именно значение оспаривается.
placeholder: "хлор (CAS 7782-50-5), ПДК рабочей зоны"
validations:
required: true
- type: input
id: shown
attributes:
label: Что показывает система
description: Значение с единицами, как оно выводится сейчас.
validations:
required: true
- type: input
id: expected
attributes:
label: Какое значение верно
description: Значение с единицами. Если верного значения нет — напишите «нет данных».
validations:
required: true
- type: textarea
id: source
attributes:
label: Первоисточник
description: |
Документ, редакция, пункт/таблица/строка. Ссылка на официальную публикацию, если есть.
«Я так помню» и пересказ агрегатора источником не считаются.
placeholder: "ГН 2.2.5.3532-18, таблица 1, строка 1234; СанПиН 1.2.3685-21, редакция от ..."
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Как воспроизвести
description: Команда или запрос, по которому мейнтейнер увидит то же самое.
placeholder: "curl -s localhost:8012/substance/хлор | jq .pdk_mgm3"
validations:
required: true
- type: checkboxes
id: confirm
attributes:
label: Подтверждение
options:
- label: Я сверил значение с первоисточником, а не с другой информационной системой.
required: true
- label: В issue нет паспортов предприятия и персональных данных.
required: true
21 changes: 21 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<!-- Спасибо за вклад. Заполните коротко и пройдитесь по чек-листу. Детали — в CONTRIBUTING.md. -->

## Что и зачем

<!-- 1–3 предложения: что меняется и какую задачу решает. -->

## Как проверено

<!-- Команды и результат. Офлайн-сьют обязателен: make test -->

## Чек-лист

- [ ] `make test` зелёный офлайн — без Ollama, без сети, без собранного индекса
- [ ] `make guard` зелёный — в diff нет секретов, `.env`, данных предприятия
- [ ] Тест написан ДО реализации и падает без неё (TDD)
- [ ] Числа в документации сверены с `GET /health` / `GET /quality`, а не взяты по памяти
- [ ] **Святое правило соблюдено:** ни одно нормативное значение не выдумано; пропуски
остались пропусками; единицы не пересчитываются; типовое не выдаётся за паспортное
- [ ] Если тронут контур честности (отказ, провенанс, градация источника, honest-gap) —
есть тест, доказывающий, что честность не ослабла
- [ ] Заметное изменение отражено в `CHANGELOG.md`, хроника — в `WORKLOG.md`
10 changes: 10 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: pip
directory: "/requirements"
schedule:
interval: weekly
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: weekly
78 changes: 78 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: tests

# Защищает главный инвариант проекта: офлайн-контур работает у любого, кто просто склонировал
# репозиторий. Без Ollama, без сети, без Git LFS (эмбеддинги не выкачиваются), без собранного
# семантического индекса. Семантика здесь намеренно недоступна — сьют обязан это пережить
# деградацией до лексического пола, а не падением.

on:
push:
branches: [main]
pull_request:
workflow_dispatch:

env:
# Заведомо мёртвый адрес: если код всё же полезет в Ollama, он должен деградировать, а не висеть.
OLLAMA_HOST: http://127.0.0.1:59999

jobs:
pytest:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
steps:
- uses: actions/checkout@v7
with:
lfs: false # эмбеддинги (~106 МБ) для офлайн-сьюта не нужны
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: pip
- name: Установка зависимостей
run: python -m pip install -r requirements/dev.txt
- name: Предпубликационный сторож (секреты, .env, обезличивание)
run: sh scripts/guard.sh
- name: Компиляция всех трекаемых модулей
run: git ls-files '*.py' | xargs -r python -m py_compile
- name: Офлайн-сьют
run: python -m pytest tests/ -q

pytest-macos:
# Кросс-платформенность: пути от __file__, отсутствие Ollama, песочница сокетов на darwin.
runs-on: macos-latest
steps:
- uses: actions/checkout@v7
with:
lfs: false
- uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip
- name: Установка зависимостей
run: python -m pip install -r requirements/dev.txt
- name: Офлайн-сьют
run: python -m pytest tests/ -q

self-tests:
# Каждый модуль engine/ имеет самотест в __main__ и обязан запускаться без сервиса.
# Это свойство легко потерять незаметно, поэтому проверяется отдельной ногой.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
lfs: false
- uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip
- name: Установка зависимостей
run: python -m pip install -r requirements/dev.txt
- name: Самотесты модулей без сети
run: |
set -e
for m in cas compat ghs_map rd_zone hygiene normative warehouse waste_calc; do
echo "--- engine/$m.py"
python engine/$m.py > /dev/null
done
43 changes: 42 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,51 @@ data/qdrant_local/
screenshots/
arch-doc.png

# --- Презентационные PDF: артефакты сборки (в репо только шаблоны+скрипты) ---
# --- Презентационные материалы: в открытую поставку не входят -----------------
# Брошюра и слайд-дек — коммерческие материалы с личными контактами владельца, а не
# документация продукта. Публичный репозиторий индексируется и вычёсывается ботами,
# поэтому каталог целиком вне поставки; исходники остаются у владельца локально.
docs/brochure/

# --- Тяжёлые исходные справочники (входной материал, не код) ---
# Хранятся вне VCS; при необходимости — Git LFS
engine/*.pdf
engine/*.htm.html

# --- Локальное состояние Claude Code ---
# --- Локальное состояние агентов/редакторов ---
.claude/
.codex/

# --- Промежуточные артефакты конвейера данных (пересоздаются) ---
# corpus_full.json -> предочистной корпус, пересобирается: python3 engine/corpus.py
# embed_ids.json -> идентификаторы доочистного индекса, пересобираются вместе с ним
# Канонические (нужны для запуска) — corpus_full_clean.json и embed_ids_clean.json — трекаются.
data/corpus_full.json
data/embed_ids.json

# --- Приватные материалы владельца (денайлист организаций для scripts/guard.sh) ----
.private/

# --- Реестр предприятий: в публичную поставку НЕ входит ---------------------------
# Публичный репозиторий не содержит сведений о юридических лицах (см. DATA-LICENSE.md,
# раздел 4). Реестр — приватные данные внедрения: он остаётся в контуре пользователя.
# В репозитории публикуется только схема с вымышленным примером: data/plants.example.json.
data/plants.json
data/plants_linked.json
data/plant_aliases.json
data/plants_demo.json
data/plants_linked_demo.json
data/plants_local*.json

# --- Сгенерированный showcase-UI (engine/generate_ui.py) ---
index_pro.html

# --- Исходники нормативных документов (объёмны, общедоступны у первоисточника) ---
# См. DATA-LICENSE.md, раздел 1: в репозиторий не включаются, скрипты ингеста берут их путём.
data/sources/

# --- impeccable: рантайм-состояние live-режима (журналы сессий, скриншоты) ---------
.impeccable/live/sessions/
.impeccable/live/roots.json
.impeccable/live/inject-journal.json
Loading
Loading