9.0.0 — 2026-09-26
Leaner patina: three unused integrations removed, a runtime-only npm package, and a repo-wide cleanup with unchanged detection and prompts.
Semver rationale: major — retires the patina aside subcommand, the never-active structural classifier (its JSON fields, config key and environment variables), and the hosted /api/polar-webhook endpoint. Detection results and every prompt sent to a model are unchanged: the benchmark output is identical to 8.10.0, and prompt text was compared by hash across roughly 64,000 cases.
- Breaking —
patina asideis removed (#940). The Aside desktop integration was never exercised inside Aside, andbin/patina-skill.jsalready gives any agent host a verified, receipt-backed rewrite.patina aside …now exits 2 and points topatina --verify <file>. Theassets/aside/andintegrations/aside/package files are gone. - Breaking — the optional structural classifier is removed (#941). No model ever shipped, so it always reported "absent" and never changed a score. Removed:
scores.deterministic.bands.structuralClassifierin JSON output (and the matching hosted stream field),analyzeText().structuralClassifier, the inspect codestructural-model, the config keystylometry.structural_model.path, andPATINA_STRUCTURAL_MODEL/PATINA_MODEL_PATH. - Breaking —
/api/polar-webhookis removed (#945). It only counted purchases into a key nothing read; Pro access is decided by license-key validation, which is unchanged. - The npm package ships the runtime only (#937): 515 → 253 files, 5.9 MB → 2.6 MB unpacked.
scripts/now carries only the two files behindpatina-score; research tooling,tests/,artifacts/, the hosted playground and research/benchmark JSON stay in the repository. The container image no longer copiesscripts/. - Research treatment retired (#943): the unpromoted Korean diagnosis treatment behind
PATINA_KO_DIAGNOSIS_RESEARCHis removed (the variable is now a no-op); the 2026-09-01 verdict and its evidence stay indocs/research. - Smaller CLI changes (#938):
patina doctorno longer checks for tmux;patina initand--restyleget the generic errors instead of custom retirement messages; preview pages are saved aspreview-<ts>.html;stylometry.enabledandko_diagnostics.*.{metric,dependency}leave the default config (nothing read them).audit --format jsonnow surfaces unexpected inspection errors instead of reportinginspection-unavailable, and the score gate rejects a non-numericoverall. - Pro monitor (#944): the OBS-ALERT-v1 receipt records (dropped as
not_plannedon 2026-09-14) and thePATINA_*_URL_SHA256pins are removed; alerting, dedup and recovery are unchanged, and the monitor code is readable again. - Internal cleanup (#935–#939, #942, #946): one process runner for the five local CLI backends and one HTTP/SSE transport core; dead hosted paths (the non-streaming runner, the legacy Pro quota branch) removed; duplicated helpers merged; about 40 finished-research scripts, 19k lines of one-time operations evidence and several off-mission documents deleted.
- Fixes (#947, #948): XLIFF
target-languagevalues such asconstructoror__proto__are rejected like any unsupported language;scoreTextreports provider failures astransport-failureinstead ofschema-failure;patina doctorenforces the real>=18.1.0Node floor; a non-size change-review failure on the hosted stream ends asrewrite_failedinstead of a size error; the hosted rewrite handler is built once per process, so local quotas and leases hold across requests.