type: research
title: "PM Platform MVP — Детальная спецификация"
status: draft
version: 0.1.0
date: 2026-02-17
owner: architect
Детальная спецификация MVP (Minimum Viable Product) для PM Platform на основе:
- [[PM-COMPONENTS-ANALYSIS]] — анализ компонентов PM
- [[COMPONENT_SCALE]] — правила размещения
- [[PLATFORM_ARCHITECTURE]] — архитектура платформы
Цель: Управлять проектом 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
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"
Ядро PM Platform — управление жизненным циклом проекта.
core/
├── __init__.py (100 строк)
├── lifecycle.py (3000 строк)
├── gates.py (2000 строк)
├── engine.py (4000 строк)
├── status.py (2000 строк)
├── reports.py (4000 строк)
└── models.py (500 строк)
Ответственность:
- Определение 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 # текущая
Ответственность:
- Проверка 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"),
]
},
# ... остальные фазы
}
Ответственность:
- Выполнение процессов (из 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.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
Ответственность:
- Генерация отчётов по проекту
- Статистика по фазам
- История изменений
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
Document Management System — управление иерархией документов проекта.
dms/
├── __init__.py (100 строк)
├── templates.py (3000 строк)
├── assembly.py (4000 строк)
├── validation.py (2000 строк)
├── storage.py (3000 строк)
└── models.py (500 строк)
Ответственность:
- Реестр шаблонов (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
Ответственность:
- Сборка документов из шаблонов
- Применение 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
...
Ответственность:
- Проверка структуры проекта
- Проверка обязательных документов
- Проверка заполненности секций
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
# )
Ответственность:
- Чтение/запись документов проекта
- Версионирование (через 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")]
Базовое управление задачами (упрощённая версия).
tasks/
├── __init__.py (100 строк)
├── manager.py (2000 строк)
├── deps.py (1500 строк)
└── schedule.py (1500 строк)
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
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")
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. 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
Компоненты:
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")
Компоненты:
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")
Компоненты:
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
Компоненты:
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
✅ Отслеживать статус
✅ Генерировать отчёты
Версия: 0.1.0