BrandDocs v0.2.0
Hardening release: correctness fixes across all three formats, a real
doctor preflight gate, a uniform destructive-action policy, and a
3.10+ / CI matrix toolchain. Brand Profiles from 0.1.0 keep working
unchanged (schema 1.x is read as-is).
Added
doctoris now a preflight gate, not just a report: it exits nonzero
when a required Python dependency is missing, so a broken environment
fails before generation instead of mid-run.doctor --jsonprints the machine-readable dependency/renderer probe;
doctor --fastskips the slow LibreOffice render probes (visual QA is
marked "not probed") for a quick check.- PowerPoint now expands reusable
components/sectionsfragments,
matching the Word vertical: a profile-defined fragment inlines
identically across formats, fail-closed (an undefined reference raises
rather than silently dropping content). - Schema: a profile whose major version is newer than this build supports
now fails with a single clear "upgrade brand-docs or re-extract" message
instead of a pile of confusing per-field errors, and a forward
migrate()seam is in place for future schema growth.
Changed
- The destructive-action confidence floor (>= 0.5) is now applied
uniformly at every reconcile site across Word, PowerPoint, and Excel
from a single source of truth, so a low-confidence delete is downgraded
to keep-with-warning consistently (previously only some sites enforced
it). - PowerPoint now honors the profile-resolved body placeholder index
(ph_idx) when filling body content, instead of always assuming the
first placeholder. - Python floor is now 3.10+ (declared in
pyproject.toml
requires-python). CI runs a 3.10 / 3.11 / 3.12 matrix, arufflint +
format gate, and a real-render lane that installs LibreOffice + poppler
and actually executes the visual end-to-end tests (a broken renderer
fails the lane). - Reference docs (block catalog, profile schema) are synced to the engine
and guarded by a freshness test; a fixture-determinism guard keeps the
test fixtures byte-stable. - Internal: a shared
ooxml/layer now centralizes qualified-name
helpers, the complex-field walk, and ZIP byte-idempotency, removing
duplicated boilerplate from the format generators. - README slimmed and repositioned; the GitHub Pages site is split from the
human-facingdocumentation/; em dashes removed across skills and
metadata.
Fixed
- Excel no longer crashes when a named region's first row straddles a
merged banner: writes to a merged-slave cell are guarded (only the merge
anchor is writable) and the skipped value surfaces as ablock_degraded
warning instead of raising or being lost. - PowerPoint no longer silently drops Component / Section / Toc / Divider
blocks it has no native writer for: each now emits a visible
block_degradedwarning, honoring the "never drop content silently"
invariant. - Word generation is now byte-deterministic: re-running the generator on
the same inputs produces an identical file (ZIP entry timestamps are
pinned), matching the existing PowerPoint and Excel behavior.