Log
What I got done each week, project by project.
Rocheport Times1,321
Bow & Bridge810
Earlier work38
Noble Strings7
Purfle136
- 202620 weeks logged2,273
- W3921 Sep32commits
Rocheport Times
Five games, a broadsheet front, and the home page as a front door
- Launched five games: The Mini, a Weekly Quiz, Four Corners, Letterpress and Night Sky, with their own page type and layout.
- Made the home page a front door: no news on it, just live vitals, events, sports and games; /news/ carries the news. Events gained a 'Pin to Front Page' flag.
- Built the MR340 race hub's stats band (the MR340 is a 340-mile Missouri River paddle race): entered, finished, DNF, DNS, by division, with a map preview that opens the full-screen race map, and two-column year pages.
- W3921 Sep15commits
Bow & Bridge
A facsimile is not a second edition
- Added /labels/: every checked maker's label on a published record, A to Z, with the book, scan page and line it was read from.
- Fixed the edition rule: a facsimile counts as the edition it reproduces. 105 records resting on one reprinted book were demoted to draft, and 583 same-person questions were answered in the same pass, leaving 569 published makers.
- Fixed the OCR loop check, which had rejected 1,019 honest pages across 429 volumes because a row of dot leaders looked like a decoding loop.
- W3814 Sep18commits
Rocheport Times
Open sign-up, chat, and a front page that looks like a newspaper
- Opened sign-up: a self-serve /register/ page with editor approval, passwordless login links, a members' Messages badge in the utility bar, and a privacy note.
- Built member messaging as a chat UI on the existing direct-message store, with block, report and moderation, and a flag-gated daily digest.
- Marked every member-gated page uncacheable after the edge cache served logged-out copies to signed-in members.
- W3814 Sep74commits
Bow & Bridge
First production deploy: 605 makers live
- First production deployment on 18 Sep, second and third on 20 Sep; the deploy is one command, dry by default, ships the tables as data and rewrites URLs on the host.
- Applied a ninety-year rule: a maker whose cited printing is at least ninety years old clears the possibly-living check. The export went from 191 to 648 published records in one pass; 605 were live after the second deploy.
- Site review for a trade reader, eight findings fixed: search finds makers, every published maker in one A–Z table, the citation stays open on every page, each printing links to its scan.
- W377 Sep34commits
Bow & Bridge
Fifteen ceilings the pipeline must stay under
- Fixed the admit storm: one volume the station could never fit had been asked 10,506 times; the admission rung is now paced by work done, and the drain front rotates instead of starving.
- Wrote the operations contract: fifteen ceilings (queue depths, run times, log sizes) read from one file, with a nightly uncapped guard pass and a station ledger that records every page ask.
- Stopped the miner minting bare surnames: a single-token name is refused, and a guard catches any that got through.
- W3631 Aug4commits
Noble Strings
Instruments for Sale becomes a photo-first plate gallery
- Replaced the specs-table, per-instrument detail page with one photo-first gallery: a single plate per instrument showing all four sides, so no click-through is needed.
- Gave each plate its own bordered, shadowed card with real spacing between instruments, instead of a stacked list separated only by hairlines, and dropped a dead reviews filter left over from the old layout.
- Moved the single instrument photo shown on Home into the sidebar under the search widget, hid a duplicate search icon in the main navigation, and dropped the No. label from each plate's identifier while keeping the identifier itself.
- W3631 Aug155commits
Bow & Bridge
An admission door for every book, and a site a stranger can read
- Built the admission door: a volume is sampled, profiled and given a rule-table verdict before any mining; the miner, the prose stage and the import step all refuse a volume the door has not admitted.
- Rewrote every public page and template string for a general reader, rebuilt the maker index around search with a random cut of 18 records, and added a public /progress/ page that counts the pipeline stage by stage from a snapshot.
- Closed every code path that could mint a second live record for the same name, then restored 177 merges that an August rebuild had silently undone.
- W3524 Aug15commits
Rocheport Times
Quick Approve for the editor, six more trails
- Added Quick Approve to the Editorial Desk for the three daily draft types, with the full post body open inline so nothing is approved unread.
- Made the desk hold any draft carrying raw HTML in its prose before it can publish, with a test case for the gate.
- Gave the MCP newsroom two event-writing tools so an approved calendar item can be corrected or published from the assistant.
- W3524 Aug85commits
Bow & Bridge
Two verification bugs that hid 3,500 good claims
- Fixed the verbatim verifier's apparatus detector: attested claims went from 0 to 3,545 in one run.
- Fixed page-locator resolution in the batch verifier from 0.3% to 99.0% of claims landing on their exact page, and stopped it spending model calls on retired records.
- Indexed the transcript table so a per-claim lookup dropped from a 92-second full scan to 2 seconds.
- W3417 Aug261commits
Bow & Bridge
Teaching the miner what is not a name
- Wrote a set of name rules into the miner: an author is not a maker, a dash is not a forename, a middle initial is not a death date, a courtesy title or a printed place never sits in the name slot, and one printed line naming two makers becomes two mentions.
- Verified 2,893 claims that quote a printed line directly against the page text, with no language model involved.
- Retired 126 junk drafts (index lines, death notices, catalogue prices) that had been minted as makers, and deduplicated 1,307 byte-identical mention rows across 40 records.
- W3310 Aug3commits
Noble Strings
Evidence markers for the maker research, and code finally in git
- Added claim and dispute shortcodes: an inline pill for a single-sourced or secondary claim, a callout box for the rare case where the primary record contradicts the popular account, in four tiers from reported to unverified.
- Moved the site's custom styling out of Appearance > Additional CSS, which stored it only in the database, into a tracked custom.css file in the child theme, loaded after every other stylesheet so it wins.
- Started tracking the site's own code in git for the first time: the instrument showcase, the news digest, the Google reviews display and the child theme, leaving WordPress core, the database and uploads to Studio.
- W3310 Aug46commits
Rocheport Times
Public-domain river data and a 47-trail explorer
- Swapped the river-channel geometry for public-domain USACE data on both the desktop map and the server, and regenerated the mobile encoding to match.
- Fixed the 2026 replay's phantom leader: the first hour of tracking was mis-seeded field-wide, and pre-gun pings were being drawn as race progress.
- Escaped feed-supplied boat names at four tooltip sinks (a cross-site-scripting fix), hardened magic-link sign-in per a security audit, and added WordPress-free GitHub Actions checks: PHP lint, template lint and the MR340 regression suite.
- W3310 Aug186commits
Bow & Bridge
Bow & Bridge goes live as a sourced reference site
- Stood up the site: maker records where every claim carries its own citation, an instrument register, source pages, a citation block on each record, and llms.txt and robots.txt so crawlers and AI tools read it correctly.
- Read the complete 1916 American directory of makers from page images (412 entries) and published it as evidence rather than biography, each entry linked to its printed page.
- Ran an adversarial review of the published records (3 critical, 12 major, 21 minor findings) and re-read 79 published claims against their sources; four unsupported claims were corrected and five withdrawn, with the corrections filed on the site.
- W323 Aug12commits
Rocheport Times
The 2026 race results, frozen and replayable
- Gave each race year its own address under /mr340/ with a rewrite rule, since WordPress pages cannot have purely numeric slugs.
- Froze the real 2026 results and wired the 2026 replay onto the year page; the every-boat results table pages 10 at a time.
- Polished the race hub: year cards over a hub map, replay badges, and a rail call-to-action on the homepage.
- W3127 Jul208commits
Rocheport Times
Race day: 395 boats wrongly marked out, fixed live
- Snapped live positions to the river channel instead of raw GPS, added dead-reckoning so boats glide between feed polls instead of freezing and teleporting, and fixed the OUT label that had marked about 395 racing boats as quit.
- Moved feed validation to the server proxy (bad tracker data is flagged once, at the door) and wrote regression fixtures for every race-day defect, pinned to real feed data.
- Built the phone view for people standing at a ramp: scrollable live standings, a watch-a-stop screen with approaching boats plotted upstream and honest ETAs, and stale trackers labelled rather than guessed.
- W3020 Jul374commits
Rocheport Times
Building the MR340 race tracker in seven days
- Reverse-engineered the race's public tracker feed and built a tracker module: leaderboard and checkpoint watch from a 3-minute server-side cache with stale fallback, pinned by 27 fixture checks.
- Moved the replay map from Leaflet to MapLibre GL: vector basemap with no API key, optional 3D terrain and buildings, a satellite toggle, a cinematic tour that chases a chosen boat, and checkpoints placed at real ramp coordinates.
- Rebuilt the 2024 field from 405 real GPS tracks, snapped to the official river-channel line from a 2012 survey, and lazy-loaded it so the page shrank from 1.45 MB to 360 KB.
- W2913 Jul156commits
Rocheport Times
Members, invites, and a newsroom the AI reaches only through MCP
- Built the member layer: a Neighbor role gated on bespoke capabilities instead of generic WordPress ones, editor-issued and member-sent invites with a per-member cap, an onboarding tour, and a Community admin menu (Neighbors, Approvals, Invites, Activity, Alerts).
- Shipped the newsroom MCP server: public read tools, an editorial tier behind OAuth or an application password, a draft-only create_draft tool, and lead tools with a code-enforced trust floor. The daily drafting, rundown and lead routines now go through it; SSH access was retired.
- Turned on post-moderation by default: wall posts, listings and suggestions hold for review, with a stop-word filter and an optional tone check.
- W286 Jul459commits
Rocheport Times
Rocheport Times relaunches on one platform plugin
- Consolidated all custom code into one plugin with 30 modules and a loader that guards against collisions; the mobile app's API surface was kept frozen so nothing on the app side had to change.
- Fixed four security bugs in the existing community code before launch: an account takeover through social login that trusted an unverified email, a forced-friendship request, an unsanitized public wall (stored XSS), and Microsoft sign-in trusting a user-editable email field.
- Built the Editorial Desk: a review queue in wp-admin for AI-drafted articles with threaded change requests, an automatic link checker, and approve or request-changes actions on the post itself. Nothing publishes without a person.
- W1430 Mar128commits
Purfle
Building the loop that refuses to load a tampered agent
- Wrote the manifest identity spec and the trust loop around it: JSON Schema, RFC 0001 on JWS/ES256, a ManifestLoader, and live signature verification against the Azure key registry, complete with tamper detection.
- Built the scheduler and sandbox that enforce what a manifest declares: five trigger types (interval, cron, startup, window, event), a sandbox fix that blocks and logs an out-of-bounds write, crash isolation between agents, and backoff on LLM timeouts and 429s.
- Wired five LLM adapters, Anthropic, Gemini, OpenClaw, Ollama and a built-in tool executor, each reporting token usage, then tested that usage all the way from the adapter through the agent runner into the run log.
- W1323 Mar8commits
Purfle
Scaffolding the manifest schema and the CLI
- Wired Ajv into purfle/core and aligned the root JSON Schema with the spec, so a manifest with a missing or malformed field fails validation before anything tries to load it.
- Wrote the CLI commands, fixed module resolution in purfle/core, then added CLI tests that check init scaffolding validates cleanly against Ajv.
- Added the first tests for identity and schema validation in purfle/core, ahead of any code that would depend on them passing.
- 20253 weeks logged38
- W5115 Dec3commits
Earlier work
Podcasts, YouTube, and browsing by resource type
- Added podcast and YouTube sources to the resource model.
- Expanded public resource browsing with search and filtering by type.
- Last commits to the C# version; the project resumed in August 2026 as a WordPress site with the same goal.
- W508 Dec13commits
Earlier work
Scrapers, Archive.org, and a test suite
- Built the scraping pipeline: sitemap-driven crawling, normalization and background job processing, plus EPUB import.
- Added a page-quality analysis system so low-value scraped pages are scored before they clutter the catalogue.
- Unified books, scraped pages and Archive.org items into one resources model with quality analytics.
- W491 Dec22commits
Earlier work
The first Bow & Bridge: a .NET book-and-luthier catalogue
- Created the solution with a single Entity Framework context holding Book and Luthier entities, database-generated IDs, and a seed-and-reset script for a repeatable local database.
- Added chapters and book images with a tagging system, image tags, and dialogs for editing them.
- Split data access from business logic into separate service layers, with better loading and logging feedback.
- 20231 week logged1
- W3024 Jul1commits
Rocheport Times
A rough first try at a Rocheport Times app
- A rough .NET MAUI scaffold, one page and a Post class: the first sketch of a Rocheport Times mobile app