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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user