[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71EMJ1TRHHAJBY451TYWEY3":3,"skill-same:01M71EMJ1TRHHAJBY451TYWEY3":423},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":14,"repositoryHtmlUrl":42,"repositoryHomepageUrl":6,"ownerHtmlUrl":43,"ownerBlogUrl":44,"ownerDescription":45,"updatedAt":46,"install":47,"resources":60},"01M71EMJ1TRHHAJBY451TYWEY3","patina-mode",null,"Patina Project's engineering style for concise, detailed responses, deliberate subagents, unslopped prose, simple code, and verified work. Use for \u002Fpatina-mode or requests to work in this style.","patinaproject\u002Fskills","patinaproject","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F229996889?v=4","01M71E58JKTDNY1138WYZK44TR","Patina Project","01M71E58K5GH4K16MV6A8BQ6NZ",1,"MIT","https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"mode","patina mode","for","project","use","code","work","simple","style","requests","concise","verified","prose","engineering","subagents","2026-11-10 10:12:30",false,"---\nname: patina-mode\ndescription: Patina Project's engineering style for concise, detailed responses, deliberate subagents, unslopped prose, simple code, and verified work. Use for \u002Fpatina-mode or requests to work in this style.\n---\n\n# Patina mode\n\n## Platform Adaptation\n\nThese skills use Claude Code tool names (the `Skill` tool, the `Agent` tool, `AskUserQuestion`) and the Claude model names the `Agent` tool accepts, as each Models section lists them. On Claude Code they work as written. On Codex, read [`references\u002Fcodex-tools.md`](references\u002Fcodex-tools.md) for the Codex equivalent of a Claude tool, model, or skill named by these workflows. On Pi, read [`references\u002Fpi-tools.md`](references\u002Fpi-tools.md) instead. On GitHub Copilot, CLI or app, read [`references\u002Fcopilot-tools.md`](references\u002Fcopilot-tools.md) instead. Other runtimes can discover the same Agent Skills tree, but they must use their own tool, model, and configuration equivalents. No one of these mappings is a cross-runtime map.\n\nOn Codex, patina-mode requires the `multi_agent` feature. Before selecting a\nplaybook or changing anything, confirm that `spawn_agent` is available. If it\nis unavailable, stop and tell the user to set `multi_agent = true` under\n`[features]` in `~\u002F.codex\u002Fconfig.toml`, then restart Codex. Do not continue with\na sequential substitute.\n\nUse the session's task-tracking tools for the todolist. On Claude Code these are `TaskCreate` and `TaskUpdate`, or `TodoWrite` when configured. Availability depends on the model; `CLAUDE_CODE_ENABLE_TODO_TOOLS=1` enables them through the environment or a project's `.claude\u002Fsettings.local.json` `env` block. See the [task-tool documentation](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Ftools-reference#task-tool-availability). If no task-tracking tool is available, keep an uncommitted `todo.md` Markdown checklist in the work dir, next to the decision trail, with the playbook steps verbatim and each `skip: \u003Creason>` line. When several sessions share the checkout, name it `.audit\u002F\u003Ctask-slug>.todo.md`, beside that session's `.audit\u002F\u003Ctask-slug>.tsv` trail, so they never write one file.\n\n## Playbooks\n\nRoute before you act. Match the task to a playbook below and open its file. Open a todolist whose first items are its steps, copied in verbatim, before any task-specific todos. Do this before the first file edit or commit. A step you choose not to do stays in the list with a one-line `skip: \u003Creason>`.\n\n**A code change routes to its build playbook:** Bug fix, Feature, Refactoring, Perf issue, Hillclimb, or Visual parity. A request to implement an issue and open a pull request is that build task when neither continuation case below holds. **Opening a PR** is the build playbook's last step, never the route for the code. Prototype sketches and Babysit repairs keep their own playbooks. Who writes the code follows **A subagent writes the code** in **Subagents**.\n\n**Issue-linked work that continues a branch routes through Session pickup.** After **working-on-issues** passes, check the remote canonical branch it resolved and fetched. When that branch has an open pull request, Session pickup routes the work to the Babysit playbook. Babysit step 1 picks the mode, and an undeclared mode is `drive`. The unattended issue run counts as the request that starts babysitting, and the issue run's own thread runs Babysit, not a phase subagent. When the branch has commits beyond the default branch and no open pull request, Session pickup routes the work to the remaining steps of the build playbook that the work matches, then to **Opening a PR**. When the branch does not exist or has no commits beyond the default branch, the build route above applies unchanged.\n\n**Every repository change an issue run makes routes through a playbook**, including docs, tests, config, and dependency updates. Route each by its effect:\n\n- An edit to a SKILL.md, a playbook, or another agent-facing doc goes to **Authoring or modifying a skill**.\n- A test or config change that keeps behavior goes to **Refactoring**. Its step 1 may take a `skip:` line when there is no behavior to pin.\n- A dependency update, or a config change that alters behavior, goes to **Bug fix** or **Feature** by its effect.\n- Anything else goes to **figure-it-out**.\n\nA large or cross-cutting effort (a migration across many call sites, an ambitious multi-part change), or work the user steps away from to trust later, routes to the **figure-it-out** skill even when a narrower playbook like Feature fits. Use **figure-it-out** whenever no bundled playbook fits. It designs a bespoke, rigorous playbook for the task. A standing project-scale program (multi-day, many stacked PRs, a fleet of subagents under one coordinator) routes to **Orchestrate** instead. figure-it-out designs one bespoke run, orchestrate runs the program.\n\n- **Investigation.** Read-only question: how does X work, why was Y built this way, are we sure about Z, should we do X or Y. `playbooks\u002Finvestigation.md`.\n- **Triage.** Unattended triage of one existing tracker issue to a ready label or one round of questions, without implementing it (\"triage this issue\", \"Triage Linear issue … Do not implement it.\"). People triaging by hand use the Work plugin's triage skill instead. `playbooks\u002Ftriage.md`.\n- **Bug fix.** A reported defect to reproduce, root-cause, and fix with runtime evidence. `playbooks\u002Fbug-fix.md`.\n- **Perf issue.** A measured slowness to trace and improve against a baseline. `playbooks\u002Fperf-issue.md`.\n- **Hillclimb.** Sustained, scientific improvement of one metric against a target: loop hypotheses with before\u002Fafter measurement, a decision log, and one commit per accepted win. Distinct from Perf issue, which is a one-off fix. `playbooks\u002Fhillclimb.md`.\n- **Runtime forensics.** Diagnose a runtime symptom (leak, idle-CPU spin, glitch) from live instrumentation. The deliverable is a diagnosis, not a fix. `playbooks\u002Fruntime-forensics.md`.\n- **Trace forensics.** Diagnose a captured profiling artifact (cpuprofile, trace, spindump, heap snapshot) handed to you after the fact. The deliverable is a diagnosis, not a fix. `playbooks\u002Ftrace-forensics.md`.\n- **Feature.** New or changed behavior, built from a named data shape. `playbooks\u002Ffeature.md`.\n- **Refactoring.** A behavior-preserving change to structure or shape (rename, extract, inline, dedupe, move). `playbooks\u002Frefactoring.md`.\n- **Prototype.** A throwaway sketch to make a design or behavioral decision cheaply, or to settle an empirical fork by observing it instead of asking the human (\"prototype\", \"mock it up\", \"try this layout\", \"sketch it to decide\"). `playbooks\u002Fprototype.md`.\n- **Visual parity.** Pixel-exact UI equivalence: matching two implementations or migrating a styling system. `playbooks\u002Fvisual-parity.md`.\n- **Authoring or modifying a skill.** Writing or editing a SKILL.md. `playbooks\u002Fauthoring-a-skill.md`.\n- **Eval.** Testing how a skill, structure, or prompt change affects agent behavior before promoting it. `playbooks\u002Feval.md`.\n- **Babysit.** Driving a PR or a stack to merge-ready: conflicts, review threads, CI. `playbooks\u002Fbabysit.md`.\n- **Shipping.** The half after Babysit. Independently verifying a green stack, then landing the contiguous verified run bottom-up through `gh` by default or Origin when its CLI is available. `playbooks\u002Fshipping.md`.\n- **Autonomous run.** A long task to drive to completion without stopping (\"run until done\", \"\u002Floop until X\"). `playbooks\u002Fautonomous-run.md`.\n- **Orchestrate.** A standing project handed to one coordinator chat: multi-day, many stacked PRs, dozens to hundreds of subagents, minimal human turns (\"run this whole project\", \"own this migration until it lands\"). Distinct from Autonomous run, which drives one task to a predicate. Work one agent could finish inside the session's budget routes there, not here, however program-shaped the phrasing sounds. `playbooks\u002Forchestrate.md`.\n- **Autopilot-full.** A queue of independent PRs driven to merge-ready with full autonomy. One owner per PR carries build to merge-ready, the root swarm-verifies each PR, an owner runs `pr-readiness publish` only after the root's clean verdict, and the operator clicks the merge of each PR that `publish` does not arm (\"autopilot this queue\", \"full autopilot\", one-owner-per-PR programs). `playbooks\u002Fautopilot-full.md`.\n- **Autopilot-stack.** A queue of changes built and verified with full autonomy, delivered as one linear reviewed base-branch stack the operator lands (\"autopilot-stack\", \"stack them, don't ship\", \"build the stack, I'll land it\"). `playbooks\u002Fautopilot-stack.md`.\n- **Session pickup.** Resuming or taking over a prior agent's in-flight work from a transcript, cloud-agent URL, or pushed branch. `playbooks\u002Fsession-pickup.md`.\n- **Pause safely.** Suspending in-flight work cleanly so it can be resumed, on an explicit pause, going offline, a session restart, or imminent context compaction. The complement to Session pickup. Full steps: `playbooks\u002Fpause-safely.md`.\n- **Multi-phase or multi-PR plan.** Work that spans phases or stacked PRs. `playbooks\u002Fmulti-phase-plan.md`.\n- **Worktree and simulator cleanup.** Reclaiming local disk by pruning merged or abandoned git worktrees and stale iOS simulators (\"what's using my disk\", \"clean up worktrees\", \"prune safe-to-prune worktrees\", \"free up space\", \"delete old simulators\"). `playbooks\u002Fworktree-cleanup.md`.\n- **Opening a PR.** Invoked at the end of every other playbook. It routes alone only for work already built. `playbooks\u002Fopening-a-pr.md`.\n\n**Project playbooks.** A repository can add playbooks of its own under `.agents\u002Fplaybooks\u002F`, one Markdown file each. Its frontmatter names `extends`, the bundled playbook stems it builds on (comma-separated, or empty for a standalone playbook), and `when`, one sentence naming the requests it serves. When the playbook you match is one a project playbook extends, or the task fits a project playbook's `when`, open that file as well. Copy the bundled steps into the todolist verbatim, then apply each change at the step its quoted text names, and stop where the project playbook says to stop. A change is a list item that starts with `**After**`, `**Before**`, `**Replace**` or `**In**` followed by a quoted run of the bundled step's own words. Before you apply a project playbook, run `node \u003Cpatina-mode-base>\u002Fscripts\u002Fcheck-playbooks.mjs` from the repository root. It fails when a project playbook extends a playbook this version lacks, or quotes step text this version no longer has, which happens when a pstack upgrade rewrites a step. Report each line it prints to the user and do not guess where an unanchored change belongs.\n\n## Non-negotiables\n\nThe Principles section below grounds every trigger. Keep principle choices, routing decisions, skip reasons, and throughput notes in the private task record. Explain them to the user only when asked or when the reasoning affects a decision the user must make. Cite only principles whose leaf SKILL.md you read this session.\n\nWhile patina-mode is active, this skill owns workflow routing. Use only the\nskills and playbooks named here. Do not substitute another development, repair,\nreview, or pull request controller because it is installed.\n\nEvery skill named in this document and its playbooks is the Code\nplugin's. Invoke it by its bare name, such as `patina-mode`. An Agent Skills\ninstall registers bare names only, so a `plugin:skill` name for a Code\nskill does not resolve there. The exceptions are the references already\ncarrying their own namespace, such as `plugin-dev:skill-development`, and the\nClaude Code built-in driver skills `run` and `verify`. On Codex, see\n[`references\u002Fcodex-tools.md`](references\u002Fcodex-tools.md).\n\nEvery `scripts\u002F...` and `playbooks\u002F...` path in this document, its playbooks,\nand its references is relative to this skill's base directory, the absolute\npath your runtime states when it loads patina-mode. Join the two, then run or\nread the result. The bundled `watch-pr` watcher, `orch` store CLI, and\n`worktree-audit.mjs` live under `scripts\u002F` there. Two other anchors look\nplausible and both fail. `CLAUDE_PLUGIN_ROOT` is set only for hooks, so it is\nunset in any shell you run. The repository you are working in ships none of\nthese files, so a repo-relative path resolves to nothing.\n\nRemaining triggers:\n\n- Issue-linked work begins or resumes → follow\n  [`references\u002Fissue-handoff.md`](references\u002Fissue-handoff.md). Its executable\n  direct-work and Session-pickup entries call the same gate. Each entry requires\n  a successful **working-on-issues** result before another playbook changes a\n  branch, edits a file, creates a commit, changes a pull request, or starts an\n  operational run. Its completed-issue, blocker, branch-ownership, and\n  worktree gates override the general autonomy rules below.\n- An issue branch belongs to another worktree → let **working-on-issues** stop\n  at its handoff gate. Run the bundled **move-branch-here** skill only when the\n  operator approves the move.\n- A Claude session ID, `codex:\u002F\u002Fthreads\u002F\u003Cid>`, or T3 Code thread handoff → run\n  the bundled **move-session-here** skill, then route its recovered resume point\n  through the Session pickup playbook. Session pickup enters the same issue\n  handoff gate.\n- Nontrivial change, architecture decision, or \"are we sure?\" → the **how** skill.\n- About to `AskUserQuestion` on a \"which approach\", \"how should I\", or \"what should this do\" fork → classify it before you ask. If the answer is a fact you could observe by running something (behavior, timing, layout, output, perf, even whether an eval separates), it is not the human's to answer. Sketch it via the Prototype playbook (`playbooks\u002Fprototype.md`) and let the result decide. If the task is a read-only Investigation whose deliverable is a cited answer, stay in it and answer from the evidence rather than building a sketch. Reserve the question for a genuine product or preference call no experiment can settle. When you recommend or ask about design options, start from the real problem and its constraints. Present the best long-term solution first, with its cost stated up front. Offer a quick fix only as an optional first step, and label it as optional. This rule orders the options and picks the recommendation. The Laziness Protocol still sets how small the chosen option's diff is. Under a full-autonomy grant, decide a call that the grant covers, act on it, and report it, with no reply word and no offer. Under the grant, apply a default for a call that only the operator can make. For a design call, that default is the long-term option. Report it with its cost, the optional quick fix, and a full explanation, and say in plain words what the operator could tell you to do instead. The operator answers in their own words. Never give a shorthand token to type back. Gates that the operator named and the Always-pause list in Autonomy still need the operator.\n- Any code change → open its build playbook per **Playbooks** before the first source edit. In an issue run, a docs, test, config, or dependency change routes too, as **Playbooks** names. Name the data shape first, and choose its organizing structure per **principle-model-the-domain**.\n- A consequential choice about ownership or interfaces, or competing viable designs → the **architect** skill before implementing. A function boundary alone does not trigger Architect. When requirements and the implementation pattern are established, follow the matched playbook. Escalate if later evidence reveals unresolved risk, material uncertainty, or competing approaches.\n- Parallel fan-out → the **swarm** skill for coverage matrices, races, gauntlets, and exploration partitions. Use **arena** for design or code bakeoffs with base selection and grafting.\n- Stacked PRs, a GitHub stack suggestion, or a stack topology change → read\n  [`references\u002Fgithub-stacks.md`](references\u002Fgithub-stacks.md). It distinguishes\n  dependent branches from native stack metadata and covers creation and verification.\n- Contested design → the **interrogate** skill (multi-model adversarial) before shipping.\n- Nontrivial multi-step → write the throughput checkpoint (Feature step 3) in the private task record.\n- Any prose surface → the **unslop** skill. Your reply is a prose surface. Write it per **Writing the reply**. Agent-facing prose also follows the **plugin-dev:skill-development** skill (Claude Code's authoring guidance for SKILL.md files).\n- Docs, RFCs, readmes, PR descriptions, commit messages → the **technical-writing** skill (`\u002Ftechnical-writing`) for structure and sentence discipline, on top of **unslop**.\n- A PR body is created or rewritten → **pr** ([`..\u002Fpr\u002FSKILL.md`](..\u002Fpr\u002FSKILL.md)). It owns body structure, including when another writing skill applies.\n- Before commit → the **deslop** skill (`\u002Fdeslop`).\n- Before review → the **no-comments** skill (`\u002Fno-comments`).\n- Running a benchmark, measuring perf yourself, or reporting a speedup or regression you measured → the **benchmark-checklist** skill before you report or act on the number.\n- Shipping UI \u002F IDE \u002F CLI → the project's driver skill, found per [Project verification](#project-verification), for user-observable UI verification, or `run` for CLIs\u002FTUIs. For bug fixes, reproduce first on the same surface yourself. Hand to the user only under the narrow Bug fix step 1 exception.\n- A human-authored change request or QA finding needs resolution → run the **gather-evidence** skill before editing or preparing a response. Route a confirmed case to the matching playbook, then run **gather-evidence** again on the changed target. Leave replies, thread resolution, and review state to the operator. Automated review uses the existing bot triage instead.\n- Work uses an Android emulator or iOS simulator → run the\n  **running-mobile-simulators** skill before the first device state change. The\n  agent that controls the device owns one exact device lease through app\n  execution, automation, evidence capture, recovery, and cleanup.\n- Opening or preparing a PR for work already built → follow [`playbooks\u002Fopening-a-pr.md`](playbooks\u002Fopening-a-pr.md). Create the caller-selected mode, run `\u002Fdeslop`, `\u002Fno-comments`, then `code-review`, resolve its findings on the current head, wait for a maintainer's approval at the head unless the repository is checks-only, and use `pr-readiness publish` for the only ready transition. Only `publish` arms auto-merge, or merges a PR GitHub already reports as mergeable, under the repository's `autoMerge` opt-in.\n- Any PR-status request → the **Babysit** playbook (`playbooks\u002Fbabysit.md`), not the bundled **babysit** skill, whose description matches the same words. That includes \"babysit this\", \"get it green\", \"address the review-bot comments\", and the commonest phrasing, \"check on PR X\" \u002F \"anything outstanding on X\". Never triggered by merely opening a PR. Declare its mode before polling. The playbook's step 1 owns the request-to-mode mapping. Reaching for `drive` inside a phase agent stops that agent finishing its turn.\n- A failed or reported CI check → identify its owner, reproduce it with the failure command, and route the repair to the **fix-ci** skill (`..\u002Ffix-ci\u002FSKILL.md`). Carry the owner, reproduction scope, command, and evidence into the routed brief, then return fix-ci's verification evidence to the active workflow. Each attempt follows **Repair from evidence**. Defect, review, and Babysit routing remain unchanged.\n- Asked to land or ship a green stack → the **Shipping** playbook (`playbooks\u002Fshipping.md`). Green is not safe. Nothing gets armed before an independent per-PR verdict, and only the contiguous verified run from the root lands.\n- An automated PR-review bot or the agentic security review commented → skeptical posture. They catch real bugs and also file non-issues and nitpicks, so assess each on its merits and dismiss noise with a concrete reason instead of churning code. Triage fix \u002F dismiss \u002F ask per `references\u002Fbugbot-triage.md`.\n- Deploying to a managed platform (Railway, Fly, Vercel, Heroku, and the like) → load that platform's skill, project-local or installed, before running its CLI, the same way Shipping step 1 resolves the forge before the first PR operation.\n- A defect found mid-task → severity decides its artifact, not where it turned up. A correctness or data gap gets a tracked issue even when it surfaces while writing a closure doc; a cosmetic margin can stay in the doc.\n- Broken skill mid-task → fix it in its own PR. Don't block. Don't silently work around it.\n- Long, autonomous, or multi-phase work, or any task the user steps away from to review later (\"going to bed\", \"trust it when i'm back\", \"\u002Floop until X\") → a decision trail via the **show-me-your-work** skill. Commit it when stakes need an auditable record. Keep it local otherwise.\n\n## Project verification\n\nWhen behavior verification starts, find the project's driver skill and load it\nbefore selecting a platform driver. The driver has no fixed name. Find it by\nname pattern and by what it does:\n\n1. A candidate is a skill in a project skill directory, such as `.claude\u002Fskills\u002F`,\n   `.agents\u002Fskills\u002F`, `.github\u002Fskills\u002F`, or `.pi\u002Fskills\u002F`, at the repository\n   root or in a monorepo package, whose directory name matches `*-verify` or\n   `verify-*`, or equals `verify`. A built-in or plugin skill never counts, so\n   Claude Code's bundled `\u002Fverify` is never a candidate.\n2. A candidate is the driver only when its SKILL.md tells an agent how to launch\n   or drive the app. A skill named `lint-verify` that only runs a linter is not\n   a driver.\n3. Count a skill once by its resolved real path. Installs symlink one skill into\n   several skill directories.\n4. When several drivers remain, take the one in the package nearest the files\n   being changed, or at the repository root when nothing has changed yet. Then\n   prefer the one with a feature map, then the first by full path in byte order.\n\n`create-verification-skill` writes the driver as `project-verify`. Older\ninstalls named it `patinaproject-verify` or `verify`, and the pattern still\nfinds both.\n\nFollow the selected skill's launch, doctor, affected-feature, evidence, and\ncleanup instructions. Use generic drivers only when no project skill exists,\nand record that coverage limitation.\n\n## Carry routing exceptions through the route\n\nPass each scoped routing exception in every executor brief. Require the executor to carry them into further delegation. Name the affected child requirement in the brief:\n\n- Skip the **Feature** or **Refactoring** Architect step only when no consequential ownership, interface, or competing-design decision remains. A straightforward change still follows every other matched playbook step, including a required configured implementation delegate, isolated worktree, and parent review.\n- **Autopilot-full** owners and supervisors inspect a slow worker before acting. Inspect process state, output, and task-relevant progress. Elapsed time or the lack of a side effect alone does not prove failure. Replace the worker only after recording failure evidence or when an explicit deadline contract requires replacement. Do not invent a deadline.\n- Reporting executors keep the outcome, relevant verification, and unresolved decisions. They omit required principle, routing, and throughput narration unless the user requests it or the reasoning affects the user's decision. Preserve any child reply item that communicates a result, evidence, risk, or decision.\n- Publication executors follow the repository's instructions for titles, bodies, references, links, and readiness. Under patina-mode, the caller selects the creation mode; `\u002Fdeslop`, `\u002Fno-comments`, and `code-review` run in order; readiness counts only GitHub Actions checks and, in an approval-gated repository, a maintainer's approval read from the forge, which no agent can give; and `pr-readiness publish` is the sole ready transition and the only agent step that arms auto-merge or merges an already-mergeable PR, under the repository's `autoMerge` opt-in.\n\nThese exceptions apply only to work routed through patina-mode and only to the named child requirements. They do not override higher-priority user or repository instructions, and they do not change standalone child invocations. They never waive reproduction, evidence, issue ownership, authorization, configured model routing, writer isolation, a required independent review, or a current-head verification gate.\n\n## Repair from evidence\n\nEvery CI or pull request repair attempt starts from a diagnosis. Apply these rules before each edit and each push, including the first attempt after a resume.\n\n1. **Read the owning job.** Open the first failing job that owns the failure. Read its failing command and its first actionable error. An aggregate check such as `Test Gate` only reports that a required job did not succeed. It is never the root cause, so follow it to the owning job.\n2. **Classify the failure.** Name one class: PR code, test or fixture, base branch, workflow, environment, or flake. Only PR code and test or fixture failures get a commit on this branch. A base-branch failure needs an update from the base. A workflow or environment failure goes to its owner. A flake gets the one fresh build that step 7 of `playbooks\u002Fbabysit.md` allows.\n3. **Reproduce before you change code.** Run the owning command locally on the current head and watch it fail. A local pass means the failure is not yet proven to be a code failure, so classify it again. When the command cannot run locally, name the reason and treat the next CI run as one experiment for one hypothesis.\n4. **Wait for the current head.** A pending or queued check on the current head is evidence to wait for. A new push cancels or supersedes that run and discards its result. Push again only after the decisive check finishes.\n5. **Test one hypothesis per attempt.** State the hypothesis, make the one focused change that tests it, and verify it locally before the push. When the result refutes the hypothesis, revert the change it motivated.\n6. **Verify the requirement.** Green checks prove only what the checks run. Verify the user-visible behavior on the surface that the requirement names, with the driver skill for that surface.\n7. **Carry the attempt forward.** A resumed or delegated repair brief names the previous attempt, the rejected hypotheses, and the known non-causes, so the next agent starts from them.\n8. **Stop when the next action is a guess.** Report the owning job, the class, the evidence you have, and the evidence that is missing. Resume when that evidence arrives.\n\n## Principles\n\nRead the leaf skill in full for any principle you apply. Each entry names when it applies.\n\n### Core\n\n- **Laziness Protocol** (**principle-laziness-protocol**). Refactoring, sizing a diff, or tempted to add abstractions, layers, or signal threading. Bias to deletion and the smallest change that solves the problem.\n- **Foundational Thinking** (**principle-foundational-thinking**). Before writing logic: core types and data structures, scaffold-vs-feature sequencing, what concurrent actors share.\n- **Redesign from First Principles** (**principle-redesign-from-first-principles**). Integrating a new requirement into an existing design. Redesign as if it had been foundational from day one.\n- **Attack the Premise** (**principle-attack-the-premise**). Two or more fixes that share one premise have failed the same gate. Take a census of which actors hold the imbalance before the next fix, then question the premise instead of writing another fix that assumes it.\n- **Subtract Before You Add** (**principle-subtract-before-you-add**). Sequencing an addition, refactor, or rewrite. Remove dead weight first, then build on the simpler base.\n- **Minimize Reader Load** (**principle-minimize-reader-load**). Reviewing or shaping code that's hard to trace. Count layers and hidden state, collapse one-caller wrappers, shrink mutable scope.\n- **Outcome-Oriented Execution** (**principle-outcome-oriented-execution**). Planned rewrites and migrations with explicit phase boundaries. Converge on the target architecture, don't preserve throwaway compatibility states.\n- **Experience First** (**principle-experience-first**). Product, UX, or feature-scope tradeoffs. Choose user delight over implementation convenience.\n- **Exhaust the Design Space** (**principle-exhaust-the-design-space**). A novel interaction or architectural decision with no precedent. Build 2-3 competing prototypes and compare before committing.\n- **Build the Lever** (**principle-build-the-lever**). Any non-trivial work. Build the tool that does or proves it (codemod, script, generator), not by hand. The tool is the artifact a reviewer reruns.\n\n### Architecture\n\n- **Model the Domain** (**principle-model-the-domain**). Writing stateful logic, or code that branches a lot or repeats a shape assumption across files. Encode the domain in a structure (state machine, typed model, table or registry, reducer, boundary, the right collection) instead of scattered conditionals.\n- **Boundary Discipline** (**principle-boundary-discipline**). Wiring validation, error handling, or framework adapters. Guards at system boundaries, trust internal types, keep business logic pure.\n- **Offensive Programming** (**principle-offensive-programming**). Before writing an error handler, null check, fallback, optional chain over uncertain data, retry, assertion, guard branch, configuration skip, or workaround. Classify the producer and handle the state only at its owning boundary.\n- **Type System Discipline** (**principle-type-system-discipline**). Designing types or a signature in any typed language. Make illegal states unrepresentable, brand primitives, parse external data at boundaries.\n- **Make Operations Idempotent** (**principle-make-operations-idempotent**). Designing commands, lifecycle steps, or loops that run amid crashes and retries. Converge to the same end state.\n- **Migrate Callers Then Delete Legacy APIs** (**principle-migrate-callers-then-delete-legacy-apis**). Introducing a new internal API while old callers exist. Migrate and delete in one wave.\n- **Separate Before Serializing Shared State** (**principle-separate-before-serializing-shared-state**). Concurrent actors might write the same file, branch, key, or object. Eliminate the sharing first.\n\n### Verification\n\n- **Prove It Works** (**principle-prove-it-works**). After a task, before declaring done. Verify against the real artifact, not a proxy or \"it compiles\".\n- **Fix Root Causes** (**principle-fix-root-causes**). Debugging. Trace each symptom to its root cause, reproduce first, ask why until you reach it.\n- **Sequence Work into Verifiable Units** (**principle-sequence-verifiable-units**). Multi-step work (sweeps, migrations, runs of similar edits) and how you stack commits and PRs. Break work into small units that each end in a check, verify each before the next, and order delivery so the sequence proves itself.\n- **Test Behavior, Not Implementation** (**principle-test-behavior-not-implementation**). Writing, changing, or keeping a test. Call the code the way its users do and assert the result against a literal expected value. If the test would still pass when every imported function returns `undefined`, rewrite the assertion or delete the test.\n- **Explain the Number** (**principle-explain-the-number**). Before you trust, report, or act on a number you measured (a speedup, a regression, a throughput, a latency, or an eval result). Find what limits it, and rule out that it measured something other than the work you think.\n\n### Delegation\n\n- **Guard the Context Window** (**principle-guard-the-context-window**). Context fills up: large outputs, long files, repeated reads, fan-out planning. Route bulk to subagents, keep summaries in the main thread.\n- **Never Block on the Human** (**principle-never-block-on-the-human**). Tempted to ask \"should I do X?\" on reversible work. Proceed, present the result, let the human course-correct.\n\n### Meta\n\n- **Encode Lessons in Structure** (**principle-encode-lessons-in-structure**). You catch yourself writing the same instruction a second time. Encode it as a lint, metadata flag, runtime check, or script instead of more text.\n\n## Autonomy\n\n**Just do it.** Use any MCP tool. Reversible work and external actions (team chat, ticket updates, kicking off evals) proceed without asking.\n\n**Always pause** for irreversible writes: force-push to shared branches, deploys, data deletion, customer messages.\n\n**Session overrides:** \"Don't stop\" \u002F \"going to bed\" \u002F \"run until done\" \u002F \"be fully autonomous\" → keep going.\n\n**No is an acceptable answer.** Asked whether to do something, invited to add scope, or shown an approach, reply with your real judgment. Decline, push back, or say \"this doesn't earn its place\" when true. A recommendation is a judgment, not a validation. Agreement is not the default, candor over sycophancy.\n\n## Subagents\n\n**Use `subagent_type: \"patina-agent\"` for any subagent you spawn inside a playbook step** (code-writing delegates, ad-hoc helpers). `setup-code-skills` installs the Code agents under their bare names, so the name resolves in a plugin install and in an Agent Skills install. `\u002Fpatina-mode` and `patina-agent` route through the same wrapper. Routed workflow skills (`how`, `why`, `interrogate`, `reflect`, `swarm`) set their own `subagent_type` for diverse-model review. Respect what the skill prescribes, don't override to `patina-agent`.\n\n**A subagent writes the code.** In a build playbook, the main thread plans, briefs, reviews, and verifies. A subagent writes every source edit, in its own worktree, on the model the playbook names. Feature step 4's worktree and no-spawn rules apply to every build playbook. Fix rounds follow **Fresh subagents by default**. Babysit's repairs are the exception. Its PR owner commits them directly on the owning branch, per `playbooks\u002Fbabysit.md`. A human change request that Babysit routes to a build playbook follows this rule.\n\n**Defaults for every `Agent` call.** `run_in_background: true`, full tool access (do not pick a subagent_type that strips MCP), file pointers not inlined context, explicit model per role (configurable via `\u002Fsetup-pstack`. Role defaults in [Models](#models), with \"judgment and prose\" covering prose and judgment). Code delegates tier by difficulty. The hardest changes (cross-cutting design, gnarly concurrency, subtle algorithms) go to your strongest-judgment model (default in [Models](#models)), whether the task needs judgment on vague intent or is a precisely specified sequence of steps to execute to the letter. Trivial mechanical edits go to your fast code model. Everything else uses the single-role default. Multi-model panels run the configured panel for diversity, with defaults enumerated in each panel skill's Models section (`arena`, `architect`, `interrogate`). Per-role `\u002Fsetup-pstack` lines override these defaults and the model choices in the routed skills (`how`, `why`, `arena`, `swarm`, `architect`, `interrogate`, `reflect`). A role with no line keeps its default, and a role line of `inherit-parent` or `auto` runs that role on the parent session's model (omit `model` on the `Agent` call).\n\nYou own every subagent's work. Review the diff and write your own summary, don't pass through what it said. A second opinion is the same prompt against a different model. Agreement is high-signal.\n\n**Fresh subagents by default.** Give new work to a fresh subagent with consolidated scope, meaning the original brief, every later directive, and the prior agent's report and branch. This holds for a fix round, a follow-up, a retry, and the next queue item. Resume, message, or queue a follow-up on an existing subagent only when the new work strictly needs state that lives in that agent and is costly to move: its local checkout, its uncommitted changes, or a process it still runs, such as a dev server, a simulator, or a babysit watcher. A stop or hold order to a running agent is not reuse. A role such as a PR owner outlives its agent. Once that agent returns, a fresh agent takes the role's next round. Interrupt-chained resumes silently drop directives, so fire a fresh subagent with consolidated scope rather than trusting a \"done\" summary. **Stop the abandoned agent first, and confirm it stopped.** In the agent listing `completed` means the completion was *notified*, not that the process exited: an agent with live background children reports completed and then resumes. Only an explicit stop ends it, and the stop tool may be deferred, so load it before you need it. The tell that one is still running is a claim about the working tree that `git status` contradicts.\n\n**A review gate stays closed when no independent reviewer can run.** An agent limit, subagent dispatch turned off, or a skills-only install can leave a required review with no reviewer. Keep the results of reviewers already dispatched. As the one exception to fresh subagents, reuse a finished reviewer only through the runtime's own follow-up action, only if it did not write the change, and only with the full current brief and head revision. A reused reviewer counts once. Never count your own review, passing tests, or CI as the independent verdict. Record `BLOCKED: independent review` in the todolist, keep merge-ready and shipping closed, and report which reviewers ran and which are missing. Work that doesn't depend on the review continues. A fan-out skill run only to explore may fall back to one labelled sequential pass.\n\n## Writing the reply\n\nWrite the reply clean as you draft it. A cleanup pass after drafting does not remove these patterns.\n\n- **Short declarative sentences.** One thought per sentence, ended with a period.\n- **No long-dash character anywhere.** Write a file-list bullet as a sentence (\"`main.js` owns persistence and the IPC handlers\") and a bold section header as its own sentence (\"**Verification.** End to end via CDP\").\n- **A colon as a mid-sentence connector is also out** (unslop rule 14). A colon before a list is fine.\n- **Terse is not an excuse to drop content.** Keep each playbook reply item that reports an outcome, verification, risk, or unresolved decision. Render each as prose, usually a sentence or two, longer when the content needs it. No section headers, and no item expanded into its own block.\n- **Frame impact for the consumer and the maintainer.** Name who the work is for (an end user, a colleague importing the library) and what changes for them before any implementation detail. Then what the next engineer who owns this code inherits. If you can't say what either would notice, the work or the explanation is off.\n- **Never fabricate a link, citation, or transcript reference.** Link only artifacts you produced or read this session.\n- **Every claim carries its evidence or its label in the same sentence.** Measured, inferred, or guess. A prediction or an unseen cause is a guess. Never hand the human a check you could run.\n\nEvery playbook ends with a reply written this way. Report the outcome, relevant verification, and unresolved decisions. Follow the repository's publication and link conventions; use the playbook's compatible defaults only when the repository is silent. The per-playbook lines below name only the content unique to that playbook.\n\n## Comments\n\nComments follow the same rule as the reply. Write them clean as you go. Keep a comment only for a non-obvious *why* the code can't show. A verify or test script gets no phase-narrating comments such as `\u002F\u002F Phase 1: add cards`. The assertion or log string documents the step, as in `assert(ok, 'persisted across restart')`. This applies to every file you produce, including the delegate's diff.\n\n## Models\n\nRole defaults, stamped from `plugins\u002Fpstack\u002Fmodels.json` (edit there, rerun `tools\u002Fgenerate.mjs`). A matching role line in the `pstack-models.md` override sheet overrides each at runtime; `\u002Fsetup-pstack` writes it and lists its path per runtime.\n\n- feature, refactoring: `opus`\n- bug-fix: `fable`\n- perf-issue: `fable`\n- hillclimb: `fable`\n- judgment and prose: `opus`\n- strongest judgment: `fable`\n\n## Reasoning effort\n\nA role value in the override sheet may name a reasoning effort after its model, as in `opus @xhigh`. Levels on Claude Code: `low`, `medium`, `high`, `xhigh`, `max`. Which ones apply depends on the model. A value without `@` takes the sheet's `default effort` line, a level or `session`, and `session` when the sheet has no such line. `session` sets no effort, so the dispatch is the usual one. Strip the suffix before reading the model: `inherit-parent` or `auto` still omits `model` at every level, and a model name is passed as `model`. On Claude Code, a level picks the effort agent from the `subagent_type` you would otherwise use. `patina-agent` becomes `subagent_type: \"patina-agent-\u003Clevel>\"`. `patina-reader` becomes `subagent_type: \"patina-reader-\u003Clevel>\"`. `general-purpose`, or no `subagent_type`, becomes `subagent_type: \"effort-\u003Clevel>\"`. The effort agents set only `effort`, so the model you pass still decides the model. On Codex, pass the level as `spawn_agent`'s `reasoning_effort` and keep the usual instructions.\n","# Patina mode\n\n## Platform Adaptation\n\nThese skills use Claude Code tool names (the `Skill` tool, the `Agent` tool, `AskUserQuestion`) and the Claude model names the `Agent` tool accepts, as each Models section lists them. On Claude Code they work as written. On Codex, read [`references\u002Fcodex-tools.md`](references\u002Fcodex-tools.md) for the Codex equivalent of a Claude tool, model, or skill named by these workflows. On Pi, read [`references\u002Fpi-tools.md`](references\u002Fpi-tools.md) instead. On GitHub Copilot, CLI or app, read [`references\u002Fcopilot-tools.md`](references\u002Fcopilot-tools.md) instead. Other runtimes can discover the same Agent Skills tree, but they must use their own tool, model, and configuration equivalents. No one of these mappings is a cross-runtime map.\n\nOn Codex, patina-mode requires the `multi_agent` feature. Before selecting a\nplaybook or changing anything, confirm that `spawn_agent` is available. If it\nis unavailable, stop and tell the user to set `multi_agent = true` under\n`[features]` in `~\u002F.codex\u002Fconfig.toml`, then restart Codex. Do not continue with\na sequential substitute.\n\nUse the session's task-tracking tools for the todolist. On Claude Code these are `TaskCreate` and `TaskUpdate`, or `TodoWrite` when configured. Availability depends on the model; `CLAUDE_CODE_ENABLE_TODO_TOOLS=1` enables them through the environment or a project's `.claude\u002Fsettings.local.json` `env` block. See the [task-tool documentation](https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Ftools-reference#task-tool-availability). If no task-tracking tool is available, keep an uncommitted `todo.md` Markdown checklist in the work dir, next to the decision trail, with the playbook steps verbatim and each `skip: \u003Creason>` line. When several sessions share the checkout, name it `.audit\u002F\u003Ctask-slug>.todo.md`, beside that session's `.audit\u002F\u003Ctask-slug>.tsv` trail, so they never write one file.\n\n## Playbooks\n\nRoute before you act. Match the task to a playbook below and open its file. Open a todolist whose first items are its steps, copied in verbatim, before any task-specific todos. Do this before the first file edit or commit. A step you choose not to do stays in the list with a one-line `skip: \u003Creason>`.\n\n**A code change routes to its build playbook:** Bug fix, Feature, Refactoring, Perf issue, Hillclimb, or Visual parity. A request to implement an issue and open a pull request is that build task when neither continuation case below holds. **Opening a PR** is the build playbook's last step, never the route for the code. Prototype sketches and Babysit repairs keep their own playbooks. Who writes the code follows **A subagent writes the code** in **Subagents**.\n\n**Issue-linked work that continues a branch routes through Session pickup.** After **working-on-issues** passes, check the remote canonical branch it resolved and fetched. When that branch has an open pull request, Session pickup routes the work to the Babysit playbook. Babysit step 1 picks the mode, and an undeclared mode is `drive`. The unattended issue run counts as the request that starts babysitting, and the issue run's own thread runs Babysit, not a phase subagent. When the branch has commits beyond the default branch and no open pull request, Session pickup routes the work to the remaining steps of the build playbook that the work matches, then to **Opening a PR**. When the branch does not exist or has no commits beyond the default branch, the build route above applies unchanged.\n\n**Every repository change an issue run makes routes through a playbook**, including docs, tests, config, and dependency updates. Route each by its effect:\n\n- An edit to a SKILL.md, a playbook, or another agent-facing doc goes to **Authoring or modifying a skill**.\n- A test or config change that keeps behavior goes to **Refactoring**. Its step 1 may take a `skip:` line when there is no behavior to pin.\n- A dependency update, or a config change that alters behavior, goes to **Bug fix** or **Feature** by its effect.\n- Anything else goes to **figure-it-out**.\n\nA large or cross-cutting effort (a migration across many call sites, an ambitious multi-part change), or work the user steps away from to trust later, routes to the **figure-it-out** skill even when a narrower playbook like Feature fits. Use **figure-it-out** whenever no bundled playbook fits. It designs a bespoke, rigorous playbook for the task. A standing project-scale program (multi-day, many stacked PRs, a fleet of subagents under one coordinator) routes to **Orchestrate** instead. figure-it-out designs one bespoke run, orchestrate runs the program.\n\n- **Investigation.** Read-only question: how does X work, why was Y built this way, are we sure about Z, should we do X or Y. `playbooks\u002Finvestigation.md`.\n- **Triage.** Unattended triage of one existing tracker issue to a ready label or one round of questions, without implementing it (\"triage this issue\", \"Triage Linear issue … Do not implement it.\"). People triaging by hand use the Work plugin's triage skill instead. `playbooks\u002Ftriage.md`.\n- **Bug fix.** A reported defect to reproduce, root-cause, and fix with runtime evidence. `playbooks\u002Fbug-fix.md`.\n- **Perf issue.** A measured slowness to trace and improve against a baseline. `playbooks\u002Fperf-issue.md`.\n- **Hillclimb.** Sustained, scientific improvement of one metric against a target: loop hypotheses with before\u002Fafter measurement, a decision log, and one commit per accepted win. Distinct from Perf issue, which is a one-off fix. `playbooks\u002Fhillclimb.md`.\n- **Runtime forensics.** Diagnose a runtime symptom (leak, idle-CPU spin, glitch) from live instrumentation. The deliverable is a diagnosis, not a fix. `playbooks\u002Fruntime-forensics.md`.\n- **Trace forensics.** Diagnose a captured profiling artifact (cpuprofile, trace, spindump, heap snapshot) handed to you after the fact. The deliverable is a diagnosis, not a fix. `playbooks\u002Ftrace-forensics.md`.\n- **Feature.** New or changed behavior, built from a named data shape. `playbooks\u002Ffeature.md`.\n- **Refactoring.** A behavior-preserving change to structure or shape (rename, extract, inline, dedupe, move). `playbooks\u002Frefactoring.md`.\n- **Prototype.** A throwaway sketch to make a design or behavioral decision cheaply, or to settle an empirical fork by observing it instead of asking the human (\"prototype\", \"mock it up\", \"try this layout\", \"sketch it to decide\"). `playbooks\u002Fprototype.md`.\n- **Visual parity.** Pixel-exact UI equivalence: matching two implementations or migrating a styling system. `playbooks\u002Fvisual-parity.md`.\n- **Authoring or modifying a skill.** Writing or editing a SKILL.md. `playbooks\u002Fauthoring-a-skill.md`.\n- **Eval.** Testing how a skill, structure, or prompt change affects agent behavior before promoting it. `playbooks\u002Feval.md`.\n- **Babysit.** Driving a PR or a stack to merge-ready: conflicts, review threads, CI. `playbooks\u002Fbabysit.md`.\n- **Shipping.** The half after Babysit. Independently verifying a green stack, then landing the contiguous verified run bottom-up through `gh` by default or Origin when its CLI is available. `playbooks\u002Fshipping.md`.\n- **Autonomous run.** A long task to drive to completion without stopping (\"run until done\", \"\u002Floop until X\"). `playbooks\u002Fautonomous-run.md`.\n- **Orchestrate.** A standing project handed to one coordinator chat: multi-day, many stacked PRs, dozens to hundreds of subagents, minimal human turns (\"run this whole project\", \"own this migration until it lands\"). Distinct from Autonomous run, which drives one task to a predicate. Work one agent could finish inside the session's budget routes there, not here, however program-shaped the phrasing sounds. `playbooks\u002Forchestrate.md`.\n- **Autopilot-full.** A queue of independent PRs driven to merge-ready with full autonomy. One owner per PR carries build to merge-ready, the root swarm-verifies each PR, an owner runs `pr-readiness publish` only after the root's clean verdict, and the operator clicks the merge of each PR that `publish` does not arm (\"autopilot this queue\", \"full autopilot\", one-owner-per-PR programs). `playbooks\u002Fautopilot-full.md`.\n- **Autopilot-stack.** A queue of changes built and verified with full autonomy, delivered as one linear reviewed base-branch stack the operator lands (\"autopilot-stack\", \"stack them, don't ship\", \"build the stack, I'll land it\"). `playbooks\u002Fautopilot-stack.md`.\n- **Session pickup.** Resuming or taking over a prior agent's in-flight work from a transcript, cloud-agent URL, or pushed branch. `playbooks\u002Fsession-pickup.md`.\n- **Pause safely.** Suspending in-flight work cleanly so it can be resumed, on an explicit pause, going offline, a session restart, or imminent context compaction. The complement to Session pickup. Full steps: `playbooks\u002Fpause-safely.md`.\n- **Multi-phase or multi-PR plan.** Work that spans phases or stacked PRs. `playbooks\u002Fmulti-phase-plan.md`.\n- **Worktree and simulator cleanup.** Reclaiming local disk by pruning merged or abandoned git worktrees and stale iOS simulators (\"what's using my disk\", \"clean up worktrees\", \"prune safe-to-prune worktrees\", \"free up space\", \"delete old simulators\"). `playbooks\u002Fworktree-cleanup.md`.\n- **Opening a PR.** Invoked at the end of every other playbook. It routes alone only for work already built. `playbooks\u002Fopening-a-pr.md`.\n\n**Project playbooks.** A repository can add playbooks of its own under `.agents\u002Fplaybooks\u002F`, one Markdown file each. Its frontmatter names `extends`, the bundled playbook stems it builds on (comma-separated, or empty for a standalone playbook), and `when`, one sentence naming the requests it serves. When the playbook you match is one a project playbook extends, or the task fits a project playbook's `when`, open that file as well. Copy the bundled steps into the todolist verbatim, then apply each change at the step its quoted text names, and stop where the project playbook says to stop. A change is a list item that starts with `**After**`, `**Before**`, `**Replace**` or `**In**` followed by a quoted run of the bundled step's own words. Before you apply a project playbook, run `node \u003Cpatina-mode-base>\u002Fscripts\u002Fcheck-playbooks.mjs` from the repository root. It fails when a project playbook extends a playbook this version lacks, or quotes step text this version no longer has, which happens when a pstack upgrade rewrites a step. Report each line it prints to the user and do not guess where an unanchored change belongs.\n\n## Non-negotiables\n\nThe Principles section below grounds every trigger. Keep principle choices, routing decisions, skip reasons, and throughput notes in the private task record. Explain them to the user only when asked or when the reasoning affects a decision the user must make. Cite only principles whose leaf SKILL.md you read this session.\n\nWhile patina-mode is active, this skill owns workflow routing. Use only the\nskills and playbooks named here. Do not substitute another development, repair,\nreview, or pull request controller because it is installed.\n\nEvery skill named in this document and its playbooks is the Code\nplugin's. Invoke it by its bare name, such as `patina-mode`. An Agent Skills\ninstall registers bare names only, so a `plugin:skill` name for a Code\nskill does not resolve there. The exceptions are the references already\ncarrying their own namespace, such as `plugin-dev:skill-development`, and the\nClaude Code built-in driver skills `run` and `verify`. On Codex, see\n[`references\u002Fcodex-tools.md`](references\u002Fcodex-tools.md).\n\nEvery `scripts\u002F...` and `playbooks\u002F...` path in this document, its playbooks,\nand its references is relative to this skill's base directory, the absolute\npath your runtime states when it loads patina-mode. Join the two, then run or\nread the result. The bundled `watch-pr` watcher, `orch` store CLI, and\n`worktree-audit.mjs` live under `scripts\u002F` there. Two other anchors look\nplausible and both fail. `CLAUDE_PLUGIN_ROOT` is set only for hooks, so it is\nunset in any shell you run. The repository you are working in ships none of\nthese files, so a repo-relative path resolves to nothing.\n\nRemaining triggers:\n\n- Issue-linked work begins or resumes → follow\n  [`references\u002Fissue-handoff.md`](references\u002Fissue-handoff.md). Its executable\n  direct-work and Session-pickup entries call the same gate. Each entry requires\n  a successful **working-on-issues** result before another playbook changes a\n  branch, edits a file, creates a commit, changes a pull request, or starts an\n  operational run. Its completed-issue, blocker, branch-ownership, and\n  worktree gates override the general autonomy rules below.\n- An issue branch belongs to another worktree → let **working-on-issues** stop\n  at its handoff gate. Run the bundled **move-branch-here** skill only when the\n  operator approves the move.\n- A Claude session ID, `codex:\u002F\u002Fthreads\u002F\u003Cid>`, or T3 Code thread handoff → run\n  the bundled **move-session-here** skill, then route its recovered resume point\n  through the Session pickup playbook. Session pickup enters the same issue\n  handoff gate.\n- Nontrivial change, architecture decision, or \"are we sure?\" → the **how** skill.\n- About to `AskUserQuestion` on a \"which approach\", \"how should I\", or \"what should this do\" fork → classify it before you ask. If the answer is a fact you could observe by running something (behavior, timing, layout, output, perf, even whether an eval separates), it is not the human's to answer. Sketch it via the Prototype playbook (`playbooks\u002Fprototype.md`) and let the result decide. If the task is a read-only Investigation whose deliverable is a cited answer, stay in it and answer from the evidence rather than building a sketch. Reserve the question for a genuine product or preference call no experiment can settle. When you recommend or ask about design options, start from the real problem and its constraints. Present the best long-term solution first, with its cost stated up front. Offer a quick fix only as an optional first step, and label it as optional. This rule orders the options and picks the recommendation. The Laziness Protocol still sets how small the chosen option's diff is. Under a full-autonomy grant, decide a call that the grant covers, act on it, and report it, with no reply word and no offer. Under the grant, apply a default for a call that only the operator can make. For a design call, that default is the long-term option. Report it with its cost, the optional quick fix, and a full explanation, and say in plain words what the operator could tell you to do instead. The operator answers in their own words. Never give a shorthand token to type back. Gates that the operator named and the Always-pause list in Autonomy still need the operator.\n- Any code change → open its build playbook per **Playbooks** before the first source edit. In an issue run, a docs, test, config, or dependency change routes too, as **Playbooks** names. Name the data shape first, and choose its organizing structure per **principle-model-the-domain**.\n- A consequential choice about ownership or interfaces, or competing viable designs → the **architect** skill before implementing. A function boundary alone does not trigger Architect. When requirements and the implementation pattern are established, follow the matched playbook. Escalate if later evidence reveals unresolved risk, material uncertainty, or competing approaches.\n- Parallel fan-out → the **swarm** skill for coverage matrices, races, gauntlets, and exploration partitions. Use **arena** for design or code bakeoffs with base selection and grafting.\n- Stacked PRs, a GitHub stack suggestion, or a stack topology change → read\n  [`references\u002Fgithub-stacks.md`](references\u002Fgithub-stacks.md). It distinguishes\n  dependent branches from native stack metadata and covers creation and verification.\n- Contested design → the **interrogate** skill (multi-model adversarial) before shipping.\n- Nontrivial multi-step → write the throughput checkpoint (Feature step 3) in the private task record.\n- Any prose surface → the **unslop** skill. Your reply is a prose surface. Write it per **Writing the reply**. Agent-facing prose also follows the **plugin-dev:skill-development** skill (Claude Code's authoring guidance for SKILL.md files).\n- Docs, RFCs, readmes, PR descriptions, commit messages → the **technical-writing** skill (`\u002Ftechnical-writing`) for structure and sentence discipline, on top of **unslop**.\n- A PR body is created or rewritten → **pr** ([`..\u002Fpr\u002FSKILL.md`](..\u002Fpr\u002FSKILL.md)). It owns body structure, including when another writing skill applies.\n- Before commit → the **deslop** skill (`\u002Fdeslop`).\n- Before review → the **no-comments** skill (`\u002Fno-comments`).\n- Running a benchmark, measuring perf yourself, or reporting a speedup or regression you measured → the **benchmark-checklist** skill before you report or act on the number.\n- Shipping UI \u002F IDE \u002F CLI → the project's driver skill, found per [Project verification](#project-verification), for user-observable UI verification, or `run` for CLIs\u002FTUIs. For bug fixes, reproduce first on the same surface yourself. Hand to the user only under the narrow Bug fix step 1 exception.\n- A human-authored change request or QA finding needs resolution → run the **gather-evidence** skill before editing or preparing a response. Route a confirmed case to the matching playbook, then run **gather-evidence** again on the changed target. Leave replies, thread resolution, and review state to the operator. Automated review uses the existing bot triage instead.\n- Work uses an Android emulator or iOS simulator → run the\n  **running-mobile-simulators** skill before the first device state change. The\n  agent that controls the device owns one exact device lease through app\n  execution, automation, evidence capture, recovery, and cleanup.\n- Opening or preparing a PR for work already built → follow [`playbooks\u002Fopening-a-pr.md`](playbooks\u002Fopening-a-pr.md). Create the caller-selected mode, run `\u002Fdeslop`, `\u002Fno-comments`, then `code-review`, resolve its findings on the current head, wait for a maintainer's approval at the head unless the repository is checks-only, and use `pr-readiness publish` for the only ready transition. Only `publish` arms auto-merge, or merges a PR GitHub already reports as mergeable, under the repository's `autoMerge` opt-in.\n- Any PR-status request → the **Babysit** playbook (`playbooks\u002Fbabysit.md`), not the bundled **babysit** skill, whose description matches the same words. That includes \"babysit this\", \"get it green\", \"address the review-bot comments\", and the commonest phrasing, \"check on PR X\" \u002F \"anything outstanding on X\". Never triggered by merely opening a PR. Declare its mode before polling. The playbook's step 1 owns the request-to-mode mapping. Reaching for `drive` inside a phase agent stops that agent finishing its turn.\n- A failed or reported CI check → identify its owner, reproduce it with the failure command, and route the repair to the **fix-ci** skill (`..\u002Ffix-ci\u002FSKILL.md`). Carry the owner, reproduction scope, command, and evidence into the routed brief, then return fix-ci's verification evidence to the active workflow. Each attempt follows **Repair from evidence**. Defect, review, and Babysit routing remain unchanged.\n- Asked to land or ship a green stack → the **Shipping** playbook (`playbooks\u002Fshipping.md`). Green is not safe. Nothing gets armed before an independent per-PR verdict, and only the contiguous verified run from the root lands.\n- An automated PR-review bot or the agentic security review commented → skeptical posture. They catch real bugs and also file non-issues and nitpicks, so assess each on its merits and dismiss noise with a concrete reason instead of churning code. Triage fix \u002F dismiss \u002F ask per `references\u002Fbugbot-triage.md`.\n- Deploying to a managed platform (Railway, Fly, Vercel, Heroku, and the like) → load that platform's skill, project-local or installed, before running its CLI, the same way Shipping step 1 resolves the forge before the first PR operation.\n- A defect found mid-task → severity decides its artifact, not where it turned up. A correctness or data gap gets a tracked issue even when it surfaces while writing a closure doc; a cosmetic margin can stay in the doc.\n- Broken skill mid-task → fix it in its own PR. Don't block. Don't silently work around it.\n- Long, autonomous, or multi-phase work, or any task the user steps away from to review later (\"going to bed\", \"trust it when i'm back\", \"\u002Floop until X\") → a decision trail via the **show-me-your-work** skill. Commit it when stakes need an auditable record. Keep it local otherwise.\n\n## Project verification\n\nWhen behavior verification starts, find the project's driver skill and load it\nbefore selecting a platform driver. The driver has no fixed name. Find it by\nname pattern and by what it does:\n\n1. A candidate is a skill in a project skill directory, such as `.claude\u002Fskills\u002F`,\n   `.agents\u002Fskills\u002F`, `.github\u002Fskills\u002F`, or `.pi\u002Fskills\u002F`, at the repository\n   root or in a monorepo package, whose directory name matches `*-verify` or\n   `verify-*`, or equals `verify`. A built-in or plugin skill never counts, so\n   Claude Code's bundled `\u002Fverify` is never a candidate.\n2. A candidate is the driver only when its SKILL.md tells an agent how to launch\n   or drive the app. A skill named `lint-verify` that only runs a linter is not\n   a driver.\n3. Count a skill once by its resolved real path. Installs symlink one skill into\n   several skill directories.\n4. When several drivers remain, take the one in the package nearest the files\n   being changed, or at the repository root when nothing has changed yet. Then\n   prefer the one with a feature map, then the first by full path in byte order.\n\n`create-verification-skill` writes the driver as `project-verify`. Older\ninstalls named it `patinaproject-verify` or `verify`, and the pattern still\nfinds both.\n\nFollow the selected skill's launch, doctor, affected-feature, evidence, and\ncleanup instructions. Use generic drivers only when no project skill exists,\nand record that coverage limitation.\n\n## Carry routing exceptions through the route\n\nPass each scoped routing exception in every executor brief. Require the executor to carry them into further delegation. Name the affected child requirement in the brief:\n\n- Skip the **Feature** or **Refactoring** Architect step only when no consequential ownership, interface, or competing-design decision remains. A straightforward change still follows every other matched playbook step, including a required configured implementation delegate, isolated worktree, and parent review.\n- **Autopilot-full** owners and supervisors inspect a slow worker before acting. Inspect process state, output, and task-relevant progress. Elapsed time or the lack of a side effect alone does not prove failure. Replace the worker only after recording failure evidence or when an explicit deadline contract requires replacement. Do not invent a deadline.\n- Reporting executors keep the outcome, relevant verification, and unresolved decisions. They omit required principle, routing, and throughput narration unless the user requests it or the reasoning affects the user's decision. Preserve any child reply item that communicates a result, evidence, risk, or decision.\n- Publication executors follow the repository's instructions for titles, bodies, references, links, and readiness. Under patina-mode, the caller selects the creation mode; `\u002Fdeslop`, `\u002Fno-comments`, and `code-review` run in order; readiness counts only GitHub Actions checks and, in an approval-gated repository, a maintainer's approval read from the forge, which no agent can give; and `pr-readiness publish` is the sole ready transition and the only agent step that arms auto-merge or merges an already-mergeable PR, under the repository's `autoMerge` opt-in.\n\nThese exceptions apply only to work routed through patina-mode and only to the named child requirements. They do not override higher-priority user or repository instructions, and they do not change standalone child invocations. They never waive reproduction, evidence, issue ownership, authorization, configured model routing, writer isolation, a required independent review, or a current-head verification gate.\n\n## Repair from evidence\n\nEvery CI or pull request repair attempt starts from a diagnosis. Apply these rules before each edit and each push, including the first attempt after a resume.\n\n1. **Read the owning job.** Open the first failing job that owns the failure. Read its failing command and its first actionable error. An aggregate check such as `Test Gate` only reports that a required job did not succeed. It is never the root cause, so follow it to the owning job.\n2. **Classify the failure.** Name one class: PR code, test or fixture, base branch, workflow, environment, or flake. Only PR code and test or fixture failures get a commit on this branch. A base-branch failure needs an update from the base. A workflow or environment failure goes to its owner. A flake gets the one fresh build that step 7 of `playbooks\u002Fbabysit.md` allows.\n3. **Reproduce before you change code.** Run the owning command locally on the current head and watch it fail. A local pass means the failure is not yet proven to be a code failure, so classify it again. When the command cannot run locally, name the reason and treat the next CI run as one experiment for one hypothesis.\n4. **Wait for the current head.** A pending or queued check on the current head is evidence to wait for. A new push cancels or supersedes that run and discards its result. Push again only after the decisive check finishes.\n5. **Test one hypothesis per attempt.** State the hypothesis, make the one focused change that tests it, and verify it locally before the push. When the result refutes the hypothesis, revert the change it motivated.\n6. **Verify the requirement.** Green checks prove only what the checks run. Verify the user-visible behavior on the surface that the requirement names, with the driver skill for that surface.\n7. **Carry the attempt forward.** A resumed or delegated repair brief names the previous attempt, the rejected hypotheses, and the known non-causes, so the next agent starts from them.\n8. **Stop when the next action is a guess.** Report the owning job, the class, the evidence you have, and the evidence that is missing. Resume when that evidence arrives.\n\n## Principles\n\nRead the leaf skill in full for any principle you apply. Each entry names when it applies.\n\n### Core\n\n- **Laziness Protocol** (**principle-laziness-protocol**). Refactoring, sizing a diff, or tempted to add abstractions, layers, or signal threading. Bias to deletion and the smallest change that solves the problem.\n- **Foundational Thinking** (**principle-foundational-thinking**). Before writing logic: core types and data structures, scaffold-vs-feature sequencing, what concurrent actors share.\n- **Redesign from First Principles** (**principle-redesign-from-first-principles**). Integrating a new requirement into an existing design. Redesign as if it had been foundational from day one.\n- **Attack the Premise** (**principle-attack-the-premise**). Two or more fixes that share one premise have failed the same gate. Take a census of which actors hold the imbalance before the next fix, then question the premise instead of writing another fix that assumes it.\n- **Subtract Before You Add** (**principle-subtract-before-you-add**). Sequencing an addition, refactor, or rewrite. Remove dead weight first, then build on the simpler base.\n- **Minimize Reader Load** (**principle-minimize-reader-load**). Reviewing or shaping code that's hard to trace. Count layers and hidden state, collapse one-caller wrappers, shrink mutable scope.\n- **Outcome-Oriented Execution** (**principle-outcome-oriented-execution**). Planned rewrites and migrations with explicit phase boundaries. Converge on the target architecture, don't preserve throwaway compatibility states.\n- **Experience First** (**principle-experience-first**). Product, UX, or feature-scope tradeoffs. Choose user delight over implementation convenience.\n- **Exhaust the Design Space** (**principle-exhaust-the-design-space**). A novel interaction or architectural decision with no precedent. Build 2-3 competing prototypes and compare before committing.\n- **Build the Lever** (**principle-build-the-lever**). Any non-trivial work. Build the tool that does or proves it (codemod, script, generator), not by hand. The tool is the artifact a reviewer reruns.\n\n### Architecture\n\n- **Model the Domain** (**principle-model-the-domain**). Writing stateful logic, or code that branches a lot or repeats a shape assumption across files. Encode the domain in a structure (state machine, typed model, table or registry, reducer, boundary, the right collection) instead of scattered conditionals.\n- **Boundary Discipline** (**principle-boundary-discipline**). Wiring validation, error handling, or framework adapters. Guards at system boundaries, trust internal types, keep business logic pure.\n- **Offensive Programming** (**principle-offensive-programming**). Before writing an error handler, null check, fallback, optional chain over uncertain data, retry, assertion, guard branch, configuration skip, or workaround. Classify the producer and handle the state only at its owning boundary.\n- **Type System Discipline** (**principle-type-system-discipline**). Designing types or a signature in any typed language. Make illegal states unrepresentable, brand primitives, parse external data at boundaries.\n- **Make Operations Idempotent** (**principle-make-operations-idempotent**). Designing commands, lifecycle steps, or loops that run amid crashes and retries. Converge to the same end state.\n- **Migrate Callers Then Delete Legacy APIs** (**principle-migrate-callers-then-delete-legacy-apis**). Introducing a new internal API while old callers exist. Migrate and delete in one wave.\n- **Separate Before Serializing Shared State** (**principle-separate-before-serializing-shared-state**). Concurrent actors might write the same file, branch, key, or object. Eliminate the sharing first.\n\n### Verification\n\n- **Prove It Works** (**principle-prove-it-works**). After a task, before declaring done. Verify against the real artifact, not a proxy or \"it compiles\".\n- **Fix Root Causes** (**principle-fix-root-causes**). Debugging. Trace each symptom to its root cause, reproduce first, ask why until you reach it.\n- **Sequence Work into Verifiable Units** (**principle-sequence-verifiable-units**). Multi-step work (sweeps, migrations, runs of similar edits) and how you stack commits and PRs. Break work into small units that each end in a check, verify each before the next, and order delivery so the sequence proves itself.\n- **Test Behavior, Not Implementation** (**principle-test-behavior-not-implementation**). Writing, changing, or keeping a test. Call the code the way its users do and assert the result against a literal expected value. If the test would still pass when every imported function returns `undefined`, rewrite the assertion or delete the test.\n- **Explain the Number** (**principle-explain-the-number**). Before you trust, report, or act on a number you measured (a speedup, a regression, a throughput, a latency, or an eval result). Find what limits it, and rule out that it measured something other than the work you think.\n\n### Delegation\n\n- **Guard the Context Window** (**principle-guard-the-context-window**). Context fills up: large outputs, long files, repeated reads, fan-out planning. Route bulk to subagents, keep summaries in the main thread.\n- **Never Block on the Human** (**principle-never-block-on-the-human**). Tempted to ask \"should I do X?\" on reversible work. Proceed, present the result, let the human course-correct.\n\n### Meta\n\n- **Encode Lessons in Structure** (**principle-encode-lessons-in-structure**). You catch yourself writing the same instruction a second time. Encode it as a lint, metadata flag, runtime check, or script instead of more text.\n\n## Autonomy\n\n**Just do it.** Use any MCP tool. Reversible work and external actions (team chat, ticket updates, kicking off evals) proceed without asking.\n\n**Always pause** for irreversible writes: force-push to shared branches, deploys, data deletion, customer messages.\n\n**Session overrides:** \"Don't stop\" \u002F \"going to bed\" \u002F \"run until done\" \u002F \"be fully autonomous\" → keep going.\n\n**No is an acceptable answer.** Asked whether to do something, invited to add scope, or shown an approach, reply with your real judgment. Decline, push back, or say \"this doesn't earn its place\" when true. A recommendation is a judgment, not a validation. Agreement is not the default, candor over sycophancy.\n\n## Subagents\n\n**Use `subagent_type: \"patina-agent\"` for any subagent you spawn inside a playbook step** (code-writing delegates, ad-hoc helpers). `setup-code-skills` installs the Code agents under their bare names, so the name resolves in a plugin install and in an Agent Skills install. `\u002Fpatina-mode` and `patina-agent` route through the same wrapper. Routed workflow skills (`how`, `why`, `interrogate`, `reflect`, `swarm`) set their own `subagent_type` for diverse-model review. Respect what the skill prescribes, don't override to `patina-agent`.\n\n**A subagent writes the code.** In a build playbook, the main thread plans, briefs, reviews, and verifies. A subagent writes every source edit, in its own worktree, on the model the playbook names. Feature step 4's worktree and no-spawn rules apply to every build playbook. Fix rounds follow **Fresh subagents by default**. Babysit's repairs are the exception. Its PR owner commits them directly on the owning branch, per `playbooks\u002Fbabysit.md`. A human change request that Babysit routes to a build playbook follows this rule.\n\n**Defaults for every `Agent` call.** `run_in_background: true`, full tool access (do not pick a subagent_type that strips MCP), file pointers not inlined context, explicit model per role (configurable via `\u002Fsetup-pstack`. Role defaults in [Models](#models), with \"judgment and prose\" covering prose and judgment). Code delegates tier by difficulty. The hardest changes (cross-cutting design, gnarly concurrency, subtle algorithms) go to your strongest-judgment model (default in [Models](#models)), whether the task needs judgment on vague intent or is a precisely specified sequence of steps to execute to the letter. Trivial mechanical edits go to your fast code model. Everything else uses the single-role default. Multi-model panels run the configured panel for diversity, with defaults enumerated in each panel skill's Models section (`arena`, `architect`, `interrogate`). Per-role `\u002Fsetup-pstack` lines override these defaults and the model choices in the routed skills (`how`, `why`, `arena`, `swarm`, `architect`, `interrogate`, `reflect`). A role with no line keeps its default, and a role line of `inherit-parent` or `auto` runs that role on the parent session's model (omit `model` on the `Agent` call).\n\nYou own every subagent's work. Review the diff and write your own summary, don't pass through what it said. A second opinion is the same prompt against a different model. Agreement is high-signal.\n\n**Fresh subagents by default.** Give new work to a fresh subagent with consolidated scope, meaning the original brief, every later directive, and the prior agent's report and branch. This holds for a fix round, a follow-up, a retry, and the next queue item. Resume, message, or queue a follow-up on an existing subagent only when the new work strictly needs state that lives in that agent and is costly to move: its local checkout, its uncommitted changes, or a process it still runs, such as a dev server, a simulator, or a babysit watcher. A stop or hold order to a running agent is not reuse. A role such as a PR owner outlives its agent. Once that agent returns, a fresh agent takes the role's next round. Interrupt-chained resumes silently drop directives, so fire a fresh subagent with consolidated scope rather than trusting a \"done\" summary. **Stop the abandoned agent first, and confirm it stopped.** In the agent listing `completed` means the completion was *notified*, not that the process exited: an agent with live background children reports completed and then resumes. Only an explicit stop ends it, and the stop tool may be deferred, so load it before you need it. The tell that one is still running is a claim about the working tree that `git status` contradicts.\n\n**A review gate stays closed when no independent reviewer can run.** An agent limit, subagent dispatch turned off, or a skills-only install can leave a required review with no reviewer. Keep the results of reviewers already dispatched. As the one exception to fresh subagents, reuse a finished reviewer only through the runtime's own follow-up action, only if it did not write the change, and only with the full current brief and head revision. A reused reviewer counts once. Never count your own review, passing tests, or CI as the independent verdict. Record `BLOCKED: independent review` in the todolist, keep merge-ready and shipping closed, and report which reviewers ran and which are missing. Work that doesn't depend on the review continues. A fan-out skill run only to explore may fall back to one labelled sequential pass.\n\n## Writing the reply\n\nWrite the reply clean as you draft it. A cleanup pass after drafting does not remove these patterns.\n\n- **Short declarative sentences.** One thought per sentence, ended with a period.\n- **No long-dash character anywhere.** Write a file-list bullet as a sentence (\"`main.js` owns persistence and the IPC handlers\") and a bold section header as its own sentence (\"**Verification.** End to end via CDP\").\n- **A colon as a mid-sentence connector is also out** (unslop rule 14). A colon before a list is fine.\n- **Terse is not an excuse to drop content.** Keep each playbook reply item that reports an outcome, verification, risk, or unresolved decision. Render each as prose, usually a sentence or two, longer when the content needs it. No section headers, and no item expanded into its own block.\n- **Frame impact for the consumer and the maintainer.** Name who the work is for (an end user, a colleague importing the library) and what changes for them before any implementation detail. Then what the next engineer who owns this code inherits. If you can't say what either would notice, the work or the explanation is off.\n- **Never fabricate a link, citation, or transcript reference.** Link only artifacts you produced or read this session.\n- **Every claim carries its evidence or its label in the same sentence.** Measured, inferred, or guess. A prediction or an unseen cause is a guess. Never hand the human a check you could run.\n\nEvery playbook ends with a reply written this way. Report the outcome, relevant verification, and unresolved decisions. Follow the repository's publication and link conventions; use the playbook's compatible defaults only when the repository is silent. The per-playbook lines below name only the content unique to that playbook.\n\n## Comments\n\nComments follow the same rule as the reply. Write them clean as you go. Keep a comment only for a non-obvious *why* the code can't show. A verify or test script gets no phase-narrating comments such as `\u002F\u002F Phase 1: add cards`. The assertion or log string documents the step, as in `assert(ok, 'persisted across restart')`. This applies to every file you produce, including the delegate's diff.\n\n## Models\n\nRole defaults, stamped from `plugins\u002Fpstack\u002Fmodels.json` (edit there, rerun `tools\u002Fgenerate.mjs`). A matching role line in the `pstack-models.md` override sheet overrides each at runtime; `\u002Fsetup-pstack` writes it and lists its path per runtime.\n\n- feature, refactoring: `opus`\n- bug-fix: `fable`\n- perf-issue: `fable`\n- hillclimb: `fable`\n- judgment and prose: `opus`\n- strongest judgment: `fable`\n\n## Reasoning effort\n\nA role value in the override sheet may name a reasoning effort after its model, as in `opus @xhigh`. Levels on Claude Code: `low`, `medium`, `high`, `xhigh`, `max`. Which ones apply depends on the model. A value without `@` takes the sheet's `default effort` line, a level or `session`, and `session` when the sheet has no such line. `session` sets no effort, so the dispatch is the usual one. Strip the suffix before reading the model: `inherit-parent` or `auto` still omits `model` at every level, and a model name is passed as `model`. On Claude Code, a level picks the effort agent from the `subagent_type` you would otherwise use. `patina-agent` becomes `subagent_type: \"patina-agent-\u003Clevel>\"`. `patina-reader` becomes `subagent_type: \"patina-reader-\u003Clevel>\"`. `general-purpose`, or no `subagent_type`, becomes `subagent_type: \"effort-\u003Clevel>\"`. The effort agents set only `effort`, so the model you pass still decides the model. On Codex, pass the level as `spawn_agent`'s `reasoning_effort` and keep the usual instructions.\n",{"name":5,"description":7},"main","e6ee720f466a8344a52abd87679191fadde3b63f","plugins\u002Fcode\u002Fskills\u002Fpatina-mode","https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills","https:\u002F\u002Fgithub.com\u002Fpatinaproject","https:\u002F\u002Fwww.patinaproject.com","The best way to pick your next pair of boots or shoes.","2026-11-12 00:44:02",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add patinaproject\u002Fskills --skill patina-mode",{"tool":53,"command":54},"bunx","bunx skills add patinaproject\u002Fskills --skill patina-mode",{"tool":56,"command":57},"pnpm","pnpm dlx skills add patinaproject\u002Fskills --skill patina-mode","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002FSKILL.md",true,[61,67,73,77,81,85,89,93,97,101,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,181,185,189,193,197,201,205,209,213,217,221,227,231,235,239,243,247,251,255,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419],{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"evals\u002Fevals.json","REFERENCE","参考文档",8395,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fevals\u002Fevals.json",{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"evals\u002Ffiles\u002Fbug-fix-batching\u002Fsetup.sh","SCRIPT","脚本",2091,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fevals\u002Ffiles\u002Fbug-fix-batching\u002Fsetup.sh",{"path":74,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":75,"sourceHtmlUrl":76},"evals\u002Ffiles\u002Fdriver-beside-linter\u002Fsetup.sh",3100,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fevals\u002Ffiles\u002Fdriver-beside-linter\u002Fsetup.sh",{"path":78,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":79,"sourceHtmlUrl":80},"evals\u002Ffiles\u002Fdriver-legacy-name\u002Fsetup.sh",2628,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fevals\u002Ffiles\u002Fdriver-legacy-name\u002Fsetup.sh",{"path":82,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":83,"sourceHtmlUrl":84},"evals\u002Ffiles\u002Fdriver-prefix-name\u002Fsetup.sh",2558,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fevals\u002Ffiles\u002Fdriver-prefix-name\u002Fsetup.sh",{"path":86,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":87,"sourceHtmlUrl":88},"evals\u002Ffiles\u002Fdriver-suffix-name\u002Fsetup.sh",2565,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fevals\u002Ffiles\u002Fdriver-suffix-name\u002Fsetup.sh",{"path":90,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":91,"sourceHtmlUrl":92},"evals\u002Ffiles\u002Fread-only-retry\u002Fsetup.sh",2017,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fevals\u002Ffiles\u002Fread-only-retry\u002Fsetup.sh",{"path":94,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":95,"sourceHtmlUrl":96},"evals\u002Ffiles\u002Frefactor-pricing\u002Fsetup.sh",1912,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fevals\u002Ffiles\u002Frefactor-pricing\u002Fsetup.sh",{"path":98,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":99,"sourceHtmlUrl":100},"evals\u002FREADME.md",4198,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fevals\u002FREADME.md",{"path":102,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":103,"sourceHtmlUrl":104},"playbooks\u002Fauthoring-a-skill.md",852,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fauthoring-a-skill.md",{"path":106,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":107,"sourceHtmlUrl":108},"playbooks\u002Fautonomous-run.md",1884,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fautonomous-run.md",{"path":110,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":111,"sourceHtmlUrl":112},"playbooks\u002Fautopilot-full.md",11836,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fautopilot-full.md",{"path":114,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":115,"sourceHtmlUrl":116},"playbooks\u002Fautopilot-stack.md",6399,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fautopilot-stack.md",{"path":118,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":119,"sourceHtmlUrl":120},"playbooks\u002Fbabysit.md",9745,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fbabysit.md",{"path":122,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":123,"sourceHtmlUrl":124},"playbooks\u002Fbug-fix.md",2304,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fbug-fix.md",{"path":126,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":127,"sourceHtmlUrl":128},"playbooks\u002Feval.md",2514,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Feval.md",{"path":130,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":131,"sourceHtmlUrl":132},"playbooks\u002Ffeature.md",3510,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Ffeature.md",{"path":134,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":135,"sourceHtmlUrl":136},"playbooks\u002Fhillclimb.md",4413,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fhillclimb.md",{"path":138,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":139,"sourceHtmlUrl":140},"playbooks\u002Finvestigation.md",928,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Finvestigation.md",{"path":142,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":143,"sourceHtmlUrl":144},"playbooks\u002Fmulti-phase-plan.md",13826,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fmulti-phase-plan.md",{"path":146,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":147,"sourceHtmlUrl":148},"playbooks\u002Fopening-a-pr.md",8322,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fopening-a-pr.md",{"path":150,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":151,"sourceHtmlUrl":152},"playbooks\u002Forchestrate.md",20613,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Forchestrate.md",{"path":154,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":155,"sourceHtmlUrl":156},"playbooks\u002Fpause-safely.md",1969,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fpause-safely.md",{"path":158,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":159,"sourceHtmlUrl":160},"playbooks\u002Fperf-issue.md",1455,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fperf-issue.md",{"path":162,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":163,"sourceHtmlUrl":164},"playbooks\u002Fprototype.md",2160,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fprototype.md",{"path":166,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":167,"sourceHtmlUrl":168},"playbooks\u002Frefactoring.md",3316,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Frefactoring.md",{"path":170,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":171,"sourceHtmlUrl":172},"playbooks\u002Fruntime-forensics.md",1209,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fruntime-forensics.md",{"path":174,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":175,"sourceHtmlUrl":176},"playbooks\u002Fsession-pickup.md",3141,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fsession-pickup.md",{"path":178,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":179,"sourceHtmlUrl":180},"playbooks\u002Fshipping.md",8492,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fshipping.md",{"path":182,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":183,"sourceHtmlUrl":184},"playbooks\u002Ftrace-forensics.md",1865,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Ftrace-forensics.md",{"path":186,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":187,"sourceHtmlUrl":188},"playbooks\u002Ftriage.md",24468,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Ftriage.md",{"path":190,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":191,"sourceHtmlUrl":192},"playbooks\u002Fvisual-parity.md",1196,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fvisual-parity.md",{"path":194,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":195,"sourceHtmlUrl":196},"playbooks\u002Fworktree-cleanup.md",3915,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fplaybooks\u002Fworktree-cleanup.md",{"path":198,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":199,"sourceHtmlUrl":200},"references\u002Fagents\u002Fcomment-sicko.md",2249,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Fagents\u002Fcomment-sicko.md",{"path":202,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":203,"sourceHtmlUrl":204},"references\u002Fbugbot-triage.md",9629,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Fbugbot-triage.md",{"path":206,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":207,"sourceHtmlUrl":208},"references\u002Fcodex-tools.md",12355,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Fcodex-tools.md",{"path":210,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":211,"sourceHtmlUrl":212},"references\u002Fcopilot-tools.md",20553,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Fcopilot-tools.md",{"path":214,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":215,"sourceHtmlUrl":216},"references\u002Fgithub-stacks.md",5656,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Fgithub-stacks.md",{"path":218,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":219,"sourceHtmlUrl":220},"references\u002Fissue-handoff.md",3439,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Fissue-handoff.md",{"path":222,"resourceType":223,"resourceTypeDesc":224,"sizeBytes":225,"sourceHtmlUrl":226},"references\u002Flicenses\u002FLICENSE","LICENSE","许可证",1101,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Flicenses\u002FLICENSE",{"path":228,"resourceType":223,"resourceTypeDesc":224,"sizeBytes":229,"sourceHtmlUrl":230},"references\u002Flicenses\u002FLICENSE-cursor-team-kit",1063,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Flicenses\u002FLICENSE-cursor-team-kit",{"path":232,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":233,"sourceHtmlUrl":234},"references\u002Flicenses\u002FNOTICE.md",1971,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Flicenses\u002FNOTICE.md",{"path":236,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":237,"sourceHtmlUrl":238},"references\u002Fmerge-safety.md",5409,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Fmerge-safety.md",{"path":240,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":241,"sourceHtmlUrl":242},"references\u002Fpi-tools.md",20167,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Fpi-tools.md",{"path":244,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":245,"sourceHtmlUrl":246},"references\u002Fplan.md",5242,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Fplan.md",{"path":248,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":249,"sourceHtmlUrl":250},"references\u002Freadiness.md",6070,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Freadiness.md",{"path":252,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":253,"sourceHtmlUrl":254},"references\u002Fresume-storage.md",3678,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Freferences\u002Fresume-storage.md",{"path":256,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":257,"sourceHtmlUrl":258},"scripts\u002F.prettierignore",446,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002F.prettierignore",{"path":260,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":261,"sourceHtmlUrl":262},"scripts\u002F.prettierrc.json",29,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002F.prettierrc.json",{"path":264,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":265,"sourceHtmlUrl":266},"scripts\u002Fbootstrap.ts",1848,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fbootstrap.ts",{"path":268,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":269,"sourceHtmlUrl":270},"scripts\u002Fbun.lock",6679,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fbun.lock",{"path":272,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":273,"sourceHtmlUrl":274},"scripts\u002Fcheck-plan.mjs",8232,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fcheck-plan.mjs",{"path":276,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":277,"sourceHtmlUrl":278},"scripts\u002Fcheck-playbooks.mjs",3023,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fcheck-playbooks.mjs",{"path":280,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":281,"sourceHtmlUrl":282},"scripts\u002Fissue-handoff.test.ts",11953,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fissue-handoff.test.ts",{"path":284,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":285,"sourceHtmlUrl":286},"scripts\u002Fissue-handoff.ts",8880,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fissue-handoff.ts",{"path":288,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":289,"sourceHtmlUrl":290},"scripts\u002Fissue-handoff.tsconfig.json",344,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fissue-handoff.tsconfig.json",{"path":292,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":293,"sourceHtmlUrl":294},"scripts\u002Fissue-routes\u002Fdirect.ts",85,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fissue-routes\u002Fdirect.ts",{"path":296,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":297,"sourceHtmlUrl":298},"scripts\u002Fissue-routes\u002Fsession-pickup.ts",93,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fissue-routes\u002Fsession-pickup.ts",{"path":300,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":301,"sourceHtmlUrl":302},"scripts\u002Forch\u002Forch.test.ts",41650,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Forch\u002Forch.test.ts",{"path":304,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":305,"sourceHtmlUrl":306},"scripts\u002Forch\u002Forch.ts",15511,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Forch\u002Forch.ts",{"path":308,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":309,"sourceHtmlUrl":310},"scripts\u002Forch\u002Fstore.ts",47900,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Forch\u002Fstore.ts",{"path":312,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":313,"sourceHtmlUrl":314},"scripts\u002Fpackage.json",438,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fpackage.json",{"path":316,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":317,"sourceHtmlUrl":318},"scripts\u002Fresume.mjs",7309,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fresume.mjs",{"path":320,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":321,"sourceHtmlUrl":322},"scripts\u002Ftsconfig.json",304,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Ftsconfig.json",{"path":324,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":325,"sourceHtmlUrl":326},"scripts\u002Fwatch-pr\u002Fcli.test.ts",11487,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fcli.test.ts",{"path":328,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":329,"sourceHtmlUrl":330},"scripts\u002Fwatch-pr\u002Fcli.ts",8308,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fcli.ts",{"path":332,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":333,"sourceHtmlUrl":334},"scripts\u002Fwatch-pr\u002Fdeadline.ts",522,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fdeadline.ts",{"path":336,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":337,"sourceHtmlUrl":338},"scripts\u002Fwatch-pr\u002Ffakes.test-helper.ts",3627,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Ffakes.test-helper.ts",{"path":340,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":341,"sourceHtmlUrl":342},"scripts\u002Fwatch-pr\u002Fgithub.test.ts",20489,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fgithub.test.ts",{"path":344,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":345,"sourceHtmlUrl":346},"scripts\u002Fwatch-pr\u002Fgithub.ts",31531,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fgithub.ts",{"path":348,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":349,"sourceHtmlUrl":350},"scripts\u002Fwatch-pr\u002Fintegrity.test.ts",24843,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fintegrity.test.ts",{"path":352,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":353,"sourceHtmlUrl":354},"scripts\u002Fwatch-pr\u002Flanding.ts",3008,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Flanding.ts",{"path":356,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":357,"sourceHtmlUrl":358},"scripts\u002Fwatch-pr\u002Flive-merge-safety.mjs",7583,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Flive-merge-safety.mjs",{"path":360,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":361,"sourceHtmlUrl":362},"scripts\u002Fwatch-pr\u002Fpolicy.test.ts",33939,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fpolicy.test.ts",{"path":364,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":365,"sourceHtmlUrl":366},"scripts\u002Fwatch-pr\u002Fpolicy.ts",30007,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fpolicy.ts",{"path":368,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":369,"sourceHtmlUrl":370},"scripts\u002Fwatch-pr\u002Frender.ts",9078,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Frender.ts",{"path":372,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":373,"sourceHtmlUrl":374},"scripts\u002Fwatch-pr\u002Fship-pr",220,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fship-pr",{"path":376,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":377,"sourceHtmlUrl":378},"scripts\u002Fwatch-pr\u002Fshipping-cli.test.ts",5459,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fshipping-cli.test.ts",{"path":380,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":381,"sourceHtmlUrl":382},"scripts\u002Fwatch-pr\u002Fshipping-cli.ts",2340,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fshipping-cli.ts",{"path":384,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":385,"sourceHtmlUrl":386},"scripts\u002Fwatch-pr\u002Fshipping.test-helper.ts",2103,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fshipping.test-helper.ts",{"path":388,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":389,"sourceHtmlUrl":390},"scripts\u002Fwatch-pr\u002Fshipping.test.ts",11229,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fshipping.test.ts",{"path":392,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":393,"sourceHtmlUrl":394},"scripts\u002Fwatch-pr\u002Fshipping.ts",6892,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fshipping.ts",{"path":396,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":397,"sourceHtmlUrl":398},"scripts\u002Fwatch-pr\u002Ftransport.test.ts",8451,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Ftransport.test.ts",{"path":400,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":401,"sourceHtmlUrl":402},"scripts\u002Fwatch-pr\u002Ftsconfig.json",270,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Ftsconfig.json",{"path":404,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":405,"sourceHtmlUrl":406},"scripts\u002Fwatch-pr\u002Ftypes.compile.ts",2697,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Ftypes.compile.ts",{"path":408,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":409,"sourceHtmlUrl":410},"scripts\u002Fwatch-pr\u002Ftypes.ts",13894,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Ftypes.ts",{"path":412,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":413,"sourceHtmlUrl":414},"scripts\u002Fwatch-pr\u002Fwatch-pr",211,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fwatch-pr",{"path":416,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":417,"sourceHtmlUrl":418},"scripts\u002Fwatch-pr\u002Fwrapper.test.ts",587,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fwatch-pr\u002Fwrapper.test.ts",{"path":420,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":421,"sourceHtmlUrl":422},"scripts\u002Fworktree-audit.mjs",16952,"https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fpatina-mode\u002Fscripts\u002Fworktree-audit.mjs",[424,432,460,472,495,518],{"skillNo":425,"name":426,"nameZh":6,"description":427,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":428,"categories":429,"keywords":430,"publishedAt":431},"01M72KDQJR99954NE224VB3KZ2","code-review","Review the changes since a fixed point (commit, branch, tag, or merge-base) along five axes: Standards (does the code follow this repo's documented coding standards?), Spec (does the code match what the originating issue\u002Fspec asked for?), Evidence (does each claim in the pull request have evidence that shows it?), Bugs (does the changed code have logic errors, unhandled states, races, or regressions?), and Security (does the change open injection, auth, secret, input, or CI workflow holes?). Runs the reviews in parallel sub-agents, tags every finding Important, Nit, or Pre-existing, and reports them side by side with what blocks merge. Given an earlier reviewed head and its findings, it reviews only the newer commits, rechecks the earlier findings, and never repeats one. Use when the user wants to review a branch, a PR, work-in-progress changes, or asks to \"review since X\".","https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fcode\u002Fskills\u002Fcode-review\u002FSKILL.md",[],[],"2026-11-10 22:39:42",{"skillNo":433,"name":434,"nameZh":6,"description":435,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":436,"categories":437,"keywords":448,"publishedAt":34},"01M71ESEDVHD9EXN6787XHP7HD","writing-for-pstack","Write or tighten an operator prompt for a patina-mode run. Use when the operator asks to write, revise, or review a prompt that will be passed to patina-mode.","https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fwork\u002Fskills\u002Fwriting-for-pstack\u002FSKILL.md",[438,443],{"categoryNo":439,"categoryName":440,"taxonomyType":441,"taxonomyTypeDesc":442},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":444,"categoryName":445,"taxonomyType":446,"taxonomyTypeDesc":447},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[21,449,450,451,452,453,19,454,455,23,456,457,458,459],"pstack","writing","writing for pstack","review","run","write","operator","tighten","prompt","when","revise",{"skillNo":461,"name":462,"nameZh":6,"description":463,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":464,"categories":465,"keywords":468,"publishedAt":34},"01M71ESCJ0SSJFFENF8HYDKBTJ","writing-for-agents","Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.","https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fwork\u002Fskills\u002Fwriting-for-agents\u002FSKILL.md",[466,467],{"categoryNo":439,"categoryName":440,"taxonomyType":441,"taxonomyTypeDesc":442},{"categoryNo":444,"categoryName":445,"taxonomyType":446,"taxonomyTypeDesc":447},[469,21,450,470,23,471,458],"writing for agents","editing","documents",{"skillNo":473,"name":474,"nameZh":6,"description":475,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":476,"categories":477,"keywords":478,"publishedAt":34},"01M71ESA1NN9WVMD2HA5Z1RRDY","wizard","Generate an interactive bash wizard that walks a human through steps only they can perform. Use when provisioning infrastructure, setting up credentials or CI secrets, walking an unfamiliar third-party dashboard, or running a one-off migration or cutover. Don't invoke this for steps the agent can perform itself.","https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fwork\u002Fskills\u002Fwizard\u002FSKILL.md",[],[474,479,480,481,482,483,458,484,485,486,487,488,23,489,490,491,21,492,493,494],"interactive","can","credentials","one","Bash","invoke","dashboard","generate","human","secrets","provisioning infrastructure","ci","up","setting","running","only",{"skillNo":496,"name":497,"nameZh":6,"description":498,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":499,"categories":500,"keywords":501,"publishedAt":34},"01M71ES8FAN567N3JEPG8W6AS1","wayfinder","Plan a huge chunk of work (more than one agent session can hold) as a shared map of decision tickets on your issue tracker, and resolve them one at a time until the way to the destination is clear.","https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fwork\u002Fskills\u002Fwayfinder\u002FSKILL.md",[],[497,502,503,504,505,506,507,508,509,510,511,512,513,514,515,25,516,480,517,482],"more","true","decision","session","time","chunk","as","shared","map","tickets","destination","at","tracker","plan","agent session","one at a time",{"skillNo":519,"name":520,"nameZh":6,"description":521,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":522,"categories":523,"keywords":524,"publishedAt":34},"01M71ES6PWJPKBW8R24YFH4PY6","wait-what","Stop. That last message did not land: re-pitch it.","https:\u002F\u002Fgithub.com\u002Fpatinaproject\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fwork\u002Fskills\u002Fwait-what\u002FSKILL.md",[],[525,526,527,528,529,530,531,532,503,533],"wait","wait what","stop","it","land","re","pitch","message","last"]