{"id":"30ab20e2-a396-4681-bf0c-873daea2bda5","shortId":"SVUWNL","kind":"skill","title":"finalize","tagline":"Run the post-implementation quality assurance workflow including tests, code polishing, review, and commit. Use when the user asks to \"finalize implementation\", \"finalize changes\", \"wrap up implementation\", \"finish up\", \"ready to commit\", or \"run QA workflow\".","description":"# Finalize Implementation\n\nPost-implementation QA workflow: tests, code polishing, commit, and self-improvement.\n\n## Task Tracking\n\nAt the start, use `TaskCreate` to create a task for each phase:\n\n1. Run `/polish-code` skill\n2. Run `/update-changelog` skill\n3. Run `/self-improve` skill\n4. Ship It\n\n## Phase 1: Run `/polish-code` Skill\n\nRun the `/polish-code` skill for the current changes.\n\n## Phase 2: Run `/update-changelog` Skill\n\nRun the `/update-changelog` skill.\n\n## Phase 3: Run `/self-improve` Skill\n\nRun the `/self-improve` skill for the current session. Always run this phase even if the session seemed routine.\n\n## Phase 4: Ship It\n\n### Step 1: Analyze Split\n\nExamine the staged changes and evaluate whether they should be split into multiple commits, branches, and PRs for reviewability.\n\nDetect the repository's default branch via `gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'`. Check the current branch name and whether a PR already exists for it using `gh pr view`. If a PR exists, read its title and description to understand the branch's purpose. This context informs which changes belong on the current branch and which should be split off.\n\nRun `git diff --cached --stat` and `git diff --cached` to understand the scope. Categorize changes along three dimensions:\n\n- **Concern type**: refactoring, bug fix, new feature, cleanup, dependency update\n- **Layer/domain**: backend, frontend, database migrations, i18n, tests, configuration\n- **Logical unit**: files that form a coherent, independently reviewable change\n\nA split is warranted when the staged changes contain multiple reviewable units. Each unit should be independently understandable, testable, and revertable. When deciding group boundaries, consider whether a reviewer could evaluate each group without needing context from the others.\n\n### Step 2: Present Analysis and Choose Path\n\nOutput the split analysis as text.\n\nIf changes form a single cohesive unit, note this and run the `/ship` skill.\n\nIf changes span multiple reviewable units, propose an ordered list of groups. For each group, specify:\n\n- Name and one-line description\n- File list (flag files with mixed-concern hunks)\n- Branch topology: stacked on the previous group (when this group depends on it) or independent (when it can stand alone)\n\nUse `AskUserQuestion` to let the user choose: ship as a single commit/PR, or split.\n\n- **Ship** — run the `/ship` skill\n- **Split** — run the `/split-and-ship` skill\n\nThen use the TaskList tool and proceed to any remaining task.\n\n## Rules\n\n- Diff size, number of files changed, passing tests, perceived user urgency, or context window concerns are not reasons to skip a phase. Each phase does work beyond what those signals cover. \"The session was long\" or \"a prior phase was thorough\" are never valid reasons to skip a later phase.\n- Never stage or commit files containing secrets (`.env`, credentials, API keys). Warn if detected.\n- Do not present diffs to the user — the user reviews diffs in an external git client. Use `git diff` internally as needed.\n- If a non-test step fails (polish, review), stop and report the failure. Do not skip ahead.","tags":["finalize","turbo","tobihagemann","agent-skills","claude-code","claude-skills","developer-tools","skills"],"capabilities":["skill","source-tobihagemann","skill-finalize","topic-agent-skills","topic-claude-code","topic-claude-skills","topic-developer-tools","topic-skills"],"categories":["turbo"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/tobihagemann/turbo/finalize","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add tobihagemann/turbo","source_repo":"https://github.com/tobihagemann/turbo","install_from":"skills.sh"}},"qualityScore":"0.590","qualityRationale":"deterministic score 0.59 from registry signals: · indexed on github topic:agent-skills · 280 github stars · SKILL.md body (3,159 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T00:54:09.659Z","embedding":null,"createdAt":"2026-04-18T22:03:45.175Z","updatedAt":"2026-04-22T00:54:09.659Z","lastSeenAt":"2026-04-22T00:54:09.659Z","tsv":"'/polish-code':70,86,90 '/self-improve':78,108,112 '/ship':327,397 '/split-and-ship':402 '/update-changelog':74,99,103 '1':68,84,133 '2':72,97,303 '3':76,106 '4':80,129 'ahead':519 'alon':379 'along':232 'alreadi':178 'alway':118 'analysi':305,312 'analyz':134 'api':475 'ask':21 'askuserquest':381 'assur':8 'backend':246 'belong':206 'beyond':442 'boundari':287 'branch':150,160,172,198,210,360 'bug':238 'cach':220,225 'categor':230 'chang':26,95,139,205,231,262,270,316,330,421 'check':169 'choos':307,386 'cleanup':242 'client':495 'code':12,47 'coher':259 'cohes':320 'commit':16,34,49,149,469 'commit/pr':391 'concern':235,358,430 'configur':252 'consid':288 'contain':271,471 'context':202,298,428 'could':292 'cover':446 'creat':62 'credenti':474 'current':94,116,171,209 'databas':248 'decid':285 'default':159 'defaultbranchref':166 'defaultbranchref.name':168 'depend':243,370 'descript':194,350 'detect':155,479 'diff':219,224,416,483,490,498 'dimens':234 'env':473 'evalu':141,293 'even':122 'examin':136 'exist':179,189 'extern':493 'fail':508 'failur':515 'featur':241 'file':255,351,354,420,470 'final':1,23,25,39 'finish':30 'fix':239 'flag':353 'form':257,317 'frontend':247 'gh':162,183 'git':218,223,494,497 'group':286,295,340,343,366,369 'hunk':359 'i18n':250 'implement':6,24,29,40,43 'improv':53 'includ':10 'independ':260,279,374 'inform':203 'intern':499 'jq':167 'json':165 'key':476 'later':464 'layer/domain':245 'let':383 'line':349 'list':338,352 'logic':253 'long':450 'migrat':249 'mix':357 'mixed-concern':356 'multipl':148,272,332 'name':173,345 'need':297,501 'never':458,466 'new':240 'non':505 'non-test':504 'note':322 'number':418 'one':348 'one-lin':347 'order':337 'other':301 'output':309 'pass':422 'path':308 'perceiv':424 'phase':67,83,96,105,121,128,437,439,454,465 'polish':13,48,509 'post':5,42 'post-implement':4,41 'pr':177,184,188 'present':304,482 'previous':365 'prior':453 'proceed':410 'propos':335 'prs':152 'purpos':200 'qa':37,44 'qualiti':7 'read':190 'readi':32 'reason':433,460 'refactor':237 'remain':413 'repo':163 'report':513 'repositori':157 'revert':283 'review':14,154,261,273,291,333,489,510 'routin':127 'rule':415 'run':2,36,69,73,77,85,88,98,101,107,110,119,217,325,395,400 'scope':229 'secret':472 'seem':126 'self':52 'self-improv':51 'session':117,125,448 'ship':81,130,387,394 'signal':445 'singl':319,390 'size':417 'skill':71,75,79,87,91,100,104,109,113,328,398,403 'skill-finalize' 'skip':435,462,518 'source-tobihagemann' 'span':331 'specifi':344 'split':135,146,215,264,311,393,399 'stack':362 'stage':138,269,467 'stand':378 'start':58 'stat':221 'step':132,302,507 'stop':511 'task':54,64,414 'taskcreat':60 'tasklist':407 'test':11,46,251,423,506 'testabl':281 'text':314 'thorough':456 'three':233 'titl':192 'tool':408 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-developer-tools' 'topic-skills' 'topolog':361 'track':55 'type':236 'understand':196,227,280 'unit':254,274,276,321,334 'updat':244 'urgenc':426 'use':17,59,182,380,405,496 'user':20,385,425,486,488 'valid':459 'via':161 'view':164,185 'warn':477 'warrant':266 'whether':142,175,289 'window':429 'without':296 'work':441 'workflow':9,38,45 'wrap':27","prices":[{"id":"6bf9d0e3-8661-4792-a7a6-6bef5a2f90e2","listingId":"30ab20e2-a396-4681-bf0c-873daea2bda5","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"tobihagemann","category":"turbo","install_from":"skills.sh"},"createdAt":"2026-04-18T22:03:45.175Z"}],"sources":[{"listingId":"30ab20e2-a396-4681-bf0c-873daea2bda5","source":"github","sourceId":"tobihagemann/turbo/finalize","sourceUrl":"https://github.com/tobihagemann/turbo/tree/main/skills/finalize","isPrimary":false,"firstSeenAt":"2026-04-18T22:03:45.175Z","lastSeenAt":"2026-04-22T00:54:09.659Z"}],"details":{"listingId":"30ab20e2-a396-4681-bf0c-873daea2bda5","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"tobihagemann","slug":"finalize","github":{"repo":"tobihagemann/turbo","stars":280,"topics":["agent-skills","claude-code","claude-skills","developer-tools","skills"],"license":"mit","html_url":"https://github.com/tobihagemann/turbo","pushed_at":"2026-04-21T12:22:12Z","description":"A composable dev process for Claude Code, packaged as modular skills.","skill_md_sha":"3bfeba68781891160700bddcf7d46accf9c28cb6","skill_md_path":"skills/finalize/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/tobihagemann/turbo/tree/main/skills/finalize"},"layout":"multi","source":"github","category":"turbo","frontmatter":{"name":"finalize","description":"Run the post-implementation quality assurance workflow including tests, code polishing, review, and commit. Use when the user asks to \"finalize implementation\", \"finalize changes\", \"wrap up implementation\", \"finish up\", \"ready to commit\", or \"run QA workflow\"."},"skills_sh_url":"https://skills.sh/tobihagemann/turbo/finalize"},"updatedAt":"2026-04-22T00:54:09.659Z"}}