Overview
Purpose: Perform manual functional testing of Story Acceptance Criteria using curl (API) or puppeteer (UI).
Type: Linear Workflow (7 sequential phases)
Single Responsibility: ONLY performs manual testing and documents results - does NOT create tasks or change statuses.
Output: JSON verdict + Linear comment (Format v1.0) + temporary testing script for re-running tests.
graph TD
Start([START]) --> Phase1[Phase 1: Setup Environment
Detect Story type API/UI
Verify app running]
Phase1 --> Phase2[Phase 2: Load Story AC
Parse Given-When-Then
Extract 3-5 AC]
Phase2 --> Phase3[Phase 3: Test AC
curl for API / puppeteer for UI
Record PASS/FAIL results]
Phase3 --> Phase4[Phase 4: Test Edge Cases
Invalid inputs, boundaries
3-5 edge case scenarios]
Phase4 --> Phase5[Phase 5: Test Error Handling
400s, 500s, validation
Verify user-friendly messages]
Phase5 --> Phase6[Phase 6: Test Integration
Database, APIs, auth
2-3 integration points]
Phase6 --> Phase7[Phase 7: Document Results
Linear comment Format v1.0
Create temp script
Return JSON verdict]
Phase7 --> End([END:
JSON verdict + temp script])
classDef phase fill:#E3F2FD,stroke:#1976D2,stroke-width:2px
classDef endpoint fill:#C8E6C9,stroke:#388E3C,stroke-width:2px
class Phase1,Phase2,Phase3,Phase4,Phase5,Phase6,Phase7 phase
class Start,End endpoint
Phase Descriptions
Phase 1: Setup Environment
- Detect Story type from description/labels (API vs UI)
- Verify application is running (curl health endpoint or puppeteer navigate)
- Determine base URL (from .env or default localhost)
Phase 2: Load Story Acceptance Criteria
- Load Story from Linear via MCP
- Parse AC section (Given-When-Then format)
- Extract 3-5 AC with unique IDs (AC1, AC2, AC3, etc.)
Phase 3: Test Acceptance Criteria
- API: Use curl commands to test endpoints
- UI: Use puppeteer MCP to interact with page
- For each AC: Execute test, capture result, compare with expected
- Record verdict (PASS/FAIL) and details
Phase 4: Test Edge Cases
- Parse Story edge cases section or infer from AC
- Test 3-5 edge cases (empty inputs, boundaries, invalid types)
- Record results (PASS/FAIL)
Phase 5: Test Error Handling
- Test error scenarios (400s, 500s, validation errors)
- Verify correct HTTP status codes (API)
- Verify user-friendly error messages (no stack traces)
- Record results
Phase 6: Test Integration Points
- Identify 2-3 critical integrations from implementation tasks
- Test database persistence, external APIs, auth, file storage
- Verify data flows correctly
- Record results
Phase 7: Document Results
- Aggregate results from Phases 3-6
- Determine overall verdict (PASS if all AC passed + no critical failures)
- Format Linear comment (Format v1.0)
- Add comment to Story
- Create temporary testing script at scripts/tmp_[story_id].sh
- Return JSON verdict
Output Format
{
"verdict": "PASS" | "FAIL",
"story_type": "API" | "UI",
"story_id": "US001",
"main_scenarios": [
{
"ac_id": "AC1",
"result": "PASS",
"details": "Response 200, token valid, expires in 3600s"
}
],
"edge_cases": [
{
"case": "Invalid credentials",
"result": "PASS",
"details": "Response 401, correct error message"
}
],
"error_handling": [
{
"scenario": "401 Unauthorized",
"result": "PASS",
"details": "Correct status code + user-friendly message"
}
],
"integration": [
{
"integration": "Database persistence",
"result": "PASS",
"details": "User record saved with correct fields"
}
],
"linear_comment_id": "abc123",
"temp_script_path": "scripts/tmp_US001.sh"
}
Key Characteristics
- Atomic Worker: Single responsibility - manual testing only
- Dual Mode: Supports both API (curl) and UI (puppeteer) testing
- Comprehensive Coverage: Tests AC + edge cases + errors + integration
- Reusable Scripts: Creates temp bash script for re-running tests
- Structured Documentation: Linear comment follows Format v1.0 specification
Testing Patterns
API Testing (curl)
curl -X POST http://localhost:8000/api/login \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "password": "test123"}' \
-w "\\nHTTP Status: %{http_code}\\n"
UI Testing (puppeteer)
await page.goto('http://localhost:3000/login');
await page.fill('[name="email"]', 'user@example.com');
await page.fill('[name="password"]', 'test123');
await page.click('button[type="submit"]');
await page.waitForURL('**/dashboard');
Temporary Testing Script
Purpose: Reusable bash script for re-running manual tests after refactoring/fixes.
Location: scripts/tmp_[story_id].sh
Lifecycle:
- Created: ln-343-manual-tester Phase 7
- Used: Re-run after refactoring instead of typing commands again
- Deleted: ln-334-test-executor Step 6 (after E2E/Integration/Unit tests implemented)