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>
4.9 KiB
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 параметризован, живые промпты — нет).