# Software Product Assurance Plan (SPAP)

| | |
|---|---|
| **Document** | Software Product Assurance Plan (SPAP) |
| **DRD** | ECSS-Q-ST-80C Rev.2 (30 April 2025), Annex B |
| **Container** | Product Assurance File (PAF) |
| **Project** | `sar-processor` — generic spaceborne SAR data processor |
| **Configuration item** | `gitlab.eopf.copernicus.eu/ipf/sar-processor` |
| **Software criticality** | Category C (ECSS-Q-ST-80C Rev.2 Annex D / ECSS-E-ST-40C Rev.1 Annex R) |
| **Baselined at** | SRR |
| **Status** | Draft for SRR |

> This SPAP is the software product assurance constituent of the Product Assurance File for the
> `sar-processor` project. It follows the ECSS-Q-ST-80C Rev.2 Annex B DRD section structure (clauses
> `<1>`–`<8>`), tailored for **Category C** and proportionate to a **single-developer** ground-segment
> project. Its central tenet: in the absence of an independent PA organisation, product assurance is
> **operationalised as automated, version-controlled CI quality and security gates** plus documented
> checklists, so that PA objectives are *evidenced* by pipeline artefacts rather than asserted. It is
> consistent with, and cross-references, the SDP (`compliance/software-development-plan.md`).

## <1> Introduction

The `sar-processor` is an operational ground-segment **forward** data processor that transforms
downlinked raw (Level-0) Synthetic Aperture Radar (SAR) instrument source packets into focused,
calibrated and geolocated products — L1 SLC, L1 GRD and geocoded GTC. It is a **generic spaceborne SAR
processor**: the chain (decode → focusing → radiometric calibration → detection/multi-look → geocoding)
is sensor-agnostic and driven by a per-sensor profile plus the per-acquisition product annotation. It is
built on the ESA EOPF (each stage an EOPF CPM `EOProcessingUnit`, products as `EOProduct`, outputs as
cloud-native Zarr, `eopf == 2.8.1`).

**Purpose and objective.** The purpose of this SPAP is to provide information on the organisational
aspects and the technical approach to the execution of the software product assurance programme for
`sar-processor`, in conformance with ECSS-Q-ST-80C Rev.2. The objective is to give assurance — to the
project owner and to any downstream user of the products — that the processor is developed under a
controlled, standards-conformant process and that the delivered software meets its specified quality
requirements.

**Content.** This plan describes the PA organisation and independence model (`<5.1>`–`<5.2>`), the PA
resources, reporting, quality models, risk and supplier contributions, and the methods and tools
(`<5.3>`–`<5.10>`); the software process assurance measures including dependability, security,
configuration/non-conformance control, metrics, reuse and per-activity PA planning (`<6>`); the software
product quality assurance approach mapping each CI gate to a PA objective (`<7>`); and the compliance
matrix to the applicable ECSS-Q-ST-80 clauses (`<8>`).

**Reason prompting preparation.** This document is prepared at project start to establish the **SRR
baseline** of the software product assurance programme, and is maintained throughout the life cycle.

## <2> Applicable and reference documents

**Applicable documents**

| Ref | Document |
|---|---|
| AD-1 | ECSS-Q-ST-80C Rev.2 (30 April 2025) — Space product assurance — Software product assurance |
| AD-2 | ECSS-E-ST-40C Rev.1 (30 April 2025) — Space engineering — Software |
| AD-3 | ECSS-Q-ST-10C Rev.1 — Space product assurance — Product assurance management |
| AD-4 | ECSS-M-ST-40C — Configuration and information management |
| AD-5 | ECSS-M-ST-80C — Risk management |

**Reference documents**

| Ref | Document |
|---|---|
| RD-1 | SDP — Software Development Plan (`compliance/software-development-plan.md`) |
| RD-2 | SRevP — Software Review Plan (`compliance/drd/srevp-software-review-plan.md`) |
| RD-3 | Risk Register (`compliance/drd/risk-register.md`) |
| RD-4 | V&V Plan — SVerP/SValP/SUITP (`compliance/drd/vv-plan.md`) |
| RD-5 | SRF — Software Reuse File (`compliance/drd/srf-software-reuse-file.md`) |
| RD-6 | EOPF SDE — User Manual & CI/SonarQube quality-gate guidelines |
| RD-7 | EOPF Core Python Modules (CPM) documentation (`eopf == 2.8.1`) |

## <3> Terms, definitions and abbreviated terms

Terms and definitions follow AD-1, AD-2 and the SDP §3 / SSS §3. Abbreviations specific to or emphasised
in this SPAP and not already defined there:

| Abbreviation | Definition |
|---|---|
| NCR | Non-Conformance Report |
| NRB | Non-conformance Review Board (here: the documented single-developer disposition record) |
| PA | Product Assurance |
| PAF | Product Assurance File |
| SAST | Static Application Security Testing |
| SCA | Software Composition Analysis (dependency vulnerability scanning) |
| SPA | Software Product Assurance |
| SPAMR | Software Product Assurance Milestone Report (tailored out — see `<5.4>`) |
| SQ | SonarQube |

(ECSS review acronyms SRR/PDR/CDR/QR/AR and DRD acronyms per the SDP §3.)

## <4> System Overview

A full description of the system and software products is given in the SDP §1 and in the SSS/IRD; it is
not duplicated here. In summary, the configuration item is the Python package `sar_processor` (the `main`
branch of the Git repository), composed of L0→GTC processing stages implemented as EOPF CPM
`EOProcessingUnit`s with a pure, unit-testable `core.py` plus a thin `unit.py` wrapper, parameterised by a
per-sensor profile and the per-acquisition product annotation. Outputs are Zarr `EOProduct`s (complex SLC,
detected GRD, geocoded GTC). The software is distributed as a Python wheel and a container image; the
runtime is the EOPF SDE (`registry.eopf.copernicus.eu/sde/...`, Python 3.11).

**Data and exportability policy (PA-relevant).** Source code is public (Apache-2.0). Raw input data and
instrument calibration ADFs (AUX_CAL/INS/PP1, orbit, attitude, DEM) are **private** — never committed and
never used in public CI; they may be held in the project Studio VM data store and referenced at run time.
Numerical verification on real data is performed locally / on the Studio VM. This split shapes the PA
approach: CI assures *process and code* quality plus a **synthetic point-target focusing test** that needs
no private data; *numerical* product quality (focusing/calibration/geolocation) is assured locally on real
Sentinel-1 data and recorded in the SVR.

## <5> Software product assurance programme implementation

### <5.1> Organization

**Organizational structure.** `sar-processor` is a **single-developer** project. The project owner holds,
concurrently, the supplier-side software engineering, software product assurance, and verification roles.
There is no separate PA department and no customer/supplier hierarchy beyond the project owner and the
hosting EOPF SDE programme.

**Interfaces.** The only external organisational interface is the **EOPF SDE platform team** (provider of
the build image, CI runner, SonarQube instance and Pages hosting), consumed as a service. There are no
internal sub-organisations. ECSS milestone governance is the `ipf` GitLab group (SRR→PDR→CDR→QR→AR
milestones).

**Relationship to system-level PA and safety.** `sar-processor` is ground-segment software with no
flight, safety or mission-loss function (see `<6.3>`); there is no system-level safety case to interface
with. System-level PA reduces to the milestone reviews and the Risk Register (RD-3).

**Independence of the SPA function.** Personnel independence is not achievable in a single-developer
project. Independence of the *verification and PA judgement* is therefore obtained by **structural and
automated means**:

1. **Automated, non-overridable gates** — the CI pipeline (`.gitlab-ci.yml`) executes the quality and
   security checks of `<5.8>`/`<7>` on every merge request; blocking gates fail the pipeline independently
   of the developer's opinion. The developer cannot merge a gate-failing change without an explicit,
   recorded waiver.
2. **Static, version-controlled tool configurations** — gate thresholds live in `pyproject.toml`,
   `.flake8`, `.mypy.ini`, `bandit.yml`, `.coveragerc`, `.hadolint.yml` and `.pre-commit-config.yaml`;
   changing a threshold is itself a reviewable diff with audit trail.
3. **A third-party adjudicator** — SonarQube applies the EOPF quality gate (`<5.5>`) as an external
   pass/fail authority on coverage, reliability, security and maintainability.
4. **Documented checklists** — merge-request and milestone-review checklists (RD-2) force an explicit,
   recorded self-review against PA criteria before baselining.

**Delegation to a lower-level supplier.** None. No software is procured or subcontracted; all third-party
software is open-source *reuse* assured per `<5.7>`/`<6.7>` and the SRF (RD-5).

### <5.2> Responsibilities

The SPA function (the project owner acting in the PA role) is responsible for:

- defining and maintaining this SPAP and the PA-relevant configurations of the CI gates;
- ensuring every change to `main` passes the blocking CI gates, or carries a recorded waiver;
- triaging, classifying and dispositioning non-conformances (`<6.5>`);
- maintaining standards conformance (`<6.9>`) and the compliance matrix (`<8>`);
- assuring reused software (scaffold, EOPF CPM, OSS) via the SRF and the SCA gate (`<6.7>`);
- reporting PA status at each milestone review (`<5.4>`).

### <5.3> Resources

**Human resources and skills.** One person (the project owner), competent in Python, EOPF CPM, SAR/remote-
sensing data processing and the ECSS-E-40/Q-80 framework. No additional PA staff are allocated; the
staffing model and its rationale are in the SDP §4.

**Hardware.** Development workstation; the EOPF SDE Studio VM hosting the GitLab **shell-executor** CI
runner and the private data store. Container-runtime / Dask-gateway / S3-dependent jobs are not runnable
on the shell runner and are configured non-blocking until a Kubernetes runner is available (see `<5.8>`).

**Software tools.** The CI toolchain of `<5.8>` (flake8, black, isort, mypy, bandit, trivy, xenon,
hadolint, docstr-coverage, pytest+coverage, SonarQube, pre-commit), the GitLab platform (issues, merge
requests, milestones, package & container registries, Pages), and the EOPF CPM build image. All tools are
open-source or platform-provided; licences are recorded in the SRF.

### <5.4> Reporting

PA reporting is **artefact-based and continuous** rather than periodic written reports:

- **Per change:** the CI pipeline status and its artefacts (`linter.txt`, `coverage.xml`,
  `TEST-pytests.xml`, `vulnerability.json`, trivy output, SonarQube dashboard) are the standing PA record
  for each merge request.
- **Per milestone:** PA status (gate results, open non-conformances by severity, waivers, standards-
  conformance and compliance-matrix status) is summarised in the milestone review per RD-2 and recorded
  against the GitLab milestone.

A standalone **Software Product Assurance Milestone Report (SPAMR, Annex C)** is **tailored out** for this
Category C single-developer project; its content is subsumed by the milestone review record and the SVR
(RD-4). This tailoring is recorded in the SDP §5.6 and in `<8>`.

### <5.5> Quality models

The applicable product-quality model is the **EOPF SonarQube quality gate** (RD-6), expressed as
quantitative thresholds and used to derive the product quality requirements assured in `<7>`:

| Quality characteristic | Metric | Target |
|---|---|---|
| Reliability | SonarQube reliability rating | A |
| Security | SonarQube security rating | A |
| Maintainability | Technical-debt ratio | ≤ 5 % |
| Testability | Unit-test line coverage (new code) | ≥ 70 % |
| Security (vulnerabilities) | Open vulnerabilities | 0 |
| Analysability | Comment / documentation density | ≥ 20 % |

Complexity is additionally bounded by `xenon` (`<5.8>`). These thresholds are the contract between the CI
gates (`<7>`) and the PA objectives; deviations are non-conformances (`<6.5>`).

### <5.6> Risk management

The SPA function contributes to project risk management (AD-5) by surfacing process and product risks
(e.g. uncovered code paths, unfixed dependency CVEs, complexity hotspots, EOPF complex/burst feasibility,
IPF-version-gating sprawl, ground-truth-data availability) from the CI gate outputs and the engineering
analysis into the **Risk Register** (RD-3), which is reviewed at each milestone. PA-originated risks are
raised as GitLab issues with the `Risk` template and linked to their mitigation merge requests.

### <5.7> Supplier selection and control

There are **no commercial software suppliers and no subcontracting**. The only "suppliers" are the
**open-source projects reused** by `sar-processor` (the scientific-Python stack incl. the FFT backend) and
the EOPF SDE platform. The SPA contribution to their selection and control is:

- **Selection** — driven by the EOPF CPM ecosystem and recorded, with licence and provenance, in the SRF
  (RD-5); only permissively licensed (Apache-2.0/MIT/BSD/PSF) components are admitted. In particular the
  FFT backend defaults to `numpy.fft` (BSD) to avoid the copyleft (GPL) obligation of FFTW/`pyFFTW`
  (SRF <3>).
- **Control** — versions are pinned (`pyproject.toml`, `eopf == 2.8.1`); dependency vulnerabilities are
  monitored by the **trivy** SCA gate (`deps-sec`, `<6.7>`); licence and exportability constraints are
  tracked in the SRF.

### <5.8> Methods and tools

PA is implemented through an automated toolchain applied at two stages — **local pre-commit** and **CI
pipeline** — over the development cycle. All tools are mature, widely adopted open-source products at
stable releases (versions and licences in the SRF, RD-5); their configurations are version-controlled.

**Local gate.** `pre-commit` (`.pre-commit-config.yaml`) runs fast formatting/lint hooks before each
commit, shifting defect detection left of CI.

**CI gate inventory** (`.gitlab-ci.yml`). Blocking = pipeline fails on violation; Non-blocking =
`allow_failure: true` (reported, not gating — pending the SDE Kubernetes runner, or advisory by nature):

| Job | Tool | Config | Invocation (essentials) | Gating |
|---|---|---|---|---|
| `linter` | flake8 | `.flake8` | `flake8 sar_processor tests` | **Blocking** |
| `formater` | black, isort | `pyproject.toml` | `black --check --diff .`; `isort --check --diff` | **Blocking** |
| `typing` | mypy | `.mypy.ini` | `mypy sar_processor` | **Blocking** |
| `unit-tests` | pytest, coverage | `pyproject.toml`, `.coveragerc` | `pytest --cov -m unit` → cobertura + junit | **Blocking** |
| `security` | bandit | `bandit.yml` | `bandit -c bandit.yml -r sar_processor` (+ JSON) | **Blocking** |
| `docker-linter` | hadolint | `.hadolint.yml` | `hadolint Dockerfile` (codequality report) | **Blocking** |
| `deps-sec` | trivy | — | `trivy fs --exit-code 1 --severity HIGH,CRITICAL --ignore-unfixed` | Non-blocking |
| `complexity` | xenon | — | `xenon --max-average B --max-modules C --max-absolute D` | Non-blocking |
| `docs-cov` | docstr-coverage | — | `docstr-coverage -F 30` | Non-blocking |
| `sonarqube` | SonarQube scanner | server gate | `sonar-scanner -Dsonar.qualitygate.wait=true` (ingests flake8/bandit/coverage/junit) | Non-blocking |

**Maturity note.** `trivy`, `complexity` and `sonarqube` are intended to be **blocking** once the SDE
Kubernetes runner replaces the shell executor; until then they run advisory so that no infrastructure
limitation silently weakens a PA objective. This planned hardening is tracked as a risk in RD-3.

### <5.9> Process assessment and improvement

**Scope and objectives.** Assessment is limited to verifying that the documented life cycle (SDP) and the
CI gates of this SPAP are actually applied, and to incrementally tightening gates as the codebase and
infrastructure mature. Formal external process assessment (e.g. ISO/IEC 15504) is **tailored out** as
disproportionate for Category C single-developer scope.

**Methods and tools.** Assessment evidence is the Git/CI history (every change is a reviewed merge request
with an attached pipeline) and the milestone-review checklists (RD-2). Improvement actions are raised as
GitLab issues (`Action` template) and closed via merge requests — e.g. promoting a non-blocking gate to
blocking, raising the coverage target, or adding a check.

### <5.10> Operations and maintenance (optional)

Operations and maintenance PA is **light**. Maintenance is performed through the same gated
issue→branch→merge-request→review flow as development; releases follow semantic versioning with Git tags
and GitLab Releases. A standalone Software Maintenance Plan is tailored out (SDP §5.5.2); maintenance
quality is assured by re-running the full CI gate set on every change, including after delivery.

## <6> Software process assurance

### <6.1> Software development cycle

The software development life cycle is defined in the **SDP** (RD-1, §5.1–5.2): an incremental paradigm
synchronised by the ECSS reviews SRR→PDR→CDR→QR→AR (GitLab milestones), with implementation starting only
after CDR. The SPAP does not redefine it. The milestone immediately **before the start of software
validation** is **CDR**: design, test plans (RD-4) and the reuse file are baselined at CDR, after which
coding and then validation proceed.

### <6.2> Projects plans

All project plans and their relationships are defined in the SDP §5.5 (tailored DRL). The plans relevant
to PA are: this SPAP, the SDP (RD-1), the SRevP (RD-2), the V&V Plan (RD-4), the Risk Register (RD-3) and
the SRF (RD-5). Each plan is baselined at the review indicated in the SDP DRL and updated through merge
requests thereafter; timely preparation/update is enforced by tying each plan to its GitLab milestone.

### <6.3> Software dependability and safety

`sar-processor` is classified **Category C** (ECSS-Q-ST-80C Rev.2 Annex D). Rationale: a failure produces
degraded or incorrect *data products only* — there is no safety, mission-loss or space-segment consequence,
and any defect is recoverable by reprocessing. Consequently:

- **No safety-critical functions** exist; no safety case, FMECA or fault-tree analysis is required, and the
  corresponding ECSS-Q-ST-80 dependability/safety requirements are tailored out for Category C (recorded in
  `<8>`).
- The dependability measures retained are *correctness* measures, proportionate to Category C: deterministic
  unit tests with coverage gating, static typing (mypy), bounded complexity (xenon), and **numerical-
  accuracy** control of the SAR algorithms — focusing (impulse-response PSLR/ISLR/IRW), radiometric
  calibration (σ0 accuracy) and geolocation (ALE) — verified on a synthetic point target (CI) and locally
  on real Sentinel-1 data and recorded in the SVR (see `<6.9>` item 15 and `<7>`). Determinism of the FFT
  backend and complex dtype is fixed (SSS SYS-RAM-01) so numerical budgets are reproducible.

### <6.4> Software security

The software handles no classified or security-sensitive information; there is no security-sensitive
function. The security assurance approach is nonetheless concrete:

- **No secrets in the repository.** Credentials and platform tokens (e.g. `SQ_LOGIN`, `CI_REGISTRY_PASSWORD`,
  `DATASTORE_TOKEN`, Studio VM tokens) are CI variables only; a `validate-variables` step fails the pipeline
  if a required variable is unset. Raw data and calibration ADFs are never committed.
- **SAST** — `bandit` (`security` job, blocking) statically scans `sar_processor` for common Python security
  defects; findings are also fed to SonarQube.
- **SCA** — `trivy fs` (`deps-sec` job) scans dependencies for HIGH/CRITICAL CVEs.
- **Container hardening** — `hadolint` (`docker-linter`, blocking) lints the `Dockerfile`.

This clause constitutes the **security assurance section** required by the DRD: the related security
activities are the gates above and the no-secrets/data-privacy policy of `<4>`. No separate security file is
produced (none is warranted at this criticality).

### <6.5> Software documentation and configuration management

**Contribution to documentation and CM.** PA assures that every configuration item — code, formal DRD
documents, CI configuration — is under Git version control with change introduced only through reviewed
merge requests, per ECSS-M-ST-40C (AD-4). Configuration identification, status accounting and the
baseline-per-milestone scheme are defined in the SCF/CIDL and the SDP §5.2.

**Non-conformance control system.** Non-conformances are managed as **GitLab issues** on the project, which
constitute the NCR channel. The procedure applies **from the SRR baseline onward**. The workflow is:

1. **Report** — an issue is opened using the appropriate template (`Bug`, `Action`, `Documentation`,
   `Risk`), or auto-evidenced by a failing CI gate.
2. **Classify** — a severity label is applied:

   | Label | Meaning |
   |---|---|
   | `severity:critical` | Wrong/lost product data, security exposure, or pipeline-blocking failure |
   | `severity:major` | Incorrect result (e.g. mis-focused / mis-calibrated product) or broken feature with no workaround |
   | `severity:minor` | Degraded behaviour with a workaround |
   | `severity:trivial` | Cosmetic / documentation defect |

3. **Disposition** — the project owner records the disposition (fix / waiver / N/A) on the issue; this is the
   single-developer equivalent of an NRB decision. A waiver of a blocking gate is only valid when recorded
   on the issue with rationale and an expiry/closure condition.
4. **Verify & close** — the fix is delivered by a linked merge request that must pass the full gate set; the
   issue is closed with the merge reference, giving end-to-end traceability from report to verified fix.

**Protection, integrity key and labelling of delivered software.** The delivered wheel and container image
are integrity-identified by **SHA-256 checksum** (wheel) and **image digest** (container); the
**labelling/marking** of a release is the **semantic-version Git tag + GitLab Release** (and the package-
registry version), which is the authoritative delivered-media label. These identifiers are recorded in the
SRelD/SRN.

### <6.6> Process metrics

Process metrics are derived from the quality model (`<5.5>`) and collected automatically by the CI pipeline
as build artefacts: test pass/fail and coverage trend (`coverage.xml`, `TEST-pytests.xml`), static-analysis
and security findings (`linter.txt`, `vulnerability.json`, trivy output), complexity and docstring-
coverage, and the SonarQube history. They are stored as pipeline artefacts and in the SonarQube project,
analysed at each milestone, and used to manage the process (e.g. promoting gates to blocking, prioritising
refactoring of complexity hotspots such as the focusing kernels).

### <6.7> Reuse of software

`sar-processor` reuses (a) the **sensor-agnostic scaffold/process** of the sibling `msi-processor` project,
(b) the **EOPF CPM** framework and the scientific-Python stack (incl. the FFT backend) as runtime
dependencies, and (c) the **public Sentinel-1 algorithm basis** (IPFDPM/SentiWiki) as the algorithm
reference (SDP §1, SRF RD-5). The PA approach for reuse:

- Every reused component is declared in the **SRF** (RD-5) with category, version, licence, exportability
  constraints and execution environment.
- **Delta qualification** of reused *scaffold/code* is achieved by integration into the gated pipeline:
  reused libraries are exercised through `sar_processor`'s own unit/integration tests, type checks and the
  `trivy` SCA gate; only permissive licences are admitted (`<5.7>`).
- Reuse of the *algorithm basis* is qualified by writing each SAR Core new against its ATBD and verifying
  numerical results (synthetic point target in CI + real Sentinel-1 data locally, recorded in the SVR),
  since the basis is public mathematics, not a black-box binary. **No structural identity with
  msi-processor is levied** (SRF); the SAR product/complex/burst elements are new development.

### <6.8> Product assurance planning for individual processes and activities

| Activity | PA measures |
|---|---|
| Software requirements analysis | Uniquely-identified `REQ-*` requirements with forward/backward traceability (SRS + traceability matrix); reviewed at PDR. |
| Architectural & detailed design | EOPF CPM PU pattern (pure core + thin wrapper) reviewed against SRS at CDR; design recorded in SDD/DJF; `product/` + complex/burst new-development boundary recorded in SRF. |
| Coding | `flake8` + `black` + `isort` + `mypy` + `bandit` blocking gates; `xenon` complexity bound; PEP 8; deterministic FFT/dtype. |
| Testing & validation (incl. regression) | `pytest -m unit` blocking with ≥ 70 % coverage gate incl. the synthetic point-target focusing test; full gate set re-run on every change provides regression assurance; integration tests when runner available; numerical validation locally on real S1 data → SVR. |
| Verification | Per the V&V Plan (RD-4); gate artefacts are verification evidence; milestone checklists (RD-2). |
| Delivery & acceptance | Wheel/image built and (on tag) published; integrity checksums and SemVer labelling (`<6.5>`); acceptance at QR/AR. |
| Operations & maintenance | Light (`<5.10>`): same gated flow post-delivery. |

### <6.9> Procedures and standards

| # | Aspect | Standard / procedure | PA adherence measure |
|---|---|---|---|
| 1 | Project management | SDP (RD-1), GitLab milestones | Milestone review checklist |
| 2 | Risk management | AD-5, Risk Register (RD-3) | Reviewed each milestone |
| 3 | Config. & documentation mgmt | AD-4, SCF/CIDL | All CIs in Git; MR-only changes |
| 4 | Verification & validation | V&V Plan (RD-4) | Gate artefacts; SVR |
| 5 | Requirements engineering | ECSS-E-ST-40 DRDs | Traceability matrix |
| 6 | Design | EOPF CPM PU pattern | CDR design review |
| 7 | Coding | PEP 8 | `flake8`/`black`/`isort` (blocking) |
| 8 | Metrication | EOPF SQ quality gate (`<5.5>`) | SonarQube + coverage gates |
| 9 | Non-conformance control | `<6.5>` | GitLab issues + severity labels |
| 10 | Audits | Self-audit via Git/CI history | `<5.9>` |
| 11 | Alerts | GitLab security advisories; trivy CVEs | `deps-sec` job |
| 12 | Procurement | N/A (no procurement) | SDP §4 |
| 13 | Reuse of existing software | SRF (RD-5) | `<6.7>` |
| 14 | Use of methods and tools | `<5.8>` | Version-controlled tool configs |
| 15 | Numerical accuracy | ATBD / SVR | Point-target (CI) + real-data (local) verification of focusing/calibration/geolocation |
| 16 | Delivery, installation, acceptance | SRelD/SRN | Checksums + SemVer (`<6.5>`) |
| 17 | Operations / maintenance | `<5.10>` | Gated MR flow |
| 18 | Device programming and marking | N/A (no programmable devices) | — |

## <7> Software product quality assurance

The approach to ensuring software-product quality is the **mapping of each CI gate to a PA objective**, with
target values from the quality model (`<5.5>`) and automated collection. This is the core of the single-
developer independence model (`<5.1>`): the gates are the assurance activities.

**Gate → PA objective mapping**

| PA objective | Product metric & target | CI gate (job/tool) | Collection means | Feedback |
|---|---|---|---|---|
| Code is style-conformant & lint-clean | 0 flake8 violations | `linter` / flake8 (blocking) | `linter.txt` artefact → SonarQube | Pipeline fails; fix via MR |
| Code is consistently formatted | 0 black/isort diffs | `formater` (blocking) | check-mode diff | Pipeline fails |
| Type contracts hold | 0 mypy errors | `typing` / mypy (blocking) | job log | Pipeline fails |
| Behaviour is correct & covered | tests pass; coverage ≥ 70 %; point-target focusing budgets met | `unit-tests` / pytest+cov (blocking) | cobertura + junit artefacts | Pipeline fails; coverage trend |
| No SAST security defects | 0 bandit findings | `security` / bandit (blocking) | `vulnerability.json` → SonarQube | Pipeline fails |
| No vulnerable dependencies | 0 HIGH/CRITICAL CVEs | `deps-sec` / trivy (advisory→blocking) | trivy report | Risk/issue raised |
| Container image well-formed | 0 hadolint errors | `docker-linter` / hadolint (blocking) | codequality report | Pipeline fails |
| Complexity bounded | xenon ≤ B avg / C module / D abs | `complexity` / xenon (advisory→blocking) | job log | Refactor issue |
| Code is documented | docstring coverage ≥ 30 % (→ SQ ≥ 20 %) | `docs-cov` / docstr-coverage | badge artefact | Issue raised |
| Overall product quality | SQ gate: reliability A, security A, debt ≤ 5 %, vulnerabilities 0 | `sonarqube` (`qualitygate.wait=true`) | SonarQube dashboard | Gate verdict |
| Numerical/product correctness | focusing/σ0/ALE within tolerance vs reference (local) | local verification (not CI) | SVR (RD-4) | Documented at QR |

**Metrication programme.** Metrics are collected on **every** push and merge request (continuous
metrication); trends accumulate in SonarQube and in pipeline artefacts and are reviewed at each milestone
(`<6.6>`).

**Analyses and feedback.** Gate failures feed back immediately to the developer (the pipeline blocks the
merge); trend analyses (coverage, complexity, debt) feed back at milestones and drive the improvement
actions of `<5.9>`.

**Documentation quality requirements.** Code is documented to the docstring-coverage and comment-density
targets above; formal DRD documents follow their Annex structure and are reviewed per RD-2.

**Assurance activities.** The blocking gates, the SonarQube quality verdict, the review checklists and the
local numerical verification together constitute the assurance that the product meets its quality
requirements.

## <8> Compliance matrix to software product assurance requirements

Compliance to the applicable ECSS-Q-ST-80C Rev.2 clauses (per the SPAP traceability of DRD Table B-1),
tailored for Category C. Legend: **C** = compliant, **NC** = non-compliant, **NA** = not applicable /
tailored out.

| ECSS-Q-ST-80 clause | Topic | Compliance | SPAP reference | Remarks |
|---|---|---|---|---|
| 5.1.2 / 5.1.3 / 5.1.4 | PA organisation, responsibility, authority | C | `<5.1>`, `<5.2>` | Single-developer; independence via tooling |
| 5.2.1 | PA planning and control | C | `<5.4>`, `<5.8>` | Artefact-based, continuous |
| 5.2.1.4 | Operations & maintenance measures | C | `<5.10>` | Light |
| 5.2.1.5 | Compliance matrix maintained | C | `<8>` | This table |
| 5.2.6 | Non-conformances | C | `<6.5>` | GitLab issues + severity labels |
| 5.2.7 | Quality requirements and quality models | C | `<5.5>`, `<7>` | EOPF SQ quality gate |
| 5.3 | Risk management contribution | C | `<5.6>` | Risk Register (RD-3) |
| 5.4.3 / 5.4.4 | Supplier selection & control | NA | `<5.7>` | No suppliers; open-source reuse only |
| 5.6.1 | Methods and tools | C | `<5.8>` | Version-controlled tool configs |
| 5.7 | Process assessment & improvement | C | `<5.9>` | Self-audit via Git/CI; ext. assessment tailored out |
| 6.1 | Software development cycle | C | `<6.1>` | Defined in SDP (RD-1) |
| 6.2.x | Documentation of processes / metrics / CM / verification | C | `<6.2>`,`<6.5>`,`<6.6>`,`<7>` | — |
| 6.2.2 / 6.3.x | Dependability and safety; critical software | NA | `<6.3>` | Category C; no safety function |
| 6.2.7 | Reuse of existing software | C | `<6.7>` | SRF (RD-5) + delta qualification |
| 6.2.9 / 6.2.10 | Software security / sensitive software | C / NA | `<6.4>` | Security gates present; no sensitive data |
| 6.3.3–6.3.5 | PA for design / coding / testing & validation | C | `<6.8>` | Per-activity gates |
| 7.1 | Product quality objectives & metrication | C | `<5.5>`, `<7>` | Gate→objective mapping |
| 7.1.7 | Numerical accuracy | C | `<6.9>` #15, `<7>` | Point-target (CI) + real-data (local) → SVR |
| 7.2.2.3 | Design/related documentation quality | C | `<6.8>`, `<7>` | — |
| 7.5.x | Programmable device programming/marking/calibration | NA | `<6.9>` #18 | No programmable devices |
| Annex C | SPAMR | NA | `<5.4>` | Tailored out; subsumed by milestone review + SVR |

---

*End of SPAP. Authored per ECSS-Q-ST-80C Rev.2 Annex B; tailored for Category C, single-developer. May be
combined with the project Product Assurance Plan (ECSS-Q-ST-10) per DRD B.2.2.*
