Skip to content

Latest commit

 

History

History
345 lines (269 loc) · 18.9 KB

File metadata and controls

345 lines (269 loc) · 18.9 KB

Отчет аудита: task.md vs текущее состояние репозитория

Обновлено (UTC): 2026-02-24T20:59:04Z Коммит: c6359be Режим: strict baseline as-is + max checks Источники: /Users/uchebnick/Downloads/task.md, /Users/uchebnick/Downloads/criteria.md FX scope: C8/C9/C10

Baseline состояния репозитория

Текущий git-status на момент финализации:

  • ?? result.md
  • ?? score.md

Аудит выполнен без правок продуктового кода и контрактов; изменялись только result.md и score.md.

Журнал checkpoint сохранений

  • CP-00 2026-02-24T19:03:39Z старт аудита и первичная фиксация baseline.
  • CP-01 2026-02-24T19:41:23Z стабилизация стенда перед baseline gate.
  • CP-02 2026-02-24T20:31:40Z полный baseline gate (validate/lint/test/proto/e2e) + runbook demo_test.sh.
  • CP-03 2026-02-24T20:42:15Z runtime/load этап (dashboard, automation-lag, decision-cache-*) + retry/diagnostic по library smoke.
  • CP-04 2026-02-24T20:43:10Z блок 0 (roles/review/fallback).
  • CP-05 2026-02-24T20:43:35Z блок 1 (feature flags).
  • CP-06 2026-02-24T20:44:10Z блок 2 (experiments lifecycle/invariants).
  • CP-07 2026-02-24T20:44:40Z блок 3 (runtime decide/stickiness/readiness).
  • CP-08 2026-02-24T20:45:05Z блок 4 (events validation/dedup/attribution).
  • CP-09 2026-02-24T20:45:30Z блок 5 (reports/outcome/comment).
  • CP-10 2026-02-24T20:45:55Z блок 6 (guardrails trigger/action/history).
  • CP-11 2026-02-24T20:46:15Z блок 7 (notifications, info-only).
  • CP-12 2026-02-24T20:46:50Z блок 8 (C8 insights UI/DQ/segments/export).
  • CP-13 2026-02-24T20:47:25Z блок 9 (C9 learnings library).
  • CP-14 2026-02-24T20:48:00Z блок 10 (C10 autopilot gates/safety/history/manual).
  • CP-15 2026-02-24T20:48:25Z блок 11 (conflicts, info-only).
  • CP-16 2026-02-24T20:49:10Z блок D (артефакты/проверяемость/доки).
  • CP-17 2026-02-24T20:59:04Z доаудит RUNBOOK/TRACEABILITY/OPTIONAL_FEATURES/REPO_MAP/ARCHITECTURE/TEST_REPORT с построчной сверкой.
  • CP-final 2026-02-24T20:59:04Z финальный скоринг и проверка консистентности.

Журнал команд и доказательств

CP-02 — baseline gate + runbook

  • ./scripts/validate_repo.sh -> PASS (Repository structure validation passed.)
  • ./scripts/validate_migrations.sh -> PASS (Migration policy validation passed.)
  • make lint-go -> PASS (0 issues во всех auth-service/autopilot/control-plane/decision/events/guardrails/library/logs/metrics/review)
  • make test-go -> PASS
  • make proto-lint -> PASS
  • make e2e-smoke -> PASS (direct_logic, direct_chain, envoy_logic, envoy_chain, automation_reads)
  • bash infra/tests/e2e/sh/demo_test.sh -> PASS
    • В логе есть финальный блок ИТОГ и Все сценарии успешно пройдены.
    • Подтверждено: happy-path decide -> ingest -> recompute -> report, fallback вне таргетинга, дедуп, guardrail trigger + аудит в logs.

CP-03 — load/runtime и сценарные проверки

  • cd infra && ./tests/run-load.sh dashboard-metrics-demo -> PASS
    • checks=100%, http_req_failed=0%, final_rows_upserted=558, final_report_metrics=18.
  • cd infra && ./tests/run-load.sh automation-lag -> PASS
    • checks=100%, http_req_failed=0%, финальный снапшот automation_lag_final с ненулевыми due/lag значениями.
  • cd infra && ./tests/run-load.sh decision-cache-warmup -> PASS
    • checks=100%, http_req_failed=0%, warm_avg_ms быстрее cold_avg_ms (speedup_x=1.35).
  • cd infra && ./tests/run-load.sh decision-cache-logic -> PASS
    • checks=100%, http_req_failed=0%, стабильность значений в epoch1/epoch2, warm/cold инварианты выполнены.
  • ./library/scripts/e2e_library_elastic_smoke.sh -> FAIL (первый запуск)
    • open /Users/uchebnick/prodfinal2026/library/docker-compose.yml: no such file or directory
  • Retry-policy: повтор теми же параметрами -> FAIL (тот же дефект).
  • Диагностика: test -f library/docker-compose.yml -> файл отсутствует.
  • Дополнительная doc-driven проверка (TEST_REPORT.md DQ short run):
    • LOAD_METRICS_ENABLED=0 DURATION=20s ... ./tests/run-load.sh dashboard-metrics-demo -> PASS
    • ClickHouse outcomes:
      • accepted=61, duplicate=7, pending_attribution=2, rejected=4
      • rejected reasons: missing_required_props, invalid_assignment (как в доке).

CP-17 — документационный аудит (runbook-first)

  • docs/RUNBOOK.md:
    • подтверждены предусловия/команды старта/основной acceptance через demo_test.sh;
    • проверены команды для load/e2e и ожидаемые артефакты.
  • docs/TRACEABILITY_MATRIX.md:
    • матрица заполнена, но найдено несоответствие C9=реализовано при невоспроизводимом smoke (F-002).
  • docs/OPTIONAL_FEATURES.md:
    • C8 и C10 сценарии согласованы с фактическими прогонами;
    • C9 ссылается на команду, которая падает из-за отсутствующего library/docker-compose.yml (F-002).
  • docs/REPO_MAP.md:
    • найден битый путь критичного потока metrics/internal/service/* (F-003).
  • docs/ARCHITECTURE.md:
    • C4 L1/L2/L3 присутствуют и покрывают критичный путь.
  • docs/TEST_REPORT.md:
    • команды и метрики в основном воспроизводимы;
    • короткий DQ-прогон подтвержден и согласован с описанием.

Аудит по блокам task.md (0..11, D)

Блок 0 — Access/Roles/Review

Инварианты:

  • роли admin/experimenter/approver/viewer;
  • approvals только по политике;
  • порог approvals обязателен;
  • fallback при отсутствии approver-group должен быть однозначным и документированным.

Проверено:

  • Роли и проверки прав реализованы (control-plane/internal/services/experiments.go, review/internal/services/validation.go).
  • Review lifecycle реализован (review/internal/services/experiments_lifecycle.go).
  • Fallback в коде: при отсутствии группы approvals возможны только для admin, threshold берется из user/default policy (review/internal/services/policy.go, review/internal/services/validation.go).

Аномалия:

  • F-004 (fallback-политика не описана явно в документации).

Статус блока: completed (partial)

Блок 1 — Feature Flags

Инварианты:

  • create/list/get flags;
  • typed values (string/number/bool);
  • update только default value;
  • корректный fallback на default.

Проверено:

  • control-plane/internal/services/flags.go валидирует типы и обновляет только default.
  • Runtime fallback подтвержден e2e/demo (Decide outside targeting -> default).

Статус блока: completed

Блок 2 — Experiments (инварианты/жизненный цикл)

Инварианты:

  • единственность активного эксперимента на флаг;
  • freeze конфигурации после старта/паузы;
  • lifecycle валидные переходы;
  • таргетинг/веса/контрольный вариант.

Проверено:

  • Единственность активного эксперимента на флаг есть (ensureSingleActiveFlagInTx).
  • Валидации веса/контрольного варианта есть (CreateExperiment/UpdateExperiment).

Аномалия:

  • F-001 — freeze инвариант нарушен: обновление running эксперимента допустимо (и покрыто тестом как ожидаемое поведение).

Статус блока: completed (with major finding)

Блок 3 — Runtime Decide

Инварианты:

  • deterministic/sticky выдача;
  • default/variant логика;
  • участие пользователя ограничено;
  • readiness/liveness.

Проверено:

  • deterministic/stickiness подтверждены decision-cache-warmup/decision-cache-logic.
  • default/variant/fallback подтверждены demo/e2e.
  • participation limit реализован token-bucket (decision/internal/repositories/redis.go).
  • /health и /ready через Envoy проверены (включая ready contract <=180s в demo run).

Статус блока: completed

Блок 4 — Events

Инварианты:

  • валидация обязательных полей/формата;
  • дедуп;
  • атрибуция через decision_id;
  • корректная обработка out-of-order.

Проверено:

  • direct/envoy logic tests: invalid payload / required props rejection.
  • direct/envoy chain tests: dedup, out-of-order attribution (pending_attribution -> promotion).
  • В events/internal/events/server.go и store.go есть явная обработка exposure/attribution/dedup.

Статус блока: completed

Блок 5 — Reports

Инварианты:

  • фильтр окна отчета;
  • разрез по вариантам;
  • метрики из bindings;
  • фиксация outcome (rollout/rollback/no effect) и комментария.

Проверено:

  • metrics/internal/grpc/server.go (parseWindow, variant scope, bindings).
  • Review completion flow требует outcome+comment (review/internal/services/experiments_lifecycle.go).

Статус блока: completed

Блок 6 — Guardrails

Инварианты:

  • rule: metric+threshold+window+action;
  • detection threshold breach;
  • action execution;
  • trigger history/audit.

Проверено:

  • Rule/trigger storage и execution есть (guardrails/internal/app/service.go, guardrails/internal/adapters/postgres/repository.go).
  • Demo подтверждает experiment.paused и payload.reason в logs.

Статус блока: completed

Блок 7 — Notifications (info-only)

Проверено:

  • В репозитории нет отдельной notification-platform с каналами 2+ (Slack/Telegram/etc).

Аномалия:

  • F-005 — блок C7 фактически не реализован.

Статус блока: completed (info-gap)

Блок 8 — Insights UI (C8)

Проверено:

  • dashboard-metrics-demo проходит стабильно (checks=100%, http_req_failed=0).
  • DQ short-run и ClickHouse выборки подтверждают accepted/duplicate/pending/rejected и топ причин.
  • Доки по C8 и экспорту/шерингу через Grafana присутствуют.

Статус блока: completed

Блок 9 — Learnings Library (C9)

Проверено:

  • Код Create/Get/Search присутствует (library/internal/services/*, internal/search/elasticsearch.go).
  • Репродукция через заявленный smoke-скрипт не проходит.

Аномалия:

  • F-002 — ключевой demo-командой C9 не воспроизводится из-за отсутствующего compose-файла.

Статус блока: completed (failed reproducibility)

Блок 10 — Autopilot Ramp-up (C10)

Проверено:

  • Gates/safety/history/manual controls реализованы (autopilot runner + grpc API SetAutopilotMode, RestartAutopilot, OverrideAutopilotStep).
  • automation-lag load сценарий проходит (checks=100%, lag/due/decision метрики есть).

Статус блока: completed

Блок 11 — Conflicts (info-only)

Проверено:

  • Есть conflict-domain и deterministic selection на runtime (conflict_domain_key, priority, bucket selection).

Аномалия:

  • F-006 — модель политик неполная относительно формулировок task (нет явного policy-типа mutual exclusion / bid / priority tiers как конфигурируемой сущности).

Статус блока: completed (info-gap)

Блок D — Артефакты и проверяемость

Проверено:

  • Есть RUNBOOK, ARCHITECTURE, TEST_REPORT, TRACEABILITY_MATRIX, OPTIONAL_FEATURES, REPO_MAP.
  • Большинство команд из документации воспроизводимы и подтверждены командами выше.

Аномалии:

  • F-003 — ошибка в REPO_MAP (битая ссылка пути для metrics critical flow).
  • F-002 — несогласованность TRACEABILITY/OPTIONAL_FEATURES с фактическим статусом C9 smoke.
  • F-004 — fallback-политика review не зафиксирована явно в документации.

Статус блока: completed (with doc inconsistencies)

Findings

F-001

  • severity: high
  • task_ref: 2.3.2 (заморозка после старта)
  • criteria_ref: B3-4
  • evidence:
    • control-plane/internal/services/experiments_service_test.go:80 (TestExperimentsService_Update_OwnerCheckAndRunningAllowed)
    • control-plane/internal/repositories/experiments.go:110 (UpdateByIDWithVariants без проверки status на running/paused)
  • expected: после старта/паузы изменение параметров раздачи должно блокироваться.
  • actual: обновление running конфигурации разрешено и создает новую активную версию.
  • impact: риск нерепродуцируемости эксперимента и смешивания эффекта во время рантайма.
  • score_impact: yes (B3-4)

F-002

  • severity: high
  • task_ref: 9, D.2, D.4
  • criteria_ref: FX(C9)-1, FX(C9)-2, B7-3
  • evidence:
    • команда: ./library/scripts/e2e_library_elastic_smoke.sh -> exit=1
    • сообщение: open /Users/uchebnick/prodfinal2026/library/docker-compose.yml: no such file or directory
    • library/scripts/e2e_library_elastic_smoke.sh:6 (COMPOSE_FILE="$ROOT_DIR/docker-compose.yml")
    • docs/OPTIONAL_FEATURES.md:45 (команда заявлена как основной C9 demo)
    • docs/TRACEABILITY_MATRIX.md:58-59 (C9 отмечен как реализовано)
  • expected: заявленный C9 smoke-сценарий должен воспроизводимо проходить.
  • actual: сценарий не стартует, повтор и диагностика подтвердили инфраструктурный дефект.
  • impact: C9 не подтверждается на демо; трассируемость в доках вводит в заблуждение.
  • score_impact: yes (C9, B7-3)

F-003

  • severity: medium
  • task_ref: D.4, B7.8
  • criteria_ref: B7-8
  • evidence:
    • docs/REPO_MAP.md:63 -> metrics/internal/service/*
    • фактически каталог отсутствует, реализация в metrics/internal/grpc/server.go
  • expected: карта репозитория должна вести к существующим критичным файлам.
  • actual: указан несуществующий путь.
  • impact: ухудшение навигации и времени верификации критичного потока.
  • score_impact: yes (B7-8)

F-004

  • severity: medium
  • task_ref: 0.3 (fallback при отсутствии approver-group)
  • criteria_ref: B7-9
  • evidence:
    • fallback-логика в коде: review/internal/services/policy.go:55-121, review/internal/services/validation.go:187-207
    • в документации нет явного описания fallback-политики (кто может approve + какой threshold), кроме общих упоминаний review.
  • expected: fallback-поведение должно быть явно описано и проверяемо в документации.
  • actual: поведение реализовано, но документировано неявно.
  • impact: неоднозначность на защите/демо, риск спорной интерпретации блока 0.
  • score_impact: yes (B7-9)

F-005

  • severity: low
  • task_ref: 7 (notifications)
  • criteria_ref: informational (outside arithmetic)
  • evidence:
    • поиск по репозиторию не выявляет отдельного notification-модуля/каналов доставки (Slack/Telegram/...) в заявленном объеме.
  • expected: для C7 — минимум 2 канала + правила/шумоподавление.
  • actual: явной реализации C7 нет.
  • impact: функциональный пробел optional C7.
  • score_impact: no

F-006

  • severity: low
  • task_ref: 11 (conflict policies)
  • criteria_ref: informational (outside arithmetic)
  • evidence:
    • control-plane/internal/models/conflict_domains.go:9-17 (домен хранит только key/name/description)
    • control-plane/proto/ab/control_plane/v1/control_plane.proto:37-51 (нет явного policy поля домена)
    • runtime selection: control-plane/internal/services/experiments.go:371-407 (priority+bucket deterministic selection)
  • expected: явная модель политик конфликта и прозрачный выбор стратегии.
  • actual: реализован частичный deterministic arbitration без отдельной policy-модели.
  • impact: ограниченная выразительность конфликтных стратегий.
  • score_impact: no

Проверка консистентности перед финалом

  • Все блоки 0..11 + D помечены completed.
  • Все Fail в score.md привязаны к F-xxx.
  • Findings с score_impact=yes отражены в баллах.
  • Арифметика в score.md пересчитана и сверена.