{"slug":"fastapi-rest-of-the-owl","title":"fastapi-rest-of-the-owl","summary":"Use when the user hands you a task definition and wants the ENTIRE development loop run end-to-end — plan, implement, review and fix, QA the change with evidence appropriate to it, open a humanized PR, then poll CI and code review, fixing and resolving until the PR is green and c","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-02T16:34:54.029323Z","repo":{"url":"https://github.com/steph-dove/klaussy-agents","stars":16,"forks":0,"license":"MIT","updatedAt":"2026-09-27T19:24:09Z"},"bodyHtml":"<hr>\n<h2>name: fastapi-rest-of-the-owl\ndescription: Use when the user hands you a task definition and wants the ENTIRE development loop run end-to-end — plan, implement, review and fix, QA the change with evidence appropriate to it, open a humanized PR, then poll CI and code review, fixing and resolving until the PR is green and clean. Does everything except merge. Long-running and autonomous; the human keeps the merge button. Also known as <code>klaussy-rest-of-the-owl</code>.</h2>\n<blockquote>\n<p><strong>Adapted for Cline.</strong></p>\n<ul>\n<li>This skill orchestrates parallel sub-agents using Claude's <code>Agent</code> tool / <code>subagent_type</code> syntax. Most coding agents now have their own parallel sub-agent or task mechanism (e.g. Cursor's <code>Task</code>, Codex's <code>spawn_agent</code>, Gemini subagents, Copilot's <code>task</code>) — use yours and translate the wording. If it truly has none, apply each lens or angle yourself, sequentially, and combine the findings.</li>\n<li>Where it references \"plan mode\" or <code>ExitPlanMode</code>, use your agent's own plan/approval mode if it has one; otherwise present your plan and wait for explicit approval before editing any files.</li>\n</ul>\n</blockquote>\n<h2>Task</h2>\n<p><code>$ARGUMENTS</code></p>\n<p>If <code>$ARGUMENTS</code> is empty, use the task definition the user pasted into the conversation (a ticket, a design note, a one-line ask). If there is none, stop and ask for one — this skill needs a target.</p>\n<h2>The bit</h2>\n<p><em>How to draw an owl: (1) draw two circles. (2) draw the rest of the owl.</em> The user just handed you the two circles. This skill draws the rest: the whole lifecycle from \"here's what I want\" to \"here's a green, reviewed PR waiting for your merge\", including the enormous unglamorous middle the meme skips.</p>\n<p><strong>It does everything except merge.</strong> The merge button stays with the human. Never merge, never force-push over someone else's work, never mark the PR ready-to-merge on the user's behalf.</p>\n<h2>How this skill works</h2>\n<p>You are an orchestrator. Each phase below names the sibling skill that owns that work: open that skill's <code>SKILL.md</code>, follow it, come back here. This file holds the sequence and the gates between phases, not the steps — where a phase and its skill disagree, the skill wins on <em>how</em> and this file wins on <em>when to stop</em>.</p>\n<p>Track the run with TodoWrite: one todo per phase, <code>in_progress</code> when you start it, <code>completed</code> when it's done. The flow is long and mostly unattended; the todo list is how the user follows along.</p>\n<p><strong>Close every phase in the chat.</strong> When a phase's gate is met, write one line saying so before you start the next: <code>Phase 3 done: review clean, 2 findings fixed, suite green.</code> The todo list alone doesn't reach a user reading the transcript or a run's final output, and a turn that ends on a tool call with no text looks like a hang.</p>\n<p><strong>Keep the main context lean.</strong> Everything you read stays in this conversation and is re-read on every later turn, so hand the read-heavy phases (review, self-review, QA) to a sub-agent when your agent has one. Give it the skill to follow, the base branch, and the exact shape of what to return, and tell it that shape replaces the skill's own output section and that it reports rather than stopping to ask; it returns a short summary and you act on that. Two exceptions run inline: an agent with no sub-agents, and a review of 150 or more reviewable lines, which takes review's parallel path (a sub-agent can't start sub-agents of its own).</p>\n<h3>Where the owl overrides a skill's stopping points</h3>\n<p>The sibling skills are written to run on their own, so several end by handing back to the user. Inside the owl that hand-back is the next phase, not the end of the turn. These override the skills:</p>\n<ul>\n<li><strong>plan:</strong> its approval gate stands. Show the plan and wait for the user's OK; that is the one planned stop in the whole run. Skip its hand-off offer (\"want me to run the owl…?\"): once the plan is approved, exit plan mode and start Phase 2 in the same turn.</li>\n<li><strong>implement:</strong> the plan is already approved, so skip its Phases 1–3 and its <code>ExitPlanMode</code> request and start at Phase 4, working <code>plan.md</code> top to bottom.</li>\n<li><strong>review:</strong> in Phase 3 the branch may be unpushed or ahead of its remote; review local HEAD and say so rather than asking which to review. Its verdict comes back to you, not only to <code>REVIEW_OUTPUT.md</code>.</li>\n<li><strong>qa:</strong> when it finds nothing to observe at runtime (docs or config only), that's Phase 4 passing, not the run ending. Say so and go to Phase 5.</li>\n<li><strong>pr:</strong> it only writes <code>pr-description.md</code>. Open the request yourself with the adapter's create command, passing that file as the body.</li>\n<li><strong>address-review:</strong> its summary closes Phase 8, not the owl. Check CI again (Phase 7) and then land (Phase 9).</li>\n</ul>\n<p><strong>Stop and hand back</strong> — don't barrel ahead — whenever a phase hits something a human must decide: a missing secret or env var, an ambiguous requirement, a destructive migration, or a test failure that looks like a real bug in existing code rather than in your change.</p>\n<h2>Pre-flight</h2>\n<ol>\n<li><strong>Permissions.</strong> If routine dev permissions aren't configured for this worktree yet, run <strong><code>fastapi-grant-permissions</code></strong> so editing, tests, git and the forge CLI don't prompt all run.</li>\n<li><strong>Base branch.</strong> Decide once which branch this targets and use it as <code>&lt;base&gt;</code> everywhere, and say which you picked in the first progress update. A branch the task or user names wins, then the target of an existing request for this branch; otherwise resolve it:</li>\n</ol>\n<p><strong>If the <code>klaussy</code> command isn't found, run it as <code>python3 -m klaussy &lt;command&gt;</code></strong> (<code>python -m klaussy</code> on Windows, where <code>python3</code> is usually absent) <strong>before falling back any further</strong> — the package is often installed with only its script directory off PATH. Use the fallback named for that step when that fails too, and say which one you used: a fallback answers a narrower question than the command it stands in for.</p>\n<p><strong>Resolve the base first, by running the command.</strong> Every range below is against <code>&lt;base&gt;</code>. Run <code>klaussy base --explain</code> before any range and reuse its answer; if the <code>klaussy</code> command isn't found, try <code>python3 -m klaussy base --explain</code> (<code>python -m klaussy</code> on Windows), then <code>git symbolic-ref --short refs/remotes/origin/HEAD</code> without its <code>origin/</code> prefix, and <code>master</code> if that's empty too. <strong>Don't work the base out by eye.</strong> Picking the obvious branch gets the same answer most of the time and misses the case that matters: the command also reports branches <code>HEAD</code> may have been cut from, and a branch stacked on another one gets a range covering commits your change never added. If it names any, say so and ask which base to use rather than picking. Either way, state the base you used, and that you checked.</p>\n<h2>Phases</h2>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left\">#</th>\n<th style=\"text-align: left\">Follow</th>\n<th style=\"text-align: left\">Gate before moving on</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align: left\">1</td>\n<td style=\"text-align: left\"><strong><code>fastapi-plan</code></strong> (or <strong><code>fastapi-implement</code></strong>'s lighter planning for a small, single-surface task)</td>\n<td style=\"text-align: left\">An approved <code>plan.md</code>. Ask now if the task leaves a real ambiguity; a wrong assumption costs the whole owl. Keep the plan and any breaking-change notes as session notes per <strong><code>fastapi-session-context</code></strong>.</td>\n</tr>\n<tr>\n<td style=\"text-align: left\">2</td>\n<td style=\"text-align: left\"><strong><code>fastapi-implement</code></strong></td>\n<td style=\"text-align: left\">The plan's boxes are ticked and the suite is green. No scope creep beyond the task definition.</td>\n</tr>\n<tr>\n<td style=\"text-align: left\">3</td>\n<td style=\"text-align: left\"><strong><code>fastapi-review</code></strong> against <code>git diff &lt;base&gt;...HEAD</code>, then <strong><code>fastapi-self-review</code></strong></td>\n<td style=\"text-align: left\">Every finding you agree with is fixed, the rest noted with a reason, suite re-run. Sub-agent returns the verdict line and one line per finding (severity, <code>file:line</code>, fix).</td>\n</tr>\n<tr>\n<td style=\"text-align: left\">4</td>\n<td style=\"text-align: left\"><strong><code>fastapi-qa</code></strong></td>\n<td style=\"text-align: left\">QA is genuinely clean. Let the skill right-size the evidence; don't hand-pick it. Sub-agent returns each check with pass/fail, the artifacts folder, and any asset URLs for the PR body.</td>\n</tr>\n<tr>\n<td style=\"text-align: left\">5</td>\n<td style=\"text-align: left\"><strong><code>fastapi-pr</code></strong></td>\n<td style=\"text-align: left\">The request is open against <code>&lt;base&gt;</code>, its number and URL reported. Commit on a topic branch (never straight to <code>&lt;base&gt;</code>) and push first. Embed the QA evidence from Phase 4 in the body.</td>\n</tr>\n<tr>\n<td style=\"text-align: left\">6</td>\n<td style=\"text-align: left\"><strong><code>fastapi-review</code></strong> again, now that it's a real PR</td>\n<td style=\"text-align: left\">Findings fixed, committed, pushed. A PR at rest reads differently: integration seams and the change as a whole surface here.</td>\n</tr>\n<tr>\n<td style=\"text-align: left\">7</td>\n<td style=\"text-align: left\"><code>waiting.md</code>, then the adapter's CI commands</td>\n<td style=\"text-align: left\">Every check is green.</td>\n</tr>\n<tr>\n<td style=\"text-align: left\">8</td>\n<td style=\"text-align: left\"><code>waiting.md</code>, then <strong><code>fastapi-address-review</code></strong></td>\n<td style=\"text-align: left\">Every comment answered with a change or a reason. Pushing fixes re-triggers CI, so go back to 7 if anything goes red.</td>\n</tr>\n<tr>\n<td style=\"text-align: left\">9</td>\n<td style=\"text-align: left\">—</td>\n<td style=\"text-align: left\">Stop. Report and hand back.</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Phase 4 is a gate, not a formality.</strong> If QA shows the change is broken or ugly, go back to phase 2 or 3, fix it, and re-QA. Don't open a PR on a change QA has already failed and leave it for CI or the reviewer to catch.</p>\n<p><strong>Phase 7: fixing CI.</strong> Pull each failing check's logs with the adapter's log command and fix the real cause. A flaky check gets one re-run before you treat it as genuine. If a failure is in code your change didn't touch and can't have caused, stop and tell the user rather than guessing.</p>\n<p><strong>Phase 9: landing.</strong> Report the PR link, its check status, which review comments you addressed and how, the QA artifacts folder and anything still to attach by hand, and the one thing left: the user's merge. Mark all TodoWrite tasks complete. Say plainly if you stopped early and why. This report is the last thing in the run, so never end on a tool call: if you stop anywhere, for any reason, the report still gets written.</p>\n<h3>Forge commands (GitHub)</h3>\n<p><code>origin</code> points at GitHub, so the <code>gh</code> CLI is the adapter. Confirm a flag with <code>gh &lt;command&gt; --help</code> before running one you haven't used in this repo; CLI interfaces drift between versions.</p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left\">Need</th>\n<th style=\"text-align: left\">Command</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align: left\">Read a ticket</td>\n<td style=\"text-align: left\"><code>gh issue view &lt;n&gt; --comments</code></td>\n</tr>\n<tr>\n<td style=\"text-align: left\">Open a request</td>\n<td style=\"text-align: left\"><code>gh pr create --base &lt;branch&gt; --title &lt;title&gt; --body-file &lt;file&gt;</code></td>\n</tr>\n<tr>\n<td style=\"text-align: left\">Request status</td>\n<td style=\"text-align: left\"><code>gh pr view &lt;n&gt; --json state,mergeable,reviewDecision,baseRefName</code></td>\n</tr>\n<tr>\n<td style=\"text-align: left\">CI status</td>\n<td style=\"text-align: left\"><code>gh pr checks &lt;n&gt;</code>, then <code>gh run view &lt;run-id&gt; --log-failed</code> on a failure</td>\n</tr>\n<tr>\n<td style=\"text-align: left\">Retarget a request</td>\n<td style=\"text-align: left\"><code>gh pr edit &lt;n&gt; --base &lt;branch&gt;</code></td>\n</tr>\n</tbody>\n</table>\n<p><code>{owner}/{repo}</code> are placeholders <code>gh</code> fills from the current repo, leave them literal.</p>\n<h2>Rules</h2>\n<ul>\n<li><strong>Never merge, never mark ready-to-merge, never force-push over other commits.</strong> The human owns the merge.</li>\n<li><strong>No scope creep across the whole owl.</strong> The task definition is the contract. Fixing a review comment is in scope; rewriting an unrelated subsystem because you noticed it is not.</li>\n<li><strong>Don't fake green.</strong> Never disable, skip or <code>xfail</code> a test, loosen a lint rule, or <code>--no-verify</code> past a guard to make CI pass. A red check is information; fix the cause.</li>\n<li><strong>Stop for humans on human decisions</strong> — missing secrets, ambiguous requirements, destructive changes, or a failure that points at a pre-existing bug.</li>\n</ul>\n<p><strong>Humanize anything a human will read.</strong> Before prose ships — a PR body, a review comment or reply, a commit message, a changelog entry, docs — run it through the <code>fastapi-humanize</code> skill and use what comes back. That skill holds the rules; don't keep a second copy of them here.</p>\n<p><strong>The scrubber is not that pass.</strong> <code>klaussy humanize</code> deletes a fixed list of mechanical tells (dashes, filler openers, a few hedges) and changes nothing else. It can't cut a paragraph that shouldn't exist, turn a noun phrase back into a verb, drop the closing principle, or make three sentences one, and that's most of what makes prose read as generated. Anything a human will read gets the <code>fastapi-humanize</code> skill: cut, voice, check, then scrub. Running the CLI, or <code>klaussy humanize --check</code>, is not that pass and doesn't stand in for it.</p>\n<h2>When NOT to use</h2>\n<ul>\n<li>The user wants just one phase — planning, or a review, or a PR description. Use that skill directly; the full owl is overkill.</li>\n<li>The task isn't defined well enough to build unattended. Nail the definition down first (or use <strong><code>fastapi-plan</code></strong>, which forces the clarifying questions), then come back.</li>\n<li>The change must be merged, released, or deployed as part of the ask — this skill deliberately stops at the merge button. Do that step yourself, with a human in the loop.</li>\n</ul>\n","files":[{"path":"SKILL.md","sizeBytes":11905,"isText":true},{"path":"waiting.md","sizeBytes":2676,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-02T16:35:28.402003Z","sha256":"B6DC5FEACA1FEBB210C48328E6B175666BD56EAA10221A5765C65AFA5FBADFAF","sizeBytes":6738},"review":null,"source":{"repositoryUrl":"https://github.com/steph-dove/klaussy-agents","path":"examples/fastapi/.agents/skills/fastapi-rest-of-the-owl","license":"MIT","commit":"0f171fe35fba62c309b7881afed5925d0e34dd1c","subtreeSha":"9C301F0C11A0D408439CB2218BD5CDEDB06A9A35986DBD4E80D7F8C611FF0559","lastSyncedAt":"2026-10-02T16:34:50.3177Z"},"reviewedAt":"2026-10-02T16:36:57.995127Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/steph-dove/klaussy-agents/tree/main/examples/fastapi/.agents/skills/fastapi-rest-of-the-owl"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install steph-dove-klaussy-agents@llmmart"},{"target":"git","command":"git clone https://github.com/steph-dove/klaussy-agents.git"}]}