Digits, Width, and Punctuation

March 6, 2026 · View on GitHub

🧭 Quick Return to Map

You are in a sub-page of LanguageLocale.
To reorient, go back here:

Think of this page as a desk within a ward.
If you need the full triage and all prescriptions, return to the Emergency Room lobby.

Stabilize retrieval when digits, character width, and punctuation variants silently change tokenization and ranking. This page aligns numeric classes, width folding, quotes/hyphens, and exotic spaces across ingest → index → query → display.

Open these first

When to use

  • Arabic-Indic digits or CJK fullwidth digits never match Latin digits.
  • Smart quotes, em/en/quasi hyphens, or dashes break phrase matching or offsets.
  • Thousands separators vary by locale (, vs . vs NBSP) and kill numeric recall.
  • Halfwidth vs fullwidth punctuation breaks token boundaries and citations.
  • Mixed unit formats (1,234.56 vs 1 234,56) return different snippets.

Core acceptance

  • ΔS(question, retrieved) ≤ 0.45 on three paraphrases
  • Coverage ≥ 0.70 to the correct section
  • λ remains convergent across two seeds
  • Offset parity: citation offsets match visible glyphs after normalization
  • Numeric fold pass rate0.98 on a 200-sample mixed-locale set

60-second checklist

  1. Digit class fold

    • Map Arabic-Indic and other locale digits to ASCII 0–9 in a search_text view.
    • Keep visual_text unchanged for display. Store both. See Data Contracts.
  2. Width fold

    • Convert fullwidth Latin letters, digits, and punctuation to halfwidth in search_text.
    • Log a width_fold=true|false flag in snippet metadata. See locale_drift.md.
  3. Punctuation normalization

    • Quotes: map “ ” ‘ ’ to " ' for search view; keep raw in display.
    • Hyphens/dashes: map U+2010..U+2015 to ASCII - in search view; track original in trace.
    • Spaces: collapse NBSP, NNBSP, thin/narrow spaces to ASCII space for search.
  4. Number normalization

    • Normalize thousands and decimal separators by locale rules into a canonical numeric token for search.
    • Keep raw string for display; store a numeric_norm field per snippet.
  5. Analyzer parity

    • Ensure store analyzers (BM25/ES/OpenSearch) apply the same width/digit/punct rules as embedding pre-processing.
  6. Verify

    • Three paraphrases, two seeds. Check ΔS, coverage, λ. Validate offsets visually.

Symptom map → exact fix

SymptomLikely causeOpen this
١٢٣٤ fails to match 1234digit classes differlocale_drift.mdretrieval-playbook.md
1234 (fullwidth) misses 1234width fold missingtokenizer_mismatch.md
“quoted phrase” not foundsmart quotes not normalizedlocale_drift.md
co-founder vs co-founder mismatchhyphen/dash variants differtokenizer_mismatch.md
1 234,56 vs 1,234.56 mismatchthousands/decimal separators differretrieval-traceability.md
Offsets jump after PDF/OCRNBSP/soft hyphen/ZWJ artifactsOCR Parsing Checklist

Minimal field plan

  • visual_text: original text for display/citation.
  • search_text: NFC+width fold+digit fold+punct fold+space fold.
  • numeric_norm: canonical numbers extracted from search_text when present.
  • Trace fields: unicode_form, width_fold, digit_class, punct_fold, space_class.

Store notes

  • Elasticsearch/OpenSearch: pin analyzers in index template; apply char filters for digit/width/quotes/hyphens; verify analyzer in both ingest and query.
  • Vector stores: embed search_text; keep visual_text only for display and exact citation strings.
  • Hybrid pipelines: run BM25 over search_text, then cross-encoder rerank on raw snippets to protect nuance.

Repro test (gold set outline)

  1. Build a 50-item set mixing Arabic-Indic digits, fullwidth digits, smart quotes, multiple hyphens, NBSP, and locale number formats.
  2. Run retrieval before/after normalization; compute ΔS and coverage.
  3. Manually verify top-1 offsets against visual_text.
  4. Accept if ΔS ≤ 0.45, coverage ≥ 0.70, λ convergent, and offsets stable.

Copy-paste prompt


You have TXT OS and the WFGY Problem Map.

My bug: digits/width/punctuation drift.
Traces: ΔS=..., coverage=..., λ=..., examples: {١٢٣٤ vs 1234, 1234 vs 1234, “ ” vs " ", co- vs co-}.

Tell me:

1. failing normalization step and why,
2. exact WFGY pages to open,
3. minimal changes to push ΔS ≤ 0.45 and keep λ convergent,
4. a 50-item gold test to verify, including offset checks.


🔗 Quick-Start Downloads (60 sec)

ToolLink3-Step Setup
WFGY 1.0 PDFEngine Paper1️⃣ Download · 2️⃣ Upload to your LLM · 3️⃣ Ask “Answer using WFGY + <your question>”
TXT OS (plain-text OS)TXTOS.txt1️⃣ Download · 2️⃣ Paste into any LLM chat · 3️⃣ Type “hello world” — OS boots instantly

Explore More

LayerPageWhat it’s for
⭐ ProofWFGY Recognition MapExternal citations, integrations, and ecosystem proof
⚙️ EngineWFGY 1.0Original PDF tension engine and early logic sketch (legacy reference)
⚙️ EngineWFGY 2.0Production tension kernel for RAG and agent systems
⚙️ EngineWFGY 3.0TXT based Singularity tension engine (131 S class set)
🗺️ MapProblem Map 1.0Flagship 16 problem RAG failure taxonomy and fix map
🗺️ MapProblem Map 2.0Global Debug Card for RAG and agent pipeline diagnosis
🗺️ MapProblem Map 3.0Global AI troubleshooting atlas and failure pattern map
🧰 AppTXT OS.txt semantic OS with fast bootstrap
🧰 AppBlah Blah BlahAbstract and paradox Q&A built on TXT OS
🧰 AppBlur Blur BlurText to image generation with semantic control
🏡 OnboardingStarter VillageGuided entry point for new users

If this repository helped, starring it improves discovery so more builders can find the docs and tools.
GitHub Repo stars