v0.8.0: the learning release
Highlights
The profile now learns. Three channels close the loop, every one fail-closed and advisory until an explicit --accept:
- From its own QA findings: every
generatepersists a cross-run report; thelearnverb distills recurring findings into shell-frozen overrides, and the newpropose-overridesverb lets the model correct the ambiguous remainder through the same single validated sink, with anoverride_appliedaudit finding for every live correction. - From the model's judgement: the L2 visual-audit verdict persists (and soundly short-circuits byte-identical re-renders), ambiguous WARNINGs get triaged, faked headings (a body-style line that visibly acts as a heading) are detected as
pseudo_headingsand can be promoted onto a real heading role, and off-theme brand accents become addressable run colors via palette aliases (the model names, the engine byte-copies the captured ref). - From the user: the
refineverb turns end-of-generation feedback (text or a screenshot) into a validated comprehension delta for future generations.
Fidelity below typography (docx): three new dominant-sampled, shell-verified appearance axes - paragraph geometry (spacing/indents/borders/shading), table conditional formats (tblLook, table-style reference, cell margins; band fills stay in the shell's style part) and list numbering (per-level numFmt/lvlText/indent, referencing/cloning the shell's own definitions, never synthesized). Run typography (font/size/color) now captures and applies on all three formats.
Covers on anchor-less templates: when extraction records anchors.cover.kind == NONE, the generator synthesizes a minimal cover from the profile's own resolvable cover.* roles through the resolver chokepoint - validated on a real-world template - with a cover_synthesized audit finding. A uniform appearance_apply_degraded parity ledger measures any captured axis a format cannot realize yet.
Measurably faster, byte-identical: single-launch render probe, per-pass artifact-load memo, lazy imports, shared scans. generate --qa auto ~8.5s -> ~5s per format; the 850-test suite 59s -> 24s; document bytes, profiles and QA reports byte-diffed identical.
Validated end-to-end on the enriched synthetic example templates and on real corporate templates (in-place SDT covers, synthesized covers, faked-heading promotion, alias minting, caption-index regeneration). Schema stays 1.2.0: profiles from 0.7.0 keep working unchanged.
Full detail: CHANGELOG.md