Назначение и границы
Редакционный конвейер должен отделять исходник, промежуточные признаки и черновик, чтобы результат можно было проверить и повторить после ошибки.
Очистка текста, извлечение HTML, классификация и подготовка черновика с видимыми этапами обработки. В публичном контуре отключены внешний сбор и публикация.
- Telegram input заменён тремя собственными материалами; LLM заменена шаблонным редактором.
- Шесть обучающих примеров не позволяют заявлять качество классификатора на независимых данных.
- Внешняя публикация и произвольные URL/загрузки отключены. Два одновременных выполнения, 20 материалов на сессию, TTL один час.
Архитектура и схемы
- Публичная точка входа не монтирует collector и операционный admin.
- Используются исходные processed_values, extract_html, predict и draft_from_template.
- TF-IDF и LogisticRegression выполняются реально на фиксированном синтетическом наборе.
- Повтор управляемого сбоя обновляет тот же run ID, сохраняя принадлежность сессии.
Code-map: от функции к коду
Карта привязана к версии b13048fbc549. Она помогает проследить изменение через интерфейс, API, модуль, данные и проверку.
| Функция | Экран / API | Модуль | Данные / проверка |
|---|---|---|---|
| Выбор материала | форма / GET api/runs | portfolio_web/app.js, portfolio_pipeline.CORPUS | синтетический корпус; production browser QA |
| Очистка | POST api/runs | content/processor.processed_values | text_hash, язык, признаки; test_content_utils.py |
| Извлечение | POST api/runs | content/link_enricher.extract_html | текст HTML; test_portfolio_pipeline.py |
| Классификация | результат | content/classifier.predict | TF-IDF модель; test_portfolio_pipeline.py |
| Черновик | результат | content/rewriter.draft_from_template | portfolio_runs.result; test_portfolio_pipeline.py |
| Повтор и сброс | POST retry / DELETE runs | portfolio.py | только своя session_id; production API isolation QA |
Как работать с картой
- Перед изменением найти функцию и пройти связи до API, состояния и хранилища.
- Проверить входы, ошибки, повторные события и зависимые сценарии.
- После изменения обновить карту и затронутые схемы вместе с кодом.
- Выполнить связанные проверки и привязать новые материалы к версии исходников.
Сценарии и API
- Выберите один из трёх материалов и запустите обработку.
- Просмотрите очищенный текст, извлечение, классификацию и черновик.
- Включите пример ошибки извлечения, затем повторите тот же материал.
- Сравните свою историю со второй сессией и сбросьте свой пример.
Проверка опубликованной версии
CI: Deploy ↗ · 8507a93a · исторический запуск другой версии · 2026-06-30T07:10:27Z
CI: Deploy ↗ · 4c8bb882 · исторический запуск другой версии · 2026-06-25T09:47:34Z
- 46 unit-тестов pipeline и исходных content-модулей пройдено.
- Other session cannot read/retry/reset own material; signed expiring cookie
- Failure then retry uses same ID; retry ready draft returns 409
- Only fixed fixture IDs; arbitrary URL and extra fields rejected
- Подтверждённого GitHub CI для этого SHA нет; перечислены выполненные локальные проверки и сценарии опубликованной версии. Исторические CI-ссылки, если есть, отмечены отдельно.
Результаты описывают проверенные сценарии и конкретную версию. Они не являются оценкой коммерческого успеха или качества моделей на независимой выборке.
Измерения
- Сохранено 13 содержательных кадров фактического интерфейса.
- Дата, сценарий и версия указаны у каждого кадра.
- Максимум RAM контейнеров в коротком тесте: 213.2 MiB. Общие службы учитываются отдельно; магазин включает свою БД.
- Измерено 6 повторений сценария; медиана 1730.0 мс, максимум 2992 мс. Время включает браузер и HTTPS; методика и ограничения приложены.
Запуск и эксплуатация
Исходный контур содержит Telegram collector и рабочую схему хранения. Демо использует отдельную таблицу portfolio_runs и отдельный entrypoint; эти архитектуры не отождествляются.
Сборка: docker build -f Dockerfile.portfolio -t portfolio-publisher:VERSION . Полный requirements.portfolio.lock закрепляет runtime. DB_DSN и PORTFOLIO_SECRET передаются на сервере и не входят в образ.
API доступен через localhost:18404. Healthcheck /healthz проверяет БД. При ошибке изучить stage result и повторить тот же run ID; записи другой сессии недоступны. Cleanup каждые пять минут. Исходный workflow заменён ручной проверкой без SSH/prune/удаления логов.
Общие правила эксплуатации: готовые файлы и закреплённые образы собираются вне VPS; секреты не входят в артефакты. Общесерверный docker prune не применяется. Логи backend ограничены ротацией, изменения log options требуют пересоздания контейнера.
Перед изменением пройти code-map от функции к экрану/API, модулю и данным. После изменения обновить карту и схемы, выполнить связанные сценарии, включая ошибку, повтор и сброс. Источник истины — конкретная версия кода, а не старая диаграмма.
Откат проверен 2026-09-07T01:05:09.948422+00:00: 20260907-verified → 20260907b → 20260907-verified. После каждого переключения подтверждены HTTPS, readiness и SHA. Это проверка конфигурации и артефактов на одном проверенном SHA; обратная миграция БД не выполнялась.
Стек
| Python / FastAPI | Отдельный публичный runtime, лимиты и HTTP-контракты. |
|---|---|
| trafilatura / BeautifulSoup | Реальное извлечение текста из встроенного HTML. |
| scikit-learn | TF-IDF + LogisticRegression с фиксированным random_state. |
| PostgreSQL | Сессионные результаты pipeline в JSONB, TTL и атомарная квота. |
Материалы и исходники
История кода: с 16 июня 2026. Подготовка демо: 7 сентября 2026.