# QA AI CJM Brand System Один локальный command запускает весь автоматизируемый QA: ```bash python3 50_QA/run_qa.py ``` Команда запускается из корня `AI_CJM_Brand_System/`, использует Python 3 и PyYAML, не обращается к production и не изменяет файлы. Результат содержит число assertions и violations. Любое нарушение даёт ненулевой exit code. ## Автоматические gates - manifest paths остаются внутри brand root и существуют; - каждый JSON/YAML документ распарсился; - token lint и обе CSS-проекции воспроизводимы; - stable component contracts и artifact profiles имеют непустые поля/секции ожидаемых типов; - inline и reference-style Markdown links разрешаются внутри repository; - legacy markers отсутствуют вне явного policy allowlist; - raw design values отсутствуют вне foundations, tokens, QA, evidence и точных `evidence[].locator` в component YAML; - summary всегда имеет вид `QA PASS|FAIL: N checks, M violations`. Policy allowlists находятся в [`qa-policy.json`](./qa-policy.json). Их изменение является изменением QA-контракта и проходит review. ## Ручные gates Автоматический harness дополняют: - [acceptance matrix](./acceptance-matrix.md); - [visual regression plan](./visual-regression-plan.md); - [accessibility checklist](./accessibility-checklist.md); - [responsive matrix](./responsive-matrix.md); - [release checklist](./release-checklist.md). ## Unit tests ```bash PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s 50_QA/tests -v ``` Fixtures доказывают pass path, aggregated violations, ненулевой exit и диагностику manifest/parse/link/contracts/legacy/raw/token failures.