# Feature Specification: Localization coverage and reachability integrity

**Feature ID**: 002
**Status**: draft

## Overview

The tracked inventory, the withdrawal declarations, and the published routes are maintained by
hand and nothing verifies they agree, so a new page can go permanently untranslated and a
withdrawn page's translation can become readable again without anyone noticing.

## Functional Requirements

- **FR-001** The integrity check shall report any reader-visible content inside the localized set
that is absent from the tracked inventory.
- **FR-002** If tracked content is removed without a withdrawal declaration, then the integrity
check shall fail.
- **FR-003** When content is declared withdrawn, the integrity check shall report any remaining
route by which a reader can reach its translation.
- **FR-004** The integrity check shall report interface-text references that resolve in no
locale, and translations that no reference uses.
- **FR-005** While a target language is enabled, the integrity check shall report any
reader-visible surface that is partially translated.
- **FR-006** Where prose resolves a product name from a variable and interface text states it
literally, the integrity check shall report the literals as rename-fragile.
- **FR-007** When source content is replaced rather than withdrawn for later return, the system
shall delete its translation rather than retain it.


## Acceptance Criteria

- **002-localization-coverage-integrity-AC-1** Adding a page to the localized set without tracking it fails the check; today it
passes silently.
- **002-localization-coverage-integrity-AC-2** Deleting a withdrawal declaration while its translation remains on disk fails the
check.
- **002-localization-coverage-integrity-AC-3** Removing a published route exclusion for withdrawn content fails the check.
- **002-localization-coverage-integrity-AC-4** An interface key called in code but absent from a locale fails the check.
- **002-localization-coverage-integrity-AC-5** A table column rendering a mixture of both languages fails the check.
- **002-localization-coverage-integrity-AC-6** The 18 translated interface values and 14 source-language defaults that state the
product name literally are reported; prose, which resolves it from a variable, is not.
- **002-localization-coverage-integrity-AC-7** With two target languages enabled, coverage and reachability are reported
independently per language, and a gap in one is not masked by the other.


## Deferred Edge Cases

- **DEF-1** Resolving the product name in interface text at the call site. Deferred 2026-10-01:
the substitution mechanism exists, but it propagates the name without the grammatical agreement
that surrounds it, so a rename still needs human review of every site.
- **DEF-2** Exercising multi-locale behaviour. Deferred 2026-10-01: no second target language is
under consideration, so requirements stay locale-generic but the behaviour is untested and is
not a release gate.