How an agency team shares one capability layer with different levels of access. The owner and the automation engineer build the tools; everyone else consumes them through scoped channels. Access is enforced at the channel, not inside each skill.
git push directly to main. The "build the tools" tier.Three columns, three levels of trust.
Column 1 — who the person is. The role they hold in the agency.
Column 2 — how they reach the tools. This is where access control actually lives. A full CLI user can do anything. A scoped CLI user can only touch specific repos and must go through pull requests. A Discord user never touches code at all — they just talk to a bot in a specific channel, and the channel decides what they are allowed to run.
Column 3 — what they are reaching. One shared capability layer: the GitHub repos that define the skills, the Claude Code runtime that executes them, and the external APIs the skills call. Everyone hits the same layer. The difference is how they get there.
Owner writes a blog post locally. Owner opens Claude Code CLI, runs /create-blog-post, the runtime invokes the skill, the skill edits a markdown file in the TMS repo, Owner pushes to main, Vercel deploys.
Content Writer writes a blog post via Discord. Writer types /write-post about X in #content-writing. The Discord bot checks the channel's permission list — /create-blog-post is on the allow list. The bot invokes the skill in the runtime. The runtime opens a pull request against the TMS content repo. The Content Lead reviews the PR. On approval, it merges and Vercel deploys.
Automation Engineer ships a new skill. Engineer clones the cc repo locally, writes ~/.claude/commands/new-skill.md, tests via full CLI, commits and pushes to main. The next time anyone's runtime reloads, the new skill is available to whichever channel has been granted it.
Account Manager pulls a client report. AM types /hottest-prospect gkp in #client-ops. The Discord bot checks the channel's permission list — /hottest-prospect is on the allow list, and the gkp scope matches what the channel is allowed to see. The runtime hits the GHL API, pulls contact data, returns the result to the channel as a message. The AM never touches a repo, never sees credentials, never sees any client the channel is not scoped to.
A Discord-only user cannot accidentally push to main, leak a token, or run a skill their channel does not expose. A scoped CLI user cannot bypass the PR process. The Automation Engineer cannot see client data unless their own channel grants it — the local CLI is for building tools, not running client queries. The Owner is the only role that sees everything, and that is on purpose.