hatch3r 1.7.0 → 1.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -12
- package/agents/hatch3r-a11y-auditor.md +4 -0
- package/agents/hatch3r-architect.md +5 -1
- package/agents/hatch3r-ci-watcher.md +4 -0
- package/agents/hatch3r-context-rules.md +4 -0
- package/agents/hatch3r-creator.md +4 -0
- package/agents/hatch3r-dependency-auditor.md +4 -0
- package/agents/hatch3r-devops.md +4 -0
- package/agents/hatch3r-docs-writer.md +4 -0
- package/agents/hatch3r-fixer.md +5 -1
- package/agents/hatch3r-handoff-loader.md +243 -0
- package/agents/hatch3r-handoff-preparer.md +134 -0
- package/agents/hatch3r-implementer.md +5 -1
- package/agents/hatch3r-learnings-loader.md +4 -0
- package/agents/hatch3r-lint-fixer.md +4 -0
- package/agents/hatch3r-perf-profiler.md +8 -0
- package/agents/hatch3r-researcher.md +5 -1
- package/agents/hatch3r-reviewer.md +92 -0
- package/agents/hatch3r-security-auditor.md +24 -0
- package/agents/hatch3r-test-writer.md +4 -0
- package/agents/modes/requirements-elicitation.md +5 -1
- package/agents/modes/similar-implementation.md +6 -0
- package/agents/modes/user-flows.md +76 -0
- package/agents/shared/quality-charter.md +129 -0
- package/agents/shared/user-question-protocol.md +95 -0
- package/commands/board/shared-azure-devops.md +2 -0
- package/commands/board/shared-github.md +17 -0
- package/commands/board/shared-gitlab.md +4 -0
- package/commands/hatch3r-board-fill.md +2 -1
- package/commands/hatch3r-board-pickup.md +1 -1
- package/commands/hatch3r-board-shared.md +21 -0
- package/commands/hatch3r-create.md +2 -0
- package/commands/hatch3r-handoff.md +126 -0
- package/commands/hatch3r-pr-resolve.md +672 -0
- package/commands/hatch3r-quick-change.md +5 -3
- package/commands/hatch3r-report.md +167 -0
- package/commands/hatch3r-revision.md +1 -1
- package/commands/hatch3r-workflow.md +3 -1
- package/dist/cli/index.js +3144 -979
- package/dist/cli/index.js.map +1 -1
- package/package.json +4 -2
- package/rules/hatch3r-accessibility-standards.md +21 -0
- package/rules/hatch3r-accessibility-standards.mdc +21 -0
- package/rules/hatch3r-agent-orchestration.md +32 -1
- package/rules/hatch3r-agent-orchestration.mdc +32 -1
- package/rules/hatch3r-ai-evals.md +158 -0
- package/rules/hatch3r-ai-evals.mdc +154 -0
- package/rules/hatch3r-ai-ux-patterns.md +131 -0
- package/rules/hatch3r-ai-ux-patterns.mdc +127 -0
- package/rules/hatch3r-api-design.md +67 -9
- package/rules/hatch3r-api-design.mdc +67 -9
- package/rules/hatch3r-api-versioning.md +119 -0
- package/rules/hatch3r-api-versioning.mdc +115 -0
- package/rules/hatch3r-auth-patterns.md +170 -0
- package/rules/hatch3r-auth-patterns.mdc +166 -0
- package/rules/hatch3r-component-conventions.md +30 -0
- package/rules/hatch3r-component-conventions.mdc +30 -0
- package/rules/hatch3r-container-hardening.md +131 -0
- package/rules/hatch3r-container-hardening.mdc +127 -0
- package/rules/hatch3r-contract-testing.md +117 -0
- package/rules/hatch3r-contract-testing.mdc +113 -0
- package/rules/hatch3r-deep-context.md +3 -1
- package/rules/hatch3r-deep-context.mdc +3 -1
- package/rules/hatch3r-dependency-management.md +73 -1
- package/rules/hatch3r-dependency-management.mdc +72 -0
- package/rules/hatch3r-design-system-detection.md +142 -0
- package/rules/hatch3r-design-system-detection.mdc +138 -0
- package/rules/hatch3r-event-schema-evolution.md +90 -0
- package/rules/hatch3r-event-schema-evolution.mdc +86 -0
- package/rules/hatch3r-handoff-readiness.md +45 -0
- package/rules/hatch3r-handoff-readiness.mdc +40 -0
- package/rules/hatch3r-i18n.md +13 -0
- package/rules/hatch3r-i18n.mdc +13 -0
- package/rules/hatch3r-iteration-summary.md +2 -0
- package/rules/hatch3r-iteration-summary.mdc +2 -0
- package/rules/hatch3r-migrations.md +61 -16
- package/rules/hatch3r-migrations.mdc +61 -16
- package/rules/hatch3r-observability-logging.md +1 -1
- package/rules/hatch3r-observability-logging.mdc +1 -1
- package/rules/hatch3r-observability-metrics.md +1 -1
- package/rules/hatch3r-observability-metrics.mdc +1 -1
- package/rules/hatch3r-observability-tracing-detail.md +1 -1
- package/rules/hatch3r-observability-tracing-detail.mdc +1 -1
- package/rules/hatch3r-observability-tracing.md +1 -1
- package/rules/hatch3r-observability-tracing.mdc +1 -1
- package/rules/hatch3r-observability.md +1 -0
- package/rules/hatch3r-observability.mdc +1 -0
- package/rules/hatch3r-operability.md +149 -0
- package/rules/hatch3r-operability.mdc +145 -0
- package/rules/hatch3r-passkey-server.md +181 -0
- package/rules/hatch3r-passkey-server.mdc +177 -0
- package/rules/hatch3r-progressive-delivery.md +120 -0
- package/rules/hatch3r-progressive-delivery.mdc +116 -0
- package/rules/hatch3r-resilience-patterns.md +154 -0
- package/rules/hatch3r-resilience-patterns.mdc +150 -0
- package/rules/hatch3r-secrets-management.md +29 -0
- package/rules/hatch3r-secrets-management.mdc +29 -0
- package/rules/hatch3r-testing.md +139 -43
- package/rules/hatch3r-testing.mdc +139 -43
- package/rules/hatch3r-ux-states-and-flows.md +149 -0
- package/rules/hatch3r-ux-states-and-flows.mdc +145 -0
- package/skills/hatch3r-a11y-audit/SKILL.md +14 -0
- package/skills/hatch3r-ai-feature/SKILL.md +134 -0
- package/skills/hatch3r-api-spec/SKILL.md +5 -0
- package/skills/hatch3r-architecture-review/SKILL.md +14 -0
- package/skills/hatch3r-bug-fix/SKILL.md +5 -0
- package/skills/hatch3r-ci-pipeline/SKILL.md +14 -0
- package/skills/hatch3r-cli-aichat/SKILL.md +84 -0
- package/skills/hatch3r-cli-ast-grep/SKILL.md +85 -0
- package/skills/hatch3r-cli-az-devops/SKILL.md +89 -0
- package/skills/hatch3r-cli-bat/SKILL.md +85 -0
- package/skills/hatch3r-cli-comby/SKILL.md +85 -0
- package/skills/hatch3r-cli-csvkit/SKILL.md +84 -0
- package/skills/hatch3r-cli-delta/SKILL.md +86 -0
- package/skills/hatch3r-cli-difftastic/SKILL.md +84 -0
- package/skills/hatch3r-cli-docker/SKILL.md +89 -0
- package/skills/hatch3r-cli-duckdb/SKILL.md +84 -0
- package/skills/hatch3r-cli-fd/SKILL.md +85 -0
- package/skills/hatch3r-cli-fzf/SKILL.md +84 -0
- package/skills/hatch3r-cli-gh/SKILL.md +90 -0
- package/skills/hatch3r-cli-glab/SKILL.md +89 -0
- package/skills/hatch3r-cli-jq/SKILL.md +85 -0
- package/skills/hatch3r-cli-lazygit/SKILL.md +78 -0
- package/skills/hatch3r-cli-llm/SKILL.md +84 -0
- package/skills/hatch3r-cli-miller/SKILL.md +84 -0
- package/skills/hatch3r-cli-mods/SKILL.md +84 -0
- package/skills/hatch3r-cli-overview/SKILL.md +60 -0
- package/skills/hatch3r-cli-playwright/SKILL.md +89 -0
- package/skills/hatch3r-cli-podman/SKILL.md +84 -0
- package/skills/hatch3r-cli-ripgrep/SKILL.md +85 -0
- package/skills/hatch3r-cli-rtk/SKILL.md +91 -0
- package/skills/hatch3r-cli-sd/SKILL.md +85 -0
- package/skills/hatch3r-cli-stagehand/SKILL.md +79 -0
- package/skills/hatch3r-cli-taplo/SKILL.md +84 -0
- package/skills/hatch3r-cli-xsv/SKILL.md +89 -0
- package/skills/hatch3r-cli-yq/SKILL.md +85 -0
- package/skills/hatch3r-cli-zstd/SKILL.md +85 -0
- package/skills/hatch3r-context-health/SKILL.md +14 -0
- package/skills/hatch3r-cost-tracking/SKILL.md +14 -0
- package/skills/hatch3r-customize/SKILL.md +14 -0
- package/skills/hatch3r-dep-audit/SKILL.md +14 -0
- package/skills/hatch3r-design-system-detect/SKILL.md +162 -0
- package/skills/hatch3r-feature/SKILL.md +2 -0
- package/skills/hatch3r-gh-agentic-workflows/SKILL.md +13 -0
- package/skills/hatch3r-handoff-prepare/SKILL.md +160 -0
- package/skills/hatch3r-handoff-resume/SKILL.md +171 -0
- package/skills/hatch3r-incident-response/SKILL.md +14 -0
- package/skills/hatch3r-issue-workflow/SKILL.md +5 -0
- package/skills/hatch3r-logical-refactor/SKILL.md +14 -0
- package/skills/hatch3r-migration/SKILL.md +14 -0
- package/skills/hatch3r-observability-verify/SKILL.md +133 -0
- package/skills/hatch3r-perf-audit/SKILL.md +14 -0
- package/skills/hatch3r-pr-creation/SKILL.md +14 -0
- package/skills/hatch3r-qa-validation/SKILL.md +18 -0
- package/skills/hatch3r-recipe/SKILL.md +14 -0
- package/skills/hatch3r-refactor/SKILL.md +14 -0
- package/skills/hatch3r-release/SKILL.md +14 -0
- package/skills/hatch3r-reliability-verify/SKILL.md +144 -0
- package/skills/hatch3r-ui-ux-verify/SKILL.md +136 -0
- package/skills/hatch3r-visual-refactor/SKILL.md +15 -1
package/rules/hatch3r-testing.md
CHANGED
|
@@ -12,17 +12,24 @@ cache_friendly: true
|
|
|
12
12
|
## Core Principles
|
|
13
13
|
|
|
14
14
|
- Unit tests: project test runner. Integration: test runner + emulators/mocks. E2E: browser automation (Playwright or equivalent).
|
|
15
|
-
- **Deterministic.** Mock time
|
|
16
|
-
- **Isolated.** Each test sets up and tears down its own state.
|
|
15
|
+
- **Deterministic.** Mock time, seed RNG, pin timezone/locale. See Determinism Contract below.
|
|
16
|
+
- **Isolated.** Each test sets up and tears down its own state. Vitest `isolate: true`; Jest `--runInBand` only for serialized DB tests.
|
|
17
17
|
- **Fast.** Unit tests < 50ms. Integration tests < 2s.
|
|
18
18
|
- **Named clearly.** Describe behavior: `"should award 15 XP for 25-min focus block"`.
|
|
19
19
|
- **Regression.** Every bug fix includes a test that fails before the fix and passes after.
|
|
20
|
-
- **No network.** Unit tests must not make network calls. Use mocks.
|
|
20
|
+
- **No network.** Unit tests must not make network calls. Use mocks or Testcontainers (pinned by digest).
|
|
21
21
|
- No type escape hatches in tests. No `.skip` without a linked issue.
|
|
22
22
|
- Write tests to `tests/unit/`, `tests/integration/`, `tests/e2e/`, or equivalent.
|
|
23
23
|
- Use test fixtures from `tests/fixtures/` or equivalent.
|
|
24
24
|
- **Browser verification.** For UI changes, verify visually in the browser via browser automation MCP after automated tests pass. Capture screenshots as evidence.
|
|
25
25
|
|
|
26
|
+
## Test Pyramid / Honeycomb / Trophy — Pick by Architecture
|
|
27
|
+
|
|
28
|
+
Pick exactly one shape and document it in `docs/testing.md` (or equivalent):
|
|
29
|
+
- **Pyramid** (heavy unit, light E2E): monoliths with rich domain logic.
|
|
30
|
+
- **Honeycomb** (heavy integration, light unit + E2E): microservices; ~48% of microservice teams (Spotify model).
|
|
31
|
+
- **Trophy** (unit + integration + E2E in similar ratios, light static): serverless functions; ~42% of serverless teams (Kent C. Dodds shape).
|
|
32
|
+
|
|
26
33
|
## Coverage Thresholds
|
|
27
34
|
|
|
28
35
|
- **Statement coverage:** 80% minimum across the project. New code must not decrease overall coverage.
|
|
@@ -33,6 +40,10 @@ cache_friendly: true
|
|
|
33
40
|
- Generate coverage reports in CI and publish as PR comments or artifacts for visibility.
|
|
34
41
|
- Exclude generated code, type declarations, and config files from coverage metrics.
|
|
35
42
|
|
|
43
|
+
## Coverage That Matters — Coverage AND Mutation
|
|
44
|
+
|
|
45
|
+
Coverage alone is necessary, not sufficient. A PR that raises line coverage but drops mutation score is a regression. Reviewers verify the right test classes per the Per-Feature Mandate Map below; coverage numbers are a floor, not a finish line.
|
|
46
|
+
|
|
36
47
|
## Mocking Strategy
|
|
37
48
|
|
|
38
49
|
- **Prefer fakes over mocks** for stateful dependencies (databases, caches). Fakes implement the real interface with in-memory state, making tests more realistic.
|
|
@@ -43,59 +54,144 @@ cache_friendly: true
|
|
|
43
54
|
- **Type-safe mocks.** Mock implementations must satisfy the same TypeScript interface as the real dependency. Avoid `as any` in mock setup.
|
|
44
55
|
- **No mocking the unit under test.** If you need to mock part of the module you are testing, the module has too many responsibilities — refactor first.
|
|
45
56
|
|
|
46
|
-
##
|
|
57
|
+
## Contract Testing
|
|
58
|
+
|
|
59
|
+
Every cross-service interaction is covered by both consumer-side (Pact) and provider-side (Schemathesis against the OpenAPI/AsyncAPI schema) contract tests. `pact-broker can-i-deploy` gates production deploys: if the consumer/provider contract pair is incompatible, the deploy is blocked. See `rules/hatch3r-contract-testing.md` for the full pattern (broker setup, provider state handlers, versioning, breakage triage).
|
|
60
|
+
|
|
61
|
+
## Property-Based Testing — Per Ecosystem
|
|
62
|
+
|
|
63
|
+
Required for any pure function, parser, serializer, state machine, or invariant-bearing function. Default 100 trials per property; raise to 1000 for security-sensitive code. Shrinking must be enabled.
|
|
64
|
+
|
|
65
|
+
- **TypeScript / JavaScript:** `fast-check` (latest 3.x). Use for pure functions, parsers, state machines (`fc.commands`).
|
|
66
|
+
- **Python:** `Hypothesis` 6.151+. Stateful PBT via `RuleBasedStateMachine`.
|
|
67
|
+
- **Rust:** `proptest`. Shrinks to minimal failing case.
|
|
68
|
+
- **Scala:** `ScalaCheck`. Use for case-class invariants.
|
|
69
|
+
- **Java:** `jqwik` (modern) or `junit-quickcheck`.
|
|
70
|
+
- **Go:** `gopter` or stdlib `testing/quick` (limited shrinking).
|
|
47
71
|
|
|
48
|
-
|
|
49
|
-
- **Priority targets:** parsers, serializers, validators, encoders/decoders, mathematical functions, and any pure function with complex input types.
|
|
50
|
-
- Define invariants as properties: round-trip (encode then decode equals original), idempotency (applying twice equals applying once), monotonicity, commutativity.
|
|
51
|
-
- Use `fc.assert` with at least 100 runs per property. Increase to 1000 for critical paths.
|
|
52
|
-
- When a property test finds a failure, add the minimal counterexample as a dedicated regression unit test.
|
|
53
|
-
- Shrinking must be enabled — it reduces failing inputs to the smallest reproduction case.
|
|
54
|
-
- Property tests belong alongside unit tests in `tests/unit/`. Name them clearly: `"property: round-trip serialization for UserProfile"`.
|
|
72
|
+
Invariants to encode: round-trip (encode then decode equals original), idempotency (applying twice equals once), monotonicity, commutativity. When a property test finds a failure, add the minimal counterexample as a dedicated regression unit test.
|
|
55
73
|
|
|
56
|
-
## Mutation Testing
|
|
74
|
+
## Mutation Testing — Per Ecosystem + Thresholds
|
|
57
75
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
- **
|
|
62
|
-
-
|
|
63
|
-
-
|
|
76
|
+
Run on a nightly schedule (not per-commit) due to runtime cost. Mutation score is a quality gate alongside coverage. Surviving mutants indicate tests that pass regardless of code changes — fix by adding assertions that detect the mutation.
|
|
77
|
+
|
|
78
|
+
- **TypeScript / JavaScript:** Stryker. Thresholds: break 50 / low 60 / high 80 (Stryker defaults).
|
|
79
|
+
- **Python:** `mutmut` (88.5% score on reference suite, faster) or `Cosmic Ray` (82.7%, thorough).
|
|
80
|
+
- **Java:** PIT 1.22 (November 2025). Business logic target 80–90.
|
|
81
|
+
- **Go:** `go-mutesting` or `gremlins-dev/gremlins`.
|
|
82
|
+
- **.NET:** `Stryker.NET`.
|
|
83
|
+
|
|
84
|
+
**Mutation score target:** 70% minimum on critical modules (auth, data layer, business rules), 60% project-wide, 80%+ on payment/billing logic. Exclude test files, generated code, and UI presentation logic from mutation analysis.
|
|
85
|
+
|
|
86
|
+
## Fuzz Testing — Per Ecosystem
|
|
87
|
+
|
|
88
|
+
Required for any parser, deserializer, network handler, file-format handler, or untrusted-input boundary. Crash + hang + OOM detection; corpus minimization; persisted crash inputs become regression fixtures.
|
|
89
|
+
|
|
90
|
+
- **Java:** jazzer (OSS-Fuzz integrated).
|
|
91
|
+
- **JavaScript:** jazzer.js OSS was discontinued in 2025 — fall back to property-based testing for JS-only paths, or fuzz the underlying native binding.
|
|
92
|
+
- **Python:** `atheris` (Google).
|
|
93
|
+
- **Rust:** `cargo-fuzz` + libFuzzer.
|
|
94
|
+
- **Go:** native `testing.F` (Go 1.18+); for advanced workflows use `gosentry` (Trail of Bits, 2026-05-12 fork of the discontinued jazzer.js workflow adapted for Go).
|
|
95
|
+
- **C / C++:** AFL++ + OSS-Fuzz.
|
|
96
|
+
|
|
97
|
+
## Determinism Contract
|
|
98
|
+
|
|
99
|
+
Every test must be deterministic. Mandates:
|
|
100
|
+
- **Clock injection.** Production code never calls `new Date()` / `time.Now()` / `datetime.now()` directly; inject a clock interface. In tests: `vi.useFakeTimers()` / `freezegun` / `mock.patch('time.time')`.
|
|
101
|
+
- **Seeded RNG.** Every random call uses an injected seedable RNG. In tests: fixed seed per test.
|
|
102
|
+
- **Pinned timezone and locale.** `TZ=UTC` and `LC_ALL=C.UTF-8` in the CI environment.
|
|
103
|
+
- **Sorted iteration.** Any test asserting on map / dict iteration order sorts first.
|
|
104
|
+
- **OS-assigned ports.** Never bind to a fixed port in tests — bind to `0` to get an OS-assigned port.
|
|
105
|
+
- **Test isolation.** Vitest `isolate: true` (default); Jest `--runInBand` only when needed for serialized DB tests.
|
|
64
106
|
|
|
65
107
|
## Flaky Test Handling
|
|
66
108
|
|
|
67
|
-
- **
|
|
68
|
-
- **Quarantine
|
|
69
|
-
- **
|
|
70
|
-
- **
|
|
71
|
-
- **
|
|
72
|
-
- **
|
|
73
|
-
- **
|
|
109
|
+
- **Detection.** CI retries failed tests once; tests failing on retry but passing on rerun are tagged `flake-suspected`.
|
|
110
|
+
- **Quarantine.** Any test that flakes twice in 7 days moves to `tests/quarantine/` (runs but does not block PRs). Issue auto-filed with the `flake` label.
|
|
111
|
+
- **SLA.** 14 days to root-cause and fix; otherwise the test is deleted. Quarantined tests reviewed weekly.
|
|
112
|
+
- **Retry policy.** Allow at most 1 automatic retry for the full test suite. Never silently retry individual tests — that masks flakiness.
|
|
113
|
+
- **Categorization on intake.** Tag each flake by root cause: timing (use fake timers), network (use mocks / Testcontainers), ordering (sort assertions), pollution (test isolation), resource (cleanup).
|
|
114
|
+
- **Fix patterns.** Replace `setTimeout` with fake timers; replace shared state with per-test setup; replace fixed ports with OS-assigned (`0`); seed random generators deterministically.
|
|
115
|
+
- **Metrics.** Track flaky rate over time. Target < 0.5% (flaky runs / total runs). Alert at 1%.
|
|
116
|
+
- **Cost awareness.** Datadog 2026 telemetry reports 6–8 hrs/eng/week lost to flakes when quarantine + SLA is not enforced.
|
|
117
|
+
|
|
118
|
+
## E2E Strategy
|
|
119
|
+
|
|
120
|
+
- **Playwright is the 2026 default** (95k stars, ~290 ms/action, native sharding via `--shard`). Use for cross-browser, accessibility (`@axe-core/playwright`), and visual regression (`toHaveScreenshot()`).
|
|
121
|
+
- Cypress requires paid Cloud for serious parallelization; WebdriverIO is the niche choice for web + mobile parity.
|
|
122
|
+
- Retry policy: `retries: 2` for transient infra; never `retries: >= 5` (masks bugs).
|
|
123
|
+
|
|
124
|
+
## Snapshot Testing
|
|
125
|
+
|
|
126
|
+
- **Use sparingly.** 2–4 snapshots per component max. Appropriate for serialized output (JSON API responses, CLI output, rendered HTML structure) where the exact output matters and is stable.
|
|
127
|
+
- **Not appropriate for:** UI component visual appearance (use visual regression tests via `toHaveScreenshot()` or `jest-image-snapshot`), objects with timestamps or random IDs (unstable), large objects (unreadable diffs).
|
|
128
|
+
- **Review discipline.** Snapshot updates (`--update-snapshots`) must be reviewed with the same rigor as code changes. Reviewers verify the new snapshot is intentionally correct, not just "different."
|
|
129
|
+
- **Keep snapshots small.** Files > 100 lines suggest the test is asserting too broadly. Narrow the assertion to the relevant subset.
|
|
130
|
+
- **Inline snapshots** are preferred over external `.snap` files for short outputs (< 20 lines) — keeps the assertion co-located with the test.
|
|
131
|
+
- **Design-system components:** Storybook + Chromatic.
|
|
74
132
|
|
|
75
133
|
## Test Data Management
|
|
76
134
|
|
|
77
|
-
- **Factories over fixtures.** Use factory functions (
|
|
78
|
-
- **Builder pattern example:** `buildUser({ role: "admin" })` returns a full valid User with admin role and
|
|
79
|
-
- **No shared mutable fixtures.** If multiple tests read the same fixture data, each test
|
|
80
|
-
- **Realistic data.**
|
|
81
|
-
- **Deterministic seeding.**
|
|
82
|
-
- **Fixture files** (JSON, YAML) are acceptable for large, complex, or externally-sourced
|
|
83
|
-
- **Database state:** Integration tests
|
|
135
|
+
- **Factories over fixtures.** Use factory functions (factory-bot for Ruby, Fishery for TS, factory-boy for Python) seeded with Faker pinned to a fixed version.
|
|
136
|
+
- **Builder pattern example:** `buildUser({ role: "admin" })` returns a full valid `User` with admin role and valid defaults for all other fields.
|
|
137
|
+
- **No shared mutable fixtures.** If multiple tests read the same fixture data, each test gets its own copy via `structuredClone()` or a factory function.
|
|
138
|
+
- **Realistic data.** Avoid magic strings like `"test"`, `"foo"`, `"abc123"`.
|
|
139
|
+
- **Deterministic seeding.** Seed generators per test file so failures reproduce.
|
|
140
|
+
- **Fixture files** (JSON, YAML) are acceptable for large, complex, or externally-sourced inputs (API response snapshots, configuration samples). Store in `tests/fixtures/`.
|
|
141
|
+
- **Database state:** Integration tests set up and tear down within the test via helpers. Never depend on database state from a previous test. Enforce tenancy isolation via per-test schema or transaction rollback.
|
|
142
|
+
- **Testcontainers** pinned by image digest, not tag.
|
|
84
143
|
|
|
85
144
|
## Error Path Coverage
|
|
86
145
|
|
|
87
146
|
Error handling code is often under-tested because developers focus on happy paths. Enforce minimum error coverage:
|
|
147
|
+
- **Every exported function that can fail** must have at least one test exercising the error path. "Can fail" includes functions returning `Result<T, E>`, functions with `throw` statements, async functions calling external services, and functions with input validation.
|
|
148
|
+
- **Error message assertions.** Verify that messages, codes, and structured fields contain the expected values. Do not assert only that "an error was thrown" — verify the error content.
|
|
149
|
+
- **Error propagation.** When a function wraps or transforms errors from a dependency, verify the original error context is preserved (cause chain, stack trace, original error code).
|
|
150
|
+
- **Boundary error tests.** For each architectural boundary (API handler, event handler, background processor), verify that errors are caught, logged, and returned as safe responses without leaking internal details.
|
|
88
151
|
|
|
89
|
-
|
|
90
|
-
- **Error message assertions.** Test that error messages, codes, and structured fields contain the expected values. Do not assert only that "an error was thrown" -- verify the error content.
|
|
91
|
-
- **Error propagation.** When a function wraps or transforms errors from a dependency, test that the original error context is preserved (cause chain, stack trace, original error code).
|
|
92
|
-
- **Boundary error tests.** For each architectural boundary (API handler, event handler, background processor), test that errors are caught, logged, and returned as safe responses without leaking internal details.
|
|
152
|
+
## Load Testing in CI
|
|
93
153
|
|
|
94
|
-
|
|
154
|
+
- **k6** (k6 Operator v1.0 for Kubernetes-distributed runs), **Vegeta** (constant-rate, no coordinated omission), **Locust** (Python), **Artillery** (TS).
|
|
155
|
+
- Baseline vs current diff in CI; SLO regression detection on p95, p99, and error-rate thresholds. Block the PR when a tracked SLO regresses.
|
|
156
|
+
|
|
157
|
+
## Security Testing in CI
|
|
158
|
+
|
|
159
|
+
- **SAST:** Semgrep + CodeQL.
|
|
160
|
+
- **SCA / container / IaC / secrets:** Trivy (one-shot multi-scanner).
|
|
161
|
+
- **DAST:** OWASP ZAP or Nuclei against an ephemeral environment.
|
|
162
|
+
|
|
163
|
+
See `rules/hatch3r-container-hardening.md` and `rules/hatch3r-dependency-management.md` for the operational policy around hardening and pinning.
|
|
164
|
+
|
|
165
|
+
## AI-Assisted Test Generation
|
|
166
|
+
|
|
167
|
+
- **Qodo 2.0** (60.1% F1 on reference benchmark) for TS / JS unit tests + edge cases.
|
|
168
|
+
- **Diffblue Cover** (symbolic, 20× cited productivity uplift on legacy code) for Java.
|
|
169
|
+
|
|
170
|
+
These are accelerators, not substitutes for the Per-Feature Mandate Map. Every generated test still goes through review and must map to a required test class for the code under test.
|
|
171
|
+
|
|
172
|
+
## Per-Feature Mandate Map
|
|
173
|
+
|
|
174
|
+
Reviewers verify each PR satisfies the required test classes for the code class touched. A PR that adds a parser without a fuzz harness, or a payment path without mutation testing, fails review even if coverage is green.
|
|
175
|
+
|
|
176
|
+
| Code class | Required test classes |
|
|
177
|
+
|------------|----------------------|
|
|
178
|
+
| Parser / deserializer | unit + property + fuzz |
|
|
179
|
+
| Network handler / RPC entry | integration + contract + fuzz |
|
|
180
|
+
| Payment / billing logic | unit + property + mutation (≥ 80 score) |
|
|
181
|
+
| State machine | unit + property (with `RuleBasedStateMachine` analogue) |
|
|
182
|
+
| Pure function | unit + property |
|
|
183
|
+
| Service / RPC client | unit + contract (consumer side) |
|
|
184
|
+
| Service / RPC server | integration + contract (provider side) + Schemathesis |
|
|
185
|
+
| UI component | unit + visual regression + a11y (via `hatch3r-ui-ux-verify`) |
|
|
186
|
+
| LLM feature | eval (via `hatch3r-ai-feature`) + unit on adapter + integration on fallback chain |
|
|
187
|
+
| Background job | unit + integration with poison-message handling |
|
|
188
|
+
|
|
189
|
+
## References
|
|
95
190
|
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
191
|
+
- Stryker (mutation testing): https://stryker-mutator.io/
|
|
192
|
+
- fast-check (property-based testing, TS): https://fast-check.dev/
|
|
193
|
+
- Hypothesis (property-based testing, Python): https://hypothesis.readthedocs.io/
|
|
194
|
+
- proptest (property-based testing, Rust): https://github.com/proptest-rs/proptest
|
|
195
|
+
- Pact (consumer-driven contract testing): https://docs.pact.io/
|
|
196
|
+
- Schemathesis (OpenAPI provider testing): https://schemathesis.readthedocs.io/
|
|
197
|
+
- OWASP Web Security Testing Guide: https://owasp.org/www-project-web-security-testing-guide/
|
|
@@ -8,17 +8,24 @@ alwaysApply: false
|
|
|
8
8
|
## Core Principles
|
|
9
9
|
|
|
10
10
|
- Unit tests: project test runner. Integration: test runner + emulators/mocks. E2E: browser automation (Playwright or equivalent).
|
|
11
|
-
- **Deterministic.** Mock time
|
|
12
|
-
- **Isolated.** Each test sets up and tears down its own state.
|
|
11
|
+
- **Deterministic.** Mock time, seed RNG, pin timezone/locale. See Determinism Contract below.
|
|
12
|
+
- **Isolated.** Each test sets up and tears down its own state. Vitest `isolate: true`; Jest `--runInBand` only for serialized DB tests.
|
|
13
13
|
- **Fast.** Unit tests < 50ms. Integration tests < 2s.
|
|
14
14
|
- **Named clearly.** Describe behavior: `"should award 15 XP for 25-min focus block"`.
|
|
15
15
|
- **Regression.** Every bug fix includes a test that fails before the fix and passes after.
|
|
16
|
-
- **No network.** Unit tests must not make network calls. Use mocks.
|
|
16
|
+
- **No network.** Unit tests must not make network calls. Use mocks or Testcontainers (pinned by digest).
|
|
17
17
|
- No type escape hatches in tests. No `.skip` without a linked issue.
|
|
18
18
|
- Write tests to `tests/unit/`, `tests/integration/`, `tests/e2e/`, or equivalent.
|
|
19
19
|
- Use test fixtures from `tests/fixtures/` or equivalent.
|
|
20
20
|
- **Browser verification.** For UI changes, verify visually in the browser via browser automation MCP after automated tests pass. Capture screenshots as evidence.
|
|
21
21
|
|
|
22
|
+
## Test Pyramid / Honeycomb / Trophy — Pick by Architecture
|
|
23
|
+
|
|
24
|
+
Pick exactly one shape and document it in `docs/testing.md` (or equivalent):
|
|
25
|
+
- **Pyramid** (heavy unit, light E2E): monoliths with rich domain logic.
|
|
26
|
+
- **Honeycomb** (heavy integration, light unit + E2E): microservices; ~48% of microservice teams (Spotify model).
|
|
27
|
+
- **Trophy** (unit + integration + E2E in similar ratios, light static): serverless functions; ~42% of serverless teams (Kent C. Dodds shape).
|
|
28
|
+
|
|
22
29
|
## Coverage Thresholds
|
|
23
30
|
|
|
24
31
|
- **Statement coverage:** 80% minimum across the project. New code must not decrease overall coverage.
|
|
@@ -29,6 +36,10 @@ alwaysApply: false
|
|
|
29
36
|
- Generate coverage reports in CI and publish as PR comments or artifacts for visibility.
|
|
30
37
|
- Exclude generated code, type declarations, and config files from coverage metrics.
|
|
31
38
|
|
|
39
|
+
## Coverage That Matters — Coverage AND Mutation
|
|
40
|
+
|
|
41
|
+
Coverage alone is necessary, not sufficient. A PR that raises line coverage but drops mutation score is a regression. Reviewers verify the right test classes per the Per-Feature Mandate Map below; coverage numbers are a floor, not a finish line.
|
|
42
|
+
|
|
32
43
|
## Mocking Strategy
|
|
33
44
|
|
|
34
45
|
- **Prefer fakes over mocks** for stateful dependencies (databases, caches). Fakes implement the real interface with in-memory state, making tests more realistic.
|
|
@@ -39,59 +50,144 @@ alwaysApply: false
|
|
|
39
50
|
- **Type-safe mocks.** Mock implementations must satisfy the same TypeScript interface as the real dependency. Avoid `as any` in mock setup.
|
|
40
51
|
- **No mocking the unit under test.** If you need to mock part of the module you are testing, the module has too many responsibilities — refactor first.
|
|
41
52
|
|
|
42
|
-
##
|
|
53
|
+
## Contract Testing
|
|
54
|
+
|
|
55
|
+
Every cross-service interaction is covered by both consumer-side (Pact) and provider-side (Schemathesis against the OpenAPI/AsyncAPI schema) contract tests. `pact-broker can-i-deploy` gates production deploys: if the consumer/provider contract pair is incompatible, the deploy is blocked. See `rules/hatch3r-contract-testing.md` for the full pattern (broker setup, provider state handlers, versioning, breakage triage).
|
|
56
|
+
|
|
57
|
+
## Property-Based Testing — Per Ecosystem
|
|
58
|
+
|
|
59
|
+
Required for any pure function, parser, serializer, state machine, or invariant-bearing function. Default 100 trials per property; raise to 1000 for security-sensitive code. Shrinking must be enabled.
|
|
60
|
+
|
|
61
|
+
- **TypeScript / JavaScript:** `fast-check` (latest 3.x). Use for pure functions, parsers, state machines (`fc.commands`).
|
|
62
|
+
- **Python:** `Hypothesis` 6.151+. Stateful PBT via `RuleBasedStateMachine`.
|
|
63
|
+
- **Rust:** `proptest`. Shrinks to minimal failing case.
|
|
64
|
+
- **Scala:** `ScalaCheck`. Use for case-class invariants.
|
|
65
|
+
- **Java:** `jqwik` (modern) or `junit-quickcheck`.
|
|
66
|
+
- **Go:** `gopter` or stdlib `testing/quick` (limited shrinking).
|
|
43
67
|
|
|
44
|
-
|
|
45
|
-
- **Priority targets:** parsers, serializers, validators, encoders/decoders, mathematical functions, and any pure function with complex input types.
|
|
46
|
-
- Define invariants as properties: round-trip (encode then decode equals original), idempotency (applying twice equals applying once), monotonicity, commutativity.
|
|
47
|
-
- Use `fc.assert` with at least 100 runs per property. Increase to 1000 for critical paths.
|
|
48
|
-
- When a property test finds a failure, add the minimal counterexample as a dedicated regression unit test.
|
|
49
|
-
- Shrinking must be enabled — it reduces failing inputs to the smallest reproduction case.
|
|
50
|
-
- Property tests belong alongside unit tests in `tests/unit/`. Name them clearly: `"property: round-trip serialization for UserProfile"`.
|
|
68
|
+
Invariants to encode: round-trip (encode then decode equals original), idempotency (applying twice equals once), monotonicity, commutativity. When a property test finds a failure, add the minimal counterexample as a dedicated regression unit test.
|
|
51
69
|
|
|
52
|
-
## Mutation Testing
|
|
70
|
+
## Mutation Testing — Per Ecosystem + Thresholds
|
|
53
71
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
-
|
|
57
|
-
- **
|
|
58
|
-
-
|
|
59
|
-
-
|
|
72
|
+
Run on a nightly schedule (not per-commit) due to runtime cost. Mutation score is a quality gate alongside coverage. Surviving mutants indicate tests that pass regardless of code changes — fix by adding assertions that detect the mutation.
|
|
73
|
+
|
|
74
|
+
- **TypeScript / JavaScript:** Stryker. Thresholds: break 50 / low 60 / high 80 (Stryker defaults).
|
|
75
|
+
- **Python:** `mutmut` (88.5% score on reference suite, faster) or `Cosmic Ray` (82.7%, thorough).
|
|
76
|
+
- **Java:** PIT 1.22 (November 2025). Business logic target 80–90.
|
|
77
|
+
- **Go:** `go-mutesting` or `gremlins-dev/gremlins`.
|
|
78
|
+
- **.NET:** `Stryker.NET`.
|
|
79
|
+
|
|
80
|
+
**Mutation score target:** 70% minimum on critical modules (auth, data layer, business rules), 60% project-wide, 80%+ on payment/billing logic. Exclude test files, generated code, and UI presentation logic from mutation analysis.
|
|
81
|
+
|
|
82
|
+
## Fuzz Testing — Per Ecosystem
|
|
83
|
+
|
|
84
|
+
Required for any parser, deserializer, network handler, file-format handler, or untrusted-input boundary. Crash + hang + OOM detection; corpus minimization; persisted crash inputs become regression fixtures.
|
|
85
|
+
|
|
86
|
+
- **Java:** jazzer (OSS-Fuzz integrated).
|
|
87
|
+
- **JavaScript:** jazzer.js OSS was discontinued in 2025 — fall back to property-based testing for JS-only paths, or fuzz the underlying native binding.
|
|
88
|
+
- **Python:** `atheris` (Google).
|
|
89
|
+
- **Rust:** `cargo-fuzz` + libFuzzer.
|
|
90
|
+
- **Go:** native `testing.F` (Go 1.18+); for advanced workflows use `gosentry` (Trail of Bits, 2026-05-12 fork of the discontinued jazzer.js workflow adapted for Go).
|
|
91
|
+
- **C / C++:** AFL++ + OSS-Fuzz.
|
|
92
|
+
|
|
93
|
+
## Determinism Contract
|
|
94
|
+
|
|
95
|
+
Every test must be deterministic. Mandates:
|
|
96
|
+
- **Clock injection.** Production code never calls `new Date()` / `time.Now()` / `datetime.now()` directly; inject a clock interface. In tests: `vi.useFakeTimers()` / `freezegun` / `mock.patch('time.time')`.
|
|
97
|
+
- **Seeded RNG.** Every random call uses an injected seedable RNG. In tests: fixed seed per test.
|
|
98
|
+
- **Pinned timezone and locale.** `TZ=UTC` and `LC_ALL=C.UTF-8` in the CI environment.
|
|
99
|
+
- **Sorted iteration.** Any test asserting on map / dict iteration order sorts first.
|
|
100
|
+
- **OS-assigned ports.** Never bind to a fixed port in tests — bind to `0` to get an OS-assigned port.
|
|
101
|
+
- **Test isolation.** Vitest `isolate: true` (default); Jest `--runInBand` only when needed for serialized DB tests.
|
|
60
102
|
|
|
61
103
|
## Flaky Test Handling
|
|
62
104
|
|
|
63
|
-
- **
|
|
64
|
-
- **Quarantine
|
|
65
|
-
- **
|
|
66
|
-
- **
|
|
67
|
-
- **
|
|
68
|
-
- **
|
|
69
|
-
- **
|
|
105
|
+
- **Detection.** CI retries failed tests once; tests failing on retry but passing on rerun are tagged `flake-suspected`.
|
|
106
|
+
- **Quarantine.** Any test that flakes twice in 7 days moves to `tests/quarantine/` (runs but does not block PRs). Issue auto-filed with the `flake` label.
|
|
107
|
+
- **SLA.** 14 days to root-cause and fix; otherwise the test is deleted. Quarantined tests reviewed weekly.
|
|
108
|
+
- **Retry policy.** Allow at most 1 automatic retry for the full test suite. Never silently retry individual tests — that masks flakiness.
|
|
109
|
+
- **Categorization on intake.** Tag each flake by root cause: timing (use fake timers), network (use mocks / Testcontainers), ordering (sort assertions), pollution (test isolation), resource (cleanup).
|
|
110
|
+
- **Fix patterns.** Replace `setTimeout` with fake timers; replace shared state with per-test setup; replace fixed ports with OS-assigned (`0`); seed random generators deterministically.
|
|
111
|
+
- **Metrics.** Track flaky rate over time. Target < 0.5% (flaky runs / total runs). Alert at 1%.
|
|
112
|
+
- **Cost awareness.** Datadog 2026 telemetry reports 6–8 hrs/eng/week lost to flakes when quarantine + SLA is not enforced.
|
|
113
|
+
|
|
114
|
+
## E2E Strategy
|
|
115
|
+
|
|
116
|
+
- **Playwright is the 2026 default** (95k stars, ~290 ms/action, native sharding via `--shard`). Use for cross-browser, accessibility (`@axe-core/playwright`), and visual regression (`toHaveScreenshot()`).
|
|
117
|
+
- Cypress requires paid Cloud for serious parallelization; WebdriverIO is the niche choice for web + mobile parity.
|
|
118
|
+
- Retry policy: `retries: 2` for transient infra; never `retries: >= 5` (masks bugs).
|
|
119
|
+
|
|
120
|
+
## Snapshot Testing
|
|
121
|
+
|
|
122
|
+
- **Use sparingly.** 2–4 snapshots per component max. Appropriate for serialized output (JSON API responses, CLI output, rendered HTML structure) where the exact output matters and is stable.
|
|
123
|
+
- **Not appropriate for:** UI component visual appearance (use visual regression tests via `toHaveScreenshot()` or `jest-image-snapshot`), objects with timestamps or random IDs (unstable), large objects (unreadable diffs).
|
|
124
|
+
- **Review discipline.** Snapshot updates (`--update-snapshots`) must be reviewed with the same rigor as code changes. Reviewers verify the new snapshot is intentionally correct, not just "different."
|
|
125
|
+
- **Keep snapshots small.** Files > 100 lines suggest the test is asserting too broadly. Narrow the assertion to the relevant subset.
|
|
126
|
+
- **Inline snapshots** are preferred over external `.snap` files for short outputs (< 20 lines) — keeps the assertion co-located with the test.
|
|
127
|
+
- **Design-system components:** Storybook + Chromatic.
|
|
70
128
|
|
|
71
129
|
## Test Data Management
|
|
72
130
|
|
|
73
|
-
- **Factories over fixtures.** Use factory functions (
|
|
74
|
-
- **Builder pattern example:** `buildUser({ role: "admin" })` returns a full valid User with admin role and
|
|
75
|
-
- **No shared mutable fixtures.** If multiple tests read the same fixture data, each test
|
|
76
|
-
- **Realistic data.**
|
|
77
|
-
- **Deterministic seeding.**
|
|
78
|
-
- **Fixture files** (JSON, YAML) are acceptable for large, complex, or externally-sourced
|
|
79
|
-
- **Database state:** Integration tests
|
|
131
|
+
- **Factories over fixtures.** Use factory functions (factory-bot for Ruby, Fishery for TS, factory-boy for Python) seeded with Faker pinned to a fixed version.
|
|
132
|
+
- **Builder pattern example:** `buildUser({ role: "admin" })` returns a full valid `User` with admin role and valid defaults for all other fields.
|
|
133
|
+
- **No shared mutable fixtures.** If multiple tests read the same fixture data, each test gets its own copy via `structuredClone()` or a factory function.
|
|
134
|
+
- **Realistic data.** Avoid magic strings like `"test"`, `"foo"`, `"abc123"`.
|
|
135
|
+
- **Deterministic seeding.** Seed generators per test file so failures reproduce.
|
|
136
|
+
- **Fixture files** (JSON, YAML) are acceptable for large, complex, or externally-sourced inputs (API response snapshots, configuration samples). Store in `tests/fixtures/`.
|
|
137
|
+
- **Database state:** Integration tests set up and tear down within the test via helpers. Never depend on database state from a previous test. Enforce tenancy isolation via per-test schema or transaction rollback.
|
|
138
|
+
- **Testcontainers** pinned by image digest, not tag.
|
|
80
139
|
|
|
81
140
|
## Error Path Coverage
|
|
82
141
|
|
|
83
142
|
Error handling code is often under-tested because developers focus on happy paths. Enforce minimum error coverage:
|
|
143
|
+
- **Every exported function that can fail** must have at least one test exercising the error path. "Can fail" includes functions returning `Result<T, E>`, functions with `throw` statements, async functions calling external services, and functions with input validation.
|
|
144
|
+
- **Error message assertions.** Verify that messages, codes, and structured fields contain the expected values. Do not assert only that "an error was thrown" — verify the error content.
|
|
145
|
+
- **Error propagation.** When a function wraps or transforms errors from a dependency, verify the original error context is preserved (cause chain, stack trace, original error code).
|
|
146
|
+
- **Boundary error tests.** For each architectural boundary (API handler, event handler, background processor), verify that errors are caught, logged, and returned as safe responses without leaking internal details.
|
|
84
147
|
|
|
85
|
-
|
|
86
|
-
- **Error message assertions.** Test that error messages, codes, and structured fields contain the expected values. Do not assert only that "an error was thrown" -- verify the error content.
|
|
87
|
-
- **Error propagation.** When a function wraps or transforms errors from a dependency, test that the original error context is preserved (cause chain, stack trace, original error code).
|
|
88
|
-
- **Boundary error tests.** For each architectural boundary (API handler, event handler, background processor), test that errors are caught, logged, and returned as safe responses without leaking internal details.
|
|
148
|
+
## Load Testing in CI
|
|
89
149
|
|
|
90
|
-
|
|
150
|
+
- **k6** (k6 Operator v1.0 for Kubernetes-distributed runs), **Vegeta** (constant-rate, no coordinated omission), **Locust** (Python), **Artillery** (TS).
|
|
151
|
+
- Baseline vs current diff in CI; SLO regression detection on p95, p99, and error-rate thresholds. Block the PR when a tracked SLO regresses.
|
|
152
|
+
|
|
153
|
+
## Security Testing in CI
|
|
154
|
+
|
|
155
|
+
- **SAST:** Semgrep + CodeQL.
|
|
156
|
+
- **SCA / container / IaC / secrets:** Trivy (one-shot multi-scanner).
|
|
157
|
+
- **DAST:** OWASP ZAP or Nuclei against an ephemeral environment.
|
|
158
|
+
|
|
159
|
+
See `rules/hatch3r-container-hardening.md` and `rules/hatch3r-dependency-management.md` for the operational policy around hardening and pinning.
|
|
160
|
+
|
|
161
|
+
## AI-Assisted Test Generation
|
|
162
|
+
|
|
163
|
+
- **Qodo 2.0** (60.1% F1 on reference benchmark) for TS / JS unit tests + edge cases.
|
|
164
|
+
- **Diffblue Cover** (symbolic, 20× cited productivity uplift on legacy code) for Java.
|
|
165
|
+
|
|
166
|
+
These are accelerators, not substitutes for the Per-Feature Mandate Map. Every generated test still goes through review and must map to a required test class for the code under test.
|
|
167
|
+
|
|
168
|
+
## Per-Feature Mandate Map
|
|
169
|
+
|
|
170
|
+
Reviewers verify each PR satisfies the required test classes for the code class touched. A PR that adds a parser without a fuzz harness, or a payment path without mutation testing, fails review even if coverage is green.
|
|
171
|
+
|
|
172
|
+
| Code class | Required test classes |
|
|
173
|
+
|------------|----------------------|
|
|
174
|
+
| Parser / deserializer | unit + property + fuzz |
|
|
175
|
+
| Network handler / RPC entry | integration + contract + fuzz |
|
|
176
|
+
| Payment / billing logic | unit + property + mutation (≥ 80 score) |
|
|
177
|
+
| State machine | unit + property (with `RuleBasedStateMachine` analogue) |
|
|
178
|
+
| Pure function | unit + property |
|
|
179
|
+
| Service / RPC client | unit + contract (consumer side) |
|
|
180
|
+
| Service / RPC server | integration + contract (provider side) + Schemathesis |
|
|
181
|
+
| UI component | unit + visual regression + a11y (via `hatch3r-ui-ux-verify`) |
|
|
182
|
+
| LLM feature | eval (via `hatch3r-ai-feature`) + unit on adapter + integration on fallback chain |
|
|
183
|
+
| Background job | unit + integration with poison-message handling |
|
|
184
|
+
|
|
185
|
+
## References
|
|
91
186
|
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
-
|
|
187
|
+
- Stryker (mutation testing): https://stryker-mutator.io/
|
|
188
|
+
- fast-check (property-based testing, TS): https://fast-check.dev/
|
|
189
|
+
- Hypothesis (property-based testing, Python): https://hypothesis.readthedocs.io/
|
|
190
|
+
- proptest (property-based testing, Rust): https://github.com/proptest-rs/proptest
|
|
191
|
+
- Pact (consumer-driven contract testing): https://docs.pact.io/
|
|
192
|
+
- Schemathesis (OpenAPI provider testing): https://schemathesis.readthedocs.io/
|
|
193
|
+
- OWASP Web Security Testing Guide: https://owasp.org/www-project-web-security-testing-guide/
|