ADR: bilingual structure — EN canonical in adr/, KO mirror in adr-ko/

Establish English as the canonical ADR language with Korean translations
held in a parallel docs/adr-ko/ tree as derived artifacts (1:1 mirror).
Promotion from adr-proposed/ to adr/ now writes English to adr/ and the
Korean to adr-ko/; bidirectional sync rule documented in CLAUDE.md.

- Migrate 30 ADRs in docs/adr/: 28 Korean-only translated to English,
  2 bilingual pairs (ADR-0020, ADR-0023) consolidated (.en.md suffix
  dropped). ADR-0023 EN regenerated against KO source which had newer
  HW Realization Notes (D16-D23) section.
- docs/adr-history/ left frozen by design (transitional state).
- CLAUDE.md (Part 2): update ADR Lifecycle for 4-folder layout, mark
  docs/adr-ko/ as a Derived Artifact, add ADR Translation Discipline
  section covering bidirectional sync, conflict resolution (EN wins),
  and proposed-language freedom.
- tools/verify_adr_lang_pairs.py: new verification tool checking pair
  completeness, filename mirroring, ADR-ID match, Status byte-equality.
  Pre-commit hook intentionally not added; run on demand or in CI.
- tests/test_verify_adr_lang_pairs.py: 11 cases including CRLF/LF
  normalization, em-dash title separator, underscore-slug edge case.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-20 01:38:44 -07:00
parent 687c98086d
commit a796c1d2f7
42 changed files with 10515 additions and 3422 deletions
+66 -15
View File
@@ -202,8 +202,8 @@ General fallbacks. Apply to anything not explicitly covered above.
>
> Contains **foundations** (Authority & Scope → Terminology → Terminology
> Discipline → Mental Model → Common Failure Modes) followed by **rules**
> (Non-Trivial, Verification Plan, CLI, Derived Artifacts, runtime API /
> sim_engine Boundaries).
> (Non-Trivial, Verification Plan, CLI, Derived Artifacts, ADR Translation
> Discipline, runtime API / sim_engine Boundaries).
## Authority & Scope
@@ -218,14 +218,22 @@ General fallbacks. Apply to anything not explicitly covered above.
### ADR Lifecycle
ADRs live in one of three folders based on lifecycle state:
ADRs live in one of four folders. Three carry **canonical English**
content based on lifecycle state; the fourth holds Korean translations:
- `docs/adr/`**Accepted** (current implementation reflected).
- `docs/adr/`**Accepted** (canonical English; current
implementation reflected).
- `docs/adr-proposed/`**Proposed**, **Stub**, or **Draft** (design
only / future-work exploration / retroactive documentation pending
verification).
verification). **Authoring language is free** (any language); the
promotion step (below) translates to English.
- `docs/adr-history/`**Superseded** or **Merged** (no longer the
authoritative source; kept as historical record).
authoritative source; kept as historical record). Frozen — language
policy not applied retroactively.
- `docs/adr-ko/` — Korean translations of accepted ADRs (derived
artifact, 1:1 mirror of `docs/adr/`). English in `docs/adr/` is the
canonical source of truth; when KO and EN disagree, EN wins. See
*ADR Translation Discipline* below.
Status field values:
@@ -240,17 +248,23 @@ Status field values:
Transitions:
- **Proposed/Stub → Accepted**: when the ADR's decisions are
reflected in production code AND covered by tests. `git mv` from
`docs/adr-proposed/` to `docs/adr/`, change Status to `Accepted`.
reflected in production code AND covered by tests. If the proposed
ADR is in Korean, translate to English and place the English in
`docs/adr/`; move the Korean original to `docs/adr-ko/`. If the
proposed ADR is in English, `git mv` it to `docs/adr/` and create
the Korean translation in `docs/adr-ko/`. Change Status to
`Accepted` in both files.
- **Draft → Accepted**: when the ADR's text has been verified to
accurately describe the existing implementation. `git mv` from
`docs/adr-proposed/` to `docs/adr/`, change Status to `Accepted`.
accurately describe the existing implementation. Same English /
Korean placement rule as above.
- **Accepted → Superseded**: set Status to `Superseded by ADR-MMMM`
and `git mv` to `docs/adr-history/`. The superseding ADR includes
a "Supersedes ADR-NNNN" reference (or, for partial supersession of
clauses, documents this in its own body).
in both the EN and KO files and `git mv` both to their respective
history locations (`docs/adr-history/` for English; the KO copy
stays in `docs/adr-ko/` only if it was already mirrored — see *ADR
Translation Discipline* for the frozen-history exception).
- **Accepted → Merged**: set Status to `Merged into ADR-MMMM`
(single-line stub) and `git mv` to `docs/adr-history/`.
(single-line stub) in both files and apply the same `git mv` rule
as the Superseded transition.
Cross-references between ADRs use the `ADR-NNNN` ID and remain valid
regardless of folder location. ADR numbers are **immutable**; never
@@ -361,11 +375,48 @@ Concrete forms that Part 1's *Verification Plan* MUST take in this repo:
## Derived Artifacts (Clarification)
- Generated diagrams under `docs/diagrams/` are **derived artifacts**, not production code.
- Creating or updating files in `docs/diagrams/`:
- Korean ADR translations under `docs/adr-ko/` are **derived artifacts**
(mirror of the canonical English in `docs/adr/`); see *ADR Translation
Discipline*.
- Creating or updating files in `docs/diagrams/` or `docs/adr-ko/`:
- does NOT count as a production code change,
- does NOT require Phase 2 approval,
- MUST be consistent with SPEC.md and ADRs.
## ADR Translation Discipline
English in `docs/adr/` is the canonical source of truth. Korean in
`docs/adr-ko/` mirrors it 1:1 as a derived artifact.
**Bidirectional sync rule (MUST)**: any edit to a file in `docs/adr/`
must be accompanied, in the same change, by a mirroring edit to
`docs/adr-ko/<same-filename>.md`. The reverse also applies: edits to
`docs/adr-ko/` must mirror back into `docs/adr/`. The two files must
always describe the same architectural content.
Mechanics:
- When editing an EN ADR, propagate the change to its KO counterpart
by translating just the diff (preserve unaffected KO prose); do not
regenerate the whole KO file from scratch.
- When editing a KO ADR, propagate to EN the same way.
- Filename mirror: `docs/adr/X.md``docs/adr-ko/X.md` (no language
suffix in either path).
- The `## Status` block content must remain byte-identical between
the EN and KO files (e.g., both say `Accepted`).
- Conflict policy: if the two diverge despite the rule, treat EN as
authoritative and overwrite KO. Surface the divergence to the user
before reconciling.
- `docs/adr-proposed/` is exempt — single language only, no mirror
required until promotion.
- `docs/adr-history/` is frozen — pre-existing mixed-language state
there is not migrated.
Verification: `python tools/verify_adr_lang_pairs.py` checks that
every EN ADR has a matching KO file, the title's ADR-NNNN matches the
filename, and Status blocks are byte-equal. Run it on demand or wire
it into CI. Exit code: 0 = OK, 1 = mismatch.
## runtime API / sim_engine Boundaries
- runtime API MUST NOT hardcode topology/routing or internal hop sequences.