Skip to content

decisions

github-actions[bot] edited this page Aug 21, 2026 · 16 revisions

Architecture decision records — index

Every accepted or superseded decision behind this codebase, one row per file. The status and date columns are copied from each file's own **Status:** … · **Date:** … line — correct the ADR to correct this table, not the other way around. The relationships column is a reading: what a **Status:** line does not say but an ADR's body does, either in its own words or in an > **update:** block naming what a later change made stale. An ADR's body is never rewritten to agree with a later one — see 0022 §10 for the convention a later decision uses instead.

# Title Status Date Relationships
0001 Target frameworks: net10.0 and netstandard2.0 accepted 2026-08-01 (revised 2026-08-04)
0002 Unicode comparison unit accepted 2026-08-01
0003 Code provenance and license accepted 2026-08-01
0004 Levenshtein: bit-parallel (Myers) optimization accepted 2026-08-01 (revised 2026-08-05) backlog partially cleared by issue #208 (not an ADR — see the two > **#208 update:** blocks)
0005 Accepted divergence from jellyfish on combining marks (Hamming, Jaro) accepted 2026-08-01
0006 Ratcliff-Obershelp: difflib's autojunk heuristic accepted 2026-08-01
0007 Metaphone: validation scope (real words) accepted 2026-08-01
0008 Italian enza/enze: follow nltk, not the published description accepted 2026-08-05
0009 The sample restores from a local feed, not nuget.org accepted 2026-08-05 amended by 0012
0010 Stop-word lists come from Snowball, not from the nltk corpus accepted 2026-08-05
0011 Persisted artifacts are versioned JSON, written with System.Text.Json accepted 2026-08-05
0012 Each package versions and releases on its own accepted 2026-08-05 amends 0009
0013 What SentencePieceTokenizer promises, and where it knowingly differs accepted, superseded in part by 0014 2026-08-06 §1 (the oracle covers the vocabulary, not the stock pipeline) superseded by 0014; §2 (the unknown-piece penalty floor) stands
0014 Interpret the precompiled_charsmap, do not reimplement the rules accepted 2026-08-06 supersedes 0013 §1
0015 The Sonar rules run in the build, not only after the push accepted 2026-08-06 amended by 0019
0016 Classification metrics ship as DataNet.Metrics, not inside DataNet.Text accepted 2026-08-06
0017 What BpeTokenizer promises, and where it knowingly differs accepted 2026-08-09
0018 Multiclass ROC-AUC parallelism is opt-in, and the caller names the worker count accepted 2026-08-10
0019 The .NET code-quality analysers run in the build too, and samples/ is analysed at all accepted 2026-08-10 amends 0015
0020 normalize= is a projection, and ZeroDivision keeps a default per metric accepted 2026-08-10
0021 Eleven regression metrics first, and multioutput as a method rather than an enum accepted 2026-08-10
0022 How an added token matches, and what it costs the round trip accepted 2026-08-10 §10 partially revised by issues #119 and #120 (not ADRs — see the > **#119 and #120 update:** block)
0023 Byte-level Decode substitutes U+FFFD instead of throwing accepted 2026-08-14
0024 The weighted median averages two order statistics within scikit-learn's epsilon, not exactly at half accepted 2026-08-14
0025 Quickselect, with an introselect fallback and a branchless partition, replaces a full sort for the unweighted median accepted 2026-08-14
0026 R² and ExplainedVariance split their undefined cases differently accepted 2026-08-14
0027 R²'s and ExplainedVariance's unweighted accumulation vectorizes only for a single output accepted 2026-08-14
0028 Log1P is Kahan's identity, not Math.Log(1 + x) accepted 2026-08-14
0029 BalancedAccuracy's adjusted is left to IEEE 754 at the one-class edge accepted 2026-08-14
0030 CohenKappa keeps scikit-learn's expected-matrix orientation, and weighting only orders accepted 2026-08-14
0031 NoSampleCorrect mirrors NumPy's float64 upcast, not requested-label accuracy accepted 2026-08-14
0032 FScore substitutes tp/predicted/support algebraically, not via precision and recall accepted 2026-08-14
0033 CompensatedSum is Neumaier's variant, and its SIMD lanes are not bit-identical to it accepted 2026-08-14
0034 Distributional proof is admissible, and dropout is still refused accepted 2026-08-14
0035 A null pre-split drives Apply as Removed with invert, not Isolated accepted 2026-08-15
0036 A member may ship without an oracle, if the documentation says so accepted 2026-08-16
0037 The guards run before the commit, through core.hooksPath and no framework accepted 2026-08-18 extends 0015's reasoning to the Python guards
0038 The gate confronts an exception tag with the page that documents it accepted 2026-08-18
0039 MutualInformation returns 0.0 on an empty input; scikit-learn raises accepted 2026-08-18
0040 A curve is a sealed class per curve, not a record and not out-parameters; drop_intermediate's asymmetric defaults are reproduced accepted 2026-08-18
0041 One sample file per public class, named after it accepted 2026-08-19
0042 Phonetic encoders refuse a null word accepted 2026-08-20
0043 The equality table is sized to the pattern, not to Latin-1 accepted 2026-08-20 amends 0004
0044 Compression belongs to the caller, not to the artifact format accepted 2026-08-20 leaves 0011 untouched: the artifact on disk does not change
0045 A Console call carries its reason on the line, not in an exemption list accepted 2026-08-21 adds a seventh guard to 0037's hook, under the rule it set
0046 check_adr_immutable.py runs in CI only, not the pre-commit hook accepted 2026-08-20
0047 One bit-parallel gate per kernel, not one per alphabet accepted 2026-08-21 amends 0043
0048 The bit-parallel gate depends on the kernel and the alphabet accepted 2026-08-21 amends 0047
0049 Two gates per kernel, the second tested where the width is already known accepted 2026-08-21 amends 0048
0050 The SentencePiece-BPE lineage stays a BPE model, and metaspace becomes one transform accepted 2026-08-21 amends 0017 §3, whose byte_fallback refusal and "no path here" for Llama-2 and Mistral v0.1 both fall

What accepted means here

All fifty carry accepted. None has been rejected or withdrawn — a status this table would otherwise need a second word for. 0004 read a progress sentence (single-word and blocked shipped) where a status belongs; that sentence is now the opening line of its own ## Done section, and its status reads accepted like the other thirty-two.

Relationships not stated on a **Status:** line

Two pairs supersede or amend each other in the body only, not in the status line:

  • 0009 is amended by 0012: 0012 replaced the repository-wide $(Version) 0009 bound the sample to with one property per package, in a > **Amended by 0012.** block inside 0009's own ## Decision section.
  • 0015 is amended by 0019: 0019 measured false the reason 0015 gave for keeping samples/ off the analyser, in two > **Amended by 0019 (2026-08-10).** blocks inside 0015 itself, and 0019's own text says so directly — "this ADR amends 0015 accordingly."

0013's partial supersession by 0014 is the one relationship already on a status line; its body adds the detail that only §1 (the oracle's normalizer scope) is superseded — §2 (the unknown-piece penalty floor) stands, unaffected by 0014.

Lodestar

Project

Clone this wiki locally