Review: Right-side validation pipeline — /validate-ticket + flow fixes + merge hook

review-518-2026-03-28 Review

review needs-refinement

Verdict: NEEDS_REFINEMENT

Template Completeness

  • [x] Type — Feature
  • [x] Lineage — References companion #161 (closed)
  • [x] Repo — forgejo_admin/claude-custom
  • [x] User Story — Present, well-formed
  • [x] Context — Thorough, includes 5 enumerated gaps
  • [x] File Targets — Present with create/modify/not-touch sections
  • [x] Acceptance Criteria — 7 ACs + 3 test expectations
  • [x] Test Expectations — Manual tests defined
  • [x] Constraints — Present, includes migration dependency caveat
  • [x] Checklist — Present
  • [x] Related — Present with 6 references

Traceability

  • [x] story:pm-scope — Board item label present
  • [x] arch:hooks, arch:board-api — Board item labels present, both relevant
  • [x] Forgejo issue — forgejo_admin/claude-custom#209, open

File Targets

  • [x] ~/.claude/hooks/board-item-on-merge.sh — verified: exists, line 132 has {"column": "done"}, line 134 log says "done". Claim accurate.
  • [x] ~/.claude/skills/review-ticket/SKILL.md — verified: pattern file exists for reference
  • [x] ~/.claude/skills/validate-ticket/SKILL.md — confirmed does not exist yet (to create). Parent dir ~/.claude/skills/ exists.
  • [ ] skill-validate-ticket pal-e-docs note — ISSUE: Issue says "create" but this note ALREADY EXISTS (id: 841, status: active, project: pal-e-agency). AC 6 is pre-satisfied. File target should say "verify/update" not "create".
  • [x] sop-board-workflow block code-11 — verified stale: shows needs_approval → done with no validation. Column Semantics table correctly includes validation. Same SOP, contradictory content, exactly as described.
  • [x] agent-workflow block code-13 — verified stale: shows QA → done with no needs_approval or validation
  • [x] agent-workflow anchor the-flow (12-step list, block list-21) — verified: steps go Deploy (11) → Update (12) with no Validation step between them
  • [x] template-validation — confirmed exists and is complete. Not-touch designation correct.

Repo Placement

OK. Issue filed on forgejo_admin/claude-custom which owns the hooks and skills directories. Doc updates target pal-e-docs (separate system) but are executed via MCP tools from the same agent context. No repo mismatch.

Dependencies

  • [x] Companion #161 (left-side scope review pipeline) — CLOSED. No blocker.
  • [x] validation column in board schema — VERIFIED EXISTS. API accepts column=validation filter and returns empty list (not error). The constraint about alembic migration is already satisfied.
  • [x] template-validation — EXISTS and complete. No blocker.
  • [x] skill-validate-ticket note — ALREADY EXISTS (id: 841). Scope inaccuracy in issue (see File Targets).
  • [ ] Board item #519 (Validation-gate hook — block done without validation proof) — in backlog. Related to gap 4 in Context. Issue mentions gap 4 but does NOT include it in AC or Decomposition. Relationship is unclear — is it in scope or out of scope? Needs explicit statement.

Acceptance Criteria

  • AC 1-3 (doc fixes): Verifiable by reading pal-e-docs blocks via MCP after update. Specific block IDs given.
  • AC 4 (merge hook): Verifiable by reading line 132 of board-item-on-merge.sh after change.
  • AC 5 (validate-ticket skill): Verifiable by checking file existence at ~/.claude/skills/validate-ticket/SKILL.md.
  • AC 6 (skill-validate-ticket note): PRE-SATISFIED. Note already exists. Needs removal or rephrasing.
  • AC 7 (end-to-end): Integration-level test requiring actual merge + board observation. Manual only, not agent-automatable.
Assessment: 6 of 7 ACs are testable. AC 6 is already done and should be updated. AC 7 is manual integration.

Blast Radius

  • board-item-on-merge.sh: Changing "done" to "validation" affects ALL merged PRs across ALL boards. Any workflow assuming merge=done will break. Three additional references to "done" in the same file (lines 54, 89, 134 — log/fallback messages) should also be updated for consistency.
  • No other hooks move items to "done" on merge. Blast radius is contained to this one hook file.
  • check-board-advance.sh: Only enforces left-side gates (backlog→todo, todo→next_up). Does NOT enforce validation→done. Gap 4 is tracked separately as board item #519.
  • Settings.json: board-item-on-merge.sh already registered. No settings change needed for the hook fix.
  • Rollback: Straightforward — revert the one line in board-item-on-merge.sh.

Decomposition Assessment

NEEDS DECOMPOSITION. 7 AC across 3 systems (pal-e-docs blocks, shell hooks, skill files). Exceeds both the three-thing limit and five-minute rule.
The issue itself includes a well-structured decomposition recommendation for a 3-ticket split:
  • Doc fixes (AC 1-3) — 3 pal-e-docs block updates. ~5 min. Independent. Dottie can execute.
  • Merge hook fix (AC 4) — 1 shell file, ~4 line changes (line 132 + log/fallback references). ~5 min. Independent.
  • Validate-ticket skill (AC 5, 7) — Create SKILL.md routing file. ~10-15 min. Depends on ticket 1 (docs must describe the flow before the skill references them).
Tickets 1 and 2 are independent and can be dispatched in parallel. Ticket 3 depends on ticket 1. Recommend decomposition via template-board.

Recommendation

  • [BODY] Fix file target: skill-validate-ticket note should say "verify/update existing note" not "create" — note already exists (id: 841).
  • [BODY] Fix AC 6: Remove or rephrase to "skill-validate-ticket note verified current" — it is pre-satisfied.
  • [BODY] Fix blast radius gap: lines 54, 89, 134 of board-item-on-merge.sh also reference "done" in log/fallback messages — include those in file targets for the merge hook change.
  • [BODY] Clarify gap 4 (validation→done enforcement hook): listed in Context section but absent from AC and Decomposition. It is tracked separately as board item #519 — state this explicitly to prevent agent confusion about whether it is in or out of scope.
  • [DECOMPOSE] 7 AC across 3 systems, self-recommends 3-ticket split. Execute decomposition via template-board. Tickets 1+2 parallel, ticket 3 depends on ticket 1.