Commit Graph

82 Commits

Author SHA1 Message Date
embeddevio e153143cc1 Merge branch 'main' into feat/18-docker-runtime
ci / lint (push) Successful in 51s
ci / lint (pull_request) Successful in 49s
contract-openapi / openapi-contract (push) Successful in 59s
contract-openapi / ts-client-is-current (push) Successful in 48s
contract-openapi / openapi-contract (pull_request) Successful in 59s
contract-openapi / ts-client-is-current (pull_request) Successful in 43s
ci / unit (push) Successful in 52s
ci / security (push) Successful in 1m21s
ci / unit (pull_request) Successful in 55s
ci / security (pull_request) Successful in 1m20s
ci / build (push) Successful in 36s
ci / build (pull_request) Successful in 36s
ci / image-scan (push) Failing after 3s
ci / image-scan (pull_request) Failing after 3s
ci / push (push) Has been skipped
ci / push (pull_request) Has been skipped
2026-10-29 21:09:40 +03:00
embeddevio 19f0526b2e Merge pull request 'Sprint 0 / #17: CI-пайплайн с гейтами (lint, unit+coverage>=70%, security, build, image-scan, push)' (#60) from feat/17-ci into main
ci / lint (push) Successful in 42s
contract-openapi / openapi-contract (push) Successful in 1m0s
contract-openapi / ts-client-is-current (push) Successful in 47s
ci / unit (push) Successful in 49s
ci / security (push) Successful in 1m25s
ci / build (push) Has been skipped
ci / image-scan (push) Has been skipped
ci / push (push) Has been skipped
Merge PR #60: CI-пайплайн с гейтами (lint, unit+cov>=70, security, build, image-scan, push)

TechLead: combined status 16/16 success (lint/unit/security/contract-openapi зелёные; build/image-scan/push штатно skipped — нет deploy/Dockerfile до мержа #49). Негативные прогоны гейтов приложены в PR (#51 coverage, #55 bandit HIGH, #49 trivy). DoD-отклонений нет.
2026-10-29 21:09:27 +03:00
embeddevio 0f2a646df2 Merge branch 'main' into feat/17-ci
ci / lint (push) Successful in 41s
ci / lint (pull_request) Successful in 43s
contract-openapi / openapi-contract (push) Successful in 55s
contract-openapi / ts-client-is-current (push) Successful in 46s
contract-openapi / openapi-contract (pull_request) Successful in 53s
contract-openapi / ts-client-is-current (pull_request) Successful in 40s
ci / unit (push) Successful in 48s
ci / security (push) Successful in 1m16s
ci / unit (pull_request) Successful in 46s
ci / security (pull_request) Successful in 1m20s
ci / build (push) Has been skipped
ci / image-scan (push) Has been skipped
ci / build (pull_request) Has been skipped
ci / push (push) Has been skipped
ci / image-scan (pull_request) Has been skipped
ci / push (pull_request) Has been skipped
2026-10-29 20:58:45 +03:00
embeddevio 04e7b5667f Merge pull request '[infra] contract-openapi: checkout-fallback на archive-архив — снимает красные статусы всех PR (#59)' (#63) from fix/59-checkout-fallback into main
contract-openapi / openapi-contract (push) Successful in 53s
contract-openapi / ts-client-is-current (push) Successful in 43s
Merge PR #63: contract-openapi checkout-fallback (обход дефекта Gitea git-http #59)

TechLead: гейт зелёный (4/4 combined success, run 64/65), конфликтов нет. Снимает красные статусы contract-openapi на всех PR. Корневой дефект git-http остаётся в #59.
2026-10-29 20:58:36 +03:00
embeddevio 80b33d5132 docs(ci): дефекты 6.4 (артефакты, #62) и 6.5 (contract-openapi checkout, #59)
ci / lint (push) Successful in 47s
ci / lint (pull_request) Successful in 1m29s
contract-openapi / openapi-contract (push) Failing after 35s
contract-openapi / ts-client-is-current (push) Failing after 35s
contract-openapi / openapi-contract (pull_request) Failing after 33s
contract-openapi / ts-client-is-current (pull_request) Failing after 36s
ci / unit (push) Successful in 57s
ci / security (push) Successful in 7m12s
ci / unit (pull_request) Successful in 46s
ci / security (pull_request) Successful in 4m25s
ci / build (push) Has been skipped
ci / image-scan (push) Has been skipped
ci / build (pull_request) Has been skipped
ci / push (push) Has been skipped
ci / image-scan (pull_request) Has been skipped
ci / push (pull_request) Has been skipped
Refs #17, Refs #59, Refs #62
2026-10-28 23:40:43 +03:00
embeddevio ca14ae6819 ci(contract): checkout-fallback на archive-архив (обход дефекта git-http, #59)
contract-openapi / openapi-contract (push) Successful in 1m3s
contract-openapi / ts-client-is-current (push) Successful in 1m32s
contract-openapi / openapi-contract (pull_request) Successful in 56s
contract-openapi / ts-client-is-current (pull_request) Successful in 42s
actions/checkout падает на всех коммитах: `git-upload-pack` отдаёт пустой pack
(`bad pack header`, exit 128), из-за чего статусы `contract-openapi/*` всегда красные
и любой PR (включая #60) не может получить зелёный combined status.

Источники забираются архивом `/archive/<sha>.tar.gz` (endpoint работает), проверка
TS-клиента без .git сравнивает sha256 сгенерированного schema.d.ts.

Refs #59, Refs #17
2026-10-28 23:34:02 +03:00
embeddevio bbe0886342 docs(ci): runbook пайплайна и отчёт проверки runner'а (#17)
ci / lint (push) Successful in 42s
contract-openapi / openapi-contract (push) Failing after 48s
contract-openapi / ts-client-is-current (push) Failing after 50s
ci / lint (pull_request) Successful in 42s
contract-openapi / openapi-contract (pull_request) Failing after 40s
contract-openapi / ts-client-is-current (pull_request) Failing after 28s
ci / unit (push) Successful in 49s
ci / security (push) Successful in 3m10s
ci / unit (pull_request) Successful in 48s
ci / security (pull_request) Successful in 2m22s
ci / build (push) Has been skipped
ci / image-scan (push) Has been skipped
ci / build (pull_request) Has been skipped
ci / push (push) Has been skipped
ci / image-scan (pull_request) Has been skipped
ci / push (pull_request) Has been skipped
Refs #17, Refs #15
2026-10-28 23:12:17 +03:00
embeddevio aac82e6d23 ci: токен для registry — secret REGISTRY_TOKEN с fallback на GITHUB_TOKEN
ci / lint (push) Successful in 48s
contract-openapi / openapi-contract (push) Failing after 38s
contract-openapi / ts-client-is-current (push) Failing after 33s
ci / unit (push) Successful in 56s
ci / security (push) Successful in 1m8s
ci / build (push) Has been skipped
ci / image-scan (push) Has been skipped
ci / push (push) Has been skipped
Refs #17
2026-10-28 22:32:41 +03:00
embeddevio 336df50ca0 ci: trivy через образ aquasec/trivy (сокет) + кэш БД на хосте; бинарь через github releases качается слишком медленно
ci / lint (push) Successful in 53s
contract-openapi / openapi-contract (push) Failing after 35s
contract-openapi / ts-client-is-current (push) Failing after 36s
ci / unit (push) Successful in 47s
ci / security (push) Successful in 1m23s
ci / build (push) Has been skipped
ci / image-scan (push) Has been skipped
ci / push (push) Has been skipped
Refs #17
2026-10-28 22:31:45 +03:00
embeddevio 88bdaf7d3a ci: trivy ставим из релизного tarball (install.sh + v0.57.1 → 404), версия 0.76.1
ci / lint (push) Successful in 46s
contract-openapi / openapi-contract (push) Failing after 35s
contract-openapi / ts-client-is-current (push) Failing after 32s
ci / unit (push) Successful in 56s
ci / security (push) Successful in 1m13s
ci / build (push) Has been skipped
ci / image-scan (push) Has been skipped
ci / push (push) Has been skipped
Refs #17
2026-10-28 22:21:04 +03:00
embeddevio a4475113bc Merge pull request 'Sprint 0 / #21: dev/staging стенд — docker-compose, тома, netns-харнесс' (#53) from feat/21-dev-stand into main
contract-openapi / openapi-contract (push) Failing after 36s
contract-openapi / ts-client-is-current (push) Failing after 28s
Sprint 0 / #21: dev/staging стенд — docker-compose, тома, netns-харнесс

Ревью QA (раунд 3) APPROVE: AC-1 health 200 + healthy, AC-2 состояние переживает
restart и --force-recreate, AC-3 netns 8/8 ok; gates shellcheck/validate_compose/
test-deploy (51 passed, coverage 98.86%) — зелёные, все 5 замечаний раундов 1-2 закрыты.
Прогоны выполнены ревьюером на стенд-хосте 192.168.1.147.
CI-гейт заменён по причине дефекта git-http Gitea (#58: bad pack header в job-чекэуте).
Refs #21, #15, #58.
2026-10-28 22:12:02 +03:00
embeddevio a941525f2e ci: тесты требуют requirements-contract.txt; явный guard на отсутствие deploy/Dockerfile
ci / lint (push) Successful in 42s
contract-openapi / openapi-contract (push) Failing after 41s
contract-openapi / ts-client-is-current (push) Failing after 31s
ci / unit (push) Successful in 41s
ci / security (push) Successful in 1m19s
ci / build (push) Has been skipped
ci / image-scan (push) Has been skipped
ci / push (push) Has been skipped
Refs #17
2026-10-28 22:01:14 +03:00
embeddevio a3396b2be6 docs(#21): VERIFICATION-21 §7 — реальные прогоны раунда 3 (коды 0/1/3/4, make→2, env-алиас, DEV_SKIP_BUILD)
Гоняно на 192.168.1.147 на дереве, сверенном по git-blob-SHA: ci.sh 0/4/3/1,
make при коде 4 и 1 отдаёт 2 (контейнерные коды видны в логе), AWG_NS_EXEC_MODE
больше не перекрывается, DEV_SKIP_BUILD=1 даёт AC-1 (200 + healthy), test-deploy
51 passed / 98.86 %, manifests и shellcheck — 0.

Refs #21
Refs #56
2026-10-28 21:58:58 +03:00
embeddevio 9d2222455a docs(#21): VERIFICATION-21 — контракт кодов через make зафиксирован в §6.1, поправка §6.3
Ревью PR #53 (раунд 2) требовало явной фиксации «make → 2, контракт действует на
уровне контейнера» и снятия неверного утверждения про прокидывание
AWG_NS_EXEC_MODE. Прогоны раунда 3 добавляются отдельным коммитом.

Refs #21
Refs #56
2026-10-28 21:58:23 +03:00
embeddevio 94d3a28adf docs(#21): README netns и runbook dev-stand — ci.sh, приоритет AWG_NS_EXEC_MODE, DEV_SKIP_BUILD
Приведение документации к фактическому поведению после ревью PR #53 (раунд 2):
точка входа для CI без make (контракт 0/1/3/4), приоритет AWG_NS_EXEC_MODE над
make-алиасом, сборка без сети (DEV_SKIP_BUILD=1).

Refs #21
Refs #56
2026-10-28 21:58:15 +03:00
embeddevio b612a3450c deploy(#21): tests/netns/ci.sh — точка входа netns-стенда для CI без make
GNU make отдаёт 2 на любой упавший рецепт, поэтому контракт 0/1/3/4 через
`make test-netns-ci` до пайплайна #17 не доходит. ci.sh запускает тот же
контейнер (docker compose -f deploy/docker-compose.test.yml run --rm -T netns)
и возвращает его код как есть. Дополнительно: AWG_NS_PRIVILEGED=0 — прогон без
--privileged (проверка ветки «код 3»), AWG_DASH_TEST_ARTIFACTS — каталог отчёта.

Refs #21
Refs #56
2026-10-28 21:58:04 +03:00
embeddevio e672901741 deploy(#21): контракт кодов netns без make, AWG_NS_EXEC_MODE в приоритете, DEV_SKIP_BUILD
Реализация замечаний ревью PR #53 (issuecomment-664):

1. tests/netns/ci.sh — точка входа для CI #17 без make: docker compose run --rm -T
   netns, код контейнера возвращается как есть (0/1/3/4; 2 — сломан вызов/нет
   docker/образа). make test-netns-ci делегирует в неё, в комментарии таргета
   зафиксировано «make → 2».
2. NETNS_EXEC_MODE ?= $(if $(AWG_NS_EXEC_MODE),$(AWG_NS_EXEC_MODE),auto) —
   документированный AWG_NS_EXEC_MODE больше не перекрывается make-алиасом.
3. DEV_SKIP_BUILD=1 → up -d --no-build; DEV_UP_BUILD переопределяем (?) —
   dev-up работает на хосте без DNS/сети для сборки.

Refs #21
Refs #56
2026-10-28 21:57:44 +03:00
embeddevio b13f5e8ac5 ci: пайплайн с гейтами (lint, unit+coverage>=70%, security, build, image-scan, push staging-<sha>)
contract-openapi / openapi-contract (push) Failing after 0s
contract-openapi / ts-client-is-current (push) Failing after 1s
ci / lint (push) Successful in 7m38s
ci / unit (push) Failing after 1m3s
ci / security (push) Successful in 2m19s
ci / build (push) Has been skipped
ci / image-scan (push) Has been skipped
ci / push (push) Has been skipped
Refs #17, Refs #15

- lint: ruff check/format + mypy strict
- unit: pytest с --cov-fail-under=70, артефакты coverage.xml + htmlcov
- security: bandit -lll (HIGH) + pip-audit, артефакты bandit/pip-audit
- build: docker build deploy/Dockerfile -> staging-<sha> (активируется после merge #18)
- image-scan: trivy HIGH/CRITICAL --exit-code 1
- push: docker login + push в registry 192.168.1.111:3000

Обход дефекта Gitea git-http (upload-pack отдаёт пустой pack): fallback
на archive/<sha>.tar.gz, actions/checkout остаётся основным путём.
2026-10-28 21:47:05 +03:00
embeddevio dbb5d1fe5c deploy: актуальный blob topology.sh после shellcheck-фикса (#56)
Refs #21, Refs #56
2026-10-28 21:39:31 +03:00
embeddevio 221d8740c9 netns: shellcheck SC2034 в цикле сноса топологии (#56)
Refs #21, Refs #56
2026-10-28 21:39:05 +03:00
embeddevio e6ba503c20 deploy: стабильность netns-ci 5/5 и актуальный blob topology.sh (#56)
Refs #21, Refs #56
2026-10-28 21:38:32 +03:00
embeddevio 6c5d739cfc netns: удаление netns безусловно + проверка результата (#56)
Флак: ns_exists мог вернуть false до удаления, и namespace оставался жить.
Теперь `ip netns delete` вызывается всегда, результат проверяется до 5 раз.
Стабильность в контейнере: 5/5 прогонов rc=0 (было 4/5).

Refs #21, Refs #56
2026-10-28 21:37:09 +03:00
embeddevio 4ff22f4323 Merge pull request 'Sprint 0 / #20: хранилище состояния — SQLite WAL, миграции, audit log, атомарный apply/rollback' (#50) from feat/20-storage into main
contract-openapi / openapi-contract (push) Failing after 37s
contract-openapi / ts-client-is-current (push) Failing after 38s
Sprint 0 / #20: хранилище состояния — SQLite WAL, миграции, audit log, атомарный apply/rollback

Правки по ревью QA (#54 critical, #55 D-1/D-2) внесены и приняты:
RLock на чтения, BaseException → revert + failed в аудите, old_value внутри транзакции.
Гейт на merge-состоянии (main + PR): ruff/format чисто, mypy strict 21 файл,
pytest 107 passed / coverage 97.80% (порог 70%), 55/55 AC-проб, 28/28 security-проб,
мутационная проверка тестов пройдена. Ревью: qa-engineer (APPROVE) + TechLead.
Refs #20, #54, #55, #52.
2026-10-28 21:35:41 +03:00
embeddevio 63e75e4b7f netns: снос топологии с повторами на случай ленивого umount (#56)
В контейнере `ip netns delete` иногда возвращает успех, но namespace остаётся
в `ip netns list` — из-за этого run.sh отдавал код 4 на зелёных тестах (флак
1 из 3). Теперь удаление повторяется до 5 раз с проверкой ns_exists.

Refs #21, Refs #56
2026-10-28 21:35:27 +03:00
embeddevio 156d791020 deploy: таблица git-blob-SHA приведена к раунду 2 (#56)
Refs #21, Refs #56
2026-10-28 21:33:36 +03:00
embeddevio d63b9ceafe deploy: реальные прогоны раунда 2 в VERIFICATION-21 (#56)
- netns-ci в контейнере: причина (ip netns exec/ip -n перемонтируют /sys),
  переход на nsenter, контракт кодов 0/1/3/4 — все четыре воспроизведены.
- гейт покрытия: make test-deploy = 51 passed, 98.86 %.

Refs #21, Refs #15, Refs #56
2026-10-28 21:32:32 +03:00
embeddevio edf22d7c93 tests: пояснение к профилю pytest стенда (#56)
Refs #21, Refs #56
2026-10-28 21:32:07 +03:00
embeddevio 8e76f41f63 tests: негативные тесты валидатора compose-манифестов (#56)
Каждая инварианта AC #21 ломается по отдельности (порт, тома /config /data,
healthcheck, NET_ADMIN, /dev/net/tun, ip_forward, privileged netns-сервис,
DEV-ONLY-метка, --require-dockerfile) — 39 тестов, реальные манифесты не трогаются.

Refs #21, Refs #56
2026-10-28 21:31:07 +03:00
embeddevio 8db92df8f2 tests: покрытие health-заглушки и отдельный профиль pytest (#56)
- tests/deploy/pytest.ini + .coveragerc: гейт ≥70 % для кода стенда (deploy/ и
  validate_compose.py), тестовые модули из покрытия исключены.

Refs #21, Refs #56
2026-10-28 21:30:48 +03:00
embeddevio c7f2ea128e deploy: гейт покрытия стенда и тестируемая health-заглушка (#56)
- deploy/api_stub.py: make_server() выделен из main(), main(argv) — тесты поднимают
  настоящий сервер на порту 0 (покрытие api_stub.py 0 % -> 98 %).
- Makefile: make test-deploy (гейт ≥70 % через tests/deploy/pytest.ini),
  test-netns-ci прокидывает AWG_NS_EXEC_MODE.

Refs #21, Refs #15, Refs #56
2026-10-28 21:30:33 +03:00
embeddevio 4aa69132ad netns: nsenter в topology.sh, netns_common и документации (#56)
- topology.sh: ns_exec для всех ip -n <ns> и ip netns exec, коды 0/1/3/4.
- netns_common.py: ns_exec_mode()/ns_exec_direct(), addrs/links/link_is_up через ns_sh.
- docker-compose.test.yml: проброс AWG_NS_EXEC_MODE в netns-сервис.
- tests/netns/README.md: режимы входа в netns, коды возврата, новый pitfall.

Refs #21, Refs #15, Refs #56
2026-10-28 21:30:22 +03:00
embeddevio f0847001ee netns: вход в namespace через nsenter при отказе ip netns exec (#56)
- lib.sh: ns_exec()/ns_prefix() с автоопределением режима (AWG_NS_EXEC_MODE),
  stand_fail() для кода 4; cleanup в run.sh больше не оставляет мок и sink.
- run.sh/topology.sh: коды возврата нормализованы к 0/1/3/4 (255 от iproute2 -> 4).

Refs #21, Refs #15, Refs #56
2026-10-28 21:30:01 +03:00
embeddevio 3e3519edc8 Merge pull request 'Sprint 0 / #19: OpenAPI 3.1 контракт API v1 + TS-клиент и контрактные тесты' (#57) from feat/19-openapi into main
contract-openapi / openapi-contract (push) Failing after 0s
contract-openapi / ts-client-is-current (push) Failing after 0s
Sprint 0 / #19: OpenAPI 3.1 контракт API v1 + TS-клиент и контрактные тесты

AC проверены независимо (ревью TechLead): генератор TS-клиента (blob сверен),
отклонение схемы роняет контрактный тест (мутации), секретов в ответах нет.
Гейты: ruff/mypy чисто, pytest 93 passed / coverage 95.48% (порог 70%).
CI green недостижим — runner отсутствует (#52); отклонение зафиксировано в PR.
Refs #19, #15, #52.
2026-10-28 21:21:13 +03:00
embeddevio 063ecf18ce Merge pull request 'Sprint 0 / #16: каркас монорепозитория, ADR-001..008 и линтеры' (#47) from feat/16-repo-skeleton into main
Sprint 0 / #16: каркас монорепозитория, ADR-001..008, линтеры (ruff/mypy/pytest, coverage>=70)

Гейты прогнаны вручную на байтах ветки (CI runner отсутствует — #52):
ruff check rc=0, ruff format --check rc=0, mypy strict rc=0,
pytest 2 passed / coverage 100% (порог 70%).
Ревью: TechLead. Refs #16, #15, #52.
2026-10-28 21:16:03 +03:00
embeddevio c4661c9db9 test(#20): регрессионные тесты потокобезопасности (#54) и BaseException/TOCTOU (#55)
Новый файл backend/tests/test_store_concurrency.py:

* N потоков × M upsert с чтениями → 0 ошибок, rules == audit_rows == N*M;
* чтение во время открытой транзакции другого потока не видит незафиксированных
  строк (ждёт коммита);
* чтение во время падающего apply не видит состояния, которое будет откачено
  (AC «не частично применённая конфигурация»);
* BaseException (KeyboardInterrupt/SystemExit/CancelledError) из Applier →
  revert вызван, failed в audit_log, БД восстановлена;
* два конкурентных set_geoip_schedule → связная цепочка old→new в журнале.

На коде до правки все 7 тестов падают; после — проходят.

Refs #20, Refs #54, Refs #55
2026-10-28 21:12:35 +03:00
embeddevio e989e46b19 chore(ui): generated TS client schema.d.ts (block 5/5: operations tail)
contract-openapi / openapi-contract (push) Failing after 0s
contract-openapi / ts-client-is-current (push) Failing after 0s
contract-openapi / openapi-contract (pull_request) Failing after 0s
contract-openapi / ts-client-is-current (pull_request) Failing after 1s
2026-10-28 21:12:09 +03:00
embeddevio 249f32e3f9 fix(#20): потокобезопасные чтения, BaseException в apply, old_value внутри транзакции (#54, #55)
Закрывает замечания ревью QA по PR #50:

* #54: все чтения Store идут через Database.read() под тем же RLock, что
  транзакции; контракт «одно соединение, все операции под локом»
  задокументирован в db.py и README модуля. Устраняет TypeError/IndexError
  на общем соединении, грязные чтения и выдачу состояния, которое затем
  откатывается падающим apply.
* #55 D-1: apply ловит BaseException — отмена/CancelledError/
  KeyboardInterrupt вызывают Applier.revert(previous) и пишут failed в
  audit_log (без «висящей» записи staged); падение revert попадает в detail.
* #55 D-2: set_geoip_schedule читает old_value внутри той же транзакции.

Refs #20, Refs #54, Refs #55
2026-10-28 21:12:09 +03:00
embeddevio d8fc5c7f7d chore(ui): generated TS client schema.d.ts (block 4/5: operations)
contract-openapi / openapi-contract (push) Failing after 0s
contract-openapi / ts-client-is-current (push) Failing after 0s
contract-openapi / openapi-contract (pull_request) Failing after 0s
contract-openapi / ts-client-is-current (pull_request) Failing after 0s
2026-10-28 21:11:54 +03:00
embeddevio 4ff7d39fb1 chore(ui): generated TS client schema.d.ts (block 3/5: responses)
contract-openapi / openapi-contract (push) Failing after 0s
contract-openapi / ts-client-is-current (push) Failing after 0s
contract-openapi / openapi-contract (pull_request) Failing after 0s
contract-openapi / ts-client-is-current (pull_request) Failing after 0s
2026-10-28 21:11:36 +03:00
embeddevio 5522f32638 chore(ui): generated TS client schema.d.ts (block 2/5: schemas)
contract-openapi / openapi-contract (push) Failing after 0s
contract-openapi / ts-client-is-current (push) Failing after 0s
contract-openapi / openapi-contract (pull_request) Failing after 0s
contract-openapi / ts-client-is-current (pull_request) Failing after 0s
2026-10-28 21:11:21 +03:00
embeddevio ba1a870d32 chore(ui): fix bearer placeholder in generated client
contract-openapi / openapi-contract (push) Failing after 0s
contract-openapi / ts-client-is-current (push) Failing after 0s
contract-openapi / openapi-contract (pull_request) Failing after 0s
contract-openapi / ts-client-is-current (pull_request) Failing after 0s
2026-10-28 21:10:57 +03:00
embeddevio 217a11919d chore(ui): generated TS client schema.d.ts (block 1/5: paths)
contract-openapi / openapi-contract (push) Failing after 0s
contract-openapi / ts-client-is-current (push) Failing after 1s
contract-openapi / openapi-contract (pull_request) Failing after 0s
contract-openapi / ts-client-is-current (pull_request) Failing after 0s
2026-10-28 21:09:21 +03:00
embeddevio 8691a3dec1 chore(ui): add generated TS client schema.d.ts (part 1/4)
contract-openapi / openapi-contract (push) Failing after 27s
contract-openapi / ts-client-is-current (push) Failing after 30s
contract-openapi / ts-client-is-current (pull_request) Failing after 1s
contract-openapi / openapi-contract (pull_request) Failing after 43s
2026-10-28 21:08:12 +03:00
embeddevio 3387eb0f60 test(contract): restore trailing newline at EOF
contract-openapi / openapi-contract (push) Failing after 32s
contract-openapi / ts-client-is-current (push) Failing after 28s
contract-openapi / openapi-contract (pull_request) Failing after 32s
contract-openapi / ts-client-is-current (pull_request) Failing after 33s
2026-10-28 21:07:11 +03:00
embeddevio c53e2ef9b1 test(contract): align response contract test with the verified green run
contract-openapi / openapi-contract (push) Failing after 40s
contract-openapi / ts-client-is-current (push) Failing after 1m24s
2026-10-28 21:06:55 +03:00
embeddevio c6150bd5fd test(contract): align spec test with the verified green run
contract-openapi / openapi-contract (push) Failing after 18m54s
contract-openapi / ts-client-is-current (push) Failing after 18m49s
2026-10-28 21:06:33 +03:00
embeddevio 95f1337fd4 chore(ui): скрипт генерации TS-клиента из OpenAPI (Refs #19)
contract-openapi / openapi-contract (push) Has been cancelled
contract-openapi / ts-client-is-current (push) Has been cancelled
- ui/scripts/generate-api.sh: openapi-typescript@7 над docs/openapi.yaml.
- ui/src/api/generated/README.md: правила перегенерации и семантика writeOnly-секретов.
2026-10-22 00:23:16 +03:00
embeddevio 3dac7e730a test(api): контрактные тесты «схема ↔ реализация» (Refs #19)
contract-openapi / openapi-contract (push) Has been cancelled
contract-openapi / ts-client-is-current (push) Has been cancelled
- test_openapi_spec: валидность 3.1, полнота операций по ТЗ, writeOnly-секреты,
  единый формат Error, соответствие pydantic-моделей схемам.
- test_contract_responses: все эндпоинты против схем, ошибки 401/404/409/422/503,
  WS-кадры, отсутствие секретов в ответах.
- test_contract_negative: доказательство AC — подмена реализации на расходящуюся
  роняет контрактный тест с указанием пути до поля.
2026-10-22 00:22:46 +03:00
embeddevio 7d9cf8ca5e feat(api): роутеры API v1 и WebSocket-поток метрик (Refs #19)
contract-openapi / openapi-contract (push) Has been cancelled
contract-openapi / ts-client-is-current (push) Has been cancelled
- ops: health/ready/metrics без аутентификации (503 = схема Error).
- auth: login/logout/session, cookie-сессия + CSRF-токен.
- status/config/routing/devices+logs: все эндпоинты контракта.
- ws/metrics: /api/v1/metrics/stream, токен в заголовке или query.
2026-10-22 00:21:56 +03:00
embeddevio 839f773010 feat(api): контрактный харнесс и in-memory состояние мок-сервера (Refs #19)
contract-openapi / openapi-contract (push) Has been cancelled
contract-openapi / ts-client-is-current (push) Has been cancelled
- contract.py: загрузка docs/openapi.yaml, вырезание writeOnly-секретов из схем
  ответов, валидация тела ответа (jsonschema Draft2020-12 + FormatChecker),
  двусторонняя сверка маршрутов приложения и контракта.
- state.py: мок-состояние туннеля/правил/устройств/журнала; секреты хранятся
  отдельно от словарей-ответов.
2026-10-22 00:21:43 +03:00