# KOPR R211 — Custom-elements final integration release-gate report

**Build base:** R210 `WSTACK_CUSTOM_ELEMENTS_ACTIONS`  
**Release:** R211 `CUSTOM_ELEMENTS_FINAL_INTEGRATION`  
**Date:** 2026-08-05  
**Result:** `PASS_HEADLESS`

## Scope

R211 closes the R203–R210 Custom-elements integration series. It adds a
cumulative integration test and release gate for the complete persistent-edit,
cache-refresh and selector workflow. No production algorithm, observation
value, ephemeris policy, fit mathematics or persistent data format was changed
in this batch.

## Integrated workflow qualified

The R211 Qt-free round trip executes and verifies:

1. validation and fixed-width formatting of a new custom comet record;
2. durable atomic replacement of `CustomElements.dat` with optimistic conflict
   detection;
3. process-local repository-generation publication;
4. automatic cache refresh in multiple already-open
   `CometElementRepository` instances;
5. reconstruction of Analyzer and WPlanner catalogue entries;
6. canonical catalogue reconciliation and automatic selection of a genuinely
   new designation;
7. preservation of Planner `use_all` over the refreshed supported catalogue;
8. metadata update of an existing designation without moving it between
   Selected and Not selected;
9. detection that a persistent update of an already active Analyzer target
   requires a complete typed reload, including after outer-selector Cancel;
10. refusal of a stale writer before it can overwrite a newer persistent
    change.

The cumulative static gate also verifies that:

- the nested editor remains parent-scoped `Qt.WindowModal`;
- the editor constructor never starts its own event loop;
- the shared selector refreshes both panes through one reconciled state;
- Analyzer and Planner use the shared explicit Add action;
- WVisual, WCCD and WStack missing-elements actions remain button-only;
- WStack asynchronous validation rejects stale generations;
- no validation callback opens the editor automatically;
- the common selector no longer forces `raise_()` or `activateWindow()`.

## QA changes

- Added `tests/test_r211_custom_elements_final_integration.py`.
- Added `r211_custom_elements_final_integration_release_gate.py`.
- Updated the cumulative merger qualification marker to R211.
- Updated R209/R210 historical gates so a newer cumulative qualification does
  not make those already-satisfied gates fail.
- Updated `README_QA.md` and `docs/CHANGELOG.md`.

## Test results

### Focused R203–R211 Custom-elements matrix

```text
42 passed, 11 skipped, 0 failed
```

The skips are real PyQt5/offscreen tests on a host where PyQt5 is unavailable.

### Current qualification set R135–R211

```text
479 passed, 16 skipped, 0 failed
```

### Release gates

All **60** current release-gate scripts in the R150–R211 range passed in the
available environment. Gates requiring a real Qt runtime report
`PASS_HEADLESS`.

Additional cumulative gates passed:

- unified Light Curves merger gate — qualified through R211;
- Analyzer release gate;
- modal ephemeris gate;
- WPlanner performance and Markdown-hygiene gate.

## Distribution checks

- QA Python files syntax checked: **503**, errors: **0**
- CLEAN Python files syntax checked: **116**, errors: **0**
- QA/CLEAN shared production files compared: **125**
- QA/CLEAN production differences: **0**
- QA SHA-256 manifest entries: **560**
- CLEAN SHA-256 manifest entries: **125**
- ZIP integrity: **PASS**

## Remaining native qualification

The build host has no PyQt5 or native Wayland session. Full GUI qualification
still requires one offscreen and one native Linux/Wayland pass covering:

1. Analyzer selector → Add custom comet → Save and Cancel;
2. Planner selector with both `use_all` and explicit subset;
3. WVisual, WCCD and WStack explicit missing-elements buttons;
4. WStack Calib asynchronous preview and astrometry-group action;
5. persistent update of an already loaded Analyzer target;
6. absence of traceback and `QSocketNotifier` warnings.

R211 is therefore a final **headless-qualified** build, not a claim of native Qt
qualification on hardware that was unavailable to this build environment.
