Home / The briefs

How it runs

The briefs

Every brief this site has published about itself, from its articles, its notes and its engineering cards, with whether it is built, what remains, and a session brief an agent can start from.

73 briefs: 38 not built, 23 partly built, 11 built, 1 superseded. Status is taken from the code, the releases, the cards and the notes, not from what the articles say about themselves; first audited 2026-10-18. Each entry changes in the release that ships it. Why this exists: the briefs so far.

AreaBriefsOpen
Reader features1614
The reading account and the vault1511
Search and graphs54
Quality and review43
Editorial workflow77
The wires117
Agents and authors33
Payments44
The publishing method88

Open is not built or partly built. Within each area, open briefs come first, oldest first. Data: briefs.json.

Reader features

A pack for the reader's agent, onboarding packs, changes.json and an agent's door Not built

Size M · first briefed 2026-10-11 · brief-the-agent-too; the-agent-is-the-reader (What comes next 2)

Asked. A 'For your agent' button on /for/ that produces the same list as a plain-text/markdown pack (who it is for, numbers, markdown twins and graphs, reasons, reading rules, where to continue); curated onboarding packs; articles/changes.json listing new articles, versions and corrections per release; later a per-persona page telling an agent how to navigate the graph with token costs.

Built. Nothing of the pack: for/*.js has no pack code, articles/changes.json does not exist. The ingredients exist: llms.txt, llms-full.txt, a markdown twin per article, articles/graphs/<slug>.json, articles/ids.json, articles/versions/.

Remaining.

Needs first. Reading lists in a link (/for/) and article numbers

Session brief

Goal: give every reading list an agent-readable twin and publish a per-release delta. Read first: sgit.ai articles brief-the-agent-too.md ('What a pack looks like', 'Writing to someone else's agent, safely', 'What to build next') and the-agent-is-the-reader.md ('What comes next'), for/reading-list.js and for/make.js, llms.txt, articles/versions/. First deliverable: a 'For your agent' button on for/index.html that builds the pack text from the fragment and articles/ids.json, plus admin/build step writing articles/changes.json (new articles, new versions with one-line summary, corrections) named in llms.txt. Done when test_lists.mjs asserts the pack for the brief's example link contains each article's number, markdown URL, graph URL and the safety preamble, and the validator checks changes.json lists the release's new articles. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The pane about the piece: article graph, marks, decisions and cost Not built

Size M · first briefed 2026-10-12 · the-site-is-an-inbox (item 2); 2026-10-12__what-the-new-articles-ask (order 2); card 016

Asked. On an article, a Piece tab in the right-hand pane showing the article's graph drawn from articles/graphs/<slug>.json, the reader's marks and decisions on it and what it cost so far; the vault and meter move to their own tabs.

Built. Nothing of it. The pane has tabs (This page, Reading, Vault, Keys, Calls; assets/vault-pane/vault-pane.js) and the inputs exist: article graphs JSON, cytoscape vendored, the meter log. Card 016 is open; shipped/index.html lists it as designed.

Remaining.

Session brief

Goal: make the pane about the article in front of the reader. Read first: card open/016, sgit.ai the-site-is-an-inbox.md (item 2), admin/notes/2026-10-12__what-the-new-articles-ask.md, assets/vault-pane/vault-pane.js (tab structure), assets/vault-pane/notes.js, articles/graphs/<slug>.json shape, assets/vendor/cytoscape.min.js and wire/graphs.js for how graphs are drawn here. First deliverable: a Piece tab, shown only on /articles/*.html, drawing the article's graph and listing this page's notes and the meter's cost for the page. Done when a new check in test_pane.mjs opens an article, opens the Piece tab, finds the graph's node count equal to the JSON's, sees a note kept on the page listed, and the tab is absent on non-article pages; nothing overflows at 390px. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

A browser for one: Dinis's iPhone app for the newsroom Not built

Size L · first briefed 2026-10-18 · a-browser-for-one; 2026-10-18__a-browser-for-one

Asked. A personal iPhone app that only browses newsroom.sgit.ai: opens where it was left, knows what was read, opens the vault, tabs, offline, no reloads, reading workflows, an inbox from the agents.

Remaining.

Session brief

Read admin/notes/2026-10-18__a-browser-for-one.md and the article a-browser-for-one, then assets/door.js and assets/vault-pane/vault-pane.js for the passkey unlock. This needs Xcode on macOS (a session on Dinis's Mac, or GitHub Actions macOS runners with TestFlight) and Apple's paid developer membership. First deliverable: the smallest Swift app with the associated domain newsroom.sgit.ai that opens the site and tries the vault unlock; record whether PRF results come back inside the web view, with the iOS version. Done when the vault opens inside the app on Dinis's phone, or when the native-ceremony fallback is in place and tested.

One-tap decisions at every piece (the inbox mode), incl. read now, comment, move to a persona, front page Partly built

Size M · first briefed 2026-10-12 · the-site-is-an-inbox (item 1); two-agents-one-vault (the morning read); 2026-10-12__what-the-new-articles-ask; 2026-10-12__the-feedback-loop; card 013; card 017

Asked. Seven one-tap decisions at each piece (read now, read later, not for me, more like this, less like this, comment, move to a persona), recorded as records, carried by the vault, clearing the piece from the inbox; on the wire first, then the front page.

Built. assets/vault-pane/notes.js KINDS: done, read later, follow up, not for me, more like this (decisions) plus liked, wrong, fix this, idea, at every page and wire story (v0.12.0, Done added v0.12.1 card 004); Reading tab with done pages folded (006); wire stories fold when decided (v0.12.6, cards 023/024). The front page's Your desk view reads decisions as statuses (assets/front/front.js, v0.12.60).

Remaining.

Session brief

Goal: finish the decision set and bring it to the front page. Read first: sgit.ai article the-site-is-an-inbox.md ('What to build, in order'), admin/notes/2026-10-12__the-feedback-loop.md ('What is not built'), cards open/013 and blocked/017, assets/vault-pane/notes.js, assets/front/front.js and admin/build/front.py. First deliverable: unblock 017 (move it to open with a note that front.py now owns the markup) and render the decision chips on Broadsheet and Briefing cards, a decided piece folding as on the wire. Then 'Move to a persona' (a note of kind persona carrying the target persona id, Reading tab filterable by persona) and 'less like this'. Done when test_front.mjs taps a decision on a front card and sees it folded and recorded in notes, and test_notes.mjs covers the persona kind round-tripping through sync.js extract/consolidate. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Ways to read one article: modes row, default per persona, what is new, model modes Partly built

Size L · first briefed 2026-10-12 · ways-to-read-one-article; one-article-five-readers (What it looks like on the page); your-reading-your-controls (limits); 2026-10-12__what-the-new-articles-ask

Asked. A row of modes in the pane (headlines, infographic, two minutes, slides, what is new, facts, relationships, vocabulary, whole) with one tap to switch; default per persona; the mode in the address; 'what is new' from the Historian's arc and the reader's records; phone sheet; newsletter cut; model modes via the Prompt API; a figure per reader; an experiment per mode.

Built. A line and a paragraph for every section of every article (articles/summaries/, admin/build/summaries.py, card 083, v0.12.99); six ways to show sections already read (assets/reader/folds.js, card 082); the five readers' views for 5 articles (articles/views/, imported).

Remaining.

Needs first. The pane about the piece

Session brief

Goal: computed reading modes for every article, switchable in one tap and linkable. Read first: sgit.ai ways-to-read-one-article.md ('The modes', 'The brief'), admin/notes/2026-10-12__what-the-new-articles-ask.md (table of modes and their inputs), assets/reader/folds.js, articles/summaries/<slug>.json, articles/graphs/<slug>.json, articles/views/. First deliverable: Headlines (title, In short, one line per section from summaries) and Facts/Relationships (from the graph) as modes switchable from the pane and via ?mode=headlines, the whole article always one tap away. Done when test_reading.mjs opens /articles/<slug>.html?mode=headlines and finds one line per h2 section, switches back to whole, and a mode with no data says so and offers the nearest. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Marks with kinds on a phrase, and highlights that travel to the vault and lane Partly built

Size M · first briefed 2026-10-12 · the-site-is-an-inbox (item 3); scrolled-is-not-read (plan 1); 2026-10-13__design-lab-review (item 4); card 014; card 076

Asked. Select a phrase, choose a kind (interesting, great phrase, not sure, fact, evidence, question, or the reader's own), kept as a record with article, version and persona, visible in the pane and linked to the graph node; highlights become a note kind so they reach the vault and, when sent, the newsroom's lane.

Built. Highlights: select and tap, kept in the browser, drawn with the CSS Custom Highlight API (assets/reader/highlights.js, card 074, v0.12.85); a note keeps the selected phrase as its quote (notes.js).

Remaining.

Session brief

Goal: one record type for marks and highlights that travels. Read first: card open/014, card open/076 item 1, assets/reader/highlights.js, assets/vault-pane/notes.js and sync.js, sgit.ai the-site-is-an-inbox.md ('Marks, and the reader's own graph'). First deliverable: highlights stored as notes of kind 'mark' with {quote, context, kind, n, version}, migrated from highlights' current storage, shown in This page, carried by extract/consolidate. Done when test_reading.mjs makes a highlight with kind 'evidence', test_sync.mjs sees it in a device file and back on a second device, and the published page markup is unchanged. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

What you read, for real: statuses from reading, the account by article, signals, records in the vault Partly built

Size M · first briefed 2026-10-12 · scrolled-is-not-read (plan 2, 3, 8); your-reading-your-controls (limits); the-site-is-an-inbox (item 4, free signals); card 076

Asked. Use the two measures: a pick is Done when read and Skimmed is a status on Your desk; an account page listing each article with scrolled, read, verdict and highlights; the free signals (depth, awake time, from and to); a summary of reading records carried in the vault.

Built. Per-section scrolled and read (active time) kept in sgit.reading.v1 by assets/reader/strip.js (v0.12.85), which covers the 'awake time' signal. Your desk statuses still use depth >= 0.9 (assets/front/front.js line ~67).

Remaining.

Session brief

Goal: turn the reading records into what the reader sees and carries. Read first: admin/content/articles/scrolled-is-not-read.md ('Three prototypes', 'The plan'), card open/076, assets/reader/strip.js (record shape), assets/front/front.js (status logic), account/index.html, assets/vault-pane/sync.js. First deliverable: a 'What you read' section on the account page built only from sgit.reading.v1 and the highlights store, with verdicts read / part read / skimmed / started. Second: front.js statuses from the read measure. Third: a per-page summary in extract(). Done when test_reading.mjs seeds a skimmed and a read article and sees the right verdicts and the Your desk statuses, and test_sync.mjs carries the summary. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Design Lab leftovers: 404 page, escaping template, the board, feedback wording Partly built

Size S · first briefed 2026-10-13 · 2026-10-13__design-lab-review (items 3, 4, 6)

Asked. A 404.html with search and the doors; a label on the balance chip; the four-column board with keyboard and swipe and the feedback block's consent and receipt wording as patterns; adopt nr-html.js (escaping template) as a shared primitive.

Built. Highlights (item 4) shipped as card 074; the chip was redesigned in v0.12.85.

Remaining.

Session brief

Goal: take the small remaining items from the Design Lab review. Read first: admin/notes/2026-10-13__design-lab-review.md ('What to take, in order' and 'Where the material is' for vault links), assets/wire/... renderers (wire/wire.js, assets/vault-pane/vault-pane.js, assets/search/search.js). First deliverable: a 404.html with the site chrome, a search box and the main doors, checked by validate.js. Second: a shared escaping helper adopted in one renderer with tests. Done when GitHub Pages serves the 404 for an unknown path (check live) and the chosen renderer's tests pass with markup-in-data fixtures. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Fix the page yourself: the page API on every page and a library of fixes Partly built

Size M · first briefed 2026-10-17 · fix-the-page-yourself

Asked. An 8-step plan: load the page API on every newsroom page and name page parts; a community library of fixes; a per-site activeTab extension; the same API on sgit.ai and ruv.sgit.ai; count kept fixes; adopt popular ones; let a model write a fix; paid personal fixes.

Built. /demos/fixes/ (admin/build/page_fixes.py) with six fixes as buttons, bookmarklets and calls; assets/page-fixes/v0/v0.1/v0.1.0/page-fixes.js + api.json exposing window.__tools.page (v0.12.93). Only the article page itself loads it; site pages do not.

Remaining.

Session brief

Goal: step 1 and 2 of the brief on this site. Read first: admin/content/articles/fix-the-page-yourself.md ('The brief'), admin/build/page_fixes.py, assets/page-fixes/v0/v0.1/v0.1.0/page-fixes.js and api.json, admin/build/chrome.py (shared chrome). First deliverable: every page loads page-fixes.js from its versioned path and marks its chrome and content regions, so Reading mode needs no guessing. Done when a Playwright test on an article, a wire page and the front page calls window.__tools.page.apply('reading', true) after tool:ready and finds only the content visible, and test_themes.mjs still passes. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Make each article's changes easy to see Partly built

Size M · first briefed 2026-10-18 · Dinis, 18 October 2026, in the session

Asked. Every article keeps its versions and a page shows what changed between two of them; Dinis finds it powerful but not easy to see. Revising articles as facts and understanding change is expected, so the changes should be visible where people read.

Built. Version pages per article under articles/versions/<slug>/, with the differences between published versions (articles/versions/your-reading-your-controls.html is an example), built by publish.py from the git history.

Remaining. On the article itself: a line saying when it last changed and what changed, with a link to the diff; a reason line per version, from the release notes; links from a review finding to the version that fixed it; a clearer diff page (changed sentences highlighted in place, not only listed).

Session brief

Read publish.py's history replay and the version pages it writes (articles/versions/), and reviews/records/*/status.json. First deliverable: a 'Changed' line under each article's byline, injected at build like the Reviews section (and exempted in validate.js and sync_newsroom.py the same way), saying the last version, its date, one line of why from the release that made it, and a link to the diff. Then per-version reasons and links from review findings to the fixing version. Done when an article changed in a release shows that release's reason on its page and the link opens the diff at that version.

The front page from the newsroom's own data, in three views Built

Size M · first briefed 2026-10-13 · 2026-10-13__design-lab-review; cards 063, 064, 065, 066

Asked. Take the Design Lab's data (desks, tags, series, formats), words (purpose, masthead, persona stories) and decide a direction before porting a layout.

Built. admin/build/front.py writes index.html in Broadsheet, Briefing and Your desk views with ?view= (v0.12.60); desks/, articles/find.json; about/index.html; masthead 'Pay for what you read.'; admin/content/front/personas/*.json; test_front.mjs.

Scrolled is not read: two measures, the chip, charging by what is read, reader controls Built

Size M · first briefed 2026-10-16 · scrolled-is-not-read; your-reading-your-controls; cards 073, 074, 080, 081, 082, 083

Asked. Measure scrolled and read per section, a chip that holds still, highlights, then charge for what is read, with pause, reset and sections marked by hand, and read sections shown several ways.

Built. assets/reader/strip.js, strip.css, highlights.js, folds.js; sg-meter v1.5.0 at assets/components/sg-meter/v1/v1.5/v1.5.0/; releases v0.12.85 (073-075), v0.12.99 (080-083), v0.12.100 (081 fix); admin/build/test_reading.mjs and test_meter.mjs in CI. The billing decision was taken: charge by read.

The reading account and the vault

Vault housekeeping: pruning, retiring a device, rotating the master, purge, split, unsynced state Not built

Size L · first briefed 2026-10-12 · 2026-10-12__the-activity-vault (not synced; experiments); 2026-10-13__send-to-my-vault-from-any-browser (Not built); 2026-10-16__the-vault-opened (Not built); shipped/index.html (vault pane limits)

Asked. Prune local storage once the vault holds a record (meter reads the consolidated view), retire a device, rotate the master's key, purge processed inbox files, split a merged device back out, sync the active persona and shares; run the experiments (two real devices, a page read on two devices, ratings after merge, top-up across devices).

Built. Merge devices with aliases (card 077) is done; every other item is listed as designed, not built.

Remaining.

Needs first. The reader's own encrypted vault, the same newsroom on every device

Session brief

Goal: the vault's lifecycle operations, one at a time. Read first: admin/notes/2026-10-12__the-activity-vault.md ('What is not synced', 'The experiments to run next'), admin/notes/2026-10-16__the-vault-opened.md ('Merging, the rules'), assets/vault-pane/sync.js, assets/vault-pane/inbox.js. First deliverable: purge of processed inbox files and 'retire a device' (its file removed from the tree, an alias/tombstone in activity/aliases.json, history kept). Done when test_sync.mjs and test_vault_open.mjs cover retire and purge with the mock, totals unchanged and no record lost, and the note gets a 'What the pane gained' line. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Regular or automatic sync of the reader vault Not built

Size S · first briefed 2026-10-12 · card 029; 2026-10-12__the-activity-vault (experiment 6); 2026-10-13__the-wire-as-an-inbox

Asked. A setting the reader turns on: write the device file on a timer, on leaving a page or past a threshold, with the pane saying when it last ran.

Built. Explicit Update the vault and the pending count (card 027, v0.12.6); inbound bring-in on open (v0.12.58).

Remaining.

Session brief

Goal: opt-in automatic sync. Read first: card open/029, assets/vault-pane/pending.js and vault-pane.js (Update the vault), the activity-vault note experiment 1 (cost per sync). First deliverable: a per-device setting (off by default) that runs the same write as Update the vault on visibilitychange to hidden when pending > 0 and at most every N minutes, showing 'last synced'. Done when test_pane.mjs turns it on, reads a page, hides the tab and sees one commit with the device file, and none when off. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The early-access key first, checked before a passkey or vault is made Not built

Size S · first briefed 2026-10-12 · card 012; i-miss-it (Connect: an access key)

Asked. On a device with no account the first thing asked is the early-access key, with a Check button that asks the vault server without creating anything; only then are passkey and account offered.

Built. The access key is asked inside createAccount (vault-pane.js) and stored in the master; no prior check.

Remaining.

Session brief

Goal: key first. Read first: card open/012, assets/vault-pane/vault-pane.js (createAccount, client()), the vault API's token check used by the vault library. First deliverable: a 'Check' that calls a read-only endpoint with the key and reports valid/invalid before showing passkey creation. Done when test_pane.mjs shows an invalid key blocks the next step and a valid one (mock) unlocks it with no vault created. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Guide a first-time reader through the whole loop Not built

Size M · first briefed 2026-10-12 · card 018; card 007 (three steps, done)

Asked. From nothing to the first note sent: the loop in three lines, each step saying what it makes (passkey, three vaults, a file, a lane) and what leaves the browser, ending in the Keys tab and what was sent.

Built. The three steps with the next in bold (card 007, v0.12.1).

Remaining.

Needs first. The early-access key first, checked before a passkey or vault is made

Session brief

Goal: a first run a stranger can follow. Read first: card open/018, card done/007, assets/vault-pane/vault-pane.js, vault/index.html, admin/notes/2026-10-12__the-feedback-loop.md ('The loop, step by step'). First deliverable: a guided sequence in the pane with one screen per step and a 'what this made / what left the browser' line. Done when a synthetic first-time reader (scripted Playwright run plus the synthetic-users method) completes the loop without outside help and test_pane.mjs asserts each step's text appears in order. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Feedback without a vault: the newsroom's own append lane, typed schema, anonymous checkbox Not built

Size M · first briefed 2026-10-12 · card 010; the-editors-channel (Five audiences; anonymous lane); 2026-10-18__the-editors-channel (item 6)

Asked. A reader with no vault can send notes, encrypted in the browser to the newsroom's public key, into the newsroom's append lane with a published write token and a strongly typed schema; a checkbox (off by default) sends taps anonymously with exactly {kind, path, n, quote, at}.

Built. The pattern exists for subscribe (.well-known/sgit-subscribe.json, assets/subscribe.js) and the inbox sealing (inbox.js); not for notes.

Remaining.

Session brief

Goal: let any reader send a note without a vault, and anonymous taps when they opt in. Read first: card open/010, admin/notes/2026-10-18__the-editors-channel.md item 6 and Tests, assets/subscribe.js and .well-known/sgit-subscribe.json, assets/vault-pane/inbox.js (seal), admin/build/lane.py. First deliverable: a newsroom notes lane (contact file with vault id, append token, public key, schema id), the pane's Send working without a vault, and lane.py draining and validating. Done when a test sends from a browser with no vault, the server mock holds only ciphertext, a record with extra fields is rejected, and the anonymous mode sends exactly five fields. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Screenshots in feedback Not built

Size S · first briefed 2026-10-12 · card 011

Asked. Paste or pick an image in a note, resized in the browser to <=1280px webp, shown under the note and sent with it.

Built. Nothing.

Remaining.

Session brief

Goal: images on notes. Read first: card open/011, assets/vault-pane/notes.js and vault-pane.js (note editor), sync.js (size of device files). First deliverable: paste/pick into the note box, canvas resize to webp, stored as a separate file in the reader vault referenced from the note. Done when test_notes.mjs pastes a fixture PNG, finds a <=1280px webp attached and sent with the note. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Replies: the newsroom answers in the pane, down a lane the other way Not built

Size M · first briefed 2026-10-12 · card 015; card 035 (blocked); 2026-10-12__the-feedback-loop; 2026-10-13__send-to-my-vault-from-any-browser; i-miss-it (The reply is the change)

Asked. When the newsroom answers a note, the answer is written to a reply vault/lane the newsroom writes and the reader reads with a key in their master, and shown under the message in the pane.

Built. Nothing; answers come in chat or as article versions. Card 035 blocked ('none yet').

Remaining.

Needs first. Key pairs for the reader (and personas)

Session brief

Goal: close the loop from the newsroom back to the reader. Read first: cards open/015 and blocked/035, admin/notes/2026-10-13__send-to-my-vault-from-any-browser.md (the inbox lane is the same machinery pointed the other way), admin/build/lane.py, assets/vault-pane/inbox.js. First deliverable: the reader's inbox accepts messages sealed by the newsroom (to the inbox public key), lane.py --reply <note id> writes one, and the pane shows it under the note in This page. Done when test_inbox.mjs drains a newsroom reply fixture and renders it under the right note, and a reply sealed to another key is refused. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

pki.sgit.ai as a directory of people and their keys, with two-way verification Not built

Size L · first briefed 2026-10-18 · a-directory-of-people-and-keys; 2026-10-18__a-directory-of-people-and-keys; secrets-on-public-keys

Asked. People register a passkey on pki.sgit.ai that opens a vault, make or import a key pair, publish the public half with evidence (website, GitHub, DNS TXT), are verified by Dinis and confirm it, then verify each other with links that count only when both confirm; degrees of separation; invitations and secrets by QR code. KPI: real public keys in the register.

Built. pki.sgit.ai (v0.1.74) has the design for agents, the four registry rules and a static register with one real record and ten fixtures; sgit pki makes and exports keys; vault messaging and append lanes ship; the newsroom's passkey vault exists to reuse.

Remaining.

Session brief

This work happens in the pki.sgit.ai repository, not this one. Read admin/notes/2026-10-18__a-directory-of-people-and-keys.md on newsroom.sgit.ai and the article, then pki.sgit.ai's llms.txt, /rules/ and /registry/llms.txt, and sgit.ai/docs/pki.md and vault-messaging.md. First deliverable: a people record schema (identity statement from an sgit pki export bundle, evidence claims, vouch and confirmation statements, each in the owner's record) with a validator that rejects writes to another person's record and computes confirmed links only when both statements exist. Done when the tests in the note pass on fixtures.

The passkey MVP: doors per path, identity, add/retire doors, several passkeys Partly built

Size L · first briefed 2026-10-11 · the-passkey-opens-the-vault; 2026-10-12__one-door-per-passkey-path; 2026-10-12__what-the-new-articles-ask

Asked. 13-step MVP: passkey with PRF, the derivation, door/master/reader/recovery vaults, identity key pairs in the master, add a door with no key typed (QR path), 'no door here yet', reading account moved into the vault, the master's entries and doors shown with a lock and retire, several passkeys/masters, tests of the four runs, the report to Apple/Google.

Built. passkey/ lab (v0.8.3) with test vectors; assets/door.js; createAccount/unlock/addDoor in assets/newsroom-vault.js; the pane creates door, master, reader vault and recovery door, adds a passkey-path door when joining with the recovery code (vault-pane.js ~line 755), says 'no door here yet', lists doors in the Keys tab; test_passkey.mjs, test_pane.mjs with a virtual authenticator.

Remaining.

Session brief

Goal: the remaining door operations in the pane. Read first: sgit.ai the-passkey-opens-the-vault.md ('The brief for the MVP'), admin/notes/2026-10-12__one-door-per-passkey-path.md ('The flow, written out'), assets/newsroom-vault.js (addDoor), assets/vault-pane/vault-pane.js (createAccount, joinWithCode, Keys tab), passkey/lab.js. First deliverable: 'Add another device's path' from an unlocked pane (bytes from the other path via a one-time link/QR handled in the browser), and 'Retire this door' that removes the door file and its entry in the master's list. Done when test_pane.mjs with two virtual authenticators adds a second door from an open session, opens with it, retires the first, and the first can no longer open. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Key pairs for the reader (and personas): sign what is sent, verify on receipt Partly built

Size M · first briefed 2026-10-11 · i-miss-it (Connect: a key pair); the-passkey-opens-the-vault (step 5); the-site-is-an-inbox (items 5, 6); sixteen-notes-i-did-not-want-to-lose (step 1); on-the-record (step 1); the-editors-channel (Keys, and then key pairs)

Asked. Random signing and encryption key pairs made in the reader's browser, private halves in the master with label/purpose/date/status, public halves published; notes and lane messages signed; the inbox brief adds one pair per persona.

Built. An RSA-OAEP 3072 encryption key pair per inbox, private half in the master (assets/vault-pane/inbox.js, v0.12.26). No signing key anywhere; lane notes are unsigned (feedback-loop note).

Remaining.

Needs first. The passkey MVP

Session brief

Goal: a signing identity for the reader. Read first: the-passkey-opens-the-vault.md step 5 ('Never derive a key pair from the passkey'), assets/vault-pane/inbox.js (key pair creation and sealing, sgit hybrid envelope v2), admin/content/articles/the-editors-channel.md ('Keys, and then key pairs'), admin/build/lane.py. First deliverable: an ECDSA P-256 (or Ed25519 where supported) pair made at random on unlock if absent, stored in the master with metadata, the public key shown in the Keys tab; notes sent down the lane carry a signature over their canonical JSON; lane.py verifies and flags unsigned/invalid. Done when test_inbox.mjs/test_notes.mjs sign and verify a note, a tampered note fails, and lane.py's check reports it. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Send to my vault from any browser: the inbox lane, the link three ways, the drain Partly built

Size S · first briefed 2026-10-13 · sixteen-notes-i-did-not-want-to-lose; 2026-10-13__send-to-my-vault-from-any-browser; card 049

Asked. A key pair, an append lane on the reader vault, a link as URL/text/QR, the sender side, the drain on unlock, tests; tokens rotatable, arrivals shown before merge, links able to expire.

Built. vault/send.html, assets/vault-pane/inbox.js, send.js, the drain and rotation in vault-pane.js (v0.12.26); test_inbox.mjs.

Remaining.

Needs first. Key pairs for the reader (and personas)

Session brief

Goal: the inbox's open items. Read first: admin/notes/2026-10-13__send-to-my-vault-from-any-browser.md ('Not built'), assets/vault-pane/inbox.js, vault/send.html. First deliverable: an expiry date carried in the link and enforced by send.html and by the drain (late messages listed and not merged). Done when test_inbox.mjs shows an expired link refused on both sides. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Add a device by a code carrying the vault key; sign-in with Google Superseded

Size S · first briefed 2026-10-11 · i-miss-it (3. Add a device)

Asked. Show a QR/text carrying the vault key and access key to add a device; later a passkey and Google sign-in for identity and recovery.

Built. Replaced by the passkey design (a door per path, recovery code; the-passkey-opens-the-vault step 13: no sign-in to the site, no OAuth) and by 'Connect with a link' (v0.12.58) and the inbox link (v0.12.26), none of which carries the vault key.

The reader's own encrypted vault, the same newsroom on every device Built

Size L · first briefed 2026-10-11 · i-miss-it; 2026-10-12__the-activity-vault

Asked. An encrypted reader vault carrying personas, history, ratings, picks, notes and receipts between devices; one file per device, state computed, receipts counted once by reference, local copy stays primary; a line to the newsroom.

Built. Vault pane assets/vault-pane/vault-pane.js + sync.js (extract/consolidate/mergeInto/accountFile), assets/newsroom-vault.js, vault/index.html (v0.11.0); test_sync.mjs, test_pane.mjs, test_vault.mjs in CI; top-ups keyed by payment reference (topupKey in sync.js). Later additions in the open-or-connect and vault-opened entries.

The feedback loop: notes kept as you read, sent down the reader's own lane; Write to the newsroom Built

Size M · first briefed 2026-10-12 · 2026-10-12__the-feedback-loop; i-miss-it (A line to the agent); the-site-is-an-inbox (item 6, unsigned part); card 034

Asked. Notes kept at any page or wire story, carried by the vault, sent when the reader chooses down a lane whose read key the newsroom holds; a message box to write to the newsroom.

Built. assets/vault-pane/notes.js, the This page tab, the lane (v0.12.0), admin/build/lane.py, Write to the newsroom with Save and send (card 034, v0.12.8); test_notes.mjs.

Open or connect a vault; merge devices, the Calls tab, browse, the shared viewer Built

Size L · first briefed 2026-10-13 · 2026-10-13__open-or-connect-a-vault; 2026-10-16__the-vault-opened; the-vault-crosses-chrome-profiles; cards 059, 077, 078, 079

Asked. Two ways in (passkey or link), which device a browser is, what the vault holds brought in; merge devices; calls decoded; a browse page; one viewer every reader vault opens with.

Built. v0.12.58 (059) and v0.12.88 (077-079): vault/browse.html, assets/vault-pane/calls.js, browse.js, sg-embed.js, installViewer in assets/newsroom-vault.js, admin/build/viewer_vault.mjs, viewer vault lkypj6zq; test_vault_open.mjs, test_sync.mjs.

Search and graphs

A shared vocabulary of concepts across the article graphs (the site altitude) Not built

Size M · first briefed 2026-10-10 · one-article-five-readers (What comes next 3); the-agent-is-the-reader (What comes next 1); scrolled-is-not-read (plan 6); 2026-10-18__explore-search-as-navigation (taxonomy debt, idea clusters); card 076

Asked. One ontology across every article: concept labels merged (2,230 distinct labels, 47 shared), duplicate tags merged, kept by the Librarian in the findability data, so 'new' means new and concepts can link across articles.

Built. Tags already reduced to 42 controlled subjects in articles/find.json (card 064, v0.12.60). Concept labels are still per-article islands.

Remaining.

Session brief

Goal: deterministic concept clusters and a taxonomy report. Read first: admin/notes/2026-10-18__explore-search-as-navigation.md ('The taxonomy debt, counted', 'Idea clusters', 'The taxonomy report'), admin/content/articles/graphs/, admin/build/find.py, articles/find.json. First deliverable: a builder that normalises graph node labels, applies a curated aliases file, writes clusters and the report (tags used once, near-duplicates, cross-article ideas), and merges the obvious duplicate tags in sources with each merge in the release note. Done when the build prints the counts, a fixture alias merges two labels, and an alias mapping to two clusters fails the build. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Search follow-ups: the live wire, search in the pane, synonyms, conversation, answers as notes Not built

Size M · first briefed 2026-10-13 · 2026-10-13__search-in-the-browser (What is not built, twice)

Asked. Index wire stories added since release, search the reader's own notes and reading in the pane, synonyms and spelling, Ask with a conversation and tools, answers kept as notes and sendable.

Built. None of these (the search note lists them as not built).

Remaining.

Needs first. Search in the browser and Ask the site

Session brief

Goal: the cheapest follow-ups first. Read first: admin/notes/2026-10-13__search-in-the-browser.md, assets/search/search.js and ask.js, assets/vault-pane/notes.js, wire/vault-reader.js. First deliverable: 'Keep this answer' on Ask, storing the answer and its cited passages as a note (kind idea or a new kind) that travels with the vault; and search over the reader's notes in the pane. Done when test_ask.mjs keeps an answer and finds it in notes, and test_pane.mjs searches a kept note by a word. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Explore: search as navigation over the site's graph, with an inspector pane Not built

Size L · first briefed 2026-10-18 · search-as-navigation; 2026-10-18__explore-search-as-navigation

Asked. A release-time data layer (ontology, nodes, edges, terms, triples, tables, stats), /explore/ with a chip query bar, exact suggestions, five views (graph, sections, figures, timeline, list), the walk in the address, an inspector pane (fetches, plan, why, SQL/SPARQL, timings, export), feedback and golden queries with recall at build. No model in this version.

Built. Nothing (no explore/ directory, no admin/build/explore_index.py; features.json marks explore 'designed'). Inputs exist: search/docs.json, articles/graphs, articles/summaries, ids.json, trails.json, reviews/status.json, vendored cytoscape, Oxigraph and sql.js.

Remaining.

Needs first. A shared vocabulary of concepts across the article graphs (the site altitude)

Session brief

Goal: follow the note's order. Read first: admin/notes/2026-10-18__explore-search-as-navigation.md in full, admin/build/search_index.py, assets/search/search.js, databases/ (graph.html and sql.html with assets/nsdb-sparql.js, nsdb-sql.js). First deliverable: admin/build/explore_index.py writing explore/ontology.json, nodes.json, edges.json, terms.json and stats.json in the release after summaries and reviews, with the size budget printed; the build fails on a dangling edge. Second: /explore/ with chips, suggestions, list and sections views. Done when admin/build/test_explore.mjs passes the note's checks (Portugal offers entity, wire and tag with exact counts; second chip narrows; sections link to real anchors; nothing overflows at 390px; window.__tools.explore returns the same ids). Ask Dinis the note's three questions (golden queries, nav placement, first entities) early. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Free models, your own key: more providers, sign-in, key in the vault, a Worker Partly built

Size M · first briefed 2026-10-18 · free-models-your-own-key; 2026-10-13__search-in-the-browser (key in the master vault); ways-to-read-one-article (model modes)

Asked. Add Groq, Gemini (AI Studio) and Mistral beside OpenRouter on the search page with short guides; OpenRouter sign-in instead of a pasted key; the key kept in the reader's vault; a Worker a reader can deploy for Cloudflare; recheck the map quarterly.

Built. Ask with Chrome's built-in model or the reader's OpenRouter key in session/local storage (assets/search/ask.js, v0.12.9). The article (v0.12.104) says the BYOK design is not built.

Remaining.

Needs first. Search in the browser and Ask the site

Session brief

Goal: more providers on Ask, then the key in the vault. Read first: admin/content/articles/free-models-your-own-key.md ('What works from the browser today', 'The two tests', 'What we will build'), assets/search/ask.js, admin/build/test_ask.mjs. First deliverable: a provider choice (OpenRouter, Groq, Gemini, Mistral) in 'How questions are answered', each with endpoint, default free model and a two-line guide, requests built per provider's API shape. Done when test_ask.mjs stubs each endpoint and checks request shape, Authorization handling and that the key never leaves for any other host. Next: OpenRouter sign-in, then the key in the master vault. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Search in the browser and Ask the site Built

Size M · first briefed 2026-10-13 · 2026-10-13__search-in-the-browser; cards 031, 033

Asked. A client-side search over articles, wire, notes and cards from an index built at release; Ask answers from the passages with Chrome's built-in model or the reader's OpenRouter key.

Built. admin/build/search_index.py -> search/docs.json, search/text.json; assets/search/search.js, ask.js; /search/; v0.12.7, v0.12.9; test_search.mjs, test_ask.mjs.

Quality and review

An experiment per feature: two variants, a synthetic reader, a measurement Not built

Size M · first briefed 2026-10-12 · the-site-is-an-inbox (item 8); ways-to-read-one-article (item 10); the-homepage-is-a-vault (item 7); a-reading-list-in-a-link (tests)

Asked. Run every reader feature as two variants measured with a synthetic reader (the how-to-run-synthetic-users method), starting with the inbox decisions, the mark kinds and the awake-time proxy.

Built. The synthetic-users method was run once on this site (v0.6.2 study, /mvps or study page); the front page accepts ?view= so variants can be linked (v0.12.60). No per-feature experiments recorded.

Remaining.

Session brief

Goal: a repeatable synthetic-reader experiment for one feature. Read first: sgit.ai how-to-run-synthetic-users.md, admin/notes/2026-10-10__newsroom-move-and-content-audit.md (v0.6.2 study), admin/build/test_front.mjs (Playwright setup), the-site-is-an-inbox.md item 8. First deliverable: admin/build/experiment.mjs that drives two front-page views (?view=broadsheet vs ?view=briefing) with a scripted persona task and records time-to-task and errors to a JSON file; a note in admin/notes/ with the result. Done when the script runs locally twice with consistent results and the note states the hypothesis and the outcome. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The five counts of Firing journalists, run on this site Not built

Size S · first briefed 2026-10-12 · firing-journalists (Read it from outside); 2026-10-12__what-the-new-articles-ask (order 4)

Asked. A page built at release from the site's own files: original share, sourcing (with a link-resolution check), corrections and whether they propagate, roles, the metric reported.

Built. Nothing; no page carries the counts.

Remaining.

Session brief

Goal: publish the newsroom's own five counts. Read first: sgit.ai firing-journalists.md ('Read it from outside'), admin/notes/2026-10-12__what-the-new-articles-ask.md ('Firing journalists'), articles/graphs/, corrections/, articles/versions/, newsroom/roles/. First deliverable: admin/build/counts.py writing a page and JSON with each count and its method; sourcing includes an optional slow link check run nightly, not per commit. Done when the validator checks the page exists and the numbers reproduce from a second run. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Signed opinions on the record, paid when valued, a share for the idea Not built

Size L · first briefed 2026-10-18 · on-the-record; reviews-on-the-record (People on the record); the-agent-is-the-reader (signed claims)

Asked. A reader key pair; a proof page (key on a domain or DNS) checked and recorded; an opinion record (review with a position, signed, withdrawable); opinions shown beside reviews with identity level and the newsroom's answer; payment from a reader's rating to the expert and a revenue share for recorded ideas.

Built. Only the review record format with a 'reader' kind (reviews.py) and the meter's ratings. features.json marks signed-opinions 'designed'.

Remaining.

Needs first. Key pairs for the reader (and personas), Reviews on the record

Session brief

Goal: the first signed opinion end to end, without money. Read first: admin/content/articles/on-the-record.md ('Identity, in levels', 'What exists, and what to build'), reviews/criteria.md, admin/build/reviews.py, admin/content/articles/reviews/. First deliverable: a 'reader' review record with a public key, a signature over the canonical record and the text hash, verified by reviews.py --check, and a domain-proof check (fetch https://<domain>/.well-known/... ) recorded with its date. Done when --check accepts a valid fixture and rejects a tampered one, and the article page shows the opinion with its identity level. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Reviews on the record: criteria, one file per review, the newsroom answers Built

Size M · first briefed 2026-10-18 · reviews-on-the-record

Asked. Published review criteria, reviews by any agent/editor/desk as one immutable file per article text, status.json with the newsroom's answers, --next batches, a Reviews section on every article.

Built. reviews/criteria.html/.md v1.1, admin/build/reviews.py (--next, --check), admin/content/articles/reviews/<slug>/, reviews/status.json, /reviews/, Reviews section on articles (v0.12.107). Five agent reviews recorded; no editor or reader reviews yet (see editors-channel and on-the-record).

Editorial workflow

The Editor places wire stories on the front page Not built

Size M · first briefed 2026-10-12 · two-agents-one-vault; 2026-10-12__what-the-new-articles-ask; shipped/index.html (wires limits)

Asked. Up to three wire stories on the front page with a reason per slot, from a placement file the Editor writes.

Built. Nothing: index.html links the wires in the nav only. The front page is now built here by admin/build/front.py (v0.12.60), so the 2026-10-12 note's 'sgit.ai's to build' no longer applies.

Remaining.

Session brief

Goal: wire slots on the front page. Read first: sgit.ai two-agents-one-vault.md ('The loop'), admin/notes/2026-10-12__what-the-new-articles-ask.md (Two agents table), admin/build/front.py, wire/snapshot.json, newsroom/roles/editor.md. First deliverable: admin/content/front/wire-slots.json (story id, wire, reason) read by front.py, rendered as a 'From the wires' block with each reason; slots older than two days drop out. Done when test_front.mjs finds the block with the fixture's stories and reasons and no block when the file is empty. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

A pitched wire story becomes an article that inherits its sources and provenance Not built

Size M · first briefed 2026-10-12 · two-agents-one-vault

Asked. The Journalist pitches a wire story; the article written from it inherits the story's frozen sources and provenance graph from the vault.

Built. Nothing.

Remaining.

Session brief

Goal: one article made from a wire story with inherited provenance. Read first: sgit.ai two-agents-one-vault.md, wire/vault-reader.js and the wire contract (wire/desk-brief.md), admin/build/publish.py, an article graph JSON. First deliverable: a front-matter field from_wire: <wire>:<story id> that the build resolves from the snapshot into the article's sources and a provenance section. Done when one article built with it shows the story's sources and the validator fails on an unknown story id. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

A weekly newsletter cut from the week's wire briefs, quotes checked at build Not built

Size M · first briefed 2026-10-12 · two-agents-one-vault; shipped/index.html (wires limits)

Asked. A weekly newsletter built from the week's wire briefs, every quote checked against frozen bytes at build time.

Built. The newsletter of articles is written here (v0.12.18, admin/content/newsletter/); nothing from the wires.

Remaining.

Session brief

Goal: a wire digest issue. Read first: sgit.ai two-agents-one-vault.md, admin/content/newsletter/, the wire snapshots (wire/*/snapshot.json), wire/charter.html (quote tiers). First deliverable: admin/build step writing a draft weekly issue per wire from the snapshot with quotes verified verbatim against the stored capture, failing on a mismatch. Done when a fixture week builds and a modified quote fails the build. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

A written decision policy for shipping past a pre-existing failing test Not built

Size S · first briefed 2026-10-17 · three-decisions-mapped (Scenario 2)

Asked. Turn the agent's repeated judgement into a rule: a test that fails before the change, on pages it does not touch, does not block for at most N days and its owner is told; also check a figure's facts like the body's; count leak-scan gaps only in covered repositories.

Built. Nothing written as a policy; the release recipe and leak scan exist.

Remaining.

Session brief

Goal: write and enforce the release decision. Read first: admin/content/articles/three-decisions-mapped.md (Scenario 2), newsroom/policies.md, .github/workflows/deploy-pages.yml. First deliverable: the policy text in newsroom/policies.md and a known-failures file (test, since, owner, expires) that the reader-tests job consults to warn instead of fail until expiry. Done when CI passes with a listed, unexpired failure and fails once it expires. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The editor's channel: editor key and vault, signed-off notes, the daily pass, the down lane Not built

Size L · first briefed 2026-10-18 · the-editors-channel; 2026-10-18__the-editors-channel; reviews-on-the-record (editor reviews)

Asked. A signed-off note kind; a daily pass (newsroom.writer) reading the lane, running checks, applying cheap fixes, proposing the rest, recording sign-offs as editor review records; an editor key carried in a fragment; an editor vault with up/ and down/; editor mode sending reads/notes/fixes; the down lane and Process now in the pane; later signatures and per-key grants.

Built. Nothing of it (note status: a brief; features.json 'designed'). Reused pieces exist: notes.js, lane.py, inbox.js sealing, wording.py, reviews.py.

Remaining.

Needs first. Reviews on the record

Session brief

Goal: order step 1 of the note. Read first: admin/notes/2026-10-18__the-editors-channel.md in full, admin/content/articles/the-editors-channel.md, assets/vault-pane/notes.js, admin/build/lane.py, admin/build/reviews.py, reviews/status.json. First deliverable: a 'signed-off' note kind on article pages (shown only in editor mode or behind a flag), and a pass script that reads the existing lane, writes each sign-off as an editor review record with the text hash, and reports stale sign-offs. Done when test_notes.mjs keeps a sign-off, the pass on a fixture lane writes a valid record that reviews.py --check accepts, and a browser with no editor key loads no editor code (network log). Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The Librarian's daily brief and debrief of Dinis's universe Not built

Size M · first briefed 2026-10-18 · the-librarians-daily-brief; 2026-10-18__the-librarians-daily-brief; the-agents-write-too

Asked. Every morning, a page for Dinis: what needs him, yesterday across every repository and organisation (including outside pull requests), the agents' debrief with costs, threads worth picking up, what is coming, and at most three places where his leverage is; learning from what he acts on.

Built. The sources exist: release files, the accountant's ledger (admin/build/wire-runs.json), the briefs map, reviews/status.json, the wires.

Remaining.

Session brief

Read admin/notes/2026-10-18__the-librarians-daily-brief.md and the article, then admin/build/runs_ledger.py, admin/build/wire-runs.json, admin/content/briefs.json and reviews/status.json. First deliverable: admin/build/librarian.py that writes admin/content/librarian/<date>.md and .json for yesterday from this repository alone (releases, ledger runs including refused ones, briefs whose status changed, new reviews and open findings), and a newsroom/roles/librarian.md role file. Done when, for a fixture day, the brief has each item in the right section and a source that could not be read is flagged at the top.

Sections by audience, kept current by rule Partly built

Size M · first briefed 2026-10-18 · a-section-for-publishers

Asked. A section per audience: five picks by the editor, latest marked new, the features usable today, every relevant article placed by written rules into streams; next sections for security leads and boards, people building with agents, founders and investors.

Built. For publishers: sections/publishers/, sections/index.html, sections/publishers.json, sections/features.json from admin/content/features.json, admin/build/sections.py (v0.12.108).

Remaining.

Session brief

Goal: the next three sections. Read first: admin/content/articles/a-section-for-publishers.md, admin/content/sections/publishers.json, admin/build/sections.py, articles/find.json, desks/. First deliverable: admin/content/sections/security.json with rules, exclusions with reasons and five picks left as a placeholder for Dinis, built by sections.py with its near-miss report. Done when sections.py writes the page and JSON twin, the near misses are reviewed in the release note, and Dinis has chosen the five picks. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The wires

The wire's desk reads the reader's decisions and proposes persona edits Not built

Size M · first briefed 2026-10-12 · card 030; two-agents-one-vault (the morning read); 2026-10-13__the-wire-as-an-inbox; shipped/index.html (the lane's read key has not reached the desks)

Asked. The desk reads the reader's lane with a read key, takes wire decisions (Not for me, Should reach me, more like this), and proposes persona edits as a diff for approval in its weekly pass.

Built. Decisions are kept and can be sent down the reader's lane; no desk reads them.

Remaining.

Session brief

Goal: the join learns from the reader. Read first: card open/030, admin/notes/2026-10-13__the-wire-as-an-inbox.md ('The message for the wire's agent'), wire/desk-brief.md, admin/build/lane.py. First deliverable: a script (shared with the desks) that reads a lane with a read key and outputs the wire decisions per story id and persona as JSON, plus a desk-brief section asking desks to propose persona edits as a diff. Done when the script on a fixture lane outputs the expected decisions and the desk brief names the file the desks read. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The overview at /wire/: tiles, one lens, the week as small multiples, edition history Not built

Size M · first briefed 2026-10-13 · 2026-10-13__five-wires-five-pages (stage R3); 2026-10-13__more-than-one-wire (a page of the wires; one inbox across wires); 2026-10-13__the-wire-as-an-inbox (editions as history); card 057

Asked. /wire/ becomes the overview of all wires (tiles, one lens, today across wires, the week per wire, picture costs), the Industry Wire moves to /wire/industry/, per-edition history kept, one inbox count across wires.

Built. Nothing; /wire/ is still the Industry Wire. Card 057 is blocked on Dinis's yes to the move.

Remaining.

Session brief

Goal: the overview, once Dinis agrees to the move. Read first: card open/057, admin/notes/2026-10-13__five-wires-five-pages.md (stages), admin/notes/wires-ux/design.md and architecture.md, wire/wire.js, admin/build/wire.py. First deliverable (no move needed): per-edition history kept at release (wire/<wire>/editions/<date>.json) and wire/overview.json. Then the page at a temporary address /wire/overview.html until Dinis says yes. Done when test_wire.mjs renders the overview with the four wires' counts matching their snapshots and the Industry Wire's inbox state survives the move in a migration test. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The morning routine makes the pictures (key in the environment, caps) Not built

Size S · first briefed 2026-10-13 · 2026-10-13__five-wires-five-pages (stage R5); card 060

Asked. The scheduled routine runs the infographic pipeline per changed wire with caps (forty images, two dollars), committing images and ledgers, the key only from the environment's secrets.

Built. The step is in the routine's prompt since 14 October and runs dry without the key; card 060 open, blocked on Dinis adding OPENROUTER_API_KEY to the environment.

Remaining.

Session brief

Goal: verify, once Dinis has set the secret. Read first: card open/060, admin/build/infographics.py, wire/infographics/ledger.json, wire/costs.html. First deliverable: one supervised run of the routine with the key present, images and ledger committed, cost shown on the page. Done when the ledger has a dated row per image within the caps and a wire whose edition did not change produced nothing. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Wires about people: the Dinis Cruz Wire, and the rUv Wire with agreement Not built

Size M · first briefed 2026-10-13 · 2026-10-13__the-wires-charter (A wire about a person); card 072

Asked. A wire per person (works, not life; primary first; agreement recorded) at wire/dinis/ and wire/ruv/, under the same contract.

Built. Vaults exist (j008k1ti, u10tbqpc per the card); the Dinis Cruz Wire's first run (v0.12.84) published nothing (fetch approvals, session limit); no wire/dinis/ page. rUv's run blocked pending agreement.

Remaining.

Session brief

Goal: publish the first person wire once its desk has an edition. Read first: card open/072 (progress and blocker), wire/charter.html ('A wire about a person'), admin/build/wire-vault.json and admin/build/wire.py. First deliverable: once the vault holds an edition, admin/build/wire-vault.dinis.json and wire/dinis/ pages generated like wire/owasp/. Done when test_wire.mjs renders wire/dinis/ from a snapshot and the charter's agreement line is shown. Do not create a run for rUv without the recorded agreement. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The AWS Wire's stack derived from the account Not built

Size S · first briefed 2026-10-13 · 2026-10-13__more-than-one-wire (What is not built)

Asked. Derive the AWS stack file from what the reader's account runs, with the declared list as an override.

Built. A seeded stack file in the vault.

Remaining.

Session brief

Goal: a derived stack. Read first: admin/notes/2026-10-13__more-than-one-wire.md, the AWS wire vault's stack file and 'later' note, wire/aws/. First deliverable: the desk brief section describing stack derivation and the override, and the page showing 'derived' vs 'declared'. Done when the page renders both from fixtures. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The wire as a graph: IDs, typed names, spans, claims, stories of stories Not built

Size L · first briefed 2026-10-14 · the-wire-as-a-graph

Asked. Design the wires backwards from the reader: a story page whose names link to long-lived IDs and whose claims are typed with evidence; mint 128-bit story IDs with aliases; merge duplicate names with types; character spans; claims; threads as stories; folders by gravity; run.json per run with cheap extraction and a capable checker.

Built. Nothing (v0.12.46: 'Nothing in the brief is built'); desk brief asks only for optional card.claim.

Remaining.

Needs first. More than one wire

Session brief

Goal: step 1 of the brief, reader first. Read first: admin/content/articles/the-wire-as-a-graph.md (primitives, brief), wire/desk-brief.md, wire/wire.js, one wire snapshot. First deliverable: a story page prototype (wire/story.html?id=) drawn from a fixture with linked names and typed claims, agreed with Dinis before any vault change; then a desk-brief section asking desks for ids.json. Done when the prototype renders the fixture at 390px and 1280px and Dinis signs off the shape. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The accountant runs daily Not built

Size S · first briefed 2026-10-15 · card 071; card 061

Asked. A session of its own each morning adds a row per new run to admin/build/wire-runs.json with runs_ledger.py and releases the costs page.

Built. The accountant (061, v0.12.59) and runs costed (070) by hand releases (v0.12.87, v0.12.103); no scheduled session.

Remaining.

Session brief

Goal: schedule the accountant. Read first: card open/071, admin/build/accountant.py, runs_ledger.py, wire-runs.json, releases v0.12.87 and v0.12.103. First deliverable: a scheduled task prompt that runs runs_ledger.py, rebuilds wire/costs.html and releases; one supervised run. Done when two consecutive days add rows without manual help. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The wire as an inbox: new since last visit, for me / not for me, release notes, decisions Built

Size M · first briefed 2026-10-13 · 2026-10-13__the-wire-as-an-inbox; the-site-is-an-inbox (applied to the wire); cards 023-028

Asked. Read the wire as an inbox: filters, decisions that leave the inbox, what is new, the lens remembered, the vault's release notes, seen stories carried by the vault.

Built. v0.12.6 (023, 024, 025, 027, 028) and v0.12.14 (026); wire/wire.js, assets/vault-pane/wire-state.js; test_wire.mjs.

More than one wire: OWASP, AWS, Portugal (two languages), one contract Built

Size M · first briefed 2026-10-13 · 2026-10-13__more-than-one-wire; sixteen-notes-i-did-not-want-to-lose (Two config files, a new product line); cards 040, 046, 052

Asked. Run more wires from their own vaults under the same code and contract.

Built. wire/owasp/, wire/aws/, wire/portugal/ with admin/build/wire-vault.*.json (v0.12.14, v0.12.32).

The wires' charter, the brief for the desks, verifier, reach, subscribe per wire, the morning run Built

Size M · first briefed 2026-10-13 · 2026-10-13__the-wires-charter; cards 041-045, 047

Asked. Publish a charter and a standing brief for the desks; the verifier's record at the story; who should know; one subscription list per wire; a daily run.

Built. wire/charter.html, wire/desk-brief.md, wire/reach.html, wire/days.html, wire/subscribe.js (v0.12.20); morning run scheduled; unattended runs fixed in v0.12.74 (068-070).

The edition as graphs, an infographic per story with its cost, the first screen Built

Size L · first briefed 2026-10-13 · 2026-10-13__five-wires-five-pages; cards 053, 054, 056, 062

Asked. Provenance strip, week by beat, threads, entities; infographics per story and edition with cost made by the newsroom; a first screen for a first-time visitor.

Built. wire/graphs.js (v0.12.42), admin/build/infographics.py, wire/infographics/ledger.json, wire/costs.html (v0.12.59), first screen (v0.12.70); test_graphs.mjs.

Agents and authors

The five readers as desk roles, the round trip, image prompts Not built

Size L · first briefed 2026-10-10 · one-article-five-readers (What comes next)

Asked. Librarian, Cartographer, Explainer and Storyteller join the Historian as desk roles with write policies so every new article gets its views; apply the Cartographer's feedback; run image prompts for one deck.

Built. The views exist for 5 articles only (articles/views/); newsroom/roles/ has contributor, designer, developer, editor, historian, journalist.

Remaining.

Needs first. A shared vocabulary of concepts across the article graphs (the site altitude)

Session brief

Goal: views for every new article. Read first: sgit.ai one-article-five-readers.md, the Article Views vault (demos/vaults/article-views/), newsroom/roles/historian.md, articles/views/. First deliverable: newsroom/roles/librarian.md and explainer.md with policies, and a release step that requires an Explainer two-minute view for each new article with script checks (anchors verbatim, word limits). Done when a new article without a view fails the validator and one with a view renders under 'Read it another way'. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The agents write too: a page per agent, lessons, debriefs, a conductor Partly built

Size L · first briefed 2026-10-14 · the-agents-write-too; scrolled-is-not-read (The agents' own section); card 075

Asked. A conductor session that keeps the site; a page for every agent; an agents index; debriefs per run; lessons one per file loaded at session start; agent-authored articles with author/author_url; a schedule.

Built. 'Written by the agents' section agents/index.html from admin/content/agents.json via admin/build/agents.py (card 075, v0.12.85); agent pages about/newsroom-ux.html and about/newsroom-vault.html; author fields used by agent articles; front page 'From the agents' block. newsroom.writer registered as an agent with its own page in v0.12.109.

Remaining.

Session brief

Goal: lessons and the missing agent pages. Read first: admin/content/articles/the-agents-write-too.md (Lessons and debriefs, The brief), admin/content/agents.json, admin/build/agents.py, wire/desk-brief.md and the articles README wording rules. First deliverable: admin/content/lessons/NNN-slug.md (evidence, status, superseded_by) seeded with the article's five, built to lessons.json and lessons.md, and about/newsroom-writer.html generated for the writer. Done when the build fails on a lesson without evidence, agents/index.html links every agent in agents.json to a page, and CLAUDE-style session instructions point at lessons.md. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Who is speaking: a mark on every byline, the voice in the data, a line on agent emails Partly built

Size M · first briefed 2026-10-18 · who-is-speaking

Asked. Make it clear on every piece who is speaking: Dinis alone, Dinis through an agent, or an agent in its own voice; name people instead of 'the owner'.

Built. Byline marks by CSS in assets/themes/themes.css (agent mark and 'agent' pill on agent bylines, 'with the newsroom's agents' on Dinis's), the README's 'Who is speaking' section and rule 9, 'the owner' replaced in the agents' articles and notes; all in v0.12.109.

Remaining. A voice field in each article's front matter (dinis, dinis-with-agents, agent) read by the byline, lists, cards and search; the agent pages' structured data typed as software, not a Person (a template change on sgit.ai); a line on every agent-drafted email saying it was drafted by an agent and sent by Dinis.

Session brief

Read who-is-speaking.md, the README's 'Who is speaking' section and the byline CSS at the end of assets/themes/themes.css. First deliverable: a 'voice' front-matter field on every article in admin/content/articles (default dinis-with-agents; agent for author newsroom.*), carried into articles/find.json by admin/build/find.py, and the byline marks driven by it instead of by the link. Then show the voice on cards and search results. Done when a test asserts each article's byline mark matches its voice field and an article with voice: dinis shows no 'with' label.

Payments

Price one question (402) and sign one claim with an expiry Not built

Size M · first briefed 2026-10-11 · the-agent-is-the-reader (What comes next 3, 4)

Asked. Put a graph answer behind a 402 at a fraction of a cent and count agents that pay; re-check ten claims, sign them with the publisher's key and an expiry, and publish the signatures.

Built. Nothing; the site has no server and no publisher signing key.

Remaining.

Session brief

Goal: the signed claims half, which needs no server. Read first: sgit.ai the-agent-is-the-reader.md ('Signed claims, with an expiry date'), rfc-0001 on sgit.ai, articles/graphs/ (anchors). First deliverable: a publisher key pair (private half outside the repo), claims/<id>.json with the sentence, anchor, source hash, dates and signature, and a verify page in the browser. Done when the verify page validates all ten and rejects an edited one. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Prices fair by country, visible use of money, chosen levels Not built

Size M · first briefed 2026-10-14 · paying-after-the-value (Fair, visible, chosen; The experiment)

Asked. Prices that follow local purchasing power, a visible statement of what the money pays for, and paid levels (verified facts, follow-ups, checked briefings); the five hypotheses reviewed on 6 December 2026.

Built. The meter's single price table (sg-meter-config prices) and the £5 top-up.

Remaining.

Session brief

Goal: price by country as a meter rule. Read first: admin/content/articles/paying-after-the-value.md, the meter config in any page, assets/components/sg-meter/v1/v1.5/v1.5.0/, meter/security.html. First deliverable: a config table of multipliers by region applied from navigator.language/Intl, shown to the reader with an override. Done when test_meter.mjs with locale pt-PT charges the configured fraction and the account page says why. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Personal editions of the book, assembled by an agent, paid as read Not built

Size M · first briefed 2026-10-18 · a-book-for-one-reader; 2026-10-18__a-website-to-finish-the-book

Asked. An agent assembles an edition of the book for one person from the book's graph and a private brief (their role, altitude, examples, later language and culture), delivered as a PDF or in the browser and not published; pay as you read, starting with five pounds of credit; kept locally with the reader's vault as an option.

Built. The reading meter (pay after you read, five pounds of credit, balance can go negative) and the reader's vault exist on the newsroom. The book's graph does not exist yet.

Remaining.

Needs first. gen-z-developers.sgit.ai

Session brief

Read the article a-book-for-one-reader and the website brief. Wait for the book's graph. First deliverable: a brief schema (role, altitude, interests, language) and an assembler that, from the graph and a brief, outputs an ordered chapter list with altitude per chapter as JSON. Done when two different briefs give two different, sensible editions of v1.

Pay to keep your persona: a persona that follows you to every device and your agent Partly built

Size M · first briefed 2026-10-10 · pay-to-keep-your-persona

Asked. Readers pay to keep their persona in an encrypted vault that follows them across devices and to their agent; hypotheses H6/H7 to test.

Built. Personas travel in the reader vault's device files (sync.js extract) during the beta, gated only by an early-access key; nothing is sold; no agent access to a persona.

Remaining.

Needs first. The reader's own encrypted vault, the same newsroom on every device, A pack for the reader's agent, onboarding packs, changes.json and an agent's door

Session brief

Goal: make persona sync the thing a reader buys. Read first: sgit.ai pay-to-keep-your-persona.md, going-live-with-the-reading-meter.md (hypotheses), account/top-up.html, assets/vault-pane/vault-pane.js (access key). First deliverable: an owner-approved offer page and a Stripe payment link that issues an early-access key (manual fulfilment first), recorded in the account; plus 'share this persona with your agent' as a read-only export. Done when Dinis approves the wording and a test purchase in Stripe test mode leads to a working key. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The publishing method

The homepage is a vault: daily editions as signed commits, variants and stats Not built

Size L · first briefed 2026-10-14 · the-homepage-is-a-vault

Asked. /front/ built from a homepage vault: a morning edition job committing and tagging each edition with screenshot and note; editions exported as static files behind a CDN; a shell with a snapshot; every edition reachable; two variants and a stats lane; daily synthetic users; timing against the homepage for two weeks; the same export for the wire.

Built. Nothing of the vault design (no /front/ page). The front page is built from repo data by admin/build/front.py with three views selectable by ?view= (v0.12.60).

Remaining.

Needs first. An experiment per feature

Session brief

Goal: /front/ from a vault, beside the current homepage. Read first: admin/content/articles/the-homepage-is-a-vault.md (The demo, A brief for the agent), admin/build/front.py (current data), admin/build/wire_* readers and wire/vault-reader.js. First deliverable: an edition writer that renders today's front data into an edition JSON committed to a homepage vault with a tag, and /front/index.html that reads the latest edition with a published read key and a static snapshot fallback. Done when /front/ renders the same lead as index.html, a past tag opens by commit id, and load time is measured cold and warm in a script. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

The back-catalogue worker: Dinis's past work brought back as linkable articles Not built

Size M · first briefed 2026-10-18 · bringing-my-past-work-back; 2026-10-18__bringing-my-past-work-back

Asked. A worker that runs every day, takes the next item from Dinis's back catalogue (essays, NotebookLM material, talks and books, tools, the blog, videos, later LinkedIn and Twitter exports) and writes two or three articles a day: what it was, what it said, then and now, and how it connects to the newsroom today.

Built. The inventory, taken 18 October 2026: 103 essays (27 cited), 2,038 NotebookLM files, 65 decks, 10 books, 29 tools in production, 1,289 blog posts, 221 videos. Nothing else.

Remaining.

Session brief

Read admin/notes/2026-10-18__bringing-my-past-work-back.md and the article. First deliverable: admin/build/back_catalogue.py that builds admin/content/back-catalogue.json from diniscruz.ai's llms.txt and the NotebookLM repository's markdown and link files (source, id, URL, date, status, article), marks the 27 essays already cited, applies the exclusions in the note, and prints the next three queued items. Done when the register lists every essay with a status and a second run changes nothing.

Generation Z Developers (AI edition), from the newsroom's articles Not built

Size M · first briefed 2026-10-18 · generation-z-developers-again; 2026-10-18__generation-z-developers-second-edition; books-from-articles

Asked. An AI edition of Dinis's 2018 book, done first before the other books: keep the title, dated October 2026; frame it with explorers, villagers and town planners and explain Wardley maps; a thorough review, then an editor agent that interviews Dinis; fill the 90 outlines from newsroom articles; then-and-now; a part on working with agents and on how the book was made; figures; his handwritten notes; Leanpub and LinkedIn iterations, then Amazon KDP, possibly launched in Portugal at Web Summit.

Built. The 2018 book exists on Leanpub (60%) and Amazon; its source is in DinisCruz/Book_Generation_Z_Developer (138 files, 90 outlines). Many outlines have matching articles on this site.

Remaining.

Session brief

Read admin/notes/2026-10-18__generation-z-developers-second-edition.md and the article, then the book's repository (content/) and books-from-articles. First deliverable: admin/content/books/generation-z-2e/map.json with one row per chapter and outline (2018 file, status written or outline, the newsroom articles that answer it, the gap). Done when every one of the 138 files has a row and the gaps are listed for Dinis.

The move to newsroom.sgit.ai: port the generator, cut every dependency but the vaults Partly built

Size L · first briefed 2026-10-10 · 2026-10-10__newsroom-move-and-content-audit; sgit-ai-dependencies; card 067

Asked. Move the newsroom from sgit.ai: articles, newsroom pages, reader account, feeds; then cut over so the site is self-contained, keeping only links to vaults.

Built. Import by sync_newsroom.py (v0.6.0+); articles written and published here by admin/build/publish.py borrowing sgit.ai's generator (v0.12.10); own front page (v0.12.60); footer dependency removed and admin/build/deps.py report (card 067).

Remaining.

Session brief

Goal: port the article generator so publish.py no longer clones sgit.ai. Read first: admin/notes/2026-10-10__newsroom-move-and-content-audit.md, admin/notes/sgit-ai-dependencies.md, admin/build/publish.py, admin/build/sync_newsroom.py, admin/build/validate.js. First deliverable: the generator for one article page type running here, producing byte-identical output (chrome and version stamps normalised) for three existing articles. Done when the hash comparison passes for every article and deps.py's 'generator' count drops to zero for articles. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Go slow to go fast: the reader code to its own repository, tests, review, refactor Partly built

Size L · first briefed 2026-10-11 · explorer-to-villager-newsroom; 2026-10-11__newsroom-api-map-and-review

Asked. Six phases: map, move the reader code to SGit-AI__Newsroom__API released as pinned versioned files, tests (Node + Chromium/WebKit/Firefox, pre-production, synthetic run), review (findings as issues), refactor, then fixes and features; a pipeline under two minutes; a person and an agent reviewer per PR; CSP.

Built. Phase 0: /newsroom-api/ map and 18 findings pinned by test_review.mjs (v0.8.2); CI runs the browser tests before a tag (Chromium only); the reader API is published at api.newsroom.sgit.ai (v0.2.5 referenced in pages). This site still loads its own copy of sg-meter (assets/components/sg-meter/v1/v1.5/v1.5.0/) rather than a pinned API release.

Remaining.

Session brief

Goal: make this site a consumer of api.newsroom.sgit.ai. Read first: sgit.ai explorer-to-villager-newsroom.md (Rules, Acceptance), admin/notes/2026-10-11__newsroom-api-map-and-review.md, newsroom-api/map.json, .github/workflows/deploy-pages.yml, the API repository's release layout. First deliverable: load the meter from a pinned API release path (or a vendored copy at that version with a hash check) and prove every reader file hashes the same before and after. Done when the hash table matches, test_meter.mjs passes, and CI adds WebKit and Firefox for test_meter.mjs and test_lists.mjs. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Your own newsroom: the recipe, with the writing pipeline as a package Partly built

Size M · first briefed 2026-10-15 · your-own-newsroom

Asked. A founder's recipe: public repo, Pages, Claude cloud sessions, house rules, the reader meter from api.newsroom.sgit.ai pinned with their own Stripe link, a behaviour policy, optionally a private vault beside the site.

Built. The recipe and house rules are in the article; the meter is packaged at api.newsroom.sgit.ai; /replicate/ exists. The article itself says the writing pipeline as one package is not ready.

Remaining.

Session brief

Goal: a template a founder can fork. Read first: admin/content/articles/your-own-newsroom.md (Step by step, The house rules, A behaviour policy), replicate/index.html, admin/build/validate.js, .github/workflows/deploy-pages.yml. First deliverable: a minimal template (files listed in the article) with a validator and a Pages workflow, plus a page on this site that links it. Done when a fresh fork publishes a first article to Pages with the meter loaded from a pinned API release. Open a card in admin/engineering/issues/open/ first, ship as a patch release with a file in admin/engineering/releases/ naming the card, and add any new test to the loop in .github/workflows/deploy-pages.yml.

Versions of versions: the publishers' section with its own version line, recorded by each site release Partly built

Size M · first briefed 2026-10-18 · versions-of-versions; a-section-for-publishers

Asked. Give large parts of the site their own version line, starting with the publishers' section; each newsroom release records which version of each part it carries, and which api.newsroom.sgit.ai release it pins once the site is built on the API; a page showing the tree; later the home page and the article pipeline as areas with their own releases and checks.

Built. v0.12.113: page_versions.py gives the page for publishers frozen versions (v1.0.0, v2.0.0), block and word diffs, and a ledger of changes per release. Articles already have their own versions.

Remaining.

Session brief

Read the article versions-of-versions, admin/build/page_versions.py and admin/content/publishers/versions.json. First deliverable: admin/content/parts.json listing the parts with their own version line (publishers first) and a release step that writes, per release, the version of each part into the release note and engineering/releases/<v>.parts.json. Done when a release that changes only the publishers' section bumps that section's version and the site's, and the parts file shows both.

gen-z-developers.sgit.ai: the book's website, repository for official versions, vault for working ones Partly built

Size L · first briefed 2026-10-18 · a-website-to-finish-the-book; 2026-10-18__a-website-to-finish-the-book; generation-z-developers-again

Asked. A website for reviewing and finishing the AI edition: v1 (2018) in the repository, working versions in a public vault, deltas between versions, the book as a graph at every altitude with infographics, voice comments, a board and issues, editor/copywriter/publisher agents who challenge and interview Dinis, sign-off, research and evidence; the OpenRouter key in a separate private vault.

Built. Built in one evening (18 to 19 October 2026), site v0.2.33 at gen-z-developers.sgit.ai, repository SGit-AI/SGit-AI__Website__Gen-Z-Developers: v1.0.0 rebuilt with its print PDF matched; release candidates 1 and 2 of Generation ZX Developers (GenAI Startup Edition); the ideas register and graph; the reader with the meter; roles and a review board; decisions; synthetic readers; storyboards, infographics and covers. See discovering-the-book.

Remaining.

Needs first. Generation Z Developers (AI edition), from the newsroom's articles

Session brief

Read admin/notes/2026-10-18__a-website-to-finish-the-book.md, then graphs.sgit.ai's books, roles and altitude ladder, and the book's repository. First deliverable: the new repository (SGit-AI/SGit-AI__Website__Gen-Z-Developers) with v1 imported as released and a static site showing it at gen-z-developers.sgit.ai (or the agreed address), plus a versions page reusing page_versions.py. Done when v1 is browsable chapter by chapter and its version page exists.

For an agent

The map of every brief newsroom.sgit.ai has published about itself: 73 entries, 38 not built and 23 partly built, each with a session brief to start from. Machine-readable: https://newsroom.sgit.ai/briefs/briefs.json.