mirror of
https://github.com/Graphify-Labs/graphify.git
synced 2026-09-14 19:34:09 +08:00
0929519ec1
casefold and NFKC do not commute and neither is a fixpoint of the other, so a single NFKC(casefold(...)) pass left normalize_id(s) != normalize_id(s.casefold()) for some combining-mark sequences (e.g. Greek ypogegrammeni U+0345 + a combining accent): pre-casefolding turned U+0345 into iota, which NFKC then composed with the accent into a form the single pass never saw. Iterate casefold-then-NFKC to a bounded fixpoint (casefold first, on the raw input) so the result is stable regardless of prior casefolds. No churn: letter/digit-bearing ids and every CONTRACT_CASE are byte-identical; idempotency, word-only, and the Turkish (#2614) cases still hold. Adds a deterministic regression pin so the fix does not rely on hypothesis re-drawing the codepoints. This was a pre-existing latent bug (present in released 0.9.45), surfaced by the hypothesis property test; ids.py was untouched by the PRs landed alongside it. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>