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