🎯 [Хвост] Ядро проверки — 282 находки по файлам

Aperta
#996 4 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
5/5
Tempo stimato
Più di una settimana
Idoneità per principianti
20/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
python
Ambito
backend

Direzione di ricerca

Start with docs/audit/2026-08-10-full-roles.md, especially sections 5 and 5-бис, then check this issue’s file checklist and verify which findings remain open. The work spans many core modules; choose a single finding and its file, then run the relevant tests. Done means each finding is fixed in a PR or explicitly rejected with a reason, with closed IDs and PR numbers recorded.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

area/core audit difficulty/medium породило правило

Хвост аудита 2026-08-10 по направлению. Полные формулировки, доказательства и репро — в документе:
docs/audit/2026-08-10-full-roles.md (§ 5 — фаза чтения кода, § 5-бис — прогон, документы, ревизия). Эпик хвоста: #995

282 находки: 16 high · 91 medium · 175 low. Все верифицированы скептиками.

Карта работ по файлам

Чек-лист по файлам, а не построчно: почти три сотни пунктов нечитаемы и правятся с конфликтами. Строка закрывается, когда закрыты все её ID; частично закрытая остаётся неотмеченной, а закрытые ID названы явно с номером PR. Закрывать пачками: один PR = один файл или одна причина.

  • core/test_loader.py — 44 (8/20/16). Закрыты 9: QA-1-01 · RUN-1-01 · RUN-2-07 · PY-1-05 — непарные файлы и коллизия индексов (#1021); ADD-5-03 — формат 2 покрыт одной идеальной парой (#959); RUN-2-03 · RUN-2-05 · PY-1-04 — cp1251 и рассогласование блоков (#939, #246); REV-1-02 — .type читается терпимо, BOM снят (#1128). Осталось 35: MTX-1-02 · MTX-5-03 · REV-1-01 · RUN-2-01 · STR-5-01 · STR2-1-04 · CANON-3-01 · CANON-3-03 · FZZ-1-02 · FZZ-1-04 · FZZ-3-01 · FZZ-3-02 · JRN-1-02 · MTX-3-04 · MTX-4-01 · MTX-5-02 · MTX-5-04 · RUN-1-03 · RUN-2-08 · STR2-4-01 · CANON-3-04 · CANON-3-07 · CANON-3-08 · FZZ-3-03 · LNCH-3-03 · MTX-2-03 · MTX-7-04 · PAIR-1-04 · PY-1-06 · PY-1-07 · QA-1-02 · REV-1-05 · REV-7-02 · RUN-1-05 · STR2-5-03
  • core/reporter.py — 24 (0/3/21). Закрыты 3: MET-1-01 — вход кейса при RE и TLE (#1184); RUN-4-02 — обработка вывода без границ (#1182); REV-4-01 — [ERROR] печатался целиком, до 10 МБ в терминал (#1119). Осталось 21: MTX-9-03 · DES-2-01 · DES-2-02 · DES-2-04 · DES-2-05 · DES-2-06 · DES-2-07 · FZZ-2-01 · FZZ-2-04 · FZZ-2-05 · FZZ-3-04 · INS-1-04 · INS-2-01 · JRN-1-06 · JRN-5-03 · MTX-8-05 · READER-1-05 · REV-4-02 · RUN-4-07 · STR-5-03 · STR-5-04
  • core/grader_core.py — 23 (0/9/14). Закрыта 1: PY-1-01 — хвостовые нули float давали ложный AC (#1027). Осталось 22
  • core/runner.py — 22 (0/8/14). Закрыта 1: RUN-4-01 — верное решение получало WA с пустым Actual, если оставило дочерний процесс (#1182). Осталось 21
  • core/history.py — 21 (2/12/7). Частично: миграция схемы 1→2 больше не удваивает агрегат «Прогресса» (#947)
  • core/insights.py — 16 (0/2/14)
  • core/stats.py — 14 (0/1/13). Частично: нечитаемый журнал отличается от «статистика выключена» (#1005)
  • config.py — 12 (0/6/6). Закрыты 2: INS-4-01 · LNCH-3-04 — чужой pyproject.toml выше по дереву и два корня настроек (#1009)
  • core/cache.py — 11 (0/6/5). Закрыты 5: CNC-5-05 · PERF-1-01 · PY-3-01 · PY-3-02 · SBX-5-01 — ключ кэша не учитывал условия исполнения (#1011)
  • core/microbench_runner.py — 9 (1/3/5). Закрыты 4: MTX-3-01 · PERF-1-02 — tracemalloc смещал ранжирование (#1028); DEV-2-06 · REV-6-01 — bench-скрипт уехал из общего /tmp в mkdtemp
  • core/ai_hints.py — 8 (0/3/5). Частично: reasoning-семейства и причина отказа провайдера (#1123). MET-1-06 жива: выключателя отправки кода нет
  • core/progress_export.py — 8 (0/1/7)
  • core/normalizers.py — 7
  • core/result.py — 6 (0/1/5). Закрыты 3: ARCH-1-06 · QA-1-05 · PAIR-2-04 — exit_code терялся на round-trip, round-trip-тест был зелёным по построению, докстринг расходился с кодом (#1198). Отклонены 3 с причиной: STR2-1-01 (терминальный статус UNVERIFIABLE), STR2-1-02 (RunManifest), STR2-4-06 (тип измерения) — все три предлагают новые сущности контракта, а не правку result.py; такое решается ADR и меняет CLI/web/JSON разом, поэтому не хвост аудита. Живого issue нет — при необходимости заводить отдельно
  • core/user_settings.py — 6 (0/2/4): ARCH-3-04 — настройки жили per-cwd при глобальной базе истории (#1186). Остальные пять ID закрыты правками окна лаунчера и записи настроек: PROD-1-02 · JRN-4B-03 · LNCH-3-05 · LNCH-5-03 · SET-2-06 (#1133, #1136, #1140) — сверить перед архивацией документа
  • core/diag_log.py — 5 (0/1/4). Закрыта 1: ADD-4-03 — redact не ловил форму token='...' в кавычках (#1120). Проверено прогоном: token='…', token="…", token=…, password='…', api_key='…' редактируются все
  • core/parsers.py — 4 (0/3/1). Закрыта 1: RUN-2-04 — BOM в input.txt/output.txt давал ноль кейсов (#939)
  • core/wrapper_builder.py — 4 (2/0/2). Закрыты обе high ранее: DEV-2-01 — обёртка связывала аргумент со своим же импортом (#938); SBX-1-01 — function-кейсы падали под --sandbox поголовно (#992). Закрыты обе low (#1199): RUN-1-06 — блок-драйвер, вызывающий решение на верхнем уровне без print, давал ложный RE на классах и терял вывод на функциях; MTX-4-03 — контракт «сравнивается напечатанное, тип возврата не участвует» задокументирован (вариант «печатать repr()» проверен и отклонён: у чисел, списков и словарей repr() совпадает со str(), а строкам добавил бы кавычки)
  • core/history_recording.py — 3
  • core/mode_detector.py — 3 (1/0/2). Закрыты 2: RUN-2-02 — вспомогательная функция выше целевой давала ложный RE (#938); PY-3-04 — повреждённый meta.json ронял прогон вместо отката к эвристике (#1197). Осталась CANON-3-05 (документационная: .type применяется на уровне папки)
  • core/stepik_reference.py — 3 (0/1/2)
  • core/test_source_fetcher.py — 3 (1/1/1)
  • core/tracer.py — 3 (0/1/2)
  • core/feedback.py — 2 (0/1/1). Закрыты обе: ADD-4-01 — collect_commit() тянул subject коммита ЛЮБОГО репозитория в CWD прямо в публичный issue; ADD-4-04 — бюджет поля мерился исходными символами, а лимит URL — символами percent-encoded ссылки, и русский лог доезжал наполовину там, где английский того же объёма проходил целиком (#1200). Вторая половина рекомендации (truncated парами «осталось из скольких») отклонена с причиной: это публичный контракт /api/feedback, его читают web/static/feedback.js и строка локали feedback_truncated
  • core/lint.py — 2
  • core/task_page_parser.py — 2 (1/1/0). Закрыта 1: ADD-2-01 — <br> в таблице задачи не давал перевода строки (#941)
  • db.py — 2 (0/1/1)
  • downloader_config.py — 2
  • pytest_plugin.py — 2 (0/1/1). Закрыта 1: VIS-2-01 — решения без tests/ исчезали из сбора молча (#1183). Осталась VIS-2-02
  • .pre-commit-config.yaml — 1: REL-2-08 — восемь guardrail-скриптов гонялись только в CI, и о нарушении контрибьютор узнавал после пуша, кругом в 5–10 минут вместо секунды на коммите (preflight.py их тоже не звал). Все восемь добавлены local-хуками, каждый привязан к своим файлам; замер — ~3.6 с суммарно, регулярки проверены прогоном по git ls-files. Тест сторожит дрейф в обе стороны (#1209)
  • __init__.py — 1: PKG-1-06 — пакет не экспортировал __version__/__all__. Экспортирует лениво, через __getattr__ (PEP 562): корневой __init__ исполняется раньше чистки sys.path, и обычный import importlib.metadata там тянет json — то есть отменял бы фикс INS-3-01 этим же импортом (#1205)
  • __main__.py — 1 (0/1/0): INS-3-01 — python -m stepik_grader из каталога задачи падал на файле-однофамильце stdlib (json.py, string.py, random.py, logging.py — обычные имена учебной задачи), не показав ни одного экрана. cwd вычищается из sys.path до импорта CLI. types.py по-прежнему падает и не может не падать: он нужен самому runpy, до нашей первой строки, — граница закреплена отдельным тестом (#1205)
  • atomic_io.py — 1: PY-3-05 — temp-файл утекал при любом не-OSError прерывании: Ctrl+C приходит KeyboardInterrupt, а он BaseException и шёл мимо перехвата (#1203). Закрыто вместе с ARCH-3-05 — одна причина
  • core/__init__.py — 1: AUD-1-04 — докстринг был по-английски вопреки § Язык артефактов; переписан, заодно объявлен пустой __all__ — пакет ничего не реэкспортирует (#1205)
  • mtime_cache.py — 1: PERF-1-03 — подпись источника считала только max(mtime), а список файлов у обоих bundled-потребителей приходит из glob по каталогу: удаление файла не сдвигало максимум (карточки удалённого оставались в витрине), добавление файла со старым mtime — тоже, и оба случая держались до перезапуска. Теперь подпись считает и число файлов — ноль дополнительных обращений к ФС (#1204). Модуль переехал на верхний уровень (#1202), путь в реестре — mtime_cache.py, а не core/.
    Была помечена к отклонению и отклонение снято: первое рассуждение опиралось на «bundled read-only, store — один файл», а чтение кода показало glob у обоих потребителей и оба сценария живыми. Прецедент на будущее: отклонение находки проверяется по коду так же, как исправление
  • core/oauth_flow.py — 1 (0/1/0): ADD-2-02 — ответ 200 без access_token уходил в secrets.json как есть: протухший токен оставался, а expires_at сдвигался на час вперёд, и token_is_valid() целый час отвечал True, пока каждый запрос получал 401. Закрыта раньше, в #943 (_validate_token_payload + три теста) — здесь только отмечена по факту сверки с кодом и прогона
  • core/run_dir.py — 1: OPS-1-07 — каталоги прогонов, брошенные аварийным завершением (SIGKILL, падение интерпретатора), подметаются при следующем запуске — по префиксу, не по симлинку, старше суток; отказ уборки идёт в диагностический лог, а не только в warnings.warn, которое в CLI не показывается (#1201)
  • core/storage.py — 1: ARCH-3-05 — два «единых» атомарных писателя JSON расходились правами: save_json_file наследовал права существующего файла, atomic_write_json всегда оставлял 0600, и один и тот же chmod g+r сохранялся или отменялся в зависимости от того, какой модуль записал файл. Наследование переехало в общий писатель, шесть потребителей переведены, save_json_file удалён; save_secrets остался отдельно — у него принудительные 0600 (#1203)
  • core/tests_writer.py — 1 (0/1/0): OPS-1-08 — перескачивание стирало дописанные тест-кейсы, теперь они переезжают в tests.bak/ (#951)
  • rules/json_provider.py — 1: ARCH-3-01 — rules/ тянул core/mtime_cache, единственное во всём проекте нарушение инварианта «подпакеты glossary//rules/ не тянут core/» (ADR-0011). Хелпер переехал на верхний уровень, как atomic_io/db/stdio_encoding; инвариант закрыт параметризованным щитом в test_import_dag.py — прежде его не проверяло ничто (#1202)

Подтверждено закрытыми не меньше 50 находок из 282; пятнадцать строк закрыто целиком.

С чего продолжать

Плотность важнее списка: test_loader.py (44), reporter.py (24), grader_core.py (23) держат наибольшую долю направления. По test_loader.py стратегический срез посчитал отдельно: 92.5 находки на KLOC против 20.8 по всему core, и одна функция load_test_cases держит больше половины подтверждённых high проекта. Это кандидат на переписывание участком, а не на серию заплат — тем более что девять его находок уже закрыты точечно, и следующая заплата ляжет поверх них.

Однофайловые строки кончились — все закрыты. Осталось из мелких: db.py (2), downloader_config.py (2), core/lint.py (2), pytest_plugin.py (1 живая), core/tracer.py (3), core/history_recording.py (3), core/stepik_reference.py (3), core/test_source_fetcher.py (3), core/mode_detector.py (1 живая, документационная).

Проверять «уже закрыто» перед работой. Две находки этого захода (ADD-2-02, часть core/lint.py) оказались закрытыми более ранними PR, а в реестре числились открытыми: пометка ✅/◐ в документе аудита означает верификацию скептиком, а не состояние кода.

Критерий приёмки

Каждая находка либо закрыта PR, либо явно отклонена с причиной — молча удалённая находка вернётся следующим аудитом. Состояние ведёт этот чек-лист; в документе аудита реестр заполняется один раз, при архивации.

Состояние на 26.08.2026 (сверено с реестром)

Закрыто 90 находок из 307; файлов закрыто целиком — 13 из 40.

Галочки проставлены по реестру § 5-квater документа аудита, а не по памяти:
файл отмечается, когда каждая его находка либо стоит в реестре с номером PR, либо
отклонена в § 6 с причиной. Реестр перед этим сверен с историей мержей и вырос с
57 записей до 209 — до сверки счётчик здесь врал в обе стороны.

Рукописные пояснения в пунктах оставлены как есть: они называют, что именно
починено, а этого в реестре нет.

Дальше сводка обновляется тем же расчётом, что и галочки, — ночной прогон
tracker-guardrails.yml следит, чтобы реестр не отставал от main
(scripts/check_audit_registry.py).


Generated by Claude Code

Lingua principale
Python
Stelle
3
Fork
6
Merge medio
4h 7m
PR unite (30g)
49

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di ArtVsMark/Stepik-Python-Grader

Tutte le issue di ArtVsMark/Stepik-Python-Grader

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.