{
  "format": "sf-skill-matrix",
  "version": 1,
  "name": "Матрица навыков PHP developer",
  "description": "Публичный пример ролевой матрицы для backend-инженеров, работающих с PHP.",
  "levels": [
    {
      "name": "Джуниор",
      "description": "Работает в существующих сервисах, следует командным соглашениям и предсказуемо вносит изменения с поддержкой."
    },
    {
      "name": "Мидл",
      "description": "Самостоятельно проектирует изменения среднего размера, разбирает инциденты и держит стабильное качество поставки."
    },
    {
      "name": "Сеньор",
      "description": "Формирует платформенные практики, ведет архитектурные решения и масштабирует надежность на несколько сервисов."
    },
    {
      "name": "TechLead",
      "description": "Ведет техническое направление команды, удерживает качество решений и помогает инженерам двигаться к предсказуемой поставке."
    },
    {
      "name": "Principal",
      "description": "Определяет инженерную стратегию домена или платформы, связывает технические решения с бизнес-целями и масштабом компании."
    }
  ],
  "groups": [
    {
      "name": "Язык PHP",
      "rows": [
        {
          "name": "Основы и экосистема",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Пишет поддерживаемый PHP 8 код",
                  "info": "Использует строгую типизацию, интерфейсы, traits и стандартные паттерны без лишнего усложнения."
                },
                {
                  "name": "Корректно обрабатывает исключения",
                  "info": "Не игнорирует ошибки, оборачивает их с контекстом, различает иерархии исключений и checked/unchecked подходы."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Применяет interfaces и composition",
                  "info": "Проектирует зависимости через интерфейсы, разделяет domain, transport и infrastructure слои."
                },
                {
                  "name": "Рефакторит безопасно",
                  "info": "Улучшает структуру кода, сохраняя поведение и обратную совместимость."
                },
                {
                  "name": "Эффективно использует Composer и экосистему",
                  "info": "Предпочитает battle-tested библиотеки, оценивает зависимости по активности и совместимости."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Задает стандарты языка и кодовой базы",
                  "info": "Определяет соглашения по PSR-стандартам, стратегии исключений, code review и общим утилитам."
                },
                {
                  "name": "Проектирует shared abstractions",
                  "info": "Создаёт переиспользуемые компоненты, которые снижают когнитивную нагрузку и не создают лишней связности."
                },
                {
                  "name": "Ведёт ревью критичных изменений",
                  "info": "Выявляет архитектурные риски, проблемы безопасности и нарушения совместимости в PR."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Определяет структуру пакетов для проектов",
                  "info": "Задаёт структуру репозитория так, чтобы команда двигалась единообразно и не принимала ad-hoc решений."
                },
                {
                  "name": "Принимает решения по спорным деталям реализации",
                  "info": "Разрешает разногласия в команде по техническим подходам, аргументируя через принципы, а не вкусовщину."
                },
                {
                  "name": "Формирует культуру code review",
                  "info": "Создаёт среду, где ревью приносит ценность: учит, а не придирается, снижает риски, а не затягивает поставку."
                },
                {
                  "name": "Контролирует рост технического долга",
                  "info": "Отслеживает накопление tech debt и включает его погашение в roadmap наравне с новыми фичами."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Задаёт языковые стандарты для нескольких команд",
                  "info": "Формирует engineering handbook с обоснованными решениями, которые работают в разных контекстах."
                },
                {
                  "name": "Определяет, какие библиотеки принимаются в платформу",
                  "info": "Оценивает зависимости по критериям: стабильность, поддержка, безопасность, lock-in риски."
                },
                {
                  "name": "Формирует roadmap инженерных практик",
                  "info": "Планирует эволюцию стандартов с учётом роста команды, масштаба системы и бизнес-направления."
                },
                {
                  "name": "Влияет на технические решения через убеждение",
                  "info": "Добивается принятия правильных решений без формальных полномочий, через аргументацию и доверие."
                },
                {
                  "name": "Публично представляет технические подходы команды",
                  "info": "Выступает на конференциях, пишет статьи, участвует в open-source — формирует внешний авторитет."
                }
              ]
            }
          ]
        },
        {
          "name": "Фоновая обработка",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Реализует простые jobs в очереди",
                  "info": "Понимает at-least-once семантику, пишет idempotent jobs и обрабатывает ошибки выполнения."
                },
                {
                  "name": "Понимает модель процессов PHP-FPM",
                  "info": "Знает жизненный цикл запроса, разницу между web-процессом и CLI-воркером."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Строит надёжные worker-процессы",
                  "info": "Проектирует обработчики с ограниченным параллелизмом, контролирует graceful shutdown и memory limits."
                },
                {
                  "name": "Реализует retry с backoff и timeout",
                  "info": "Обрабатывает временные сбои без перегрузки downstream-сервисов и зависимостей."
                },
                {
                  "name": "Контролирует утечки ресурсов в long-running процессах",
                  "info": "Выявляет и устраняет утечки памяти и незакрытые соединения при ревью и профилировании."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Проектирует background processing для высоких нагрузок",
                  "info": "Выбирает паттерн: queue workers, cron, Fibers (8.1+) или async extension исходя из требований."
                },
                {
                  "name": "Анализирует узкие места worker-процессов",
                  "info": "Использует profiling, memory dumps и трейсинг для поиска проблем производительности."
                },
                {
                  "name": "Задаёт паттерны для типовых сценариев команды",
                  "info": "Определяет, какой подход (Messenger, queues, cron, async) использовать в каждом контексте."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Задаёт team-wide правила фоновой обработки",
                  "info": "Выбирает базовые worker, queue и retry patterns так, чтобы команда не создавала нестабильных решений."
                },
                {
                  "name": "Ревьюит высоконагруженные флоу",
                  "info": "Выявляет риски в критичных путях: memory leaks, starvation, thundering herd."
                },
                {
                  "name": "Управляет рисками при поставке фоновых задач",
                  "info": "Убеждается, что CI проверяет критичные сценарии обработки и что DLQ мониторируется."
                },
                {
                  "name": "Интегрирует мониторинг воркеров в observability-стек",
                  "info": "Обеспечивает алерты на lag очередей, execution time и error rate для каждого воркера."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Определяет платформенные стандарты async processing",
                  "info": "Выбирает модели ограничения нагрузки на уровне нескольких сервисов и команд."
                },
                {
                  "name": "Проектирует стратегии масштабирования воркеров",
                  "info": "Определяет, как масштабировать параллельную обработку без деградации смежных систем."
                },
                {
                  "name": "Формирует модель управляемой деградации",
                  "info": "Задаёт принципы graceful degradation и circuit breaking на уровне домена."
                },
                {
                  "name": "Выявляет системные риски фоновой обработки",
                  "info": "Проводит архитектурный анализ на предмет скрытых race conditions и deadlock-рисков в интеграциях."
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Работа с данными",
      "rows": [
        {
          "name": "SQL и базы данных",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Пишет корректные SQL-запросы",
                  "info": "Использует JOIN, WHERE, индексы и параметризованные запросы, избегает SQL-инъекций."
                },
                {
                  "name": "Пишет и применяет миграции",
                  "info": "Создаёт up/down миграции, понимает порядок применения и обратимость изменений схемы."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Оптимизирует медленные запросы",
                  "info": "Читает EXPLAIN, добавляет индексы, устраняет N+1, переписывает subquery в JOIN там, где нужно."
                },
                {
                  "name": "Проектирует схему для новых фич",
                  "info": "Нормализует данные разумно, учитывает nullable, constraints и сценарии удаления."
                },
                {
                  "name": "Управляет транзакциями и isolation levels",
                  "info": "Выбирает правильный уровень изоляции, избегает deadlocks и long-running транзакций."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Задаёт database-стандарты команды",
                  "info": "Определяет naming conventions, обязательные индексы, правила nullable и migration workflow."
                },
                {
                  "name": "Планирует безопасные миграции в production",
                  "info": "Применяет zero-downtime паттерны: expand-contract, column backfill в несколько деплоев, lock-free alter."
                },
                {
                  "name": "Оценивает read/write patterns и выбирает стратегию",
                  "info": "Решает, когда нужен read replica, кэш или event sourcing вместо classical CRUD."
                },
                {
                  "name": "Управляет connection pool в production",
                  "info": "Настраивает параметры Doctrine/PDO connection pool, контролирует max connections и health check."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Контролирует database-риски в поставке",
                  "info": "Проверяет, что миграции протестированы, обратимы и не вызовут деградации в production."
                },
                {
                  "name": "Синхронизирует migration strategy",
                  "info": "Координирует database changes между несколькими сервисами и командами."
                },
                {
                  "name": "Задаёт policy индексирования",
                  "info": "Определяет, кто и как добавляет индексы, как проходит review схемы, кто отвечает за performance regression."
                },
                {
                  "name": "Предотвращает опасные изменения схемы",
                  "info": "Запрещает или согласует DROP, NOT NULL без default, full-table lock изменения в peak hours."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Определяет data strategy домена",
                  "info": "Выбирает между SQL, NoSQL и смешанными хранилищами в зависимости от нагрузки, структуры и SLO."
                },
                {
                  "name": "Проектирует multi-tenant и multi-region хранилище",
                  "info": "Закладывает partitioning, sharding и geo-distribution на уровне платформы."
                },
                {
                  "name": "Задаёт backup, restore и DR требования",
                  "info": "Определяет RPO/RTO, тестирует восстановление, формирует runbook для инцидентов с данными."
                },
                {
                  "name": "Формирует capacity planning по данным",
                  "info": "Прогнозирует рост объёмов, затраты на хранение и вовремя инициирует архитектурные изменения."
                },
                {
                  "name": "Управляет соответствием требованиям к данным",
                  "info": "Обеспечивает выполнение GDPR, retention policy и audit trail на уровне нескольких систем."
                }
              ]
            }
          ]
        },
        {
          "name": "Очереди и события",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Пишет consumer с корректным ack/nack",
                  "info": "Понимает at-least-once семантику, не теряет и не дублирует сообщения без причины."
                },
                {
                  "name": "Реализует простой producer",
                  "info": "Публикует события с нужной структурой, обрабатывает ошибки отправки."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Реализует idempotent consumers",
                  "info": "Обрабатывает дубликаты через deduplication key или идемпотентные операции в БД."
                },
                {
                  "name": "Проектирует dead-letter флоу",
                  "info": "Настраивает DLQ, алерты на lag и процедуру reprocess для сломанных сообщений."
                },
                {
                  "name": "Следит за consumer lag",
                  "info": "Настраивает мониторинг отставания consumer, выявляет и устраняет причины накопления."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Проектирует event-driven флоу с гарантиями доставки",
                  "info": "Выбирает паттерн outbox, saga или choreography в зависимости от требований к консистентности."
                },
                {
                  "name": "Задаёт контракты событий",
                  "info": "Определяет schema событий, versioning strategy и backward/forward compatibility."
                },
                {
                  "name": "Выбирает между sync и async интеграцией",
                  "info": "Аргументирует выбор, понимая tradeoffs: latency, coupling, failure isolation, observability."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Задаёт queue-стандарты для команды",
                  "info": "Определяет, какой брокер и паттерн использовать в каких сценариях, документирует решения."
                },
                {
                  "name": "Управляет observability очередей",
                  "info": "Обеспечивает алерты на lag, DLQ рост и partition skew; налаживает runbook для on-call."
                },
                {
                  "name": "Управляет schema evolution событий",
                  "info": "Координирует изменения в event schema между producer и consumer командами."
                },
                {
                  "name": "Синхронизирует event contracts между командами",
                  "info": "Ведёт реестр событий, согласует breaking changes и организует совместное тестирование контрактов."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Определяет messaging strategy платформы",
                  "info": "Выбирает брокеры, паттерны доставки и retention policy для всего домена."
                },
                {
                  "name": "Проектирует event sourcing на уровне домена",
                  "info": "Задаёт, где хранить event log, как строить проекции и как обеспечить replay."
                },
                {
                  "name": "Формирует гарантии доставки и консистентности",
                  "info": "Определяет уровень exactly-once или idempotency для критичных бизнес-операций."
                },
                {
                  "name": "Выявляет системные риски event-driven архитектуры",
                  "info": "Анализирует cascade failure, ordering проблемы и distributed transaction риски."
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Инфраструктура и поставка",
      "rows": [
        {
          "name": "Docker и контейнеры",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Собирает multi-stage Docker-образы",
                  "info": "Разделяет build и runtime стадии, не копирует ненужные артефакты в финальный образ."
                },
                {
                  "name": "Работает с локальной средой через Docker Compose",
                  "info": "Запускает зависимости (БД, очереди, сервисы) локально, понимает volumes и сетевой namespace."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Оптимизирует образы по размеру и слоям",
                  "info": "Правильно упорядочивает инструкции для кэширования слоёв, использует .dockerignore."
                },
                {
                  "name": "Настраивает healthcheck и graceful shutdown",
                  "info": "Реализует /healthz endpoint, обрабатывает SIGTERM и ждёт завершения активных запросов."
                },
                {
                  "name": "Диагностирует проблемы внутри контейнеров",
                  "info": "Читает логи, проверяет ресурсы, исследует файловую систему, работает с exec в prod-подобной среде."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Задаёт Dockerfile-стандарты команды",
                  "info": "Определяет базовые образы, linting правила и review checklist для контейнерных артефактов."
                },
                {
                  "name": "Проектирует dev/prod паритет окружений",
                  "info": "Обеспечивает, чтобы локальный Compose и production среда отличались минимально."
                },
                {
                  "name": "Оценивает image security",
                  "info": "Запускает trivy/grype, отслеживает CVE в базовых образах, задаёт non-root user."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Задаёт базовые образы для команды",
                  "info": "Выбирает и поддерживает golden images, управляет их обновлением и уведомлением команды."
                },
                {
                  "name": "Контролирует container security policy",
                  "info": "Определяет политику запуска: non-root, read-only filesystem, resource limits, seccomp."
                },
                {
                  "name": "Управляет dependency update процессом",
                  "info": "Обеспечивает регулярное обновление базовых образов и Composer-зависимостей с проверкой на уязвимости."
                },
                {
                  "name": "Интегрирует container scanning в CI",
                  "info": "Добавляет автоматический image scan в pipeline, настраивает severity threshold и уведомления."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Определяет container strategy платформы",
                  "info": "Выбирает runtime (Docker, containerd), orchestration и image registry стратегию."
                },
                {
                  "name": "Задаёт политику базовых образов для нескольких команд",
                  "info": "Стандартизирует approved base images, enforcement механизм и process их обновления."
                },
                {
                  "name": "Проектирует observability в контейнерной среде",
                  "info": "Стандартизирует log format, metrics exposition, tracing injection на уровне платформы."
                },
                {
                  "name": "Синхронизирует container standards между командами",
                  "info": "Формирует RFC и ADR для платформенных решений, получает buy-in от tech leads команд."
                }
              ]
            }
          ]
        },
        {
          "name": "Сборка и CI/CD",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Понимает и читает pipeline",
                  "info": "Разбирается в шагах CI: lint, test, build, deploy — знает, что каждый делает и где искать причину сбоя."
                },
                {
                  "name": "Фиксит flaky тесты в CI",
                  "info": "Умеет найти причину нестабильного теста: race condition, зависимость от порядка, внешний сервис."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Настраивает pipeline для нового сервиса",
                  "info": "Конфигурирует lint, test, build и deploy шаги с нужными environment variables и secrets."
                },
                {
                  "name": "Ускоряет медленные CI-флоу",
                  "info": "Параллелизует шаги, кэширует зависимости и Composer packages, сокращает холодный старт."
                },
                {
                  "name": "Реализует canary или blue/green деплой",
                  "info": "Разворачивает изменения постепенно, умеет откатить без downtime."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Проектирует deployment strategy для сервисов",
                  "info": "Выбирает rolling, canary или blue/green исходя из SLO, объёма трафика и критичности."
                },
                {
                  "name": "Задаёт pipeline стандарты для команды",
                  "info": "Определяет обязательные шаги: lint, security scan, test coverage, smoke test после деплоя."
                },
                {
                  "name": "Управляет rollback-процедурами",
                  "info": "Документирует и тестирует процедуру отката, убеждается, что команда может откатить под давлением."
                },
                {
                  "name": "Внедряет автоматические quality gates",
                  "info": "Блокирует деплой при деградации coverage, появлении CVE выше порога или падении smoke тестов."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Задаёт deployment governance команды",
                  "info": "Определяет, что нужно для production-ready: checklist, approvals, observability requirements."
                },
                {
                  "name": "Устанавливает release gates и approval флоу",
                  "info": "Балансирует скорость поставки и контроль риска: кто аппрувит, при каких условиях автоматически."
                },
                {
                  "name": "Контролирует production readiness новых сервисов",
                  "info": "Проверяет, что сервис имеет healthcheck, метрики, алерты, runbook и документацию до деплоя."
                },
                {
                  "name": "Синхронизирует delivery process с другими командами",
                  "info": "Координирует release windows, feature flags и зависимости при совместных поставках."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Определяет delivery strategy платформы",
                  "info": "Выбирает модель деплоя и инструменты CI/CD на уровне нескольких команд."
                },
                {
                  "name": "Проектирует progressive delivery",
                  "info": "Задаёт принципы feature flags, traffic splitting и automated rollback на уровне платформы."
                },
                {
                  "name": "Задаёт SLO для pipeline reliability",
                  "info": "Определяет допустимое время сборки, процент flaky тестов и MTTR для CI-инфраструктуры."
                },
                {
                  "name": "Формирует change management policy",
                  "info": "Задаёт правила для hot fix, emergency deploy и change freeze — с балансом скорости и безопасности."
                },
                {
                  "name": "Выявляет bottlenecks в delivery процессе",
                  "info": "Измеряет DORA-метрики, находит ограничения и инициирует улучшения на уровне платформы."
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Качество и надёжность",
      "rows": [
        {
          "name": "Тестирование",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Пишет unit-тесты для business logic",
                  "info": "Покрывает happy path и основные error branches с помощью PHPUnit или Pest."
                },
                {
                  "name": "Использует data providers для параметризации",
                  "info": "Структурирует тест-кейсы через data providers, избегает дублирования и делает тесты читаемыми."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Пишет integration-тесты с реальными зависимостями",
                  "info": "Использует testcontainers или in-memory БД — проверяет реальное поведение, а не только моки."
                },
                {
                  "name": "Корректно мокирует внешние сервисы",
                  "info": "Выбирает между interface mock и HTTP stub в зависимости от уровня теста."
                },
                {
                  "name": "Пишет функциональные тесты для API",
                  "info": "Проверяет HTTP-контракты, аутентификацию и граничные случаи через WebTestCase или аналоги."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Определяет test strategy для команды",
                  "info": "Задаёт баланс между unit, integration и e2e тестами с учётом скорости и уверенности."
                },
                {
                  "name": "Внедряет contract testing",
                  "info": "Использует schema-based или Pact-подход для проверки совместимости между сервисами."
                },
                {
                  "name": "Оценивает coverage осмысленно",
                  "info": "Отличает полезное coverage от бессмысленного, фокусируется на критичных сценариях."
                },
                {
                  "name": "Проектирует testable architecture",
                  "info": "Закладывает dependency injection и явные границы в дизайн, чтобы тестирование не требовало героизма."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Задаёт обязательный quality bar поставки",
                  "info": "Определяет, без чего PR не принимается: минимум coverage, обязательные сценарии, performance tests."
                },
                {
                  "name": "Контролирует regression coverage",
                  "info": "Следит за тем, чтобы после каждого инцидента добавлялся тест, предотвращающий повтор."
                },
                {
                  "name": "Исключает тесты без ценности",
                  "info": "Ревьюит и удаляет тесты, которые только замедляют CI, но не повышают уверенность."
                },
                {
                  "name": "Управляет test debt",
                  "info": "Ведёт список известных пробелов в покрытии и включает их устранение в roadmap."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Формирует test confidence model для нескольких сервисов",
                  "info": "Задаёт, как совокупность тестов разных уровней обеспечивает уверенность в поставке."
                },
                {
                  "name": "Задаёт стандарты reliability testing",
                  "info": "Определяет требования к load testing, chaos engineering и failure injection для критичных систем."
                },
                {
                  "name": "Проектирует chaos и fault injection",
                  "info": "Внедряет systematic failure experiments для выявления слабых мест до production инцидентов."
                },
                {
                  "name": "Формирует приёмочные критерии для критичных систем",
                  "info": "Задаёт технические условия запуска новых сервисов с высоким SLO: тесты, нагрузка, DR."
                }
              ]
            }
          ]
        },
        {
          "name": "Метрики и наблюдаемость",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Добавляет структурированные логи",
                  "info": "Логирует достаточно, чтобы понять runtime behavior, без чувствительных данных и лишнего шума."
                },
                {
                  "name": "Использует метрики и dashboards команды",
                  "info": "Читает существующие grafana-дашборды, понимает базовые RED-метрики своего сервиса."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Диагностирует инциденты по traces и metrics",
                  "info": "Читает distributed traces, correlates logs и изолирует bottleneck или regression."
                },
                {
                  "name": "Строит alerting для новых сервисов",
                  "info": "Создаёт алерты на error rate, latency p95 и saturation с правильными thresholds и runbook."
                },
                {
                  "name": "Интерпретирует latency распределения",
                  "info": "Отличает p50 от p99, понимает tail latency и влияние PHP-FPM worker pool на графики."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Определяет SLI и SLO для сервисов",
                  "info": "Выбирает значимые индикаторы качества, согласует цели с продуктом и устанавливает error budget."
                },
                {
                  "name": "Задаёт naming conventions для метрик",
                  "info": "Определяет стандарты именования, labeling и cardinality ограничения для Prometheus."
                },
                {
                  "name": "Проектирует distributed tracing",
                  "info": "Инструментирует сервисы с правильным span context, baggage и sampling strategy."
                },
                {
                  "name": "Ведёт постмортем инцидентов",
                  "info": "Пишет blameless постмортем, выявляет системные причины и формирует action items."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Задаёт observability standards команды",
                  "info": "Определяет обязательный минимум: что логировать, какие метрики инструментировать, как трейсить."
                },
                {
                  "name": "Контролирует alert fatigue",
                  "info": "Регулярно ревьюит алерты: убирает лишние, улучшает thresholds, добавляет runbook."
                },
                {
                  "name": "Обеспечивает on-call readiness команды",
                  "info": "Гарантирует, что у каждого сервиса есть runbook, алерты с описанием и escalation path."
                },
                {
                  "name": "Формирует культуру постмортема",
                  "info": "Нормализует blameless review, следит за выполнением action items и делится знаниями с командой."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Определяет reliability strategy платформы",
                  "info": "Выстраивает единый подход к SLO, error budget и incident management для всего домена."
                },
                {
                  "name": "Задаёт cross-service SLO и error budgets",
                  "info": "Формирует dependency SLA между командами, связывает бюджеты с приоритетами поставки."
                },
                {
                  "name": "Проектирует centralized telemetry",
                  "info": "Определяет платформенные инструменты сбора, хранения и визуализации observability данных."
                },
                {
                  "name": "Выстраивает feedback loop из production",
                  "info": "Создаёт систему, при которой production-сигналы регулярно влияют на приоритеты команд."
                },
                {
                  "name": "Формирует стандарты incident management",
                  "info": "Задаёт severity levels, escalation matrix, communication protocol и learning system для инцидентов."
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Командная работа",
      "rows": [
        {
          "name": "Самостоятельность",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Декомпозирует задачу самостоятельно",
                  "info": "Разбивает задачу на понятные шаги, уточняет неясное до начала работы."
                },
                {
                  "name": "Своевременно эскалирует блокеры",
                  "info": "Не застревает молча дольше дня — сигнализирует о блокере и предлагает варианты."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Ведёт задачу от проектирования до поставки",
                  "info": "Сам определяет подход, согласует его и доводит до production без потери промежуточных шагов."
                },
                {
                  "name": "Самостоятельно находит и согласует решение",
                  "info": "Предлагает конкретный вариант с tradeoffs, а не задаёт открытый вопрос «как делать»."
                },
                {
                  "name": "Управляет своим бэклогом",
                  "info": "Держит задачи в актуальном состоянии, сам расставляет приоритеты в рамках sprint-цели."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Инициирует улучшения без запроса",
                  "info": "Замечает проблемы в системе и предлагает решение, не дожидаясь, пока кто-то поставит задачу."
                },
                {
                  "name": "Управляет параллельными треками",
                  "info": "Ведёт несколько задач одновременно, не теряет контекст и не создаёт bottleneck для команды."
                },
                {
                  "name": "Принимает решения в условиях неопределённости",
                  "info": "Двигается вперёд с неполной информацией, фиксирует допущения и готов пересмотреть решение."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Ведёт технический трек команды самостоятельно",
                  "info": "Управляет техническим backlog, задаёт направление и держит скорость без ежедневного менеджмента."
                },
                {
                  "name": "Определяет приоритеты технического бэклога",
                  "info": "Балансирует новые фичи, tech debt и reliability work с учётом бизнес-контекста."
                },
                {
                  "name": "Управляет рисками без постоянной эскалации",
                  "info": "Самостоятельно оценивает и митигирует технические риски, эскалирует только существенные."
                },
                {
                  "name": "Разблокирует других без потери своего прогресса",
                  "info": "Помогает команде двигаться, не беря на себя чужую работу целиком."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Формирует повестку самостоятельно",
                  "info": "Сам определяет, какие проблемы важны, и инициирует работу без внешнего запроса."
                },
                {
                  "name": "Инициирует кросс-командные улучшения",
                  "info": "Выявляет системные проблемы и организует работу нескольких команд для их решения."
                },
                {
                  "name": "Управляет стратегическими техническими рисками",
                  "info": "Удерживает в фокусе долгосрочные риски: vendor lock-in, architectural debt, skill gap."
                },
                {
                  "name": "Строит консенсус без формальных полномочий",
                  "info": "Добивается принятия решений через аргументацию, доверие и вовлечение ключевых stakeholders."
                },
                {
                  "name": "Работает с длинными горизонтами планирования",
                  "info": "Видит и управляет технической стратегией на 12–24 месяца вперёд."
                }
              ]
            }
          ]
        },
        {
          "name": "Оформление артефактов",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Оформляет PR с описанием изменений",
                  "info": "Описывает, что изменено, зачем и как проверить — ревьюер не должен реконструировать контекст."
                },
                {
                  "name": "Пишет понятные commit messages",
                  "info": "Следует принятому формату, описывает суть изменения, а не процесс работы."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Описывает контекст и tradeoffs в PR",
                  "info": "Объясняет, почему выбрано именно это решение, какие альтернативы рассматривались."
                },
                {
                  "name": "Документирует нетривиальные решения в коде",
                  "info": "Добавляет комментарий не «что», а «почему» — там, где логика неочевидна."
                },
                {
                  "name": "Поддерживает актуальность задач в трекере",
                  "info": "Обновляет статус, добавляет результаты обсуждений, не оставляет задачи в неопределённом состоянии."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Пишет понятные design-документы",
                  "info": "Описывает проблему, предложение, альтернативы и риски так, чтобы получить качественный feedback."
                },
                {
                  "name": "Фиксирует решения в ADR",
                  "info": "Записывает значимые архитектурные решения с контекстом, чтобы будущие инженеры понимали «почему»."
                },
                {
                  "name": "Структурирует артефакты для ревью команды",
                  "info": "Выбирает правильный формат: RFC, design doc, spike summary — в зависимости от сложности и аудитории."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Задаёт стандарты оформления PR и задач",
                  "info": "Создаёт шаблоны и чеклисты, объясняет команде ценность хороших артефактов."
                },
                {
                  "name": "Контролирует quality bar артефактов команды",
                  "info": "Возвращает на доработку PR и задачи без контекста, формирует ожидания на примерах."
                },
                {
                  "name": "Готовит executive summary для нетехнической аудитории",
                  "info": "Переводит технические решения в бизнес-язык: риски, сроки, влияние."
                },
                {
                  "name": "Формирует культуру письменной коммуникации",
                  "info": "Поощряет async-first подход, документирование решений и прозрачность процессов в команде."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Задаёт стандарты RFC и ADR процесса",
                  "info": "Определяет, когда нужен RFC, как он проходит ревью и как решения фиксируются и доступны."
                },
                {
                  "name": "Пишет стратегические документы для нескольких аудиторий",
                  "info": "Адаптирует технический документ для инженеров, менеджмента и внешних партнёров."
                },
                {
                  "name": "Обеспечивает прозрачность технических решений",
                  "info": "Создаёт систему, в которой важные решения доступны, понятны и обоснованы для всей организации."
                },
                {
                  "name": "Формирует engineering culture через документы",
                  "info": "Пишет principles, manifesto и best practices, которые становятся ориентиром для команд."
                }
              ]
            }
          ]
        },
        {
          "name": "Техническая документация",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Дополняет README для своих изменений",
                  "info": "Обновляет инструкции по запуску, env-переменным и зависимостям при каждом изменении."
                },
                {
                  "name": "Документирует конфигурацию и параметры",
                  "info": "Описывает назначение env-переменных, допустимые значения и поведение по умолчанию."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Пишет runbook для нового сервиса",
                  "info": "Описывает как запустить, остановить, откатить и продиагностировать сервис в production."
                },
                {
                  "name": "Актуализирует API-документацию",
                  "info": "Поддерживает OpenAPI spec в синхронизации с кодом при каждом изменении контракта."
                },
                {
                  "name": "Документирует operational процедуры",
                  "info": "Описывает типовые операции: миграции, плановые рестарты, ротацию секретов."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Ведёт архитектурную документацию актуальной",
                  "info": "Синхронизирует диаграммы и описания с реальным состоянием системы, не допускает устаревания."
                },
                {
                  "name": "Пишет onboarding guide для сервиса",
                  "info": "Создаёт документ, позволяющий новому инженеру быстро войти в контекст и стать эффективным."
                },
                {
                  "name": "Формирует базу знаний команды",
                  "info": "Организует документацию так, чтобы нужное было легко найти и находилось в актуальном состоянии."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Задаёт documentation standards команды",
                  "info": "Определяет структуру, обязательные разделы и процесс обновления для разных типов документов."
                },
                {
                  "name": "Контролирует полноту operational docs",
                  "info": "Проверяет, что у каждого production сервиса есть runbook, alert descriptions и escalation path."
                },
                {
                  "name": "Формирует knowledge management подход",
                  "info": "Выбирает инструменты и процессы для накопления и передачи знаний внутри команды."
                },
                {
                  "name": "Готовит документацию для аудита и compliance",
                  "info": "Обеспечивает соответствие документации внешним требованиям: security review, vendor audit."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Определяет стратегию технических знаний домена",
                  "info": "Задаёт, как знания накапливаются, структурируются и передаются между командами."
                },
                {
                  "name": "Управляет документированием межсистемных решений",
                  "info": "Обеспечивает, чтобы cross-team архитектурные решения были зафиксированы и доступны."
                },
                {
                  "name": "Задаёт требования к ops documentation",
                  "info": "Формирует стандарты runbook, постмортема и incident report на уровне нескольких команд."
                },
                {
                  "name": "Публикует инженерные решения вовне",
                  "info": "Делится опытом команды через блог, конференции и open-source — создаёт внешний технический авторитет."
                }
              ]
            }
          ]
        },
        {
          "name": "Коммуникация",
          "cells": [
            {
              "level": 1,
              "level_name": "Джуниор",
              "tasks": [
                {
                  "name": "Ясно описывает статус задачи",
                  "info": "Сообщает, что сделано, что осталось и есть ли блокеры — без необходимости уточнять."
                },
                {
                  "name": "Задаёт уточняющие вопросы вместо предположений",
                  "info": "Уточняет требования до начала работы, а не переделывает после завершения."
                }
              ]
            },
            {
              "level": 2,
              "level_name": "Мидл",
              "tasks": [
                {
                  "name": "Объясняет технические решения нетехническим коллегам",
                  "info": "Адаптирует уровень детализации к аудитории, не уходит в детали реализации там, где нужен результат."
                },
                {
                  "name": "Проводит конструктивный code review",
                  "info": "Даёт конкретный, действенный feedback — указывает на проблему и предлагает путь решения."
                },
                {
                  "name": "Даёт и принимает feedback по работе",
                  "info": "Говорит о проблемах прямо и без агрессии, принимает критику без защитной реакции."
                }
              ]
            },
            {
              "level": 3,
              "level_name": "Сеньор",
              "tasks": [
                {
                  "name": "Ведёт технические дискуссии к решению",
                  "info": "Структурирует обсуждение, удерживает фокус и помогает группе прийти к конкретному выводу."
                },
                {
                  "name": "Выстраивает доверие с продуктом и смежными командами",
                  "info": "Регулярно синхронизируется, держит партнёров в курсе, не создаёт неожиданностей."
                },
                {
                  "name": "Управляет разногласиями без эскалации",
                  "info": "Находит компромисс или аргументированно убеждает, не втягивая менеджмент без необходимости."
                },
                {
                  "name": "Представляет позицию команды",
                  "info": "Выступает от имени команды на кросс-командных встречах, транслирует приоритеты и ограничения."
                }
              ]
            },
            {
              "level": 4,
              "level_name": "TechLead",
              "tasks": [
                {
                  "name": "Синхронизирует техническую повестку с менеджментом",
                  "info": "Регулярно переводит технические приоритеты и риски в язык, понятный нетехническим руководителям."
                },
                {
                  "name": "Управляет ожиданиями стейкхолдеров",
                  "info": "Заблаговременно сигнализирует о рисках, изменении сроков и влиянии технических решений."
                },
                {
                  "name": "Медиирует конфликты в команде",
                  "info": "Помогает членам команды разрешать разногласия, создаёт безопасное пространство для обсуждения."
                },
                {
                  "name": "Формирует психологическую безопасность",
                  "info": "Создаёт среду, где люди не боятся высказывать идеи, признавать ошибки и задавать вопросы."
                }
              ]
            },
            {
              "level": 5,
              "level_name": "Principal",
              "tasks": [
                {
                  "name": "Выступает техническим голосом домена",
                  "info": "Представляет технические позиции на уровне директоров, партнёров и внешних аудиторий."
                },
                {
                  "name": "Ведёт кросс-командный диалог",
                  "info": "Создаёт форумы для обмена знаниями и решения общих проблем между командами."
                },
                {
                  "name": "Строит альянсы для системных изменений",
                  "info": "Убеждает ключевых stakeholders в необходимости изменений, формирует коалицию поддержки."
                },
                {
                  "name": "Управляет коммуникацией в условиях неопределённости",
                  "info": "Даёт ясные ориентиры команде и партнёрам, когда стратегия ещё формируется."
                },
                {
                  "name": "Публично представляет инженерные решения",
                  "info": "Выступает на конференциях, ведёт технический блог — формирует reputation компании в инженерном сообществе."
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}
