[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FJE7N1P7TMMST9RWKGTEC0":3,"skill-same:01M6FJE7N1P7TMMST9RWKGTEC0":86},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":51,"install":52,"resources":65},"01M6FJE7N1P7TMMST9RWKGTEC0","ln-522-manual-tester",null,"Performs manual testing of Story AC via executable bash scripts in tests\u002Fmanual\u002F. Use when Story implementation needs hands-on AC verification.","boisenoise\u002Fskills-collections","boisenoise","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F193180?v=4","01M6CDBDQK6BDN55ZMA6B6PKBM","01M6CDBDVSJ3JPTBYN26FZ7TZK",12,"MIT","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Flevn-ln-522-manual-tester\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"ln","manual","tester","ln 522 manual tester","tests","when","ac","hands-on","via","scripts","testing","manual testing","Story","implementation","use","Bash","verification","2026-11-10 10:12:30",false,"---\nname: ln-522-manual-tester\ndescription: \"Performs manual testing of Story AC via executable bash scripts in tests\u002Fmanual\u002F. Use when Story implementation needs hands-on AC verification.\"\nlicense: MIT\n---\n\n> **Paths:** File paths (`shared\u002F`, `references\u002F`, `..\u002Fln-*`) are relative to skills repo root. If not found at CWD, locate this SKILL.md directory and go up one level for repo root. If `shared\u002F` is missing, fetch files via WebFetch from `https:\u002F\u002Fraw.githubusercontent.com\u002Flevnikolaevich\u002Fclaude-code-skills\u002Fmaster\u002Fskills\u002F{path}`.\n\n**MANDATORY READ:** Load `shared\u002Freferences\u002Fci_tool_detection.md` — compact output flags, pipefail, and failure-artifact policy for bash\u002Fcurl\u002FPuppeteer scripts.\n\n## Inputs\n\n| Input | Required | Source | Description |\n|-------|----------|--------|-------------|\n| `storyId` | Yes | args, git branch, kanban, user | Story to process |\n\n**Resolution:** Story Resolution Chain.\n**Status filter:** To Review\n\n# Manual Tester\n\n**Type:** L3 Worker\n\nManually verifies Story AC on running code and reports structured results for the quality gate.\n\n## Purpose & Scope\n- Create executable test scripts in `tests\u002Fmanual\u002F` folder of target project.\n- Run AC-driven checks via bash\u002Fcurl (API) or puppeteer (UI).\n- Save scripts permanently for regression testing (not temp files).\n- Document results in Linear with pass\u002Ffail per AC and script path.\n- No status changes or task creation.\n\n## When to Use\n- Use when a Story needs hands-on acceptance-criteria verification before automated planning\n- Research comment \"## Test Research:\" exists on Story (from ln-521)\n- All implementation tasks in Story status = Done\n\n## Test Design Principles\n\n### 1. Fail-Fast - No Silent Failures\n\n**CRITICAL:** Tests MUST return 1 (fail) immediately when any criterion is not met.\n\n**Never use:** `print_status \"WARN\" + return 0` for validation failures, graceful degradation without explicit flags, silent fallbacks that hide errors.\n\n**Exceptions (WARN is OK):** Informational warnings that don't affect correctness, optional features (with clear justification in comments), infrastructure issues (e.g., missing Nginx in dev environment).\n\n### 2. Expected-Based Testing - The Golden Standard\n\n**CRITICAL:** Tests MUST compare actual results against **expected reference files**, not apply heuristics or algorithmic checks.\n\n**Directory structure:**\n```\ntests\u002Fmanual\u002FNN-feature\u002F\n├── samples\u002F               # Input files\n├── expected\u002F              # Expected output files (REQUIRED!)\n│   └── {base_name}_{source_lang}-{target_lang}.{ext}\n└── test-*.sh\n```\n\n**Heuristics acceptable ONLY for:** dynamic\u002Fnon-deterministic data (timestamps, UUIDs, tokens - normalize before comparison; JSON with unordered keys - use `jq --sort-keys`).\n\n### 3. Results Storage\n\nTest results saved to `tests\u002Fmanual\u002Fresults\u002F` (persistent, in .gitignore). Named: `result_{ac_name}.{ext}` or `response_{ac_name}.json`. Inspectable after test completion for debugging.\n\n### 4. Expected File Generation\n\nTo create expected files:\n1. Run test with current implementation\n2. Review output in `results\u002F` folder\n3. If correct: copy to `expected\u002F` folder with proper naming\n4. If incorrect: fix implementation first, then copy\n\n**IMPORTANT:** Never blindly copy results to expected. Always validate correctness first.\n\n## Workflow\n\n### Phase 0: Resolve Inputs\n\n**MANDATORY READ:** Load `shared\u002Freferences\u002Finput_resolution_pattern.md`\n\n1. **Resolve storyId:** Run Story Resolution Chain per guide (status filter: [To Review]).\n\n### Phase 1: Setup tests\u002Fmanual structure\n1) **Read `docs\u002Fproject\u002Finfrastructure.md`** — get port allocation, service endpoints, base URLs. **Read `docs\u002Fproject\u002Frunbook.md`** — get Docker commands, test prerequisites, environment setup\n2) Check if `tests\u002Fmanual\u002F` folder exists in project root\n3) If missing, create structure:\n   - `tests\u002Fmanual\u002Fconfig.sh` — shared configuration (BASE_URL, helpers, colors)\n   - `tests\u002Fmanual\u002FREADME.md` — folder documentation (see README.md template below)\n   - `tests\u002Fmanual\u002Ftest-all.sh` — master script to run all test suites (see test-all.sh template below)\n   - `tests\u002Fmanual\u002Fresults\u002F` — folder for test outputs (add to `.gitignore`)\n4) Add `tests\u002Fmanual\u002Fresults\u002F` to project `.gitignore` if not present\n5) If exists, read existing `config.sh` to reuse settings (BASE_URL, tokens)\n\n### Phase 2: Create Story test script\n1) Fetch Story, parse AC into Given\u002FWhen\u002FThen list (3-5 expected)\n   - **Check for research comment** (from ln-521-test-researcher) — incorporate findings into test cases\n2) Detect API vs UI (API → curl, UI → puppeteer). **IF UI:** **MANDATORY READ:** Load `references\u002Fpuppeteer_patterns.md`\n3) Create test folder structure:\n   - `tests\u002Fmanual\u002F{NN}-{story-slug}\u002Fsamples\u002F` — input files (if needed)\n   - `tests\u002Fmanual\u002F{NN}-{story-slug}\u002Fexpected\u002F` — expected output files (REQUIRED for deterministic tests)\n4) Generate test script: `tests\u002Fmanual\u002F{NN}-{story-slug}\u002Ftest-{story-slug}.sh`\n   - Use appropriate template: TEMPLATE-api-endpoint.sh (direct calls) or TEMPLATE-document-format.sh (async jobs)\n   - Header: Story ID, AC list, prerequisites\n   - Test function per AC + edge\u002Ferror cases\n   - **diff-based validation** against expected files (PRIMARY)\n   - Results saved to `tests\u002Fmanual\u002Fresults\u002F`\n   - Summary table with timing\n5) Make script executable (`chmod +x`)\n\n### Phase 3: Update Documentation\n1) Update `tests\u002Fmanual\u002FREADME.md`:\n   - Add new test to \"Available Test Suites\" table\n   - Include Story ID, AC covered, run command\n2) Update `tests\u002Fmanual\u002Ftest-all.sh`:\n   - Add call to new script in SUITES array\n   - Maintain execution order (00-setup first, then numbered suites)\n\n### Phase 4: Execute and report\n\n**MANDATORY READ:** Load `references\u002Ftest_result_format_v1.md`\n\n1) Rebuild Docker containers (no cache), ensure healthy\n2) Run generated script, capture output\n3) Parse results (pass\u002Ffail counts)\n4) Post Linear comment (per test_result_format_v1.md) with:\n   - AC matrix (pass\u002Ffail per AC)\n   - Script path: `tests\u002Fmanual\u002F{NN}-{story-slug}\u002Ftest-{story-slug}.sh`\n   - Rerun command: `cd tests\u002Fmanual && .\u002F{NN}-{story-slug}\u002Ftest-{story-slug}.sh`\n\n## Critical Rules\n- Scripts saved to project `tests\u002Fmanual\u002F`, NOT temp files.\n- Rebuild Docker before testing; fail if rebuild\u002Frun unhealthy.\n- Keep language of Story (EN\u002FRU) in script comments and Linear comment.\n- No fixes or status changes; only evidence and verdict.\n- Script must be idempotent (can rerun anytime).\n\n## Runtime Summary Artifact\n\n**MANDATORY READ:** Load `shared\u002Freferences\u002Ftest_planning_summary_contract.md`, `shared\u002Freferences\u002Ftest_planning_worker_runtime_contract.md`\n\nRuntime profile:\n- family: `test-planning-worker`\n- worker: `ln-522`\n- summary kind: `test-planning-worker`\n- payload fields used by coordinators: `worker`, `status`, `warnings`, `manual_result_path`\n\nInvocation rules:\n- standalone: omit `runId` and `summaryArtifactPath`\n- managed: pass both `runId` and exact `summaryArtifactPath`\n- always write the validated summary before terminal outcome\n\nTest scripts always go to `tests\u002Fmanual\u002F`, never to the project root.\n\n### Monitor Integration (Claude Code 2.1.98+)\n\n**MANDATORY READ:** Load `shared\u002Freferences\u002Fmonitor_integration_pattern.md`\n\nWhen running test scripts expected to take >30 seconds:\n`Monitor(command=\"bash tests\u002Fmanual\u002F{suite}\u002Ftest-{slug}.sh 2>&1\", timeout_ms=300000, description=\"manual test: {slug}\")`\n\nFallback: if Monitor is unavailable (Bedrock\u002FVertex), use `Bash(run_in_background=true)`.\n\n\n## Definition of Done\n- [ ] `tests\u002Fmanual\u002F` structure exists (config.sh, README.md, test-all.sh, results\u002F created if missing).\n- [ ] `tests\u002Fmanual\u002Fresults\u002F` added to project `.gitignore`.\n- [ ] Test script created at `tests\u002Fmanual\u002F{NN}-{story-slug}\u002Ftest-{story-slug}.sh`.\n- [ ] `expected\u002F` folder created with at least 1 expected file per deterministic AC.\n- [ ] Script uses **diff-based validation** against expected files (not heuristics).\n- [ ] Script saves results to `tests\u002Fmanual\u002Fresults\u002F` for debugging.\n- [ ] Script is executable and idempotent.\n- [ ] **README.md updated** with new test suite in \"Available Test Suites\" table.\n- [ ] **test-all.sh updated** with call to new script in SUITES array.\n- [ ] App rebuilt and running; tests executed.\n- [ ] Verdict and Linear comment posted with script path and rerun command.\n\n## Script Templates\n\n### README.md (created once per project)\n\n```markdown\n# Manual Testing Scripts\n\n> **SCOPE:** Bash scripts for manual API testing. Complements automated tests with CLI-based workflows.\n\n## Quick Start\n\n```bash\ncd tests\u002Fmanual\n.\u002F00-setup\u002Fcreate-account.sh  # (if auth required)\n.\u002Ftest-all.sh                 # Run ALL test suites\n```\n\n## Prerequisites\n\n- Docker containers running (`docker compose ps`)\n- jq installed (`apt-get install jq` or `brew install jq`)\n\n## Folder Structure\n\n```\ntests\u002Fmanual\u002F\n├── config.sh          # Shared configuration (BASE_URL, helpers, colors)\n├── README.md          # This file\n├── test-all.sh        # Run all test suites\n├── 00-setup\u002F          # Account & token setup (if auth required)\n│   ├── create-account.sh\n│   └── get-token.sh\n└── {NN}-{topic}\u002F      # Test suites by Story\n    └── test-{slug}.sh\n```\n\n## Available Test Suites\n\n\u003C!-- Add new test suites here when creating new tests -->\n\n| Suite | Story | AC Covered | Run Command |\n|-------|-------|------------|-------------|\n| — | — | — | — |\n\n## Adding New Tests\n\n1. Create script in `{NN}-{topic}\u002Ftest-{slug}.sh`\n2. **Update this README** (Available Test Suites table)\n3. **Update `test-all.sh`** (add to SUITES array)\n```\n\n### test-all.sh (created once per project)\n\n```bash\n#!\u002Fbin\u002Fbash\n# =============================================================================\n# Run all manual test suites\n# =============================================================================\nset -e\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nsource \"$SCRIPT_DIR\u002Fconfig.sh\"\n\necho \"==========================================\"\necho \"Running ALL Manual Test Suites\"\necho \"==========================================\"\n\ncheck_jq\ncheck_api\n\n# Setup (if exists)\n[ -f \"$SCRIPT_DIR\u002F00-setup\u002Fcreate-account.sh\" ] && \"$SCRIPT_DIR\u002F00-setup\u002Fcreate-account.sh\"\n[ -f \"$SCRIPT_DIR\u002F00-setup\u002Fget-token.sh\" ] && \"$SCRIPT_DIR\u002F00-setup\u002Fget-token.sh\"\n\n# Test suites (add new suites here)\nSUITES=(\n    # \"01-auth\u002Ftest-auth-flow.sh\"\n    # \"02-translation\u002Ftest-translation.sh\"\n)\n\nPASSED=0; FAILED=0\nfor suite in \"${SUITES[@]}\"; do\n    echo \"\"\n    echo \"==========================================\"\n    echo \"Running: $suite\"\n    echo \"==========================================\"\n    if \"$SCRIPT_DIR\u002F$suite\"; then\n        ((++PASSED))\n        print_status \"PASS\" \"$suite\"\n    else\n        ((++FAILED))\n        print_status \"FAIL\" \"$suite\"\n    fi\ndone\n\necho \"\"\necho \"==========================================\"\necho \"TOTAL: $PASSED suites passed, $FAILED failed\"\necho \"==========================================\"\n[ $FAILED -eq 0 ] && exit 0 || exit 1\n```\n\n### config.sh (created once per project)\n\n```bash\n#!\u002Fbin\u002Fbash\n# Shared configuration for manual testing scripts\nexport BASE_URL=\"${BASE_URL:-http:\u002F\u002Flocalhost:8080}\"\nexport RED='\\033[0;31m'\nexport GREEN='\\033[0;32m'\nexport YELLOW='\\033[1;33m'\nexport NC='\\033[0m'\n\nprint_status() {\n    local status=$1; local message=$2\n    case $status in\n        \"PASS\") echo -e \"${GREEN}[PASS]${NC} $message\" ;;\n        \"FAIL\") echo -e \"${RED}[FAIL]${NC} $message\" ;;\n        \"WARN\") echo -e \"${YELLOW}[WARN]${NC} $message\" ;;\n        \"INFO\") echo -e \"[INFO] $message\" ;;\n    esac\n}\n\ncheck_jq() {\n    command -v jq &> \u002Fdev\u002Fnull || { echo \"Error: jq required\"; exit 1; }\n}\n\ncheck_api() {\n    local response=$(curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" \"$BASE_URL\u002Fhealth\" 2>\u002Fdev\u002Fnull)\n    if [ \"$response\" != \"200\" ]; then\n        echo \"Error: API not reachable at $BASE_URL\"\n        exit 1\n    fi\n    print_status \"INFO\" \"API reachable at $BASE_URL\"\n}\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nexport SCRIPT_DIR\n```\n\n### Test Script Templates\n\n**See:** [references\u002Ftemplates\u002F](references\u002Ftemplates\u002F)\n\n| Template | Use Case | Location |\n|----------|----------|----------|\n| template-api-endpoint.sh | API endpoint tests (NO async jobs) | [template-api-endpoint.sh](references\u002Ftemplates\u002Ftemplate-api-endpoint.sh) |\n| template-document-format.sh | Document\u002Ffile processing (WITH async jobs) | [template-document-format.sh](references\u002Ftemplates\u002Ftemplate-document-format.sh) |\n\n**Quick start:**\n```bash\ncp references\u002Ftemplates\u002Ftemplate-api-endpoint.sh {NN}-feature\u002Ftest-{feature}.sh      # Endpoint tests\ncp references\u002Ftemplates\u002Ftemplate-document-format.sh {NN}-feature\u002Ftest-{format}.sh    # Document tests\n```\n\n## Reference Files\n- Script format reference: prompsit-api `tests\u002Fmanual\u002F` (production example)\n- AC format: `shared\u002Ftemplates\u002Ftest_task_template.md` (or local `docs\u002Ftemplates\u002F` in target project)\n- Risk-based context: `shared\u002Freferences\u002Frisk_based_testing_guide.md`\n- Research findings: ln-521-test-researcher creates \"## Test Research\" comment on Story\n- Puppeteer patterns: `references\u002Fpuppeteer_patterns.md`\n- Test result format: `references\u002Ftest_result_format_v1.md`\n\n---\n**Version:** 1.0.0\n**Last Updated:** 2026-01-15\n","> **Paths:** File paths (`shared\u002F`, `references\u002F`, `..\u002Fln-*`) are relative to skills repo root. If not found at CWD, locate this SKILL.md directory and go up one level for repo root. If `shared\u002F` is missing, fetch files via WebFetch from `https:\u002F\u002Fraw.githubusercontent.com\u002Flevnikolaevich\u002Fclaude-code-skills\u002Fmaster\u002Fskills\u002F{path}`.\n\n**MANDATORY READ:** Load `shared\u002Freferences\u002Fci_tool_detection.md` — compact output flags, pipefail, and failure-artifact policy for bash\u002Fcurl\u002FPuppeteer scripts.\n\n## Inputs\n\n| Input | Required | Source | Description |\n|-------|----------|--------|-------------|\n| `storyId` | Yes | args, git branch, kanban, user | Story to process |\n\n**Resolution:** Story Resolution Chain.\n**Status filter:** To Review\n\n# Manual Tester\n\n**Type:** L3 Worker\n\nManually verifies Story AC on running code and reports structured results for the quality gate.\n\n## Purpose & Scope\n- Create executable test scripts in `tests\u002Fmanual\u002F` folder of target project.\n- Run AC-driven checks via bash\u002Fcurl (API) or puppeteer (UI).\n- Save scripts permanently for regression testing (not temp files).\n- Document results in Linear with pass\u002Ffail per AC and script path.\n- No status changes or task creation.\n\n## When to Use\n- Use when a Story needs hands-on acceptance-criteria verification before automated planning\n- Research comment \"## Test Research:\" exists on Story (from ln-521)\n- All implementation tasks in Story status = Done\n\n## Test Design Principles\n\n### 1. Fail-Fast - No Silent Failures\n\n**CRITICAL:** Tests MUST return 1 (fail) immediately when any criterion is not met.\n\n**Never use:** `print_status \"WARN\" + return 0` for validation failures, graceful degradation without explicit flags, silent fallbacks that hide errors.\n\n**Exceptions (WARN is OK):** Informational warnings that don't affect correctness, optional features (with clear justification in comments), infrastructure issues (e.g., missing Nginx in dev environment).\n\n### 2. Expected-Based Testing - The Golden Standard\n\n**CRITICAL:** Tests MUST compare actual results against **expected reference files**, not apply heuristics or algorithmic checks.\n\n**Directory structure:**\n```\ntests\u002Fmanual\u002FNN-feature\u002F\n├── samples\u002F               # Input files\n├── expected\u002F              # Expected output files (REQUIRED!)\n│   └── {base_name}_{source_lang}-{target_lang}.{ext}\n└── test-*.sh\n```\n\n**Heuristics acceptable ONLY for:** dynamic\u002Fnon-deterministic data (timestamps, UUIDs, tokens - normalize before comparison; JSON with unordered keys - use `jq --sort-keys`).\n\n### 3. Results Storage\n\nTest results saved to `tests\u002Fmanual\u002Fresults\u002F` (persistent, in .gitignore). Named: `result_{ac_name}.{ext}` or `response_{ac_name}.json`. Inspectable after test completion for debugging.\n\n### 4. Expected File Generation\n\nTo create expected files:\n1. Run test with current implementation\n2. Review output in `results\u002F` folder\n3. If correct: copy to `expected\u002F` folder with proper naming\n4. If incorrect: fix implementation first, then copy\n\n**IMPORTANT:** Never blindly copy results to expected. Always validate correctness first.\n\n## Workflow\n\n### Phase 0: Resolve Inputs\n\n**MANDATORY READ:** Load `shared\u002Freferences\u002Finput_resolution_pattern.md`\n\n1. **Resolve storyId:** Run Story Resolution Chain per guide (status filter: [To Review]).\n\n### Phase 1: Setup tests\u002Fmanual structure\n1) **Read `docs\u002Fproject\u002Finfrastructure.md`** — get port allocation, service endpoints, base URLs. **Read `docs\u002Fproject\u002Frunbook.md`** — get Docker commands, test prerequisites, environment setup\n2) Check if `tests\u002Fmanual\u002F` folder exists in project root\n3) If missing, create structure:\n   - `tests\u002Fmanual\u002Fconfig.sh` — shared configuration (BASE_URL, helpers, colors)\n   - `tests\u002Fmanual\u002FREADME.md` — folder documentation (see README.md template below)\n   - `tests\u002Fmanual\u002Ftest-all.sh` — master script to run all test suites (see test-all.sh template below)\n   - `tests\u002Fmanual\u002Fresults\u002F` — folder for test outputs (add to `.gitignore`)\n4) Add `tests\u002Fmanual\u002Fresults\u002F` to project `.gitignore` if not present\n5) If exists, read existing `config.sh` to reuse settings (BASE_URL, tokens)\n\n### Phase 2: Create Story test script\n1) Fetch Story, parse AC into Given\u002FWhen\u002FThen list (3-5 expected)\n   - **Check for research comment** (from ln-521-test-researcher) — incorporate findings into test cases\n2) Detect API vs UI (API → curl, UI → puppeteer). **IF UI:** **MANDATORY READ:** Load `references\u002Fpuppeteer_patterns.md`\n3) Create test folder structure:\n   - `tests\u002Fmanual\u002F{NN}-{story-slug}\u002Fsamples\u002F` — input files (if needed)\n   - `tests\u002Fmanual\u002F{NN}-{story-slug}\u002Fexpected\u002F` — expected output files (REQUIRED for deterministic tests)\n4) Generate test script: `tests\u002Fmanual\u002F{NN}-{story-slug}\u002Ftest-{story-slug}.sh`\n   - Use appropriate template: TEMPLATE-api-endpoint.sh (direct calls) or TEMPLATE-document-format.sh (async jobs)\n   - Header: Story ID, AC list, prerequisites\n   - Test function per AC + edge\u002Ferror cases\n   - **diff-based validation** against expected files (PRIMARY)\n   - Results saved to `tests\u002Fmanual\u002Fresults\u002F`\n   - Summary table with timing\n5) Make script executable (`chmod +x`)\n\n### Phase 3: Update Documentation\n1) Update `tests\u002Fmanual\u002FREADME.md`:\n   - Add new test to \"Available Test Suites\" table\n   - Include Story ID, AC covered, run command\n2) Update `tests\u002Fmanual\u002Ftest-all.sh`:\n   - Add call to new script in SUITES array\n   - Maintain execution order (00-setup first, then numbered suites)\n\n### Phase 4: Execute and report\n\n**MANDATORY READ:** Load `references\u002Ftest_result_format_v1.md`\n\n1) Rebuild Docker containers (no cache), ensure healthy\n2) Run generated script, capture output\n3) Parse results (pass\u002Ffail counts)\n4) Post Linear comment (per test_result_format_v1.md) with:\n   - AC matrix (pass\u002Ffail per AC)\n   - Script path: `tests\u002Fmanual\u002F{NN}-{story-slug}\u002Ftest-{story-slug}.sh`\n   - Rerun command: `cd tests\u002Fmanual && .\u002F{NN}-{story-slug}\u002Ftest-{story-slug}.sh`\n\n## Critical Rules\n- Scripts saved to project `tests\u002Fmanual\u002F`, NOT temp files.\n- Rebuild Docker before testing; fail if rebuild\u002Frun unhealthy.\n- Keep language of Story (EN\u002FRU) in script comments and Linear comment.\n- No fixes or status changes; only evidence and verdict.\n- Script must be idempotent (can rerun anytime).\n\n## Runtime Summary Artifact\n\n**MANDATORY READ:** Load `shared\u002Freferences\u002Ftest_planning_summary_contract.md`, `shared\u002Freferences\u002Ftest_planning_worker_runtime_contract.md`\n\nRuntime profile:\n- family: `test-planning-worker`\n- worker: `ln-522`\n- summary kind: `test-planning-worker`\n- payload fields used by coordinators: `worker`, `status`, `warnings`, `manual_result_path`\n\nInvocation rules:\n- standalone: omit `runId` and `summaryArtifactPath`\n- managed: pass both `runId` and exact `summaryArtifactPath`\n- always write the validated summary before terminal outcome\n\nTest scripts always go to `tests\u002Fmanual\u002F`, never to the project root.\n\n### Monitor Integration (Claude Code 2.1.98+)\n\n**MANDATORY READ:** Load `shared\u002Freferences\u002Fmonitor_integration_pattern.md`\n\nWhen running test scripts expected to take >30 seconds:\n`Monitor(command=\"bash tests\u002Fmanual\u002F{suite}\u002Ftest-{slug}.sh 2>&1\", timeout_ms=300000, description=\"manual test: {slug}\")`\n\nFallback: if Monitor is unavailable (Bedrock\u002FVertex), use `Bash(run_in_background=true)`.\n\n\n## Definition of Done\n- [ ] `tests\u002Fmanual\u002F` structure exists (config.sh, README.md, test-all.sh, results\u002F created if missing).\n- [ ] `tests\u002Fmanual\u002Fresults\u002F` added to project `.gitignore`.\n- [ ] Test script created at `tests\u002Fmanual\u002F{NN}-{story-slug}\u002Ftest-{story-slug}.sh`.\n- [ ] `expected\u002F` folder created with at least 1 expected file per deterministic AC.\n- [ ] Script uses **diff-based validation** against expected files (not heuristics).\n- [ ] Script saves results to `tests\u002Fmanual\u002Fresults\u002F` for debugging.\n- [ ] Script is executable and idempotent.\n- [ ] **README.md updated** with new test suite in \"Available Test Suites\" table.\n- [ ] **test-all.sh updated** with call to new script in SUITES array.\n- [ ] App rebuilt and running; tests executed.\n- [ ] Verdict and Linear comment posted with script path and rerun command.\n\n## Script Templates\n\n### README.md (created once per project)\n\n```markdown\n# Manual Testing Scripts\n\n> **SCOPE:** Bash scripts for manual API testing. Complements automated tests with CLI-based workflows.\n\n## Quick Start\n\n```bash\ncd tests\u002Fmanual\n.\u002F00-setup\u002Fcreate-account.sh  # (if auth required)\n.\u002Ftest-all.sh                 # Run ALL test suites\n```\n\n## Prerequisites\n\n- Docker containers running (`docker compose ps`)\n- jq installed (`apt-get install jq` or `brew install jq`)\n\n## Folder Structure\n\n```\ntests\u002Fmanual\u002F\n├── config.sh          # Shared configuration (BASE_URL, helpers, colors)\n├── README.md          # This file\n├── test-all.sh        # Run all test suites\n├── 00-setup\u002F          # Account & token setup (if auth required)\n│   ├── create-account.sh\n│   └── get-token.sh\n└── {NN}-{topic}\u002F      # Test suites by Story\n    └── test-{slug}.sh\n```\n\n## Available Test Suites\n\n\u003C!-- Add new test suites here when creating new tests -->\n\n| Suite | Story | AC Covered | Run Command |\n|-------|-------|------------|-------------|\n| — | — | — | — |\n\n## Adding New Tests\n\n1. Create script in `{NN}-{topic}\u002Ftest-{slug}.sh`\n2. **Update this README** (Available Test Suites table)\n3. **Update `test-all.sh`** (add to SUITES array)\n```\n\n### test-all.sh (created once per project)\n\n```bash\n#!\u002Fbin\u002Fbash\n# =============================================================================\n# Run all manual test suites\n# =============================================================================\nset -e\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nsource \"$SCRIPT_DIR\u002Fconfig.sh\"\n\necho \"==========================================\"\necho \"Running ALL Manual Test Suites\"\necho \"==========================================\"\n\ncheck_jq\ncheck_api\n\n# Setup (if exists)\n[ -f \"$SCRIPT_DIR\u002F00-setup\u002Fcreate-account.sh\" ] && \"$SCRIPT_DIR\u002F00-setup\u002Fcreate-account.sh\"\n[ -f \"$SCRIPT_DIR\u002F00-setup\u002Fget-token.sh\" ] && \"$SCRIPT_DIR\u002F00-setup\u002Fget-token.sh\"\n\n# Test suites (add new suites here)\nSUITES=(\n    # \"01-auth\u002Ftest-auth-flow.sh\"\n    # \"02-translation\u002Ftest-translation.sh\"\n)\n\nPASSED=0; FAILED=0\nfor suite in \"${SUITES[@]}\"; do\n    echo \"\"\n    echo \"==========================================\"\n    echo \"Running: $suite\"\n    echo \"==========================================\"\n    if \"$SCRIPT_DIR\u002F$suite\"; then\n        ((++PASSED))\n        print_status \"PASS\" \"$suite\"\n    else\n        ((++FAILED))\n        print_status \"FAIL\" \"$suite\"\n    fi\ndone\n\necho \"\"\necho \"==========================================\"\necho \"TOTAL: $PASSED suites passed, $FAILED failed\"\necho \"==========================================\"\n[ $FAILED -eq 0 ] && exit 0 || exit 1\n```\n\n### config.sh (created once per project)\n\n```bash\n#!\u002Fbin\u002Fbash\n# Shared configuration for manual testing scripts\nexport BASE_URL=\"${BASE_URL:-http:\u002F\u002Flocalhost:8080}\"\nexport RED='\\033[0;31m'\nexport GREEN='\\033[0;32m'\nexport YELLOW='\\033[1;33m'\nexport NC='\\033[0m'\n\nprint_status() {\n    local status=$1; local message=$2\n    case $status in\n        \"PASS\") echo -e \"${GREEN}[PASS]${NC} $message\" ;;\n        \"FAIL\") echo -e \"${RED}[FAIL]${NC} $message\" ;;\n        \"WARN\") echo -e \"${YELLOW}[WARN]${NC} $message\" ;;\n        \"INFO\") echo -e \"[INFO] $message\" ;;\n    esac\n}\n\ncheck_jq() {\n    command -v jq &> \u002Fdev\u002Fnull || { echo \"Error: jq required\"; exit 1; }\n}\n\ncheck_api() {\n    local response=$(curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" \"$BASE_URL\u002Fhealth\" 2>\u002Fdev\u002Fnull)\n    if [ \"$response\" != \"200\" ]; then\n        echo \"Error: API not reachable at $BASE_URL\"\n        exit 1\n    fi\n    print_status \"INFO\" \"API reachable at $BASE_URL\"\n}\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nexport SCRIPT_DIR\n```\n\n### Test Script Templates\n\n**See:** [references\u002Ftemplates\u002F](references\u002Ftemplates\u002F)\n\n| Template | Use Case | Location |\n|----------|----------|----------|\n| template-api-endpoint.sh | API endpoint tests (NO async jobs) | [template-api-endpoint.sh](references\u002Ftemplates\u002Ftemplate-api-endpoint.sh) |\n| template-document-format.sh | Document\u002Ffile processing (WITH async jobs) | [template-document-format.sh](references\u002Ftemplates\u002Ftemplate-document-format.sh) |\n\n**Quick start:**\n```bash\ncp references\u002Ftemplates\u002Ftemplate-api-endpoint.sh {NN}-feature\u002Ftest-{feature}.sh      # Endpoint tests\ncp references\u002Ftemplates\u002Ftemplate-document-format.sh {NN}-feature\u002Ftest-{format}.sh    # Document tests\n```\n\n## Reference Files\n- Script format reference: prompsit-api `tests\u002Fmanual\u002F` (production example)\n- AC format: `shared\u002Ftemplates\u002Ftest_task_template.md` (or local `docs\u002Ftemplates\u002F` in target project)\n- Risk-based context: `shared\u002Freferences\u002Frisk_based_testing_guide.md`\n- Research findings: ln-521-test-researcher creates \"## Test Research\" comment on Story\n- Puppeteer patterns: `references\u002Fpuppeteer_patterns.md`\n- Test result format: `references\u002Ftest_result_format_v1.md`\n\n---\n**Version:** 1.0.0\n**Last Updated:** 2026-01-15\n",{"name":5,"license":14,"description":7},"main","7bf2279c8a65758319526a721d5c4b75683aec9c","skills\u002Flevn-ln-522-manual-tester",3,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections","https:\u002F\u002Fgithub.com\u002Fboisenoise","2026-11-13 14:20:47",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add boisenoise\u002Fskills-collections --skill ln-522-manual-tester",{"tool":58,"command":59},"bunx","bunx skills add boisenoise\u002Fskills-collections --skill ln-522-manual-tester",{"tool":61,"command":62},"pnpm","pnpm dlx skills add boisenoise\u002Fskills-collections --skill ln-522-manual-tester","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Flevn-ln-522-manual-tester\u002FSKILL.md",true,[66,72,78,82],{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"references\u002Fpuppeteer_patterns.md","REFERENCE","参考文档",9029,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Flevn-ln-522-manual-tester\u002Freferences\u002Fpuppeteer_patterns.md",{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"references\u002Ftemplates\u002Ftemplate-api-endpoint.sh","SCRIPT","脚本",4447,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Flevn-ln-522-manual-tester\u002Freferences\u002Ftemplates\u002Ftemplate-api-endpoint.sh",{"path":79,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":80,"sourceHtmlUrl":81},"references\u002Ftemplates\u002Ftemplate-document-format.sh",5705,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Flevn-ln-522-manual-tester\u002Freferences\u002Ftemplates\u002Ftemplate-document-format.sh",{"path":83,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002Ftest_result_format_v1.md",8038,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Flevn-ln-522-manual-tester\u002Freferences\u002Ftest_result_format_v1.md",[87,116,141,167,186,209],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":91,"licenseFileUrl":92,"sourceHtmlUrl":93,"categories":94,"keywords":95,"publishedAt":40},"01M6WNH92BHVFXHGPDZCPJ0AG0","web-access","Use Treg for public web or platform data only when existing search, browser and connected tools cannot cover the task, with explicit cost and data boundaries.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-web-access\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-web-access\u002FSKILL.md",[],[96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,28,115],"web","access","web access","official","development","browser","search","data","Tools","read","fetch","only","youtube","free tools","platform","critical","free","cover","normal","2026",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":91,"licenseFileUrl":120,"sourceHtmlUrl":121,"categories":122,"keywords":126,"publishedAt":40},"01M6WNF9XAYAB2CZDDJBAKNM93","treg","Use the Treg CLI or MCP catalog to discover, price and call authorized external tools with team-scoped credentials and a user-approved budget.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-treg\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-treg\u002FSKILL.md",[123],{"categoryNo":124,"categoryName":125,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[118,127,128,129,99,100,130,104,131,132,133,134,37,135,136,111,137,138,139,140,115],"MCP","cli","github","license","Budget","credentials","team","catalog","call","discover","external tools","with","scoped","blob",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":91,"licenseFileUrl":145,"sourceHtmlUrl":146,"categories":147,"keywords":153,"publishedAt":40},"01M6WN93MEAZ4E41DYAHJRPHQT","recruit","Turn a job description into an evidence-linked candidate shortlist through Treg, with job-related ranking and optional authorized business contact enrichment.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-recruit\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-recruit\u002FSKILL.md",[148],{"categoryNo":149,"categoryName":150,"taxonomyType":151,"taxonomyTypeDesc":152},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[143,129,99,130,154,155,156,157,158,159,111,160,161,162,138,163,164,165,166,140,118,115],"https","email","enrichment","business","evidence","phone","ranking","post","job description","for","person","candidate","reason",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":91,"licenseFileUrl":171,"sourceHtmlUrl":172,"categories":173,"keywords":174,"publishedAt":40},"01M6WN8R5RXSMHM9B4D9FAFX42","rea-growth","Analyze a company’s public growth and content through Treg, distinguish observations from hypotheses, and produce an evidence-linked playbook within an approved budget.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rea-growth\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rea-growth\u002FSKILL.md",[],[175,176,177,129,99,130,178,179,154,180,131,181,182,183,158,111,184,185,140,118,115],"growth","rea","rea growth","produce","content","playbook","marketing","analyze","public","observations","company",{"skillNo":187,"name":188,"nameZh":6,"description":189,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":91,"licenseFileUrl":190,"sourceHtmlUrl":191,"categories":192,"keywords":193,"publishedAt":40},"01M6WN2EVE3RQRGWAKBT4S7YT2","make-ugc","Create original AI UGC-style product videos through Treg: research hooks, approve a licensed presenter and voice, generate clips, add captions and report costs.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-make-ugc\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-make-ugc\u002FSKILL.md",[],[194,195,129,196,99,197,130,198,199,200,201,202,111,203,204,205,206,207,208,140],"make","make ugc","research","create","Video","Captions","ads","short","hooks","head","style","niche","trending","talking-head","approve",{"skillNo":210,"name":211,"nameZh":6,"description":212,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":91,"licenseFileUrl":213,"sourceHtmlUrl":214,"categories":215,"keywords":216,"publishedAt":40},"01M6WN10ARAA63Y8K1YNGXJ2RM","lead-signals","Find and qualify public buying signals through Treg, rank fitting business accounts and optionally enrich authorized business contact information.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-lead-signals\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-lead-signals\u002FSKILL.md",[],[217,218,219,129,99,130,220,221,157,222,223,111,224,225,226,227,228,229,230,140],"signals","lead","lead signals","how","find","ready","as","how to","qualify","people","information","enrich","changes","funding"]