
Structured AI that ships.
v1.1.0 · stable APIA Go library that makes a language model return a typed Go value instead of a wall of text you have to parse.
One public API of fluent builders over one execution path. Application code reads like Go — Extracting[Person](text).Strict().Run() — while retries, structured-output contracts, logging, metrics and cost tracking stay in one place instead of being re-implemented at every call site.

Brand artwork for SchemaFlux. The product is real and the code is linked above; the poster is a design exercise, not a claim.
Extract, transform, generate, classify, score, rank, cluster and compare — each returns the Go type you asked for, with generics doing the work.
The result envelope keeps what the model asserted apart from what the library actually observed, so a confident answer never gets promoted to a verified one by accident.
Retries, token accounting and spend tracking are centralized, so the price of a call is something you read rather than something you discover on the invoice.
The public API is captured in a snapshot test. Adding or removing anything fails the build, which makes every change a reviewed decision.
Including the two libraries underneath it that are my own work — the framework the interface is written in, and the transport it talks over.
The problems worth describing, and what the measurement said. Not the technology list — that is above.
Redaction matches whole field names and validates card numbers with Luhn, so FirstName and APIKey are caught while Filename and a 16-digit order number are not. A bare nine-digit number is deliberately not treated as a social security number, because it is indistinguishable from an order ID. The README says plainly that it is a safety net under the fields you tag, not a substitute for tagging them.
Semantic deduplication asks the model about pairs, which is O(n²) calls in the worst case. The documentation leads with that rather than burying it, because the failure mode is a bill, not an exception.
Twelve of the project's own thirty-two acceptance criteria were not met when 1.0 shipped. They were listed with a reason each, and ADR 0005 argues why the version went out anyway. Writing down what a release does not do is a more useful artifact than a 0.9 that never ends — and it is why the gaps got closed in the open, across the ten commits that became 1.1.0.
Figures taken from the repository itself. No line-of-code count — it rewards duplication and every reader knows it.
The exception on this page: a library at a released 1.1.0 with an API-surface test guarding it, and every behaviour claim in its README backed by a test. It is still honest about the gaps — read "What 1.0 does not include" before depending on it for anything load-bearing.
These are personal projects, built on nights and weekends with AI agents in the loop — that is how one person ships this much surface area at once. Most of them are early: alpha or prototype, with polish that varies a lot by area. What is not early is the architecture, the test suites, and the measurements — every number on this page is counted from the repository and every claim is one you can check against the code.