Skip to content

ADR-0060: The sixteen Section Headings are a fixed Thai/English pair, held once and gated across both repositories

Status: Accepted Date: 2026-09-20

Decisions

D-133 The sixteen SDS Section headings are a constant carrying both a Thai and an English string per number

Handler-facing surfaces show the Thai string. The curator's surfaces show the English one. Neither is produced at runtime and neither is curated per document.

D-134 The list is held once and gated across the two repositories

The frontend's duplicate copy is removed. A committed golden fixture pins both sides, the way snapshot.golden.json pins the snapshot seam, so the two repositories cannot drift apart silently.

Context

The GHS format obliges every SDS to carry the same sixteen numbered sections, and it fixes their names. So a heading is a constant of the format, not content extracted from any document. That is what makes this ruling possible at all: there is no supplier text to be faithful to, and no judgement for a curator to make.

It follows that this is not a runtime translation and does not touch the no-runtime-translation ruling (D-12) or ADR-0009. Those protect Safety-Critical Content taken from a supplier's document, which a heading is not. A Section's contents remain Extractive and remain subject to every rule that already governs them; only the label above them is a constant.

The holding question is separate and came from ticket 39, which recorded a duplicate list in the frontend with no test crossing the repositories. That is the blocker-13 shape: two sides agreeing by inspection until one of them changes. The snapshot seam already has the instrument for it (D-124), so this closes here rather than being recorded and left.

Decision

The sixteen Section Headings are one constant, carrying a Thai and an English string per number. The Thai string is what a Handler reads; the English string is what a curator reads. The list lives in one place and a committed golden fixture holds both repositories to it.

Rejected options

  • Keeping English on the Handler surface — rejected because it puts an English label over Thai content in a Thai-first app, on the surface read by the group at the point of exposure. The English is for the curator, who is reading the GHS format itself.
  • Making a heading a Curated Translation — rejected because it would have a person re-type the same sixteen strings for every document admitted, and a Curated Translation renders a Source Span. A heading is not a Source Span; there is nothing to render and nothing to review.
  • Leaving the duplicate and adding a comment — rejected because that is exactly what ticket 39 found: a duplicate nobody could see drift in. A comment is not a gate.

This ruling may not be re-decided

If a change contradicts this ADR: stop and raise it. Do not implement over it.

Specifically: do not re-introduce a second copy of the list in either repository, do not show the English string on a Handler-facing surface, and do not route a heading through Curated Translation or any runtime translation path.

Consequences

What becomes true. A Handler reads Section names in the language of the app. There is one list, and a change to it fails a test in the repository that did not make the change.

What this costs. A cross-repository fixture to keep committed and regenerate, which is a second instance of a seam the project now has two of. Both repositories must be updated together when the constant changes — deliberate, and the point.

What is closed off. A per-document heading, a runtime-translated heading, and a second copy of the list.

Coverage

UpstreamLanded inEvidenceNote
D-12Dropped: the no-runtime-translation ruling governs Safety-Critical Content taken from a supplier's document; a Section heading is a constant of the GHS format, so ADR-0009 is named as untouched rather than amended
D-121D-133all sixteen Sections are already created at admission as labels with no text, so the heading is the label's name and nothing elseADR-0052
D-124D-134the cross-repository check that holds the snapshot seam is the instrument reused here as a committed golden fixtureADR-0053; ticket 39 recorded the duplicate with no test crossing the repositories