-
Notifications
You must be signed in to change notification settings - Fork 1
173 lines (153 loc) · 7.99 KB
/
Copy pathci.yml
File metadata and controls
173 lines (153 loc) · 7.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
jobs:
test:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
python-version: ["3.14"] # 3.14-only (2026-08-21): 3.10-3.13 выведены — см. requires-python
runs-on: ${{ matrix.os }}
steps:
# fetch-depth: 0 — полная история: revision_gate (min_accepted_revision, TC-9)
# проверяет ancestry через merge-base; в shallow-clone min-коммит отсутствует →
# gate честно даёт UNKNOWN и CI падает (инцидент 2026-08-14, 38f4be7d).
- uses: actions/checkout@v5 # P2-16 audit: v4 использует Node 20 (deprecated)
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: pip
- name: Install system dependencies (Linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update -qq
sudo apt-get install -y -qq libomp-dev # OpenMP для onnxruntime
- name: Install project
run: |
python -m pip install --upgrade pip
# Без openvino и lancedb GPU-зависимостей — только CPU
pip install -e ".[dev]"
- name: Lint (ruff)
run: ruff check src/ tests/
- name: Layer-boundary gate (Фаза 1 Universal Engine)
# Три оси ТЗ: ADAPTER → TRANSPORT → SOURCE → CORE. Гейт не даёт
# mcp/tools импортировать adapters/src.sources и core — adapters.*
# (кроме main.py dispatch); transitional core→src.sources.* обязан
# дойти до 0 к концу Фазы 2.
run: python scripts/check_layer_boundaries.py
- name: Architecture invariants (architecture_linter)
# 2026-08-24: скрипт вшит в CI — раньше гонялся только вручную.
# pytest-guard (tests/test_architecture_invariants.py) ловит импорты,
# но не stale-имена и циклы core-модулей.
run: python scripts/architecture_linter.py
- name: Check version consistency
run: python scripts/bump_version.py --check
- name: Disk-space guard (C:-critical 2026-09-29)
# Fails if the runner disk has <1GB free — full disks cause
# silent truncations in lancedb/onnx caches. Local equivalent:
# python scripts/disk_guard.py --check
run: python scripts/disk_guard.py --check --min-free-gb 1
- name: Audit dependencies (pip-audit)
# Pinned: pip-audit 2.10.1 проверен 2026-08-08 (PYSEC-2026-3552).
# Бамп — только после локального прогона `pip-audit -r requirements-lock.txt --no-deps --disable-pip`.
# --disable-pip + --no-deps: lock уже полностью разрешён; резолв через pip
# в temp-venv валил CI (pywin32 — Windows-only на ubuntu, numpy 2.4.6
# без колёс для py3.10). --no-deps обязателен с --disable-pip для не-hashed файла.
env:
PYTHONUTF8: "1"
run: |
python -m pip install "pip-audit==2.10.1"
pip-audit -r requirements-lock.txt --no-deps --disable-pip
- name: Full test suite (no filters)
# -n auto (pytest-xdist): run tests on all runner cores. Measured
# locally 197s -> 71s (x2.76, 12 cores); CI runners have 4 cores.
# COVERAGE_RCFILE=.coveragerc.ci: the local .coveragerc sets
# dynamic_context=test_function, which pytest-cov rejects under xdist
# (DistCovError, pytest-cov#604) and which costs ~+13.6% (sys.settrace).
# CI only needs the coverage % gate, so it uses the context-free config.
env:
COVERAGE_RCFILE: .coveragerc.ci
run: python -m pytest tests/ -q --tb=short -m 'not slow and not benchmark' -n auto --cov=src --cov-report=term-missing --cov-fail-under=38
timeout-minutes: 20
# Grader mutation probe (evalmut-перенос, 2026-08-14): мутационный аудит
# validate_scores/parse_scores_json — страж контракта градера. Дыра =
# (вывод доказанно неверен AND градер пропустил); скрипт выходит с
# кодом 1 при любом открытом blind spot (experiments/evalmut/probe_evalmut_transfer.py).
# Путь обновлён после рефактора per-experiment folders (29e1365e) — старый
# путь ломал шаг на всех платформах (файл не найден, 2026-08-16).
- name: Grader mutation probe (evalmut guard)
run: python experiments/evalmut/probe_evalmut_transfer.py
timeout-minutes: 2
clean-state:
runs-on: ubuntu-latest
steps:
# fetch-depth: 0 — см. комментарий в job test (revision_gate требует ancestry).
- uses: actions/checkout@v5 # P2-16 audit: v4 использует Node 20 (deprecated)
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: "3.14"
cache: pip
- name: Verify clean state (no self-clone)
run: bash scripts/verify_clean_state.sh --no-clone "${{ github.repository }}"
timeout-minutes: 15
manifest-parity:
# B-1 (ADR-0005 scaling): наши экстракторы манифестов vs osv-scanner на корпусе
# e-s1-polygon (Вариант В спеки 07). Выхлоп обязан совпадать (расхождение = дыра
# в нашем парсере). Пин: osv-scanner v2.5.1 (release 2026-08-17); бамп по §5.19.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: "3.14"
- name: Install project
run: pip install -e .
- name: Download osv-scanner
run: |
mkdir -p "$HOME/bin"
curl -sL -o "$HOME/bin/osv-scanner" https://github.com/google/osv-scanner/releases/download/v2.5.1/osv-scanner_linux_amd64
chmod +x "$HOME/bin/osv-scanner"
- name: Manifest parity
run: python scripts/manifest_parity.py --osv "$HOME/bin/osv-scanner"
timeout-minutes: 5
transport-equiv-e2e:
# E-07 (DoD Фазы 3): эквивалентность stdio ↔ Streamable HTTP на РЕАЛЬНОМ движке.
# Локально при живом основном MCP нестабилен (PID-lock embedder) — автор
# харнесса: только чистый раннер (CI Ubuntu).
runs-on: ubuntu-latest
# pip install -e делает _ext_root == checkout-каталог, а CWD-first резолвит
# его же — self-indexing guard блочит. Индексация самого себя здесь —
# намеренный сценарий (движок в own-repo engine-режиме): явный PROJECT_PATH
# + dev-флаг MSCODEBASE_ALLOW_SELF_INDEX=1.
env:
PROJECT_PATH: ${{ github.workspace }}
MSCODEBASE_ALLOW_SELF_INDEX: "1"
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: "3.14"
- name: Install project
run: pip install -e .
- name: Transport equivalence (engine mode)
run: python experiments/universal-engine/e07_equiv.py
timeout-minutes: 10
docker-build:
# DoD Фазы 3 (deploy/docker): образ из python-only remote-движка собирается
# (локально Docker недоступен — CI-билд является верификацией).
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Build remote image
run: docker build -t mscodebase-remote:ci -f deploy/docker/Dockerfile .
timeout-minutes: 20