Log

What I got done each week, project by project.

Rocheport Times2025-W40 · no entry2025-W41 · no entry2025-W42 · no entry2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · no entry2025-W50 · no entry2025-W51 · no entry2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · no entry2026-W14 · no entry2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · 459 commits2026-W29 · 156 commits2026-W30 · 374 commits2026-W31 · 208 commits2026-W32 · 12 commits2026-W33 · 46 commits2026-W34 · no entry2026-W35 · 15 commits2026-W36 · no entry2026-W37 · no entry2026-W38 · 18 commits2026-W39 · 32 commits1,321
Bow & Bridge2025-W40 · no entry2025-W41 · no entry2025-W42 · no entry2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · no entry2025-W50 · no entry2025-W51 · no entry2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · no entry2026-W14 · no entry2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · no entry2026-W29 · no entry2026-W30 · no entry2026-W31 · no entry2026-W32 · no entry2026-W33 · 186 commits2026-W34 · 261 commits2026-W35 · 85 commits2026-W36 · 155 commits2026-W37 · 34 commits2026-W38 · 74 commits2026-W39 · 15 commits810
Earlier work2025-W40 · no entry2025-W41 · no entry2025-W42 · no entry2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · 22 commits2025-W50 · 13 commits2025-W51 · 3 commits2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · no entry2026-W14 · no entry2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · no entry2026-W29 · no entry2026-W30 · no entry2026-W31 · no entry2026-W32 · no entry2026-W33 · no entry2026-W34 · no entry2026-W35 · no entry2026-W36 · no entry2026-W37 · no entry2026-W38 · no entry2026-W39 · no entry38
Noble Strings2025-W40 · no entry2025-W41 · no entry2025-W42 · no entry2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · no entry2025-W50 · no entry2025-W51 · no entry2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · no entry2026-W14 · no entry2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · no entry2026-W29 · no entry2026-W30 · no entry2026-W31 · no entry2026-W32 · no entry2026-W33 · 3 commits2026-W34 · no entry2026-W35 · no entry2026-W36 · 4 commits2026-W37 · no entry2026-W38 · no entry2026-W39 · no entry7
Purfle2025-W40 · no entry2025-W41 · no entry2025-W42 · no entry2025-W43 · no entry2025-W44 · no entry2025-W45 · no entry2025-W46 · no entry2025-W47 · no entry2025-W48 · no entry2025-W49 · no entry2025-W50 · no entry2025-W51 · no entry2025-W52 · no entry2026-W01 · no entry2026-W02 · no entry2026-W03 · no entry2026-W04 · no entry2026-W05 · no entry2026-W06 · no entry2026-W07 · no entry2026-W08 · no entry2026-W09 · no entry2026-W10 · no entry2026-W11 · no entry2026-W12 · no entry2026-W13 · 8 commits2026-W14 · 128 commits2026-W15 · no entry2026-W16 · no entry2026-W17 · no entry2026-W18 · no entry2026-W19 · no entry2026-W20 · no entry2026-W21 · no entry2026-W22 · no entry2026-W23 · no entry2026-W24 · no entry2026-W25 · no entry2026-W26 · no entry2026-W27 · no entry2026-W28 · no entry2026-W29 · no entry2026-W30 · no entry2026-W31 · no entry2026-W32 · no entry2026-W33 · no entry2026-W34 · no entry2026-W35 · no entry2026-W36 · no entry2026-W37 · no entry2026-W38 · no entry2026-W39 · no entry136
Commits by week, 2025-W40 to 2026-W39. The busiest week had 459.
  1. 202620 weeks logged2,273
  2. W3921 Sep

    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.
    and 3 more
    32commits
  3. W3921 Sep

    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.
    and 1 more
    15commits
  4. W3814 Sep

    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.
    and 3 more
    18commits
  5. W3814 Sep

    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.
    and 3 more
    74commits
  6. W377 Sep

    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.
    and 2 more
    34commits
  7. W3631 Aug

    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.
    and 1 more
    4commits
  8. W3631 Aug

    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.
    and 3 more
    155commits
  9. W3524 Aug

    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.
    and 2 more
    15commits
  10. W3524 Aug

    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.
    and 3 more
    85commits
  11. W3417 Aug

    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.
    and 3 more
    261commits
  12. W3310 Aug

    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.
    3commits
  13. W3310 Aug

    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.
    and 2 more
    46commits
  14. W3310 Aug

    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.
    and 3 more
    186commits
  15. W323 Aug

    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.
    and 1 more
    12commits
  16. W3127 Jul

    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.
    and 3 more
    208commits
  17. W3020 Jul

    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.
    and 3 more
    374commits
  18. W2913 Jul

    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.
    and 3 more
    156commits
  19. W286 Jul

    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.
    and 3 more
    459commits
  20. W1430 Mar

    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.
    and 3 more
    128commits
  21. W1323 Mar

    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.
    and 2 more
    8commits
  22. 20253 weeks logged38
  23. W5115 Dec

    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.
    3commits
  24. W508 Dec

    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.
    and 3 more
    13commits
  25. W491 Dec

    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.
    and 2 more
    22commits
  26. 20231 week logged1
  27. W3024 Jul

    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
    1commits