{"id":"158edd3d-c292-488a-8bf1-3a5386454c37","shortId":"jY8jmu","kind":"skill","title":"verify-patterns","tagline":"Verify AI agent patterns including loop safety, retry limits, tool consistency, context size, and graph cycle analysis. Use when asked to \"verify agent patterns\", \"check loops\", \"verify tools\", or \"check retry limits\".","description":"# Agent Pattern Verification\n\n## Purpose\n\nVerify AI agent code for common anti-patterns that can cause infinite loops, runaway retries, tool mismatches, and context overflow. All analysis happens locally.\n\n## When to Use\n\nTrigger this skill when the user asks to:\n- \"verify agent patterns\"\n- \"check agent loops\"\n- \"verify tools\"\n- \"check retry limits\"\n- \"verify agent safety\"\n\n> **Note:** For full verification including security, quality, and language-specific checks, tell the user to say **\"verify agent\"**.\n\n## Process\n\n### Step 1: Detect Agent Framework\n\nIdentify the agent framework by checking imports in Python/TypeScript files:\n\n| Import Pattern | Framework |\n|----------------|-----------|\n| `from langgraph` or `import langgraph` | LangGraph |\n| `from crewai` or `import crewai` | CrewAI |\n| `from autogen` or `import autogen` | AutoGen |\n| `from langchain` or `import langchain` | LangChain |\n| Direct `openai`/`anthropic` SDK only | Custom |\n\nAlso check for framework config files: `langgraph.json`, `crew.yaml`.\n\n### Step 2: Locate Agent Files\n\nFind files to analyze:\n\n**Priority files:**\n- `graph.py`, `graph.ts` - Agent workflow definitions\n- `tools.py`, `tools.ts`, `tools/*.py`, `tools/*.ts` - Tool implementations\n- `state.py`, `state.ts` - State schemas\n- `prompts.py`, `prompts/*.md`, `system.md` - Prompt templates\n- `agent.py`, `agent.ts` - Main agent logic\n\n**Directories to check:**\n- `src/agent/`, `agent/`, `src/`, project root\n- `lib/`, `app/`, `packages/`\n\n**Exclude from analysis:**\n- `skills/` directory — these are skill definitions, not agent system prompts\n\n### Step 3: Run Pattern Checks\n\n#### Check Tiers\n\n- **`[PATTERN]`** — Mechanical check. Apply exactly as written.\n- **`[HEURISTIC]`** — Judgment required. Mark findings clearly.\n\nTag every finding with `[P]` for pattern or `[H]` for heuristic.\n\n---\n\n#### 3.1 `[PATTERN]` Loop Safety\n\nApply mechanically. Do not pass a loop because it \"looks like it might terminate.\"\n\n| Pattern to find | Pass condition | Severity |\n|-----------------|----------------|----------|\n| `while True:` in Python | A `break` statement exists within the same block scope | ⚠️ Warning if absent |\n| `for { }` in Go | A `break` or `return` exists within the block | ⚠️ Warning if absent |\n| `while (true)` in TS/JS | A `break` or `return` exists within the block | ⚠️ Warning if absent |\n| Function calls itself recursively | A non-recursive return path exists (base case), OR a depth/counter parameter is present | ⚠️ Warning if absent |\n\n**`[HEURISTIC]` Fallback: Unrecognized Loop Patterns**\n\nAfter applying the pattern table, also scan for:\n- Loops where termination depends entirely on external/runtime state with no timeout\n- Generator functions that `yield` indefinitely without documented exit\n- Event/polling loops without timeout parameters\n- Recursive call chains across multiple functions without depth tracking\n\nFlag as ⚠️ Warning: *\"Potential unbounded loop not matching known patterns — verify termination condition manually\"*\n\n---\n\n#### 3.2 `[PATTERN]` Retry Limit Enforcement\n\nApply mechanically. If required parameter is absent, flag as ❌ Issue.\n\n**Python — Decorator-based:**\n\n| Library/Pattern | Required parameter | Fail condition |\n|-----------------|-------------------|----------------|\n| `@retry` (tenacity) | `stop=stop_after_attempt(n)` or `stop=stop_after_delay(n)` | `stop=` absent |\n| `@backoff.on_exception` | `max_tries=n` | `max_tries=` absent |\n\n**Python — HTTP client retry:**\n\n| Library/Pattern | Required parameter | Fail condition |\n|-----------------|-------------------|----------------|\n| `urllib3.Retry(...)` | `total=n` where n > 0 | `total=` absent or `total=0` |\n| `HTTPAdapter(max_retries=Retry(...))` | Retry object must have `total=n` | `total=` absent |\n| `httpx.HTTPTransport(retries=n)` | `retries=n` where n > 0 | `retries=` absent or `retries=0` |\n\n**Python — AWS SDK (boto3):**\n\n| Library/Pattern | Required parameter | Fail condition |\n|-----------------|-------------------|----------------|\n| `Config(retries={...})` | `max_attempts` > 1 | `max_attempts` absent or ≤ 1 |\n\n> Note: boto3 without explicit retry config uses SDK defaults (3 attempts) — do not flag absence.\n\n**JavaScript/TypeScript:**\n\n| Library/Pattern | Required parameter | Fail condition |\n|-----------------|-------------------|----------------|\n| `retry(...)` (async-retry) | `retries: n` in options | `retries:` absent |\n| `pRetry(...)` (p-retry) | `retries: n` in options | `retries:` absent |\n\n**Custom retry loops (all languages):**\n\n| Pattern to find | Pass condition | Fail condition |\n|-----------------|----------------|----------------|\n| Loop + `try/except` + `continue` | Integer counter with max check | No counter → ❌ Issue |\n\n**`[HEURISTIC]` Fallback: Unrecognized Retry Patterns**\n\nAfter applying pattern tables, scan for:\n- Functions/decorators with \"retry\" in name not in tables above\n- Imported modules with \"retry\" in package name (e.g. `stamina`, `aiohttp_retry`)\n- Loops with sleep + exception handling + re-invocation without visible counter\n- Config keys like `max_retries`, `retry_count`, `attempts`\n\nFlag as ⚠️ Warning: *\"Potential retry pattern not matching known libraries — verify retry bounds manually\"*\n\n---\n\n#### 3.3 `[PATTERN]` Tool Registry Consistency\n\n**Step 1: Collect defined tools**\n\nScan tool definition files. A name found by any pattern counts as registered.\n\n*Python — decorator patterns:*\n\n| Pattern | How to extract name |\n|---------|---------------------|\n| `@tool` (LangChain) on `def` | Function name below decorator |\n| `@function_tool` (OpenAI Agents SDK) on `def` | Function name below decorator |\n| `@tool(name=\"...\")` | Use `name=` argument value |\n\n*Python — dict/list patterns:*\n\n| Pattern | How to extract name |\n|---------|---------------------|\n| `{\"type\": \"function\", \"function\": {\"name\": \"...\"}}` (OpenAI) | Value of `\"name\"` inside `\"function\"` |\n| `{\"name\": \"...\", \"input_schema\": {...}}` (Anthropic) | Top-level `\"name\"` |\n| `{\"name\": \"...\", \"description\": \"...\", \"parameters\": {...}}` | Top-level `\"name\"` |\n| `ToolNode([func1, func2, ...])` (LangGraph) | Each function name in list |\n| `tools = [func1, func2]` / `TOOLS = [...]` | Each identifier in list |\n\n*TypeScript/JavaScript:*\n\n| Pattern | How to extract name |\n|---------|---------------------|\n| `{ type: \"function\", function: { name: \"...\" } }` (OpenAI) | `name:` inside `function:` |\n| `tool({ description: \"...\", parameters: z.object({...}) })` | The `const` variable name |\n| `new DynamicTool({ name: \"...\", ... })` (LangChain.js) | Value of `name:` |\n| `zodFunction({ name: \"...\", ... })` | Value of `name:` |\n\n**Step 2: Collect tool references from prompts**\n\nScan `.md`, `.txt`, `prompts.py` for backtick-quoted identifiers naming capabilities.\n\n**Step 3: Cross-reference**\n\n| Finding | Severity |\n|---------|----------|\n| Reference not in definition list | ❌ Issue (hallucinated tool) |\n| Defined tool not in any prompt | ⚠️ Warning (undocumented tool) |\n\n**`[HEURISTIC]` Tools never bound to LLM**\n\nFind where tools are defined and where LLM is invoked. If tools exist but are never connected to the LLM call, flag as ❌ Issue: *\"Tools defined but never connected to LLM invocation\"*\n\n**`[HEURISTIC]` Fallback: Unrecognized Tool Definitions**\n\nScan for tool-like structures:\n- Dicts with both `\"description\"` and `\"parameters\"` keys\n- Functions with structured docstrings (name, params, return)\n- Variables named `tools`, `tool_list`, `available_tools`, `functions`\n- Classes with `run()`, `execute()`, or `__call__()` methods\n\nInclude in count and note: *\"Tool detected via heuristic — verify this is an intended agent tool.\"*\n\n---\n\n#### 3.4 `[PATTERN]` Context Size Awareness\n\nFormula: `token_estimate = len(file_content_chars) / 4`\n\n| Content | ⚠️ Warning threshold | ❌ Issue threshold |\n|---------|----------------------|-------------------|\n| System prompt file | > 4,000 tokens | > 8,000 tokens |\n| Single tool description | > 500 tokens | > 1,000 tokens |\n| All tool descriptions combined | > 2,000 tokens | > 4,000 tokens |\n\n**Exclude:** `skills/` directories (loaded on demand, not embedded)\n\n**`[HEURISTIC]` Fallback: Borderline and Non-Standard**\n\n- Estimates within 20% of threshold → flag with tokenizer recommendation\n- Dynamic prompts (f-strings, `.format()`) → flag if template alone is large\n- Multiple concatenated prompts → estimate combined size\n- Prompts with includes → note effective size may be larger\n\n---\n\n#### 3.5 `[HEURISTIC]` Explicit Tool Listing\n\nCheck system prompts for:\n- Headers like \"Available Tools\", \"You have access to\"\n- Tool capability descriptions\n\nFlag if tools are defined but not documented in system prompt.\n\n---\n\n#### 3.6 `[PATTERN]` LangGraph Graph Cycle Analysis\n\n*(Only when LangGraph is detected)*\n\n**Detection steps:**\n\na. Find graph file (`graph.py`, `graph.ts`, or file with `StateGraph`/`MessageGraph`)\n\nb. Build edge map:\n   - `workflow.add_edge(source, dest)` — unconditional edge\n   - `workflow.add_conditional_edges(source, fn, mapping)` — extract destinations from mapping\n\nc. Identify cycles: nodes reachable from themselves\n\nd. For each cycle, check if `END` (or `\"__end__\"`) is reachable via conditional edge\n\n| Condition | Severity |\n|-----------|----------|\n| Cycle exists, `END` reachable via conditional | ✅ Pass |\n| Cycle exists, no path to `END` | ❌ Issue |\n| Graph has no `END` node | ❌ Issue |\n| Node has no outgoing edges and is not `END` | ⚠️ Warning (dead-end) |\n\n**Example — infinite cycle (❌ Issue):**\n```python\nworkflow.add_edge(\"agent\", \"tools\")\nworkflow.add_edge(\"tools\", \"agent\")  # no path to END\n```\n\n**Example — cycle with exit (✅ Pass):**\n```python\nworkflow.add_conditional_edges(\"agent\", should_continue, {\n    \"continue\": \"tools\",\n    \"end\": END\n})\nworkflow.add_edge(\"tools\", \"agent\")\n```\n\n**`[HEURISTIC]` Fallback: Non-LangGraph Graphs**\n\nScan for graph-like control flow:\n- State machines with transition tables\n- Custom routing with implicit cycles\n- LangGraph.js (camelCase methods)\n- CrewAI/AutoGen agent handoffs\n- Adjacency lists without termination path\n\nFlag as ⚠️ Warning: *\"Potential cyclic control flow — verify termination condition exists\"*\n\n---\n\n### Step 4: Generate Report\n\n```markdown\n# Agent Pattern Verification Report\n\n**Project:** [name or path]\n**Date:** [current date]\n**Framework detected:** [LangGraph | CrewAI | AutoGen | LangChain | Custom | None]\n**Files analyzed:** [count]\n\n## Summary\n\n✅ X checks passed | ⚠️ Y warnings | ❌ Z issues\n\n## Loop Safety\n\n- [x] All loops have termination conditions\n- [ ] ⚠️ Potential unbounded loop at `[file:line]`\n\n## Retry Limits\n\n- [x] All retry mechanisms have explicit limits\n- [ ] ❌ Missing retry limit at `[file:line]`\n\n## Tool Consistency\n\n- [x] Tool registry found: X tools defined\n- [ ] ❌ Y hallucinated tool references\n- [ ] ⚠️ Z undocumented tools\n\n## Context Size\n\n- [x] System prompt within limits (~X tokens)\n- [ ] ⚠️ System prompt exceeds recommended size\n\n## Findings\n\n> `[P]` = pattern-matched · `[H]` = heuristic\n\n### ✅ Passing\n- `[P]` [Check]: [confirmation]\n\n### ⚠️ Warnings\n- `[P|H]` [Check]: [description]\n  - **Location:** [file:line]\n  - **Suggestion:** [how to fix]\n\n### ❌ Issues\n- `[P|H]` [Check]: [description]\n  - **Location:** [file:line]\n  - **Rule:** [which rule violated]\n  - **Fix:** [specific remediation]\n\n## Recommendations\n\n1. [Priority recommendation]\n2. [Additional improvements]\n```\n\n---\n\n*For full verification including security, quality, and language-specific checks, say \"verify agent\".*","tags":["verify","patterns","agent","verifier","aurite-ai","agent-skills","agent-testing","agent-verification","ai-agent","ai-coding-assistant","claude-code","cline"],"capabilities":["skill","source-aurite-ai","skill-verify-patterns","topic-agent-skills","topic-agent-testing","topic-agent-verification","topic-ai-agent","topic-ai-coding-assistant","topic-claude-code","topic-cline","topic-code-quality","topic-code-review","topic-code-verification","topic-coding-agent","topic-cursor"],"categories":["agent-verifier"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Aurite-ai/agent-verifier/verify-patterns","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Aurite-ai/agent-verifier","source_repo":"https://github.com/Aurite-ai/agent-verifier","install_from":"skills.sh"}},"qualityScore":"0.469","qualityRationale":"deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 38 github stars · SKILL.md body (11,500 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-18T18:58:29.960Z","embedding":null,"createdAt":"2026-04-29T01:03:27.046Z","updatedAt":"2026-05-18T18:58:29.960Z","lastSeenAt":"2026-05-18T18:58:29.960Z","tsv":"'0':472,477,497,502 '000':948,951,959,966,969 '1':111,516,521,656,958,1368 '2':167,791,965,1371 '20':988 '3':230,531,809 '3.1':260 '3.2':411 '3.3':650 '3.4':926 '3.5':1022 '3.6':1053 '4':938,947,968,1236 '500':956 '8':950 'absenc':536 'absent':299,313,328,350,422,449,457,474,489,499,519,552,562 'access':1037 'across':391 'addit':1372 'adjac':1219 'agent':6,26,36,42,77,80,88,108,113,117,169,179,203,209,226,692,924,1160,1165,1179,1189,1217,1240,1387 'agent.py':200 'agent.ts':201 'ai':5,41 'aiohttp':615 'alon':1004 'also':158,361 'analysi':20,62,218,1058 'analyz':174,1260 'anthrop':154,727 'anti':47 'anti-pattern':46 'app':214 'appli':239,264,357,416,592 'argument':704 'ask':23,74 'async':545 'async-retri':544 'attempt':440,515,518,532,635 'autogen':141,144,145,1255 'avail':900,1033 'aw':504 'awar':930 'b':1077 'backoff.on':450 'backtick':803 'backtick-quot':802 'base':340,429 'block':295,310,325 'borderlin':981 'boto3':506,523 'bound':648,835 'break':289,304,319 'build':1078 'c':1097 'call':330,389,858,908 'camelcas':1214 'capabl':807,1040 'case':341 'caus':51 'chain':390 'char':937 'check':28,33,79,84,101,120,159,207,233,234,238,582,1027,1108,1264,1338,1343,1355,1384 'class':903 'clear':248 'client':460 'code':43 'collect':657,792 'combin':964,1011 'common':45 'concaten':1008 'condit':282,409,434,466,511,542,572,574,1088,1116,1118,1125,1177,1233,1277 'config':162,512,527,628 'confirm':1339 'connect':854,866 'consist':14,654,1300 'const':775 'content':936,939 'context':15,59,928,1315 'continu':577,1181,1182 'control':1201,1229 'count':634,670,912,1261 'counter':579,584,627 'crew.yaml':165 'crewai':135,138,139,1254 'crewai/autogen':1216 'cross':811 'cross-refer':810 'current':1249 'custom':157,563,1208,1257 'cycl':19,1057,1099,1107,1120,1127,1155,1171,1212 'cyclic':1228 'd':1104 'date':1248,1250 'dead':1151 'dead-end':1150 'decor':428,674,688,699 'decorator-bas':427 'def':684,695 'default':530 'defin':658,823,842,863,1046,1307 'definit':181,224,662,818,874 'delay':446 'demand':976 'depend':367 'depth':395 'depth/counter':344 'descript':733,771,884,955,963,1041,1344,1356 'dest':1084 'destin':1094 'detect':112,916,1063,1064,1252 'dict':881 'dict/list':707 'direct':152 'directori':205,220,973 'docstr':891 'document':381,1049 'dynam':995 'dynamictool':779 'e.g':613 'edg':1079,1082,1086,1089,1117,1144,1159,1163,1178,1187 'effect':1017 'embed':978 'end':1110,1112,1122,1132,1137,1148,1152,1169,1184,1185 'enforc':415 'entir':368 'estim':933,986,1010 'event/polling':383 'everi':250 'exact':240 'exampl':1153,1170 'exceed':1326 'except':451,620 'exclud':216,971 'execut':906 'exist':291,307,322,339,850,1121,1128,1234 'exit':382,1173 'explicit':525,1024,1291 'external/runtime':370 'extract':679,712,760,1093 'f':998 'f-string':997 'fail':433,465,510,541,573 'fallback':352,587,871,980,1191 'file':124,163,170,172,176,663,935,946,1069,1073,1259,1282,1297,1346,1358 'find':171,247,251,280,570,813,838,1067,1329 'fix':1351,1364 'flag':397,423,535,636,859,991,1001,1042,1224 'flow':1202,1230 'fn':1091 'format':1000 'formula':931 'found':666,1304 'framework':114,118,127,161,1251 'full':92,1375 'func1':740,749 'func2':741,750 'function':329,376,393,685,689,696,715,716,723,744,763,764,769,888,902 'functions/decorators':597 'generat':375,1237 'go':302 'graph':18,1056,1068,1134,1195,1199 'graph-lik':1198 'graph.py':177,1070 'graph.ts':178,1071 'h':257,1334,1342,1354 'hallucin':821,1309 'handl':621 'handoff':1218 'happen':63 'header':1031 'heurist':243,259,351,586,832,870,918,979,1023,1190,1335 'http':459 'httpadapt':478 'httpx.httptransport':490 'identifi':115,753,805,1098 'implement':189 'implicit':1211 'import':121,125,131,137,143,149,606 'improv':1373 'includ':8,94,910,1015,1377 'indefinit':379 'infinit':52,1154 'input':725 'insid':722,768 'integ':578 'intend':923 'invoc':624,869 'invok':847 'issu':425,585,820,861,942,1133,1139,1156,1269,1352 'javascript/typescript':537 'judgment':244 'key':629,887 'known':405,644 'langchain':147,150,151,682,1256 'langchain.js':781 'langgraph':129,132,133,742,1055,1061,1194,1253 'langgraph.js':1213 'langgraph.json':164 'languag':99,567,1382 'language-specif':98,1381 'larg':1006 'larger':1021 'len':934 'level':730,737 'lib':213 'librari':645 'library/pattern':430,462,507,538 'like':274,630,879,1032,1200 'limit':12,35,86,414,1285,1292,1295,1321 'line':1283,1298,1347,1359 'list':747,755,819,899,1026,1220 'llm':837,845,857,868 'load':974 'local':64 'locat':168,1345,1357 'logic':204 'look':273 'loop':9,29,53,81,262,270,354,364,384,402,565,575,617,1270,1274,1280 'machin':1204 'main':202 'manual':410,649 'map':1080,1092,1096 'mark':246 'markdown':1239 'match':404,643,1333 'max':452,455,479,514,517,581,631 'may':1019 'md':196,798 'mechan':237,265,417,1289 'messagegraph':1076 'method':909,1215 'might':276 'mismatch':57 'miss':1293 'modul':607 'multipl':392,1007 'must':484 'n':441,447,454,469,471,487,492,494,496,548,558 'name':601,612,665,680,686,697,701,703,713,717,721,724,731,732,738,745,761,765,767,777,780,784,786,789,806,892,896,1245 'never':834,853,865 'new':778 'node':1100,1138,1140 'non':335,984,1193 'non-langgraph':1192 'non-recurs':334 'non-standard':983 'none':1258 'note':90,522,914,1016 'object':483 'openai':153,691,718,766 'option':550,560 'outgo':1143 'overflow':60 'p':253,555,1330,1337,1341,1353 'p-retri':554 'packag':215,611 'param':893 'paramet':345,387,420,432,464,509,540,734,772,886 'pass':268,281,571,1126,1174,1265,1336 'path':338,1130,1167,1223,1247 'pattern':3,7,27,37,48,78,126,232,236,255,261,278,355,359,406,412,568,590,593,641,651,669,675,676,708,709,757,927,1054,1241,1332 'pattern-match':1331 'potenti':400,639,1227,1278 'present':347 'pretri':553 'prioriti':175,1369 'process':109 'project':211,1244 'prompt':195,198,228,796,828,945,996,1009,1013,1029,1052,1319,1325 'prompts.py':194,800 'purpos':39 'py':185 'python':287,426,458,503,673,706,1157,1175 'python/typescript':123 'qualiti':96,1379 'quot':804 're':623 're-invoc':622 'reachabl':1101,1114,1123 'recommend':994,1327,1367,1370 'recurs':332,336,388 'refer':794,812,815,1311 'regist':672 'registri':653,1303 'remedi':1366 'report':1238,1243 'requir':245,419,431,463,508,539 'retri':11,34,55,85,413,435,461,480,481,482,491,493,498,501,513,526,543,546,547,551,556,557,561,564,589,599,609,616,632,633,640,647,1284,1288,1294 'return':306,321,337,894 'root':212 'rout':1209 'rule':1360,1362 'run':231,905 'runaway':54 'safeti':10,89,263,1271 'say':106,1385 'scan':362,595,660,797,875,1196 'schema':193,726 'scope':296 'sdk':155,505,529,693 'secur':95,1378 'sever':283,814,1119 'singl':953 'size':16,929,1012,1018,1316,1328 'skill':70,219,223,972 'skill-verify-patterns' 'sleep':619 'sourc':1083,1090 'source-aurite-ai' 'specif':100,1365,1383 'src':210 'src/agent':208 'stamina':614 'standard':985 'state':192,371,1203 'state.py':190 'state.ts':191 'stategraph':1075 'statement':290 'step':110,166,229,655,790,808,1065,1235 'stop':437,438,443,444,448 'string':999 'structur':880,890 'suggest':1348 'summari':1262 'system':227,944,1028,1051,1318,1324 'system.md':197 'tabl':360,594,604,1207 'tag':249 'tell':102 'templat':199,1003 'tenac':436 'termin':277,366,408,1222,1232,1276 'threshold':941,943,990 'tier':235 'timeout':374,386 'token':932,949,952,957,960,967,970,993,1323 'tool':13,31,56,83,184,186,188,652,659,661,681,690,700,748,751,770,793,822,824,831,833,840,849,862,873,878,897,898,901,915,925,954,962,1025,1034,1039,1044,1161,1164,1183,1188,1299,1302,1306,1310,1314 'tool-lik':877 'toolnod':739 'tools.py':182 'tools.ts':183 'top':729,736 'top-level':728,735 'topic-agent-skills' 'topic-agent-testing' 'topic-agent-verification' 'topic-ai-agent' 'topic-ai-coding-assistant' 'topic-claude-code' 'topic-cline' 'topic-code-quality' 'topic-code-review' 'topic-code-verification' 'topic-coding-agent' 'topic-cursor' 'total':468,473,476,486,488 'track':396 'transit':1206 'tri':453,456 'trigger':68 'true':285,315 'try/except':576 'ts':187 'ts/js':317 'txt':799 'type':714,762 'typescript/javascript':756 'unbound':401,1279 'uncondit':1085 'undocu':830,1313 'unrecogn':353,588,872 'urllib3.retry':467 'use':21,67,528,702 'user':73,104 'valu':705,719,782,787 'variabl':776,895 'verif':38,93,1242,1376 'verifi':2,4,25,30,40,76,82,87,107,407,646,919,1231,1386 'verify-pattern':1 'via':917,1115,1124 'violat':1363 'visibl':626 'warn':297,311,326,348,399,638,829,940,1149,1226,1267,1340 'within':292,308,323,987,1320 'without':380,385,394,524,625,1221 'workflow':180 'workflow.add':1081,1087,1158,1162,1176,1186 'written':242 'x':1263,1272,1286,1301,1305,1317,1322 'y':1266,1308 'yield':378 'z':1268,1312 'z.object':773 'zodfunct':785","prices":[{"id":"c6ba0bfd-6a91-40c8-8a6f-ddd5101e7c4e","listingId":"158edd3d-c292-488a-8bf1-3a5386454c37","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Aurite-ai","category":"agent-verifier","install_from":"skills.sh"},"createdAt":"2026-04-29T01:03:27.046Z"}],"sources":[{"listingId":"158edd3d-c292-488a-8bf1-3a5386454c37","source":"github","sourceId":"Aurite-ai/agent-verifier/verify-patterns","sourceUrl":"https://github.com/Aurite-ai/agent-verifier/tree/main/skills/verify-patterns","isPrimary":false,"firstSeenAt":"2026-04-29T01:03:27.046Z","lastSeenAt":"2026-05-18T18:58:29.960Z"}],"details":{"listingId":"158edd3d-c292-488a-8bf1-3a5386454c37","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Aurite-ai","slug":"verify-patterns","github":{"repo":"Aurite-ai/agent-verifier","stars":38,"topics":["agent-skills","agent-testing","agent-verification","ai-agent","ai-coding-assistant","claude-code","cline","code-quality","code-review","code-verification","coding-agent","cursor","devtools","langgraph","security","skills","windsurf"],"license":"mit","html_url":"https://github.com/Aurite-ai/agent-verifier","pushed_at":"2026-05-01T10:31:12Z","description":"Agent Verifier is a coding agent skill that verifies code against organizational policies, code quality patterns, security requirements, and framework best practices — before code ships. Works with Claude Code, Cursor, Windsurf, and 30+ agents.","skill_md_sha":"a8ac2eb7fbcb48cd0b0f52cf36099930c10aa65d","skill_md_path":"skills/verify-patterns/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Aurite-ai/agent-verifier/tree/main/skills/verify-patterns"},"layout":"multi","source":"github","category":"agent-verifier","frontmatter":{"name":"verify-patterns","description":"Verify AI agent patterns including loop safety, retry limits, tool consistency, context size, and graph cycle analysis. Use when asked to \"verify agent patterns\", \"check loops\", \"verify tools\", or \"check retry limits\"."},"skills_sh_url":"https://skills.sh/Aurite-ai/agent-verifier/verify-patterns"},"updatedAt":"2026-05-18T18:58:29.960Z"}}