# KOPR R187 — Comet Analyzer final integration release-gate report

**Date:** 2026-08-03  
**Input:** R186 `COMET_ANALYZER_TYPED_TARGET_CLEANUP`  
**Output:** R187 `COMET_ANALYZER_FINAL_INTEGRATION`  
**Qualification:** `PASS_HEADLESS`

## 1. Scope

R187 closes the Analyzer/Comparison merger remediation sequence. It contains no
new scientific calculation or user-data transformation. The batch consolidates
release gates, removes obsolete test expectations and updates current
user/developer documentation to the final **1..N Comet Analyzer workspace**
architecture.

The following scientific/runtime domains are unchanged from R186:

- observation values and channel classification;
- two-body photometric geometry;
- magnitude reduction and fit mathematics;
- Marcus phase correction;
- adaptive-break fitting;
- formula sampling and rendering;
- R183 Light Curve Scenario schema;
- R184 transactional scenario restore.

## 2. Changes

### 2.1 Current cumulative cutover gate

`wlightcurves_merger_release_gate.py` remains available to historical R136–R149
tests, but now verifies the current R187 architecture rather than removed
transitional source spellings.

It protects:

- one production `WLightCurves` implementation;
- one `Comet Analyzer` tab and one `WLIGHTCURVES_POLICY` identity;
- immutable typed targets and datasets;
- 1..N target-scoped returns and formulas;
- global channel/Fit-group policy;
- current fit, adaptive-break and colour-index engines;
- Light Curve Scenario support;
- isolation of the legacy Comparison parser.

The compatibility result retains `release = R144` for historical traceability
and adds `qualified_through = R187`.

### 2.2 Obsolete tests updated

The old adaptive-fit source assertion expected:

```text
button_click_analyse() -> self.button_click_update()
```

The current contract is now tested instead:

```text
button_click_analyse()
  -> _commit_analysis_fit_result()
  -> _analysis_note_formula_change()
  -> _analysis_start_plot()
```

This verifies the R178/R185 atomic typed-formula commit path and does not force a
removed GUI method call.

R144/R145 source checks were also updated to the current `Comet Analyzer` label,
typed target-order title generation and present compatibility boundary.

### 2.3 Final R187 integration gate

Added:

- `r187_comet_analyzer_final_integration_release_gate.py`;
- `tests/test_r187_comet_analyzer_final_integration.py`.

The gate composes the current R181–R186 component gates and verifies:

- observation-X/model-Y automatic-range policy;
- `Auto range` availability;
- one common Light Curve Scenario for 1..N targets;
- one-to-many target-state architecture;
- typed target loading without `type_codes` or active `self.script`;
- migration-only legacy parser isolation;
- current documentation terminology.

### 2.4 Documentation consolidation

Updated current documentation now describes:

- one Comet Analyzer workspace for 1..N comets;
- global channel visibility and Fit groups;
- Independent fit for 1..N and Shared `n` only for 2+ targets;
- active-target formula editors with all-target atomic validation;
- observation-defined automatic X range;
- model/formula/Bortle influence only on automatic Y inside that X interval;
- the cached `Auto range` view command;
- portable `.kopr-lc.json` Light Curve Scenarios;
- deprecated `wanalyzer.py`/`wcomparison.py` aliases;
- one-way migration-only use of `legacy_comparison_import.py`.

The current QA qualification command is explicitly separated from R100–R134
historical characterization tests, which document intermediate architectures
and are not the R187 release criterion.

## 3. Verification

### 3.1 Current Analyzer regression suite

Executed:

```bash
python3 -m pytest -q \
  tests/test_r13[5-9]*.py \
  tests/test_r14*.py \
  tests/test_r15*.py \
  tests/test_r16*.py \
  tests/test_r17*.py \
  tests/test_r18*.py
```

Result:

- **384 passed**;
- **3 skipped** because PyQt5 is unavailable;
- **0 failed**.

Skipped GUI modules:

- R154 Qt state-machine smoke;
- R161 display-encoding Qt state-machine smoke;
- R179 interactive formula qualification.

### 3.2 Release gates

All headless release gates R150–R187 completed successfully.

The strict Qt-dependent gates report `PASS_HEADLESS` where applicable:

- R154;
- R161;
- R179.

The new R187 component status is:

| Component | Result |
|---|---|
| cumulative cutover | PASS |
| R181 automatic Y envelope | PASS |
| R182 Auto range | PASS |
| R183 scenario contract | PASS |
| R184 scenario GUI/runtime | PASS |
| R185 1..N unification | PASS |
| R186 typed-target cleanup | PASS |
| R187 final integration | PASS |

### 3.3 Documentation hygiene

- QA distribution: **PASS**, 12 expected Markdown files;
- CLEAN distribution: **PASS**, 5 expected Markdown files;
- no per-release report was inserted into either archive.

### 3.4 QA/CLEAN parity

- common production/distribution files excluding manifests: **120**;
- byte differences: **0**.

### 3.5 Manifests and archive integrity

- QA manifest: **502 verified entries**, 0 errors;
- CLEAN manifest: **120 verified entries**, 0 errors;
- both ZIP archives passed `unzip -t` with no errors.

Archive SHA-256:

```text
21f6b5e686d2baa4738f9c541126dea664157067ae4eb747c0ad5ecb8efc84ca  KOPR_QA_BUILD_20260803_R187_COMET_ANALYZER_FINAL_INTEGRATION.zip
e1259f663e898227031434925b33f85502aca375106c4149621e1569f444b1e5  KOPR_CLEAN_BUILD_20260803_R187_COMET_ANALYZER_FINAL_INTEGRATION.zip
```

## 4. Qualification limit

PyQt5 is not installed on the build host. R187 is therefore qualified as
**PASS_HEADLESS**, not as a full native GUI release. Before final public release,
run the strict offscreen and native Linux Qt smokes on a host with PyQt5.

## 5. Deferred Analyzer audit items

R187 closes the Comparison/1..N remediation plan only. The following previously
recorded Analyzer audit items remain intentionally deferred and unchanged:

1. remove the incorrect `deg` suffix from the dimensionless Marcus `d_90`
   parameter;
2. add an explicit Legacy pooled-fit preset when old Analyzer result
   reproduction is required;
3. decide and implement the final policy for generic/clear/unfiltered CCD data.

The automatic-range requirement is complete: model curves influence automatic
Y only and never automatic X.
