Skip to content

Decision index

Every architectural decision in this repository, generated from docs/adr/. 88 ADRs, 180 numbered decisions, 6 superseded.

An accepted ADR is binding. Contradicting one requires a new ADR that supersedes it — never an edit to the old file, and never a quiet reinterpretation. Ids are unique and permanent: they are never renumbered and never reused, so a gap in the sequence is a tombstone rather than a mistake.

Accepted

ADRDecisionIdsStatus
0001Academic deliverable with a production-shaped coreD-01Accepted
0002Safety-critical content is extractive; only non-critical content is generatedD-02, D-03Accepted · amended by ADR-0036, ADR-0041
0005Safety content is offline-first; only the chatbot requires a networkD-06Accepted · amended by ADR-0040
0006An information tool, with escalation ahead of procedureD-07, D-08Accepted · amended by ADR-0041, ADR-0049
0007Anonymous-first — no safety capability sits behind an accountD-09Accepted · amended by ADR-0029
0008First Aid is the missing screen, sourced from SDS Section 4D-10Accepted
0009Thai safety text is curated, never machine-translated at runtimeD-11, D-12Accepted · amended by ADR-0027
0010The poster's QR code is decorative; the poster is the complete sourceD-13Accepted
0011The corpus is the case-study plant's own SDS, ingested as filesD-14, D-15Accepted — supersedes ADR-0003 · amended by ADR-0016, ADR-0034
0012"AI summarisation" means selection and structure, never rewritingD-16, D-17Accepted — clarifies ADR-0002, which stands · amended by ADR-0037
0013A Chemical Record is keyed on its SDS document, not on a substanceD-18, D-19Accepted — amends ADR-0004, which otherwise stands · amended by ADR-0024
0014poster.pdf is the authoritative source; the first poster is historyD-20, D-21, D-22Accepted
0016A proxy corpus develops the pipeline; it is never the delivered corpusD-28, D-29Accepted — amends ADR-0011, which stands
0017Functional acceptance now; performance targets only against a measured baselineD-30, D-31, D-32Accepted
0018Corrections found by adversarial review of stages 0 and 1D-27, D-33, D-34, D-35Accepted
0020The prototype is a web application on the work-permit stackD-37, D-38, D-39, D-40, D-41, D-42Accepted — supersedes ADR-0019
0021D-23, D-24 and D-25 were never issued — tombstoneD-43Accepted
0022Restrictions are reconciled across the whole document, at Curation timeD-44, D-49, D-50Accepted — supersedes ADR-0015
0023Conflicting Chemical Records are never merged; the product in hand governsD-45, D-46Accepted
0024An SDS with no revision date is admitted, and the absence is shownD-51Accepted — amends ADR-0013
0025Generic PPE text is displayed as generic, and the glossary rule is softenedD-52, D-53Accepted
0026Spill Response is branched, and the branch question is the escalation gateD-54, D-55Accepted · amended by ADR-0041
0027The Thai-SDS preference stands; its text layer is never trustedD-56, D-57Accepted — amends ADR-0009
0028Curation costs roughly a day per document, and the measured figure is a floorD-58, D-59Accepted — satisfies D-32 · amended by ADR-0034
0029The prototype has no accounts, no sync and no favouritesD-60, D-61Accepted — amends ADR-0007
0030Identification has three peer routes, and The Plant can print QR labelsD-62, D-63, D-64Accepted — supersedes ADR-0004 · amended by ADR-0076
0031The chatbot routes to a Source Span; a cloud LLM reads the question, never the SDSD-65, D-66, D-67, D-68, D-69, D-70, D-71Accepted — supersedes nothing. ADR-0002 and ADR-0012 stand in full. · amended by ADR-0033, ADR-0036, ADR-0039, ADR-0042, ADR-0043, ADR-0046
0032A missing Corpus is its own answer, and it is never Not StatedD-72, D-73, D-74Accepted · amended by ADR-0036
0033Query Intent runs on Gemini Flash's paid tier, and zero retention was not availableD-75, D-76, D-77, D-78Accepted — amends ADR-0031, which stands · amended by ADR-0043, ADR-0055
0034The Corpus is sized to one production area, not to a document countD-79, D-80Accepted — amends ADR-0011 and ADR-0028, both of which stand · amended by ADR-0054
0035A superseded finding says so on its own page, and a gate enforces itD-81, D-82, D-83, D-84Accepted
0036There are four reasons the app cannot answer, and it says which oneD-85, D-86, D-87, D-88, D-89Accepted — amends ADR-0002, ADR-0031 and ADR-0032, all of which stand
0037Explaining a term is curated, not generated — and the app now displays no generated text at allD-90, D-91Accepted — amends ADR-0012, which stands
0038D-47 and D-48 were never issued — second tombstoneD-92Accepted
0039ADR-0031 cites a deleted study objective; its ruling stands and the observation movesD-93Accepted — amends ADR-0031, which stands
0040No user-facing surface may require a network; a network may only improve oneD-94Accepted — amends ADR-0005, which stands
0041Escalation text is curated and has an author, and the branch condition is not the escalation gateD-95, D-96, D-97Accepted — amends ADR-0002, ADR-0006 and ADR-0026, all of which stand · amended by ADR-0042, ADR-0049
0042Escalation ships with the app shell and is reachable everywhere; the trigger only saves a tapD-98, D-99, D-100Accepted — amends ADR-0031 and ADR-0041, both of which stand · amended by ADR-0049
0043Query Intent is advisory, and the spend cap is the controlD-101, D-102, D-103Accepted — amends ADR-0031 and ADR-0033, both of which stand
0044A Coverage row records what drove a decision, not that the author read the researchD-104Accepted
0045"Part of the chosen stack" and "installed today" are different claims, and one of them is checkableD-105Accepted
0046A retrieval miss shows the field it failed to match, and never claims the document is silentD-106, D-107Accepted — amends ADR-0031, which stands
0047A missing PPE material is data, not prose, and a curated field never displaces its spanD-108, D-109Accepted
0048Curation runs only where nothing is served, renders pages in the curator's browser, and leaves no orphaned fileD-110, D-111, D-112Accepted
0049Until a site authority signs it, the Curated Escalation is the hotline alone, and the trigger fires on a person rather than a topicD-113, D-114, D-115Accepted — amends ADR-0006, ADR-0041 and ADR-0042, all of which stand
0050A spill branch may state no condition, and the store records that absence as nullD-116Accepted
0051A QR label carries csa:chemical-record/ and a key that survives the database that issued itD-117, D-118Accepted
0052A document is verified whole before anything is selected from it, identity comes from its Sds, and its Sections are labels created at admissionD-119, D-120, D-121Accepted
0053A published snapshot says what it shipped, in the shape the device storesD-122, D-123, D-124Accepted · amended by ADR-0056
0054The Study Area is the production area that uses น้ำยาล้างชิ้นงานD-125Accepted — amends ADR-0034, which stands
0055The Query Intent endpoint is not built until the Study Area's Corpus existsD-126Accepted — amends ADR-0033, which stands
0056A published version is the payload the gate passed, stored and served as it isD-127Accepted — amends ADR-0053, which stands
0057A server with no published snapshot refuses, and a device takes its sentinel from the payloadD-128, D-129Accepted · amended by ADR-0075
0058A stored copy is never deleted through the APID-130Accepted
0060The sixteen Section Headings are a fixed Thai/English pair, held once and gated across both repositoriesD-133, D-134Accepted · amended by ADR-0075
0062A curation refusal names the rule that firedD-136Accepted · amended by ADR-0075
0063The application repositories are gitlinks under app/, and a checkout reaches the workspace two levels upD-137Accepted
0064The Standing Statement is stated on first run by a blocking First Run NoticeD-138, D-139, D-140Accepted · amended by ADR-0070
0065The Boot Splash exists, and what may appear on it is a closed setD-141Accepted
0066The design extract binds colour, spacing and surface treatment, and nothing elseD-142Accepted · amended by ADR-0070, ADR-0078
0067A selection carries nothing onto the next oneD-143Accepted
0068The Reconciliation gaps read says why the list is emptyD-144Accepted · amended by ADR-0069, ADR-0071, ADR-0075
0069The gaps read carries a judged count, so an empty list cannot claim a judgement that never happenedD-145Accepted — amends ADR-0068, which stands · amended by ADR-0075
0070Chrome overlaps Conversational Content rather than being part of it, and the design extract is cited by locatorD-146, D-147Accepted — amends ADR-0064 and ADR-0066
0071The gaps read's coverage union and its precedence are a contract, not an implementation detailD-148Accepted — amends ADR-0068, which stands
0072A Section reaches the device as a number and a name, not as one rendered stringD-149Accepted
0073Authoring an explanation for a term that already has one is refusedD-150Accepted — supersedes ADR-0061
0074A document records its page count where one can be read, the count is nullable, and withdrawing a verification stays refusedD-151, D-152Accepted — supersedes ADR-0059
0075Corrections a cross-model grill found in the 2026-09-20 rulingsD-153Accepted — amends ADR-0057, ADR-0060, ADR-0062, ADR-0068 and ADR-0069, all of which stand
0076Home is six actions, and an Identification route that is not built is absent rather than disabledD-154, D-155Accepted — amends ADR-0030, which stands
0077Chrome is three parts, and the alarm colour stays spent on escalationD-156, D-157Accepted
0078Typography and motion join the list the design extract bindsD-158, D-159Accepted — amends ADR-0066, which stands
0079Every interactive control comes from one ported component setD-160Accepted
0080The verification surface states what the server states, and a refused write never reads as an unverified pageD-161, D-162, D-163, D-164, D-165Accepted
0081A Handler can open the original document over the network, and no surface waits for itD-166Accepted
0082Every published version is listed, and what it shipped is read from its own payloadD-167Accepted
0083The Chemical Record screen tabs its reference fields, and emergency content stays flatD-168Accepted
0084A curated selection is superseded or retracted, never editedD-169, D-170, D-171, D-172, D-173, D-174, D-175, D-176, D-177Accepted · amended by ADR-0085
0085Restating a span the replacement asked to keep is its own coded refusalD-178Accepted — amends ADR-0084, which stands
0086A Spill Response branch is a container, and its stated condition is corrected by an act of its ownD-179, D-180, D-181Accepted · amended by ADR-0087
0087A branch condition has two states, because keeping it is a correction that corrected nothingD-182, D-183Accepted — amends ADR-0086, which stands
0088The Curator's record read serves live rows, and corrected ones are a count rather than contentD-184, D-185Accepted

Superseded

Kept and listed, not deleted. A superseded ADR still holds the argument that was made, and its Status line names the document that replaced it. Reading one without noticing it is dead is the failure scripts/adr-status-check.sh exists to prevent.

ADRDecisionIdsStatus
0003The corpus is curated manufacturer-published SDS PDFsD-04Superseded by ADR-0011 — do not follow this ruling
0004Chemical identification is OCR on the CAS numberD-05Superseded by ADR-0030 — read order preserved, ranking replaced · amended by ADR-0013
0015Extractive selection must never drop a restrictionD-26Superseded by ADR-0022 — premise upheld, mechanism replaced
0019The prototype targets native Android onlyD-36Superseded by ADR-0020 — do not follow this ruling
0059A document records its page count, and withdrawing a verification stays refusedD-131, D-132Superseded by ADR-0074 — do not follow this ruling; the page count is nullable, and ADR-0074 carries this ADR's amendment of ADR-0052 forward
0061A Curated Explanation is replaced in place, never retiredD-135Superseded by ADR-0073 — do not follow this ruling; the second authoring is refused