Email me
Progress update, 7 Sept 2026
← Automating Garage Dreams

· Update · AI summary

Progress update, 7 Sept 2026

A short bullet-point summary of project progress up to 7 Sept 2026.

Updates are bullet-point summaries generated with AI from my commits and build notes, then checked by me. Project articles and learning notes are written by me.

  • The Pi now generates, reviews, revises, builds, commits, pushes and publicly publishes on its own. Two articles, one hidden draft and one live, neither touched by a human. 822 and 787 seconds, so “twenty minutes or ninety” resolves to about thirteen.
  • Getting there meant two ceilings that both presented as “it timed out”. The first was a hardcoded 120-second request timeout with no override, against measured throughput of 3.4 tokens a second. The second only became visible once the first was lifted: with a non-streaming request the server sends no headers until generation finishes, and Node’s HTTP client abandons the request at 300 seconds regardless of the timeout you set. The error type was the only tell. Switching to streaming makes the abort signal the only deadline. The evidence is three calls pinned at 120.1s, three pinned at ~301s, then a 426-second call that finished.
  • The kernel’s missing Landlock turned out not to matter: the reviewer CLI does not use Landlock on Linux. It ships its own bubblewrap and sandboxes with unprivileged user namespaces. The write failed with “read-only file system” rather than “permission denied”, which identifies the mechanism instead of merely observing that something was blocked, and the probe ran the identical write unsandboxed first as a control. The new fragility is that unprivileged user namespaces must stay enabled. A hardening change would break the sandbox silently.
  • The deploy key’s write access had never once been exercised, because every previous run was a dry run. Added a git push --dry-run to the baseline: reaching “Everything up-to-date” proves the service authorised, costs two seconds, and guards against a commit that cannot push and then blocks every run after it.
  • For a draft-only commit, “the deploy succeeded” and “the deploy never ran” produce identical public output: the page 404s either way and the sitemap is unchanged either way. Nothing in the built site carries a build stamp, so every assertion passes under both readings. A live article self-evidences its own deployment, because the sitemap count moves and a stale build cannot fake that.
  • The local model’s characteristic error is deletion, not invention. Twice in two runs it kept a fact and dropped the restrictive clause that made it true: “hurt ride quality” became “hurt performance capabilities”, and “the first all-electric production car past 320 km” became “the first vehicle”. Both reviewers caught both, independently, and named the same missing qualifier.
  • Originality overlap rises as the source section gets shorter, because less material means more of the source’s phrasing gets reused. The first near-floor section the pipeline has ever drawn passed while spending 77% of the verbatim budget, within seven words of tripping the gate. The thresholds were fitted on the same 60 drafts they judge, and their own comment says to treat the next batch as the real test. This is that batch.
  • The revision loop can trade prose for accuracy. A fix for a factual objection produced “reported that the ride detracted from the car’s ride quality”, which is tautological, and the reviewer’s own pass verdict names the awkwardness before passing it at 8 out of 10. The loop optimises narrowly against the stated objection, and reviewers accept a prose regression once their own point is addressed.
  • Found by accident: the site emits no canonical link and no OpenGraph or Twitter metadata on any page, and never has. Same class as the robots.txt bug: schema-valid, so the build cannot see it, no test covers it, visible only on the deployed site. Every social share of an article currently renders as a bare link, on a site whose entire purpose is publishing articles.