Puppet
Walk into a project that has its own ad-hoc toolkit — skills, templates, conventions — built before (or beside) Yggdrasil, and take it over: orient on it, pick up its kit, and drive it as if you were its native agent.
A deliberate hack.
/puppethand-emulates what a real execution partner (Odin Codin') will eventually do natively — adopt a project's own layer and run it. Yggdrasil can't load a foreign project's.claude/skillsas live skills (Claude Code only auto-loads skills at session start, from the running project), so this reads them as plain documents and acts them out. Lossy by design — "do your best with what you have." It changes neither project beyond existing as a command, and retires once the real project-layer mechanism exists.
Gate — read-only by default. While puppeting, touch nothing in either project's real content — no edits, writes, or commits to the target or to Yggdrasil — unless Brad explicitly asks for a specific change. He drives every mutation. The one exception is puppet's own bookkeeping under
.puppet/(the onboarding cache,research/,.scratch/) — that gitignored workspace is yours to manage freely.
Don't stress. Puppet is a deliberate, explicit utility — Brad drives it consciously and signals mode boundaries himself. There is no formal "exit puppet mode" ritual, and you don't need to police the boundary or hedge every action against the Gate. When Brad explicitly asks for a Yggdrasil-side change (e.g. improving puppet itself, capturing a lesson), briefly call out that it crosses the read-only boundary, then continue as directed — a light acknowledgment, not a block and not silence. The Gate above is a default for unattended drift, not a tripwire to fret over.
Permissions model — what prompts and what doesn't. The
allowed-tools: [Read, Glob, Grep]frontmatter is a type-hint: it pre-approves the read tools (so scanning foreign trees is frictionless anywhere, even outside the session's path whitelists) but does not restrict the command —allowed-toolsonly ever grants, never limits. The read-only discipline is carried by the Gate above (the intent) plus the committed.claude/settings.json(the enforcement). settings.json pre-approves exactly two things:git clone(so/scryclones don't prompt) and Write/Edit under.puppet/**(the gitignored workspace). Everything else still prompts — every Write/Edit to either real project and every non-git cloneBash command — which is the human-in-the-loop boundary, by design.
This command only orients and takes over the role. It does not start doing
the target's work — that waits for Brad's go-ahead, exactly like /good-morning.
Steps
-
Parse the invocation. The argument after
/puppetis the target project's root directory (e.g.C:\Projects\XI-RE-VibeTesting). Anything beyond the path is optional direction. If no path was given, ask for one. -
Bootstrap Yggdrasil context inline — no briefing, no worktree, no pin. Load Yggdrasil's own context so this puppet session rides the real toolkit and gets logged, but do not delegate to
/good-morning— its session-worktree creation and checkpoint pin are for real Yggdrasil work sessions and would violate puppet's read-only, no-checkpoint stance. Do only this:- Read
working/current-plan.md(Yggdrasil's plan) for context/logging — the tool we're bringing. (Step 3 loads the target — the project we're bringing it to.) - Skip the briefing (this isn't a Yggdrasil work session).
- Create no session worktree and write no checkpoint/pin. Puppet is a read-only foreign adoption; none of good-morning's worktree-lifecycle or ledger-surfacing machinery applies.
- Read
-
Resolve the target's puppet directory, then load-or-build it. Encode the target path into a directory label: drop the drive colon and turn each path separator into a hyphen (
C:\Projects\XI-RE-VibeTesting→C-Projects-XI-RE-VibeTesting). The puppet dir is.puppet/<label>/. Then:- If
.puppet/<label>/PUPPET.mdexists → load it instead of re-scanning. It's the cached onboarding: read it, note itslast_scanneddate, and if it looks stale (or Brad asks), offer a fresh re-scan. - If it doesn't exist → do the full scan and build it (step 3a).
3a. Full scan (first time on a target) — assume a proto-toolkit "abomination." Read the foreign tree the way
/good-morningreads Yggdrasil:- Self-description & conventions — its
CLAUDE.md,AGENTS.md,README. - Its kit — inventory
.claude/skills/, anycommands/, templates. Read each skill enough to emulate it on demand (inert markdown to us — on-demand playbooks, not loaded capabilities). - Live state & open threads — plan docs, findings, scratch, TODOs.
- Git & write policy — read it explicitly.
Then write
.puppet/<label>/PUPPET.md— frontmattertarget:(the canonical path; the dir label is just a label) +last_scanned:(date) — containing: an emulated-skills index (skill · triggers · what it does), a notable-files index (one-liners; notable, not exhaustive), and the bulk, a self-generated onboarding summary ("skip the full scan; here's what you need to start"). Create the workspace subdirs under the puppet dir when first needed:research/(durable working store — cloned repos go underresearch/repos/, and artifacts Brad hands over for analysis go underresearch/artifacts/, the standing drop location) and.scratch/(throwaway working files). - If
-
Reconcile conventions — the target's house rules win in its own tree. While wearing the kit, follow the target's conventions (confidence rules, templates, terminology, version assumptions) over Yggdrasil's where they clash. (The source-fidelity convention — prefer
gh/git cloneover WebFetch — is auto-inherited from the personal layer and applies throughout.) -
Take over — wear the kit, then stand ready.
- Wear the kit: keep the target's emulated skills in hand. When a later
task matches one's triggers, act as though that skill were loaded — follow
its
SKILL.mdas your playbook for that task. - Surface the workspace paths: give Brad the puppet dir's full absolute
paths as part of standing ready — especially the artifacts drop-path
(
.puppet/<label>/research/artifacts/, rendered as an absolute path) where he hands you files for analysis. Do this on every run (cache-hit or fresh scan) so he never has to reconstruct the encoded label himself. - Stand ready: like
/good-morning, state where the project stands and what the immediate next step looks like — then stop. Don't start the target's work until Brad says go.
- Wear the kit: keep the target's emulated skills in hand. When a later
task matches one's triggers, act as though that skill were loaded — follow
its
What this command does NOT do
- No work execution. Orientation + role-takeover only; wait for a go-ahead.
- No native skill loading. It emulates the target's skills from their markdown; it does not install or activate them.
- No mutation of either project's real content. See the Gate — only
.puppet/bookkeeping is yours; everything else waits for Brad's explicit ask. - No Yggdrasil checkpoint. This isn't a Yggdrasil work session — don't pin or
commit Yggdrasil's
current-plan.mdon the way in.