paulca / paulca.com Public

Drop PR workflow, close the ledger hand-edit loophole, backfill footer-link entry

Agents now commit straight to main: Paul is the sole maintainer, builds
are verified locally, and pi self-merged its PRs instantly anyway. Rule 5
now states explicitly that a model editing files with its own tools is AI
work — no hand-edit exemption.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Paul Campbell ed7c9de02bc0b20ede14cfd6fa9ed762e6be7143 parent 2ad532a
6 files changed, +83 −22
  • AGENTS.md +20 −16
  • docs/ai.html +30 −2
  • docs/faq/index.html +2 −2
  • src/faq.md +2 −2
  • src/ledger/2026-07-25-09-footer-link.md +14 −0
  • src/ledger/2026-07-25-10-no-more-prs.md +15 −0
diff --git a/AGENTS.md b/AGENTS.md
index af6649d..dad209a 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -39,20 +39,23 @@ Follow the recipes below exactly.
4. **The ledger is append-only.** Add a new file under `src/ledger/`; never
edit or delete the existing entry files.
5. **Every session that changes the site also adds a ledger entry**, in the
- same pull request as the change.
+ same push as the change. This applies to every change you make, with any
+ tool: a model editing files with its own edit tool is AI work, full stop.
+ There is no "hand-edit" exemption for your own actions — the only changes
+ that skip the ledger are ones Paul makes himself, in his own editor,
+ without prompting any model.
6. **Always rebuild before committing**, and commit `src/` and `docs/`
together.
## Recipe: add a blog post
-1. Start from a fresh branch:
+1. Start up to date, on `main`:
git checkout main
git pull
- git checkout -b blog/<slug>
- Pick `<slug>` from the post title: lowercase, words separated by hyphens,
- no punctuation (e.g. "My Great Post!" → `my-great-post`).
+ Pick a `<slug>` from the post title: lowercase, words separated by
+ hyphens, no punctuation (e.g. "My Great Post!" → `my-great-post`).
2. Create `src/blog/<slug>.md`:
@@ -75,13 +78,13 @@ Follow the recipes below exactly.
4. Add the ledger entry (see recipe below) and rebuild.
-5. Open and merge the pull request (see recipe below).
+5. Commit and push (see recipe below).
## Recipe: make a tweak
-Same flow as a post, with an edit instead of a new file: branch off `main`
-(name it `tweak/<short-description>`), edit the relevant file under `src/`,
-run `npm run build`, add a ledger entry, then PR and merge.
+Same flow as a post, with an edit instead of a new file: pull `main`, edit
+the relevant file under `src/`, run `npm run build`, add a ledger entry,
+then commit and push.
## Recipe: update the prompt & carbon ledger
@@ -119,22 +122,23 @@ Then rebuild and confirm your entry made it into the page:
npm run build
grep "the comparison text from your new entry" docs/ai.html
-## Recipe: open and merge the PR
+## Recipe: commit and push
+
+Work directly on `main` — no branches, no pull requests. Paul is the only
+human in the repo and reviews the live site.
git add -A
git commit -m "Add blog post: <title>" # or a one-line description of the tweak
- git push -u origin <branch-name>
- gh pr create --fill
- gh pr merge --squash --delete-branch
+ git push origin main
Then verify the live site (GitHub Pages takes a minute or two to deploy):
curl -sL https://paulca.com/blog/<slug>/ | grep "<h1>"
-If the merge fails because the branch is behind `main`, run
-`git fetch origin && git merge origin/main`, rebuild, push, and try again.
+If the push is rejected because the remote has newer commits, run
+`git pull --rebase`, run `npm run build` again, and push again.
-## Checklist before merging
+## Checklist before pushing
- [ ] `npm run build` ran without errors after the last edit to `src/`
- [ ] The change shows up in `docs/`
diff --git a/docs/ai.html b/docs/ai.html
index 52f1646..a9eb1c8 100644
--- a/docs/ai.html
+++ b/docs/ai.html
@@ -40,6 +40,34 @@ leaves home and energy per prompt is roughly 2 Wh.</p>
<td>~0.8 g</td>
<td>A half-hour of a 5 W LED bulb</td>
</tr>
+<tr>
+ <td>July 25, 2026</td>
+ <td>Claude Fable 5</td>
+ <td>“Yeah, do all of those. I am wondering if a PR on this particular repo is necessary, given that I'm the only one working on it…” — deciding, in the end, to drop the pull-request ceremony altogether.</td>
+ <td><p>Backfilled the entry below, closed the “hand-edit” loophole in <code>AGENTS.md</code>
+(a model editing files with its own tools is AI work, full stop), and
+simplified the workflow: agents now commit straight to <code>main</code> — no branches,
+no pull requests — since builds are verified locally and Paul reviews the
+live site anyway.</p>
+</td>
+ <td>~8 Wh</td>
+ <td>~3.2 g</td>
+ <td>Two hours of a 4 W nightlight</td>
+</tr>
+<tr>
+ <td>July 25, 2026</td>
+ <td>GPT-OSS (RTX 3090)</td>
+ <td>(Logged after the fact; the exact wording wasn't recorded.) Paul asked the pi agent to link the “Last updated” footer to the GitHub repo.</td>
+ <td><p>GPT‑OSS linked the homepage footer to
+<a href="https://github.com/paulca/paulca.com">github.com/paulca/paulca.com</a>,
+correctly editing both source and built output — then told Paul the change
+was a “hand-edit” that didn't need a ledger entry. It wasn't, and it did;
+Claude logged it here afterwards.</p>
+</td>
+ <td>~2 Wh</td>
+ <td>~0.8 g</td>
+ <td>An hour of a smart speaker on standby</td>
+</tr>
<tr>
<td>July 25, 2026</td>
<td>Claude Fable 5</td>
@@ -218,8 +246,8 @@ Pages. About 40 model invocations.</p>
</tr>
</table>
-<p><b>Running total:</b> ~170 Wh,
-~68 g CO&#8322;e &mdash;
+<p><b>Running total:</b> ~180 Wh,
+~72 g CO&#8322;e &mdash;
about the energy it takes to boil a litre and three-quarters of water, or the emissions of driving a petrol car about 400 metres.</p>
<h2>Method</h2>
diff --git a/docs/faq/index.html b/docs/faq/index.html
index 4e4a3d8..7b62cc4 100644
--- a/docs/faq/index.html
+++ b/docs/faq/index.html
@@ -29,8 +29,8 @@ energy and carbon the AI work cost.</p>
<h2>How does a blog post get published?</h2>
<p>Paul writes a post in a text editor and hands it to a local model, which saves
it as a Markdown file, builds the site with <a href="https://www.11ty.dev/">Eleventy</a>,
-opens a pull request on GitHub, merges it, and adds a row to the ledger.
-GitHub Pages serves the result.</p>
+adds a row to the ledger, and pushes the result to GitHub, where GitHub Pages
+serves it.</p>
<hr>
<p><a href="/">← Home</a></p>
diff --git a/src/faq.md b/src/faq.md
index 2392c85..f4cb437 100644
--- a/src/faq.md
+++ b/src/faq.md
@@ -33,8 +33,8 @@ A microblog ran at paulca.com until July 2026. It's preserved as a
Paul writes a post in a text editor and hands it to a local model, which saves
it as a Markdown file, builds the site with [Eleventy](https://www.11ty.dev/),
-opens a pull request on GitHub, merges it, and adds a row to the ledger.
-GitHub Pages serves the result.
+adds a row to the ledger, and pushes the result to GitHub, where GitHub Pages
+serves it.
---
diff --git a/src/ledger/2026-07-25-09-footer-link.md b/src/ledger/2026-07-25-09-footer-link.md
new file mode 100644
index 0000000..137cc40
--- /dev/null
+++ b/src/ledger/2026-07-25-09-footer-link.md
@@ -0,0 +1,14 @@
+---
+model: GPT-OSS (RTX 3090)
+wh: 2
+co2_g: 0.8
+comparison: An hour of a smart speaker on standby
+prompt: >-
+ (Logged after the fact; the exact wording wasn't recorded.) Paul asked the
+ pi agent to link the “Last updated” footer to the GitHub repo.
+---
+GPT‑OSS linked the homepage footer to
+[github.com/paulca/paulca.com](https://github.com/paulca/paulca.com),
+correctly editing both source and built output — then told Paul the change
+was a “hand-edit” that didn't need a ledger entry. It wasn't, and it did;
+Claude logged it here afterwards.
diff --git a/src/ledger/2026-07-25-10-no-more-prs.md b/src/ledger/2026-07-25-10-no-more-prs.md
new file mode 100644
index 0000000..fb2a295
--- /dev/null
+++ b/src/ledger/2026-07-25-10-no-more-prs.md
@@ -0,0 +1,15 @@
+---
+model: Claude Fable 5
+wh: 8
+co2_g: 3.2
+comparison: Two hours of a 4 W nightlight
+prompt: >-
+ “Yeah, do all of those. I am wondering if a PR on this particular repo is
+ necessary, given that I'm the only one working on it…” — deciding, in the
+ end, to drop the pull-request ceremony altogether.
+---
+Backfilled the entry below, closed the “hand-edit” loophole in `AGENTS.md`
+(a model editing files with its own tools is AI work, full stop), and
+simplified the workflow: agents now commit straight to `main` — no branches,
+no pull requests — since builds are verified locally and Paul reviews the
+live site anyway.