docs(context): core.md section 20 traces its rules to all three clauses and says folding output becomes _ (improvise-cq1q.14)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
This commit is contained in:
Claude (adr007-slug)
2026-10-09 12:55:14 -07:00
committed by Edward Langley
parent 2e1f0f6550
commit b17bcb068b
+5 -4
View File
@@ -1692,7 +1692,8 @@ probability (`> ||[||]` is a self-parent), so `generated_file_parses` accepts a
piece of ADR 007. They are pure functions of their arguments and the
allocator's own history. Nothing calls them yet: the creation sites move onto them in the re-key step (improvise-cq1q.4).
Each rule traces to ADR 007's clause 4 (slugify, the counter, hand-written
ids) or clause 1 (reserved ids).
ids, natural order), clause 1 (reserved ids) or clause 2 (display suffixes),
as amended by amendment 1.
**Case folding is full Unicode folding, and it comes from `unicase`.**
`str::to_lowercase` is not folding: `ß` lowercases to itself and then
@@ -1700,9 +1701,9 @@ becomes `_`, so `Straße` would slug to `stra_e` (clause 4, step 1: full case
folding). The same goes for `ſ` (long s) and the `fi` ligature. `unicase` 2.9 is `no_std` and has no
dependencies, so it passes the wasm gate. Its `to_folded_case` applies the
C+F mappings of Unicode's CaseFolding.txt, and its own tests pin `Maße` →
`masse`. Most of what folding produces is stripped anyway: only an ASCII
letter survives step 3. Deriving that ASCII-producing subset of the table by
hand was rejected. It is a second copy of the Unicode data, and nothing would
`masse`. Most of what folding produces becomes `_` anyway: only ASCII
letters, digits and `-` survive step 2. Deriving that ASCII-producing subset of
the table by hand was rejected. It is a second copy of the Unicode data, and nothing would
say when it drifted.
**Slugify is the amendment's six steps** (ADR 007 amendment 1, clause 4):