architect/research/pm-design/PM-MVP-SPEC.md

type: research
title: "PM Platform MVP — Детальная спецификация"
status: draft
version: 0.1.0
date: 2026-02-17
owner: architect


PM Platform MVP — Детальная спецификация

Назначение

Детальная спецификация MVP (Minimum Viable Product) для PM Platform на основе:
- [[PM-COMPONENTS-ANALYSIS]] — анализ компонентов PM
- [[COMPONENT_SCALE]] — правила размещения
- [[PLATFORM_ARCHITECTURE]] — архитектура платформы


MVP Scope

Что входит в MVP

Цель: Управлять проектом lideravto вручную через PM Platform

Возможности:
1. ✅ Создать проект из шаблона (Domain → Nature → Class → Solution)
2. ✅ Собрать документы проекта (template inheritance + includes)
3. ✅ Управлять фазами проекта (15 phases из PROJECTOR.md)
4. ✅ Проверять Stage Gates (Entry → Work → Exit)
5. ✅ Отслеживать статус проекта (фаза, прогресс, блокеры)
6. ✅ Хранить историю решений и изменений

Не входит в MVP:
- ❌ Автоматическое создание задач
- ❌ Интеграция с внешними системами (Jira, GitLab)
- ❌ Роадмапы и портфолио проектов
- ❌ Ресурсное планирование и команды
- ❌ Риски и качество
- ❌ Отчётность и дашборды
- ❌ Workflow automation


Архитектура MVP

Общая структура

system/services/pm/               PM Platform (подсистема ~32K строк)
├── CLAUDE.md                     AI-контекст платформы
├── index.yaml                    Метаданные и зависимости
├── README.md                     Человеко-читаемая документация

├── core/                         PM Core (15K строк)
   ├── lifecycle.py              15 phases + transitions
   ├── gates.py                  Stage Gate validation
   ├── engine.py                 Process execution
   ├── status.py                 Status tracking
   └── reports.py                Basic reporting

├── dms/                          Document Management (12K строк)
   ├── templates.py              Template registry
   ├── assembly.py               Document assembly (extends/includes)
   ├── validation.py             Structure validation
   └── storage.py                Document storage

├── tasks/                        Basic Tasks (5K строк)
   ├── manager.py                Task CRUD
   ├── deps.py                   Dependencies
   └── schedule.py               Simple scheduling

├── api/                          Python API (2K строк)
   └── pm_api.py                 Public interface

├── cli/                          CLI Interface (3K строк)
   └── pm_cli.py                 Commands: create, status, gate, etc.

└── tests/                        Tests (5K строк)
    ├── test_lifecycle.py
    ├── test_gates.py
    ├── test_dms.py
    └── test_integration.py

Итого: ~42K строк (с тестами)

Зависимости

# system/services/pm/index.yaml
dependencies:
  - component: library/core
    version: ">=1.0.0"
  - component: library/services/yaml_parser
    version: ">=1.0.0"
  - component: library/storages/filesystem
    version: ">=1.0.0"

Компонент 1: PM Core (15K строк)

Назначение

Ядро PM Platform — управление жизненным циклом проекта.

Структура

core/
├── __init__.py              (100 строк)
├── lifecycle.py             (3000 строк)
├── gates.py                 (2000 строк)
├── engine.py                (4000 строк)
├── status.py                (2000 строк)
├── reports.py               (4000 строк)
└── models.py                (500 строк)

lifecycle.py — Управление фазами

Ответственность:
- Определение 15 фаз (из PROJECTOR.md, LOCKED)
- Переходы между фазами
- Проверка допустимости переходов
- История переходов

API:

from pm.core.lifecycle import ProjectLifecycle

# Создать lifecycle для проекта
lifecycle = ProjectLifecycle(project_id="lideravto")

# Текущая фаза
current_phase = lifecycle.get_current_phase()
# → Phase(id=1, name="Understanding", status="in_progress")

# Доступные переходы
transitions = lifecycle.get_available_transitions()
# → [Transition(to_phase=2, requires_gate=True)]

# Переход на следующую фазу
result = lifecycle.transition_to(phase_id=2)
# → TransitionResult(success=True, gate_passed=True)

# История фаз
history = lifecycle.get_history()
# → [PhaseHistory(phase=0, entered="2026-01-10", exited="2026-01-15")]

Модель данных:

@dataclass
class Phase:
    id: int              # 0-14
    name: str            # "0-Trigger", "1-Understanding", ...
    description: str
    deliverables: List[str]

@dataclass
class PhaseTransition:
    from_phase: int
    to_phase: int
    requires_gate: bool
    timestamp: datetime
    approved_by: str

15 фаз (LOCKED из PROJECTOR.md):

PHASES = [
    Phase(id=0, name="Trigger", deliverables=["BRIEF.md draft"]),
    Phase(id=1, name="Understanding", deliverables=["BRIEF.md", "STATUS.md"]),
    Phase(id=2, name="Research", deliverables=["Research docs"]),
    Phase(id=3, name="Analysis", deliverables=["Analysis docs"]),
    Phase(id=4, name="Requirements", deliverables=["REQUIREMENTS.md"]),
    Phase(id=5, name="Design", deliverables=["DESIGN.md"]),
    Phase(id=6, name="Approval", deliverables=["DECISIONS.md"]),
    Phase(id=7, name="Planning", deliverables=["PLAN.md"]),
    Phase(id=8, name="Preparation", deliverables=["Infrastructure ready"]),
    Phase(id=9, name="Implementation", deliverables=["Code", "Tests"]),
    Phase(id=10, name="Testing", deliverables=["TEST_RESULTS.md"]),
    Phase(id=11, name="Deployment", deliverables=["DEPLOY.md"]),
    Phase(id=12, name="Acceptance", deliverables=["UAT_RESULTS.md"]),
    Phase(id=13, name="Operations", deliverables=["RUNBOOK.md"]),
    Phase(id=14, name="Closure", deliverables=["CLOSURE.md"]),
]

Хранение:

# projects/org/lideravto/.pm/lifecycle.yaml
project_id: lideravto
current_phase: 4
history:
  - phase: 0
    entered: 2026-01-10T10:00:00
    exited: 2026-01-10T11:30:00
  - phase: 1
    entered: 2026-01-10T11:30:00
    exited: 2026-01-15T17:00:00
  - phase: 2
    entered: 2026-01-15T17:00:00
    exited: null  # текущая

gates.py — Stage Gate Validation

Ответственность:
- Проверка Entry/Exit критериев для каждой фазы
- Валидация документов (существование, заполненность)
- Отчёт о готовности к переходу

API:

from pm.core.gates import StageGate

gate = StageGate(project_path="/opt/claude-workspace/projects/org/lideravto")

# Проверить Exit Gate текущей фазы
result = gate.check_exit(phase_id=1)
# → GateResult(
#      passed=True,
#      checks=[
#        Check(name="BRIEF.md exists", passed=True),
#        Check(name="STATUS.md exists", passed=True),
#        Check(name="TODO.md filled", passed=True),
#      ]
#    )

# Проверить Entry Gate следующей фазы
result = gate.check_entry(phase_id=2)
# → GateResult(passed=True, requirements_met=True)

Модель:

@dataclass
class GateCheck:
    name: str
    type: str  # "file_exists", "field_filled", "custom"
    passed: bool
    message: str = ""

@dataclass
class GateResult:
    phase: int
    gate_type: str  # "entry" or "exit"
    passed: bool
    checks: List[GateCheck]
    timestamp: datetime

Правила Gate (по фазам):

GATES = {
    1: {  # Understanding
        "exit": [
            FileExistsCheck("design/BRIEF.md"),
            FileExistsCheck("management/STATUS.md"),
            FileExistsCheck("management/TODO.md"),
            FieldFilledCheck("STATUS.md", "## Что готово"),
        ]
    },
    4: {  # Requirements
        "exit": [
            FileExistsCheck("design/REQUIREMENTS.md"),
            FieldFilledCheck("REQUIREMENTS.md", "## Functional Requirements"),
        ]
    },
    # ... остальные фазы
}

engine.py — Process Engine

Ответственность:
- Выполнение процессов (из 01-CORE-MODEL.md: 9 процессов)
- Определение активного процесса по фазе
- Маппинг процесса → AI режим

API:

from pm.core.engine import ProcessEngine

engine = ProcessEngine()

# Определить активный процесс для фазы
process = engine.get_active_process(phase_id=1)
# → Process(name="Understanding", ai_mode="SafeDialog")

# Получить рекомендуемый AI режим
mode = engine.get_ai_mode(phase_id=9)
# → "Coder"

9 процессов (из 01-CORE-MODEL.md):

PROCESSES = [
    Process(name="Understanding", phases=[0, 1], ai_mode="SafeDialog"),
    Process(name="Research", phases=[2], ai_mode="Explore"),
    Process(name="Analysis", phases=[3], ai_mode="Architect"),
    Process(name="Design", phases=[4, 5, 6], ai_mode="Architect"),
    Process(name="Planning", phases=[7], ai_mode="PM"),
    Process(name="Build", phases=[8, 9], ai_mode="Coder"),
    Process(name="Test", phases=[10], ai_mode="Tester"),
    Process(name="Deploy", phases=[11], ai_mode="Operator"),
    Process(name="Operate", phases=[12, 13, 14], ai_mode="SafeDialog"),
]

status.py — Status Tracking

Ответственность:
- Текущий статус проекта (фаза, прогресс, блокеры)
- Обновление STATUS.md
- Запись изменений

API:

from pm.core.status import StatusTracker

tracker = StatusTracker(project_path="projects/org/lideravto")

# Получить статус
status = tracker.get_status()
# → ProjectStatus(
#      phase=4,
#      progress=65,
#      blockers=["Waiting for client approval"],
#      updated="2026-02-17T16:00:00"
#    )

# Обновить статус
tracker.update_status(
    phase=5,
    progress=10,
    blockers=[],
    completed=["Requirements approved"]
)
# → Обновляет management/STATUS.md

Формат STATUS.md:

# STATUS
**Обновлено:** 2026-02-17 16:00:00

## Текущее состояние
| Параметр | Значение |
|----------|----------|
| Фаза | 5-Design |
| Статус | in_progress |
| Прогресс | 10% |

## Что готово
- [x] Requirements approved
- [x] Stakeholder sign-off

## Что в работе
- [ ] Design data model
- [ ] Design API

## Блокеры
(Нет)

## Следующий шаг
Завершить design/DATA_MODEL.md

reports.py — Basic Reporting

Ответственность:
- Генерация отчётов по проекту
- Статистика по фазам
- История изменений

API:

from pm.core.reports import Reporter

reporter = Reporter(project_path="projects/org/lideravto")

# Отчёт по фазам
report = reporter.phase_summary()
# → {
#      "total_phases": 15,
#      "completed": 4,
#      "current": 5,
#      "remaining": 10,
#      "time_spent": {"phase_1": "5 days", "phase_2": "3 days"}
#    }

# История изменений
changelog = reporter.get_changelog()
# → Читает management/CHANGELOG.md

# Экспорт в Markdown
report_md = reporter.export_markdown()
# → Создаёт PROJECT_REPORT.md

Компонент 2: DMS (12K строк)

Назначение

Document Management System — управление иерархией документов проекта.

Структура

dms/
├── __init__.py              (100 строк)
├── templates.py             (3000 строк)
├── assembly.py              (4000 строк)
├── validation.py            (2000 строк)
├── storage.py               (3000 строк)
└── models.py                (500 строк)

templates.py — Template Registry

Ответственность:
- Реестр шаблонов (4 уровня: Universal → Domain → Class → Solution)
- Загрузка шаблонов
- Цепочка наследования

API:

from pm.dms.templates import TemplateRegistry

registry = TemplateRegistry(templates_path="architect/templates")

# Получить шаблон для проекта
template = registry.get_template(
    domain="IT",
    nature="Greenfield",
    class_type="A",
    solution="CS-Cart"
)
# → Template(
#      id="CSCART_PROJECT",
#      extends_chain=["PROJECT_BASE", "PROJECT_IT", "CLASS_A", "CSCART_PROJECT"]
#    )

# Получить структуру документов для проекта
structure = registry.get_structure(template_id="CSCART_PROJECT")
# → DocumentStructure(
#      folders=["design/", "management/", "solution/", "testing/", "operations/"],
#      documents=["CLAUDE.md", "index.yaml", "BRIEF.md", ...]
#    )

Модель:

@dataclass
class Template:
    id: str              # "CSCART_PROJECT"
    level: int           # 0-3
    extends: str         # Parent template ID
    extends_chain: List[str]  # Full chain
    structure_yaml: str  # Path to structure.yaml

@dataclass
class DocumentTemplate:
    name: str            # "CLAUDE.md"
    path: str            # "CLAUDE.md" (relative to project root)
    source: str          # Template file path
    extends: List[str]   # Parent templates
    includes: List[str]  # Included sections

Хранение шаблонов:

architect/templates/
├── 0-universal/
│   ├── PROJECT_BASE.md
│   ├── structure.yaml
│   └── phases.yaml
├── 1-domain/
│   ├── PROJECT_IT.md
│   └── PROJECT_BUSINESS.md
├── 2-class/
│   ├── CLASS_A.md
│   ├── CLASS_B.md
│   └── CLASS_C.md
└── 3-solution/
    ├── CSCART_PROJECT.md
    ├── DRUPAL_PROJECT.md
    └── REACT_PROJECT.md

assembly.py — Document Assembly

Ответственность:
- Сборка документов из шаблонов
- Применение extends (наследование)
- Применение includes (включения)
- Подстановка переменных

API:

from pm.dms.assembly import DocumentAssembler

assembler = DocumentAssembler()

# Собрать документ из шаблона
content = assembler.assemble_document(
    template_id="CSCART_PROJECT",
    document_name="CLAUDE.md",
    variables={
        "project_name": "lideravto",
        "cscart_version": "4.19.1"
    }
)
# → Собранный CLAUDE.md со всеми секциями из цепочки наследования

# Применить extends
content = assembler.apply_extends(
    template="CSCART_PROJECT",
    document="DATA_MODEL.md"
)
# → Содержимое с секциями из BASE → IT → CLASS_A → CSCART

# Применить includes
content = assembler.apply_includes(content)
# → Содержимое с подставленными include-блоками

Синтаксис в шаблонах:

<!-- extends: architect/templates/1-domain/PROJECT_IT.md -->
<!-- include: architect/templates/0-universal/sections/WHAT_IS.md -->

# {project_name}

**Платформа:** CS-Cart {cscart_version}

<!-- inherited from PROJECT_BASE -->
## Что это
...

<!-- inherited from PROJECT_IT -->
## Технологии
...

<!-- added by CSCART_PROJECT -->
## Модули CS-Cart
...

validation.py — Structure Validation

Ответственность:
- Проверка структуры проекта
- Проверка обязательных документов
- Проверка заполненности секций

API:

from pm.dms.validation import StructureValidator

validator = StructureValidator()

# Проверить структуру проекта
result = validator.validate_project(
    project_path="projects/org/lideravto",
    template_id="CSCART_PROJECT"
)
# → ValidationResult(
#      valid=True,
#      missing_folders=[],
#      missing_documents=[],
#      incomplete_sections=["design/API.md → ## Endpoints"]
#    )

# Проверить документ
result = validator.validate_document(
    document_path="projects/org/lideravto/CLAUDE.md",
    template_id="CSCART_PROJECT"
)
# → DocumentValidation(
#      valid=True,
#      required_sections_present=True,
#      variables_filled=True
#    )

storage.py — Document Storage

Ответственность:
- Чтение/запись документов проекта
- Версионирование (через git)
- Индекс изменений

API:

from pm.dms.storage import DocumentStorage

storage = DocumentStorage(project_path="projects/org/lideravto")

# Прочитать документ
content = storage.read_document("design/BRIEF.md")

# Записать документ
storage.write_document(
    path="design/REQUIREMENTS.md",
    content="# Requirements\n...",
    commit_message="Add requirements document"
)

# История изменений документа
history = storage.get_document_history("design/BRIEF.md")
# → [Commit(hash="abc123", date="2026-01-10", message="Initial")]

Компонент 3: Tasks (5K строк)

Назначение

Базовое управление задачами (упрощённая версия).

Структура

tasks/
├── __init__.py              (100 строк)
├── manager.py               (2000 строк)
├── deps.py                  (1500 строк)
└── schedule.py              (1500 строк)

manager.py — Task CRUD

API:

from pm.tasks.manager import TaskManager

manager = TaskManager(project_path="projects/org/lideravto")

# Создать задачу
task = manager.create_task(
    title="Create DATA_MODEL.md",
    description="Design data model for CS-Cart integration",
    assigned_to="projector",
    phase=5
)

# Список задач
tasks = manager.list_tasks(phase=5, status="pending")

# Обновить статус
manager.update_task(task_id=1, status="in_progress")

Хранение:

# projects/org/lideravto/.pm/tasks.yaml
tasks:
  - id: 1
    title: "Create DATA_MODEL.md"
    status: in_progress
    assigned_to: projector
    phase: 5
    created: 2026-02-17T10:00:00

Компонент 4: API (2K строк)

Назначение

Python API для взаимодействия с PM Platform.

Структура

api/
└── pm_api.py                (2000 строк)

Публичный интерфейс

from pm.api import PMPlatform

# Инициализация платформы
pm = PMPlatform()

# Создать проект
project = pm.create_project(
    name="lideravto",
    domain="IT",
    nature="Enhancement",
    class_type="A",
    solution="CS-Cart"
)

# Получить статус
status = pm.get_status(project_id="lideravto")

# Переход на следующую фазу
pm.transition_phase(project_id="lideravto", to_phase=5)

# Проверить gate
gate_result = pm.check_gate(project_id="lideravto", gate_type="exit")

Компонент 5: CLI (3K строк)

Назначение

CLI интерфейс для работы с PM Platform.

Структура

cli/
└── pm_cli.py                (3000 строк)

Команды

# Создать проект
pm create lideravto --domain IT --nature Enhancement --class A --solution CS-Cart

# Статус проекта
pm status lideravto
# → Фаза: 4-Requirements
#   Прогресс: 65%
#   Блокеры: нет

# Проверить gate
pm gate lideravto --type exit
# → Exit Gate для фазы 4:
#   ✅ design/REQUIREMENTS.md exists
#   ✅ Functional Requirements filled
#   → PASSED

# Переход на следующую фазу
pm next lideravto
# → Checking exit gate...
#   → Checking entry gate...
#   → Transition to phase 5 (Design) APPROVED

# Список задач
pm tasks lideravto
# → [1] Create DATA_MODEL.md (in_progress, projector)
#   [2] Create API.md (pending, projector)

# Отчёт
pm report lideravto
# → Генерирует PROJECT_REPORT.md

Порядок разработки

Волна 1: Ядро (5 дней)

Компоненты:
1. pm/core/lifecycle.py — 2 дня
2. pm/core/gates.py — 1.5 дня
3. pm/core/status.py — 1 день
4. pm/core/models.py — 0.5 дня

Критерий готовности:

# Можно создать lifecycle и переходить между фазами
lifecycle = ProjectLifecycle("lideravto")
lifecycle.transition_to(2)  # OK

Волна 2: DMS (7 дней)

Компоненты:
1. pm/dms/templates.py — 2 дня
2. pm/dms/assembly.py — 3 дня (сложный)
3. pm/dms/validation.py — 1.5 дня
4. pm/dms/storage.py — 0.5 дня

Критерий готовности:

# Можно собрать документ из шаблона
assembler = DocumentAssembler()
content = assembler.assemble_document("CSCART_PROJECT", "CLAUDE.md")

Волна 3: Интеграция (3 дня)

Компоненты:
1. pm/core/engine.py — 1.5 дня
2. pm/core/reports.py — 1 день
3. pm/tasks/manager.py — 0.5 дня

Критерий готовности:

# Полный цикл: создать проект → переход фазы → отчёт
pm.create_project("test")
pm.transition_phase("test", 2)
pm.report("test")

Волна 4: Интерфейсы (2 дня)

Компоненты:
1. pm/api/pm_api.py — 1 день
2. pm/cli/pm_cli.py — 1 день

Критерий готовности:

# CLI работает
pm create lideravto --domain IT
pm status lideravto
pm next lideravto

Волна 5: Тестирование (3 дня)

Компоненты:
1. tests/test_lifecycle.py — 0.5 дня
2. tests/test_gates.py — 0.5 дня
3. tests/test_dms.py — 1 день
4. tests/test_integration.py — 1 день

Критерий готовности:
- Покрытие тестами ≥80%
- Все тесты проходят
- Integration test полного цикла проекта


Итого

Общая оценка: 20 дней (для AI это 2-3 дня с учётом ÷10)

Размер: ~42K строк кода (с тестами)

Масштаб: Подсистема → system/services/pm/

MVP позволит:
✅ Создать проект lideravto из шаблонов
✅ Управлять его фазами вручную
✅ Проверять Stage Gates
✅ Отслеживать статус
✅ Генерировать отчёты


Следующие шаги после MVP

v2.0 (расширение)

v3.0 (масштабирование)


Связи / References


Версия: 0.1.0