OrchestKit · CC adoption · 2026-08-29 · operator page · design

Adopt all: the CC integration layer OrchestKit is building toward

"Floor 2.1.251 now, and we want to adopt all." This is the target architecture after every 2.1.243 to 2.1.251 capability is in, laid out as the five layers ork already has, what changes in each, and the three waves that get there. Three decisions at the bottom shape the waves.

2.1.251new support floor (PR in flight); unblocks the hook events
4 / 19adoptions shipped today (PRs #3790 #3791 #3792 #3793)
8code adoptions left across three waves (if: measured out)
7items that resolve to no-op or doc-only with proof
3design decisions that change wave 2
1 · target architecture

Five layers, and where each new capability lands

ork's CC integration is already layered; nothing here adds a layer. Green boxes are shipped or in flight today; amber is wave 1; blue is wave 2; purple is wave 3. The contract layer at the bottom is what every other layer is allowed to assume.

shipped / in flight wave 1 wave 2 wave 3 no-op / doc SKILLS + WORKFLOWS brainstorm as workflow review-pr as workflow partial results (#3766) glyph v3 (#3793) AGENTS (36) cacheTtl: 1h model: wins (#3784 closed) mcpServers grant (#3461) SendMessage reply note HOOKS (32 events · 175 entries) PreModelSwitch gate PostModelSwitch telemetry SessionStart staleness if: measured, n/a wildcard-rule lint type: prompt (2 guards) asyncRewake verifiers sandbox.enabled (#3322) ANALYTICS model-switch.jsonl resume fields in perf log prompt_cache + modelPricing ork:analytics reads both CONTRACT (what every layer may assume) floor = latest = latest_known = 2.1.251 · six CI installer pins · plugin validate on the floor spec/cc-output-keys + generated guard · three event allowlists · --restricted smoke lane (#3774, wave 1) measured 2026-08-29: an unknown event key drops the whole hooks.json, so this layer moves first
What it meansEvery remaining item has a layer and a wave; nothing is "somewhere in the backlog".
If we do nothing past todayFour adoptions ship, the floor moves, and the other nine sit on the epic until the next CC bump forces the question.
2 · design per item

What each adoption actually changes, and the proof it needs

ItemLayerDesignProof before mergeWave
Floor 2.1.251contractcc-support.json floor=latest=latest_known, stamp sweep (113 files), six CI pins, fixture + integration test, matrix unit testfull vitest, every test-cc-*.sh, floor/ceiling tests; plugin validate on 2.1.251 in CItoday
PreModelSwitch / PostModelSwitchhooks + analyticsconsent gate mirrors the spawn gate under one env var; telemetry line per switch; guard allow-list extended3-run E2E (Fable blocked, ORK_FABLE_OK allows, Opus untouched); 2.1.250 control shows why the floor moved#3792
SessionStart stalenesshookslib/session-staleness.ts readers; handoff injector skips warm recent resumes; perf log carries the fieldscaptured resume payload as fixture; unknown fields never read as recent#3792
if: on the Bash guardshooksMeasured out. PreToolUse Bash is one entry (sync-bash-dispatcher) running 15 sub-guards in-process, p50 6 ms / p95 68 ms over 661 calls; every sub-guard needs every command, so if: could only skip it by splitting it into more spawns. The two existing if: uses are the right shape.hook-timing.jsonl, 7-day window, 2026-08-29n/a
experimental.cacheTtl: "1h"agentsfrontmatter on agents that run inside workflows or wait on CI (audit-full, eval-runner, ci-cd-engineer, code-quality-reviewer); decision 2 sets the scope/cost prompt-cache line on a fan-out run before vs afterwave 1
--restricted smoke lane (#3774)contractCI job runs claude -p with --restricted --plugin-dir plugins/ork; every hook that shells out must fail loudly, which is the assertionthe job is red until the failure list is enumerated and acceptedwave 1
Permission-rule wildcard lint (2.1.246)hookstest over src/settings/*.settings.json rejecting Bash(x * y) shapeslint green on current rules; positive control rule fails itwave 1
maxTurns partial results (#3766)skillsagent-spawning skills recognise "partial, continue via SendMessage" instead of treating silence as failure; empty-result-detector gets a third verdictfixture from a real partial result; detector base-rate re-measuredwave 1
modelPricing + prompt_cache in costanalyticscost-estimator honors configured rates; status-line prompt_cache object ingested; ork:analytics answers hit ratiounit tests on the captured status-line object; one session's numbers reconciled against /costwave 1
type: prompt hookshooksthe two regex guards that misfire on worktree branch names become model-evaluated; decision 1#3770 audit is clean, so the stdout contract holds; A/B on the recorded false-positive corpuswave 2
asyncRewake on background verifiershooksthe #3779 verdict class interrupts with its finding instead of waiting for the next turnone real verifier run rewakes the session; no double-emitwave 2
brainstorm + review-pr as workflow scriptsskillsthe two most-used fan-outs get resume, per-agent cache and the size guideline for freesame outputs on a fixed prompt; token count per run before vs afterwave 2
SendMessage reply note + cross-session everywhere (#3772, #3773)skillsdoc updates in chain-patterns and the 19 agents that grant SendMessage; no code path changesgrep proves every mention states the parent-delivery rulewave 2
sandbox.enabled (#3322)hooksretire the regex egress guard behind CC's own sandbox; honored only from user/managed scope, so ork documents and detects rather than shipsdoctor reports the posture; guard becomes advisory when sandbox is onwave 3
plugin dependencies (#3326), double-register (#3541), mcpServers grant (#3461)agents / manifestmanifest and loader work that changes what users see in /plugins and the slash menuplugin validate + a fresh install on the floor versionwave 3
#3763 Finder permission, #3764 strict-mcp-config, #3767 code-review self-start, #3768 OTel attrs, #3771 mcp scope displaynoneCC-internal or doc-only; close with the grep that proves no ork surfaceone comment eachno-op
#3765 /cd reloads project confighooksdoc-only: lifecycle/cwd-changed is where a cwd-scoped refresh belongs; README already updated in #3791nonedoc
3 · the waves

Order is set by what each wave is allowed to assume

today floor 2.1.251 model-switch hooks glyph v3 wave 1 · five small PRs cacheTtl · rule lint restricted lane partial results · pricing one measurement each wave 2 · behavior prompt hooks asyncRewake · 2 workflows messaging docs wave 3 · loader sandbox.enabled dependencies double-register, grants rule: a wave may assume only what the previous wave merged; every PR carries a playground, a Lab entry and a measured before/after, not a claim
What it meansFive small PRs in wave 1 can run in parallel worktrees; waves 2 and 3 each depend on one decision below.
If we skip the orderA wave-2 prompt hook merged before the floor lands repeats today's failure: green tests, silent plugin.
decide · 1 of 3

Which guards become type: prompt hooks in wave 2?

The #3770 audit found every stdout writer JSON-only, so the earlier "audit first" condition is met.

after you pick
decide · 2 of 3

How wide does experimental.cacheTtl: "1h" go?

after you pick
decide · 3 of 3

Where does the --restricted smoke run live?

after you pick

    

What happens next, in order

  1. Floor PR lands; #3792 rebases onto it and its validate check goes green; #3793 lands.
  2. Wave 1: six small PRs in parallel worktrees, each with its measurement in the body; the five no-op issues closed with proof.
  3. Wave 2 after decisions 1 and 3; wave 3 after the loader-facing items have a fresh-install test on the floor.