Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd9785747d | ||
|
|
efa18795db |
@@ -0,0 +1,133 @@
|
||||
# History — журнал проекта DrHider
|
||||
|
||||
Хронологический журнал: планы, вопросы/ответы ревьюеров (Sonnet, Opus),
|
||||
реализации фич (по версиям), диагностика, тесты и бенчмарки.
|
||||
|
||||
**Правило:** любая находка/решение/факт записывается сюда сразу, в момент обнаружения.
|
||||
|
||||
## Структура (папки по темам)
|
||||
|
||||
| Папка | Что внутри |
|
||||
|-------|-----------|
|
||||
| [base/](base/) | Ранняя документация и первоначальная настройка проекта |
|
||||
| [plans/](plans/) | Планы и проектирование (аудит, архитектуры v3/v3.1, планы реализации) |
|
||||
| [sonnet/](sonnet/) | Все вопросы к Sonnet и его ответы (обсуждения, ревью, Q&A) |
|
||||
| [opus/](opus/) | Запросы к Opus и его ответы (валидация MSS-clamping, ревью документации) |
|
||||
| [llm/](llm/) | Всё про LLM-часть: метрики, статистика в UI, чанкинг для полного покрытия |
|
||||
| [sse/](sse/) | SSE-события: отлов отключения клиента, hop-by-hop заголовки |
|
||||
| [infra/](infra/) | Инфраструктура: кластер, ingress, RST-диагностика, HTTP/2, ВМ-буфер |
|
||||
| [ux-frontend/](ux-frontend/) | Фичи фронтенда: таймеры, имена файлов, ZIP-раскрытие, лимиты, прерывание/ETA |
|
||||
| [upload/](upload/) | Загрузка файлов: диагностика, лимиты, стресс-тесты |
|
||||
| [code-fixes/](code-fixes/) | Исправления кода по версиям (баги, оптимизация, безопасность, логирование) |
|
||||
| [tests/](tests/) | Тесты и бенчмарки: замеры UI, обфускация, нагрузка |
|
||||
|
||||
---
|
||||
|
||||
## base/ — первоначальная настройка
|
||||
|
||||
- **2026-07-11-initial-setup.md** — создание проекта DrHider на платформе Штурвал (Managed Flask, URL, входные точки).
|
||||
- **2026-07-12-documentation.md** — создание полной документации после рефакторинга (список документируемых файлов).
|
||||
|
||||
## plans/ — планы и проектирование
|
||||
|
||||
- **2026-07-12-audit-and-plan.md** — полный аудит проекта и план рефакторинга под Managed Flask.
|
||||
- **2026-07-12-v3-plan.md** — план v3: универсальная архитектура (убрать жёсткий список типов сущностей).
|
||||
- **2026-07-12-v3-done.md** — итоги v3: переход на Markdown-пайплайн + универсальное LLM-обнаружение.
|
||||
- **2026-07-12-v3.1-plan.md** — план v3.1: пофайловая обработка + прогресс в таблице (решение таймаута).
|
||||
- **2026-08-24-implementation-plan-for-flash.md** — план для агента-кодера (Flash): TTL-фикс, трекинг файлов, прерывание, ETA, UI.
|
||||
|
||||
## sonnet/ — обсуждения с Sonnet (вопросы и ответы)
|
||||
|
||||
**12–13 июля — проектирование:**
|
||||
- **2026-07-12-sonnet-query.md** + **2026-07-12-sonnet-response.md** — вопрос/ответ: универсальная архитектура DrHider (6 вопросов → 6 ответов → карта изменений).
|
||||
- **2026-07-12-sonnet-query-timeout.md** + **2026-07-12-sonnet-response-timeout.md** — диагностика ERR_TIMED_OUT в новом окне браузера (dev-сервер: 6 потоков заняты keep-alive).
|
||||
- **2026-07-12-sonnet-query-v2.md** + **2026-07-12-sonnet-response-v2.md** — улучшение LLM-промпта (двухфазная инструкция).
|
||||
- **2026-07-12-sonnet-query-v3-numbering.md** + **2026-07-12-sonnet-response-v3-numbering.md** — нумерация вместо генерации фейков (прозрачный аудит).
|
||||
- **2026-07-12-sonnet-query-v4-hybrid.md** + **2026-07-12-sonnet-response-v4-hybrid.md** — гибридный формат замен «шаблон + номер» (вариант В).
|
||||
- **2026-07-13-sonnet-query-architecture.md** + **2026-07-13-sonnet-response-architecture.md** — архитектура пофайловой обработки с одним ZIP (вариант А + блокирующий /process).
|
||||
- **2026-07-13-sonnet-query-obfuscation-tokens.md** — запрос: анализ обфускации.
|
||||
- **2026-07-13-sonnet-response-obfuscation-analysis.md** — анализ обфускации (TMP-файлы vs код).
|
||||
- **2026-07-13-sonnet-response-obfuscation-bugs.md** — анализ багов обфускации и их фикс.
|
||||
|
||||
**20 августа — ревью скорости и сбоев:**
|
||||
- **2026-08-20-sonnet-query-review-speed.md** — промпт: код-ревью drhider (скорость + объяснение сбоев, ограничение файлов).
|
||||
- **2026-08-20-sonnet-query-review-speed-followup.md** — follow-up вопросы по спорным пунктам ревью (В1–В4).
|
||||
- **2026-08-20-sonnet-review-qa.md** — Q&A: вопросы → ответы Sonnet → решения по ревью.
|
||||
|
||||
**20 августа — LLM-чанкинг:**
|
||||
- **2026-08-20-sonnet-query-llm-pattern.md** — вопрос: как лучше организовать LLM-покрытие всех документов.
|
||||
- **2026-08-20-sonnet-query-llm-followup.md** — 6 уточнений перед внедрением (чанкинг, дедуп, верификация, промпт).
|
||||
- **2026-08-20-sonnet-llm-qa.md** — сводный Q&A по LLM-чанкингу (схема + ответы У.1–У.6 + решение).
|
||||
|
||||
**20 августа — ускорение:**
|
||||
- **2026-08-20-sonnet-query-honest-speed.md** — честный вопрос: можно ли ускорить без риска устойчивости.
|
||||
|
||||
## opus/ — обсуждения с Opus
|
||||
|
||||
- **2026-07-13-opus-query-mss-clamping.md** — запрос: валидация плана MSS Clamping.
|
||||
- **2026-07-13-opus-response-mss-clamping.md** — ответ: валидация плана MSS Clamping.
|
||||
- **2026-07-13-opus-response-document-review.md** — проверка PROBLEM-AND-SOLUTION.md на ошибки.
|
||||
- **2026-07-13-opus-response-final-review.md** — финальная проверка PROBLEM-AND-SOLUTION.md.
|
||||
|
||||
## llm/ — LLM-часть
|
||||
|
||||
- **2026-08-19-llm-metrics.md** — v0.0.34: вывод токенов и времени LLM.
|
||||
- **2026-08-19-llm-stats-block.md** — v0.0.37: крупный блок статистики LLM в UI.
|
||||
- **2026-08-20-llm-full-chunking.md** — v0.0.57: LLM обрабатывает ВСЕ данные (пофайловый чанкинг 6000/overlap 500, параллельность 4, дедуп + верификация).
|
||||
|
||||
## sse/ — SSE-события
|
||||
|
||||
- **2026-07-14-sse-generator-exit.md** — v0.0.18: отлов отключения клиента SSE (GeneratorExit/BrokenPipe).
|
||||
- **2026-07-14-hop-by-hop-connection.md** — v0.0.21→0.0.22: Waitress запрещает hop-by-hop заголовок `Connection: close`.
|
||||
|
||||
## infra/ — инфраструктура
|
||||
|
||||
- **2026-07-14-browser-rst-debug.md** — диагностика ERR_CONNECTION_RESET в браузере.
|
||||
- **2026-07-15-cluster-dump.md** — снимок кластера (4 ноды, taints, состояние).
|
||||
- **2026-07-15-rst-root-cause.md** — итоговая диагностика ERR_CONNECTION_RESET (v0.0.29).
|
||||
- **2026-08-19-remove-process-names-http2.md** — v0.0.46: удалён process_names + проблема git push через HTTP/2.
|
||||
- **2026-08-21-pattern-vm-buffer-pull-plan.md** — план: перенос паттерна «ВМ-буфер + pull» в drhider.
|
||||
- **2026-08-21-vm-files-api-plan.md** — план: универсальный файловый сервис на ВМ (API).
|
||||
- **2026-08-21-vm-upload-implemented.md** — v0.0.58: ВМ-загрузка реализована (паттерн «ВМ-буфер + pull»).
|
||||
|
||||
## ux-frontend/ — фичи фронтенда
|
||||
|
||||
- **2026-08-19-live-timer-llm.md** — v0.0.38: живой таймер обработки + индикация ИИ.
|
||||
- **2026-08-19-live-filename.md** — v0.0.40: имя файла в live-блоке + сброс итогов.
|
||||
- **2026-08-19-file-time.md** — v0.0.41: время на конкретный файл в колонке «Статус».
|
||||
- **2026-08-19-zip-expand-frontend.md** — v0.0.33: раскрытие ZIP в таблицу (фронтенд).
|
||||
- **2026-08-19-zip-filter-docs.md** — v0.0.35: фильтр документов при раскрытии ZIP.
|
||||
- **2026-08-19-ux-fixes.md** — v0.0.49: индикатор распаковки, разделение фаз (1/2, 2/2), таймауты SSE.
|
||||
- **2026-08-20-upload-limits.md** — v0.0.50: лимиты загрузки (>100МБ/файл, >1ГБ сумма) + красная подсветка в таблице.
|
||||
- **2026-08-24-interrupt-eta-design.md** — дизайн: TTL-фикс + прерывание с сохранением + оценка времени + UI.
|
||||
- **2026-08-24-interrupt-eta-implemented.md** — v0.0.63: реализовано прерывание с сохранением + ETA + UI-таблица.
|
||||
|
||||
## upload/ — загрузка файлов
|
||||
|
||||
- **2026-08-19-upload-delay.md** — диагностика медленной/нестабильной загрузки + v0.0.43 (таймаут 300с).
|
||||
- **2026-08-23-test-upload-only-plan.md** — план: тест-режим «только загрузка» (для Флаша).
|
||||
- **2026-08-23-upload-stress-test.md** — тесты загрузки и стресс (v0.0.59–0.0.60, кластер naeel-test-3).
|
||||
- **2026-08-24-upload-limits.md** — v0.0.62: лимиты 50 МБ на файл, 500 МБ на сессию.
|
||||
|
||||
## code-fixes/ — исправления кода (по версиям)
|
||||
|
||||
- **2026-08-18-fix-review-bugs.md** — v0.0.32: фиксы по ревью обфускатора.
|
||||
- **2026-08-19-replacer-optimization.md** — v0.0.39: оптимизация apply_replacements (однопроходная замена, один regex).
|
||||
- **2026-08-20-logging.md** — v0.0.51: максимальное логирование (LOG_LEVEL env) + детальные логи SSE/воркера.
|
||||
- **2026-08-20-logging-file.md** — v0.0.52: файловый лог /tmp/drhider.log (для kubectl exec).
|
||||
- **2026-08-20-broken-files.md** — v0.0.53: устойчивость к битым файлам (воркер не падает, битые пропускаются).
|
||||
- **2026-08-20-v1-v2-implemented.md** — v0.0.54: В2 (фикс кракозябр имён zip) + В1 (фильтр таблиц, эффект≈0).
|
||||
- **2026-08-20-honest-answer-and-A-implemented.md** — v0.0.55: честный ответ Sonnet + реализация А (threading .doc, кэш regex).
|
||||
- **2026-08-20-csv-out-of-zip.md** — v0.0.56: КРИТИЧНО — mapping.csv (ключ расшифровки) убран из ZIP.
|
||||
|
||||
## tests/ — тесты и бенчмарки
|
||||
|
||||
- **2026-08-19-ui-5runs-benchmark.md** — v0.0.49: бенчмарк UI, 5 прогонов DownLoads.zip (18 файлов, замеры времени).
|
||||
- **2026-08-23-obfuscation-tests.md** — тесты реальной обфускации и фикс .doc (v0.0.60–0.0.61, корпус /mnt/y/T).
|
||||
- **2026-08-24-tests-upload-and-obfuscation.md** — тесты загрузки и обфускации (v0.0.62, лимиты, ВМ-буфер).
|
||||
|
||||
---
|
||||
|
||||
## Соглашение об именах
|
||||
`ГГГГ-ММ-ДД-тема.md` (иногда с версией). В начале каждого файла — дата и версия/статус.
|
||||
При сортировке файл относится в папку по главной теме (имя файла/содержание), не по дате.
|
||||
+1
-1
@@ -21,7 +21,7 @@ if _sys_path_root not in sys.path:
|
||||
sys.path.insert(0, _sys_path_root)
|
||||
|
||||
# Версия приложения (меняется при изменениях)
|
||||
VERSION = "0.0.64"
|
||||
VERSION = "0.0.65"
|
||||
|
||||
|
||||
def setup_logging():
|
||||
|
||||
@@ -138,7 +138,8 @@
|
||||
<p class="sub">
|
||||
Загрузите документы (.docx, .doc, .pdf, .txt, .md, .zip) — получите ZIP с обезличенными копиями.<br>
|
||||
CSV с таблицей замен скачивается отдельно.<br>
|
||||
<span style="color:#c0392b;">Ограничения: один файл не более 50 МБ, суммарно не более 500 МБ. Файлы сверх лимитов помечаются красным и не участвуют в обфускации.</span>
|
||||
<span style="color:#c0392b;">Ограничения: один файл не более 50 МБ, суммарно не более 500 МБ. Файлы сверх лимитов помечаются красным и не участвуют в обфускации.</span><br>
|
||||
<span style="color:#7d3c98;">⏱ Время обработки каждого файла — ориентировочное (обновляется по факту).</span>
|
||||
</p>
|
||||
<div class="file-input-wrap">
|
||||
<input type="file" id="fileInput" multiple accept=".doc,.docx,.pdf,.txt,.zip">
|
||||
@@ -258,6 +259,10 @@ function fmtSec(s) {
|
||||
return s >= 60 ? Math.floor(s / 60) + 'м ' + (s % 60) + 'с' : s + 'с';
|
||||
}
|
||||
|
||||
// Эмпирическая оценка времени обработки файла: сек/МБ (ориентировочно, до старта)
|
||||
const EST_MB_SEC = 12;
|
||||
function estForFile(f) { return f ? Math.max(1, Math.round(f.size / 1048576 * EST_MB_SEC)) : 0; }
|
||||
|
||||
function rr() {
|
||||
if (procPhase === 'processing') { renderProcTable(); return; }
|
||||
if (sf.length === 0) { fl.innerHTML = '<tr class="empty-row"><td colspan="4">Нет выбранных файлов</td></tr>'; }
|
||||
@@ -265,14 +270,16 @@ function rr() {
|
||||
fl.innerHTML = sf.map((f, i) => {
|
||||
const over = overNames.has(f.name);
|
||||
const rowCls = over ? ' class="row-over"' : '';
|
||||
const stTxt = over ? '<span style="color:#c0392b;">🔥 не учитывается</span>' : '<span style="color:#999;">—</span>';
|
||||
const stTxt = over ? '<span style="color:#c0392b;">🔥 не учитывается</span>'
|
||||
: '<span style="color:#7d3c98;">~' + fmtSec(estForFile(f)) + '</span>';
|
||||
return '<tr id="row-' + i + '"' + rowCls + '><td class="name-cell">' + f.name + '</td><td class="num-cell">' + fs(f.size) + '</td><td class="num-cell" id="st-' + i + '" style="font-size:12px;">' + stTxt + '</td><td><button class="remove-btn" onclick="rm(' + i + ')">✕</button></td></tr>';
|
||||
}).join('');
|
||||
}
|
||||
const overCount = sf.filter(f => overNames.has(f.name)).length;
|
||||
const totalSize = sf.reduce((s, f) => s + (overNames.has(f.name) ? 0 : f.size), 0);
|
||||
const cntMain = sf.length - overCount;
|
||||
fc.textContent = (overCount ? cntMain + ' учитываются + ' + overCount + ' свыше лимита' : sf.length) + ' файлов · ' + fs(totalSize);
|
||||
const totEst = sf.reduce((s, f) => s + (overNames.has(f.name) ? 0 : estForFile(f)), 0);
|
||||
fc.textContent = (overCount ? cntMain + ' учитываются + ' + overCount + ' свыше лимита' : sf.length) + ' файлов · ' + fs(totalSize) + ' · ~' + fmtSec(totEst);
|
||||
ub.disabled = cntMain === 0;
|
||||
}
|
||||
|
||||
@@ -329,7 +336,7 @@ function renderProcTable() {
|
||||
if (rate && !p.est && p.chars > 0) p.est = p.chars * rate;
|
||||
if (!p.est) {
|
||||
const szMB = (sf[i] ? sf[i].size : 0) / 1048576;
|
||||
const k = procExtractRate || 3; // сек/МБ: замеренная или запасная
|
||||
const k = procExtractRate || EST_MB_SEC; // сек/МБ: замеренная или эмпирическая
|
||||
p.est = Math.max(1, Math.round(szMB * k));
|
||||
}
|
||||
let txt;
|
||||
|
||||
Reference in New Issue
Block a user