{"id":"818bbb2a-da82-4207-b0df-2d5bf8622f4f","shortId":"DfczbT","kind":"skill","title":"create-test-plan","tagline":"Analyze what changed and generate a structured test plan at .turbo/test-plan.md covering four escalating levels: basic functionality, complex operations, adversarial testing, and cross-cutting scenarios. Use when the user asks to \"create a test plan\", \"plan tests\", \"what should I","description":"# Create Test Plan\n\nAnalyze what changed and generate a comprehensive test plan covering four escalating levels of testing depth.\n\n## Step 1: Determine Scope\n\nResolve scope using the first match:\n\n1. **User-specified** — the user says what to test. Use that.\n2. **PR** — a PR URL or number is provided. Fetch the PR details (title, description, changed files, comments) and read the changed code.\n3. **Conversation context** — prior conversation contains recent work (a feature, fix, or refactor). Extract what changed, where it lives, and expected behavior.\n4. **App-level discovery** — fresh context with no prior work. Examine the project (entry points, routes, commands, README) to identify the app's core user-facing flows.\n\n## Step 2: Analyze the Change\n\nAfter identifying scope, read the actual code in depth to understand:\n\n- What was added, modified, or removed\n- Expected behavior (from PR descriptions, comments, commit messages, or specs)\n- Assumptions the implementation makes\n- Error paths and edge cases\n- Other features or components that could be affected\n\n## Step 3: Determine Testing Approach\n\nAlways check for project-specific testing skills or MCP tools first. Use the fallbacks below when nothing project-specific is available:\n\n- **Web app** → `/agent-browser` skill if available, otherwise `claude-in-chrome` MCP\n- **UI/native app** → `computer-use` MCP\n- **CLI tool** → direct terminal execution\n- **Library with no entry point** → report that interactive testing is not applicable and stop\n\n## Step 4: Generate the Test Plan\n\nFor each level, generate specific, actionable test scenarios tailored to the actual change. Each scenario needs exact steps and an expected outcome.\n\n### Level 1: Basic Functionality\n\nDoes the feature work at all? Verify the happy path and the most obvious behavior.\n\n- Core feature works as described\n- Expected output/UI matches the spec or PR description\n- No regressions in directly related functionality\n\n### Level 2: Complex Operations\n\nCombine multiple actions in sequence. Verify state consistency across operations.\n\n- Chain related operations (e.g., create, edit, rename, delete)\n- Exercise different combinations of feature parameters\n- Verify intermediate states are correct, not just the final result\n\n### Level 3: Adversarial Testing\n\nActively try to break the feature. Explore boundary conditions and unexpected inputs.\n\n- Invalid, empty, or extreme inputs\n- Rapid repeated actions\n- Interrupting operations midway (cancel, disconnect, close)\n- Resource limits (very large files, deep structures, long names)\n- Permission and access edge cases\n\n### Level 4: Cross-Cutting Scenarios\n\nExplore state interactions across system boundaries. These surface the hardest bugs.\n\n- Concurrent modifications from different sources\n- State transitions (online to offline to online, foreground to background)\n- Interactions with other features that share state\n- Race conditions between asynchronous operations\n\n### When a Level Does Not Apply\n\nIf the change is small enough that a level has no meaningful scenarios (e.g., a typo fix has no cross-cutting scenarios), note \"N/A for this change\" with a brief explanation.\n\n## Step 5: Present and Write\n\nOutput the plan as text. Then use `AskUserQuestion` to ask for approval before writing.\n\nCreate the `.turbo/` directory if it does not exist. Write the plan to `.turbo/test-plan.md` using this format:\n\n```markdown\n# Test Plan: <Feature/Change Name>\n\n## Context\n\n<Brief description of what changed and why>\n\n## Approach\n\n<Testing approach: agent-browser / claude-in-chrome / computer-use / terminal>\n<Dev server command if applicable>\n\n## Level 1: Basic Functionality\n\n- [ ] **<Test name>** — <Steps to perform> → Expected: <expected outcome>\n\n## Level 2: Complex Operations\n\n- [ ] **<Test name>** — <Steps to perform> → Expected: <expected outcome>\n\n## Level 3: Adversarial Testing\n\n- [ ] **<Test name>** — <Steps to perform> → Expected: <expected outcome>\n\n## Level 4: Cross-Cutting Scenarios\n\n- [ ] **<Test name>** — <Steps to perform> → Expected: <expected outcome>\n```\n\n## Rules\n\n- Generate at least 2 scenarios per level, more for complex changes.\n- Each scenario must have concrete steps and an expected outcome specific to the change.\n- Tailor all scenarios to the actual change. Generic test advice is not useful.","tags":["create","test","plan","turbo","tobihagemann","agent-skills","claude-code","claude-skills","developer-tools","skills"],"capabilities":["skill","source-tobihagemann","skill-create-test-plan","topic-agent-skills","topic-claude-code","topic-claude-skills","topic-developer-tools","topic-skills"],"categories":["turbo"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/tobihagemann/turbo/create-test-plan","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 (4,325 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:08.828Z","embedding":null,"createdAt":"2026-04-18T22:03:38.367Z","updatedAt":"2026-04-22T00:54:08.828Z","lastSeenAt":"2026-04-22T00:54:08.828Z","tsv":"'/agent-browser':240 '1':66,75,304,549 '2':87,162,342,554,574 '3':110,211,380,559 '4':132,276,424,564 '5':506 'access':420 'across':353,432 'action':286,347,402 'activ':383 'actual':171,292,601 'ad':179 'adversari':24,381,560 'advic':605 'affect':209 'alway':215 'analyz':5,49,163 'app':134,154,239,251 'app-level':133 'appli':472 'applic':272 'approach':214,547 'approv':521 'ask':35,519 'askuserquest':517 'assumpt':193 'asynchron':465 'avail':237,243 'background':454 'basic':20,305,550 'behavior':131,184,321 'boundari':390,434 'break':386 'brief':503 'bug':439 'cancel':406 'case':201,422 'chain':355 'chang':7,51,102,108,125,165,293,475,500,581,595,602 'check':216 'chrome':248 'claud':246 'claude-in-chrom':245 'cli':256 'close':408 'code':109,172 'combin':345,365 'command':149 'comment':104,188 'commit':189 'complex':22,343,555,580 'compon':205 'comprehens':55 'comput':253 'computer-us':252 'concret':586 'concurr':440 'condit':391,463 'consist':352 'contain':115 'context':112,138,546 'convers':111,114 'core':156,322 'correct':373 'could':207 'cover':16,58 'creat':2,37,46,359,524 'create-test-plan':1 'cross':28,426,493,566 'cross-cut':27,425,492,565 'cut':29,427,494,567 'deep':414 'delet':362 'depth':64,174 'describ':326 'descript':101,187,334 'detail':99 'determin':67,212 'differ':364,443 'direct':258,338 'directori':527 'disconnect':407 'discoveri':136 'e.g':358,486 'edg':200,421 'edit':360 'empti':396 'enough':478 'entri':146,264 'error':197 'escal':18,60 'exact':297 'examin':143 'execut':260 'exercis':363 'exist':532 'expect':130,183,301,327,552,557,562,569,590 'explan':504 'explor':389,429 'extract':123 'extrem':398 'face':159 'fallback':229 'featur':119,203,309,323,367,388,458 'feature/change':544 'fetch':96 'file':103,413 'final':377 'first':73,226 'fix':120,489 'flow':160 'foreground':452 'format':540 'four':17,59 'fresh':137 'function':21,306,340,551 'generat':9,53,277,284,571 'generic':603 'happi':315 'hardest':438 'identifi':152,167 'implement':195 'input':394,399 'interact':268,431,455 'intermedi':370 'interrupt':403 'invalid':395 'larg':412 'least':573 'level':19,61,135,283,303,341,379,423,469,481,548,553,558,563,577 'librari':261 'limit':410 'live':128 'long':416 'make':196 'markdown':541 'match':74,329 'mcp':224,249,255 'meaning':484 'messag':190 'midway':405 'modif':441 'modifi':180 'multipl':346 'must':584 'n/a':497 'name':417,545 'need':296 'note':496 'noth':232 'number':93 'obvious':320 'offlin':449 'onlin':447,451 'oper':23,344,354,357,404,466,556 'otherwis':244 'outcom':302,591 'output':510 'output/ui':328 'paramet':368 'path':198,316 'per':576 'permiss':418 'plan':4,13,40,41,48,57,280,512,535,543 'point':147,265 'pr':88,90,98,186,333 'present':507 'prior':113,141 'project':145,219,234 'project-specif':218,233 'provid':95 'race':462 'rapid':400 'read':106,169 'readm':150 'recent':116 'refactor':122 'regress':336 'relat':339,356 'remov':182 'renam':361 'repeat':401 'report':266 'resolv':69 'resourc':409 'result':378 'rout':148 'rule':570 'say':81 'scenario':30,288,295,428,485,495,568,575,583,598 'scope':68,70,168 'sequenc':349 'share':460 'skill':222,241 'skill-create-test-plan' 'small':477 'sourc':444 'source-tobihagemann' 'spec':192,331 'specif':220,235,285,592 'specifi':78 'state':351,371,430,445,461 'step':65,161,210,275,298,505,587 'stop':274 'structur':11,415 'surfac':436 'system':433 'tailor':289,596 'termin':259 'test':3,12,25,39,42,47,56,63,84,213,221,269,279,287,382,542,561,604 'text':514 'titl':100 'tool':225,257 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-developer-tools' 'topic-skills' 'transit':446 'tri':384 'turbo':526 'turbo/test-plan.md':15,537 'typo':488 'ui/native':250 'understand':176 'unexpect':393 'url':91 'use':31,71,85,227,254,516,538,608 'user':34,77,80,158 'user-fac':157 'user-specifi':76 'verifi':313,350,369 'web':238 'work':117,142,310,324 'write':509,523,533","prices":[{"id":"305eaa25-042a-4f2b-bc04-d55b6f71f183","listingId":"818bbb2a-da82-4207-b0df-2d5bf8622f4f","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:38.367Z"}],"sources":[{"listingId":"818bbb2a-da82-4207-b0df-2d5bf8622f4f","source":"github","sourceId":"tobihagemann/turbo/create-test-plan","sourceUrl":"https://github.com/tobihagemann/turbo/tree/main/skills/create-test-plan","isPrimary":false,"firstSeenAt":"2026-04-18T22:03:38.367Z","lastSeenAt":"2026-04-22T00:54:08.828Z"}],"details":{"listingId":"818bbb2a-da82-4207-b0df-2d5bf8622f4f","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"tobihagemann","slug":"create-test-plan","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":"c3b058cee956d0f68481ff482c0460cfdea8052b","skill_md_path":"skills/create-test-plan/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/tobihagemann/turbo/tree/main/skills/create-test-plan"},"layout":"multi","source":"github","category":"turbo","frontmatter":{"name":"create-test-plan","description":"Analyze what changed and generate a structured test plan at .turbo/test-plan.md covering four escalating levels: basic functionality, complex operations, adversarial testing, and cross-cutting scenarios. Use when the user asks to \"create a test plan\", \"plan tests\", \"what should I test\", \"generate test scenarios\", \"test plan for this PR\", or \"what are the test cases\"."},"skills_sh_url":"https://skills.sh/tobihagemann/turbo/create-test-plan"},"updatedAt":"2026-04-22T00:54:08.828Z"}}