Skip to content

Releases: sebastienrousseau/draft

v0.0.29

Choose a tag to compare

@github-actions github-actions released this 30 Jul 15:35
v0.0.29
3298db0
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

Choose a tag to compare

@sebastienrousseau sebastienrousseau released this 28 Jul 22:11
v0.0.28
9a8fbdf

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 as pdftotext -layout, which 0.0.27 replaced with reading-order
    extraction, and the limitations section still pointed at internal/rules
    and internal/validate, which became public packages in 0.0.18. Also
    documents --json, --completion and DRAFT_SHOW_LOGO, which had no entry
    in the flag or environment tables.

v0.0.27

Choose a tag to compare

@sebastienrousseau sebastienrousseau released this 28 Jul 21:33
v0.0.27
96239b3

Fixed

  • Two-column papers are no longer read across the columns. Extraction
    passed -layout to pdftotext, 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 its SOURCE_QUOTE appears 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 matching references|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/testdata holds 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

Choose a tag to compare

@sebastienrousseau sebastienrousseau released this 28 Jul 18:45
v0.0.26
81f7130

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
    now checksums.txt.sigstore.json, the canonical Sigstore bundle name.
  • Workflow tokens are read-only by default. release.yml requested
    contents, id-token, and attestations write at the workflow level,
    so every step ran with them. Permissions are now read-all at the top and
    widened only on the job that publishes.

Added

  • CodeQL analysis runs on push, pull request, and weekly, with the
    security-and-quality query suite.

v0.0.25

Choose a tag to compare

@sebastienrousseau sebastienrousseau released this 28 Jul 18:38
v0.0.25
8822dad

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.go explains 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/draft coverage rose from 88.6% to 91.1%, covering the --json
    failure record (a failed job must report ok:false with an error rather
    than claiming success), the version fallback, and the max helper.

v0.0.24

Choose a tag to compare

@sebastienrousseau sebastienrousseau released this 28 Jul 18:20
v0.0.24
f3a5f06

Added

  • Signed releases with SBOMs and build provenance. Every archive now
    ships a CycloneDX SBOM, checksums.txt is signed keylessly with Sigstore
    cosign (published as checksums.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
  • --json runs 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, and rules, so every public package now documents
    itself with compiled, verified code.

  • An API stability note in the README: while the module is 0.0.x the
    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
    in cmd/draft/main.go and 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, and make build/make install stamp
    it from git describe, so a local build reports exactly what it is.

Fixed

  • rules coverage 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

Choose a tag to compare

@sebastienrousseau sebastienrousseau released this 28 Jul 15:35
ff258c6
(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 single houseStyleRules block instead of two near-duplicate lists,
    and the structural markers the validator checks for (# , ## , the post-lead
    aside, the executive-summary label) live in internal/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=2 two 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 with DRAFT_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, which qwen3:4b did. qwen3:4b is no
    longer used by default; the separate experimental qwen session 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_alive on 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-agent promoted to a verified (stable) provider after an end-to-end
    check. Its invocation now passes --force to 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 gemini provider with agy (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 runTool tests portable (use go instead of the echo/false
    shell builtins) so the suite passes on Windows.

0.0.4 - 2026-07-20

Changed

  • grok promoted 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 via DRAFT_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 --print is
    interrupted (signal-aware context).
  • Experimental provider gating. Only claude, copilot, and codex are
    verified end to end and used by auto mode; the rest need --experimental.

Changed

  • codex promoted 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 a reuse CI 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 auto mode draft now 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.
  • --print headless 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 the TestHelperProcess pattern).
  • Cancellation. A signal-aware context is threaded through the run; quitting
    the TUI or Ctrl+C in --print terminates any in-flight provider subprocess or
    Ollama request instead of orphaning it.
  • Experimental provider gating. Only claude and copilot are 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.yml migrated to the v2 schema; make lint runs 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.
Read more

v0.0.22

Choose a tag to compare

@github-actions github-actions released this 28 Jul 15:43
v0.0.22
b06ba91
v0.0.22

v0.0.21

Choose a tag to compare

@sebastienrousseau sebastienrousseau released this 28 Jul 12:47
1d13e17

Added

  • examples/dashboard runs 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

Choose a tag to compare

@sebastienrousseau sebastienrousseau released this 28 Jul 12:46
v0.0.20
5e1f175

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.