Соберите рабочее пространство Opus 4.8 на GitHub

Полная русская версия статьи о том, как собрать рабочее пространство Opus 4.8 на GitHub для AI-assisted разработки.

Соберите рабочее пространство Opus 4.8 на GitHub
Источник: https://x.com/Granite0x/status/2075187528739537084

Автор: Granite

Вы установили Claude Code. Это была самая маленькая часть.

Настройка — это всё, что находится вокруг CLI: навыки, хуки, сабагенты, MCP-серверы, workflow YAML-файлы и canary. Именно эта поверхность превращает окно чата в репозиторий, который отправляет PR, пока вы спите.

Никто не пишет это с нуля. Каждый фрагмент уже лежит в публичном GitHub и ждёт, когда его привьют к одному рабочему пространству.

Эта статья показывает такую прививку. Семь файлов, один ночной цикл, один canary, который ловит тихие сдвиги модели раньше, чем это сделает ваш счёт.

Вам нужно рабочее пространство, а не чат.

image

Настройкой никогда не был CLI

Anthropic уже превратила части этой поверхности в продукт.

Конфигурация memory tool `{"type": "memory_20250818", "name": "memory"}` (GA в Messages API) автоматически внедряет системную директиву, которая говорит Claude читать каталог памяти перед любым действием и предполагать, что его могут прервать на любом ходе. Контракт initializer/coding-agent — размещённый у провайдера.

У пути Skills API есть собственная ловушка. Три beta-заголовка требуются вместе: `code-execution-2025-08-25`, `files-api-2025-04-14`, `skills-2025-10-02`.

Собственный cookbook Anthropic предупреждает: не кладите их в `default_headers`. Они должны идти в per-request `betas=[...]`.

Три дисциплины, один репозиторий

Эта поверхность живёт на GitHub. Её форкают, коммитят и выполняют Actions runners по cron, пока вы спите.

  • Loop engineering: один агент, Plan затем Act затем Verify, принудительно через файлы на диске.
  • Workflow engineering: много агентов, оркестрированных GitHub Actions runners по расписанию.
  • Canary engineering: fingerprint закреплён в одном файле, alias вызывается во всех остальных, scheduled diff ловит тихие сдвиги.

Loop удерживает одного агента честным внутри одного запуска. Workflow удерживает множество агентов дешёвыми на множестве запусков.

Canary удерживает саму модель закреплённой несмотря на тихие сдвиги alias.

STEP 1: Соберите workspace из публичного GitHub

Каждый артефакт прививается из публичного репозитория, который можно построчно проаудировать. Репозиторий claude-cookbooks запускает `.claude/` на самом себе, так что можно напрямую привить `cookbooks/.claude/`.

image

Обратите внимание на переименование: `anthropic-cookbook` теперь редиректит на `anthropics/claude-cookbooks`. Указывайте свои graft на новый slug.

`anthropics/skills` выставляет три плагина через `marketplace.json`: `document-skills`, `example-skills`, `claude-api`.

У `claude-cookbooks` трёхуровневая программа. Начните с `patterns/agents` для chaining, routing, orchestrator-workers и evaluator-optimizer.

Затем `claude_agent_sdk` для notebook Chief of Staff — паттерна в одном файле. Затем `managed_agents` для hosted stateful runtime Anthropic с `memory_stores` и HITL.

`modelcontextprotocol/servers` сохраняет только текущий reference-набор. Более старые reference servers переехали в `servers-archived`.

`CONTRIBUTING.md` прямо говорит, что новые server implementations больше не принимаются. Поиск сторонних реализаций перенаправлен на `registry.modelcontextprotocol.io`.

`wshobson/agents` разделяется на пять harness adapters. Один источник истины в `plugins/`, пять поверхностей генерируются через `make generate HARNESS=<name>`.

Сабагенты VoltAgent охватывают десять категорий:

  • Core Development
  • Language Specialists
  • Infrastructure
  • Quality and Security
  • Data and AI
  • Developer Experience
  • Specialized Domains
  • Business and Product
  • Meta and Orchestration
  • Research and Analysis

Категории версионируются независимо. Model routing встроен во frontmatter.

Opus, Sonnet и Haiku заранее объявлены для каждого агента. Путь установки: `claude plugin marketplace add VoltAgent/awesome-claude-code-subagents`, затем `claude plugin install <plugin-name>`.

`steipete/agent-scripts` документирует эмпирический факт, который стоит закрепить. Claude Code проходит ровно на один уровень каталогов под `~/.claude/skills`, тогда как Codex сканирует вложенные каталоги.

`Archive228/loopkit` даёт drop-in `.claude/` плюс `install.sh`, который прививает всё перечисленное выше.

image

Спецификация Agent Skills требует два YAML frontmatter-поля: `name` и `description`. По соглашению они записываются именно в таком порядке.

`name` должен быть длиной от 1 до 64 символов, только lowercase `a-z`/`0-9`/hyphens. Без начальных или конечных hyphens, без двойных hyphens подряд.

`name` должен совпадать с именем родительского каталога. `description` по спецификации ограничен 1024 символами.

`description` — главный сигнал, по которому Claude решает, активировать ли skill. `skill-creator` отмечает, что Claude склонен недосрабатывать с trigger-ами, и предписывает более настойчивые descriptions.

Плохо: `description: Helps with PDFs.`

Хорошо: `description: Extracts text and tables from PDF files, fills PDF forms, and merges multiple PDFs. Use when working with PDF documents or when the user mentions PDFs, forms, or document extraction.`

Минимальный жизнеспособный `SKILL.md` в форме template из `anthropics/skills`:

```


name: template-skill description: Replace with description of the skill and when Claude should use it.


Insert instructions below

```

Механика discovery навыков начинает иметь значение после пяти skills. Claude включает `name` и `description` каждого skill в startup metadata и первым сбрасывает наименее используемые descriptions, когда бюджет listing переполняется.

Монорепозиторий MCP servers даёт filesystem, memory, git и fetch как reference implementations.

TypeScript servers поставляются как `@modelcontextprotocol/server-<name>` через `npx -y`. Python servers поставляются через `uvx`.

На Windows оборачивайте `npx` в `cmd /c`: `"command": "cmd", "args": ["/c", "npx", "-y", "..."]`. Записи `uvx` оставьте без изменений.

Корневой `AGENTS.md` симлинкуется в tool-specific пути:

``` ln -s ~/Projects/opus-workspace/AGENTS.md ~/.codex/AGENTS.md ln -s ~/Projects/opus-workspace/AGENTS.md ~/.claude/CLAUDE.md ln -s ~/Projects/opus-workspace/AGENTS.md ~/.claude/AGENTS.md ```

Skills используют плоские per-skill symlinks под `~/.claude/skills/<name>/SKILL.md`. Codex получает whole-root links, потому что он сканирует вложенные каталоги.

Сама прививка — это три строки:

``` gh repo clone Archive228/loopkit workspace cd workspace bash install.sh ```

После этого добавьте только те skills из `anthropics/skills`, которые вам действительно нужны. Плюс те сабагенты из VoltAgent, которые соответствуют вашей работе.

STEP 2: Подключите loop как Workflow YAML

Loop — это не скрипт, который вы запускаете локально в 2 ночи. Это workflow-файл, который срабатывает по cron, открывает PR и завершается, когда PR смёржен или истёк token budget.

Две настройки модели несут основную нагрузку. Первая: `ANTHROPIC_MODEL=claude-opus-4-8`, dateless pinned snapshot.

Вторая: `EFFORT=xhigh`. Документация рекомендует `xhigh` как стартовый уровень для coding и agentic use на Opus 4.7 и 4.8.

На API default — `high`.

Полная шкала effort: `low / medium / high / xhigh / max`. `xhigh` доступен только на Fable 5, Opus 4.8, Opus 4.7 и Sonnet 5.

Effort управляет всеми output tokens: текстом, аргументами tool-call и thinking вместе. Более низкий effort производит меньше объединённых tool calls и более короткие preambles.

На `xhigh` или `max` для Opus 4.7/4.8 или Fable 5 выставляйте `max_tokens` минимум 64k. Effort ограничивает thinking плюс response вместе, поэтому меньшие ceilings тихо обрезают вывод.

Если перейти на Sonnet 5, ломаются три вещи. `budget_tokens: N` возвращает 400.

Manual extended thinking удалён. Нестандартные `temperature`, `top_p`, `top_k` все возвращают 400.

Sonnet 5 использует новый tokenizer, который даёт заметно больше tokens на тот же текст, чем Sonnet 4.6. Цена per-token не меняется, но cost per-request сдвигается.

Пересчитайте prompts и заново настройте `max_tokens` при миграции.

`.github/workflows/loop.yml`:

``` name: nightly-loop on: schedule: - cron: "0 3 *" workflow_dispatch:

permissions: contents: write pull-requests: write

concurrency: group: nightly-loop cancel-in-progress: false

jobs: run: runs-on: ubuntu-latest timeout-minutes: 90 env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} ANTHROPIC_MODEL: claude-opus-4-8 EFFORT: xhigh steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: "20" - run: npm install -g @anthropic-ai/claude-code - name: Guard against canary drift run: | test ! -f canary/DRIFT \ || (echo "canary drifted; refusing to run loop" && exit 1) - name: Run loop payload run: bash run.sh - uses: peter-evans/create-pull-request@v6 with: branch: loop/${{ github.run_id }} commit-message: "loop: run ${{ github.run_id }}" title: "loop: nightly run ${{ github.run_id }}" body: "Autogenerated by nightly-loop." ```

image

Блок `concurrency` не даёт медленному запуску пересечься со следующим cron tick. Шаг Guard against canary drift — место, где workflow engineering передаёт управление canary engineering.

Если canary записал файл `canary/DRIFT` после последнего loop, workflow отказывается сжигать токены. Payload — восьмистрочный `run.sh` в форме loopkit, напечатанный ниже.

STEP 3: Добавьте canary

image

Loop engineering удерживает вас точным внутри одного запуска. Canary engineering удерживает честность между всеми запусками.

Aliases двигаются без предупреждения. Окно rollout Fable 5 неделями перенаправляло часть coding traffic на fallback Opus 4.8.

Если вы не следили за своим alias, вы отправляли Fable prompts на веса Opus и не замечали.

`claude-opus-4-8` и `claude-sonnet-5` выставлены как dateless pinned snapshots. Для этих двух нельзя закрепить date string в коде.

Вместо этого вы закрепляете response fingerprint. Fingerprint — это три объединённых поля.

Model header, который вернул API, `stop_reason`, плюс hash первых 200 символов output. Seed prompt фиксирован и low-effort.

Один и тот же input при каждом probe, поэтому любой output shift — это model shift. Для Sonnet 4.5 (`claude-sonnet-4-5-20250929`) и Haiku 4.5 (`claude-haiku-4-5-20251001`) классический dated-id pin всё ещё работает.

Добавьте поле `snapshot_id` в `canary/golden.json` и проверяйте оба.

Паттерн verbs, который копирует workflow, взят из canary subcommand CLI `fable-sentinel`. Verbs: `init`, `run`, `diff`, `schedule`.

`fable-sentinel` поставляет восемь default prompts по категориям code, reasoning, knowledge, instruction-following, creative и tool-shape. У каждого есть `expect: {contains, exact, minLength, maxLength}`.

Copy-pasteable drift thresholds:

``` FABLE_SENTINEL_REFUSAL_MAX=0.20 LATENCY_MAX=1.5 LENGTH_MIN=0.5 ```

`.github/workflows/canary.yml`:

``` name: canary on: schedule: - cron: "0 /6 " workflow_dispatch:

permissions: contents: write issues: write

jobs: probe: runs-on: ubuntu-latest timeout-minutes: 10 env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.12" - run: pip install anthropic - name: Run verifier id: verify run: python canary/verifier.py continue-on-error: true - name: Mark drift on failure if: steps.verify.outcome == 'failure' run: | date -u +"drift detected at %FT%TZ" > canary/DRIFT git config user.name "canary-bot" git config user.email "canary-bot@users.noreply.github.com" git add canary/DRIFT git commit -m "canary: drift detected" git push - name: Open drift issue if: steps.verify.outcome == 'failure' uses: actions/github-script@v7 with: script: | await github.rest.issues.create({ owner: context.repo.owner, repo: context.repo.repo, title: "canary: alias drift on claude-opus-4-8", body: "verifier.py fingerprint mismatch. Compare canary/golden.json to the latest probe output." }) ```

`canary/verifier.py` — это stdlib плюс официальный SDK. Он один раз probe-ит alias, хэширует output, сравнивает с `canary/golden.json`, выходит non-zero при mismatch.

Probe использует `output_config: {"effort": "low"}` плюс seed prompt на 15 токенов и `max_tokens=32`. Это удерживает каждый probe Opus 4.8 примерно на уровне $0.0009.

Четыре probe в день в течение тридцати дней — около $0.10 в месяц.

Механика Prompt Caching

Prompt caching — самый большой cost lever для повторяемого workspace. Workspace prefix означает `CLAUDE.md` плюс `AGENTS.md` плюс metadata skills плюс MCP tool definitions плюс frontmatter сабагентов.

Два TTL-варианта. `"5m"` — default и стоит 1.25x base input для записи.

`"1h"` стоит 2x base input для записи. Оба читаются по 0.1x base input, то есть со скидкой 90%.

Break-even для длинного TTL находится на трёх и более requests в час. Break-even для короткого TTL — на двух.

Минимум cacheable tokens зависит от модели:

| Model | Min tokens | | --- | --- | | Opus 4.8 | 1,024 | | Opus 4.7 | 2,048 | | Sonnet 5 | 1,024 | | Sonnet 4.6 | 1,024 | | Haiku 4.5 | 4,096 | | Fable 5 | 512 |

Максимум четыре `cache_control` breakpoints на request. Любое byte change в prefix инвалидирует всё после него.

Иерархия invalidation идёт так: tools, затем system, затем messages. Любое изменение tool-definition инвалидирует весь cache.

Это важно, потому что workspace часто мутирует `.mcp.json`. Добавление сабагента, который подтягивает новый MCP server, инвалидирует всё при следующем запуске.

Пример с 1h TTL на Opus 4.8:

``` client.messages.create( model="claude-opus-4-8", max_tokens=1024, system=[{ "type": "text", "text": "Large workspace prefix...", "cache_control": {"type": "ephemeral", "ttl": "1h"} }], messages=[{"role": "user", "content": "..."}], ) ```

Pre-warm pattern: отправьте тот же request с `max_tokens=0`. Вернётся empty content со `stop_reason: "max_tokens"`, но cache заполнится.

Читайте поле `cache_read_input_tokens`, чтобы проверить. Если после второго запуска оно остаётся нулём, prefix меньше минимума или изменился tool.

BONUS: Превратите workspace в публичный loadout

Workspace перестаёт быть только вашим в момент, когда вы push-ите его публично. Любой может fork-нуть его и унаследовать loop, canary, набор skills и pinned dependencies.

Distribution pattern единообразен по всей ecosystem:

``` /plugin marketplace add anthropics/skills claude plugin marketplace add VoltAgent/awesome-claude-code-subagents npx codex-marketplace add wshobson/agents ```

`wshobson/agents` также генерирует per-harness surfaces через `make generate HARNESS=<name>`. Проверьте Makefile репозитория на текущий список supported harness.

Положите `.claude-plugin/marketplace.json` в root репозитория — и ваш workspace станет fork-installable:

``` { "name": "opus-4-8-workspace", "description": "Nightly loop + canary for Claude Code on Opus 4.8.", "version": "0.1.0", "author": "your-github-handle", "homepage": "https://github.com/your-handle/opus-4-8-workspace", "license": "MIT", "category": "automation", "plugins": [ { "name": "loop", "path": "." } ] } ```

Один `install.sh` в root, один marketplace manifest — и fork chain начинается.

Money Math

Один nightly loop run при 100k input tokens и 20k output tokens:

image

Canary probe работает на `claude-opus-4-8`, потому что весь смысл — fingerprint alias, который вы реально используете. При $5 input и $25 output за MTok probe 15-input / 32-output стоит около $0.0009.

Четыре probe в день, каждые шесть часов, дают примерно $0.10 в месяц.

Prompt caching ещё сильнее режет input side. Ночной loop Opus 4.8 на cached prefix оказывается ближе к пятидесяти центам, чем к доллару.

Минимальный cacheable prefix на Opus 4.8 — 1,024 tokens. Ниже этого workspace тихо промахивается мимо cache и платит полную цену.

Файлы

Положите эти файлы в свежий репозиторий — и loop начнёт работать сегодня ночью. Установите `ANTHROPIC_API_KEY` в Actions secrets репозитория.

`.github/workflows/loop.yml` и `.github/workflows/canary.yml` напечатаны выше.

`CLAUDE.md`:

CLAUDE.md

```

CLAUDE.md

READ AGENTS.md BEFORE ANYTHING.

Plan then Act then Verify. Enforce on disk.

  • Loop payload: `run.sh`
  • Skills: `.claude/skills/`
  • Subagents: `.claude/agents/`
  • MCP servers: `.mcp.json`
  • Canary: `canary/verifier.py`

Model is pinned via env `ANTHROPIC_MODEL` in workflows. Default: `claude-opus-4-8` at effort `xhigh`. Do not edit `canary/golden.json` unless drift is expected. ```

`.mcp.json`:

``` { "mcpServers": { "memory": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-memory"] }, "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "."] }, "git": { "command": "uvx", "args": ["mcp-server-git", "--repository", "."] }, "fetch": { "command": "uvx", "args": ["mcp-server-fetch"] } } } ```

`canary/verifier.py`:

``` #!/usr/bin/env python3 """ canary/verifier.py

Probe the alias `claude-opus-4-8` on a fixed low-effort seed prompt. Hash the model header + stop_reason + first 200 chars of output. Compare against canary/golden.json. Exit 1 on any mismatch. """ import hashlib import json import os import sys from pathlib import Path

from anthropic import Anthropic

SEED_PROMPT = "Reply with exactly this single token and nothing else: canary-ok" MODEL = "claude-opus-4-8" GOLDEN = Path(__file__).parent / "golden.json"

def fingerprint() -> dict: client = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"]) resp = client.messages.create( model=MODEL, max_tokens=32, temperature=0, messages=[{"role": "user", "content": SEED_PROMPT}], output_config={"effort": "low"}, ) text = "".join(b.text for b in resp.content if b.type == "text")[:200] return { "model_id_returned": resp.model, "stop_reason": resp.stop_reason, "response_sha16": hashlib.sha256(text.encode()).hexdigest()[:16], }

def main() -> int: probe = fingerprint() if not GOLDEN.exists(): GOLDEN.write_text(json.dumps(probe, indent=2) + "\n") print("golden.json seeded; no comparison this run") return 0 golden = json.loads(GOLDEN.read_text()) diff = {k: (golden.get(k), probe.get(k)) for k in probe if golden.get(k) != probe.get(k)} if diff: print("DRIFT:", json.dumps(diff, indent=2)) return 1 print("canary-ok") return 0

if __name__ == "__main__": sys.exit(main()) ```

`canary/golden.json.example`:

``` { "model_id_returned": "claude-opus-4-8", "stop_reason": "end_turn", "response_sha16": "REPLACE_ON_FIRST_RUN" } ```

`install.sh`:

``` #!/usr/bin/env bash set -euo pipefail

echo ">> installing Claude Code CLI" npm install -g @anthropic-ai/claude-code

echo ">> installing MCP servers on demand" npx --version >/dev/null

echo ">> seeding canary golden if missing" if [ ! -f canary/golden.json ]; then cp canary/golden.json.example canary/golden.json fi

echo ">> workspace ready" echo " next: export ANTHROPIC_API_KEY=... && bash run.sh" ```

`run.sh`:

``` #!/usr/bin/env bash set -euo pipefail MODEL="${ANTHROPIC_MODEL:-claude-opus-4-8}" EFFORT="${EFFORT:-xhigh}" PROMPT="Read AGENTS.md. Pick one open goal from goals.md. Plan then act then verify. Commit each step. Update goals.md when the goal ships." claude code --headless --dangerously-skip-permissions \ --model "$MODEL" "$PROMPT" git add -A git commit -m "loop: $(date -u +%FT%TZ)" || true ```

Один репозиторий, один PR каждую ночь, один issue при любом drift.

Заключение

Loop engineering удерживает одного агента честным. Workflow engineering удерживает множество агентов дешёвыми.

Canary engineering удерживает закреплённой саму модель. Push-ните workspace публично сегодня вечером.

Subscribe to Temperature 0.7 - AI блог об AI и роботах

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe