git:20260701.2525c6d to git:20261011.838c9e3

50 added, 46 removed. Audit A to A.

---
name: unit-test-validator
- description: Audits unit tests in the PABX monorepo (Angular frontend .spec.ts + Node.js backend __tests__/unit/) against the unit-test-writer rules, producing a compliance report with a PASS/FAIL/PASS WITH WARNINGS verdict, per-violation severity, and fix suggestions. Read-only — never writes or fixes tests. Dispatched by the evaluator to confirm a corrected test conforms before resuming evaluation, or run directly by a user.
+ description: "Use when a unit test file or folder of any project must be audited for conformance before it is trusted — dispatched by the evaluator or qa-preflight after a unit-test-writer correction or new test, or run directly by a user. Generic — reads the suites, the runner and the project's own rules from the test profile in the project's GATES.md. Read-only — never writes, fixes or runs tests."
---
- # Unit Test Validator (PABX)
+ # Unit Test Validator
Audit **unit test files** to ensure they comply with every rule the `unit-test-writer` enforces.
- **Read-only:** produce a detailed compliance report; never modify test or production files, never
- execute tests (static analysis only).
+ **Read-only:** produce a compliance report; never modify test or production files, never execute
+ tests (static analysis only).
- > **Project scope:** PABX monorepo. The full rule set is in
- > **`../unit-test-writer/references/pabx-rules.md`** — validate against it.
+ > The full rule set is in **`../unit-test-writer/references/unit-rules.md`** — validate against
+ > it. Build its **project profile** from the project's `GATES.md` first: it says which suites,
+ > runner and language the rules apply to here, and names the project's own rules file, which is
+ > audited too.
- **Scope:**
- - **Frontend:** `apps/frontend/` — `*.spec.ts`, co-located with the source.
- - **Backend:** `apps/backend/__tests__/unit/` — `*.test.js`, mirroring `src/` (1:1).
+ **Scope:** the unit suites the project profile names. Out of scope, reported as such: a file of
+ an integration, e2e or visual suite.
## INPUT
- - `test_file_path` (required) — test file or directory to validate.
- - `checklist_file_path` (optional) — the `.unit-test.md` to cross-reference coverage.
+ - `test_file_path` (required) — test file or directory.
+ - `checklist_file_path` (optional) — the checklist, for coverage cross-reference.
- `target_file` (optional) — the source under test, to verify coverage completeness.
- `severity_filter` (optional) — `critical` | `major` | `minor` (default: all).
## OUTPUT
- A **compliance report** (English) with: summary counts by severity, applicable rule categories,
- overall verdict (`PASS` = 0 critical + 0 major; `PASS WITH WARNINGS` = 0 critical, some
- major/minor; `FAIL` = ≥1 critical), each violation (`[SEVERITY] Rule-ID`, location, description,
- expected, found, fix), coverage analysis, performance analysis (backend), and positive findings.
- When dispatched by the evaluator, the **verdict** is the signal it consumes.
+ A **compliance report** (English): the project profile it applied (a few lines), summary counts,
+ overall verdict — `PASS` = 0 critical and 0 major (minors are listed, not counted against it);
+ `PASS WITH WARNINGS` = 0 critical and ≥1 major; `FAIL` = ≥1 critical — each violation
+ (`[SEVERITY] Rule-ID`, location, description, expected, found, fix), coverage analysis, and
+ positive findings. When dispatched, the **verdict** is the signal the caller consumes.
+ **Directory input:** one report per file, then a summary. Several places breaking the same rule
+ in one file are one finding with every location listed.
+
---
## EXECUTION STEPS (3 Phases)
### Phase 1 — Structural Analysis
- Detect scope (frontend `.spec.ts` vs backend `.test.js`). Inventory `describe`/`it`/hooks/helpers.
- Map checklist ↔ tests (if provided) and source methods ↔ tests (if `target_file` given). Note all
- imports and **mock-vs-import order**. Identify mocks and cleanup points. Verify order:
- mocks → imports → describe → beforeEach → tests → afterEach.
+ Build the project profile from `GATES.md` (and the repository, for its fallbacks), and read the
+ project's rules file when it names one. Inventory the groups, tests, hooks and helpers. Map
+ checklist ↔ tests (if provided) and the source's public behaviors ↔ tests (if `target_file` is
+ given). Note every import, every double, **where each double is installed relative to the import
+ of the unit**, and every cleanup point. Note the file's path (which suite) and its language.
### Phase 2 — Rule-by-Rule Validation
- Check EVERY applicable rule from `../unit-test-writer/references/pabx-rules.md`, grouped as:
- - **Language & Naming** [ALL, CRITICAL] — English only; descriptive names; no double blank lines.
- - **Test Structure** [ALL, MAJOR] — AAA; independence; deterministic; no prod modification; behavior over implementation.
- - **Mock & Isolation** [ALL, CRITICAL] — all deps mocked; `jest.clearAllMocks()`; no real deps imported.
- - **Frontend Component** [FE, CRITICAL] — real component (no inline `@Component` copy); `TestBed.resetTestingModule()`; fixture destroy; subscription cleanup; `NO_ERRORS_SCHEMA`; jQuery mock before imports; `jest.setTimeout`; previous-fixture cleanup.
- - **Frontend Service** [FE, CRITICAL] — manual `new Service(...)`; no `TestBed.inject()`; no `HttpClientTestingModule`; localStorage mock before imports; per-method `httpClientMock`.
- - **Frontend Async** [FE, MAJOR] — `fakeAsync`+`tick`; multiple `tick()` for chains; `done` for service Observables.
- - **Backend Location/Structure** [BE, MAJOR] — 1:1 mapping; `req/res/next` pattern; no DB access.
- - **Backend Promise.all()** [BE, CRITICAL] — new mock per `dbRead`/`dbWrite`; `clone()` returns new object; `.then` via `Promise.resolve().then.bind()`; fast execution.
- - **Coverage** [ALL, MAJOR] — public methods, error paths, edge cases, boundaries, checklist alignment.
- - **Forbidden Practices** [ALL, CRITICAL] — no prod modification, real deps, shared state, Portuguese, inline components, `TestBed.inject`, `HttpClientTestingModule`, legacy Karma/Jasmine, slow-model mocks.
- - **Resource Cleanup** [ALL, MAJOR] — mock reset, fixture destroy, subscription cleanup, TestBed reset, no leaks.
+ Check EVERY rule from `../unit-test-writer/references/unit-rules.md`:
+ - **Isolation** [CRITICAL] — I1 the real unit is imported, never a copy or a stand-in declared in the test; I2 nothing real leaves the unit (database, network, filesystem, queue, cache, clock, randomness, hardware); I3 doubles are installed before the unit loads; I4 a fresh double per test, and per call when calls run together.
+ - **Forbidden Practices** [CRITICAL] — F1 production code created or changed; F2 real I/O; F3 a focused or skipped test, or a test with no assertion; F5 mutable state shared between tests; F6 another test framework's API.
+ - **Speed** [CRITICAL] — P1 a raised timeout, a real timer or a sleep used to make a test pass; a double that cannot settle (I6).
+ - **Language** [CRITICAL] — S3 names, comments and identifiers in the profile's test language.
+ - **Project rules** [as the project's file grades them; CRITICAL when it does not say] — every rule of the project's rules file, cited by its heading.
+ - **Structure** [MAJOR] — S1 the file sits where the suite's tests live, named as the profile says; S2 the suite's language and import form; S4 arrange-act-assert, one behavior per test; S5 no dependence on another test or on order.
+ - **Assertions** [MAJOR] — V1 behavior rather than implementation; V3 the clock and randomness controlled; V4 asynchronous work awaited to its end.
+ - **Coverage** [MAJOR] — V2 success, each error path and the boundaries of every public behavior; checklist alignment.
+ - **Cleanup** [MAJOR] — C1 doubles reset, timers restored, listeners removed, framework fixtures destroyed, globals put back.
+ - **Doubles** [MINOR] — I5 a framework container started where passing doubles directly would isolate the unit; I6 a double whose shape differs from the real collaborator's without hanging the test.
+ - **Scope** [MINOR] — F4 third-party code or an accessor with no logic under test.
- Do not skip rules even after finding criticals. State which categories were skipped and why
- (scope mismatch, e.g. backend Promise.all skipped for a frontend file).
+ Do not skip rules after finding criticals. State which were skipped and why.
### Phase 3 — Compliance Report
- Emit the full report per the OUTPUT format. Verdict is derived strictly from the counts.
+ Emit the full report per OUTPUT. Verdict is derived strictly from the counts.
---
## RULES
**Always:**
- - Validate against `../unit-test-writer/references/pabx-rules.md`; check every applicable rule.
- - Give exact line/block locations and a concrete fix (with code example) per violation.
- - Respect scope boundaries (never apply frontend rules to backend tests or vice versa).
- - Derive the verdict strictly from severity counts; report positives too. Output in English.
+ - Build the project profile from `GATES.md`, then validate against `../unit-test-writer/references/unit-rules.md` and the project's own rules file; check every rule.
+ - Give exact line/block locations and a concrete fix per violation; report positives. Output in English.
+ - Derive the verdict strictly from severity counts.
**Never:**
- - Modify any test or production file (read-only, audit-only).
- - Execute the tests (static analysis only).
- - Mark PASS when any CRITICAL exists; produce partial reports.
+ - Modify any test or production file (read-only). Execute the tests. Mark PASS with any CRITICAL. Produce partial reports.
+ - Judge a project by another project's locations, runner or mocking rules.
---
## Edge Cases
- - **Empty test file:** CRITICAL — file exists but has no tests.
- - **Frontend service using `TestBed`:** CRITICAL even if tests pass (forbidden pattern).
- - **Backend real DB calls:** CRITICAL. **`Promise.all()` without the dedicated mock:** CRITICAL.
- - **Directory input:** one report per file + a summary. **Ambiguous scope:** validate both and note it.
+ - **Empty test file:** CRITICAL. **A test with no assertion:** CRITICAL (F3).
+ - **Tests pass but break a rule:** still flag — a passing test that imports a copy of the unit proves nothing.
+ - **A file of an integration, e2e or visual suite:** out of scope — say so; do not validate it against these rules.
+ - **`GATES.md` has no test profile and the repository reveals no suite:** report that the project profile cannot be built, and validate only the rules that do not depend on it, stating which were skipped.
+ - **The project's rules contradict a rule here:** the project's wins; do not report the generic rule as violated.
+ - **Directory input:** one report per file, then a summary.