v5.35.0
v5.35.0 -- 2026-08-18
Summary
- The generation unit is now the section, and it has a contract.
python -m src.draft unitsays exactly what one section is generated
from -- its slice of the outline, the sources it is grounded in, and
(from the next release) the registry excerpts -- and hashes those inputs
so an unchanged unit costs nothing to re-run. - Acceptance is recorded rather than asserted.
unit acceptwrites a
record only after the project's one gate has passed on the draft, and
unit statusre-derives every digest, so a book's state is a fact on
disk rather than a memory. - Second piece of the book-scale track (#135), on top of v5.34.0's outline.
What's Changed
- Fix the generation unit at the section, with a hashed input contract by @prasadtalasila in #250
Full Changelog: v5.34.0...v5.35.0
In Detail
python -m src.draft unit contract content/drafts/twins sec-model --source smith_2024
python -m src.draft unit accept content/drafts/twins sec-model --source smith_2024
python -m src.draft unit status content/drafts/twins- The input digest covers the inputs only -- never the unit's own prose,
its sign-off state, or its path. A digest that moved when the output moved
could not answer "does this need regenerating?", which is the only question
it exists for. acceptinvokes the citation gate; it is not a second gate. A unit the
gate refuses cannot be accepted, and nothing new blocks a write.
python -m src.draft gateremains the only gate in the project.statustells five states apart --unwritten,drafted,accepted,
stale: inputs changed,stale: draft changed since accepted-- each
re-derived rather than trusted, and an unreadable record reads as
drafted.
Records live at content/specs/<book>/units/<unit-id>.json and carry no
timestamp, so accepting an unchanged unit twice is byte-identical.
Upgrading
Nothing to do. The new command is additive and writes only under
content/specs/.