diff --git a/docs/redesign/phase-9/TODO.md b/docs/redesign/phase-9/TODO.md new file mode 100644 index 0000000..9c03c59 --- /dev/null +++ b/docs/redesign/phase-9/TODO.md @@ -0,0 +1,12 @@ +# Phase 9 TODO + +- [ ] P9-00 — Inventory, matrix, fresh baseline and source identity. +- [ ] P9-01 — Connected functional journeys. +- [ ] P9-02 — Responsive / visual qualification. +- [ ] P9-03 — Accessibility / localisation and human checklist. +- [ ] P9-04 — Data, provider and security qualification. +- [ ] P9-05 — Native documents, edge cases and sustained performance. +- [ ] P9-06 — Confirmed defect remediation and complete regression. +- [ ] P9-07 — Acceptance, preservation reconciliation, risks and Phase 10 handoff. + +No Phase 10 implementation or production operation is authorised. diff --git a/docs/redesign/phase-9/p9-06/DEFECTS.md b/docs/redesign/phase-9/p9-06/DEFECTS.md new file mode 100644 index 0000000..f22acd6 --- /dev/null +++ b/docs/redesign/phase-9/p9-06/DEFECTS.md @@ -0,0 +1,14 @@ +# Phase 9 defect register + +Status is evidence-specific. Historic acceptance records remain unchanged. A passing characterization of a known limitation does not make the limitation safe. + +| ID | Severity / impact | Reproduction and disposition | Owner / closure | Phase 9 / production | +|---|---|---|---|---| +| P9-T01 | Medium test reliability: parser descendant test could time out before it had a descendant | Entry sidecar 55 pass/1 fail (missing PID); isolated run passes; explicit slow startup reproduces the race. Fixture now waits for its child PID before the unchanged 200 ms deadline. Real process-tree kill and HTTP 504 assertions retained. Focused green and full 56/56 successor. No parser product change. | QA; `.artifacts/phase9/sidecar-entry-failed.*`, `sidecar-fixture-red.*`, `sidecar-fixture-green.*`, `sidecar.xml` | Resolved in tested Windows environment; Linux run remains separate. | +| P9-L01 | Low localisation defect: Admin grid vendor controls appear in English in Bokmål | Sole DataGrid owner omitted localeText. New English desktop test passes while Bokmål fails to find “Rader per side:”. Reuse installed `nbNO` locale in AdminUsersPage. Focused 12/12 green; complete regression/native successor required. | Frontend; `admin-users-page.test.tsx`, `AdminUsersPage.tsx`; retained RED/GREEN logs/JSON | Pending integrated successor; no authorisation, pagination or data contract change. | +| RD21 | High data-integrity limitation: generic job/canonical Career stale saves and creation-intent idempotency lack the complete CV-style revision contract | Inherited, not automatically closed by preference/CV conflict tests. Source/previous runtime evidence and any fresh characterization must be read separately. Do not infer server expected-version protection from a component dirty-state guard. | Domain owners; separately scoped contract/design, all callers, server concurrency and recovery tests. No silent architectural expansion in QA. | Retained qualification; blocks unqualified concurrent-write/production claims. | +| P9-PERF-01 | Low duplicate report work: shell and Dashboard each initially read reminders | Phase 8 source/network diagnosis retained. Phase 9 request-count evidence must distinguish initial duplicate reads from additional reads during editing. | Shared reminder read owner; measured benefit and independent shell/dashboard failure/loading tests before consolidation. | Accepted existing development debt; no Phase 10 implementation here. | + +Failed diagnostic fixtures are also retained: initial route matrix mistook “CV unavailable” alert text for a heading; correct page heading is “Public CV”. Initial sustained fixture compared submitted JSON directly with the canonical normalizer and used derived date fields; corrected fixture uses canonical `start`/`end`, distinct bullets and a verified saved readback before checking preservation. The initial drawer assertion inspected immediately after ARIA removal rather than waiting for the closing transition; settled CSS/keyboard proof is required. These are QA harness mistakes, not demonstrated product defects, and failed attempts are never counted as passes. + +The ordinary run interrupted after 36 completed cases is not an accepted complete run. Native-command warnings were initially promoted to terminating PowerShell errors; successor wrappers preserve actual native exit codes. No assertion was suppressed, no configured retry added and no skip introduced. diff --git a/tools/summarizer/tests/test_app.py b/tools/summarizer/tests/test_app.py index 5729c2e..f7aa37d 100644 --- a/tools/summarizer/tests/test_app.py +++ b/tools/summarizer/tests/test_app.py @@ -5,6 +5,7 @@ import os import subprocess import sys import textwrap +import time import zipfile from pathlib import Path @@ -759,6 +760,7 @@ def test_parser_timeout_terminates_descendants(monkeypatch, tmp_path): child.write_text(textwrap.dedent(f""" import subprocess, sys, time from pathlib import Path + time.sleep(0.3) descendant = subprocess.Popen([sys.executable, '-c', 'import time; time.sleep(30)']) Path({str(pid_path)!r}).write_text(str(descendant.pid), encoding='ascii') time.sleep(30) @@ -766,6 +768,23 @@ def test_parser_timeout_terminates_descendants(monkeypatch, tmp_path): monkeypatch.setattr(module, "PARSER_CHILD_PATH", child) monkeypatch.setattr(module, "PARSER_TIMEOUT_SECONDS", 0.2) + # Start the deadline only after this fixture has a descendant to terminate. + original_popen = subprocess.Popen + + def ready_parser(*args, **kwargs): + process = original_popen(*args, **kwargs) + if len(args[0]) > 1 and args[0][1] == str(child): + deadline = time.monotonic() + 5 + while not pid_path.exists() and process.poll() is None and time.monotonic() < deadline: + time.sleep(0.01) + if not pid_path.exists(): + module._terminate_parser_process(process) + process.wait(timeout=5) + raise AssertionError("Parser fixture did not create its descendant") + return process + + monkeypatch.setattr(module.subprocess, "Popen", ready_parser) + try: module._run_parser_child(".txt", b"safe") except module.HTTPException as exc: