{"id":"87d886f5-3575-4595-8652-30b7714beac8","shortId":"mB5Y7P","kind":"skill","title":"testing-strategy","tagline":"Universal layered testing strategy — generate a complete test plan, layered architecture, and execution plan based on project type (Backend+APP / Backend+WEB / Backend+APP+Embedded)","description":"# Universal Layered Testing Strategy\n\n## Description\n\nThis Skill generates a complete layered testing strategy based on project type (Backend+APP / Backend+WEB / Backend+APP+Embedded), including test layer architecture, scenario adaptation matrices, code templates, and CI/CD configuration.\n\nCore philosophy: **\"Quality is built in, not tested in.\"**\n\n### Two Key Principles\n\n1. **Shift Left**: Developers write L1/L2 tests during coding — the earlier bugs are found, the lower the fix cost\n2. **Push Down**: If it can be tested at L1, don't leave it for L2; if it can be tested at L2, don't leave it for L3\n\n### Ideal Test Pyramid Proportions\n\n- **L1 (Unit)**: ~70% — Millisecond feedback (includes interface contract / schema contract)\n- **L2 (Integration)**: ~20% — Minute-level feedback (single service + real middleware)\n- **L3 (E2E)**: ~10% — Hour-level feedback (cross-service full chain, including third-party APIs)\n  - **L3-k8s**: L3 sub-layer, requires K8s/minikube environment\n- **L4 (UAT)**: <1% — Staging acceptance\n\n## Rules\n\n1. **Layering must be complete**: Every project must define the test scope and tools for each L1-L4 layer\n2. **Coverage gates**: L1 coverage ≥ 80%, core logic libraries ≥ 90%\n3. **Mock isolation**: L1 tests must mock all external dependencies (DB/network/HAL/filesystem)\n4. **Test case ID convention**: All cases follow the `L{layer}-<MODULE>-NNN` format\n5. **TDD debugging**: Bug fixes must start with a reproduction test case — manual browser debugging is prohibited\n6. **CI quality gates**: L1 + L2-1 must pass 100% on every commit\n7. **Requirements traceability**: A User Story → Test Case traceability matrix must be established\n8. **L3/L4 black-box testing**: L3 and L4 must be end-to-end black-box tests — the test client (Playwright/Appium/real device) interacts directly with the user interface. **Intercepting, mocking, or bypassing any internal component at intermediate layers is prohibited**. The only exception is uncontrollable external third-party services, which may use stub replacements\n9. **Test scenario data management**: Each test scenario must be loadable via `make mock-scenario` or equivalent commands for controlled, repeatable input\n\n---\n\n## Step 1: Identify Project Type\n\nAsk or auto-detect which scenario the project belongs to and determine the tech stack:\n\n| Scenario                | Typical Tech Stack                        | Special Focus                                    |\n| :------------------ | :-------------------------------- | :------------------------------------------ |\n| **Backend+APP**        | Go/Java + Flutter/RN              | App UI testing, API contracts, push notifications |\n| **Backend+WEB**        | Go/Java + React/Vue               | Browser compatibility, SEO, SSR              |\n| **Backend+APP+Embedded** | Go/Java + Flutter + C/C++ (Bazel) | HAL abstraction, Wasm simulation, Digital Twin, Software Update |\n\n---\n\n## Step 2: Generate Layered Test Architecture\n\n### 2.1 Universal Four-Layer Architecture (L1-L4)\n\n```mermaid\ngraph BT\n    L1[\"L1: Unit Test\"] --> L2[\"L2: Single-Service Integration\"]\n    L2 --> L3[\"L3: Cross-Service E2E\"]\n    L3 --> L4[\"L4: User Acceptance Test\"]\n```\n\n### 2.2 L1 — Unit Test\n\n**Goal**: Verify the logical correctness of the smallest code unit (function/class/state machine). **Includes interface contract and schema contract** (validation without I/O dependencies).\n\n| Project Type          | Test Target                       | Tools                    | Focus                       |\n| :---------------- | :----------------------------- | :---------------------- | :--------------------------- |\n| **Backend**          | Service/Repository/Domain logic + API Schema | Go Test / JUnit / pytest | Business rules, boundary conditions, interface contracts |\n| **APP (Flutter)** | Widget/BLoC/Provider logic      | flutter_test            | State management, data transformation |\n| **APP (RN)**      | Component/Hook logic            | Jest                    | State management, data transformation |\n| **WEB**           | Components/Hooks/Store         | Vitest / Jest           | Rendering logic, state management |\n| **Embedded**        | Cluster logic, FSM, algorithms        | GTest + Mock HAL        | State transitions, HAL interactions, memory safety |\n\n**L1 Writing Standards**:\n\n- Mock all external dependencies (DB/network/HAL/filesystem)\n- Cover: normal path / boundary conditions / error handling / state transitions\n- Target coverage ≥ 80% (core logic libraries ≥ 90%)\n- Millisecond execution as real-time development feedback\n- L1 does not need to be listed case-by-case in the test plan document (co-located with code, pytest auto-discovers)\n\n### 2.3 L2 — Single-Service Integration Test\n\n**Goal**: Verify module collaboration within a single service boundary, using real middleware (DB/Redis/MQ/Vault, etc.) but without crossing service boundaries.\n\n| Project Type   | Test Target                 | Tools                            |\n| :--------- | :----------------------- | :------------------------------ |\n| **Backend**   | Service <-> DB/Redis/Kafka | Docker Compose / Testcontainers |\n| **APP**    | App <-> Mock Server        | Integration Test + Mock Server  |\n| **WEB**    | Frontend <-> Mock API      | MSW / Vitest                    |\n| **Embedded** | Device + HAL (Wasm)      | Vitest Browser (Digital Twin)   |\n\n### 2.4 L3 — Cross-Service E2E (End-to-End)\n\n**Goal**: Verify the complete chain across multiple independent services, including real third-party APIs.\n\n| Project Type            | Test Target                      | Tools                                    |\n| :------------------ | :---------------------------- | :-------------------------------------- |\n| **Backend+APP**        | App → API → DB → Push         | Appium / Flutter Integration Test       |\n| **Backend+WEB**        | Browser → API → DB → SSE      | Playwright / Cypress                    |\n| **Backend+APP+Embedded** | App → Cloud → Hub(Wasm) → HAL | Simulator + Vitest Browser + Playwright |\n\n**Black-box principle**: L3 tests are from the user's perspective — the test client (browser/App) → frontend → backend → database full-chain connectivity. **Intercepting or mocking at any intermediate layer is prohibited**. The only exception is uncontrollable real third-party services (e.g., payment gateways), which may use stub services, but internal components must not be mocked.\n\n**L3-k8s sub-layer** (optional): When test scenarios depend on the K8s environment (e.g., Pod scheduling, Spot Recovery), mark as L3-k8s. Use L3 (no K8s) for daily development; use L3-k8s for Nightly/Pre-release.\n\n### 2.5 L4 — User Acceptance Test (UAT)\n\n**L4 is not entirely manual**: Automation is primary; only scenarios requiring real third-party client interaction retain manual testing.\n\n| Type | Design Principle | Execution Method | Scenario Example |\n|------|---------|---------|--------|\n| **L4-Auto** | Acceptance criteria are quantifiable: has input and expected output | `make test-l4-uat` (automated, Staging environment) | API Roundtrip, Memory persistence, approval workflows |\n| **L4-Manual** | Requires real third-party client visual verification | QA manual testing in real environment | Feishu Card UI rendering, message delivery visual check |\n\n- **Owner**: QA team / PM\n- **Environment**: Real Staging (real DB/Letta/external services, not Mock)\n- **Focus**: User experience, extreme network conditions, real third-party service interaction\n- **LLM path**: Assert structure and side effects; do not assert specific LLM output text\n\n### 2.6 Cross-Layer Test Suites: Smoke / Regression / UAT\n\n**These three suites are not new test layers** — they are **run suites** formed by tagging (markers) existing L1-L4 test cases.\n\n| Suite | Meaning | Case Source | Run Command | Timing |\n|------|------|-----------|----------|------|\n| **Smoke** | Quick validation of the most critical paths (system is alive) | A few key L3 cases tagged with `@smoke` | `make smoke` | Run immediately after deployment |\n| **Regression** | Full regression verifying historical features are not broken | All L1+L2+L3 cases | `make regression` | Before PR merge / CI quality gate |\n| **UAT-Auto** | Business acceptance automation (Staging real environment) | Quantifiable portion of L4 cases | `make test-l4-uat` | Before release / Release Tag |\n\n**Key principles**:\n- Smoke cases = Add `@pytest.mark.smoke` to existing L3 critical-path cases — do not create new test files\n- A single case can have multiple markers, e.g., `@pytest.mark.smoke` + `@pytest.mark.l3`\n- **Criteria for selecting smoke cases**: The user's most common critical paths, the system's only irreplaceable entry points\n- Smoke cases must be **fast** (all pass in < 5 min); otherwise, move them to regular test-l3\n\n```python\n# Example: A case belonging to both l3 and smoke\n@pytest.mark.l3\n@pytest.mark.smoke\nasync def test_completions_roundtrip(...):\n    \"\"\"L3-COMP-001: The most critical E2E case.\"\"\"\n    ...\n\n# Example: L4 Auto case — Staging environment, does not assert specific text\n@pytest.mark.l4\nasync def test_agent_memory_persists(letta_client):\n    \"\"\"L4-MS-001: Agent remembers user preferences across conversations.\"\"\"\n    archival = await letta_client.archival_memory_search(agent_id, keyword)\n    assert len(archival.items) > 0   # Having content is sufficient\n```\n\n\n---\n\n## Step 3: Scenario Adaptation Matrix\n\nBased on project type, determine **required / recommended / optional** for each layer:\n\n### Scenario A: Backend + APP\n\n| Layer                | Status    | Focus                          |\n| :------------------ | :------ | :---------------------------- |\n| L1 (Unit)           | Required | Backend business logic + App state management   |\n| L2-1 (Interface)    | Required | API contracts (OpenAPI/Protobuf)   |\n| L2-2 (Integration)  | Required | Backend service + DB/MQ integration |\n| L2-3 (E2E)          | Required | App → API full chain              |\n| L2-4 (Playground)   | Recommended | Swagger UI + Mock environment        |\n| L3-1 (Contract)     | Recommended | Frontend-backend API contracts               |\n| L3-2 (Cross-System) | Optional | Multi-subsystem coordination                  |\n| L4 (UAT)            | Required | Real device testing + App Store review process |\n\n**Special focus areas**:\n\n- End-to-end push notification verification (APNs/FCM)\n- Multi-device login / token refresh race conditions\n- App cold start / warm start performance\n- Offline mode & data sync\n\n### Scenario B: Backend + WEB\n\n| Layer                | Status    | Focus                              |\n| :------------------ | :------ | :-------------------------------- |\n| L1 (Unit)           | Required | Backend business logic + Frontend components/Store     |\n| L2-1 (Interface)    | Required | API contracts + Component Props interface        |\n| L2-2 (Integration)  | Required | Backend service integration + Frontend API layer        |\n| L2-3 (E2E)          | Required | Browser → API full chain (Playwright) |\n| L2-4 (Playground)   | Recommended | Storybook + Staging environment          |\n| L3-1 (Contract)     | Recommended | Frontend-backend API change compatibility             |\n| L3-2 (Cross-System) | Optional | Multi-subsystem coordination                      |\n| L4 (UAT)            | Recommended | Real browser testing                    |\n\n**Special focus areas**:\n\n- Browser compatibility (Chrome/Firefox/Safari)\n- Responsive layout (Mobile/Tablet/Desktop)\n- SSR/SSG hydration consistency\n- Accessibility (a11y)\n- SEO verification\n\n### Scenario C: Backend + APP + Embedded\n\n| Layer                | Status    | Focus                                       |\n| :------------------ | :------ | :----------------------------------------- |\n| L1 (Unit)           | Required | Backend + App + Cluster/FSM/algorithms              |\n| L2-1 (Interface)    | Required | API contracts + C ABI + AxData protocol             |\n| L2-2 (Integration)  | Required | Backend integration + Device Wasm integration (Digital Twin) |\n| L2-3 (E2E)          | Required | App → Cloud → Hub(Wasm) → HAL full chain       |\n| L2-4 (Playground)   | Required | Web Simulator                     |\n| L3-1 (Contract)     | Required | Device/cloud/edge protocol contracts                           |\n| L3-2 (Cross-System) | Recommended | Multi-subsystem coordination (Security <-> AI <-> Push)                |\n| L4 (UAT)            | Required | Real hardware + Real App + Real cloud             |\n\n**Special focus areas**:\n\n- **HAL abstraction**: All hardware operations through HAL interfaces, Bazel `select` switches at build time\n- **Wasm simulation fidelity**: Digital Twin behavioral consistency with real hardware\n- **Memory safety**: ASan/TSan/Valgrind verification (resource-constrained platforms)\n- **Software Update**: Version upgrade/downgrade/interrupted recovery verification\n- **Network disruption resilience**: Local autonomy capability when nodes are offline\n- **D2D communication**: Device-to-device direct interaction verification\n\n---\n\n## Step 4: Generate Test Plan Documentation\n\n### Document Directory Structure\n\n```\ndocs/testing/\n├── strategy.md                   # Test plan overview (SSOT, ≤400 lines)\n└── scenarios/                    # Scenario matrices (split when strategy.md is too long)\n    ├── ep1-<epic-name>.md        # By Epic (product perspective): User Story → AC scenario traceability\n    ├── ep2-<epic-name>.md\n    ├── tech-<module>.md          # By technical module (developer perspective): service/component traceability\n    └── tech-nfr.md               # NFR degradation/fault tolerance\n```\n\n> Epic files are for product/QA audiences (organized by User Story); technical files are for developers (organized by module). **Both file types share the same set of case IDs** for bidirectional traceability.\n\n### strategy.md Template\n\n```markdown\n# <Project Name> Test Plan\n\n## 1. Test Layer Overview\n\n| Layer | Case Count | Test Goal | Real Dependencies | Mock Dependencies | Real Infra | Mock Infra | Execution Timing | Duration | Code Location |\n|------|-------|---------|---------|----------|-----------|-----------|---------|------|---------|\n\n> 10-column standard table — real dependencies vs mock dependencies is the core decision basis for layering.\n\n### 1.1 Layering Logic\n\n| Layer | Core Problem Solved | Why the Layer Above Is Insufficient |\n|------|-------------|--------------|\n\n> L2 vs L3 boundary: L2 = single application, no external dependencies (all mocked); L3 = real dependency integration.\n\n### 1.2 Shift-Left Principle\n\n| Verification Point | First Appearing Layer | Notes |\n|--------|-------------|------|\n\nProhibited anti-patterns:\n- No verifying logic at L3 that should be covered at L1\n- No omitting L3 User Story AC cases just because \"L1/L2 already tested it\"\n\n## 2. Mock Infrastructure (SSOT)\n\nMock infrastructure is managed by the `mock-engine` skill (start/stop mock services, load test data, create test scenarios).\n\n[mock directory structure + WireMock per-layer switching strategy table]\n\n| External System | L2 Handling | L3 Handling |\n|---------|-----------|-----------|\n\n## 3. L2 Integration Tests\n\n> L1 unit tests co-exist with code and are not listed case-by-case in this plan.\n\nDetailed cases in [scenarios/tech-<module>.md].\n\n## 4. L3 E2E Tests (Black-Box)\n\n> Test client interacts through the user interface — **no intermediate layer interception**.\n\nDetailed cases in [scenarios/ep*.md] (by User Story) and [scenarios/tech-*.md] (by module).\n\n## 5. L4 Acceptance Criteria\n\n| Acceptance Item | User Story | Execution Method | Pass Criteria |\n|--------|----|---------|----|\n\n## 6. Requirements Traceability Matrix\n\n| User Story | L1 | L2-1 | L2-2 | L3-1 | L3-2 | L4 |\n|------------|----|------|------|------|------|-----|\n\n> Each column is filled with specific case IDs. L1 lists covered logic points (co-exists with code, no case IDs).\n\n## 7. Test Scenario Data\n\n| Scenario Name | Purpose | DB Initial State | Covered Cases |\n|--------------|------|-----------|---------|\n\n> Each Scenario = DB seed data + Mock stub configuration. Switch with `make mock-scenario SCENARIO=<name>`.\n\n## 8. CI/CD Automation Pipeline + Quality Gates\n\n| Gate | Checkpoint | Criteria |\n|------|-------|------|\n```\n\n### Scenario File Template (scenarios/*.md)\n\nEpic files and technical files share the **AC-level traceability table**:\n\n```markdown\n## US-TP-01 Device Card Badge\n\n| AC Scenario | Smoke | L1 | L2-1 | L2-2 | L3-1 | L3-2 | L4 |\n|---------|-------|----|------|------|------|------|-----|\n| Show locked badge when unsubscribed | fire | TestClass | CONTRACT-001 | EVAL-001 | FG01-001 | TP01-001 | pass |\n```\n\n> Fixed 8 columns. Each cell is filled with a **specific case ID**; use `-` when not covered. fire = smoke case.\n> **Complete real-world example**: See `references/engagement-example.md` (includes directory structure, table format, mock architecture, semantics annotation conventions, etc.).\n\n---\n\n## Step 5: Write Test Code\n\n### 5.1 Test Case ID Convention\n\n- L1: `L1-<MODULE>-NNN` (e.g., `L1-AUTH-001`)\n- L2: `L2-<MODULE>-NNN` (e.g., `L2-CRED-001`)\n- L3: `L3-<FLOW>-NNN` (e.g., `L3-COMP-001`)\n- L3-k8s: `L3k8s-<FLOW>-NNN`\n- L4: `L4-<FLOW>-NNN`\n\n### 5.2 Universal Test Templates\n\nCode templates for each tech stack are in **`references/code-templates.md`** (Go / Java / Flutter / React / C++ / Playwright / Flutter Web+Playwright / Wasm Digital Twin).\n\n### 5.3 Key Test Patterns\n\n#### Promise Resolver Pattern (Async Verification)\n\n```typescript\n// Correct: event-driven\nawait waitFor(() => shadowUpdates.get(\"panel_status\") === \"armed_away\");\n\n// Wrong: never use setTimeout\nawait new Promise((resolve) => setTimeout(resolve, 3000));\n```\n\n> Embedded-specific patterns (State-Wait, Forced Cycle) are in `references/code-templates.md`.\n\n#### Test Scenario Data Management\n\nSwitch preset test data states via `make mock-scenario` for controlled, repeatable test input:\n\n```bash\nmake mock-scenario SCENARIO=new-user        # No history\nmake mock-scenario SCENARIO=returning-user   # Has past interaction history\nmake mock-scenario SCENARIO=converted-user   # Has completed conversion\n```\n\nEach Scenario = a set of DB seed data + Mock stub configuration. Playwright tests specify the scenario via URL parameter (`?scenario=new-user`) or environment variable, integrating seamlessly with CI.\n\n#### WireMock Fault Injection\n\nInject fault scenarios via WireMock to verify service degradation behavior:\n\n```json\n// Inject 5s delay → Expected: service degrades and returns HTTP 200 with empty list\n{ \"request\": { \"method\": \"POST\", \"urlPattern\": \"/api/eval\" },\n  \"response\": { \"fixedDelayMilliseconds\": 5000, \"status\": 200 } }\n\n{ \"request\": { \"method\": \"GET\", \"urlPattern\": \"/v1/features/.*\" },\n  \"response\": { \"status\": 500 } }\n```\n\n---\n\n## Step 6: CI/CD Automation Configuration\n\nThe CI pipeline is organized by test layer into stages: `test-l1` (every commit) → `test-l2` (Nightly/Merge) → `test-e2e` (Release) → `quality` (coverage). The complete `.gitlab-ci.yml` template is in `references/code-templates.md`.\n\n### Quality Gates\n\n| Gate         | Checkpoint             | Criteria                    |\n| :----------- | :----------------- | :---------------------- |\n| **CI Gate**  | L1                 | 100% pass, coverage ≥ 80% |\n| **Nightly**  | L2 + L3            | 100% pass               |\n| **Release**  | L1 + L2 + L3 + L4  | 100% pass               |\n| **Memory Safety** | ASan/TSan (Embedded) | 0 errors                  |\n| **Code Quality** | SonarQube          | Quality Gate pass       |\n\n---\n\n## Step 7: TDD Debugging Workflow\n\n> **Manual browser debugging is prohibited** — bugs must be reproduced and verified through test cases\n\n### 1. Reproduce (Red)\n\nSelect the test tool based on bug layer:\n\n| Bug Type     | Test Layer | Tools                          |\n| :----------- | :------- | :---------------------------- |\n| Backend business logic | L1       | Go Test / JUnit / GTest       |\n| API interface     | L2-1     | Interface test + Mock               |\n| Frontend component     | L1       | Vitest / Jest / flutter_test  |\n| Frontend-backend integration   | L2-2     | Docker Compose + Integration  |\n| Full chain       | L2-3     | Playwright / Simulator        |\n| Embedded logic   | L1       | GTest + Mock HAL              |\n| Wasm/Browser | L2-2     | Vitest Browser (Digital Twin) |\n\nWrite a reproduction test → run to confirm it **fails**\n\n### 2. Fix (Green)\n\nAnalyze test logs → fix code → run to confirm it **passes**\n\n### 3. Verify (Refactor)\n\nRun the full test suite to confirm no regressions; retain the test case as regression protection.\n\n---\n\n## Examples\n\n### Bad — Test strategy missing layering\n\n```yaml\nstages: [build, test]\ntest:\n  script: [go test ./..., flutter test, npm run test]\n# Problem: no layering, no gates, L1 failures cannot be quickly pinpointed\n```\n\n### Good — Layered pipeline (complete template in `references/code-templates.md`)\n\n```yaml\nstages: [build, test-l1, test-l2, test-e2e, quality]\n# Each layer has its own stage, trigger rules, and gates\n```\n\n### Bad — Non-standard debugging approach\n\n```typescript\n// Manual setTimeout wait — unreliable and fragile\nawait new Promise((resolve) => setTimeout(resolve, 3000));\nconsole.log(\"manually check the browser to see if it's working\"); // Manual browser debugging prohibited\n```\n\n### Good Example — Event-driven async verification\n\n```typescript\n// Using Promise Resolver Pattern for precise state change waiting\nawait waitFor(() => shadowUpdates.get(\"panel_status\") === \"armed_away\");\nexpect(shadowUpdates.get(\"panel_status\")).toBe(\"armed_away\");\n```\n\n---\n\n## Checklist\n\n- [ ] Project type identified\n- [ ] Test layer architecture defined\n- [ ] Test plan document generated (`docs/<project>_test_plan.md`)\n- [ ] Test case IDs at each layer consistent with the plan\n- [ ] L1 covers core logic + boundary conditions\n- [ ] L2-1 covers API contracts / ABI interfaces\n- [ ] L2-2 covers critical integration paths\n- [ ] L2-3 covers core User Story end-to-end paths\n- [ ] Requirements traceability matrix established (User Story → Test Case)\n- [ ] CI/CD pipeline configured with quality gates\n- [ ] All bug fixes have reproduction test cases\n\n## References\n\n- [Quality Assurance and Layered Testing Strategy](https://docs.example.com/wiki/reference)\n- [Subsystem Universal Layered Testing Strategy and Practice Guide](https://docs.example.com/wiki/reference)\n- [TDD-Driven Development Skill](../tdd/SKILL.md)","tags":["testing","strategy","enterprise","harness","engineering","addxai","agent-skills","ai-agent","ai-engineering","claude-code","code-review","cursor"],"capabilities":["skill","source-addxai","skill-testing-strategy","topic-agent-skills","topic-ai-agent","topic-ai-engineering","topic-claude-code","topic-code-review","topic-cursor","topic-devops","topic-enterprise","topic-sre","topic-windsurf"],"categories":["enterprise-harness-engineering"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/addxai/enterprise-harness-engineering/testing-strategy","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add addxai/enterprise-harness-engineering","source_repo":"https://github.com/addxai/enterprise-harness-engineering","install_from":"skills.sh"}},"qualityScore":"0.458","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 16 github stars · SKILL.md body (22,482 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T01:02:13.102Z","embedding":null,"createdAt":"2026-04-21T19:04:02.686Z","updatedAt":"2026-04-22T01:02:13.102Z","lastSeenAt":"2026-04-22T01:02:13.102Z","tsv":"'-001':1969,1971,1973,1975 '-1':260,1225,1256,1329,1364,1420,1458,1858,1862,1953,1957,2372,2609 '-2':1232,1265,1338,1374,1430,1465,1860,1864,1955,1959,2388,2406,2616 '-3':1240,1348,1441,2395,2622 '-4':1248,1357,1452 '/api/eval':2239 '/tdd/skill.md':2679 '/v1/features':2249 '/wiki/reference)':2662,2673 '0':1187,2318 '001':1139,1169,2031,2039,2047 '01':1944 '1':77,179,183,361,1634,2345 '1.1':1672 '1.2':1701 '10':152,1656 '100':263,2298,2305,2312 '2':96,203,422,1740,2420 '2.1':427 '2.2':462 '2.3':607 '2.4':666 '2.5':821 '2.6':943 '20':141 '200':2231,2244 '3':213,1193,1779,2433 '3000':2112,2531 '4':224,1547,1807 '400':1561 '5':237,1108,1838,2015 '5.1':2019 '5.2':2056 '5.3':2081 '500':2252 '5000':2242 '5s':2223 '6':254,1850,2254 '7':267,1887,2327 '70':131 '8':280,1914,1978 '80':208,569,2301 '9':337 '90':212,573 'a11y':1402 'abi':1426,2613 'abstract':414,1490 'ac':1580,1732,1936,1948 'ac-level':1935 'accept':181,460,824,857,1032,1840,1842 'access':1401 'across':681,1174 'adapt':58,1195 'add':1055 'agent':1161,1170,1181 'ai':1475 'algorithm':540 'aliv':991 'alreadi':1737 'analyz':2423 'annot':2011 'anti':1714 'anti-pattern':1713 'api':166,394,497,655,690,699,709,874,1228,1244,1262,1332,1345,1352,1370,1423,2369,2611 'apns/fcm':1294 'app':23,27,47,51,388,391,407,509,519,644,645,697,698,715,717,1211,1221,1243,1280,1303,1408,1417,1444,1483 'appear':1709 'appium':702 'applic':1691 'approach':2517 'approv':878 'architectur':14,56,426,432,2009,2584 'archiv':1176 'archival.items':1186 'area':1286,1391,1488 'arm':2100,2569,2576 'asan/tsan':2316 'asan/tsan/valgrind':1515 'ask':365 'assert':931,938,1153,1184 'assur':2655 'async':1131,1158,2088,2552 'audienc':1603 'auth':2030 'auto':368,605,856,1030,1147 'auto-detect':367 'auto-discov':604 'autom':832,871,1033,1916,2256 'autonomi':1531 'await':1177,2095,2106,2525,2564 'away':2101,2570,2577 'axdata':1427 'b':1314 'backend':22,24,26,46,48,50,387,398,406,494,638,696,706,714,743,1210,1218,1235,1261,1315,1323,1341,1369,1407,1416,1433,2361,2385 'bad':2453,2512 'badg':1947,1963 'base':18,42,1197,2352 'bash':2144 'basi':1669 'bazel':412,1497 'behavior':1508,2220 'belong':374,1122 'bidirect':1627 'black':283,296,727,1812 'black-box':282,295,726,1811 'boundari':505,561,622,632,1688,2606 'box':284,297,728,1813 'broken':1014 'browser':250,402,663,708,724,1351,1387,1392,2332,2408,2536,2544 'browser/app':741 'bt':438 'bug':88,240,2336,2354,2356,2647 'build':1501,2460,2491 'built':69 'busi':503,1031,1219,1324,2362 'bypass':313 'c':1406,1425,2073 'c/c':411 'cannot':2478 'capabl':1532 'card':898,1946 'case':226,230,248,274,590,592,973,976,996,1019,1041,1054,1063,1072,1085,1101,1121,1144,1148,1624,1639,1733,1796,1798,1803,1826,1872,1885,1898,1987,1995,2021,2344,2448,2593,2639,2652 'case-by-cas':589,1795 'cell':1981 'chain':161,680,747,1246,1354,1450,2393 'chang':1371,2562 'check':904,2534 'checklist':2578 'checkpoint':1921,2293 'chrome/firefox/safari':1394 'ci':255,1025,2207,2259,2295 'ci/cd':63,1915,2255,2640 'client':301,740,842,888,1165,1815 'cloud':718,1445,1485 'cluster':537 'cluster/fsm/algorithms':1418 'co':599,1787,1880 'co-exist':1786,1879 'co-loc':598 'code':60,85,474,602,1654,1790,1883,2018,2060,2320,2427 'cold':1304 'collabor':617 'column':1657,1867,1979 'command':355,979 'commit':266,2272 'common':1090 'communic':1538 'comp':1138,2046 'compat':403,1372,1393 'complet':10,38,187,679,1134,1996,2176,2284,2485 'compon':316,778,1334,2377 'component/hook':521 'components/hooks/store':529 'components/store':1327 'compos':642,2390 'condit':506,562,922,1302,2607 'configur':64,1906,2188,2257,2642 'confirm':2417,2430,2442 'connect':748 'consist':1400,1509,2598 'console.log':2532 'constrain':1519 'content':1189 'contract':136,138,395,480,483,508,1229,1257,1263,1333,1365,1424,1459,1463,1968,2612 'control':357,2140 'convent':228,2012,2023 'convers':1175,2177 'convert':2173 'converted-us':2172 'coordin':1273,1382,1473 'core':65,209,570,1667,1676,2604,2624 'correct':470,2091 'cost':95 'count':1640 'cover':558,1724,1876,1897,1992,2603,2610,2617,2623 'coverag':204,207,568,2282,2300 'creat':1066,1760 'cred':2038 'criteria':858,1081,1841,1849,1922,2294 'critic':987,1061,1091,1142,2618 'critical-path':1060 'cross':158,453,630,669,945,1267,1376,1467 'cross-lay':944 'cross-servic':157,452,668 'cross-system':1266,1375,1466 'cycl':2121 'cypress':713 'd2d':1537 'daili':813 'data':340,517,526,1311,1759,1890,1903,2127,2132,2185 'databas':744 'db':700,710,1894,1901,2183 'db/letta/external':913 'db/mq':1237 'db/network/hal/filesystem':223,557 'db/redis/kafka':640 'db/redis/mq/vault':626 'debug':239,251,2329,2333,2516,2545 'decis':1668 'def':1132,1159 'defin':191,2585 'degrad':2219,2227 'degradation/fault':1596 'delay':2224 'deliveri':902 'depend':222,487,556,793,1644,1646,1661,1664,1694,1699 'deploy':1005 'descript':33 'design':848 'detail':1802,1825 'detect':369 'determin':377,1201 'develop':80,580,814,1590,1612,2677 'devic':303,659,1278,1297,1435,1540,1542,1945 'device-to-devic':1539 'device/cloud/edge':1461 'digit':417,664,1438,1506,2079,2409 'direct':305,1543 'directori':1553,1764,2004 'discov':606 'disrupt':1528 'doc':2590 'docker':641,2389 'docs.example.com':2661,2672 'docs.example.com/wiki/reference)':2660,2671 'docs/testing':1555 'document':597,1551,1552,2588 'driven':2094,2551,2676 'durat':1653 'e.g':768,798,1077,2027,2035,2043 'e2e':151,455,671,1143,1241,1349,1442,1809,2279,2500 'earlier':87 'effect':935 'embed':28,52,408,536,658,716,1409,2114,2317,2398 'embedded-specif':2113 'empti':2233 'end':292,294,673,675,1288,1290,2628,2630 'end-to-end':291,672,1287,2627 'engin':1752 'entir':830 'entri':1098 'environ':176,797,873,896,909,1036,1150,1254,1362,2202 'ep1':1572 'ep2':1583 'epic':1575,1598,1928 'equival':354 'error':563,2319 'establish':279,2635 'etc':627,2013 'eval':1970 'event':2093,2550 'event-driven':2092,2549 'everi':188,265,2271 'exampl':853,1119,1145,2000,2452,2548 'except':324,760 'execut':16,575,850,1651,1846 'exist':968,1058,1788,1881 'expect':864,2225,2571 'experi':919 'extern':221,327,555,1693,1773 'extrem':920 'fail':2419 'failur':2477 'fast':1104 'fault':2209,2212 'featur':1011 'feedback':133,145,156,581 'feishu':897 'fg01':1972 'fidel':1505 'file':1069,1599,1609,1617,1924,1929,1932 'fill':1869,1983 'fire':1966,1993 'first':1708 'fix':94,241,1977,2421,2426,2648 'fixeddelaymillisecond':2241 'flutter':410,510,513,703,2071,2075,2381,2466 'flutter/rn':390 'focus':386,493,917,1214,1285,1319,1390,1412,1487 'follow':231 'forc':2120 'form':964 'format':236,2007 'found':90 'four':430 'four-lay':429 'fragil':2524 'frontend':653,742,1260,1326,1344,1368,2376,2384 'frontend-backend':1259,1367,2383 'fsm':539 'full':160,746,1007,1245,1353,1449,2392,2438 'full-chain':745 'function/class/state':476 'gate':205,257,1027,1919,1920,2291,2292,2296,2324,2475,2511,2645 'gateway':770 'generat':8,36,423,1548,2589 'get':2247 'gitlab-ci.yml':2285 'go':499,2069,2365,2464 'go/java':389,400,409 'goal':466,614,676,1642 'good':2482,2547 'graph':437 'green':2422 'gtest':541,2368,2401 'guid':2670 'hal':413,543,546,660,721,1448,1489,1495,2403 'handl':564,1776,1778 'hardwar':1481,1492,1512 'histor':1010 'histori':2154,2166 'hour':154 'hour-level':153 'http':2230 'hub':719,1446 'hydrat':1399 'i/o':486 'id':227,1182,1625,1873,1886,1988,2022,2594 'ideal':125 'identifi':362,2581 'immedi':1003 'includ':53,134,162,478,685,2003 'independ':683 'infra':1648,1650 'infrastructur':1742,1745 'initi':1895 'inject':2210,2211,2222 'input':359,862,2143 'insuffici':1684 'integr':140,448,612,648,704,1233,1238,1339,1343,1431,1434,1437,1700,1781,2204,2386,2391,2619 'interact':304,547,843,928,1544,1816,2165 'intercept':310,749,1824 'interfac':135,309,479,507,1226,1330,1336,1421,1496,1820,2370,2373,2614 'intermedi':318,754,1822 'intern':315,777 'irreplac':1097 'isol':215 'item':1843 'java':2070 'jest':523,531,2380 'json':2221 'junit':501,2367 'k8s':169,785,796,807,811,818,2050 'k8s/minikube':175 'key':75,994,1051,2082 'keyword':1183 'l':233 'l1':105,129,200,206,216,258,434,439,440,463,550,582,970,1016,1215,1320,1413,1726,1783,1856,1874,1951,2024,2025,2029,2270,2297,2308,2364,2378,2400,2476,2494,2602 'l1-auth':2028 'l1-l4':199,433,969 'l1/l2':82,1736 'l2':111,118,139,259,443,444,449,608,1017,1224,1231,1239,1247,1328,1337,1347,1356,1419,1429,1440,1451,1685,1689,1775,1780,1857,1859,1952,1954,2032,2033,2037,2275,2303,2309,2371,2387,2394,2405,2497,2608,2615,2621 'l2-cred':2036 'l3':124,150,168,170,286,450,451,456,667,730,784,806,809,817,995,1018,1059,1080,1117,1125,1129,1137,1255,1264,1363,1373,1457,1464,1687,1697,1720,1729,1777,1808,1861,1863,1956,1958,2040,2041,2045,2049,2304,2310 'l3-comp':1136,2044 'l3-k8s':167,783,805,816,2048 'l3/l4':281 'l3k8s':2051 'l4':177,201,288,435,457,458,822,827,855,869,881,971,1040,1045,1146,1157,1167,1274,1383,1477,1839,1865,1960,2053,2054,2311 'l4-auto':854 'l4-manual':880 'l4-ms':1166 'layer':5,13,30,39,55,173,184,202,234,319,424,431,755,788,946,959,1207,1212,1317,1346,1410,1636,1638,1671,1673,1675,1681,1710,1769,1823,2265,2355,2359,2457,2473,2483,2503,2583,2597,2657,2665 'layout':1396 'leav':108,121 'left':79,1704 'len':1185 'letta':1164 'letta_client.archival':1178 'level':144,155,1937 'librari':211,572 'line':1562 'list':588,1794,1875,2234 'llm':929,940 'load':1757 'loadabl':347 'local':1530 'locat':600,1655 'lock':1962 'log':2425 'logic':210,469,496,512,522,533,538,571,1220,1325,1674,1718,1877,2363,2399,2605 'login':1298 'long':1571 'lower':92 'machin':477 'make':349,866,1000,1020,1042,1909,2135,2145,2155,2167 'manag':341,516,525,535,1223,1747,2128 'manual':249,831,845,882,892,2331,2519,2533,2543 'mark':803 'markdown':1631,1940 'marker':967,1076 'matric':59,1565 'matrix':276,1196,1853,2634 'may':333,772 'md':1573,1584,1586,1806,1829,1835,1927 'mean':975 'memori':548,876,1162,1179,1513,2314 'merg':1024 'mermaid':436 'messag':901 'method':851,1847,2236,2246 'middlewar':149,625 'millisecond':132,574 'min':1109 'minut':143 'minute-level':142 'miss':2456 'mobile/tablet/desktop':1397 'mock':214,219,311,351,542,553,646,650,654,751,782,916,1253,1645,1649,1663,1696,1741,1744,1751,1755,1763,1904,1911,2008,2137,2147,2157,2169,2186,2375,2402 'mock-engin':1750 'mock-scenario':350,1910,2136,2146,2156,2168 'mode':1310 'modul':616,1589,1615,1837 'move':1111 'ms':1168 'msw':656 'multi':1271,1296,1380,1471 'multi-devic':1295 'multi-subsystem':1270,1379,1470 'multipl':682,1075 'must':185,190,218,242,261,277,289,345,779,1102,2337 'name':1892 'need':585 'network':921,1527 'never':2103 'new':957,1067,2107,2151,2199,2526 'new-us':2150,2198 'nfr':1595 'night':2302 'nightly/merge':2276 'nightly/pre-release':820 'nnn':235,2026,2034,2042,2052,2055 'node':1534 'non':2514 'non-standard':2513 'normal':559 'note':1711 'notif':397,1292 'npm':2468 'offlin':1309,1536 'omit':1728 'openapi/protobuf':1230 'oper':1493 'option':789,1204,1269,1378 'organ':1604,1613,2262 'otherwis':1110 'output':865,941 'overview':1559,1637 'owner':905 'panel':2098,2567,2573 'paramet':2196 'parti':165,330,689,766,841,887,926 'pass':262,1106,1848,1976,2299,2306,2313,2325,2432 'past':2164 'path':560,930,988,1062,1092,2620,2631 'pattern':1715,2084,2087,2116,2558 'payment':769 'per':1768 'per-lay':1767 'perform':1308 'persist':877,1163 'perspect':737,1577,1591 'philosophi':66 'pinpoint':2481 'pipelin':1917,2260,2484,2641 'plan':12,17,596,1550,1558,1633,1801,2587,2601 'platform':1520 'playground':1249,1358,1453 'playwright':712,725,1355,2074,2077,2189,2396 'playwright/appium/real':302 'pm':908 'pod':799 'point':1099,1707,1878 'portion':1038 'post':2237 'pr':1023 'practic':2669 'precis':2560 'prefer':1173 'preset':2130 'primari':834 'principl':76,729,849,1052,1705 'problem':1677,2471 'process':1283 'product':1576 'product/qa':1602 'prohibit':253,321,757,1712,2335,2546 'project':20,44,189,363,373,488,633,691,1199,2579 'promis':2085,2108,2527,2556 'prop':1335 'proport':128 'protect':2451 'protocol':1428,1462 'purpos':1893 'push':97,396,701,1291,1476 'pyramid':127 'pytest':502,603 'pytest.mark':1079,1128,1156 'pytest.mark.smoke':1056,1078,1130 'python':1118 'qa':891,906 'qualiti':67,256,1026,1918,2281,2290,2321,2323,2501,2644,2654 'quantifi':860,1037 'quick':982,2480 'race':1301 'react':2072 'react/vue':401 'real':148,578,624,686,763,838,884,895,910,912,923,1035,1277,1386,1480,1482,1484,1511,1643,1647,1660,1698,1998 'real-tim':577 'real-world':1997 'recommend':1203,1250,1258,1359,1366,1385,1469 'recoveri':802,1525 'red':2347 'refactor':2435 'refer':2653 'references/code-templates.md':2068,2124,2289,2488 'references/engagement-example.md':2002 'refresh':1300 'regress':950,1006,1008,1021,2444,2450 'regular':1114 'releas':1048,1049,2280,2307 'rememb':1171 'render':532,900 'repeat':358,2141 'replac':336 'reproduc':2339,2346 'reproduct':246,2413,2650 'request':2235,2245 'requir':174,268,837,883,1202,1217,1227,1234,1242,1276,1322,1331,1340,1350,1415,1422,1432,1443,1454,1460,1479,1851,2632 'resili':1529 'resolv':2086,2109,2111,2528,2530,2557 'resourc':1518 'resource-constrain':1517 'respons':1395,2240,2250 'retain':844,2445 'return':2161,2229 'returning-us':2160 'review':1282 'rn':520 'roundtrip':875,1135 'rule':182,504,2509 'run':962,978,1002,2415,2428,2436,2469 'safeti':549,1514,2315 'scenario':57,339,344,352,371,381,792,836,852,1194,1208,1313,1405,1563,1564,1581,1762,1889,1891,1900,1912,1913,1923,1926,1949,2126,2138,2148,2149,2158,2159,2170,2171,2179,2193,2197,2213 'scenarios/ep':1828 'scenarios/tech-':1805,1834 'schedul':800 'schema':137,482,498 'scope':194 'script':2463 'seamless':2205 'search':1180 'secur':1474 'see':2001,2538 'seed':1902,2184 'select':1083,1498,2348 'semant':2010 'seo':404,1403 'server':647,651 'servic':147,159,331,447,454,611,621,631,639,670,684,767,775,914,927,1236,1342,1756,2218,2226 'service/component':1592 'service/repository/domain':495 'set':1622,2181 'settimeout':2105,2110,2520,2529 'shadowupdates.get':2097,2566,2572 'share':1619,1933 'shift':78,1703 'shift-left':1702 'show':1961 'side':934 'simul':416,722,1456,1504,2397 'singl':146,446,610,620,1071,1690 'single-servic':445,609 'skill':35,1753,2678 'skill-testing-strategy' 'smallest':473 'smoke':949,981,999,1001,1053,1084,1100,1127,1950,1994 'softwar':419,1521 'solv':1678 'sonarqub':2322 'sourc':977 'source-addxai' 'special':385,1284,1389,1486 'specif':939,1154,1871,1986,2115 'specifi':2191 'split':1566 'spot':801 'sse':711 'ssot':1560,1743 'ssr':405 'ssr/ssg':1398 'stack':380,384,2065 'stage':180,872,911,1034,1149,1361,2267,2459,2490,2507 'standard':552,1658,2515 'start':243,1305,1307 'start/stop':1754 'state':515,524,534,544,565,1222,1896,2118,2133,2561 'state-wait':2117 'status':1213,1318,1411,2099,2243,2251,2568,2574 'step':360,421,1192,1546,2014,2253,2326 'store':1281 'stori':272,1579,1607,1731,1832,1845,1855,2626,2637 'storybook':1360 'strategi':3,7,32,41,1771,2455,2659,2667 'strategy.md':1556,1568,1629 'structur':932,1554,1765,2005 'stub':335,774,1905,2187 'sub':172,787 'sub-lay':171,786 'subsystem':1272,1381,1472,2663 'suffici':1191 'suit':948,954,963,974,2440 'swagger':1251 'switch':1499,1770,1907,2129 'sync':1312 'system':989,1094,1268,1377,1468,1774 'tabl':1659,1772,1939,2006 'tag':966,997,1050 'target':491,567,636,694 'tdd':238,2328,2675 'tdd-driven':2674 'team':907 'tech':379,383,1585,2064 'tech-nfr.md':1594 'technic':1588,1608,1931 'templat':61,1630,1925,2059,2061,2286,2486 'test':2,6,11,31,40,54,72,83,103,116,126,193,217,225,247,273,285,298,300,338,343,393,425,442,461,465,490,500,514,595,613,635,649,693,705,731,739,791,825,846,868,893,947,958,972,1044,1068,1116,1133,1160,1279,1388,1549,1557,1632,1635,1641,1738,1758,1761,1782,1785,1810,1814,1888,2017,2020,2058,2083,2125,2131,2142,2190,2264,2269,2274,2278,2343,2350,2358,2366,2374,2382,2414,2424,2439,2447,2454,2461,2462,2465,2467,2470,2493,2496,2499,2582,2586,2592,2638,2651,2658,2666 'test-e2e':2277,2498 'test-l1':2268,2492 'test-l2':2273,2495 'test-l3':1115 'test-l4-uat':867,1043 'test_plan.md':2591 'testclass':1967 'testcontain':643 'testing-strategi':1 'text':942,1155 'third':164,329,688,765,840,886,925 'third-parti':163,328,687,764,839,885,924 'three':953 'time':579,980,1502,1652 'tobe':2575 'token':1299 'toler':1597 'tool':196,492,637,695,2351,2360 'topic-agent-skills' 'topic-ai-agent' 'topic-ai-engineering' 'topic-claude-code' 'topic-code-review' 'topic-cursor' 'topic-devops' 'topic-enterprise' 'topic-sre' 'topic-windsurf' 'tp':1943 'tp01':1974 'traceabl':269,275,1582,1593,1628,1852,1938,2633 'transform':518,527 'transit':545,566 'trigger':2508 'twin':418,665,1439,1507,2080,2410 'two':74 'type':21,45,364,489,634,692,847,1200,1618,2357,2580 'typescript':2090,2518,2554 'typic':382 'uat':178,826,870,951,1029,1046,1275,1384,1478 'uat-auto':1028 'ui':392,899,1252 'uncontrol':326,762 'unit':130,441,464,475,1216,1321,1414,1784 'univers':4,29,428,2057,2664 'unreli':2522 'unsubscrib':1965 'updat':420,1522 'upgrade/downgrade/interrupted':1524 'url':2195 'urlpattern':2238,2248 'us':1942 'us-tp':1941 'use':334,623,773,808,815,1989,2104,2555 'user':271,308,459,735,823,918,1087,1172,1578,1606,1730,1819,1831,1844,1854,2152,2162,2174,2200,2625,2636 'valid':484,983 'variabl':2203 'verif':890,1293,1404,1516,1526,1545,1706,2089,2553 'verifi':467,615,677,1009,1717,2217,2341,2434 'version':1523 'via':348,2134,2194,2214 'visual':889,903 'vitest':530,657,662,723,2379,2407 'vs':1662,1686 'wait':2119,2521,2563 'waitfor':2096,2565 'warm':1306 'wasm':415,661,720,1436,1447,1503,2078 'wasm/browser':2404 'web':25,49,399,528,652,707,1316,1455,2076 'widget/bloc/provider':511 'wiremock':1766,2208,2215 'within':618 'without':485,629 'work':2542 'workflow':879,2330 'world':1999 'write':81,551,2016,2411 'wrong':2102 'yaml':2458,2489","prices":[{"id":"06196625-02e7-40e0-a95a-61710812a65f","listingId":"87d886f5-3575-4595-8652-30b7714beac8","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"addxai","category":"enterprise-harness-engineering","install_from":"skills.sh"},"createdAt":"2026-04-21T19:04:02.686Z"}],"sources":[{"listingId":"87d886f5-3575-4595-8652-30b7714beac8","source":"github","sourceId":"addxai/enterprise-harness-engineering/testing-strategy","sourceUrl":"https://github.com/addxai/enterprise-harness-engineering/tree/main/skills/testing-strategy","isPrimary":false,"firstSeenAt":"2026-04-21T19:04:02.686Z","lastSeenAt":"2026-04-22T01:02:13.102Z"}],"details":{"listingId":"87d886f5-3575-4595-8652-30b7714beac8","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"addxai","slug":"testing-strategy","github":{"repo":"addxai/enterprise-harness-engineering","stars":16,"topics":["agent-skills","ai-agent","ai-engineering","claude-code","code-review","cursor","devops","enterprise","sre","windsurf"],"license":"apache-2.0","html_url":"https://github.com/addxai/enterprise-harness-engineering","pushed_at":"2026-04-17T08:57:37Z","description":"Enterprise-grade AI Agent Skills for software development, DevOps, SRE, security, and product teams. Compatible with Claude Code, Cursor, Windsurf, Gemini CLI, GitHub Copilot, and 30+ AI coding agents.","skill_md_sha":"cd7f4a438242ee4827b60037313d5d839bcb7d91","skill_md_path":"skills/testing-strategy/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/addxai/enterprise-harness-engineering/tree/main/skills/testing-strategy"},"layout":"multi","source":"github","category":"enterprise-harness-engineering","frontmatter":{"name":"testing-strategy","description":"Universal layered testing strategy — generate a complete test plan, layered architecture, and execution plan based on project type (Backend+APP / Backend+WEB / Backend+APP+Embedded)"},"skills_sh_url":"https://skills.sh/addxai/enterprise-harness-engineering/testing-strategy"},"updatedAt":"2026-04-22T01:02:13.102Z"}}