Review: Upgrade story: label to hard-block + Task type routing

review-395-2026-03-26 Review

review needs-refinement

Verdict: NEEDS_REFINEMENT

Template Completeness

Original issue body (Forgejo #167):
  • [x] Type (Feature)
  • [x] Lineage (standalone -- discovered during kanban dogfooding session 2026-03-26)
  • [x] Repo (forgejo_admin/claude-custom)
  • [x] User Story
  • [x] Context
  • [x] File Targets (with specific lines and before/after snippets)
  • [x] Acceptance Criteria
  • [x] Test Expectations
  • [x] Constraints
  • [x] Checklist
  • [x] Related
Scope addition comment (Task type routing):
  • [x] Additional File Target specified
  • [x] Updated Acceptance Criteria appended
  • [ ] Missing: no Constraints section for the scope addition (minor -- inherited from parent)
Template conformance is strong. All required sections present.

File Targets

  • [x] hooks/check-board-item.sh lines 48-51 -- VERIFIED. Lines 48-51 contain exactly the warning pattern described: WARNINGS="${WARNINGS:+${WARNINGS} }Consider adding a 'story:' label...". The code at lines 48-51 matches the ticket's "Current" snippet precisely.
  • [x] hooks/check-issue-template.sh lines 33-38 -- VERIFIED. The case statement at lines 33-37 handles Bug, Spike, Nit-Bundle, and * (default to feature). No Task branch exists. Task falls through to template-issue-feature as described.
  • [x] template-issue-task note exists in pal-e-docs -- VERIFIED. The note exists (id: 721, status: active) with a valid <pre><code> block containing required headings: ### Type, ### Scope, ### Acceptance Criteria, ### Related. The template is ready to be consumed by the hook.

Repo Placement

OK. Both file targets live in forgejo_admin/claude-custom, which matches the Repo field. Single-repo change.

Dependencies

  • template-issue-task must exist before the hook change ships. Verified: it already exists in pal-e-docs (slug: template-issue-task, id: 721). No blocker.
  • Board item #377 (claude-custom #166) is a convention item in todo with arch:enforcement -- related but not blocking.
  • Board item #396 (claude-custom #168) "Remove plan/phase hooks from enforcement layer" is in todo with arch:enforcement -- related cleanup, not blocking.
  • No items currently in in_progress that would conflict with this ticket's file targets.

Acceptance Criteria

Original (check-board-item.sh story: upgrade):
  • [x] "create_board_item without story: label is DENIED" -- testable via manual hook invocation
  • [x] "Deny message includes explanation and pointer to template-ticket" -- testable by inspecting output
  • [x] "create_board_item WITH story: label still succeeds" -- testable
  • [x] "Existing board items unaffected" -- true by design (hook only fires on create_board_item)
Scope addition (check-issue-template.sh Task routing):
  • [x] "check-issue-template.sh recognizes ### Type: Task" -- testable
  • [x] "Task-type issues only require: ### Type, ### Scope, ### Acceptance Criteria, ### Related" -- testable against the template's pre block
  • [x] "Feature/Bug/Spike validation unchanged" -- testable as regression check
All criteria are agent-verifiable. No missing criteria detected.

Blast Radius

  • WARNING: session-start-context.sh (lines 558-561) lists Bug, Feature, and Spike types but NOT Task. After the hook change ships, agents will still not know they can use ### Type\nTask. This is a downstream documentation gap -- not a blocker for this ticket, but should be tracked as discovered scope.
  • WARNING: check-board-item.sh comment header (line 8) says "story: label (recommended -- warn, don't block)". This comment must be updated when the code changes from warn to deny. The ticket does not mention updating the comment. Minor, but an agent might miss it.
  • WARNING: Existing unlabeled board items. Several items on board-pal-e-agency have null labels or are missing story: labels (items #65, #63, #342, #347, and others). The hook change only affects new items, so these are not broken -- but they represent tech debt that will confuse audit. Board item #398 (claude-custom #170 "Board hygiene -- label unlabeled items") already tracks this.
  • No other hooks use the WARNINGS pattern -- this is the only warn-not-block in the codebase. No sibling bug.

Recommendation

Two items need refinement before READY:
  • Add to File Targets: The comment header at line 8 of check-board-item.sh must be updated from "recommended -- warn, don't block" to reflect the new deny behavior. Add this to the issue's File Targets so the implementing agent does not skip it.
  • Track discovered scope: session-start-context.sh lines 558-561 need a Task entry added (e.g. - Tasks: mcp__forgejo__create_issue with ### Type\nTask header. See template-issue-task.). This is a separate change (different hook, different concern). File as discovered scope or append to the scope addition comment.
Once item #1 is addressed in the issue body, verdict upgrades to READY. Item #2 is discovered scope, not a blocker.