[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DAMKD6XTGZAGA91JZXVATH":3,"skill-same:01M6DAMKD6XTGZAGA91JZXVATH":61},{"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":23,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":42,"repositoryHtmlUrl":43,"repositoryHomepageUrl":6,"ownerHtmlUrl":44,"ownerBlogUrl":45,"ownerDescription":6,"updatedAt":46,"install":47,"resources":60},"01M6DAMKD6XTGZAGA91JZXVATH","reviewer-review-code",null,"Review implementation slices with EAGER severity tree","dayvidpham\u002Fpasture","dayvidpham","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22456875?v=4","01M6CHR0F6J2M4QEHFR85XRNSR","David Huu Pham","01M6DA7X1WB0MK7TTV46SRZK75",1,"MIT","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Fpasture\u002Fblob\u002Fmain\u002Fskills\u002Freviewer-review-code\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33],"code","reviewer","review","reviewer review code","review code","severity","review implementation","implementation","tree","with","2026-11-10 10:12:30",false,"---\nname: reviewer-review-code\ndescription: Review implementation slices with EAGER severity tree\n---\n\n# Review Code Implementation\n\n\u003C!-- BEGIN GENERATED FROM pasture schema -->\n\u003C!-- GENERATED FROM pasture v0.0.33 artifact v1 -->\n**Command:** `pasture:reviewer:review-code` — Review implementation slices with EAGER severity tree\n\n**-> [Full workflow in PROCESS.md](..\u002Fprotocol\u002FPROCESS.md#phase-10-code-review)** \u003C- Phase 10\n\n**[rev-code-quality-gates]**\n- Given: code assignment\n- When: reviewing\n- Then: apply end-user alignment criteria and verify production code paths\n- Should not: approve without running quality gates\n\n**[rev-code-verify-gates]**\n- Given: implementation\n- When: verifying\n- Then: run the project's quality gates\n- Should not: approve without passing checks\n\n**[rev-code-eager-severity]**\n- Given: issues found\n- When: categorizing\n- Then: use BLOCKER\u002FIMPORTANT\u002FMINOR severity with EAGER group creation\n- Should not: skip creating empty severity groups\n\n**[frag--sup-blocker-dual-parent]**\n- Given: BLOCKER finding\n- When: wiring dependencies\n- Then: add dual-parent: blocks BOTH the severity group AND the slice\n- Should not: wire BLOCKER to only one parent\n\n**[frag--review-clean-exit]**\n- Given: per-wave code review and end-of-epoch convergence\n- When: evaluating review results\n- Then: iterate review -> fix -> re-review up to the chosen review-effort budget; during a wave only an open BLOCKER finding gates progress, while IMPORTANT and MINOR findings stay open; after the last wave, converge over open `pasture:finding` tasks across all waves toward 0\u002F0\u002F0 within maxRounds; a finding closes only per `C-finding-lifecycle`; on budget exhaustion without convergence, SURFACE the outstanding findings to the user at a gate for a decision\n- Should not: hardcode the budget; proceed past the chosen budget without surfacing outstanding findings to the user; require a zeroed round at a wave boundary; close a finding outside `C-finding-lifecycle`; loop forever when a finite budget was chosen\n\n**[frag--validation-cases]**\n- Given: any REQUEST (every request, not only fix-intent ones)\n- When: eliciting (URE), acceptance-testing (UAT), or implementing\n- Then: elicit concrete validation cases — a definition of done plus correct and incorrect behaviours (inputs\u002Fbehaviors that must pass or must fail), confirm the case set with the user in UAT, evaluate the implementation against them, and store failing real-data cases as test fixtures\n- Should not: ship without validation cases; treat validation cases as applying to fix-intent requests only; introduce a request-type axis or enum to gate them\n\n## Task Recovery\n\nThe tracker backend is recorded once in .agents.local\u002Fpasture\u002FEPOCH.md; read that file instead of re-probing. If EPOCH.md is absent, stop and ask the orchestrator to run detection.\n\nRecover from live tracker state at session start and after compaction; never trust cached task rows. Read the `rec:` path from the header and use it as the one entry point: `\"${EPOCH_REC}\" \u003Cop>`. The operation set is closed: create, label, block, note, show, query, ready, status, close, whoami, signal.\n\nStore selection: the adapter reads PASTURE_DB_PATH when set, otherwise the header's `db:`; the probe wrote that value from the same precedence (XDG_DATA_HOME\u002Fpasture\u002Fpasture.db, HOME\u002F.local\u002Fshare\u002Fpasture\u002Fpasture.db, then .pasture\u002Fpasture.db). Use the same selected store for every command. If a recovery query fails, report its actual store path, failed operation, impact, and permission\u002Fschema\u002Fconfiguration repair; failure is not an empty work queue.\n\nThe adapter passes `--namespace` only when EPOCH.md records `namespace:`. That pin wins on both backends. Otherwise it omits the flag. Pasture then derives the namespace itself: PASTURE_NAMESPACE, else the git remote, then file:\u002F\u002F of the working directory. The ledger calls derive_namespace for the header and for every write that has no pin. That function is the one list of remote forms; do not restate it. With no origin, both backends use file:\u002F\u002F of the working directory, so invocations from different subdirectories use different namespaces. Queries without a pin follow that backend's derivation; pass `--all-namespaces` to opt out. When neither a pin nor PASTURE_NAMESPACE is set, pasture reads are unscoped and creation falls back to the git remote, then file:\u002F\u002F of the working directory. Inspect the returned full URI before choosing repository work. Separate reads are not an atomic snapshot.\n\nRun `\"${EPOCH_REC}\" ready`, `\"${EPOCH_REC}\" query --blocked`, and `\"${EPOCH_REC}\" query --status in_progress`. For each referenced active task, run `\"${EPOCH_REC}\" show \"$TASK_URI\"`, `\"${EPOCH_REC}\" show \"$TASK_URI\" --notes`, and `\"${EPOCH_REC}\" show \"$TASK_URI\" --history`. All *_URI variables in examples are inputs bound to full task URIs from an assignment, a verified tracker read, or the URI create printed; never use legacy short IDs. Resolve each variable before execution and quote it as one operand.\n\nCreate prints the new task URI directly. Persist it before any label or note: create-plus-label is non-atomic, so on failure retain the URI and retry only the failed label\u002Fnote operation, never create again. Only open, in_progress, and closed are statuses; blockage is represented by live dependencies and notes, not a blocked status.\n\nAn owner is recorded with `\"${EPOCH_REC}\" label \"$TASK_URI\" owner:\u003Crole>`. That is a claim, not an allocation: an unassigned task stays unassigned until the supervisor allocates it, and repeating an identical claim is not allocation. Never invent an owner.\n\nParent stays open and is blocked by child: `\"${EPOCH_REC}\" block \"$PARENT_URI\" --by \"$CHILD_URI\"`. Reference documents belong in description frontmatter under references:, never fabricated blockers. Workers report evidence and handoffs without closing their slices or leaves; the supervisor closes only after independent review and satisfied gates. Use git agent-commit for local commits. Never install, enable, or modify Git hooks, Git hook path configuration, or pre-commit integration without explicit user approval. Tracker writes are durable; Git history lands separately.\n\nIf the header records `backend: error`, stop before the first mutation: the store exists but cannot be used, and falling back could lose earlier epochs. A mid-epoch write failure retries 3 times. After the third failure, write the attempted record to .agents.local\u002Fpasture\u002Fpending\u002F\u003Ctimestamp>-\u003Cop>.md, keep the recorded backend, and surface the pending record to the user at the next gate. Never switch backends and never drop the record.\n\n## Task Attribution\n\nSelect the current registered author with \"${EPOCH_REC}\" whoami. It prints the author recorded in the header or PASTURE_AUTHOR, and on the pasture backend it confirms that actor with agents show. It does not list agents and it does not invent one. If neither source names an author, it stops: set author: in EPOCH.md or export PASTURE_AUTHOR. Never auto-register or guess an identity during recovery. Every note supplies --author explicitly; machine examples use the pre-registered pasture-system\u002F00000000-0000-0000-0000-000000000000 actor. If it is absent, stop and request registration from the operator rather than claiming registration is fixed. Preserve human intent verbatim and quote historical attribution as evidence, not as a forged new author.\n\n## When to Use\n\nAssigned to review code implementation after worker slices complete (Phase 10).\n\n## Severity Tree: EAGER Creation\n\nFirst bind REVIEW_ID_URI using Step 4: Create Review Task below; then **ALWAYS create 3 severity group tasks per wave, per axis, per round**, even if some groups have no findings:\n\n### Step 1: Create All 3 Severity Groups Immediately\n\n```bash\n# One severity trio per wave, per axis, per round — not one per slice.\n# Wave 1 contains the first slice, the second slice, and the third slice.\n# Step 1: Create all 3 severity groups immediately (EAGER, not lazy)\nBLOCKER_GROUP_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"WAVE-{W}-REVIEW-{axis}-{round} BLOCKER\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slices:\n    - \\\"${SLICE_1_1_ID_URI}\\\"\n    - \\\"${SLICE_1_2_ID_URI}\\\"\n    - \\\"${SLICE_1_3_ID_URI}\\\"\n  review: \\\"${REVIEW_ID_URI}\\\"\n---\nBLOCKER findings for this wave review round\")\n\"${EPOCH_REC}\" label \"$BLOCKER_GROUP_ID_URI\" pasture:severity:blocker\n\nIMPORTANT_GROUP_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"WAVE-{W}-REVIEW-{axis}-{round} IMPORTANT\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slices:\n    - \\\"${SLICE_1_1_ID_URI}\\\"\n    - \\\"${SLICE_1_2_ID_URI}\\\"\n    - \\\"${SLICE_1_3_ID_URI}\\\"\n  review: \\\"${REVIEW_ID_URI}\\\"\n---\nIMPORTANT findings for this wave review round\")\n\"${EPOCH_REC}\" label \"$IMPORTANT_GROUP_ID_URI\" pasture:severity:important\n\nMINOR_GROUP_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"WAVE-{W}-REVIEW-{axis}-{round} MINOR\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slices:\n    - \\\"${SLICE_1_1_ID_URI}\\\"\n    - \\\"${SLICE_1_2_ID_URI}\\\"\n    - \\\"${SLICE_1_3_ID_URI}\\\"\n  review: \\\"${REVIEW_ID_URI}\\\"\n---\nMINOR findings for this wave review round\")\n\"${EPOCH_REC}\" label \"$MINOR_GROUP_ID_URI\" pasture:severity:minor\n\n# Step 2: Wire the one severity trio to the wave's review task\n\"${EPOCH_REC}\" block \"${REVIEW_ID_URI}\" --by \"${BLOCKER_GROUP_ID_URI}\"\n\"${EPOCH_REC}\" block \"${REVIEW_ID_URI}\" --by \"${IMPORTANT_GROUP_ID_URI}\"\n\"${EPOCH_REC}\" block \"${REVIEW_ID_URI}\" --by \"${MINOR_GROUP_ID_URI}\"\n```\n\n### Adding Findings to Severity Groups\n\n```bash\n# Each finding carries slice: and wave: in references.\n# BLOCKER finding — dual-parent relationship\nBLOCKER_FINDING_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"BLOCKER: \u003Cfinding title>\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slice: \\\"${SLICE_1_1_ID_URI}\\\"\n  reviewer: reviewer-A\n  round: 1\n---\n\u003Cfinding details with file:line references>\")\n\"${EPOCH_REC}\" label \"${BLOCKER_FINDING_ID_URI}\" pasture:finding\n\"${EPOCH_REC}\" block \"${BLOCKER_GROUP_ID_URI}\" --by \"${BLOCKER_FINDING_ID_URI}\"\n\"${EPOCH_REC}\" block \"${SLICE_1_1_ID_URI}\" --by \"${BLOCKER_FINDING_ID_URI}\"\n\n# IMPORTANT finding — single parent (severity group only)\nIMPORTANT_FINDING_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"IMPORTANT: \u003Cfinding title>\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slice: \\\"${SLICE_1_2_ID_URI}\\\"\n  reviewer: reviewer-A\n  round: 1\n---\n\u003Cfinding details>\")\n\"${EPOCH_REC}\" label \"${IMPORTANT_FINDING_ID_URI}\" pasture:finding\n\"${EPOCH_REC}\" block \"${IMPORTANT_GROUP_ID_URI}\" --by \"${IMPORTANT_FINDING_ID_URI}\"\n\n# MINOR finding — single parent (severity group only)\nMINOR_FINDING_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"MINOR: \u003Cfinding title>\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slice: \\\"${SLICE_1_3_ID_URI}\\\"\n  reviewer: reviewer-A\n  round: 1\n---\n\u003Cfinding details>\")\n\"${EPOCH_REC}\" label \"${MINOR_FINDING_ID_URI}\" pasture:finding\n\"${EPOCH_REC}\" block \"${MINOR_GROUP_ID_URI}\" --by \"${MINOR_FINDING_ID_URI}\"\n```\n\n### Closing Empty Groups\n\nEmpty severity groups (no findings) are closed immediately:\n\n```bash\n# If no IMPORTANT findings were found:\n\"${EPOCH_REC}\" close \"${IMPORTANT_GROUP_ID_URI}\"\n\n# If no MINOR findings were found:\n\"${EPOCH_REC}\" close \"${MINOR_GROUP_ID_URI}\"\n```\n\n### Dual-Parent BLOCKER Relationship\n\nBLOCKER findings have **two parents**:\n1. The severity group task (`pasture:severity:blocker`) — for categorization\n2. The slice they block — for dependency tracking\n\nThis ensures BLOCKERs both categorize under the severity tree AND block the slice they apply to.\n\nIMPORTANT and MINOR findings do **NOT** block the slice via dual-parent (only BLOCKER does), and they are **not** routed to a follow-up epic: they stay open past the wave gate and converge at the end, where the convergence rule reads open pasture:finding tasks across all waves (R7\u002FA1). The FOLLOWUP epic is fed ONLY by user-DEFER'd UAT items, never by any review severity.\n\n## Steps\n\n\n\n### Step 1: Read Code Changes and URD\n\n```bash\n\"${EPOCH_REC}\" show \"${SLICE_ID_URI}\"\n\"${EPOCH_REC}\" show \"${URD_ID_URI}\"   # Read URD for requirements context\n```\n\n### Step 2: Run Quality Gates\n\n```bash\n# Run your project's type checking and test commands\n```\n\n### Step 3: Apply Review Criteria and Verify Production Code Paths\n\nApply end-user alignment criteria (see `pasture:reviewer`) and verify production code paths (see Verify Production Code Paths section below).\n\n### Step 4: Create Review Task\n\n```bash\nREVIEW_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"Review: \u003Cfeature>\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slices:\n    - \\\"${SLICE_1_1_ID_URI}\\\"\n    - \\\"${SLICE_1_2_ID_URI}\\\"\n    - \\\"${SLICE_1_3_ID_URI}\\\"\n  urd: \\\"${URD_ID_URI}\\\"\n---\nVOTE: \u003CACCEPT|REVISE> - \u003Cjustification>\")\n# One review covers the whole wave, so wire every slice in the wave to it.\n\"${EPOCH_REC}\" block \"${SLICE_1_1_ID_URI}\" --by \"${REVIEW_ID_URI}\"\n\"${EPOCH_REC}\" block \"${SLICE_1_2_ID_URI}\" --by \"${REVIEW_ID_URI}\"\n\"${EPOCH_REC}\" block \"${SLICE_1_3_ID_URI}\" --by \"${REVIEW_ID_URI}\"\n```\n\n### Steps 5–8: Severity Tree and Vote\n\n5. Create severity tree (EAGER — all 3 groups immediately)\n6. Add findings to appropriate severity groups\n7. Close empty severity groups\n8. Cast vote via `\"${EPOCH_REC}\" note`\n\n## Verify Production Code Paths\n\n\n\n### Check for Dual-Export Anti-Pattern\n\n**Anti-pattern example:**\n```go\n\u002F\u002F WRONG: Test-only export\nfunc HandleCommand(argv []string, service Service) error { \u002F* tested *\u002F }\n\n\u002F\u002F WRONG: Production-only command (not tested)\nvar commandCmd = &cobra.Command{\n    Use: \"command\",\n    RunE: func(cmd *cobra.Command, args []string) error {\n        \u002F\u002F TODO: wire up service\n        return nil\n    },\n}\n```\n\n**Correct example:**\n```go\n\u002F\u002F CORRECT: Single command, both tested and used in production\nvar commandCmd = &cobra.Command{\n    Use: \"command\",\n    RunE: func(cmd *cobra.Command, args []string) error {\n        service := NewService(RealDeps{})\n        result, err := service.DoThing(args)\n        if err != nil {\n            return err\n        }\n        fmt.Println(result)\n        return nil\n    },\n}\n\n\u002F\u002F Tests import commandCmd directly\n\u002F\u002F import \"myproject\u002Fcmd\u002Fthing\"\n```\n\n### Verify No TODO Placeholders\n\n```bash\ngrep -r \"TODO\" src\u002F  # Should not find any in delivered code\n```\n\n### Check Tests Import Production Code\n\n- Test file should import the actual CLI command or API endpoint\n- Not a separate test harness function\n- No TODOs in CLI\u002FAPI actions\n- Real dependencies wired (not mocks in production code)\n\n### Verify Validation Cases (R6)\n\nFor **every** REQUEST (not only fix-intent ones), per [frag--validation-cases] verify the implementation:\n- Carries **test fixtures** for the concrete validation cases captured in URE\u002FUAT (the definition of done plus the correct\u002Fincorrect behaviours that must pass or must fail).\n- Evaluates the implementation against each confirmed validation case.\n\nAn implementation that ships without validation-case fixtures is an IMPORTANT finding. There is **no** request-type axis\u002Fenum gating this — recognize what a request needs from the REQUEST\u002FURD.\n\n## Two-Phase Review (within the chosen review-effort budget)\n\nPer [frag--review-clean-exit], `C-finding-lifecycle`, and `C-review-effort-budget`, run the two-phase review. **During a wave**, only an open BLOCKER finding gates progress; IMPORTANT and MINOR findings stay open. **After the last wave**, convergence queries every open `pasture:finding` across all waves and targets **0\u002F0\u002F0** within the gate declaration's `maxRounds`. Iterate **review → fix → re-review** up to the **review-effort budget chosen at Phase 8** (defaults: 3 rounds \u002F 1 round \u002F 0 rounds \u002F unlimited \u002F custom). The close rule is owned by `C-finding-lifecycle`. On **budget exhaustion without convergence**, SURFACE the outstanding findings to the user at a gate for a decision — do not proceed dirty and do not loop forever. The budget is never hardcoded.\n\n## Follow-up Epic\n\nThe FOLLOWUP epic is **not** created from review findings. Open review findings converge at the end; their close rule is `C-finding-lifecycle` (R7\u002FA1). The FOLLOWUP epic is fed ONLY by **user-DEFER'd UAT items** (Phase 11), and the Supervisor creates it from those (label `pasture:epic-followup`).\n\n## Reviewing a follow-up slice\n\nWhen reviewing follow-up slices, use the same procedure:\n- **Review task naming:** name the review for the follow-up slice, the axis, and the round\n- **Same EAGER severity tree** (BLOCKER\u002FIMPORTANT\u002FMINOR per wave, per axis, per round)\n- **Open findings converge at the end:** findings (BLOCKER\u002FIMPORTANT\u002FMINOR) in a FOLLOWUP_SLICE review also stay open past the wave gate and converge at the end — they are **never** re-routed to a follow-up epic (no followup-of-followup; the FOLLOWUP epic is fed only by user-DEFER'd UAT items)\n- The worker's completion handoff (h4) reports which DEFER'd-item leaf tasks were resolved — verify these during review\n\n## Report Results\n\n```bash\n# Add vote comment to the review task\n\"${EPOCH_REC}\" note \"${REVIEW_ID_URI}\" --author pasture-system\u002F00000000-0000-0000-0000-000000000000 --body \"VOTE: ACCEPT - Implementation matches plan, tests comprehensive\"\n\n# Or\n\"${EPOCH_REC}\" note \"${REVIEW_ID_URI}\" --author pasture-system\u002F00000000-0000-0000-0000-000000000000 --body \"VOTE: REVISE - BLOCKERs found, see severity tree for details\"\n```\n\u003C!-- END GENERATED FROM pasture schema -->\n","# Review Code Implementation\n\n\u003C!-- BEGIN GENERATED FROM pasture schema -->\n\u003C!-- GENERATED FROM pasture v0.0.33 artifact v1 -->\n**Command:** `pasture:reviewer:review-code` — Review implementation slices with EAGER severity tree\n\n**-> [Full workflow in PROCESS.md](..\u002Fprotocol\u002FPROCESS.md#phase-10-code-review)** \u003C- Phase 10\n\n**[rev-code-quality-gates]**\n- Given: code assignment\n- When: reviewing\n- Then: apply end-user alignment criteria and verify production code paths\n- Should not: approve without running quality gates\n\n**[rev-code-verify-gates]**\n- Given: implementation\n- When: verifying\n- Then: run the project's quality gates\n- Should not: approve without passing checks\n\n**[rev-code-eager-severity]**\n- Given: issues found\n- When: categorizing\n- Then: use BLOCKER\u002FIMPORTANT\u002FMINOR severity with EAGER group creation\n- Should not: skip creating empty severity groups\n\n**[frag--sup-blocker-dual-parent]**\n- Given: BLOCKER finding\n- When: wiring dependencies\n- Then: add dual-parent: blocks BOTH the severity group AND the slice\n- Should not: wire BLOCKER to only one parent\n\n**[frag--review-clean-exit]**\n- Given: per-wave code review and end-of-epoch convergence\n- When: evaluating review results\n- Then: iterate review -> fix -> re-review up to the chosen review-effort budget; during a wave only an open BLOCKER finding gates progress, while IMPORTANT and MINOR findings stay open; after the last wave, converge over open `pasture:finding` tasks across all waves toward 0\u002F0\u002F0 within maxRounds; a finding closes only per `C-finding-lifecycle`; on budget exhaustion without convergence, SURFACE the outstanding findings to the user at a gate for a decision\n- Should not: hardcode the budget; proceed past the chosen budget without surfacing outstanding findings to the user; require a zeroed round at a wave boundary; close a finding outside `C-finding-lifecycle`; loop forever when a finite budget was chosen\n\n**[frag--validation-cases]**\n- Given: any REQUEST (every request, not only fix-intent ones)\n- When: eliciting (URE), acceptance-testing (UAT), or implementing\n- Then: elicit concrete validation cases — a definition of done plus correct and incorrect behaviours (inputs\u002Fbehaviors that must pass or must fail), confirm the case set with the user in UAT, evaluate the implementation against them, and store failing real-data cases as test fixtures\n- Should not: ship without validation cases; treat validation cases as applying to fix-intent requests only; introduce a request-type axis or enum to gate them\n\n## Task Recovery\n\nThe tracker backend is recorded once in .agents.local\u002Fpasture\u002FEPOCH.md; read that file instead of re-probing. If EPOCH.md is absent, stop and ask the orchestrator to run detection.\n\nRecover from live tracker state at session start and after compaction; never trust cached task rows. Read the `rec:` path from the header and use it as the one entry point: `\"${EPOCH_REC}\" \u003Cop>`. The operation set is closed: create, label, block, note, show, query, ready, status, close, whoami, signal.\n\nStore selection: the adapter reads PASTURE_DB_PATH when set, otherwise the header's `db:`; the probe wrote that value from the same precedence (XDG_DATA_HOME\u002Fpasture\u002Fpasture.db, HOME\u002F.local\u002Fshare\u002Fpasture\u002Fpasture.db, then .pasture\u002Fpasture.db). Use the same selected store for every command. If a recovery query fails, report its actual store path, failed operation, impact, and permission\u002Fschema\u002Fconfiguration repair; failure is not an empty work queue.\n\nThe adapter passes `--namespace` only when EPOCH.md records `namespace:`. That pin wins on both backends. Otherwise it omits the flag. Pasture then derives the namespace itself: PASTURE_NAMESPACE, else the git remote, then file:\u002F\u002F of the working directory. The ledger calls derive_namespace for the header and for every write that has no pin. That function is the one list of remote forms; do not restate it. With no origin, both backends use file:\u002F\u002F of the working directory, so invocations from different subdirectories use different namespaces. Queries without a pin follow that backend's derivation; pass `--all-namespaces` to opt out. When neither a pin nor PASTURE_NAMESPACE is set, pasture reads are unscoped and creation falls back to the git remote, then file:\u002F\u002F of the working directory. Inspect the returned full URI before choosing repository work. Separate reads are not an atomic snapshot.\n\nRun `\"${EPOCH_REC}\" ready`, `\"${EPOCH_REC}\" query --blocked`, and `\"${EPOCH_REC}\" query --status in_progress`. For each referenced active task, run `\"${EPOCH_REC}\" show \"$TASK_URI\"`, `\"${EPOCH_REC}\" show \"$TASK_URI\" --notes`, and `\"${EPOCH_REC}\" show \"$TASK_URI\" --history`. All *_URI variables in examples are inputs bound to full task URIs from an assignment, a verified tracker read, or the URI create printed; never use legacy short IDs. Resolve each variable before execution and quote it as one operand.\n\nCreate prints the new task URI directly. Persist it before any label or note: create-plus-label is non-atomic, so on failure retain the URI and retry only the failed label\u002Fnote operation, never create again. Only open, in_progress, and closed are statuses; blockage is represented by live dependencies and notes, not a blocked status.\n\nAn owner is recorded with `\"${EPOCH_REC}\" label \"$TASK_URI\" owner:\u003Crole>`. That is a claim, not an allocation: an unassigned task stays unassigned until the supervisor allocates it, and repeating an identical claim is not allocation. Never invent an owner.\n\nParent stays open and is blocked by child: `\"${EPOCH_REC}\" block \"$PARENT_URI\" --by \"$CHILD_URI\"`. Reference documents belong in description frontmatter under references:, never fabricated blockers. Workers report evidence and handoffs without closing their slices or leaves; the supervisor closes only after independent review and satisfied gates. Use git agent-commit for local commits. Never install, enable, or modify Git hooks, Git hook path configuration, or pre-commit integration without explicit user approval. Tracker writes are durable; Git history lands separately.\n\nIf the header records `backend: error`, stop before the first mutation: the store exists but cannot be used, and falling back could lose earlier epochs. A mid-epoch write failure retries 3 times. After the third failure, write the attempted record to .agents.local\u002Fpasture\u002Fpending\u002F\u003Ctimestamp>-\u003Cop>.md, keep the recorded backend, and surface the pending record to the user at the next gate. Never switch backends and never drop the record.\n\n## Task Attribution\n\nSelect the current registered author with \"${EPOCH_REC}\" whoami. It prints the author recorded in the header or PASTURE_AUTHOR, and on the pasture backend it confirms that actor with agents show. It does not list agents and it does not invent one. If neither source names an author, it stops: set author: in EPOCH.md or export PASTURE_AUTHOR. Never auto-register or guess an identity during recovery. Every note supplies --author explicitly; machine examples use the pre-registered pasture-system\u002F00000000-0000-0000-0000-000000000000 actor. If it is absent, stop and request registration from the operator rather than claiming registration is fixed. Preserve human intent verbatim and quote historical attribution as evidence, not as a forged new author.\n\n## When to Use\n\nAssigned to review code implementation after worker slices complete (Phase 10).\n\n## Severity Tree: EAGER Creation\n\nFirst bind REVIEW_ID_URI using Step 4: Create Review Task below; then **ALWAYS create 3 severity group tasks per wave, per axis, per round**, even if some groups have no findings:\n\n### Step 1: Create All 3 Severity Groups Immediately\n\n```bash\n# One severity trio per wave, per axis, per round — not one per slice.\n# Wave 1 contains the first slice, the second slice, and the third slice.\n# Step 1: Create all 3 severity groups immediately (EAGER, not lazy)\nBLOCKER_GROUP_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"WAVE-{W}-REVIEW-{axis}-{round} BLOCKER\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slices:\n    - \\\"${SLICE_1_1_ID_URI}\\\"\n    - \\\"${SLICE_1_2_ID_URI}\\\"\n    - \\\"${SLICE_1_3_ID_URI}\\\"\n  review: \\\"${REVIEW_ID_URI}\\\"\n---\nBLOCKER findings for this wave review round\")\n\"${EPOCH_REC}\" label \"$BLOCKER_GROUP_ID_URI\" pasture:severity:blocker\n\nIMPORTANT_GROUP_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"WAVE-{W}-REVIEW-{axis}-{round} IMPORTANT\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slices:\n    - \\\"${SLICE_1_1_ID_URI}\\\"\n    - \\\"${SLICE_1_2_ID_URI}\\\"\n    - \\\"${SLICE_1_3_ID_URI}\\\"\n  review: \\\"${REVIEW_ID_URI}\\\"\n---\nIMPORTANT findings for this wave review round\")\n\"${EPOCH_REC}\" label \"$IMPORTANT_GROUP_ID_URI\" pasture:severity:important\n\nMINOR_GROUP_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"WAVE-{W}-REVIEW-{axis}-{round} MINOR\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slices:\n    - \\\"${SLICE_1_1_ID_URI}\\\"\n    - \\\"${SLICE_1_2_ID_URI}\\\"\n    - \\\"${SLICE_1_3_ID_URI}\\\"\n  review: \\\"${REVIEW_ID_URI}\\\"\n---\nMINOR findings for this wave review round\")\n\"${EPOCH_REC}\" label \"$MINOR_GROUP_ID_URI\" pasture:severity:minor\n\n# Step 2: Wire the one severity trio to the wave's review task\n\"${EPOCH_REC}\" block \"${REVIEW_ID_URI}\" --by \"${BLOCKER_GROUP_ID_URI}\"\n\"${EPOCH_REC}\" block \"${REVIEW_ID_URI}\" --by \"${IMPORTANT_GROUP_ID_URI}\"\n\"${EPOCH_REC}\" block \"${REVIEW_ID_URI}\" --by \"${MINOR_GROUP_ID_URI}\"\n```\n\n### Adding Findings to Severity Groups\n\n```bash\n# Each finding carries slice: and wave: in references.\n# BLOCKER finding — dual-parent relationship\nBLOCKER_FINDING_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"BLOCKER: \u003Cfinding title>\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slice: \\\"${SLICE_1_1_ID_URI}\\\"\n  reviewer: reviewer-A\n  round: 1\n---\n\u003Cfinding details with file:line references>\")\n\"${EPOCH_REC}\" label \"${BLOCKER_FINDING_ID_URI}\" pasture:finding\n\"${EPOCH_REC}\" block \"${BLOCKER_GROUP_ID_URI}\" --by \"${BLOCKER_FINDING_ID_URI}\"\n\"${EPOCH_REC}\" block \"${SLICE_1_1_ID_URI}\" --by \"${BLOCKER_FINDING_ID_URI}\"\n\n# IMPORTANT finding — single parent (severity group only)\nIMPORTANT_FINDING_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"IMPORTANT: \u003Cfinding title>\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slice: \\\"${SLICE_1_2_ID_URI}\\\"\n  reviewer: reviewer-A\n  round: 1\n---\n\u003Cfinding details>\")\n\"${EPOCH_REC}\" label \"${IMPORTANT_FINDING_ID_URI}\" pasture:finding\n\"${EPOCH_REC}\" block \"${IMPORTANT_GROUP_ID_URI}\" --by \"${IMPORTANT_FINDING_ID_URI}\"\n\n# MINOR finding — single parent (severity group only)\nMINOR_FINDING_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"MINOR: \u003Cfinding title>\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slice: \\\"${SLICE_1_3_ID_URI}\\\"\n  reviewer: reviewer-A\n  round: 1\n---\n\u003Cfinding details>\")\n\"${EPOCH_REC}\" label \"${MINOR_FINDING_ID_URI}\" pasture:finding\n\"${EPOCH_REC}\" block \"${MINOR_GROUP_ID_URI}\" --by \"${MINOR_FINDING_ID_URI}\"\n```\n\n### Closing Empty Groups\n\nEmpty severity groups (no findings) are closed immediately:\n\n```bash\n# If no IMPORTANT findings were found:\n\"${EPOCH_REC}\" close \"${IMPORTANT_GROUP_ID_URI}\"\n\n# If no MINOR findings were found:\n\"${EPOCH_REC}\" close \"${MINOR_GROUP_ID_URI}\"\n```\n\n### Dual-Parent BLOCKER Relationship\n\nBLOCKER findings have **two parents**:\n1. The severity group task (`pasture:severity:blocker`) — for categorization\n2. The slice they block — for dependency tracking\n\nThis ensures BLOCKERs both categorize under the severity tree AND block the slice they apply to.\n\nIMPORTANT and MINOR findings do **NOT** block the slice via dual-parent (only BLOCKER does), and they are **not** routed to a follow-up epic: they stay open past the wave gate and converge at the end, where the convergence rule reads open pasture:finding tasks across all waves (R7\u002FA1). The FOLLOWUP epic is fed ONLY by user-DEFER'd UAT items, never by any review severity.\n\n## Steps\n\n\n\n### Step 1: Read Code Changes and URD\n\n```bash\n\"${EPOCH_REC}\" show \"${SLICE_ID_URI}\"\n\"${EPOCH_REC}\" show \"${URD_ID_URI}\"   # Read URD for requirements context\n```\n\n### Step 2: Run Quality Gates\n\n```bash\n# Run your project's type checking and test commands\n```\n\n### Step 3: Apply Review Criteria and Verify Production Code Paths\n\nApply end-user alignment criteria (see `pasture:reviewer`) and verify production code paths (see Verify Production Code Paths section below).\n\n### Step 4: Create Review Task\n\n```bash\nREVIEW_ID_URI=$(\"${EPOCH_REC}\" create --kind task --title \"Review: \u003Cfeature>\" --phase code_review \\\n  --body \"---\nreferences:\n  wave: 1\n  slices:\n    - \\\"${SLICE_1_1_ID_URI}\\\"\n    - \\\"${SLICE_1_2_ID_URI}\\\"\n    - \\\"${SLICE_1_3_ID_URI}\\\"\n  urd: \\\"${URD_ID_URI}\\\"\n---\nVOTE: \u003CACCEPT|REVISE> - \u003Cjustification>\")\n# One review covers the whole wave, so wire every slice in the wave to it.\n\"${EPOCH_REC}\" block \"${SLICE_1_1_ID_URI}\" --by \"${REVIEW_ID_URI}\"\n\"${EPOCH_REC}\" block \"${SLICE_1_2_ID_URI}\" --by \"${REVIEW_ID_URI}\"\n\"${EPOCH_REC}\" block \"${SLICE_1_3_ID_URI}\" --by \"${REVIEW_ID_URI}\"\n```\n\n### Steps 5–8: Severity Tree and Vote\n\n5. Create severity tree (EAGER — all 3 groups immediately)\n6. Add findings to appropriate severity groups\n7. Close empty severity groups\n8. Cast vote via `\"${EPOCH_REC}\" note`\n\n## Verify Production Code Paths\n\n\n\n### Check for Dual-Export Anti-Pattern\n\n**Anti-pattern example:**\n```go\n\u002F\u002F WRONG: Test-only export\nfunc HandleCommand(argv []string, service Service) error { \u002F* tested *\u002F }\n\n\u002F\u002F WRONG: Production-only command (not tested)\nvar commandCmd = &cobra.Command{\n    Use: \"command\",\n    RunE: func(cmd *cobra.Command, args []string) error {\n        \u002F\u002F TODO: wire up service\n        return nil\n    },\n}\n```\n\n**Correct example:**\n```go\n\u002F\u002F CORRECT: Single command, both tested and used in production\nvar commandCmd = &cobra.Command{\n    Use: \"command\",\n    RunE: func(cmd *cobra.Command, args []string) error {\n        service := NewService(RealDeps{})\n        result, err := service.DoThing(args)\n        if err != nil {\n            return err\n        }\n        fmt.Println(result)\n        return nil\n    },\n}\n\n\u002F\u002F Tests import commandCmd directly\n\u002F\u002F import \"myproject\u002Fcmd\u002Fthing\"\n```\n\n### Verify No TODO Placeholders\n\n```bash\ngrep -r \"TODO\" src\u002F  # Should not find any in delivered code\n```\n\n### Check Tests Import Production Code\n\n- Test file should import the actual CLI command or API endpoint\n- Not a separate test harness function\n- No TODOs in CLI\u002FAPI actions\n- Real dependencies wired (not mocks in production code)\n\n### Verify Validation Cases (R6)\n\nFor **every** REQUEST (not only fix-intent ones), per [frag--validation-cases] verify the implementation:\n- Carries **test fixtures** for the concrete validation cases captured in URE\u002FUAT (the definition of done plus the correct\u002Fincorrect behaviours that must pass or must fail).\n- Evaluates the implementation against each confirmed validation case.\n\nAn implementation that ships without validation-case fixtures is an IMPORTANT finding. There is **no** request-type axis\u002Fenum gating this — recognize what a request needs from the REQUEST\u002FURD.\n\n## Two-Phase Review (within the chosen review-effort budget)\n\nPer [frag--review-clean-exit], `C-finding-lifecycle`, and `C-review-effort-budget`, run the two-phase review. **During a wave**, only an open BLOCKER finding gates progress; IMPORTANT and MINOR findings stay open. **After the last wave**, convergence queries every open `pasture:finding` across all waves and targets **0\u002F0\u002F0** within the gate declaration's `maxRounds`. Iterate **review → fix → re-review** up to the **review-effort budget chosen at Phase 8** (defaults: 3 rounds \u002F 1 round \u002F 0 rounds \u002F unlimited \u002F custom). The close rule is owned by `C-finding-lifecycle`. On **budget exhaustion without convergence**, SURFACE the outstanding findings to the user at a gate for a decision — do not proceed dirty and do not loop forever. The budget is never hardcoded.\n\n## Follow-up Epic\n\nThe FOLLOWUP epic is **not** created from review findings. Open review findings converge at the end; their close rule is `C-finding-lifecycle` (R7\u002FA1). The FOLLOWUP epic is fed ONLY by **user-DEFER'd UAT items** (Phase 11), and the Supervisor creates it from those (label `pasture:epic-followup`).\n\n## Reviewing a follow-up slice\n\nWhen reviewing follow-up slices, use the same procedure:\n- **Review task naming:** name the review for the follow-up slice, the axis, and the round\n- **Same EAGER severity tree** (BLOCKER\u002FIMPORTANT\u002FMINOR per wave, per axis, per round)\n- **Open findings converge at the end:** findings (BLOCKER\u002FIMPORTANT\u002FMINOR) in a FOLLOWUP_SLICE review also stay open past the wave gate and converge at the end — they are **never** re-routed to a follow-up epic (no followup-of-followup; the FOLLOWUP epic is fed only by user-DEFER'd UAT items)\n- The worker's completion handoff (h4) reports which DEFER'd-item leaf tasks were resolved — verify these during review\n\n## Report Results\n\n```bash\n# Add vote comment to the review task\n\"${EPOCH_REC}\" note \"${REVIEW_ID_URI}\" --author pasture-system\u002F00000000-0000-0000-0000-000000000000 --body \"VOTE: ACCEPT - Implementation matches plan, tests comprehensive\"\n\n# Or\n\"${EPOCH_REC}\" note \"${REVIEW_ID_URI}\" --author pasture-system\u002F00000000-0000-0000-0000-000000000000 --body \"VOTE: REVISE - BLOCKERs found, see severity tree for details\"\n```\n\u003C!-- END GENERATED FROM pasture schema -->\n",{"name":5,"description":7},"main","5813de22110ddc609b465a982b4811646ff72d18","skills\u002Freviewer-review-code",0,"https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Fpasture","https:\u002F\u002Fgithub.com\u002Fdayvidpham","dhpham.com","2026-11-11 16:48:48",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add dayvidpham\u002Fpasture --skill reviewer-review-code",{"tool":53,"command":54},"bunx","bunx skills add dayvidpham\u002Fpasture --skill reviewer-review-code",{"tool":56,"command":57},"pnpm","pnpm dlx skills add dayvidpham\u002Fpasture --skill reviewer-review-code","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Fpasture\u002Fblob\u002Fmain\u002Fskills\u002Freviewer-review-code\u002FSKILL.md",true,[],[62,70,85,95,107,118],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":68,"publishedAt":34},"01M6DAP7307B3JVZX5DSNAE08Y","fixture","Isolated fixture skill","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Fpasture\u002Fblob\u002Fmain\u002Ftestdata\u002Finstall\u002Fglobal\u002Fclaude-code\u002Fnative-marketplace\u002Ffixture-plugin\u002Fskills\u002Ffixture\u002FSKILL.md",[],[64,69],"fixture skill",{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":34},"01M6DAP48A4K365N83NBG0GFVC","worker","Vertical slice implementer (full production code path)","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Fpasture\u002Fblob\u002Fmain\u002Fskills\u002Fworker\u002FSKILL.md",[],[72,77,24,78,79,80,81,82,83,84],"implementer","implement","Production","full","complete","vertical slice","slice","path",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":34},"01M6DAP18QJM7P7N31TYGNJBCP","worker-implement","Implement assigned vertical slice following TDD layers","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Fpasture\u002Fblob\u002Fmain\u002Fskills\u002Fworker-implement\u002FSKILL.md",[],[92,72,78,82,93,83,94],"worker implement","layers","tdd",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":34},"01M6DANYHC7P63RFEN26F70MC2","worker-complete","Signal slice completion after quality gates pass","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Fpasture\u002Fblob\u002Fmain\u002Fskills\u002Fworker-complete\u002FSKILL.md",[],[72,102,81,103,83,104,105,106],"worker complete","signal","gates","quality","quality gates",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":34},"01M6DANWZ31TRP4NN4T1BFYKSR","worker-blocked","Report a blocker to supervisor via Pasture","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Fpasture\u002Fblob\u002Fmain\u002Fskills\u002Fworker-blocked\u002FSKILL.md",[],[114,72,115,116,117],"worker blocked","via","report","supervisor",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":129,"publishedAt":34},"01M6DANSVDBXBFH93B6EX3H2QK","user-uat","User Acceptance Testing with demonstrative examples","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Fpasture\u002Fblob\u002Fmain\u002Fskills\u002Fuser-uat\u002FSKILL.md",[124],{"categoryNo":125,"categoryName":126,"taxonomyType":127,"taxonomyTypeDesc":128},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[130,131,132,133,33,134,135,136,137],"uat","user uat","user","acceptance testing","user acceptance testing","examples","acceptance","testing"]