Steven Woods
AI Briefing
Slowly, then fast. Every morning.
Steven Woods · public projects ↗

Release notes

Running v0.2.50-beta. Changes are built and tested on a development branch and reach production together as a release.

v0.2.50-beta · 2026-11-02 (weekday slot)

v0.2.49-beta · 2026-11-02 (weekday slot)

v0.2.48-beta · 2026-11-02 (weekday slot)

Quality fixes from the 10-31 review: - Story fatigue: when today's lead is the same story as a lead in the last two editions and brings no new primary source or report, the next Must read leads instead (editorial.stale_lead; the S-1 led five days running). - A capability slot: when no Must read is about what AI can now do and a well-backed release or result sits in Worth knowing, it moves up (editorial.capability_slot). The summary prompt rates capability news 3+, 4 for a first or a new generation (DeepMind's Genie 4 had been rated 2 and never reached the edition). - Verdict labels that discriminate: Reported / Self-reported / Single source instead of a blanket "Unverified" (all five Must reads on 10-31). Machine phrasing in evidence lines is put into plain words. - The board-seat scrubber no longer removes "a disclosure." from the middle of a sentence (it left "not But" in the 11-01 deep dive); the deep-dive check lists any sentence that looks cut short. - A held-back edition, sent later, also posts to Slack (the 11-01 post had to be sent by hand).

Dashboard refresh (Steven, 11-01: "pertinent information front and centre"): - A new home screen: Needs you (approvals, protected-file changes, an unsent edition, held takes, fact-check items, new feedback; "Nothing needs you right now" when calm), Today (run, site, email, Slack, takes, deep dive and corrections as status pills, with the day's top lines), Tomorrow (the deep dive to be drafted and what follows) and Health (critic score and rank, the release, failing sources, a trend chart against the top three shows). - Five menus instead of twenty tabs: Today, Editions, Sources, Audience, System. The old status page is /status. - A release restarts the dashboard, so it always runs the released code (11-01: a stale process failed every page).

v0.2.47-beta · 2026-11-01 (fix lane)

v0.2.46-beta · 2026-11-02 (weekday slot)

v0.2.45-beta · 2026-11-02 (weekday slot)

v0.2.44-beta · 2026-11-02 (weekday slot)

v0.2.43-beta · 2026-11-02 (weekday slot)

v0.2.42-beta · 2026-10-31

v0.2.41-beta · 2026-10-31

v0.2.40-beta · 2026-10-31

v0.2.39-beta · 2026-10-31 (weekend exception, Steven's yes in chat)

v0.2.38-beta · 2026-10-31 (fix lane)

v0.2.37-beta · 2026-10-31 (fix lane)

v0.2.36-beta · 2026-10-31 (fix lane)

v0.2.35-beta · 2026-10-30 (Steven asked to bring X forward for the weekend runs, an exception to the slot rule)

v0.2.34-beta · 2026-10-30 (fix lane)

v0.2.33-beta · 2026-10-30

v0.2.32-beta · 2026-10-30

v0.2.31-beta · 2026-10-29

v0.2.30-beta · 2026-10-29

v0.2.29-beta · 2026-10-28

v0.2.28-beta · 2026-10-28

v0.2.27-beta · 2026-10-28

v0.2.26-beta · 2026-10-28

v0.2.25-beta · 2026-10-28

v0.2.24-beta · 2026-10-28

v0.2.23-beta · 2026-10-28

v0.2.22-beta · 2026-10-28

v0.2.21-beta · 2026-10-27

v0.2.20-beta · 2026-10-27

v0.2.19-beta · 2026-10-27

v0.2.18-beta · 2026-10-27

v0.2.17-beta · 2026-10-27

v0.2.16-beta · 2026-10-27

v0.2.15-beta · 2026-10-27

v0.2.14-beta · 2026-10-27

v0.2.13-beta · 2026-10-27

v0.2.12-beta · 2026-10-26

v0.2.11-beta · 2026-10-26

v0.2.10-beta · 2026-10-26

v0.2.9-beta · 2026-10-25 (folded into v0.2.10)

v0.2.8-beta · 2026-10-25

v0.2.7-beta · 2026-10-25

v0.2.6-beta · 2026-10-25

v0.2.5-beta · 2026-10-25

The critic's first batch (review of 2026-10-24), plus an easier way to add takes. - No story twice: after the deep dive is written, a Must read it covers shrinks to one sentence and a pointer, in the written edition, the email and the podcast. On 10-24 this would have cut the PHP story that took about 11 of 19 minutes. - The briefing agrees with its deep dive: "not disclosed" lines the deep dive answers are dropped from the day in brief and Top of mind; "unverified" lines about the deep dive's story are flagged for review. - Verdict labels match their evidence: "Holds" is no longer used on an evidence check that says the claim is self-reported or unverified; it reads "Unverified". - Source gate: a homepage link, or a sponsored or webinar page, can't be a Must read. - "For early-stage": a new line on each Must read on what the story means at seed and Series A (written edition, email, podcast). - Audio: a cold open with the lead story's sharpest line; loudness normalised to −16 LUFS at 96 kbps; "K3.1" is said "K three point one", not "Kthree"; a lint logs words the voice may garble; developing stories get a short "what's new" segment. - Takes email: it now carries the whole edition, with an "Add your take" button after each section that opens a reply with the section's number filled in, and a link to the page on the site. - Not in this batch: merging the day in brief and Top of mind (critic item 7), which changes the email, site, takes slots and audio together; it needs a preview first.

v0.2.4-beta · 2026-10-25

v0.2.3-beta · 2026-10-25

v0.2.2-beta · 2026-10-24

v0.2.1-beta · 2026-10-24

v0.2.0-beta · 2026-10-23

v0.1.14-beta · 2026-10-23

v0.1.13-beta · 2026-10-23

v0.1.12-beta · 2026-10-23

v0.1.11-beta · 2026-10-23

v0.1.10-beta · 2026-10-23

v0.1.9-beta · 2026-10-23

Fix: on 2026-10-23 the deep dive's body was correct, but its summary and "Why today" lines, which readers see first in the email, on the site and in the podcast notes, said a legal-AI company disclosed no ARR and that "a vendor" claimed a $21M saving. In fact the company disclosed ARR, and the $21M was an investor's post about a different company. The day before, an unsourced Agenda line had called that investor the other company's "founder". - The why-today line comes from the checked body: it's written from the deep dive's checked "why today" section, no longer copied from the previous day's topic suggestion. - A header check (pipeline/consistency.py) for the summary and why-today lines: a sentence is dropped if a figure isn't in the checked body, if it names none of the companies or people the body ties that figure to, or if it says something wasn't disclosed when the body or a source gives it. Spelled-out figures in scripts count. If nothing in the summary survives, the checked opening is used. - Agenda lines can't assert unsourced roles: "founder", "CEO", "investor in" and similar must appear in the item's own source text; otherwise the line becomes neutral. - Deep-dive text is guarded like the briefing: a shipped deep dive changes only through a correction, and its page shows the correction note. - ./np correct DAY "what changed": records a hand edit to a shipped edition as a correction, shown on the day page and the deep-dive page.

v0.1.8-beta · 2026-10-23

Fix: the 2026-10-23 edition was held at 05:26 and again at 06:30. The release gate re-ran the whole test suite during the morning run, and one release test that checks for a running daily run saw the real one and failed. The same check blocked the backup's git push. - Released code isn't re-tested in the morning: once a code and settings fingerprint has passed the full gate (tests included) and is approved, later checks accept it without re-running the tests (data/state/release-passed.jsonl). Changed code is still fully checked. - Tests never read the live machine: test runs set NP_TESTING=1, run_in_progress doesn't look at real processes under it, and the release tests mock it too. - The evening preflight tests tonight what runs tomorrow: if the code hasn't passed the full gate yet, the preflight runs it at 20:30 and emails the owner if it fails, instead of finding out at 05:00. - The pre-push hook uses the same fast check (--release-check require), and ./np release reinstalls the hooks.

v0.1.7-beta · 2026-10-22

Shipped editions don't break. Once a day's email has gone out, that day is shipped (pipeline/shipped.py), and: - Publish guard: before every production publish, the new site is checked against what readers already have. It refuses (the live site is untouched and the owner is emailed) if any of these hold: - a shipped day page or deep dive is missing; - a shipped edition's text changed without a correction; - a shipped MP3 inside the retention window is missing; - the home page or a feed is missing, or the podcast feed would shrink. - Corrections are explicit: rebuilding a shipped day (rebrief, reprocess, remaster) needs --correct "what changed", and the page shows "Corrected <date>: …". - Remasters keep the old audio: the earlier MP3 is carried over from the live site, so no audio URL breaks. - After-publish check: once the site is live, the newest shipped pages, both feeds and the latest MP3 must answer. If not, the previous site is put back automatically, the email is held, and the owner is emailed. ./np publish restore does the same by hand. - The email waits for a good publish: if the publish fails or the after-publish check fails, no subscriber email goes out. Before, it went anyway. - Audio retention: 30 days on the site and in the podcast feed, up from 14. 60 days would be about 1 GB, the GitHub Pages limit. - Slack: links any member posts in the team channel now count, links only. Who posted is never stored, and their text is never used. - Staging preview: carries only the newest day's audio. The first full preview push timed out. - Site pushes are sturdier: a push that stalls (under 1 KB/s for 60 s) fails and is retried once over HTTP/1.1, instead of hanging the morning run. Pushes no longer use one huge buffered upload, which is what GitHub was timing out with HTTP 408.

v0.1.6-beta · 2026-10-22

v0.1.5-beta · 2026-10-22

v0.1.4-beta · 2026-10-22

v0.1.3-beta · 2026-10-22

v0.1.2-beta · 2026-10-22

v0.1.1-beta · 2026-10-22

v0.1.0-beta · 2026-10-22

The system as it runs today, labelled the first beta: a small number of outside readers.