Skip to content

Architecture decision records

Each record captures one decision that shapes the library: the context it was made in, what was decided, and what follows from it. Records are immutable once accepted — a changed mind is a new record that supersedes the old one, so the history of why survives.

# Decision Status
0001 Write PDF ourselves; Skia only for raster output Accepted
0002 A print and typesetting vocabulary, owned by a glossary Accepted
0003 Keep the fluent shape; add named style sheets Accepted
0004 Colour is Ink: RGB, CMYK and spot, with tints Accepted
0005 Target net10.0 and netstandard2.0 Accepted
0006 A dependency-free core; native code only by opt-in Accepted
0007 Quality gates: coverage, mutation, validators, snapshots Accepted
0008 Another library is a reference for behaviour, never a source Accepted
0009 Performance targets, measured against a reference Accepted
0010 Developer tooling: a dotnet tool with a browser UI Accepted
0011 Delivery in phases, one pull request each Accepted
0012 Parents allot the final size; decorators fill it Accepted
0013 Spans on .NET Framework come from System.Memory Accepted
0014 Text is shaped once, in the core, for measuring and drawing alike Accepted
0015 The text engine in layers: Unicode rules in the core, complex shaping by opt-in Accepted
0016 Layout may draw ahead, and return Accepted
0017 Draw order holds a page back Accepted
0018 Structure is recorded as content is drawn Accepted

A new record has three sections: Context (the forces at play), Decision (what we will do) and Consequences (what becomes easier, what becomes harder, what we now owe).