Files
orchestrator/onboarding/README.md
claude-bot dc1cb87818 feat(onboarding): turnkey project onboarding — kit + CLI + runbook (ORCH-009)
Operator capability to bring a NEW project online in one pass, fully
outside the runtime and the pipeline (src/** byte-exact, no kill-switch
needed — activation is an explicit human CLI run). Reference = the
orchestrator repo itself (ORCH-52b/c/d/e canons).

* onboarding/repo-skeleton/ — parametrized kit of a new repo: 6 agent
  prompt templates per canon 52d/92 (5 ru + deployer en with the
  shared-host guardrail frame), reviewer doc-gate (REQUEST_CHANGES),
  CLAUDE.md passport, AGENTS.md, CONTRIBUTING.md, docs/ skeleton with
  mandatory operations/INFRA.md, .env.example; {{NAME}} placeholders +
  stdlib render, dictionary onboarding/placeholders.json (bijection
  held by tests). Canon is NOT forked: docs/_templates + docs/_standards
  are live-copied from the checkout at materialization time (BR-2/D3).
* scripts/onboard_project.py — plan (default, GET-only, zero mutations)
  / apply (idempotent ensure, no delete ops at all) / verify (registry
  round-trip via the actual projects._parse_projects_json, all 22 state
  names incl. fail-closed Confirm Deploy/STOP, labels, webhook, kit
  completeness, unresolved-placeholder scan). Closed read-only src
  import list (ADR D4); state groups fixed per ADR D5 (STOP→cancelled,
  terminal groups only Done/Cancelled/STOP); Gitea webhook reuses the
  single global ORCH_GITEA_WEBHOOK_SECRET (TR-6); initial push ONLY
  into a freshly created empty repo (INV-4 untouched); never restarts
  prod / never edits .env / deletes nothing (NFR-2); secrets masked
  (NFR-3); Plane CE API gaps degrade to manual-step (fail-safe).
* docs/operations/ONBOARDING.md runbook + SETUP_WEBHOOKS.md generalized
  per-repo; CLAUDE.md / docs/architecture/README.md / CHANGELOG.md
  updated in the same PR (golden source).
* Anti-drift tests: test_onboarding_kit.py / test_onboarding_script.py
  (mocked, no network) / test_onboarding_invariants.py (snapshots of
  STAGE_TRANSITIONS/QG_CHECKS, closed CLI import list, reference
  .openclaw/agents/ prompts untouched). Full regression: 1713 passed.

Refs: ORCH-009

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 16:08:43 +03:00

4.9 KiB
Raw Blame History

onboarding/ — turnkey-kit нового проекта (ORCH-009)

Каркас (kit) нового репозитория, подключаемого к оркестратору, и словарь его параметризации. Всё под onboarding/ предназначено новому репо; ничто отсюда не исполняется рантаймом оркестратора (граница физическая — ADR-001 D1 ORCH-009). Материализацию выполняет операторский CLI scripts/onboard_project.py (режимы plan/apply/verify); полный процесс — runbook docs/operations/ONBOARDING.md.

Состав

onboarding/
  README.md            ← этот файл
  placeholders.json    ← словарь плейсхолдеров (single source of truth, D2)
  repo-skeleton/       ← дерево зеркалит целевой репо (FR-1)
    .openclaw/agents/{analyst,architect,developer,reviewer,tester,deployer}.md
    CLAUDE.md  AGENTS.md  CONTRIBUTING.md  README.md  CHANGELOG.md  .env.example
    docs/ARCHITECTURE.md  docs/PIPELINE.md  docs/PRODUCT_VISION.md
    docs/operations/INFRA.md
    docs/architecture/adr/README.md
    docs/work-items/.gitkeep  docs/history/.gitkeep

Плейсхолдеры (D2)

Синтаксис: {{NAME}} (верхний регистр, [A-Z][A-Z0-9_]*). Подстановка — тупой проход str.replace по словарю placeholders.json; после рендера обязательный скан на неразрешённые {{…}} (ошибка в apply/verify). Никаких шаблонизаторов и условной логики в kit — kit обязан быть тупым.

Словарь — placeholders.json: NAME → {description, required, default, example}. Тесты держат биекцию: каждый плейсхолдер, встречающийся в kit, объявлен в словаре, и каждый объявленный — используется (tests/test_onboarding_kit.py::test_placeholder_dictionary_bijection).

Расширение словаря = правка placeholders.json + kit + тестов в одном PR.

Правило «канон не форкается» (BR-2 / D3)

Класс Файлы Механизм
Live-copy канона (НЕ хранится в kit) docs/_templates/** (16 скелетов), docs/_standards/** (3 стандарта) копируются CLI verbatim из рабочего чекаута репо оркестратора в момент материализации
Параметризуемые шаблоны (хранятся здесь) 6 промптов, CLAUDE.md, AGENTS.md, CONTRIBUTING.md, README.md, CHANGELOG.md, docs/ARCHITECTURE.md, docs/PIPELINE.md, docs/PRODUCT_VISION.md, docs/operations/INFRA.md, docs/architecture/adr/README.md, .env.example рендер {{…}}
Скелет-каркас docs/work-items/.gitkeep, docs/history/.gitkeep копия как есть

Канон копируется байт-в-байт, без переписывания: примеры конкретных work item внутри стандартов остаются иллюстрацией, не «утечкой». Утечка — это литерал оркестратора там, где должен быть параметр (чужой префикс work-item, порты оркестратора, его правила эксплуатации) — ловится тестом анти-утечек.

Обновление канона в уже-онбордженных репо едет их обычными PR с reviewer-gate; новые онбординги автоматически получают свежий канон (live-copy).

Языковая политика промптов (D9)

Канон: 5 промптов ru + deployer.md en (deployer — самый safety-critical промпт; en-раскладка минимизирует регресс-поверхность байт-точных verdict-ключей и shell-команд). Per-project отступление — только решением в собственном ADR нового проекта (см. шаблон CONTRIBUTING.md).

Тесты kit

pytest tests/test_onboarding_kit.py tests/test_onboarding_script.py tests/test_onboarding_invariants.py -q

Структурные тесты канона 52d/92 гоняются по onboarding/repo-skeleton/.openclaw/agents/*.md отдельно от живых промптов оркестратора (tests/test_agent_prompts_canon.py) — это разные деревья с разными требованиями (kit параметризован, живые промпты — нет).