# Implementation Plan: Localization change detection across all reader-visible surfaces

## Approach

One detector that diffs two revisions and classifies what it finds, rather than six
checks each watching one surface. The existing drift check watches prose pages only and
is invoked by a `changes:` rule that also only names prose pages, so a component edit
produces no signal at all — not a passing check, no check.

Categories come from the surfaces the corpus actually has, each with a different way of
being reader-visible:

prose pages         section hashes already exist in the manifest
interface text      strings in `@theme/` reaching readers through translate()
navigation labels   entries in the in-scope sidebar
structured data     schema files the picker renders as field labels
shared fragments    partials, if an in-scope page ever includes one
images              referenced from in-scope pages
configuration       locale, ignore and redirect entries that decide reachability
unclassified        anything under the in-scope root that matches none of the above

The eighth is the one that earns its place. FR-005 asks for it because a surface nobody
anticipated is exactly what goes unnoticed: four of the six leak classes in this release
were in categories the pipeline did not know existed.

Renames are detected by pairing a removed section id with an added one whose content
hash matches (FR-003). Without that pairing a rename reads as an unrelated deletion and
addition, which overstates the work and loses the fact that a translation already
exists for the moved content.

"No translation required" is a positive result, not silence (FR-004). A writer who
changes a code sample should be told their change needs nothing, rather than left to
infer it from an absent message.

Reuses `sectionizeMarkdown` for units, `commentMask` and `nonTranslatable` for what
counts as reader-visible, and the keep-in-source list, so the detector agrees with the
verifier about what matters. Six copies of that judgement is five too many.

## Rollback

The detector reads two git revisions and writes a report. It changes no content.

## Appendix

### Alternatives considered

**Extending the drift check instead.** Rejected. That check answers "is the translation
stale", which is one category. Widening it would conflate staleness with the question
of whether a surface is tracked at all.

**Watching the filesystem rather than diffing revisions.** Rejected. The question is
always "what changed between these two states", and a revision pair is the only form of
that question CI can ask.

**Reporting file paths rather than content units.** Rejected. A page-level signal is
what made the previous resync passes expensive: the unit of work is the section, and
AC-1 asks for exactly one unit from a one-paragraph edit.