.github/skills/tsh-task-quality-reviewing/SKILL.md
Analyze extracted epics and user stories for quality gaps, missing edge cases, and improvement opportunities. Runs domain-agnostic analysis passes, optionally enriches findings with Jira board context, and produces accept/reject suggestions that refine the task list before Jira formatting.
npx skillsauth add thesoftwarehouse/copilot-collections tsh-task-quality-reviewingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill performs a systematic quality analysis on an approved task list (epics and user stories) to identify gaps, missing edge cases, and improvement opportunities. It runs 10 domain-agnostic analysis passes, optionally enriches findings with existing Jira board context, and produces a structured list of suggestions the user can individually accept or reject.
The output is a quality review report documenting all suggestions, their dispositions, and any changes applied to the task list.
quality-review.md)extracted-tasks.md in-placeUse the checklist below and track your progress:
Quality review progress:
- [ ] Step 1: Load inputs and establish context
- [ ] Step 2: Gather Jira board context (optional)
- [ ] Step 3: Build domain model from the task list
- [ ] Step 4: Run analysis passes
- [ ] Step 5: Enrich with domain research
- [ ] Step 6: Classify and structure suggestions
- [ ] Step 7: Present suggestions for user review
- [ ] Step 8: Apply accepted suggestions
- [ ] Step 9: Save quality review report
Step 1: Load inputs and establish context
Collect and review all available materials:
extracted-tasks.md (mandatory): The Gate 1-approved epic and story list. This is the primary input.cleaned-transcript.md (if available): Cross-reference for details that may have been lost or simplified during task extraction.Build a complete picture of the project scope, actors, and features before proceeding to analysis.
Step 2: Gather Jira board context (optional)
If Atlassian tools are available and the user has indicated a Jira project (either in their initial message or during the workflow):
List accessible Resources.This enrichment is entirely optional. The skill works identically without Jira access. Do not block the review process if Jira is unavailable or the user declines.
Step 3: Build domain model from the task list
Before running analysis passes, construct a lightweight domain model from the extracted tasks. This model is the foundation for systematic gap detection.
Identify and document:
Actors — Every distinct role mentioned across all stories:
| Actor | Epics Involved | Key Capabilities | |---|---|---| | <role name> | <epic numbers> | <what this actor can do> |
Entities — Every distinct business object or concept managed by the system:
| Entity | Created In | Read In | Updated In | Deactivated/Deleted In | |---|---|---|---|---| | <entity name> | <story ref or "—"> | <story ref or "—"> | <story ref or "—"> | <story ref or "—"> |
Relationships — How entities relate to each other and which features depend on which entities being in a valid state.
This model is derived entirely from the task list content. It is not a technical data model — it is a business-oriented map of what the system manages and who interacts with it.
Step 4: Run analysis passes
Protected Status Filter: Before running analysis passes, filter out all tasks (epics and stories) whose Status field is Done, Cancelled, or PO APPROVE. These tasks are considered immutable and must not generate findings or suggestions. They may still be referenced as dependencies by other tasks, but they themselves are excluded from all analysis.
Execute each of the following analysis passes against the domain model and task list. Each pass is independent and produces zero or more findings. A finding is a potential gap or improvement that will become a suggestion.
Pass A: Entity Lifecycle Completeness
For each entity identified in the domain model, verify that its full lifecycle is covered:
A finding is generated when any lifecycle operation is missing for an entity that logically requires it.
Example patterns: A system manages "locations" but has no story for editing or deleting a location. A system creates "promotions" but has no story for viewing promotion history.
Pass B: Cross-Feature State Validation
When one feature consumes an entity that is managed by another feature, verify that the consuming feature validates the entity's readiness state.
For each dependency in the task list:
A finding is generated when a feature uses an entity from another feature without validating its state.
Example patterns: A public-facing page displays data from an entity that could be deactivated — the page should handle the "inactive" case. A workflow depends on a user completing a verification step — the workflow should block or show a message if verification is incomplete.
Pass C: Bulk Operation Idempotency
For any story that involves bulk or batch operations (imports, mass updates, batch processing):
A finding is generated when a bulk operation does not account for pre-existing data or partial failure scenarios.
Example patterns: A CSV import creates new records but does not specify what happens when a record with the same identifier already exists. A batch invitation does not clarify whether already-registered users are skipped or re-invited.
Pass D: Actor Dashboard Completeness
For every actor that has a management interface (dashboard, panel, admin area):
A finding is generated when an actor has a dashboard but is missing one of these three dimensions.
Example patterns: An employer can manage workers and locations but has no way to see tipping statistics or activity trends. A worker can view recent transactions but has no summary or aggregate view.
Pass E: Precondition Guards
When one feature enables or unlocks another feature, verify that:
A finding is generated when a feature dependency exists but the precondition is not explicitly guarded in the stories.
Example patterns: A feature generates a QR code for a worker, but the worker has not completed identity verification — the QR code should not be generated or displayed until verification is done. A feature requires a paid plan, but no story covers what the user sees if they are on the free plan.
Pass F: Third-Party Boundary Clarity
For every story that involves an external system, service, or third-party provider:
A finding is generated when a story references a third-party system but does not clearly delineate the boundary or address failure scenarios.
Example patterns: A story says "verification is handled by the payment processor" but does not specify what the system does when verification fails or times out. A story integrates with an e-commerce platform but does not clarify whether the integration is embedded, linked, or API-based.
Pass G: Platform Operations Perspective
Verify whether the task list includes any management, monitoring, or administrative capability for the platform operators themselves (not the end users):
A finding is generated when no epic or story addresses the platform operator perspective. This is a common gap — workshop discussions typically focus on end-user features and overlook internal tooling.
Example patterns: A marketplace platform has stories for buyers and sellers but none for the marketplace operators. A subscription service has stories for subscribers but none for the billing team to manage accounts.
Pass H: Error State and Edge Case Coverage
For each story that describes a happy-path user flow:
A finding is generated when a story describes only the success path and does not address failure, empty, or boundary states either as acceptance criteria or as separate stories.
Example patterns: A story covers "user can view transaction history" but does not specify what appears when there are no transactions yet. A story covers "user can submit payment" but does not specify what happens on insufficient funds or expired card.
Pass I: Notification and Communication Gaps
For each state change that affects an actor other than the one performing the action:
A finding is generated when a state change impacts another actor but no notification is mentioned in any story.
Example patterns: An employer deactivates a worker, but there is no story for notifying the worker. A system processes a payout, but the worker is not notified when funds arrive. An account status changes, but the account holder is not informed.
Pass J: Domain-Specific Research
Based on the project's domain (identified from the extracted tasks and source materials):
Use available research tools (context7, documentation search) to find relevant industry patterns. Flag findings with Medium or Low confidence since they are based on external research rather than explicit workshop discussion.
A finding is generated when external research reveals a common domain pattern or requirement that is not covered in the task list.
Example patterns: A financial application does not include audit logging, which is a regulatory expectation. A healthcare application does not address data retention policies. An e-commerce application does not cover order cancellation or refund flows.
Step 5: Enrich with domain research
If domain-specific research tools are available (context7, web search):
If no research tools are available, rely solely on the other nine passes.
Step 6: Classify and structure suggestions
Transform each finding from the analysis passes into a structured suggestion:
Assign a confidence level based on the source:
Determine the action type:
ADD_ACCEPTANCE_CRITERION: The gap is about a missing condition in an existing story. The story's scope does not change, but a new verifiable criterion is added.MODIFY_STORY: The gap requires expanding an existing story's scope (adding requirements or changing the description).ADD_TECHNICAL_NOTE: The gap is about clarity or documentation, not functional scope. A note is added to an existing story.NEW_STORY: The gap represents entirely new functionality that does not fit in any existing story.NEW_EPIC: The gap represents a new capability area that warrants its own epic (rare — typically only for platform operations or major compliance requirements).Write the proposed change: Draft the exact text to be added or modified. For new stories, follow the format established in extracted-tasks.md. For acceptance criteria, follow the checklist format. This ensures that accepting a suggestion immediately produces valid task list content.
Deduplicate: If multiple passes produce findings that overlap, merge them into a single suggestion and note all contributing categories.
Enrich with Jira context (if available from Step 2): Cross-reference each suggestion with existing Jira issues. If a suggestion duplicates or overlaps with an existing issue, note the Jira issue key and adjust the suggestion (e.g., "This is already tracked as PROJ-123 — consider linking rather than creating a new story").
Step 7: Present suggestions for user review
Protected Status Safety Net: Before presenting suggestions, verify that no suggestion targets a task with a protected status (Done, Cancelled, or PO APPROVE). If any such suggestion exists, drop it silently — it should not have been generated (see Step 4 guard), but this acts as a defensive safety net.
Present all suggestions to the user for individual accept/reject decisions:
Order suggestions: Order by epic, then by confidence within each epic (High first, then Medium, then Low). If a suggestion proposes a new epic, present it after all existing-epic suggestions.
One suggestion per popup: Present exactly one suggestion per askQuestions call. Each popup must be self-contained — the user should be able to make a decision without needing context from a previous popup. For each suggestion, show:
Iterate: Continue until all suggestions have been decided. The user may also provide feedback that modifies a suggestion before accepting it.
Record decisions: Track which suggestions were accepted and which were rejected (with any stated reason).
Step 8: Apply accepted suggestions
Protected Status Final Guard: Before applying any accepted suggestion, re-check the target task's Status field. If the status is Done, Cancelled, or PO APPROVE, do not apply the change. Log it in the quality review report as "Skipped — task has protected status".
For each accepted suggestion, apply the proposed change to extracted-tasks.md:
ADD_ACCEPTANCE_CRITERION: Add the new criterion to the specified story's acceptance criteria list.MODIFY_STORY: Update the story's description, requirements, or scope as proposed.ADD_TECHNICAL_NOTE: Append the note to the specified story's technical notes section.NEW_STORY: Add the new story under the appropriate epic, following the existing numbering convention (e.g., if Epic 2 has stories 2.1-2.7, a new story becomes 2.8).NEW_EPIC: Add the new epic at the end of the document with the proposed stories, update the Epics Overview table, and update the Dependencies section if applicable.After applying all changes, update the Workshop Summary table in extracted-tasks.md (total stories count, total epics count) to reflect the additions.
Step 9: Save quality review report
Generate the final quality review report following the ./quality-review.example.md template.
Save the file to specifications/<workshop-name>/quality-review.md.
The report serves as an audit trail documenting:
extracted-tasks.md| Pass | Category | Confidence Default | Typical Action | |---|---|---|---| | A | Entity Lifecycle Completeness | High | NEW_STORY or MODIFY_STORY | | B | Cross-Feature State Validation | High | ADD_ACCEPTANCE_CRITERION or MODIFY_STORY | | C | Bulk Operation Idempotency | High | ADD_ACCEPTANCE_CRITERION or MODIFY_STORY | | D | Actor Dashboard Completeness | Medium | NEW_STORY | | E | Precondition Guards | High | ADD_ACCEPTANCE_CRITERION or MODIFY_STORY | | F | Third-Party Boundary Clarity | Medium | ADD_TECHNICAL_NOTE or MODIFY_STORY | | G | Platform Operations Perspective | Medium | NEW_EPIC or NEW_STORY | | H | Error State & Edge Case Coverage | High | ADD_ACCEPTANCE_CRITERION | | I | Notification & Communication Gaps | High | NEW_STORY or ADD_ACCEPTANCE_CRITERION | | J | Domain-Specific Research | Low–Medium | Varies |
tsh-task-extracting — provides the extracted tasks used as primary input for the quality reviewtsh-jira-task-formatting — consumes the updated task list after quality review suggestions are applieddevelopment
Custom hook and composable patterns — naming, composition, stable return shapes, lifecycle cleanup, and testing strategies. Use when writing reusable logic units (React hooks, Vue composables), refactoring logic into hooks, debugging hook behavior, or reviewing hook implementations.
testing
UI verification criteria, structure checklists, severity definitions, and tolerance rules for comparing implementations against Figma designs. Use for verifying UI matches design, understanding what to check, and determining acceptable differences.
development
Clean raw workshop or meeting transcripts from small talk, filler words, and off-topic tangents. Extract and structure business-relevant content into a standardized format with discussion topics, key decisions, action items, and open questions.
development
Discover and establish technical context before implementing any feature. Prioritize project instructions, existing codebase patterns, and external documentation in that order. Use for any task requiring understanding of project conventions, coding standards, architecture patterns, and established practices before writing code.