Releases: sebastienrousseau/draft
Release list
v0.0.29
draft 0.0.29 Audit remediation (#37): a grounding-gate bypass found by FuzzParse, --review not checking faithfulness, a blocking emit that wedged the pipeline, truncation detected only for Ollama. Routing and resume (#38): per-stage engine routing, --resume, --dry-run, queue-sticky fallback, extraction ETA.
v0.0.28
Changed
- The README has been rewritten. It now follows the structure used across
these projects — grouped contents, a capabilities section, collapsible
reference material, and an honest comparison — in a plainer, more direct
voice. Claims lead with what the tool does for you; the numbers behind them
follow.
Fixed
- Two stale statements in the README. "How it works" still described
extraction aspdftotext -layout, which 0.0.27 replaced with reading-order
extraction, and the limitations section still pointed atinternal/rules
andinternal/validate, which became public packages in 0.0.18. Also
documents--json,--completionandDRAFT_SHOW_LOGO, which had no entry
in the flag or environment tables.
v0.0.27
Fixed
- Two-column papers are no longer read across the columns. Extraction
passed-layouttopdftotext, which preserves the visual arrangement:
on a two-column paper the left and right columns were spliced onto shared
lines, so sentences broke mid-thought and merged with unrelated text. Since
a claim survives verification only when itsSOURCE_QUOTEappears verbatim
in the source, this quietly undermined grounding on exactly the documents
the tool is built for. Poppler's default reading order is now used. Measured
on a real corpus, spliced lines fell from 158 and 59 on two papers to zero
on all of them. - A contents listing no longer truncates the whole paper. Sectioning cut
the document at the first line matchingreferences|bibliography| acknowledgements|appendix, which in a paper with a contents page is the
entry "References … 4" in the front matter, not the bibliography. A 62-page
paper was reduced to its first 8kB — the claim ledger was built from the
table of contents. The last such heading is now used, which also keeps the
degenerate case right: a document that is only a bibliography still yields
no sections. The same paper now retains 97.3% of its text, up from 3.9%.
Added
- A clear diagnosis for PDFs with no text layer. A scan or image export
previously produced empty text and a late, vague failure.pdf.ErrNoTextLayer
now explains what happened and what to do — run OCR, or supply a text source. - Real PDF fixtures.
internal/pdf/testdataholds a generated two-column
paper — complete with a contents listing naming "References" in its front
matter — and a page with no text layer, both built by a committed script so
they are reproducible and license-clean. Regression tests assert that no
output line carries text from two columns, that body claims survive
sectioning, that the real bibliography is still dropped, and that a
text-less PDF is diagnosed.
v0.0.26
Fixed
- Release signatures are now discoverable. The cosign bundle shipped as
checksums.txt.bundle, an extension no tooling recognises — the OpenSSF
Scorecard scored Signed-Releases 0 despite the release being signed. It is
nowchecksums.txt.sigstore.json, the canonical Sigstore bundle name. - Workflow tokens are read-only by default.
release.ymlrequested
contents,id-token, andattestationswrite at the workflow level,
so every step ran with them. Permissions are nowread-allat the top and
widened only on the job that publishes.
Added
- CodeQL analysis runs on push, pull request, and weekly, with the
security-and-qualityquery suite.
v0.0.25
Added
- OpenSSF Scorecard analysis and badge. A weekly (and on-push) workflow
publishes the repository's supply-chain score, so the signing, SBOM,
provenance, pinned-action and vulnerability-scanning work is visible
rather than implied. - A module overview on pkg.go.dev.
doc.goexplains the grounding
guarantee, maps the packages, and states the 0.0.x stability contract, so
the module's landing page says what the tool is for.
Changed
cmd/draftcoverage rose from 88.6% to 91.1%, covering the--json
failure record (a failed job must reportok:falsewith an error rather
than claiming success), the version fallback, and themaxhelper.
v0.0.24
Added
-
Signed releases with SBOMs and build provenance. Every archive now
ships a CycloneDX SBOM,checksums.txtis signed keylessly with Sigstore
cosign (published aschecksums.txt.bundle, carrying both the signature
and the signing certificate), and GitHub build provenance is attested for
each artefact. Verify with:cosign verify-blob --bundle checksums.txt.bundle \ --certificate-identity-regexp 'https://github.com/sebastienrousseau/draft/.*' \ --certificate-oidc-issuer https://token.actions.githubusercontent.com \ checksums.txt -
--jsonruns headless and emits one JSON object per job (JSON Lines)
on stdout — source, output path, engine, mode, word count, and status —
leaving stderr for human progress, so runs can be piped into other tools. -
--completion <bash|zsh|fish>prints a shell completion script,
completing flags, engine names, and file arguments. -
Runnable examples on pkg.go.dev for
config,frontmatter,
pipeline,prompt, andrules, so every public package now documents
itself with compiled, verified code. -
An API stability note in the README: while the module is
0.0.xthe
Go API may change between releases, the CLI surface is the stable one, and
breaking changes are always listed in this file.
Changed
- The version has one source of truth. It was a hand-maintained literal
incmd/draft/main.goand an ldflags injection — the duplication is how
v0.0.22 once shipped mislabelled. It is now derived from the build info,
overridden by ldflags for releases, andmake build/make installstamp
it fromgit describe, so a local build reports exactly what it is.
Fixed
rulescoverage rose from 81.1% to 94.6%:MetricForms, which decides
whether an abbreviation and its expansion count as the same metric during
the faithfulness check, had no test at all.
v0.0.23
(its body folds into the surrounding prose), and any ellipsis-only heading is
caught by the validator — so a placeholder can neither ship nor fail a run.
- Style-calibration echo is removed. A small model sometimes reproduces the
tone example (or the user's own templates) as body text; any paragraph copied
verbatim from the calibration block is now stripped from the draft. - One source of truth for the house rules. The writing and review prompts
share a singlehouseStyleRulesblock instead of two near-duplicate lists,
and the structural markers the validator checks for (#,##, the post-lead
aside, the executive-summary label) live ininternal/rules, with a test that
keeps the skeleton in sync.
0.0.10 - 2026-07-21
Changed
- Parallel claim extraction on Ollama. Sections are now mined two at a time
against the local server (previously one at a time). On a single small GPU one
request does not saturate the hardware, so with the server started at
OLLAMA_NUM_PARALLEL=2two extractions run at ~1.8× the throughput of one; a
server pinned to one slot simply queues the second, so it is safe either way.
On a real 12-section paper this cut extraction from ~825s to ~645s. Capped at
two for Ollama (override withDRAFT_EXTRACT_CONCURRENCY).
Fixed
- Opening-thesis placeholder no longer leaks or fails a run. The skeleton's
bold thesis was a concrete label ("Opening thesis paragraph.") that a literal
model copied verbatim; on a dense paper this tripped the placeholder check and
burned the whole retry budget. The label is gone from the skeleton, and
post-processing now strips both a copied label (keeping any real thesis after
it) and a bare unfilled**...**line. Combined with the above, a real
12-section paper now drafts in ~817s (down from ~1330s) and passes on the first
attempt.
0.0.9 - 2026-07-21
Fixed
- Skeleton placeholder no longer leaks into drafts. The output skeleton used
a concrete-looking heading ("First analytical section") that an obedient local
model copied verbatim instead of replacing. The skeleton now uses a neutral
placeholder, the writing prompt explicitly says to replace placeholders with
specific headings, and the validator rejects any unfilled placeholder (a "..."
heading or a leaked thesis marker) as a safety net. gemma now writes real,
descriptive section headings.
0.0.8 - 2026-07-21
Changed
- Offline drafting is roughly 4× faster. On a measured 8 GB machine a
two-section source went from ~474s to ~116s end to end, with the draft passing
the house rules on the first attempt instead of after retries. The gains come
from three changes below; none reduce grounding. - Single Ollama model. Writing now defaults to
gemma3:4b(the model already
used for extraction), so a memory-constrained server no longer swaps a second
4B model in and out between phases. gemma also keeps to the word budget and does
not leak planning text into the article, whichqwen3:4bdid.qwen3:4bis no
longer used by default; the separate experimentalqwensession provider is
unaffected.
Added
- Claim-scaled length budget. The target word count and the Ollama
output-token cap are derived from the number of verified claims, so a thin
ledger yields a short, fully-grounded draft rather than a padded one. A draft
truncated at the cap is closed by trimming to its last complete sentence. - Deterministic style repair. Banned cliché words and phrases are swapped for
neutral, in-style equivalents in place (internal/rules.StyleReplacements),
removing the most common reason an otherwise-clean local draft needed a full,
slow regeneration. keep_aliveon Ollama requests and a documented 8 GB server profile
(flash attention + quantised KV cache) in the README — the single biggest
offline speed-up, taking a cold run from minutes to under two.
0.0.7 - 2026-07-21
Changed
cursor-agentpromoted to a verified (stable) provider after an end-to-end
check. Its invocation now passes--forceto clear the directory-trust prompt
that otherwise blocks non-interactive runs. Stable providers are now claude,
copilot, codex, grok, agy, and cursor-agent.
0.0.6 - 2026-07-21
Changed
- Replaced the
geminiprovider withagy(Google Antigravity, the
successor CLI), and promoted it to a verified (stable) provider after an
end-to-end check. Stable providers are now claude, copilot, codex, grok, agy.
0.0.5 - 2026-07-21
Added
- Windows support. The CI test matrix now covers Windows alongside Ubuntu
and macOS, and releases ship Windows binaries (amd64 + arm64, as.zip). PDF,
Markdown, and text sources work on all three platforms; DOCX remains
macOS-only (textutil).
Changed
- Made the
runTooltests portable (usegoinstead of theecho/false
shell builtins) so the suite passes on Windows.
0.0.4 - 2026-07-20
Changed
grokpromoted to a verified (stable) provider after an end-to-end check
(clean, grounded 1.1k-word draft). Stable providers are now claude, copilot,
codex, and grok.
[0.0.3] - 2026-07-19
Added
- Parallel claim extraction. On a session provider, sections are mined
concurrently (configurable viaDRAFT_EXTRACT_CONCURRENCY, default 4); Ollama
stays sequential. A failed worker retries down the fallback chain. - Live streaming preview. The Claude backend now uses the
stream-json
event format, forwarding token deltas as they arrive instead of one jump. - Review mode.
--review <draft.md>enhances an existing draft with
surgical find/replace edits grounded in the sources — validated for
uniqueness and non-overlap, and re-checked against the house rules. - Cancellation of in-flight work when the TUI quits or
--printis
interrupted (signal-aware context). - Experimental provider gating. Only
claude,copilot, andcodexare
verified end to end and used by auto mode; the rest need--experimental.
Changed
codexpromoted to a verified (stable) provider after end-to-end checks.- Removed the previously-dead surgical-edit code by wiring it into
--review. - DOCX extraction returns a clear "requires macOS" error off Darwin.
Tooling
- GitHub Actions pinned to commit SHAs; ubuntu + macOS test matrix; full REUSE
3.3 compliance with areuseCI gate; GoReleaser release workflow attaching
darwin/linux (amd64/arm64) binaries on tag push.
[0.0.2] - 2026-07-19
Added
- Multi-provider session engines. In
automodedraftnow drives the
first installed token-free coding-agent CLI — Claude, Codex, Gemini, Copilot,
Cursor, Amp, Crush, Goose, Grok, or Qwen — through its own logged-in session.
Force one with--engine <name>; override the model with--model. - Engine fallback chain. A failed session call advances along the chain and
finally to Ollama, so a queue works online, offline, or across a change in
connectivity — each job re-selects its engine independently. --keep-artifacts. A successful run now leaves only the finished article
in the dated folder; the scratch claim ledger is removed unless this flag is
set.--printheadless mode,examples/with three runnable, network-free
demos, benchmarks for the hot paths, and godoc examples.- Test coverage raised to ≥95% of app/library statements, including the
session backends (faked via theTestHelperProcesspattern). - Cancellation. A signal-aware context is threaded through the run; quitting
the TUI or Ctrl+C in--printterminates any in-flight provider subprocess or
Ollama request instead of orphaning it. - Experimental provider gating. Only
claudeandcopilotare verified end
to end and used by auto mode; the rest are marked experimental and require
--experimental(or--engine <name>), so the breadth claim stays honest.
Changed
- DOCX extraction now returns a clear "requires macOS" error off Darwin instead
of a confusing missing-command failure. - Removed the unwired surgical-review prompt (
prompt.Review) and its dead
helpers rather than shipping unused code. - Documented the agent auto-approve trust surface in the README security notes.
Fixed
- Header no longer bleeds. The status line is fitted to the terminal width
and hard-clipped, dropping the tagline then the model/word-range as space
shrinks. - Logo renders the Kenaz rune with a bright wordmark.
- Progress bar shows an explicit percentage.
.golangci.ymlmigrated to the v2 schema;make lintruns clean.- Truncation check decodes the final rune, so a draft ending in a smart quote or
ellipsis is no longer flagged as truncated.
[0.0.1] - 2026-07-19
Added
- Initial release: a Bubble Tea CLI that turns research PDFs into grounded,
body-only Markdown drafts, writing with Claude via the active CLI session when
online and a local Ollama model when offline, grounded by a verified claim
ledger.
v0.0.22
v0.0.21
Added
examples/dashboardruns the real full-screen TUI against an in-process
demo engine — no model, no network, no source of your own. The article
streams in word by word, so the queue, phase markers, live preview,
progress bar, and focus timer animate exactly as they do on a real run.
It is the quickest way to see the interface or check the layout at a
given terminal size.
v0.0.20
Fixed
- The logo now shows on a standard terminal. It was gated at 28 rows, so
the common 80x24 window only ever got the one-line masthead. The layout is
now budgeted line by line: the logo appears from 24 rows (compact form —
tagline beside the wordmark), section rules and blank separators give way
first on short terminals, and the focus timer and log are drawn only when
the space left genuinely fits them. The running view no longer needs
scrolling at any height from 20 rows up, with the queue and the full
pipeline always visible. The nib artwork was redrawn with shoulders, a
vent hole, a slit, and a tip.