developer(ET): auto-commit from developer run_id=642
Some checks failed
CI / test (push) Failing after 1m0s
CI / test (pull_request) Failing after 59s

This commit is contained in:
2026-06-12 02:56:23 +03:00
parent 725791790d
commit 52e2e5fda1
3 changed files with 78 additions and 4 deletions

View File

@@ -426,3 +426,45 @@ def test_replication_boundaries_reference_lite_setup():
def test_changelog_has_orch_102_entry():
assert "ORCH-102" in CHANGELOG.read_text(encoding="utf-8")
# ---------------------------------------------------------------------------
# TC-27 (ORCH-104, FR-11 / D12): LITE_SETUP.md вводит установочный скрипт как
# рекомендованный быстрый путь и сохраняет ручной маршрут (пиннинг «13 разделов»
# в порядке держит test_doc_exists_with_all_13_sections_in_order — не трогается).
# ---------------------------------------------------------------------------
def test_doc_introduces_setup_lite_fast_path():
text = _doc_text()
assert "setup_lite.py" in text, (
"LITE_SETUP.md не вводит установочный скрипт setup_lite.py (ORCH-104 FR-11)"
)
# быстрый путь — подраздел §1.1 ВНУТРИ §1 (нумерация ## 1.…## 13. не меняется)
body1 = _section_bodies()["## 1. Рамка Lite"]
assert "1.1" in body1 and "setup_lite.py" in body1, (
"быстрый путь обязан быть подразделом §1.1 внутри §1 (D12)"
)
# ручной маршрут сохранён как канон/fallback — упомянут явно
assert "fallback" in text.lower() or "ручной маршрут" in text, (
"ручной маршрут §2§13 обязан остаться каноном/fallback (FR-11)"
)
# норматив сопровождения расширен на скрипт (D12)
assert "scripts/setup_lite.py" in text
def test_setup_lite_fast_path_block_is_clean():
"""§1.1 fenced-блок проходит те же сканы, что весь док: без боевых литералов,
без секретоподобных значений, без неизвестных env-токенов."""
body1 = _section_bodies()["## 1. Рамка Lite"]
blocks = _fenced_blocks(body1)
assert blocks, "§1.1 обязан нести fenced-блок с командой запуска (D12)"
for i, block in enumerate(blocks):
for literal in FORBIDDEN:
assert literal not in block, f"§1.1 блок #{i}: боевой литерал {literal!r}"
for rx in (_SECRET_HEX_RE, _SECRET_ALNUM_RE):
assert rx.search(block) is None, f"§1.1 блок #{i}: секретоподобное значение"
# упомянутые в §1.1 env-токены (если есть) — только из канона .env.example
canon = _env_keys(ENV_EXAMPLE)
mentioned = set(_ENV_TOKEN_RE.findall(body1))
assert not (mentioned - canon), (
f"§1.1 упоминает env-токены вне .env.example: {sorted(mentioned - canon)}"
)