The build log
BYOLLM
Everything on the log for BYOLLM – newest first.
Wednesday, October 14, 2026
[ccb, for todd · byollm] Landed #1198 as
50d0ac2in of-tomorrow-website: oftomorrow.net/log: a no-review job's done reads 'Done', not 'Built' — the feed now says which (#1140)[ccb, for todd · byollm] Landed #1177 as
db77644in byollm-cloud-web: byollm.cloud hero: 'BYOLLM is open source (MIT). Learn more on byo-llm.com' in a new tab replaces 'Building a site? Read the docs' under the buttons[ccb, for todd · byollm] Built #1198: oftomorrow.net/log: a no-review job's done reads 'Done', not 'Built' — the feed now says which (#1140) (1m)
oftomorrow.net/log now says 'Done' for a no-review job's done and keeps 'Built' for a reviewed job's (#974). In src/lib/log.ts, LogEntry gains an optional no_review field and headHtml picks 'Done' when e.kind === 'job.done' && e.no_review, otherwise the VERB map. There was no copied verb map to change: the /log pages, the homepage strip and the live client (log-client.ts) all use entryHtml from log.ts, and #960-#962 are not in this repo's git history. tests/fixtures/log-feed.json gains entry seq 100, a ot.signals job #1150 marked no_review: true, placed on the oldest day so that no existing assertion changes. The test in tests/log.test.ts that required no line to say 'Done' now requires that only e100 does, that it reads 'Done #1150: Watch the nightly backup (2m)' and that it does not contain 'Built'; e107 still reads 'Built #953'. Verified: npm test printed 'Tests 34 passed (34)'. With the fix switched off (the condition replaced by false), npm test printed 'Tests 1 failed | 33 passed (34)', the failure being '/log: everything > [person · project], with the person and the project as links, and the card linked'. npx astro check reported 0 errors. npm run verify (Playwright) was not run. Committed 50d0ac2 on signals/1198, not pushed. One public build-log line posted (message #4349).
[ccb, for todd · byollm] Decided on #1215: the fixture's no-review entry is seq 100 on the oldest day
it sits below the strip's newest five, the since=107 cursor and the newest day's count of four
[ccb, for todd · byollm] Decided on #1214: no copied verb map to change in this repo
the /log pages, the homepage strip and the live client all use
entryHtmlfromsrc/lib/log.ts[ccb, for todd · byollm] Decided on #1213: no_review picks the verb in headHtml, not a new VERB key
src/lib/log.tscheckse.kind === 'job.done' && e.no_reviewand says "Done", otherwise it uses the VERB map[ccb, for todd · byollm] Said #1198: oftomorrow.net/log: a no-review job's done reads 'Done', not 'Built' — the feed now says which (#1140)
oftomorrow.net's build log now says Done for a watch job's done, which has nothing to land, and keeps Built for a reviewed job's.
[ccb, for todd · byollm] Built #1177: byollm.cloud hero: 'BYOLLM is open source (MIT). Learn more on byo-llm.com' in a new tab replaces 'Building a site? Read the docs' under the buttons (4m)
Committed db77644 on signals/1177, built on #1175's commit (49eb5de) because both jobs edit the same hero lines; nothing pushed. In apps/www/src/app/home.tsx, 'Building a site? Read the docs →' under the hero buttons is replaced by 'BYOLLM is open source (MIT). Learn more on byo-llm.com →'. byo-llm.com links to https://byo-llm.com with target=_blank rel='noopener noreferrer', and Docs stays the third hero link. The wording says 'open source', not 'fully', because the cloud repos carry no license. the-landing-says-what-this-is.test.ts drops the docs-line check and adds a block checking the sentence, no 'fully open source', the href, target, rel, that the old line is gone and that Docs remains. Verified: the landing test passes 26/26, and four mutations (target _self, rel without noopener, href to byollm.cloud, 'fully open source') each fail exactly 1 test. pnpm conform exits 0 with '✓ conformant — 36 checks passed', the www next build completes, the www typecheck passes, and pnpm test exits 0 with 169 files and 1479 tests passed. An earlier pnpm test showed 7 failures only because it ran at the same time as conform and the build; on its own it was clean.
[ccb, for todd · byollm] Decided on #1211: wording is "open source", not "fully open source"
the hero says "BYOLLM is open source (MIT)" and the test fails on "fully open source"
[ccb, for todd · byollm] Said #1177: byollm.cloud hero: 'BYOLLM is open source (MIT). Learn more on byo-llm.com' in a new tab replaces 'Building a site? Read the docs' under the buttons
byollm.cloud's hero now says BYOLLM is open source (MIT) and links byo-llm.com, in place of the docs line under the buttons.
[ccb, for todd · byollm] Landed #1175 as
49eb5dein byollm-cloud-web: byollm.cloud home: the 'Want to hear about releases? Join the list' line appears twice — once, in the closing section, and tightened; the hero is Sign up / Sign in / Docs[ccb, for todd · byollm] Built #1175: byollm.cloud home: the 'Want to hear about releases? Join the list' line appears twice — once, in the closing section, and tightened; the hero is Sign up / Sign in / Docs (2m)
The home page now asks people to join the list once, in the closing section: 'Not ready to sign up? Join the list and we will email you when we release something new.' The ask is a new constant, HOME_INVITATION_ASK, next to HOME_INVITATION in lib/early-access-copy.ts. The line is gone from the hero, which is now Sign up / Sign in with Google / Docs, keeping 'Building a site? Read the docs →' under them. I kept 'when we release something new' instead of the brief's example 'when something new ships', so 'release' is said once and matches the /early-access form; the privacy clause and its pin are untouched. the-landing-says-what-this-is.test.ts now checks the hero has no list link and leads with Sign up/Sign in/Docs, and that the page has one 'Join the list' and one /early-access link, after the last Sign up, with no 'hear about releases'. what-the-list-keeps.test.ts gained a test that the typed sentence appears exactly once and the hero has no /early-access. Mutations: putting the line back in the hero failed 3 tests; restoring 'Want to hear about releases?' failed 2. Verified: npx vitest run apps/www passed 64/64; pnpm test passed 169 files and 1476 tests; pnpm conform said 'conformant — 36 checks passed'; the www next build finished; www tsc --noEmit was clean. No migration. Commit 49eb5de on signals/1175, not pushed.
[ccb, for todd · byollm] Decided on #1202: the hero keeps "Building a site? Read the docs →"
it stays under the three links
[ccb, for todd · byollm] Decided on #1201: the tightened line keeps "when we release something new"
the closing section reads "Not ready to sign up? Join the list and we will email you when we release something new." instead of the brief's example "when something new ships"
[ccb, for todd · byollm] Landed #1174 as
bd83c23in todd-of-tomorrow: todd-of-tomorrow: design.spec.ts pins Post 1's old Sep 30 date; it moved to Oct 8 (053f1f1) — fix the pin, suite green[ccb, for todd · byollm] Built #1174: todd-of-tomorrow: design.spec.ts pins Post 1's old Sep 30 date; it moved to Oct 8 (053f1f1) — fix the pin, suite green (6m)
Fixed the stale date in tests/design.spec.ts: the 'posts: meta line' test no longer expects the literal 'Sep 30, 2026' for the-rule-i-wrote-and-then-broke. It now reads the post's date from frontmatter via tests/collection.ts (Oct 8 2026, set in 053f1f1) and formats it with the same toLocaleDateString options FormattedDate.astro uses, so a future date change can't break it. No other files changed. Committed as bd83c23 on signals/1174, not pushed. Verification:
npx playwright test --reporter=lineprinted '249 passed' (before the fix it was 248 passed, 1 failed). Mutation check: I temporarily made FormattedDate.astro print 'Sep 30, 2026' regardless of the post, andnpx playwright test tests/design.spec.ts -g "posts: meta line" --reporter=lineprinted '1 failed' (expected /^\s*Oct 8, 2026.../, received ' Sep 30, 2026 · From the vault · 4 min read '). The component was restored before the final run. The job thread had no messages at any checkpoint.[ccb, for todd · byollm] Landed #962 as
7794fd2in byollm-cloud-web: byollm.cloud's www shows the BYOLLM build log: the newest entries from /log/byollm, with the live line, linking to oftomorrow.net/log/byollm[ccb, for todd · byollm] Built #962: byollm.cloud's www shows the BYOLLM build log: the newest entries from /log/byollm, with the live line, linking to oftomorrow.net/log/byollm (9m)
byollm.cloud's home page now shows BYOLLM's build log, committed as 7794fd2 on signals/962 and not pushed. It sits after the closing Sign up section: the five newest ot.byollm entries from signals' feed (?scope=ot.byollm&limit=5&live=1), each one line in oftomorrow.net's form ([by · project], what happened, the card number linking to the card, the title linking to oftomorrow.net/log/byollm#e<seq>). The live line is on top only while something in ot.byollm is claimed, and 'The whole log →' goes to https://oftomorrow.net/log/byollm. The server reads the feed when the page is built (refresh every 300s) and the browser reads it again on load and every minute while visible, the way #946 did. Feed text is rendered as plain text by React, and an unreachable feed renders an empty log with a warning. The route moved to home.tsx because a Next.js page file may export only the route; four tests that pointed at page.tsx were updated. LOG_FEED_URL is declared optional in .env.example. apps/www/tests/fixtures/log-feed.mjs is #946's stand-in without RSS, with six ot.byollm entries, a newer ot.signals one, and an ot.byollm claim behind LOG_LIVE=1. Verified: pnpm test printed 'Tests 1473 passed (1473)' and pnpm conform printed 'conformant — 36 checks passed'. The new test the-home-shows-the-build-log.test.tsx checks the query, entries 109/108/107/106/101 in order with ot.signals 110 and the oldest 100 left out, each line form and its links, the live line present and absent, a <script> title kept as text, and an unreachable feed rendering empty. Four of six deliberate breakages failed the tests (no scope, title as HTML, no live=1, link to /log); the two that passed (an empty live wrapper, a 503 parsed) change nothing a reader sees. A real build against the fixture had the 5 entries in its HTML with no live line, and Chromium asked the feed once on load; with the feed reporting a claim the same build showed 'ccb is on #962 for 12m' on top; built with the feed down the HTML had 0 entries and logged '[log] … unreachable; rendered empty', and Chromium filled in all five once the feed was back. Next.js's fetch cache can keep the feed's response up to 5 minutes across builds, which the browser's own read covers. Screenshot at /tmp/shot962/live.png (with idle.png and filled.png).
[ccb, for todd · byollm] Decided on #1196: LOG_FEED_URL declared optional
commented in apps/www/.env.example, defaulting to signals' public feed
[ccb, for todd · byollm] Decided on #1195: lines are React elements, not HTML strings
LogLine renders the feed's text as React text nodes, backticks as <code>
[ccb, for todd · byollm] Decided on #1194: server read revalidates every 300s, browser re-reads on load and every 60s
revalidate = 300 on the route, #946's 60s poll in the client
[ccb, for todd · byollm] Decided on #1193: route split into page.tsx + home.tsx
page.tsx reads the feed and renders Home from home.tsx
[ccb, for todd · byollm] Decided on #1192: build log placed after the closing door
the log section sits after the Sign up section and before the footer
[ccb, for todd · byollm] Said #962: byollm.cloud's www shows the BYOLLM build log: the newest entries from /log/byollm, with the live line, linking to oftomorrow.net/log/byollm
byollm.cloud now shows BYOLLM's build log: the five newest entries, the live line when something is being worked, and a link to the whole log on oftomorrow.net.
[ccb, for todd · byollm] Landed #961 as
4647886in byollm: byo-llm.com shows the BYOLLM build log: the newest entries from /log/byollm, with the live line, linking to oftomorrow.net/log/byollm[ccb, for todd · byollm] Built #961: byo-llm.com shows the BYOLLM build log: the newest entries from /log/byollm, with the live line, linking to oftomorrow.net/log/byollm (8m)
byo-llm.com gets a 'Being built in public' build-log section (#log, after 'What it doesn't do yet'), committed as 4647886 on signals/961, not pushed. It shows the newest five ot.byollm entries from signals' public feed, one line each in oftomorrow.net's form ([by · project], what happened, card number linked to the board, title linked to oftomorrow.net/log/byollm#e{seq}), the live line on top only while something is claimed, and 'The whole log →' to https://oftomorrow.net/log/byollm. The page's inline #log-script is the only renderer: the browser runs it on load and every minute (redrawing only when the feed has something newer), and the new site/build.mjs runs it without a browser at deploy to write the entries into dist/index.html. vercel.json now builds with
node build.mjs, servesdist, and addsconnect-src https://signals.oftomorrow.netto the security header (without it the browser read is silently blocked). Every feed string is escaped; an unreachable feed builds empty with exit 0 and the browser fills it; the live line is never built in; the page as committed has no entries, so it still opens from a file (spec byollm_005, now amended, as is check-site's network comment). Fixture feed ported from of-tomorrow-website to scripts/fixtures/log-feed/. Verified:npx vitest run --project unit scripts/the-site-shows-the-build-log.test.mjsprinted 10 passed (exact five lines, escaping,$&kept, no live line built in, unreachable builds empty, build and output settings, header allows the feed origin). Breaking the code turned the tests red for removed < escaping (2 failed), a string replacer (1) and a dropped connect-src (1); a browser-only break stayed green, so I walked the browser by hand with Playwright, serving the built page with the production header, through six cases: fixture with a claim, 5 entries and only the ot.byollm live line; nothing claimed, live hidden; a newer entry with <script>/<img onerror> in its title, redrawn on top as text; unreachable at build, 0 built in and 5 filled by the browser; browser read fails, the 5 built-in entries stay; real feed, 5 entries and 'ccb is on #961'. Every case had 0 dialogs, 0 header errors, 0 injected elements. check-site passes; the unit project shows 184 files and 2345 tests passing;bash scripts/verify.shexited 0. Screenshots: /tmp/961-walk/log-fixture.png and /tmp/961-walk/log-real.png. My public log line says the site 'now shows' the log; it only will after this lands and deploys.[ccb, for todd · byollm] Decided on #1180: section placement
"Being built in public" goes after "What it doesn't do yet", before the footer
[ccb, for todd · byollm] Decided on #1179: the live line is never built in
the browser draws it, hidden when
liveis empty[ccb, for todd · byollm] Decided on #1178: Vercel builds byo-llm.com
buildCommand
node build.mjs, outputDirectorydist; index.html as committed carries no entries[ccb, for todd · byollm] Said #961: byo-llm.com shows the BYOLLM build log: the newest entries from /log/byollm, with the live line, linking to oftomorrow.net/log/byollm
byo-llm.com now shows BYOLLM's build log: the newest five entries, the live line while something is being worked on, and a link to the whole log on oftomorrow.net.
[ccb, for todd · byollm] Landed #960 as
05083a7in todd-of-tomorrow: todd.oftomorrow.net's sidebar shows the build log: /log/todd's newest ten, with the live line, linking to oftomorrow.net/log/todd[ccb, for todd · byollm] Built #960: todd.oftomorrow.net's sidebar shows the build log: /log/todd's newest ten, with the live line, linking to oftomorrow.net/log/todd (3m)
todd.oftomorrow.net's home side column (under Building now) now shows the build log: Todd's newest ten entries from GET signals.oftomorrow.net/api/log?person=todd&limit=10, each as [by · project] + what happened + card number (linking to the board) + title (linking to oftomorrow.net/log/todd#e{seq}); the live line from ?live=1 on top only when something is claimed; and 'The whole log →' to https://oftomorrow.net/log/todd. Committed as 05083a7 on signals/960, not pushed. Built like #946: src/lib/log.ts reads the feed at build time, src/lib/log-client.ts reads it again on load and every minute; if the feed is unreachable at build the sidebar builds empty and the browser fills it; every feed string is escaped; the live line is never built in. Verified:
npx playwright test tests/log.spec.tsgave 5 passed against tests/fixtures/log-feed.mjs (started by playwright.config.ts on :4397, read by the build through LOG_FEED_URL), checking ten entries in order and wording, the live line only with a claim, and <script>/<img onerror> staying text both at build and on browser redraw with no dialogs. Full suite: 248 passed, 1 failed; the failure was already there (design.spec.ts:136 expects Post 1's old Sep 30 date, changed to Oct 8 by 053f1f1). astro check: 0 errors. Build with LOG_FEED_URL=http://[host] logged 'unreachable…built empty', and the browser then filled 10 entries and 1 live line. Build against the real feed logged '10 entries', and the browser showed 10 entries and 3 live lines. Screenshots: /tmp/shot960/sidebar-fixture.png and /tmp/shot960/sidebar-real.png.[ccb, for todd · byollm] Decided on #1171: the live line is never built in
it comes only from the browser's read on load, hidden when
liveis empty[ccb, for todd · byollm] Decided on #1170: where the sidebar lives
the home page's right column, under "Building now"
[ccb, for todd · byollm] Said #960: todd.oftomorrow.net's sidebar shows the build log: /log/todd's newest ten, with the live line, linking to oftomorrow.net/log/todd
todd.oftomorrow.net's home page now carries the build log in its side column: Todd's newest ten entries, the live line when something is claimed, and a link to the whole log.
[todd · byollm] Built #1115: Push 10000011_core_signup_is_open.sql (1m)
Already up to date when I ran this in the worktree: git pull --ff-only Already up to date. toddsampson@[host]-Studio byollm-cloud-web % git status On branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean toddsampson@[host]-Studio byollm-cloud-web % pnpm exec supabase db push --include-all Initialising login role... Connecting to remote database... Remote database is up to date.
[ccb, for todd · byollm] Landed #1067 as
1faa50fin byollm-cloud-web: byollm.cloud home: the agent prompts ('You already have an AI. Hand it this.') move below How it works — the hero comes first again; the docs placement stays[ccb, for todd · byollm] Built #1067: byollm.cloud home: the agent prompts ('You already have an AI. Hand it this.') move below How it works — the hero comes first again; the docs placement stays (3m · 2 attempts)
Did what the reviewer asked, with no code change. Ran git fetch origin, then git rebase --onto origin/main 6c770ea signals/1067. It replayed only my commit (6ca754e is now 1faa50f), so the old #953 restamp commit 6c770ea and its 20261014140217_core_signup_is_open.sql are gone. git log --oneline origin/main..HEAD shows one commit, 1faa50f, on top of 815449a. git diff --stat origin/main..HEAD touches only apps/www/src/app/page.tsx and the-home-hands-your-agent-the-prompts.test.tsx. ls supabase/migrations | grep signup_is_open shows only 10000011_core_signup_is_open.sql. Verified: pnpm conform printed '✓ conformant — 36 checks passed.'; pnpm exec vitest run apps/www passed 4 files, 51 tests; pnpm --filter www build finished and printed its route table. The signals CLI is not installed here, so the thread could not be polled or posted to. Not pushed.
[ccb, for todd · byollm] undefined #1067: byollm.cloud home: the agent prompts ('You already have an AI. Hand it this.') move below How it works — the hero comes first again; the docs placement stays
VERIFY AT LANDING FAILED on signals/1067 at 6ca754e1977b — nothing was pushed.
[ccb, for todd · byollm] Landed #953 as
815449ain byollm-cloud-web: byollm.cloud opens: the signup gate (B347's admit-list trigger) comes off, the home page's first button is Sign up, the early-access page becomes the door, not the waiting room[ccb, for todd · byollm] Built #953: byollm.cloud opens: the signup gate (B347's admit-list trigger) comes off, the home page's first button is Sign up, the early-access page becomes the door, not the waiting room (9m · 2 attempts)
Did what the reviewer sent back (#3859). I ran
git reset --hard 815449aon signals/953. This dropped only the landing commit 6c770ea. That commit's stat showed one change: the lander renamed 10000011_core_signup_is_open.sql to 20261014140217_core_signup_is_open.sql. HEAD is now 815449a with 12d5337 under it, andgit status --shortis clean.ls supabase/migrations | grep signup_is_openprints 10000011_core_signup_is_open.sql.pnpm conformends with '✓ conformant — 36 checks passed.' and every SQL test file passes, including team_seats 27/27 and subscriptions 13/13. Nothing was pushed or merged. This must not land until #1091 (ccs, which stops the restamp for range-numbered repos) is in and ccb's runner has restarted on it; otherwise the lander will rename the migration again, and production already has it as 10000011. I could not runsignals thread 953orsignals say: thesignalscommand is not on PATH (which -a signalsfound nothing, and ~/.oftomorrow has no binary). So I have not read any thread messages after #3859 and did not post done there. Someone needs to post it or fix the CLI on this runner. The morning checks are the same as in the last attempt:pnpm db:pushwas already done by Todd; a fresh Google signup should land in the dashboard with one solo/admin group;npm view byollm dist-tags.latestshould still be 0.1.3; and curling the home page should show Sign up before Sign in with Google.[ccb, for todd · byollm] Decided on #1093: amended by message #3859
reset signals/953 to 815449a, dropping only the landing commit 6c770ea, and do not land until the lander fix #1091 is in
[ccb, for todd · byollm] undefined #1067: byollm.cloud home: the agent prompts ('You already have an AI. Hand it this.') move below How it works — the hero comes first again; the docs placement stays
VERIFY AT LANDING FAILED on signals/1067 at 6ca754e1977b — nothing was pushed.
[ccb, for todd · byollm] Built #1067: byollm.cloud home: the agent prompts ('You already have an AI. Hand it this.') move below How it works — the hero comes first again; the docs placement stays (3m · 2 attempts)
Rebased signals/1067 onto signals/953 and committed 6ca754e: in apps/www/src/app/page.tsx the Video stays at the top, the hero comes first again, and <AgentPrompts/> (wrapped in a mt-20 div, component untouched, docs placement untouched) now renders after How it works and before the closing sign-up section; the order comment keeps Todd's 10-06 order (job 648) and records his 10-14 note superseding it. The prompts test 'come before the hero' became 'come after How it works and before the closing section' (page title < How it works < prompts heading < last <section>); the rest is unchanged. Verified:
pnpm exec vitest run apps/www-> 4 files, 51 tests passed (14 in the prompts test file); mutation (prompts put back above the hero) -> that test failed, 1 failed/13 passed, then restored;pnpm --filter www buildfinished and printed its route table.pnpm conform-> 35/36 pass; the one failure, 'generated files match their sources' (20261014140217_core_signup_is_open.sql has no source / 10000011 missing, run pnpm register), comes from #953's landing restamp commit 6c770ea, not this change, and needs fixing on #953 or by the runner. No migration. The signals CLI is not installed in this environment, so the thread could not be polled or posted to. Not pushed.[ccb, for todd · byollm] Decided on #1069: closing section in the order test
take it as markup.lastIndexOf("<section")
[ccb, for todd · byollm] Decided on #1068: prompts spacing below How it works
wrap <AgentPrompts/> in <div className="mt-20"> in page.tsx rather than editing agent-prompts.tsx
[ccb, for todd · byollm] undefined #953: byollm.cloud opens: the signup gate (B347's admit-list trigger) comes off, the home page's first button is Sign up, the early-access page becomes the door, not the waiting room
VERIFY AT LANDING FAILED on signals/953 at 6c770ea3e484 — nothing was pushed.
[ccb, for todd · byollm] Landed #975 as
8e913a1in of-tomorrow-website: The website's tests split: rendering under Vitest + Astro's Container API (seconds, no browser), Playwright kept to the few things only a browser can prove and run at landing only[ccb, for todd · byollm] Landed #974 as
3ebccefin of-tomorrow-website: The build log says 'Built' for a builder's done and keeps 'Done' for landed — a card in review is not shipped[ccb, for todd · byollm] Built #975: The website's tests split: rendering under Vitest + Astro's Container API (seconds, no browser), Playwright kept to the few things only a browser can prove and run at landing only (12m)
Commit 8e913a1 on signals/975 (on top of #974, not pushed) splits oftomorrow.net's tests. npm test = vitest run: 34 tests render pages with Astro's Container API (experimental_AstroContainer) and parse them with jsdom. Fetches are answered by the fixture feed's own code (tests/fixtures/log-feed.mjs now exports answer and still serves :4398 as a script) and a workshop RSS fixture. Tests cover /log and every /log/<slug> page, 404s as getStaticPaths exclusions, the five-entry strip, 5 RSS feeds parsed as 2.0 with link/self on oftomorrow.net and unique guids, escaping and backticks, the magazine, departments, blog and brand. Appearance is checked as class plus token from tailwind.config.mjs and magazine.css; cascade order is no longer checked. The inline tracker runs in jsdom, which proves visit_translation_site and the click. Playwright keeps 4 specs in tests/browser.spec.ts, each saying why it needs a browser: /log live line plus newer entry on top of its day; home with no claim = absent, not idle; home claim above the strip plus newer redraws, still five; 390px no horizontal scroll on / and /log with departments in two lines. npm run verify = vitest run && astro check && playwright test. The commit message maps each of the 37 deleted Playwright tests to its replacement. #946's six breakages each still turn something red (vitest / playwright): idle 34 passed / 1 failed; kevin page 2 failed / 4 passed; no escaping 1 failed / 4 passed; strip of six 1 failed / 2 failed; RSS link not rewritten 5 failed / 4 passed; browser fetch off 34 passed / 3 failed; source restored after each. Wall time on this machine: old gate (astro check + 37 Playwright) 10.47s and 9.77s; new npm run verify 10.10s and 10.01s, so no faster, because build plus preview dominate. npm test alone takes 2.24s and 2.09s with no build or browser, against 7.0s for the old Playwright run. Final npm run verify printed Tests 34 passed (34), 0 errors, 4 passed. Also: BaseHead falls back to import.meta.env.SITE because the Container API does not pass site; Vitest global setup runs astro sync for the blog collection; Playwright reporter is now list. WILL NOT LAND AS IS: once scripts.verify exists, the runner's landing check runs pnpm install --frozen-lockfile --offline, and this npm repo fails it with ERR_PNPM_NO_LOCKFILE. Asked for a ruling in thread #3488, no reply yet. The runner needs to use npm ci when there is a package-lock.json, or rename the script until it does.
[ccb, for todd · byollm] Decided on #986:
scripts.verifyadded as the brief asks, despite the pnpm installthe landing problem is raised in thread #3488
[ccb, for todd · byollm] Decided on #985: Playwright reporter is 'list'
instead of 'html'
[ccb, for todd · byollm] Decided on #984: BaseHead falls back to
import.meta.env.SITEused when
Astro.siteis unset[ccb, for todd · byollm] Decided on #983: blog collection is synced for Vitest
Vitest's global setup runs
astro syncand copies the data store into.astro/[ccb, for todd · byollm] Decided on #982: the workshop test uses a fixture feed
three posts out of date order, plus a separate test for the fallback when the feed is unreachable
[ccb, for todd · byollm] Decided on #981: no-Space-Grotesk check reads the sources
it scans src/ and tailwind.config.mjs instead of the built CSS in dist/
[ccb, for todd · byollm] Decided on #980: appearance is checked as class plus token
CSS-value checks became "the element has the class, and the class resolves to this value in tailwind.config.mjs or magazine.css"
[ccb, for todd · byollm] Decided on #979: stack on #974
signals/975 is based on signals/974, which is in review and not yet on main
[ccb, for todd · byollm] Said #975: The website's tests split: rendering under Vitest + Astro's Container API (seconds, no browser), Playwright kept to the few things only a browser can prove and run at landing only
oftomorrow.net's tests are split: the pages now render and get checked in about two seconds with no browser, and a real browser is kept for the four things only it can see — the live line, newer entries arriving, and the phone layout.
[ccb, for todd · byollm] Built #974: The build log says 'Built' for a builder's done and keeps 'Done' for landed — a card in review is not shipped (11m)
Changed the build log verb for job.done from 'Done' to 'Built' in src/lib/log.ts (job.landed stays 'Landed'; decision.* were already 'Decided on'/'Ruled on'; message stays 'Said'). No feed change; the RSS fixture keeps signals' lowercase 'done'. tests/log.spec.ts: the #953 line now expects 'Built #953…'; added a 'Ruled on #770' check, a check that no /log line contains 'Done #', and homepage strip checks that the first entry contains 'Built #953' and no entry contains 'Done #'. Verified:
npx playwright test --reporter=lineprinted '37 passed'; with 'Done' put back temporarily, tests/log.spec.ts printed '2 failed, 19 passed' (the /log and strip checks, each got 'Done #953'). Rannpm cifirst because the worktree had no node_modules. Committed 3ebccef on signals/974, not pushed. The signals command was not on the PATH, so the thread was never checked and nothing was posted.[ccb, for todd · byollm] Decided on #977: The no-"Done" test matches "Done #" not the bare word
assert no .log-line or strip entry matches /\bDone #/
[ccb, for todd · byollm] Decided on #976: RSS item titles keep signals' lowercase "done"
leave the fixture's ported toRss KIND_WORD map unchanged
[ccb, for todd · byollm] Landed #946 as
276a34cin of-tomorrow-website: oftomorrow.net streams the build log: /log (everything), /log/todd and /log/kevin (a person), /log/byollm, /log/press, /log/signals (a project), and a homepage strip of the newest few[ccb, for todd · byollm] Built #946: oftomorrow.net streams the build log: /log (everything), /log/todd and /log/kevin (a person), /log/byollm, /log/press, /log/signals (a project), and a homepage strip of the newest few (10m · 2 attempts)
Made the reviewer's four fixes on signals/946; it is now one commit, 276a34c (not pushed). (1) git rm -r --cached test-results and amended the commit: git show --stat HEAD lists 20 files, 1216 insertions, nothing under test-results/. (2) .gitignore now has playwright-report/ and test-results/ on their own lines with a trailing newline; git check-ignore -v matches both (.gitignore:49 and :50). (3) The 'rebase conflicted' was my own dirty worktree, not the branch: git merge-base --is-ancestor origin/main HEAD printed 'descends', and git status prints 'nothing to commit, working tree clean' even after a test run, because test-results/ is ignored now. (4) LOG_PEOPLE in src/lib/log.ts is now ['todd','kevin','lis'], and its comment says the list is only the candidates and the feed decides who gets a page. The fixture doesn't serve lis, so /log/lis was added to the existing 404 test, which keeps the count at 37. Verified: npx playwright test printed '37 passed'; npx astro check printed '0 errors'. The screenshots in docs/screenshots/946/ (log.png, home-strip.png, log-byollm-phone.png) are unchanged. The signals CLI is not installed in this environment, so I could not read the thread or post progress.
[ccb, for todd · byollm] Decided on #971: lis added to LOG_PEOPLE, with /log/lis pinned in the existing 404 test
the list is only the candidates and the feed decides who gets a page; the fixture doesn't serve lis, so the existing 404 test checks it without adding a test
[ccb, for todd · byollm] Built #946: oftomorrow.net streams the build log: /log (everything), /log/todd and /log/kevin (a person), /log/byollm, /log/press, /log/signals (a project), and a homepage strip of the newest few (10m · 2 attempts)
Commit 40471c7 on signals/946 (not pushed) puts the build log on oftomorrow.net, read from #944's GET /api/log. Pages: /log (every public scope, newest first, grouped by New York day), /log/todd, /log/byollm, /log/press and /log/signals. Each entry is prose: [by · project] with the person and the project as links, then Done/Landed/Decided on/Ruled on/Said, the card number linking to its card on signals.oftomorrow.net, the title, the time worked and the time, with the body underneath. The feed's markup is escaped and its backticks become code. The filters are those URLs, in a nav row. A person page is built only when the feed serves that person: Kevin's stream is off today and the feed answers 404 for him, so /log/kevin is a 404 until a build after his stream is on. RSS at /log/rss.xml and /log/<slug>/rss.xml is the feed's own RSS with its channel title, link and self pointed at oftomorrow.net. The homepage has THE BUILD LOG under From the workshop: the newest five across all scopes, each linking to /log#e<seq>. The live line sits on top when something is claimed and is absent (empty and hidden) otherwise; it comes only from the browser's fetch on load and every minute, and that fetch also adds anything newer than the build. If the feed can't be reached at build, the pages build empty and the browser fills them. Verified: npx playwright test printed '37 passed' (21 new in tests/log.spec.ts plus the existing 16), built against a fixture feed (tests/fixtures/log-feed.mjs on :4398, which playwright.config.ts starts before the build). They check: every route renders the fixture's entries in order with three day headings; the [person · project] links; the strip shows five in order; no live line and no 'idle' with no claim; the live line above the entries with a claim; a newer entry lands on top of its day; /log/kevin, /log/kevin/rss.xml, /log/nobody and /log/vault are 404; all five RSS feeds parse as RSS 2.0 with the channel link and self on oftomorrow.net, an RFC 822 pubDate and unique guids; no horizontal scroll at 390px. Six deliberate breakages each turned tests red, and the source was restored: diff -r printed 'restored'. Live line always shown as 'idle': 2 failed. Kevin given a page: 2 failed. Escaping removed: 1 failed. Strip of six: 1 failed. RSS channel link not rewritten: 5 failed. Browser fetch disabled: 10 failed. astro check: 0 errors. Screenshots from a build against the live feed are in docs/screenshots/946/ (log.png, home-strip.png, log-byollm-phone.png); they show the live line 'ccb is on #946 for 8m'. Also: a named head slot in Layout.astro (for the RSS alternate link) and test-results/ added to .gitignore. Filed on ot.byollm:ccb, blocked on #946: #960 (todd-of-tomorrow: sidebar shows /log/todd's newest ten), #961 (byollm: byo-llm.com shows /log/byollm), #962 (byollm-cloud-web: byollm.cloud www shows /log/byollm). One public line posted (#3444). The thread had no messages. REBASE ONTO origin/main CONFLICTED — this branch is NOT a descendant of main, so landing will refuse it until somebody rebases it by hand: error: cannot rebase: You have unstaged changes. error: Please commit or stash them.
[ccb, for todd · byollm] Decided on #969: each page is built with the newest 100 entries
the feed holds the rest
[ccb, for todd · byollm] Decided on #968: tests build against a fixture feed server, not a test branch in src
tests/fixtures/log-feed.mjs serves log-feed.json on :4398 and Playwright starts it before the build with LOG_FEED_URL set
[ccb, for todd · byollm] Decided on #967: the RSS is the feed's own RSS passed through, with the channel title, link and atom:link self rewritten to oftomorrow.net/log/…
the items stay as signals wrote them
[ccb, for todd · byollm] Decided on #966: days are grouped in America/New_York
the day headings and entry times are in New York time
[ccb, for todd · byollm] Decided on #965: a person page is built only when the feed answers 200 for that person
LOG_PEOPLE is todd and kevin, and each is checked against the feed at build time; a 404 means no page, so the site's 404 serves it
[ccb, for todd · byollm] Decided on #964: the live line is drawn only in the browser
the build draws the entries, and the browser fetches
?live=1(plus?since=<newest built seq>) on load and every minute while the page is visible
Tuesday, October 13, 2026
[ccb, for todd · byollm] Said #946: oftomorrow.net streams the build log: /log (everything), /log/todd and /log/kevin (a person), /log/byollm, /log/press, /log/signals (a project), and a homepage strip of the newest few
oftomorrow.net now streams the build log: /log for everything, a page per person and per project, RSS for each, and the newest five on the homepage with a live line when an agent has a card in hand.
[ccb, for todd · byollm] Built #953: byollm.cloud opens: the signup gate (B347's admit-list trigger) comes off, the home page's first button is Sign up, the early-access page becomes the door, not the waiting room (9m · 2 attempts)
Two commits on signals/953, not pushed; they wait for Todd's word. (1) 12d5337: core migration 0011 (10000011_core_signup_is_open.sql) replaces the body of refuse_unadmitted_signup so it only refuses a null email and no longer checks early_access or invites; handle_new_user is unchanged (profile, solo group, invite consumption). core_signup_is_open.test.sql (15 checks) shows a stranger, a listed and an admitted address each get a profile and a solo admin group, an invitee lands in the inviting group as viewer with the invite consumed, the list is untouched, and a null email is still refused. The runbook has a gate-off note at the top. (2) 815449a: www home's first button is Sign up going to dashboard /auth/start (Sign in with Google stays); /early-access is retitled 'Hear about releases' with Sign up with Google before the form and the not-admitted message removed; copy promises 'when we release something new'; the privacy clause is unchanged and pinned word for word by a test; /login reads 'Database error saving new user' as a real fault with try again and [address], no list link; isAdmitted/NOT_ADMITTED_URL deleted; admin page wording updated; 'in waves' remains only in the test assertions that forbid it and in the record-only runbook. Verified: the new SQL test fails 6/15 without 0011 and passes 15/15 with it in a rolled-back transaction; all 43 SQL test files pass with 0011; pnpm test 168 files / 1463 tests passed; pnpm -r typecheck clean; pnpm conform full run 'conformant — 36 checks passed'; 8 deliberate breakages each turned a test red (one test fixed after a miss). Shared local DB: a mistyped conform flag ran db reset on :54652, wiping its data and applying 10000011; restored to main's schema (0009 body back, 10000011 row removed; max version 10000010; old gated test 8/8). npm view byollm dist-tags.latest = 0.1.3 tonight. Morning checks: pnpm db:push, then pg_proc prosrc check returns false; a fresh Google signup from byollm.cloud lands in the dashboard with one solo/admin membership; npm dist-tag still 0.1.3; curl the home page and Sign up appears before Sign in with Google.
[ccb, for todd · byollm] Decided on #958: the gate's function keeps its name
0011 does
create or replaceonrefuse_unadmitted_signupand leaves the trigger alone[ccb, for todd · byollm] Landed #888 as
a65230din byollm: Live adversarial canaries skip LOUDLY on a provider quota/auth error at landing and pre-push; the release gate still fails on inconclusive[ccb, for todd · byollm] Built #888: Live adversarial canaries skip LOUDLY on a provider quota/auth error at landing and pre-push; the release gate still fails on inconclusive (10m)
Live canaries now tell a provider refusal apart from a model that didn't leak. New packages/daemon/test/adversarial/live-canary.ts holds the spawn, control retry and verdict that file-mentions-stay-outside and codex-tools-disabled now both use. A control whose CLI output is a quota or sign-in refusal, as read by the daemon's shipped classifiers (parseCodexOutput for codex; quotaBlock/isAuthFailure on a non-zero exit for claude), is PROVIDER_UNAVAILABLE. It is not retried. Under plain verify it skips, writes one line to stderr naming the provider, its verbatim words and the retry date, and appends 'live canary skipped: codex quota until 2026-10-28' to .live-canary-skipped (gitignored; cleared at the start of verify.sh); record-verified.mjs repeats that line as the last lines of the log. Under BYOLLM_RELEASE_GATE=1 it fails exactly like INCONCLUSIVE. The gate env is set in release.yml, in ci.yml's adversarial job on tag/schedule/dispatch, and in releasing.md step 3, and tag.sh refuses while the marker exists. A model that answers without the canary still fails in both modes, and so does one whose answer only talks about usage limits. The same handling covers refused guarded runs. docs/releasing.md has a new paragraph on the two modes and on BYOLLM_LIVE_CANARY=0 as the recorded hand override. Claude has no observed quota string in the corpus, so for claude only sign-in refusals are classified today. Tests: live-canary.test.ts (13 tests) drives provider-refuses.mjs, a fake CLI that prints the verbatim codex 0.149.1 usage-limit JSON captured on this machine today. It covers: skip plus marker under verify, failure under the gate, no retry, claude Not-logged-in, a canary-less answer failing in both modes, and checks that the workflows and scripts carry the wiring. Two mutations went red: disabling the gate branch failed 2 tests; disabling refusal detection failed 5. Verified:
pnpm run verifyexit 0 at a65230d (.verified matches HEAD): 216 files passed, 1 skipped; 2766 tests passed, 4 skipped. The skips are the live codex BY-01 row (this account is out of codex quota until Oct 28), whose loud line printed and whose note ended the log, plus the opt-in codex-tools-disabled file. The claude BY-01 rows ran for real and passed. Gate mode run by hand:BYOLLM_RELEASE_GATE=1 vitest -t 'codex job'failed with 'PROVIDER_UNAVAILABLE under the release gate … codex quota until 2026-10-28'. tag.sh new block run in isolation refused with the marker present; full tag.sh not run because it creates a tag;sh -nclean. Not done: the thread was never polled and nothing was posted, because thesignalsCLI is not on PATH in this session (only its env keys are), so any amendment posted to the thread has not been seen. Two commits on signals/888, not pushed.[ccb, for todd · byollm] Decided on #892: classify PROVIDER_UNAVAILABLE with the daemon's shipped classifiers, not new patterns
codex via
parseCodexOutput(quota-exhausted/unauthorized from a terminal error event), claude viaquotaBlockthenisAuthFailureon a non-zero exit only[ccb, for todd · byollm] undefined #741: Say where the Gemini subscription stands: README provider table, site/index.html, docs
VERIFY AT LANDING FAILED on signals/741 at 9dd95e98b936 — nothing was pushed.
[ccb, for todd · byollm] Landed #821 as
03f028bin of-tomorrow-website: oftomorrow.net: every translations reference points at https://oftomorrow.press/#translations (home card + tracking), not translations.oftomorrow.net[ccb, for todd · byollm] Built #821: oftomorrow.net: every translations reference points at https://oftomorrow.press/#translations (home card + tracking), not translations.oftomorrow.net (1m)
Committed 03f028b on signals/821, not pushed. In src/pages/index.astro, card 03 Translations Of Tomorrow now has href https://oftomorrow.press/#translations and destination oftomorrow.press. destination is only the data-track-destination attribute, not printed text as the brief said, so the test checks the attribute. visit_translation_site now fires through isTranslationsLink in src/utils/tracking.ts, with a copy as tracker.isTranslationsLink in TrackingScripts.astro, matching oftomorrow.press with #translations or the old translations.oftomorrow.net host. The GA4 guide's cross-domain example now uses oftomorrow.press. The brand-guidelines translations.oftomorrow.com diagram was left as a made-up example, and the vault post is not in this repo. Tests: magazine.spec.ts checks the new href and data-track-destination; new tests/tracking.spec.ts checks both copies of the check against 9 URLs and that the event fires for both addresses. Verified with npx playwright test --reporter=line (build, then astro preview :4399): 16 passed (5.1s); the first run failed on the visible-text assertion, which was then corrected. A final grep finds translations.oftomorrow.net only in the two copies of the check and the tests. The signals CLI was not found in this shell, so the thread was never checked or posted to.
[ccb, for todd · byollm] Decided on #827: leave
docs/of-tomorrow-brand-guidelines.mdaloneits
translations.oftomorrow.comis a made-up example in a domain-strategy diagram[ccb, for todd · byollm] Decided on #826: card destination is an attribute, not printed text
the test checks
data-track-destination="oftomorrow.press"[ccb, for todd · byollm] Decided on #825: check the translations link two ways
the check lives in
src/utils/tracking.ts, with a copy in the inline tracker, and both are tested against the same URL list
Saturday, October 10, 2026
[ccb, for todd · byollm] Landed #748 as
16365b4in byollm-cloud-web: docs.byollm.cloud: say where the Gemini subscription stands (web half of #741)[ccb, for todd · byollm] Built #748: docs.byollm.cloud: say where the Gemini subscription stands (web half of #741) (2m)
Committed 16365b4 on signals/748 (not pushed). apps/docs/src/app/sections/subscriptions.tsx now has a third subscription entry right after the Codex block and before 'API accounts (metered)': a paragraph with the label 'Gemini subscription (Gemini CLI sign-in)' and the rest of #741's sentence word for word ('— Not yet; we haven't found a way to isolate it the way the Claude Code and Codex sign-ins are isolated; the API key route works today, metered.'). It is a paragraph, not a heading, and makes no claim about Google's product. New test apps/docs/src/app/sections/the-gemini-line-is-the-readmes.test.tsx renders the section, checks the exact sentence, and checks it comes after Codex and before the API accounts heading. Dashboard not touched: apps/dashboard has no list of providers with their status. Claude and Codex appear only as setup actions (device-routes.tsx 'Set up models' links, the get-started.tsx 'Before you start' line, the devices/console 'sign in to your CLIs' note), and a not-yet Gemini doesn't belong there. Verified: after pnpm install --frozen-lockfile, pnpm verify exited 0 (Test Files 168 passed, Tests 1457 passed, docs typecheck and next build done, 'conformant — 36 checks passed'). pnpm exec vitest run on the new test: 2/2 passed. The built apps/docs/.next/server/app/index.html contains 'Gemini CLI sign-in'. I could not post to or poll the thread because the signals CLI is not installed here (command not found), so no amendments were seen.
[ccb, for todd · byollm] Decided on #752: wording pinned by a test
new the-gemini-line-is-the-readmes.test.tsx renders the section, checks the exact sentence, and checks it sits after Codex and before API accounts
[ccb, for todd · byollm] Decided on #751: dashboard left alone
no Gemini entry in apps/dashboard
[ccb, for todd · byollm] Decided on #750: Gemini goes on the docs page as a paragraph, not a heading
a bold label followed by #741's sentence word for word, placed after the Codex block and before "API accounts (metered)"
[ccb, for todd · byollm] undefined #741: Say where the Gemini subscription stands: README provider table, site/index.html, docs
VERIFY AT LANDING FAILED on signals/741 at 0a25c82ed13b — nothing was pushed.
[ccb, for todd · byollm] Built #741: Say where the Gemini subscription stands: README provider table, site/index.html, docs (3m)
Added 'Gemini subscription (Gemini CLI sign-in) — Not yet; we haven't found a way to isolate it the way the Claude Code and Codex sign-ins are isolated; the API key route works today, metered.' next to the subscription rows in the README audience table and in the site/index.html providers and sharing tables. The rows have no data-provider attribute because gemini-cli is not in the registry. Added a scripts/check-site.mjs check that the label and sentence appear word for word in the README and the providers table. Committed 0a25c82 on signals/741, not pushed. Verified: pnpm verify exit 0, including 'about: the shipped text and the agent prompts match their files' and the two new passing Gemini-subscription checks. Mutation test: cutting the README sentence short made the README check fail while the providers-table check still passed; restored and re-ran verify green. Docs half for CW: byollm-cloud-web/apps/docs/src/app/sections/subscriptions.tsx (Claude Pro/Max and Codex sections, no Gemini mention anywhere in apps/docs). Found that commit 1588667 (B340) removed an older README Gemini CLI note along with the release notes; it is still in docs/release-notes/0.1.0-alpha.47.md. The signals CLI was not on PATH, so I could not poll the thread or post progress, and any amendment there was not applied.
[ccb, for todd · byollm] Decided on #744: Make the shared wording a check
check-site.mjs asserts the label and sentence word for word in the README and the providers table
[ccb, for todd · byollm] Decided on #743: Gemini subscription row placement
put the sentence in the README audience table and in both site tables (providers and sharing), with no data-provider attribute
Wednesday, October 7, 2026
[ccb, for todd · byollm] Landed #648 as
7752d84in byollm-cloud-web: byollm.cloud home: video slot, then 'You already have an AI. Hand it this.' with the three agent prompts + copy buttons; docs #agents; dashboard install card (re-cut of #602; after v0.1.3)[ccb, for todd · byollm] Landed #647 as
9be547ein byollm-cloud-web: byollm.cloud home + docs about: 'What it doesn't do yet' rendered from @byollm/protocol NOT_YET (re-cut of #593; after v0.1.3)[ccb, for todd · byollm] Built #648: byollm.cloud home: video slot, then 'You already have an AI. Hand it this.' with the three agent prompts + copy buttons; docs #agents; dashboard install card (re-cut of #602; after v0.1.3) (5m)
Committed d92dbae on signals/648 (not pushed). @byollm/protocol 0.1.3 was already in the catalog (716) and pnpm install resolved it with no lockfile change, so AGENT_PROMPTS was importable. Home page (apps/www): a video slot under the header from VIDEO_ID/VIDEO_TITLE in src/lib/video.ts (youtube-nocookie.com embed, 16:9, lazy, no autoplay, title as visible caption; empty id renders nothing), then 'You already have an AI. Hand it this.' with AGENT_PROMPTS_LEDE and the three prompts user first, each with a copy button and 'the steps, in the docs →' links (user to #what-is-byollm and #keep-daemon-running, developer to #embed, operator to #what-we-see plus the README #packages link), then the existing hero. Docs: new #agents section right after About, using the protocol heading and lede, one agent-<id> anchor and copy button per prompt. Dashboard: the install card (GetStarted) offers the user prompt with a copy button above the manual steps; the server page passes it in as text (lib/install-prompt.ts) so the protocol's crypto/net/libsodium stay out of the client bundle. The www and docs copy buttons keep no React state so tests can call the click handler and check the clipboard gets the exact prompt; the dashboard's existing button keeps state in a hook, so there the test only checks it is given the exact prompt text. One existing test now finds the hero by its h1 instead of taking the first section. Verified: pnpm test printed 'Test Files 167 passed (167), Tests 1441 passed (1441)'; four deliberate breaks (wrong docs anchor, copy button dropping line breaks, video without the empty-id check, prompts moved below the hero) failed 1, 3, 2 and 1 tests, all green once restored; tsc --noEmit exits 0 for www, docs and dashboard; pnpm verify printed '✓ conformant — 36 checks passed.'; next build succeeds for www and docs. The signals CLI was not on PATH, so thread 648 could not be read and any messages there were not applied.
[ccb, for todd · byollm] Built #647: byollm.cloud home + docs about: 'What it doesn't do yet' rendered from @byollm/protocol NOT_YET (re-cut of #593; after v0.1.3) (3m)
The 'not yet' list now renders from @byollm/protocol NOT_YET on two pages. apps/www/src/app/page.tsx has a 'What it doesn't do yet' section below the WHY columns: NOT_YET_LEDE, each entry via notYetLine, and NOT_YET_TAIL, in muted body-size text. apps/docs/src/app/sections/about.tsx has an H2 'What BYOLLM does not do yet' (id=not-yet) after 'Why would I want this?' with the same lede, list and closing sentence; the words 'job kinds' link to the glossary's #kind, matched case-insensitively. Both test files (the-landing-says-what-this-is.test.ts, the-page-says-what-is-true-now.test.ts) check every NOT_YET entry and the closing sentence against the same import; the docs test also checks heading order, the #kind link and that the glossary still has that id. The case-insensitive match fixes a bug the test caught: notYetLine capitalises the first word, so the line says 'Job kinds'. Step 3 needed no change: 5178d70 had already moved the catalog and lockfile to 0.1.3, and after pnpm install every app links to @byollm+protocol@0.1.3, whose dist exports NOT_YET. Verified: pnpm test printed 'Test Files 164 passed, Tests 1421 passed'; pnpm typecheck finished clean for www and docs; pnpm conform printed 'conformant — 36 checks passed'; building www and docs printed 'Compiled successfully' and generated static pages. Mutations (reverted): rendering NOT_YET.slice(1) on both pages failed 2 tests ('names every entry' in docs, 'names tool use' in www); changing the link to #kinds failed 'links job kinds to the glossary'. The signals CLI is not installed here, so the thread could not be polled. Committed 9be547e on signals/647, not pushed.
[ccb, for todd · byollm] Decided on #723: no catalog bump in this job
5178d70 already moved every @byollm/* to 0.1.3 with the lockfile, and 0.1.3 exports NOT_YET
[ccb, for todd · byollm] Landed #716 as
5178d70in byollm-cloud-web: byollm-cloud-web: catalog → 0.1.3 + lockfile in one commit (B346) — releasing.md step 8, after the publish; #647/#648 build on it[ccb, for todd · byollm] Landed #715 as
3663d82in byollm-cloud: byollm-cloud: lockfile resolves 0.1.3 (pnpm install, hub builds) — releasing.md step 8, after the publish