[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6WZJVWMK77TYR2WG3FZB3YJ":3,"skill-same:01M6WZJVWMK77TYR2WG3FZB3YJ":63},{"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":42,"repositoryHtmlUrl":43,"repositoryHomepageUrl":44,"ownerHtmlUrl":45,"ownerBlogUrl":46,"ownerDescription":47,"updatedAt":48,"install":49,"resources":62},"01M6WZJVWMK77TYR2WG3FZB3YJ","verona-conventions",null,"Verona compiler coding conventions, C++ style, trieste patterns, and project structure. Applies when writing or reviewing Verona compiler code.","microsoft\u002Fverona","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M6WZHTA01TB3YK5SZM938MTG",3742,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fverona\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverona-conventions\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"conventions","verona conventions","writing","project structure","code","compiler","coding","patterns","structure","c++","project","false","style","coding conventions","when","2026-11-10 10:12:30",false,"---\nname: verona-conventions\ndescription: Verona compiler coding conventions, C++ style, trieste patterns, and project structure. Applies when writing or reviewing Verona compiler code.\nuser-invocable: false\n---\n\n# Verona Compiler Conventions\n\n## C++ Style (C++20)\n\n- `snake_case` for functions, variables, namespaces. `PascalCase` for types\u002Fclasses.\n- Token definitions use `PascalCase`: `inline const auto TypeName = TokenDef(...)`.\n- Allman braces (opening brace on own line). Exception: single-line lambdas.\n- No `goto`. Use flags, early returns, or helper functions.\n- `#pragma once`, not include guards.\n- Project headers first, then system\u002Flibrary headers separated by a blank line.\n- Use `constexpr`\u002F`consteval`, structured bindings, `if constexpr`, `std::span`, `[[nodiscard]]`.\n- Prefer `static constexpr` over `#define` for constants.\n\n## Trieste Patterns\n\n- **Node construction**: `Node n = SomeToken` creates a node. NOT `auto n = SomeToken` (copies TokenDef).\n- **Child access**: `n \u002F ChildToken` (named WF accessor), not `n->at(i)` (positional).\n- **Append children**: `node \u003C\u003C child`. Set value: `node ^ value`. Duplicate: `clone()`.\n- **Clone shared nodes**: Always `clone()` nodes inserted into multiple AST locations.\n- **Token comparison**: `node->type() == OtherToken`, NOT `node == other_node` (compares pointers).\n- **Error handling**: `err(node, \"message\")` wraps in `Error \u003C\u003C ErrorMsg \u003C\u003C ErrorAst`.\n- **Tree mutation**: `traverse()` iterators are invalidated by `replace()`\u002F`erase()`. Collect first, mutate after.\n- **WF declarations**: Every pass declares output shape. `\u003C\u003C=` for children, `++` for zero-or-more, `|` for choices.\n- **Symbol table**: `lookup()` walks up + follows includes. `lookdown()` searches own symtab only, no includes. `look()` is immediate, no flags.\n- **Pass structure**: `PassDef` with name, WF, direction (`dir::topdown`\u002F`dir::bottomup`\u002F`dir::once`), rewrite rules. `pre()`\u002F`post()` hooks.\n\n## Build & Test\n\n- Build in `build\u002F` directory. `ninja install` to build. Use `dist\u002Fvc\u002Fvc` and `dist\u002Fvbci\u002Fvbci` (installed binaries have `_builtin`).\n- Rebuild with `ninja install` before debugging or validating compiler\u002Fruntime behavior on the current branch.\n- Run `vc` from `build\u002F`: `dist\u002Fvc\u002Fvc build ..\u002Ftestsuite\u002Fv\u002Fhello`. Do NOT cd into source dir.\n- Debug with the binaries under the active build directory's `dist\u002F` tree. Do not use non-installed build outputs when validating behavior.\n- `ctest --output-on-failure -j$(nproc)` for full test suite.\n- `-p \u003Cpassname>` stops after a pass. `--dump_passes=\u003Cdir>` dumps intermediate ASTs.\n- Golden files: `ninja update-dump`\n- `exit_code.txt` has NO trailing newline (`printf '0'`, not `echo`).\n- Treat compile-time and runtime test failures as real regressions until they are investigated on the current baseline. Do not assume a failure predates your change without verification.\n\n## Test Conventions\n\n- Tests in `testsuite\u002Fv\u002F` must be self-contained. No external deps, no `use \"https:\u002F\u002F...\"`.\n- Do NOT write `use \"_builtin\"` — it is always implicitly available.\n- Bitmask exit code pattern: `var result = 0;` then `if cond { result = result + N; }` with powers of 2. Exit 0 = all passed.\n- Compile-error tests: `exit_code.txt: 1` in `compile\u002F`, no `run\u002F` directory.\n- Structure: `testsuite\u002Fv\u002F\u003Cname>\u002F\u003Cname>.v` with golden dirs `\u003Cname>\u002F\u003Cname>\u002Fcompile\u002F` and `\u003Cname>\u002F\u003Cname>\u002Frun\u002F`.\n- FFI tests must include at least one reachable FFI call from their lib to trigger init function reification.\n\n## Verona Source Syntax\n\n- Class definitions: `myclass[T] { ... }` (no `class` keyword).\n- Fields need semicolons: `val: T;`. No `let`\u002F`var` on class fields.\n- No semicolons after closing braces of `for`, `if`, `while`.\n- `new { field = val }` — no class name after `new`.\n- `use X` imports for unqualified lookup. `use \"url\"` for packages. `_builtin` is always implicit.\n- `(obj.field)(args)` to call `apply` on field access result.\n- `Type(args)` constructor sugar calls `create` method (e.g., `callback(f)` → `callback::create(f)`).\n- `x.method` for zero-arg methods (no parens).\n- `!expr` for boolean negation.\n- Array literals: `::(expr, ...)`.\n- Match: `(match expr { (pattern) -> body; ... }) else (default)`.\n- FFI calls: `:::name(args)` for direct FFI, `ffi::func(args)` for `_builtin\u002Fffi\u002F` wrappers.\n- FFI data passing: arrays pass as pointers to their data (e.g., `array[u8]` → `uint8_t*`), objects pass as pointers to their fields (like a C struct). No wrapper types cross the FFI boundary.\n- Packages: `use \"url\" \"tag\"` imports from a git repo. `use \"~\u002Fdev\u002Fpkg\" \"main\"` works for local repos.\n\n## Architecture\n\n- Small, composable passes. Many small passes > few large ones.\n- Layered dependencies — lower layers never depend on higher ones.\n- Frontend (vc, passes 0–9): parse → structure → ident → sugar → functype → dot → application → anf → infer → reify.\n- Backend (vbcc library, passes 10–13): assignids → validids → liveness → typecheck.\n- `assert()` liberally for invariants.\n- Errors are AST nodes, not exceptions.\n\n## Adding New Ops\u002FBuiltins\n\nAdding a new bytecode op requires updates in ~15 places across the codebase. Use this checklist:\n\n1. **Token def**: `include\u002Fvbcc.h` (token), `include\u002Fvbci.h` (Op enum)\n2. **Frontend WFs** in `vc\u002Flang.h`: `wfExprDot`, `wfPassDot` (with `\u003C\u003C= Args`), `wfBodyANF`, `wfPassANF` (with `\u003C\u003C= wfDst * wfSrc`)\n3. **Frontend passes**: `dot.cc` (builtin reg), `anf.cc` (lowering), `infer.cc` (type tracking), `reify.cc` (IR transform)\n4. **Backend WFs** in `include\u002Fvbcc.h`: `wfStatement`, `wfIR`\n5. **`Def` pattern** in `vbcc\u002Flang.h`: manually maintained list — MUST include if op has a dst `LocalId`\n6. **Liveness** in `vbcc\u002Fpasses\u002Fliveness.cc`: manually categorized ops — add to correct use\u002Fdef category\n7. **Bytecode** in `vbcc\u002Fbytecode.cc`: encoding handler\n8. **Type check** in `vbcc\u002Fpasses\u002Ftypecheck.cc`: if needed\n9. **Interpreter** in `vbci\u002Fthread.cc`: op handler + op name in name array\n\nMissing items 5 or 6 causes \"undefined register\" errors in later passes, not at the registration site.\n\n## Debugging\n\n- Trace data flow, not just error sites. Root cause is often upstream.\n- For tricky compiler\u002Fruntime\u002FFFI bugs, do principled analysis first: reproduce, trace, inspect dumps, and localize the fault before changing semantics.\n- Before speculative interpreter\u002Fruntime changes, explain the evidence and proposed fix and get feedback.\n- \"Bad type\" runtime errors usually mean unrefined default literals in compiler output. Check infer pass dump.\n- `node->type() == other->type()` for token comparison, NOT `node == other_node`.\n- Write targeted tests that expose the bug before fixing.\n- Runtime failures matter as much as compile-time failures. Investigate both with the current branch's `dist\u002F` binaries.\n- Do not describe runtime behavior as flaky or dismiss it as harness noise without first reproducing and tracing it to a concrete cause.\n- Durable Verona-specific workflow rules belong in this skill or the repo `AGENTS.md`, not in agent-specific memory stores.\n","# Verona Compiler Conventions\n\n## C++ Style (C++20)\n\n- `snake_case` for functions, variables, namespaces. `PascalCase` for types\u002Fclasses.\n- Token definitions use `PascalCase`: `inline const auto TypeName = TokenDef(...)`.\n- Allman braces (opening brace on own line). Exception: single-line lambdas.\n- No `goto`. Use flags, early returns, or helper functions.\n- `#pragma once`, not include guards.\n- Project headers first, then system\u002Flibrary headers separated by a blank line.\n- Use `constexpr`\u002F`consteval`, structured bindings, `if constexpr`, `std::span`, `[[nodiscard]]`.\n- Prefer `static constexpr` over `#define` for constants.\n\n## Trieste Patterns\n\n- **Node construction**: `Node n = SomeToken` creates a node. NOT `auto n = SomeToken` (copies TokenDef).\n- **Child access**: `n \u002F ChildToken` (named WF accessor), not `n->at(i)` (positional).\n- **Append children**: `node \u003C\u003C child`. Set value: `node ^ value`. Duplicate: `clone()`.\n- **Clone shared nodes**: Always `clone()` nodes inserted into multiple AST locations.\n- **Token comparison**: `node->type() == OtherToken`, NOT `node == other_node` (compares pointers).\n- **Error handling**: `err(node, \"message\")` wraps in `Error \u003C\u003C ErrorMsg \u003C\u003C ErrorAst`.\n- **Tree mutation**: `traverse()` iterators are invalidated by `replace()`\u002F`erase()`. Collect first, mutate after.\n- **WF declarations**: Every pass declares output shape. `\u003C\u003C=` for children, `++` for zero-or-more, `|` for choices.\n- **Symbol table**: `lookup()` walks up + follows includes. `lookdown()` searches own symtab only, no includes. `look()` is immediate, no flags.\n- **Pass structure**: `PassDef` with name, WF, direction (`dir::topdown`\u002F`dir::bottomup`\u002F`dir::once`), rewrite rules. `pre()`\u002F`post()` hooks.\n\n## Build & Test\n\n- Build in `build\u002F` directory. `ninja install` to build. Use `dist\u002Fvc\u002Fvc` and `dist\u002Fvbci\u002Fvbci` (installed binaries have `_builtin`).\n- Rebuild with `ninja install` before debugging or validating compiler\u002Fruntime behavior on the current branch.\n- Run `vc` from `build\u002F`: `dist\u002Fvc\u002Fvc build ..\u002Ftestsuite\u002Fv\u002Fhello`. Do NOT cd into source dir.\n- Debug with the binaries under the active build directory's `dist\u002F` tree. Do not use non-installed build outputs when validating behavior.\n- `ctest --output-on-failure -j$(nproc)` for full test suite.\n- `-p \u003Cpassname>` stops after a pass. `--dump_passes=\u003Cdir>` dumps intermediate ASTs.\n- Golden files: `ninja update-dump`\n- `exit_code.txt` has NO trailing newline (`printf '0'`, not `echo`).\n- Treat compile-time and runtime test failures as real regressions until they are investigated on the current baseline. Do not assume a failure predates your change without verification.\n\n## Test Conventions\n\n- Tests in `testsuite\u002Fv\u002F` must be self-contained. No external deps, no `use \"https:\u002F\u002F...\"`.\n- Do NOT write `use \"_builtin\"` — it is always implicitly available.\n- Bitmask exit code pattern: `var result = 0;` then `if cond { result = result + N; }` with powers of 2. Exit 0 = all passed.\n- Compile-error tests: `exit_code.txt: 1` in `compile\u002F`, no `run\u002F` directory.\n- Structure: `testsuite\u002Fv\u002F\u003Cname>\u002F\u003Cname>.v` with golden dirs `\u003Cname>\u002F\u003Cname>\u002Fcompile\u002F` and `\u003Cname>\u002F\u003Cname>\u002Frun\u002F`.\n- FFI tests must include at least one reachable FFI call from their lib to trigger init function reification.\n\n## Verona Source Syntax\n\n- Class definitions: `myclass[T] { ... }` (no `class` keyword).\n- Fields need semicolons: `val: T;`. No `let`\u002F`var` on class fields.\n- No semicolons after closing braces of `for`, `if`, `while`.\n- `new { field = val }` — no class name after `new`.\n- `use X` imports for unqualified lookup. `use \"url\"` for packages. `_builtin` is always implicit.\n- `(obj.field)(args)` to call `apply` on field access result.\n- `Type(args)` constructor sugar calls `create` method (e.g., `callback(f)` → `callback::create(f)`).\n- `x.method` for zero-arg methods (no parens).\n- `!expr` for boolean negation.\n- Array literals: `::(expr, ...)`.\n- Match: `(match expr { (pattern) -> body; ... }) else (default)`.\n- FFI calls: `:::name(args)` for direct FFI, `ffi::func(args)` for `_builtin\u002Fffi\u002F` wrappers.\n- FFI data passing: arrays pass as pointers to their data (e.g., `array[u8]` → `uint8_t*`), objects pass as pointers to their fields (like a C struct). No wrapper types cross the FFI boundary.\n- Packages: `use \"url\" \"tag\"` imports from a git repo. `use \"~\u002Fdev\u002Fpkg\" \"main\"` works for local repos.\n\n## Architecture\n\n- Small, composable passes. Many small passes > few large ones.\n- Layered dependencies — lower layers never depend on higher ones.\n- Frontend (vc, passes 0–9): parse → structure → ident → sugar → functype → dot → application → anf → infer → reify.\n- Backend (vbcc library, passes 10–13): assignids → validids → liveness → typecheck.\n- `assert()` liberally for invariants.\n- Errors are AST nodes, not exceptions.\n\n## Adding New Ops\u002FBuiltins\n\nAdding a new bytecode op requires updates in ~15 places across the codebase. Use this checklist:\n\n1. **Token def**: `include\u002Fvbcc.h` (token), `include\u002Fvbci.h` (Op enum)\n2. **Frontend WFs** in `vc\u002Flang.h`: `wfExprDot`, `wfPassDot` (with `\u003C\u003C= Args`), `wfBodyANF`, `wfPassANF` (with `\u003C\u003C= wfDst * wfSrc`)\n3. **Frontend passes**: `dot.cc` (builtin reg), `anf.cc` (lowering), `infer.cc` (type tracking), `reify.cc` (IR transform)\n4. **Backend WFs** in `include\u002Fvbcc.h`: `wfStatement`, `wfIR`\n5. **`Def` pattern** in `vbcc\u002Flang.h`: manually maintained list — MUST include if op has a dst `LocalId`\n6. **Liveness** in `vbcc\u002Fpasses\u002Fliveness.cc`: manually categorized ops — add to correct use\u002Fdef category\n7. **Bytecode** in `vbcc\u002Fbytecode.cc`: encoding handler\n8. **Type check** in `vbcc\u002Fpasses\u002Ftypecheck.cc`: if needed\n9. **Interpreter** in `vbci\u002Fthread.cc`: op handler + op name in name array\n\nMissing items 5 or 6 causes \"undefined register\" errors in later passes, not at the registration site.\n\n## Debugging\n\n- Trace data flow, not just error sites. Root cause is often upstream.\n- For tricky compiler\u002Fruntime\u002FFFI bugs, do principled analysis first: reproduce, trace, inspect dumps, and localize the fault before changing semantics.\n- Before speculative interpreter\u002Fruntime changes, explain the evidence and proposed fix and get feedback.\n- \"Bad type\" runtime errors usually mean unrefined default literals in compiler output. Check infer pass dump.\n- `node->type() == other->type()` for token comparison, NOT `node == other_node`.\n- Write targeted tests that expose the bug before fixing.\n- Runtime failures matter as much as compile-time failures. Investigate both with the current branch's `dist\u002F` binaries.\n- Do not describe runtime behavior as flaky or dismiss it as harness noise without first reproducing and tracing it to a concrete cause.\n- Durable Verona-specific workflow rules belong in this skill or the repo `AGENTS.md`, not in agent-specific memory stores.\n",{"name":5,"description":7,"user-invocable":35},"main","e9256534317bd40707e7e78ba022b8bcd0eb6577",".agents\u002Fskills\u002Fverona-conventions",173,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fverona","https:\u002F\u002Fmicrosoft.github.io\u002Fverona\u002F","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-13 21:03:28",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add microsoft\u002Fverona --skill verona-conventions",{"tool":55,"command":56},"bunx","bunx skills add microsoft\u002Fverona --skill verona-conventions",{"tool":58,"command":59},"pnpm","pnpm dlx skills add microsoft\u002Fverona --skill verona-conventions","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fverona\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverona-conventions\u002FSKILL.md",true,[],[64,86,91,109,125,146],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":34},"01M6WZM7JFY7GMHE7YTCC4K0ZS","verona-type-inference","Verona compiler type inference model — bidirectional refinement, per-function inference, lambda\u002Fcontext propagation, algebraic and structural typing, generics, and debugging. Use when changing or debugging `vc\u002Fpasses\u002Finfer.cc` or investigating type inference failures.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fverona\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fverona-type-inference\u002FSKILL.md",[],[71,72,73,74,33,75,76,77,78,30,79,80,81,82,83,84,24,85],"verona type inference","type","inference","cc","vc","refinement","typing","infer","propagation","structural","use","context","model","lambda","debugging",{"skillNo":87,"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":88,"categories":89,"keywords":90,"publishedAt":34},"01M6WZM48VF2FFX61WFYTD5XVJ","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fverona\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fverona-conventions\u002FSKILL.md",[],[20,19,21,30,29,28,27,26,25,24,23,22,31,33,32],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":34},"01M6WZM0Z3CTQG1ZRV9V2DZX9W","verona-coding","Patterns, pitfalls, and idioms for writing Verona source code (.v files). Use when writing library code, _builtin types, or user programs.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fverona\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fverona-coding\u002FSKILL.md",[],[98,25,33,99,100,101,102,103,26,104,105,106,81,107,108,23,21],"verona coding","source code","source","for","pitfalls","types","builtin","files","idioms","user","library",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":34},"01M6WZKWW9ZCQ1EXZYR4GZ00YF","vbci-memory","Verona interpreter (vbci) memory management model — regions, reference counting, write barriers, dragging, cowns, and finalization. Use when working on or debugging vbci runtime memory management code.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fverona\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fvbci-memory\u002FSKILL.md",[],[116,117,118,33,119,120,121,122,81,123,124,83,23,85],"vbci memory","memory","runtime","counting","interpreter","memory management","reference","management","write",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":34},"01M6WZKP04VZBWRZ2449FBRDNY","testsuite","Verona compiler test suite infrastructure — running tests, updating golden files, verifying pass completeness, checking error codes. Use when debugging test failures, regenerating golden files, or understanding the test framework.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fverona\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftestsuite\u002FSKILL.md",[],[127,81,33,132,133,134,135,136,137,138,105,139,140,24,141,142,85,143,144,145],"error codes","suite","codes","error","golden","completeness","tests","test suite","running","running tests","framework","infrastructure","test framework","test",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":157,"publishedAt":34},"01M6WZKGQY812K6W0R89Y7HD9T","review","Run a principle-based code review on the current branch. Use when the user asks for a review, or at mandatory review checkpoints (after planning, after implementation before PR).","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fverona\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Freview\u002FSKILL.md",[152],{"categoryNo":153,"categoryName":154,"taxonomyType":155,"taxonomyTypeDesc":156},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",[148,158,159,160,161,162,23,33,101,163,107,81,164,165,166],"planning","branch","code review","pr","run","at","checkpoints","implementation","base"]