๐Ÿงญ Two users, one morning: the plan, drawn

OrchestKit, 2026-08-31. Yotam's voice note and Nir's screenshot go first; the adoption backlog follows in the order that avoids conflicts. Eleven lanes, three defaults you can flip at the bottom.

2users, 9 distinct complaints (5 ork-shaped)
3rows per command with stable + alpha installed (measured)
3platform-watch issues untriaged since 08-21
34dist-touching commits in 14 days (every hooks PR conflicts)
2.1.251CC installed = latest = ork floor
0CC features left in the gap queue

๐Ÿ”ฅ Superseding order: the divergence purge

Operator, 11:15: remove every hook a CC-native mechanism replaces, fully, one push. Built by 13:30: six PRs, one merged, five in the strict-checks merge train; the hq-ext leg (hq-ext-plugin#1187) shipped four PRs of its own. Measured on the way: the 26 deny rules ork ships in its plugin settings were NEVER enforced (CC reads only two keys from a plugin settings file), so the hooks are the only live protection and the purge must ship a vehicle first.

PRwhatends
1 ยท #3836 mergedvehicle: /ork:setup writes real operator-scope deny rules + sandbox block, with consent; doctor proves they enforcethe never-enforcing JSON
2 ยท #3837register: verdict per hook in cc-native-first.md#3629 (out of scope)
3 ยท #3838delete dead 4, compound-command-validator, agent-browser-safetysilent dead weight
4 ยท #3839delete egress ASK tier, cron-guard, team-size-gate, restrict-bash; pre-commit-runner moves to git hooksYotam's and most of Nir's prompts
5 ยท #3840security baseline amended, then file-guard + credential-read-guard deleted (after the enforcement probe is green)
6 ยท #3841delete git-validator + dangerous-command-blocker; security suite becomes tripwires on the NATIVE mechanismthe parallel permission system

CC's own rules, sandbox and prompts do the guarding; ork keeps only what CC cannot see (secret bytes, executing fetched code, budgets, spend consent). Lanes 0a/0d below are superseded; the backlog lanes wait behind the purge.

29 hooks keep re-asking what CC already decides, and users keep switching everything off.

๐Ÿ—บ What changes where

Left: the Claude Code session, where hooks watch tool calls. Right: the repo, where automation and paperwork live. Green boxes are new.

flowchart LR subgraph CC["Claude Code session"] B["Bash tool"] --> D["bash dispatcher"] D --> EG["egress guard\n(asks before uploads to unknown hosts)"] D --> AB["agent-browser guard\n(Bash path)"] M["MCP browser tools\n(claude-in-chrome, agent-browser --mcp)"] --> BG["browser URL guard"] AB --> P[("one URL policy\nblocklist, rate limit, robots, canonical form")] BG --> P EG --> AL[("allowlist\ndefaults + env + sandbox.network.allowedDomains")] EG -- "ask text names the fix" --> U["user"] SS["session start"] --> EN["egress ask digest\n'last session asked 6x for host X; one line stops it'"] end subgraph REPO["orchestkit repo"] GH["push to main"] --> RD["dist re-derive workflow\nrebase generated-only conflicts, rebuild, push"] PW["platform release-note snapshots"] --> TR["triage audit file"] --> IS["close 3 issues"] EP["EPIC 3309"] --> WC["apply generator, re-measure"] --> CL["close with a true table"] end classDef new fill:#e6f6ec,stroke:#1a7f4b,color:#1c1c1a; class BG,P,EN,RD,TR new;

every browser path a hook can see shares one policy; every egress ask carries its own remedy; conflicting PRs heal themselves.

three engines stay unguarded, the ask stays a mystery, and every hooks PR keeps needing a manual rebase.

๐Ÿ”ข The order, and why

User-facing first. Paperwork next (no build). The re-derive workflow lands before the browser PR so that PR does not conflict within a day.

flowchart TD A0["Lane 0: user feedback\n0a Yotam: the ask names its fix, allowlist from settings, session digest\n0b Nir: data, local repro, GA release, doctor check\n0c help catalog line"] --> A1["Lane 1: close EPIC 3309 with a true table"] A1 --> A2["Lane 2: platform triage, 27 capabilities, 3 issues closed"] A2 --> A5a["Lane 5a: dist re-derive workflow (#3578)"] A5a --> A3["Lane 3: browser engine scope + MCP URL guard (#3629)"] A3 --> A4["Lane 4: close wave 2: prompt hooks measured 'none' (#3802)"] A4 --> A5b["Lane 5b: stale 2.1.219 row, #3462 gets its checklist"] classDef user fill:#fde7e7,stroke:#b3261e,color:#1c1c1a; classDef paper fill:#e7f0ff,stroke:#1b4fd8,color:#1c1c1a; classDef code fill:#e6f6ec,stroke:#1a7f4b,color:#1c1c1a; class A0 user; class A1,A2,A4,A5b paper; class A5a,A3 code;

red = user-facing, blue = paperwork and closes, green = code PRs with a Lab playground each.

the hooks PR (Lane 3) lands first and gets re-conflicted by the next merge, again.

๐Ÿ”‡ Lane 0a: Yotam, "it stops me every time" user

"I use ork and suddenly it stops me every time because of some pre-hook... related to the sandbox... either set up a local sandbox or run with dangerously-skip-permissions... it disrupts processes I run into the night." (voice note 09:58, transcribed locally)

The egress guard asks "Uploads data to a non-allowlisted host. Proceed?" for every scp, rsync, or upload to a host it does not know. His private server is unknown. Overnight there is nobody to answer. Nir hit the same wall wider: "Yes or No every few minutes since early August", "I did not understand what I had to approve", and both users ended up running with permissions off.

whattodayafter
the ask text"Proceed?""add host to sandbox.network.allowedDomains, or ORCHESTKIT_EGRESS_ALLOWLIST=host"
allowlist sources14 built-ins + an env var nobody can findplus sandbox.network.allowedDomains from the four settings files, even with the sandbox off
the unattended casesilent hangnext session start: "last session asked 6x: egress guard (host X: one settings line), command blocker 2x (no knob, answer per case)"; one digest for all 8 hooks that can ask

one line in .claude/settings.json and the asks stop; the prompt itself says which line. Until this ships, the env var is the only knob that works today; the reply draft to Yotam says so.

he keeps running with permissions off to get through the night, which turns every other guard off too.

๐Ÿชž Lane 0b: Nir, the same plugin loaded three times user

Before updating: /ork:expect 8 times. After "Updated ork" and /reload-plugins: 5 times, and the reload line says 7 plugins, 248 skills, 79 agents, 307 hooks. ork is 106 skills and 36 agents, so at least two full copies are loaded. Reproduced here in an empty config dir, no spend:

installrows per commandwhy
ork@orchestkit alone (stable, v9.8.0)235 command wrappers still shipped on stable (#3541; removed on main by #3807)
plus ork-alpha@orchestkit3both entries install plugins/ork, both named ork, CC does not dedup
Nir, after update5fits 2 + 2 + 1: a third copy (older cache via a second settings scope) not yet updated; his claude plugin list settles it

a GA release drops stable to 1 row; a session-start notice says "N copies of ork are loaded, uninstall X"; the README says pick one entry, never both; CC gets an upstream dedup request.

every stable user sees 2x forever and anyone who tried alpha sees 3x or more.

๐Ÿงจ Lane 0d: a delete nothing watched user

On 18/08 Nir's agent ran find deploy/schema -name '*.sql' -size 0 -delete. A tracked SQL file was size 0, so it went, and the deploy broke. No guard has any find -delete or -exec rm pattern.

the command blocker asks first: "find with -delete removes every match, including tracked files; run it without -delete and read the list". In bypass mode it says so instead of asking.

the next size-0 tracked file goes the same way, silently.

๐Ÿ“‹ Lane 0e: the rest of Nir's month, with owners user

From his 1:1 chat and five recorded calls. Only the ork-shaped items get work here; the others get a named owner.

itemownerhere
duplicate issues, duplicate work across two windows, "decision badly overdue" nudge (19/08)herdr / platform (the string is not ork's)hand over
plugin 4 versions behind, wants one "Update all" (23/08)Claude Code owns /plugin updatesession-start notice names the command
two CLAUDE.md files to keep in sync (23/08)project setupnone
Windows terminal and ssh-per-server friction (20/08, 23/08)onboarding docsnone, mentioned in the reply
agent advised deleting an Ops Apps folder (31/08)agent advice, not a tool callLane 0d covers the tool-call side
"the thing I actually use on our RemoteICU every day" (27/08)quoted back

each complaint has one owner and the ork ones are in lanes 0a, 0b, 0d.

the same list comes back on the next call.

๐Ÿ“Œ Lane 1: the epic that says "3 of 5 pinned" paperwork

EPIC #3309's progress comment counts two pins that exist only in a generator nobody ran on this tree. Apply the generator, re-measure, close with the true five-row table.

tracked / generator-applied / runtime-read / CC-owned / doc-only, one per row, no prose counted as adoption.

the epic closes on a comment the ledger already caught twice as wrong.

๐Ÿ“ฐ Lane 2: 27 platform capabilities, 3 issues paperwork

21 already have verdicts (3 adopted, 4 later, 14 declined). Six are open: the Python SDK v1.0 (one real finding: anthropic>=0.40.0 floats across a major) and five that are not applicable to a plugin.

one audit file in the shape the CC lane already uses, three closing comments with the measurement, watcher untouched.

the three issues stay open and the next watcher run adds a fourth.

๐Ÿ” Lane 5a: PRs that heal their own conflicts code

Committed bundles must stay (installs read them from git, main is locked). So a workflow on every push to main rebases PRs whose only conflicts are generated files, rebuilds, and pushes. The same recipe run by hand three times in two days.

a conflicting PR gets CI again within minutes instead of silently getting none.

34 dist commits in 14 days keep every open hooks branch conflicting within a day.

๐ŸŒ Lane 3: four browser engines, one policy code

Only the Bash path is guarded today. Anthropic's API toolset cannot be seen by a plugin at all: declare it out of scope. The two MCP paths can be seen: wrap them.

engineseen by a hook?after
agent-browser CLI (Bash)yes, but $url tokens slip throughshell expansion asks, never silently allowed
agent-browser --mcp (153 opens logged)nobrowser URL guard
claude-in-chrome (39 navigations logged)nobrowser URL guard
browser_toolset_20260801 (Messages API)impossibleout of scope, stated in the skill and pinned by a test

blocklist, rate limit, robots and canonical URL form live in one module both guards call.

three of four engines stay invisible to every blocking hook.

โœ… Lane 4 and 5b: record what was measured, tidy two rows paperwork

"Which guards become prompt hooks?" was measured on 08-29: the regex guards were right 142/142 and 23/23, the prompt hook 129 and 22, at 5 seconds a call. Answer: none. Cache TTL already shipped on 5 agents; the restricted lane already runs in CI.

wave 2 closes with numbers; the stale 2.1.219 queue row goes; #3462 gets the checklist it never had.

an answered question keeps blocking a wave on the architecture page.

๐ŸŽ› Three defaults, flip any of them

The plan runs with the first option of each unless you change it here and paste the bar.

#3629 browser toolset position

#3578 committed dist policy

EPIC #3309 close