Skills System
Overdeck’s skills system provides reusable workflows and best practices for AI agents. The dashboard’s Skills page lists every skill side by side per harness — hereOverdeck (108) and Claude (123) — with each skill’s on-disk path, internal name, and a sync indicator linking to its SKILL.md. It’s the quickest way to confirm a skill landed where the agent (or the conversation you’re driving) can invoke it.
What Are Skills
Skills are reusable, shareable workflows that encode best practices for common development tasks. They are:- Universal - Work across all AI coding tools (Claude Code, Codex, Cursor, Gemini CLI, Google Antigravity)
- Shareable - Distribute via
pan syncto sync to all connected AI tools - Contextual - Invoked with
/skill-namein AI tool prompts - Best-practice-driven - Encode proven workflows and checklists
/code-review-security and the agent follows the established workflow.
Built-In Skills
Overdeck ships with 70+ built-in skills organized by category:Development Workflows
AI Self-Monitoring
Overdeck Operations (pan-*)
Utilities
Using Skills
Skills are invoked via slash commands in any AI coding tool:Creating Custom Skills
Skills are markdown files stored in~/.overdeck/skills/. Create your own with:
/pan-skill-creator for guided creation.
Skill Distribution
Skills can be distributed via:- Project-specific - Store in
.overdeck/skills/in your repo - User-specific - Store in
~/.overdeck/skills/(synced to AI tools) - Team-shared - Commit to version control and share via git
- Public packages - Distribute via npm or GitHub
Syncing Skills
pan sync command:
- Copies skills from
~/.overdeck/skills/to each AI tool’s config directory - Updates existing skills if versions differ
- Removes manifest-managed skills from harness directories after their bundled source is removed
- Preserves user-owned and user-modified files, reporting modified stale files instead of deleting them
- Ignores empty bundled skill directories so they do not reappear in caches or harness targets
Turning skills on and off
Every skill has an on/off state that you can set at three levels: a global default, a project override, and an issue override. A conversation can also carry its own values, the narrowest level of all. The narrowest level that has a value wins: conversation > issue > project > global > default (on) A skill with no value at any level is on. The global level is two-state: a skill is either on (no stored value) or off. Project and issue levels are three-state: Inherit, On, or Off, so a project can turn on a skill that is off globally, and an issue can turn off a skill its project turned on. Conversation values are set only when the conversation is created, in the New conversation with options… dialog (see Conversations). They are stored on the conversation row and applied at every launch, resume, restart and fork of that conversation. A conversation value for a pack skill (pack/skill) beats every level and every pack toggle, so a conversation can turn on one opt-in pack skill for itself. Core skills ignore conversation values too.
Core skills are always on
The pipeline depends on these 11 skills, so they are always on and cannot be overridden at any level:pan, pan-done, pan-flywheel, pan-foreman, pan-plan, pan-start, pan-task, pan-tell, pan-worker, work-complete, write-xbrief
Where each level is stored
Clearing the last override for an issue deletes its file and commits the deletion. Skills that exist only in a project’s
.pan/skills/ directory are project skills: they appear in that project’s settings and its issues, never on the global Skills page.
From the CLI
pan skills set <skill> on clears the override, because on is the default. Setting a core skill, an unknown skill, an unregistered project, or an issue that no registered project owns fails with an error.
From the dashboard
- Skills page (sidebar → Skills): every skill with a global on/off switch. Each row notes when projects or issues override it, and the Overridden below filter lists those skills.
- Project settings → Skills: Inherit / On / Off for every skill in that project. The Inherit button shows the value it inherits, for example
Inherit (off via global). - Issue view → Skills for this issue: the same controls for one issue, in the issue’s Overview. It opens filtered to skills overridden here or off at launch; select All to see the rest. The section is hidden for an issue that no registered project owns.
When changes apply
Overrides are resolved when Overdeck launches an agent. They apply to Overdeck-managed Claude Code and Codex sessions at their next launch (a fresh start or a resume). A running agent keeps the skills it launched with.- Claude Code launches receive
--settings '{"skillOverrides":{"<skill>":"off"}}', which hides every copy of the skill by name. - Codex launches get
[[skills.config]] name = "<skill>" enabled = falseentries in the agent’s own$CODEX_HOME/config.toml.
pan sync still installs every skill everywhere; hiding happens per launch, and no skill files are copied, moved, or deleted.
Skill packs
A skill pack is a third-party git repository of skills, such as eltmon/skills, a fork of mattpocock/skills. Overdeck pins each pack to one commit you approve, caches that commit, and mounts the pack skills you turn on into each launch through the harness’s own plugin system. Pack skills are never copied into~/.claude/skills or ~/.agents/skills, so they cannot collide with Overdeck’s own skills or leak into sessions you start outside Overdeck.
Adding a pack
Trust this commit? [y/N]. Without a terminal, pass --yes; otherwise nothing is written. The pack id must match [a-z0-9][a-z0-9-]* and cannot be a core skill name. Overdeck picks the adapter itself (the known-pack default, else claude-plugin when the repo has .claude-plugin/plugin.json, otherwise plain); pass --adapter plain|claude-plugin|deft-readonly to choose. A repository cannot register a pack by committing a file; only pan skills pack add can.
Pinning and updates
The registry stores the ref you asked for (a tag or a branch) and the trusted commit you approved. Every launch mounts exactly the trusted commit, even if the tag or branch moves.update prints the preview again with the skills added, removed, and changed since the trusted commit, plus any capabilities that are new. It moves the trusted commit only after you confirm. pan skills pack list shows when the ref has moved (update available); --offline skips that network check.
Matt Pocock’s skills from a fork
Overdeck’s default source for themattpocock pack is the operator-controlled fork eltmon/skills, pinned to the v1.2.3 commit. A fork lets the operator decide when upstream changes arrive: sync the fork on GitHub, then run pan skills pack update mattpocock --ref <tag> to preview and re-pin. Any url works here; KNOWN_PACKS applies the mattpocock defaults by pack id, not by url.
setup-matt-pocock-skills is opt-in: turning the pack on never turns it on. Only pan skills set mattpocock/setup-matt-pocock-skills on [--project <key>|--issue <id>] does.
Names: pack/skill and pack:skill
Overdeck names a pack skill pack/skill, for example mattpocock/grilling. You use that id in the CLI, the dashboard, and the override files. The agent sees the skill as pack:skill (mattpocock:grilling), because the harness namespaces plugin skills. Overdeck’s own grilling and mattpocock:grilling can both be present in the same session.
Turning packs and pack skills on
Pack skills are off until you turn them on. You can turn on a whole pack or single skills, at the same three levels as other skills:
Opt-in skills are skills that change files Overdeck owns, such as
setup-matt-pocock-skills, which edits CLAUDE.md/AGENTS.md and writes tracker docs. The pack toggle never turns them on; only a value for that skill does.
What is not applied
Overdeck mounts skill directories only. If a pack also carries hooks, MCP servers, commands, agents, context injection, git hooks, or scripts, the preview and the dashboard list them as Not applied, and none of them reach the agent. Scripts inside a skill directory are copied with the skill but never run by Overdeck.Where pack state is stored
The cache lives in
~/.overdeck/packs/ and can be rebuilt at any time: pan skills pack sync [id] re-fetches it, and pan skills pack gc [--max-age-days <n>] removes mounts no launch uses. pan skills pack remove <id> unregisters a pack, clears its global toggle and global skill values, and deletes its cache; project and issue values stay but do nothing until the pack is added again.
When pack changes apply
Packs apply to Overdeck-managed Claude Code and Codex sessions at their next launch, like other skill changes. Claude Code receives the pack as--plugin-dir; Codex gets a local overdeck-packs plugin marketplace in the agent’s own $CODEX_HOME. Remote (Fly) launches and other harnesses get no packs. A launch never touches the network: if the trusted commit is not cached, the launch skips that pack and prints run pan skills pack sync <id>. If Claude Code also has the same upstream plugin installed, the dashboard warns that its skills will appear twice.
In the dashboard, packs appear above the skill list on the Skills page, in project settings, and in the issue view. The dashboard can turn packs on and off but not add them; it shows the pan skills pack add command instead.
SageOx
SageOx records coding-agent sessions and syncs them to a team ledger. Overdeck offers it as thesageox pack, built from the operator’s fork eltmon/ox. The fork adds a host-managed mode: with OX_HOST_MANAGED=1, ox writes nothing into the repository (no AGENTS.md/CLAUDE.md markers, no .claude/settings.json hooks), adds no attribution to commits or PRs, never asks the agent to run ox init, and stays offline unless Overdeck allows the network.
SageOx is off by default, for every project and issue. It works with Claude Code launches only; Codex launches never get SageOx skills or hooks, and print a warning when the pack would have been on.
What leaves the machine:
SageOx records agent sessions on this machine. With uploads off (the default) Overdeck runsThe Skills page shows the same text on theoxwith the network off: nothing is sent. With uploads on for a project, redacted session transcripts and session metadata are uploaded to the SageOx cloud ledger for that repo, andoxmay fetch team context. Requires the eltmon/ox build; seepan doctor.
sageox pack row.
One-time setup
-
Build
oxfrom the fork, at the commit the pack trusts. Overdeck never installsox. The fork needs Go 1.26 (the defaultGOTOOLCHAIN=autodownloads it). -
Register the pack (the ref is a branch or tag in the fork):
The repo-writing skills (
ox-cli-init,ox-cli-attest,ox-cli-skill-manager,ox-cli-pr-header,ox-cli-plan, and theox-cli-cart*skills) are opt-in: the pack toggle never turns them on. -
In each repository you choose, log in and initialize SageOx yourself, once. Overdeck never runs these commands. Host-managed
ox initwrites only.sageox/(noAGENTS.md/CLAUDE.mdmarkers, no hook files, no git hooks). It registers the repository with SageOx, so it needs the network:Session recording writes into a local clone of the project’s SageOx ledger. The ox daemon thatox initstarts clones it; wait untilox statusshows the ledger. With uploads off, Overdeck keepsoxoffline and no daemon runs, so without this clone SageOx records nothing. -
Turn the pack on for that project (or one issue):
Uploads
Uploads are a second, separate opt-in per project. They are off until you turn them on:status shows, for each project, whether the pack is on (and from which level) and whether uploads are enabled. With uploads off, Overdeck sets OX_HOST_NETWORK=off and OX_SESSION_PUBLISHING=manual, so sessions stay on this machine. With uploads on, it sets OX_HOST_NETWORK=on and OX_SESSION_PUBLISHING=auto.
What a launch gets
When the pack is on for a Claude Code launch, Overdeck checks two more things at launch time: the launch’s git root has a.sageox/ directory, and the ox on PATH answers ox host-contract --json within 2 seconds. When all hold, the launch’s --settings JSON carries:
- the env
OX_HOST_MANAGED=1,OX_PROJECT_ROOT=<git root>,OX_HOST_NETWORK,OX_SESSION_PUBLISHING,SAGEOX_TELEMETRY=false,SAGEOX_FRICTION=false,SAGEOX_DAEMON=false, andOX_NO_DAEMON=1; - one
ox agent hook <event>hook for each ofSessionStart,PreCompact,PostToolUse,Stop,SessionEnd, andUserPromptSubmit, with the same env written inline in each hook command; - the
sageoxpack skills you turned on.
sageox skills, and one [launcher] WARNING: line naming the reason. Turning the pack off removes all of it at the next launch.
What pan doctor checks
When the sageox pack is registered, pan doctor adds a SageOx (ox) row. It is ok when ox answers the overdeck-host/1 contract and was built from the pack’s trusted commit. It warns, with the build command as the fix, when ox is missing, is upstream ox without the host contract, or was built from a different commit. Without the pack, there is no row.
Deft
Deft’s skills depend on its engine and project files, so Overdeck mounts only a read-only subset through thedeft-readonly adapter; see Deft Directive.
Deft Directive
Deft Directive is a process engine.directive init installs it by writing tracked files into a repository: an AGENTS.md managed section, agent hooks that call deft-hook, .githooks/ with core.hooksPath, a package.json pin of @deftai/directive, deft-directive-* pointer skills, and an xbrief/ tree. A repository with that deposit is a Directive project.
Overdeck never runs a Deft CLI, never installs the engine, and never writes a tracked file in any project. It offers three levels:
Adding the deft pack
deft is a known pack, so Overdeck picks the deft-readonly adapter. The preview lists Skills 7 and Not applied hooks, context injection, git hooks, requires CLI (directive). The adapter reads content/skills/deft-directive-<name>/SKILL.md at the trusted commit and keeps only the read-only allowlist. Each skill is named by its stripped name, so the agent sees deft:glossary, never deft:deft-directive-glossary, and Overdeck’s id is deft/glossary.
Skill map
Every Deft skill has one class. Onlycompatible and translated skills are mounted. A skill that appears at a newer pinned commit and is not in this map is excluded as unreviewed. The map is verified at eltmon/directive 48e8cbf (v0.119.10-16).
Host notice and CLI deny
The mount inserts a host notice after the frontmatter of every mounted DeftSKILL.md. It tells the agent not to run directive init, directive update, directive bootstrap, or deft session:start; not to install packages, change git hooks or core.hooksPath, edit AGENTS.md, or write under xbrief/; that Overdeck owns planning (.pan/specs), worktrees, review, and merge; to skip a task or deft step that is not installed and report in chat; and not to write repository files unless the operator asks. It also lists the Overdeck equivalent of each conflicting Deft skill.
When a Claude Code launch mounts any deft/* skill in a project that is not a Directive project, the launch settings also deny Deft’s mutating CLIs:
What a launch does in a Directive project
Each Overdeck-managed Claude Code or Codex launch detects a Directive project at the launch directory’s repository root. Detection reads files only (.deft/core/VERSION, the AGENTS.md managed-section marker, or the @deftai/directive pin) and is never stored. Explicit off means the deft pack toggle resolves off at the issue or project level. The default (no value anywhere) is not explicit off, and the global level has no off value, so it never is.
The kill switch is Deft’s own
.deft-directive-disable root file, honored by engines from v0.92.0 when the file is untracked. Overdeck writes it only when the launch runs in an issue worktree (workspaces/feature-<issue>/). The file starts with # overdeck:deft-directive-disable, and Overdeck adds /.deft-directive-disable to the repository’s .git/info/exclude when nothing ignores it yet, so git status stays clean. When the toggle goes back to on or inherit, Overdeck deletes the flag only if its first line is that marker; a flag you wrote yourself is never touched, and a tracked flag is never changed. Review agents, test agents, and conversations launched at the project root get the environment variable only.
A launch prints one provenance line to stderr, for example [launcher] deft: pack master (48e8cbf0e781); project directive engine ^0.119.10; kill switch. If anything in the Deft step fails, the launch prints [launcher] WARNING: deft integration not applied: <message>, removes the Deft env file, and continues with its other skill settings and packs.
Managed mode
Managed mode is a per-project decision: Deft methodology on, with Overdeck owning worktrees, review, merge, and the pipeline xBRIEF.enable refuses a project that is not a Directive project (Overdeck never runs directive init). It prints the ownership report, one owner per concern (xbrief, context, agent hooks, git hooks, worktrees, gates, task state, review, release, skills, workspace settings), and asks Enable managed mode with this ownership plan? [y/N]. Without a terminal, pass --yes; otherwise nothing is written. It stores only projects.<key>.deft_integration: { mode: managed, plan_digest, enabled_at } in ~/.overdeck/projects.yaml, where plan_digest is the sha256 of the report text you saw. Launches in a managed project that is not off export DEFT_ORCHESTRATOR=overdeck.
Environment contract
Overdeck exports at most these two literal lines, from a per-launch env file that the launcher reads with an allowlist and never sources:
Both variables are a no-op until your project pins an engine that reads them (PAN-4425). The flag file works on every engine from v0.92.0.
Limits
- Git hooks. The deposited
.githooks/pre-commitrunsdeft verify:branchand does not check the kill switch; whetherverify:branchitself reads it is unverified. Feature-branch commits passverify:branch. Main-branch plan-artifact commits in a Directive plan home may be refused. - Workspace settings. In a Directive project
.claude/settings.jsonis a tracked Deft deposit, and Overdeck’s workspace creation merges its own hooks into it, which leaves that file modified in the worktree. - Scope. Detection runs at the launch directory’s repository root only, not in polyrepo sub-repositories. There is no conversation-level toggle; conversations inherit global and project toggles.
Subagents
Overdeck includes specialized subagent templates for common development tasks. Subagents are invoked via the Task tool or convoy orchestration for parallel execution.Code Review Subagents
Usage Example:
Planning & Exploration Subagents
Overdeck ships no custom planning or exploration subagent files. Planning runs as theplan role (roles/plan.md), and any role that needs parallel read-only exploration uses Claude Code’s built-in Explore and general-purpose subagent types, which inherit the parent session’s model and provider routing. Custom .claude/agents/ files with a pinned model: broke under CLIProxy-routed sessions; see the “Why no ambient subagents” section in docs/ROLES.md.
Best Practices
When creating skills:- Be specific - Include exact commands, not just concepts
- Include examples - Show concrete usage patterns
- Add checklists - Help agents verify completion
- Cross-reference - Link to related skills and guides
- Test thoroughly - Verify skills work end-to-end
- Invoke early - Start with a skill, don’t switch mid-task
- Follow fully - Don’t skip steps or customize on-the-fly
- Report issues - If a skill doesn’t work, improve it
- Combine wisely - Some skills complement each other, others conflict
Related Guides
- Creating Skills - Detailed skill creation guide
- Convoys - Parallel subagent execution
- Subagents - Custom subagent templates