{"id":"3e003712-8902-4347-8fb9-c1ff8e36e5e4","shortId":"tYnULE","kind":"skill","title":"review-coverage","tagline":"Use when the user asks for a coverage review, test coverage analysis, coverage gap analysis, uncovered code review, or wants to know what new/changed Go code is missing tests. Runs `go test -coverprofile` against the resolved scope and reports uncovered functions in changed Go fi","description":"# Coverage Review\n\nStructured Go test-coverage review producing actionable findings: which new or modified functions in the scope are not exercised by the test suite. Reports per-package coverage and (when a baseline exists) per-package coverage delta.\n\n## Workflow\n\n### 1. Scope and resolve\n\n- Confirm scope with the user: full codebase, specific packages/directories, changed files only (PR or branch diff), or specific concern.\n- **Resolve scope to a file/package list.** Based on what the user requested:\n  - **Changed files (PR or branch):** Run `git diff --name-only --diff-filter=d <base>...HEAD` to get changed files (default `<base>` is `main`). If the user references a PR number, use `gh pr diff <number> --name-only` instead. Filter to `.go` files. Derive affected Go packages from the file paths (unique parent directories containing `.go` files).\n  - **Explicit paths/packages:** The user may specify directories (e.g. `internal/auth/`), Go package patterns (e.g. `./internal/auth/...`), or individual files. When given a directory or package pattern, include all `.go` files under it.\n  - **Full codebase:** No filtering. Coverage analysis applies to every package (default).\n- **Filter the resolved file list:**\n  - `.go` files only\n  - Exclude `_test.go`\n  - Exclude generated code: anything under `gen/`, `internal/store/db/`, or files whose first 100 lines contain `// Code generated` or `DO NOT EDIT`\n- Derive affected Go packages (unique parent dirs with surviving `.go` files).\n- **If invoked from review-all**: receive `file_list`, `package_paths`, `has_changes`, `base_ref`, and `REVIEW_DIR` from the orchestrator. Skip your own scope confirmation and use the provided values directly.\n- Set `has_changes` true when scope is \"changed files\" or when explicit paths have a diff against the base ref. False for full-codebase reviews with no diff baseline. When false, the skill still reports per-package coverage but cannot compute a \"changed functions\" delta.\n\n### 2. Run baseline coverage\n\nRun from the repo root:\n\n```sh\ngo test -short -count=1 -covermode=atomic -coverprofile=coverage.out -coverpkg=./... ./...\n```\n\n`-coverpkg=./...` ensures cross-package coverage so e2e and integration tests count toward unit packages.\n\nIf the test suite fails, surface the failure and stop. Do not attempt partial analysis or report misleading 0% coverage.\n\nIf a `Taskfile.yaml` defines a `test:cover` (or similar) target that runs equivalent coverage, prefer it over the raw command and capture its `coverage.out` output. If unsure, run the raw command above.\n\n### 3. Parse the coverage profile\n\n```sh\ngo tool cover -func=coverage.out\n```\n\nParse output rows of the form `<file>:<line>:\t<funcName>\t<percent>%`. Filter rows to functions defined in the scoped/changed files (match by file path prefix). Compute per-package coverage by aggregating function-level results within each package directory.\n\n### 4. Identify changed/new functions (when `has_changes` is true)\n\nFor each changed file, run `git diff <base>...HEAD -- <file>` and parse:\n- Hunk headers (`@@ ... @@ func Name(...)` or `@@ ... @@ method (...) Name(...)`) for surrounding function names\n- Added lines (`+` prefix) to determine which functions were added or modified\n\nCross-reference the resulting set against the parsed coverage profile to find changed/new functions with 0% or low coverage.\n\n### 5. Coverage delta (optional)\n\nLocate the most recent prior review's coverage profile:\n\n```sh\nprev=$(ls -t reviews/*/coverage.out 2>/dev/null | head -1)\n```\n\nIf found, compute per-package coverage delta (current % − prior %) for affected packages. If not found, omit the delta column.\n\nEither way, persist the current profile to `${REVIEW_DIR}/coverage.out` so the next run has a baseline.\n\n### 6. Severity grading\n\nApply heuristics to each uncovered function:\n\n- **HIGH**: function name or body involves error returns, security-sensitive operations (auth, decode, validate, sign, verify, decrypt, sanitize, escape), or panics/`os.Exit` calls\n- **MEDIUM**: uncovered business logic in non-helper packages with non-trivial branching\n- **LOW**: getters, setters, formatters, `String()` / `Error()` methods, trivial constructors, stringer-generated functions\n\nSeverity is applied by the investigation subagent's judgment based on reading the function body. No automated complexity check in v1.\n\n### 7. Launch investigation subagent\n\nLaunch a single investigation subagent (`subagent_type=\"generalPurpose\"`, `model: sonnet` per `subagent-model-routing`) with the system context, scope, and parsed coverage data.\n\n> **Future fan-out note:** If this skill is ever split into per-package subagents for large codebases (e.g. listing uncovered functions per package), use `model: haiku` per `subagent-model-routing` — per-package uncovered-function listing is mechanical aggregation.\n\nPrompt it to:\n- Read the in-scope `.go` files and any directly relevant test files in the same package.\n- Use the per-function coverage data and changed-function set to identify uncovered or under-covered functions.\n- Apply the severity heuristics from step 6 by reading function bodies.\n- For each finding, search nearby code and project documentation (TODO/FIXME/HACK/XXX comments, README, issue references) for existing tracking.\n- Return findings using the **uncovered functions** template with `COV-` prefixed IDs.\n- Every finding must include: package, function name, file:line, severity, and tracking status.\n\n### 8. Present results\n\nResolve the review output directory (skip if `REVIEW_DIR` was provided by the review-all orchestrator):\n\n```sh\nREVIEW_DATE=$(date +%Y-%m-%d)\nREVIEW_DIR=\"reviews/${REVIEW_DATE}\"\nif [ -d \"$REVIEW_DIR\" ]; then REVIEW_DIR=\"reviews/${REVIEW_DATE}-$(date +%H%M)\"; fi\nmkdir -p \"$REVIEW_DIR\"\n```\n\nCapture run metadata (see [Run metadata header](#run-metadata-header) below) and prepend the rendered block to `${REVIEW_DIR}/COVERAGE-REVIEW.md`.\n\nWrite the output to `${REVIEW_DIR}/COVERAGE-REVIEW.md`, structured as:\n1. Run metadata header\n2. Tool availability summary (Go version, test outcome, whether `coverage.out` was produced, prior baseline location if any)\n3. Per-package coverage table (with delta column when baseline existed)\n4. Uncovered functions table (grouped by package, sorted by severity)\n5. Recommended fix order\n\nSave the current `coverage.out` to `${REVIEW_DIR}/coverage.out`.\n\nPresent the report to the user.\n\n---\n\n## Run metadata header\n\nCapture once near `REVIEW_DIR` resolution and prepend the rendered block to the output document:\n\n```sh\nRUN_DATETIME=$(date -u +\"%Y-%m-%d %H:%M UTC\")\nGIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)\nGIT_COMMIT=$(git rev-parse --short HEAD)\nGIT_COMMIT_FULL=$(git rev-parse HEAD)\nGIT_SUBJECT=$(git log -1 --pretty=%s)\n# When scope is diff-based, also: BASE_REF=<base>; BASE_COMMIT=$(git rev-parse --short \"$BASE_REF\")\n```\n\nHeader template (placed at the top of the output `.md`, before the H1 title):\n\n```markdown\n> **Run:** {RUN_DATETIME}\n> **Branch:** {GIT_BRANCH} @ {GIT_COMMIT} (`{GIT_COMMIT_FULL}`)\n> **Subject:** {GIT_SUBJECT}\n> **Base:** {BASE_REF} @ {BASE_COMMIT}   <!-- omit when scope is not diff-based -->\n> **Scope:** {scope description}\n```\n\n---\n\n## Finding link wrapping (PR mode)\n\nWhen the review is scoped to a GitHub PR (`pr_url` is provided by the caller, or, when run standalone, `gh pr view --json url -q .url 2>/dev/null` returns one), wrap every `path:line` reference inside the finding tables below as a Markdown link:\n\n```sh\n~/.claude/scripts/pr-deeplink.sh \"$pr_url\" <path> <line>\n# pr_url set   → [path:line](https://github.com/.../pull/N/files#diff-<hash>R<line>)\n# pr_url empty → path:line   (plain text, unchanged)\n```\n\nThe display text stays `path:line` so plain and linked tables look identical; only the URL goes in the link target. Pass `L` as the fourth argument for findings about removed code (default is `R`). Omit `<line>` for file-level findings to get a file-anchor link. Apply the same wrapping to `path:line` references inside the Tracked column (e.g. `TODO in foo.go:42`). Findings themselves follow `terse-comments`: concrete fix, optional `bug:`/`risk:`/`nit:`/`unsure:` prefix, no praise or restating the diff.\n\n---\n\n## Output Templates\n\n### Per-package coverage\n\n```markdown\n| Package | Coverage | Delta | Affected Functions |\n|---------|----------|-------|--------------------|\n| internal/auth | 78.4% | +2.1% | 3 changed, 1 uncovered |\n| internal/store | 64.2% | — | 5 changed, 4 uncovered |\n| internal/render | 91.0% | -3.5% | 2 changed, 0 uncovered |\n```\n\nWhen no baseline exists, omit the **Delta** column. When `has_changes` is false, replace **Affected Functions** with **Functions** and report total counts.\n\n### Uncovered functions\n\n```markdown\n| # | Package | Function | File:Line | Severity | Tracked |\n|---|---------|----------|-----------|----------|---------|\n| COV1 | internal/auth | `verifyToken` | auth/verify.go:42 | HIGH | — |\n| COV2 | internal/store | `formatRowKey` | store/key.go:18 | LOW | TODO in store/key.go:15 |\n| COV3 | internal/render | `(*Page).Render` | render/page.go:104 | MEDIUM | — |\n```\n\n**Tracked column values:** Use `—` for new findings. For already-captured findings: `TODO in file:line`, `FIXME in file:line`, `README`, `#123` (issue reference).\n\n### Tool availability\n\n```markdown\n| Tool | Status | Notes |\n|------|--------|-------|\n| `go test -coverprofile` | ran | produced coverage.out (1.2 MB) |\n| `go tool cover -func` | ran | parsed 412 functions |\n| Prior baseline | found | reviews/2026-04-18/coverage.out |\n```\n\n---\n\n## Guidelines\n\n- **Single subagent.** This skill uses one investigation subagent; coverage parsing is mechanical and the only judgment call is severity grading.\n- **When called from review-all**, skip standalone `REVIEW_DIR` resolution (the orchestrator owns it) and skip scope confirmation. Use the provided file list, package paths, `has_changes` flag, base ref, and `REVIEW_DIR`.\n- **No follow-up re-evaluation table.** Coverage findings are derivable from current state on every run, unlike static-analysis findings which can persist after a fix.\n- **REVIEW.md integration**: If a `REVIEW.md` was provided by the review-all orchestrator (or exists at the repo root when running standalone), respect any **Skip** patterns by excluding matching files from scope, and treat any **Always check** rules touching coverage thresholds as HIGH-severity floors.\n- **Test failures stop the analysis.** Do not generate a coverage report from a failed test run; the profile would be misleading or incomplete.\n- Findings must cite probed evidence (`path:line`, grep output, command result), not pattern-matched suspicion. Per `~/.claude/rules/probe-not-assume.md`.\n\n### Boundary with adjacent skills\n\nThis skill's exclusive concern is **new or modified Go code in this diff that the test suite does not exercise**. Two adjacent skills cover related but distinct concerns; do not duplicate their checks here:\n\n- **review-reliability** checks **goroutine leak coverage** via `goleak.VerifyNone` / `goleak.VerifyTestMain` in tests. Different axis: leak detection in tests, not line/function coverage of source.\n- **review-code** Subagent F (Regression History) flags **test removal or weakening** in the diff (regressions from gutting tests). Different axis: deleted-test detection on the diff side, not uncovered-new-code detection.\n\nIf a finding straddles these axes (e.g. a removed test reduced coverage of a security path), report only the coverage gap here; the adjacent skills will catch their own concerns when run together via `/review-all`.","tags":["review","coverage","skill","issue","paultyng","agent-skills","ai-tools","claude-code","cursor","dotfiles"],"capabilities":["skill","source-paultyng","skill-review-coverage","topic-agent-skills","topic-ai-tools","topic-claude-code","topic-cursor","topic-dotfiles"],"categories":["skill-issue"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/paultyng/skill-issue/review-coverage","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add paultyng/skill-issue","source_repo":"https://github.com/paultyng/skill-issue","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 8 github stars · SKILL.md body (11,589 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-05-18T19:09:01.788Z","embedding":null,"createdAt":"2026-05-18T13:21:27.070Z","updatedAt":"2026-05-18T19:09:01.788Z","lastSeenAt":"2026-05-18T19:09:01.788Z","tsv":"'+2.1':1268 '-1':559,1041 '-3.5':1281 '/.../pull/n/files#diff-':1160 '/.claude/rules/probe-not-assume.md':1560 '/.claude/scripts/pr-deeplink.sh':1150 '/coverage-review.md':911,918 '/coverage.out':555,589,975 '/dev/null':557,1132 '/internal/auth':195 '/review-all':1692 '0':396,533,1284 '1':91,357,921,1271 '1.2':1376 '100':244 '104':1338 '123':1361 '15':1332 '18':1327 '2':343,556,925,1131,1282 '3':430,942,1269 '4':476,954,1277 '412':1384 '42':1321 '5':537,964,1275 '6':597,795 '64.2':1274 '7':678 '78.4':1267 '8':841 '91.0':1280 'abbrev':1018 'abbrev-ref':1017 'action':58 'ad':506,514 'adjac':1563,1587,1681 'affect':169,254,571,1264,1300 'aggreg':467,748 'alreadi':1349 'already-captur':1348 'also':1050 'alway':1509 'analysi':15,18,217,392,1466,1524 'anchor':1216 'anyth':236 'appli':218,600,659,789,1218 'argument':1196 'ask':8 'atom':359 'attempt':390 'auth':618 'auth/verify.go':1320 'autom':673 'avail':927,1365 'axe':1663 'axi':1613,1643 'base':120,277,314,666,1049,1051,1053,1060,1091,1092,1094,1440 'baselin':83,325,345,596,938,952,1288,1387 'block':907,995 'bodi':610,671,799 'boundari':1561 'branch':109,130,643,1012,1080,1082 'bug':1243 'busi':632 'call':629,1407,1412 'caller':1119 'cannot':337 'captur':419,891,985,1350 'catch':1684 'chang':46,104,126,144,276,298,303,340,482,487,778,1270,1276,1283,1296,1438 'changed-funct':777 'changed/new':478,530 'check':675,1510,1598,1603 'cite':1545 'code':20,29,235,247,805,1201,1575,1625,1656 'codebas':101,213,320,724 'column':579,950,1229,1293,1341 'command':417,428,1552 'comment':810,1239 'commit':1022,1030,1054,1084,1086,1095 'complex':674 'comput':338,461,562 'concern':113,1569,1593,1687 'concret':1240 'confirm':95,289,1429 'constructor':652 'contain':179,246 'context':700 'count':356,374,1307 'cov':825 'cov1':1317 'cov2':1323 'cov3':1333 'cover':404,438,787,1380,1589 'coverag':3,11,14,16,49,55,79,88,216,335,346,368,397,411,433,465,526,536,538,548,566,704,774,946,1259,1262,1399,1453,1513,1529,1606,1620,1669,1677 'coverage.out':361,421,440,934,971,1375 'covermod':358 'coverpkg':362,363 'coverprofil':36,360,1372 'cross':366,518 'cross-packag':365 'cross-refer':517 'current':568,584,970,1458 'd':140,867,874,1007 'data':705,775 'date':863,864,872,882,883,1003 'datetim':1002,1079 'decod':619 'decrypt':623 'default':146,222,1202 'defin':401,451 'delet':1645 'deleted-test':1644 'delta':89,342,539,567,578,949,1263,1292 'deriv':168,253,1456 'descript':1098 'detect':1615,1647,1657 'determin':510 'diff':110,133,138,159,311,324,491,1048,1253,1578,1637,1650 'diff-bas':1047 'diff-filt':137 'differ':1612,1642 'dir':259,281,588,852,869,876,879,890,910,917,974,989,1420,1444 'direct':295,761 'directori':178,188,202,475,848 'display':1171 'distinct':1592 'document':808,999 'duplic':1596 'e.g':189,194,725,1230,1664 'e2e':370 'edit':252 'either':580 'empti':1164 'ensur':364 'equival':410 'error':612,649 'escap':625 'evalu':1451 'ever':715 'everi':220,828,1136,1461 'evid':1547 'exclud':231,233,1501 'exclus':1568 'exercis':70,1585 'exist':84,815,953,1289,1488 'explicit':182,307 'f':1627 'fail':382,1533 'failur':385,1521 'fals':316,327,1298 'fan':708 'fan-out':707 'fi':48,886 'file':105,127,145,167,174,181,198,209,226,229,241,263,271,304,455,458,488,758,764,835,1208,1215,1313,1354,1358,1433,1503 'file-anchor':1214 'file-level':1207 'file/package':118 'filter':139,164,215,223,447 'find':59,529,802,818,829,1099,1142,1198,1210,1234,1346,1351,1454,1467,1543,1660 'first':243 'fix':966,1241,1473 'fixm':1356 'flag':1439,1630 'floor':1519 'follow':1236,1447 'follow-up':1446 'foo.go:42':1233 'form':446 'formatrowkey':1325 'formatt':647 'found':561,575,1388 'fourth':1195 'full':100,212,319,1031,1087 'full-codebas':318 'func':439,497,1381 'function':44,64,341,450,469,479,504,512,531,605,607,656,670,728,744,773,779,788,798,822,833,956,1265,1301,1303,1309,1312,1385 'function-level':468 'futur':706 'gap':17,1678 'gen':238 'generalpurpos':689 'generat':234,248,655,1527 'get':143,1212 'getter':645 'gh':157,1124 'git':132,490,1011,1013,1021,1023,1029,1032,1037,1039,1055,1081,1083,1085,1089 'github':1111 'github.com':1159 'github.com/.../pull/n/files#diff-':1158 'given':200 'go':28,34,47,52,166,170,180,191,208,228,255,262,353,436,757,929,1370,1378,1574 'goe':1186 'goleak.verifynone':1608 'goleak.verifytestmain':1609 'goroutin':1604 'grade':599,1410 'grep':1550 'group':958 'guidelin':1390 'gut':1640 'h':884,1008 'h1':1074 'haiku':733 'head':141,492,558,1020,1028,1036 'header':496,897,901,924,984,1062 'helper':637 'heurist':601,792 'high':606,1322,1517 'high-sever':1516 'histori':1629 'hunk':495 'id':827 'ident':1182 'identifi':477,782 'in-scop':754 'includ':206,831 'incomplet':1542 'individu':197 'insid':1140,1226 'instead':163 'integr':372,1475 'internal/auth':190,1266,1318 'internal/render':1279,1334 'internal/store':1273,1324 'internal/store/db':239 'investig':662,680,685,1397 'invok':265 'involv':611 'issu':812,1362 'json':1127 'judgment':665,1406 'know':25 'l':1192 'larg':723 'launch':679,682 'leak':1605,1614 'level':470,1209 'line':245,507,836,1138,1157,1166,1175,1224,1314,1355,1359,1549 'line/function':1619 'link':1100,1148,1179,1189,1217 'list':119,227,272,726,745,1434 'locat':541,939 'log':1040 'logic':633 'look':1181 'low':535,644,1328 'ls':552 'm':866,885,1006,1009 'main':148 'markdown':1076,1147,1260,1310,1366 'match':456,1502,1557 'may':186 'mb':1377 'md':1071 'mechan':747,1402 'medium':630,1339 'metadata':893,896,900,923,983 'method':500,650 'mislead':395,1540 'miss':31 'mkdir':887 'mode':1103 'model':690,695,732,737 'modifi':63,516,1573 'must':830,1544 'name':135,161,498,501,505,608,834 'name-on':134,160 'near':987 'nearbi':804 'new':61,1345,1571,1655 'new/changed':27 'next':592 'nit':1245 'non':636,641 'non-help':635 'non-trivi':640 'note':710,1369 'number':155 'omit':576,1205,1290 'one':1134,1396 'oper':617 'option':540,1242 'orchestr':284,860,1423,1486 'order':967 'os.exit':628 'outcom':932 'output':422,442,847,914,998,1070,1254,1551 'own':1424 'p':888 'packag':78,87,171,192,204,221,256,273,334,367,377,464,474,565,572,638,720,730,741,768,832,945,960,1258,1261,1311,1435 'packages/directories':103 'page':1335 'panic':627 'parent':177,258 'pars':431,441,494,525,703,1016,1026,1035,1058,1383,1400 'partial':391 'pass':1191 'path':175,274,308,459,1137,1156,1165,1174,1223,1436,1548,1673 'paths/packages':183 'pattern':193,205,1499,1556 'pattern-match':1555 'per':77,86,333,463,564,692,719,729,734,740,772,944,1257,1559 'per-funct':771 'per-packag':76,85,332,462,563,718,739,943,1256 'persist':582,1470 'place':1064 'plain':1167,1177 'pr':107,128,154,158,1102,1112,1113,1125,1151,1153,1162 'prais':1249 'prefer':412 'prefix':460,508,826,1247 'prepend':904,992 'present':842,976 'pretti':1042 'prev':551 'prior':545,569,937,1386 'probe':1546 'produc':57,936,1374 'profil':434,527,549,585,1537 'project':807 'prompt':749 'provid':293,854,1116,1432,1480 'q':1129 'r':1161,1204 'ran':1373,1382 'raw':416,427 're':1450 're-evalu':1449 'read':668,752,797 'readm':811,1360 'receiv':270 'recent':544 'recommend':965 'reduc':1668 'ref':278,315,1019,1052,1061,1093,1441 'refer':152,519,813,1139,1225,1363 'regress':1628,1638 'relat':1590 'relev':762 'reliabl':1602 'remov':1200,1632,1666 'render':906,994,1336 'render/page.go':1337 'replac':1299 'repo':350,1491 'report':42,75,331,394,978,1305,1530,1674 'request':125 'resolut':990,1421 'resolv':39,94,114,225,844 'respect':1496 'restat':1251 'result':471,521,843,1553 'return':613,817,1133 'rev':1015,1025,1034,1057 'rev-pars':1014,1024,1033,1056 'review':2,12,21,50,56,268,280,321,546,554,587,846,851,858,862,868,870,871,875,878,880,881,889,909,916,973,988,1106,1415,1419,1443,1484,1601,1624 'review-al':267,857,1414,1483 'review-cod':1623 'review-coverag':1 'review-reli':1600 'review.md':1474,1478 'reviews/2026-04-18/coverage.out':1389 'risk':1244 'root':351,1492 'rout':696,738 'row':443,448 'rule':1511 'run':33,131,344,347,409,425,489,593,892,895,899,922,982,1001,1077,1078,1122,1462,1494,1535,1689 'run-metadata-head':898 'sanit':624 'save':968 'scope':40,67,92,96,115,288,301,701,756,1045,1096,1097,1108,1428,1505 'scoped/changed':454 'search':803 'secur':615,1672 'security-sensit':614 'see':894 'sensit':616 'set':296,522,780,1155 'setter':646 'sever':598,657,791,837,963,1315,1409,1518 'sh':352,435,550,861,1000,1149 'short':355,1027,1059 'side':1651 'sign':621 'similar':406 'singl':684,1391 'skill':329,713,1394,1564,1566,1588,1682 'skill-review-coverage' 'skip':285,849,1417,1427,1498 'sonnet':691 'sort':961 'sourc':1622 'source-paultyng' 'specif':102,112 'specifi':187 'split':716 'standalon':1123,1418,1495 'state':1459 'static':1465 'static-analysi':1464 'status':840,1368 'stay':1173 'step':794 'still':330 'stop':387,1522 'store/key.go':1326,1331 'straddl':1661 'string':648 'stringer':654 'stringer-gener':653 'structur':51,919 'subag':663,681,686,687,694,721,736,1392,1398,1626 'subagent-model-rout':693,735 'subject':1038,1088,1090 'suit':74,381,1582 'summari':928 'surfac':383 'surround':503 'surviv':261 'suspicion':1558 'system':699 'tabl':947,957,1143,1180,1452 'target':407,1190 'taskfile.yaml':400 'templat':823,1063,1255 'ters':1238 'terse-com':1237 'test':13,32,35,54,73,354,373,380,403,763,931,1371,1520,1534,1581,1611,1617,1631,1641,1646,1667 'test-coverag':53 'test.go':232 'text':1168,1172 'threshold':1514 'titl':1075 'todo':1231,1329,1352 'todo/fixme/hack/xxx':809 'togeth':1690 'tool':437,926,1364,1367,1379 'top':1067 'topic-agent-skills' 'topic-ai-tools' 'topic-claude-code' 'topic-cursor' 'topic-dotfiles' 'total':1306 'touch':1512 'toward':375 'track':816,839,1228,1316,1340 'treat':1507 'trivial':642,651 'true':299,484 'two':1586 'type':688 'u':1004 'unchang':1169 'uncov':19,43,604,631,727,743,783,821,955,1272,1278,1285,1308,1654 'uncovered-funct':742 'uncovered-new-cod':1653 'under-cov':785 'uniqu':176,257 'unit':376 'unlik':1463 'unsur':424,1246 'url':1114,1128,1130,1152,1154,1163,1185 'use':4,156,291,731,769,819,1343,1395,1430 'user':7,99,124,151,185,981 'utc':1010 'v1':677 'valid':620 'valu':294,1342 'verifi':622 'verifytoken':1319 'version':930 'via':1607,1691 'view':1126 'want':23 'way':581 'weaken':1634 'whether':933 'whose':242 'within':472 'workflow':90 'would':1538 'wrap':1101,1135,1221 'write':912 'y':865,1005","prices":[{"id":"766e9670-d7a8-4544-97d6-10b0db90c6b6","listingId":"3e003712-8902-4347-8fb9-c1ff8e36e5e4","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"paultyng","category":"skill-issue","install_from":"skills.sh"},"createdAt":"2026-05-18T13:21:27.070Z"}],"sources":[{"listingId":"3e003712-8902-4347-8fb9-c1ff8e36e5e4","source":"github","sourceId":"paultyng/skill-issue/review-coverage","sourceUrl":"https://github.com/paultyng/skill-issue/tree/main/skills/review-coverage","isPrimary":false,"firstSeenAt":"2026-05-18T13:21:27.070Z","lastSeenAt":"2026-05-18T19:09:01.788Z"}],"details":{"listingId":"3e003712-8902-4347-8fb9-c1ff8e36e5e4","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"paultyng","slug":"review-coverage","github":{"repo":"paultyng/skill-issue","stars":8,"topics":["agent-skills","ai-tools","claude-code","cursor","dotfiles"],"license":"mit","html_url":"https://github.com/paultyng/skill-issue","pushed_at":"2026-05-18T18:26:54Z","description":"Personal Claude Code / Cursor agent skills, rules, and config","skill_md_sha":"8617001bc5454a2e8a9c75628dfef644149ff83a","skill_md_path":"skills/review-coverage/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/paultyng/skill-issue/tree/main/skills/review-coverage"},"layout":"multi","source":"github","category":"skill-issue","frontmatter":{"name":"review-coverage","description":"Use when the user asks for a coverage review, test coverage analysis, coverage gap analysis, uncovered code review, or wants to know what new/changed Go code is missing tests. Runs `go test -coverprofile` against the resolved scope and reports uncovered functions in changed Go files, grouped by package, with severity grading. Go projects only."},"skills_sh_url":"https://skills.sh/paultyng/skill-issue/review-coverage"},"updatedAt":"2026-05-18T19:09:01.788Z"}}