Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 35 additions & 20 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -1138,10 +1138,13 @@ section headers).
as exhaustive, and this step wasn't in the checklist — which is
how the README drifted 24 page bullets (plus the Practice counts:
8 quizzes and 3 drills unlisted) behind by 2026-07-01.
6. Consider bumping the home-page hero's `Latest: <name>` badge
to point at the new tool — `html/index.html`, the
`<p class="hero-latest">` paragraph (~L382). Editorial pick; skip
on small revisions.
6. Consider pointing the home-page hero's `Featured · <name>` badge
at the new tool — `html/index.html`, the `<p class="hero-latest">`
paragraph (~L400; relabelled from `Latest:` 2026-07-19, owner
decision). Editorial pick; skip on small revisions. As of 2026-10-06
it is a **seasonal pick** — the Coil Freeze Protection lesson for
freezestat season, with the DDC Workbench anchor preserved in an
HTML comment beside it for the spring revert.
7. Bump `package.json.version` when shipping something notable; the
footer reads it via `html/_data/site.js`. A new tool is a minor
bump (`1.X.0`); a bug fix is a patch bump (`1.X.Y`). Bump with
Expand Down Expand Up @@ -1266,7 +1269,7 @@ opt-out.
7. Add the quiz/drill to `README.md`'s Practice groups and bump its
count sentence (same reason as tools step 5b — the tour is
exhaustive).
8. Same `Latest:` badge + `package.json.version` rules as tools.
8. Same `Featured` badge + `package.json.version` rules as tools.

## Git conventions

Expand Down Expand Up @@ -1480,17 +1483,25 @@ re-submit); add `--dry-run` to print the URL list without POSTing.
opens against its parent's branch (no run), and when the parent merges
GitHub retargets the child to `main` with an `edited` event (still no
run) — so it shows **no `test` check at all**, `mergeStateStatus` reads
CLEAN, and `gh pr merge` goes through untested. Three chain PRs merged
CLEAN, and `gh pr merge` goes through untested. Two chain PRs merged
that way on 2026-10-06 before anyone noticed (a full local suite on
`main` came back clean, 1223/0/1). **Rule:** after a parent merges,
rebase the child onto `origin/main` and force-push (the push is a
`main` came back clean, 1223/0/1). **Fixed on the workflow side
2026-10-06 (PR #645, codebase-issues #331):** `pull_request` now also
listens for `edited`, gated so only a base change runs the job, and
`push: branches: [main]` tests `main` itself after every merge. Two
things to know: a title or body edit still fires `edited`, the gate
skips the job, and the rollup then shows a `test` check with conclusion
SKIPPED **beside** the real run on the same head — read SUCCESS on the
head SHA and ignore the SKIPPED twin. And the automatic-retarget arm
was unproven when this was written (no stacked child had merged since),
so the belt-and-braces **rule stands:** after a parent merges, rebase
the child onto `origin/main` and force-push (the push is a
`synchronize`, which runs), then merge only when
`gh pr view N --json statusCheckRollup` shows a `test` check with
`SUCCESS` — a green parent is not evidence about the child. The
workflow-side fix is codebase-issues #331. Before a merge session, a
pairwise `git merge-tree --write-tree A B` over the whole queue finds
the adjacent-hunk ledger conflicts GitHub only reports once a parent
has merged.
`SUCCESS` — a green parent is not evidence about the child. Before a
merge session, a pairwise `git merge-tree --write-tree A B` over the
whole queue finds the adjacent-hunk ledger conflicts GitHub only
reports once a parent has merged.

## Local preview & tests

Expand All @@ -1501,13 +1512,17 @@ has merged.
home server's hub docroot, where a rootless Caddy serves it at
`https://cfdev.home.arpa/`. **Owner's box only** — it is a home-lab
convenience, not part of the deploy path, and it no-ops nowhere
else (the destination guard refuses any path not ending
`/caddy/dashboard/cfdev`). **From a worktree outside the repo's
parent directory, pass `CF_PREVIEW_DIR=$HOME/caddy/dashboard/cfdev`**
— the default resolves `../caddy/dashboard/cfdev` relative to the
checkout, and the suffix guard accepts the sibling folder that
creates, so the script reports "live" while the hub serves the old
build (codebase-issues #330). It publishes a **snapshot, not a
else. **The default destination is home-relative**
(`~/caddy/dashboard/cfdev`, since PR #646 / codebase-issues #330), so
it works from any checkout or worktree; `CF_PREVIEW_DIR` overrides it.
The guard has three checks and refuses on any of them: the path must
end `/caddy/dashboard/cfdev`, sit under `$HOME`, and its
`caddy/dashboard` parent must already exist (the script no longer
creates it — that third check is what catches an in-home lane
worktree, where the old repo-relative default passed the other two
and reported "live" while the hub served the old build).
`npm run publish:preview -- --dry-run` runs every guard and prints
the plan without touching the docroot. It publishes a **snapshot, not a
server**: nothing watches, so every build you want to see needs
another publish. It also can't exercise the Worker — clean-URL
301s, the legacy tool redirects and `POST /api/contact` are all
Expand Down
32 changes: 11 additions & 21 deletions docs/audits/2026-10-reentry/dashboard/dashboard-extra.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"mainSha": "a7d0d46",
"lastMergeDate": "2026-10-06",
"mainSha": "a2ad39f",
"lastMergeDate": "2026-10-07",
"banksAtOrAbove": [
{
"slug": "bacnet-basics",
Expand Down Expand Up @@ -44,33 +44,23 @@
"to": "4.147.0"
}
],
"suiteBaseline": "**1223 passed, 0 failed, 1 skipped** in 8.3 min on `:9489`, 2026-10-06, against `main` @ `1bf23ce` (after the three chain A merges that had no CI run of their own); chain B and the lesson merged after it, each CI-green on `main`.",
"suiteBaseline": "**1242 passed, 0 failed, 1 skipped in 8.2 min on `:9661`, 2026-10-07, against the scratch merge `a3cef82` of all fifteen open PRs on `main` @ `a2ad39f`** (the owner-walk queue); the 2026-10-06 baseline on `main` @ `1bf23ce` was 1223/0/1.",
"rulings": [
"**All sixteen agenda items ruled 2026-10-05**, one by one with pros and cons; the owner reached the same call as the recommendation on every item before reading it. Record: `docs/audits/2026-10-reentry/rulings.md` (PR #611, merged).",
"**The arc is picked: freeze season + quizzes.** Coil-freeze-protection lesson first, quiz wave 2 alongside, #228 in the background; F4 case-file mockup at the arc's end; §7.2 after that.",
"**The no-coming-soon convention is amended:** the ban is on prominence. A low-key follow-up clause inside a scope note is acceptable — narrow it, don't delete it (CLAUDE.md carries the amendment).",
"**The status grammar gained a `ruled` state:** decided-but-unshipped entries no longer count as decision-class. Decision-class fell from 6 to 2 (#228, #283).",
"**PR #602** (Korean localization) closed courteously with the fork route; **#318** Speed Brain off; **#319** AI Crawl Control verified safe.",
"**Review-day rulings (2026-10-06, rulings.md §18):** no Td on reheat coils as a teaching default (bank question replaced, D callout tempered); coil valves are two-way *or* three-way; the PICV sentence scoped to *modulating* valves; the ASHRAE 135 paraphrases verified (\"Clauses check out\"); the #228 design-note defaults accepted (\"I like your defaults\"); filter racks are drawn as pleated media site-wide.",
"**Owner on the format:** *\"Forcing both of us to take a look at each PR in sequence may be the most balanced workflow we've used.\"*"
"**Owner on the format:** *\"Forcing both of us to take a look at each PR in sequence may be the most balanced workflow we've used.\"*",
"**Evening rulings before the overnight lanes (2026-10-06, rulings.md §19):** the lesson adopts 35–38 °F (#99); #331 both triggers, merge on green; #328 narrow to scope statements; #324 reword as field advice; #91/#92/#94/#95/#96 fix, #93 no page change; hero badge → the Coil Freeze Protection lesson for the season; quiz wave 3 = six banks in two triples; F4 mockup on hold; #228 step 0 + step 1 as stacked PRs; combined LAN preview for the walk; the Workbench filter rack redrawn pleated."
],
"today": [
"`main` pulled to `e33a825` (PR #601, 2026-09-02) — it had been two commits behind — and then to `178af5c` after the four PRs below merged.",
"Eight merged local branches deleted (four `worktree-agent-*` leftovers, four shipped feature branches); every lane worktree removed afterwards.",
"PR #603 **merged** — 12 codebase-issues headings and all 66 content-audit headings now carry the ledger's own status marker, so status reads from the heading line.",
"PR #604 **merged** — the state map, per-entry appendix and PR #602 assessment live under `docs/audits/2026-10-reentry/`; ledger #322 records the PR #602 ruling.",
"PR #605 **merged** — `npm run status`, the readout this page is rendered from.",
"Full Playwright suite run on a free high port as the session baseline: 1215 passed, 0 failed.",
"Cloudflare dashboard checked by the owner: Speed Brain turned off (#318); AI Crawl Control confirmed on with zero refused requests (#319).",
"PR #606 **merged** — six more ledger headings trued up to the marker grammar, and the two Cloudflare rulings recorded in the ledger.",
"PR #611 **merged** — every ruling written into its ledger entry; the durable record is `docs/audits/2026-10-reentry/rulings.md`.",
"PR #607 opened — the three dependency bumps plus the matching CI Playwright image, green; owner merges (Worker toolchain).",
"Night 1: sixteen cleanup lanes, three quiz banks, the coil-freeze lesson, the two BACnet softenings, the PID aside and the #228 design note all ran as Opus/Fable lanes with adversarial verification; everything that reaches a live page is a PR for the owner, listed under **Pick up here**.",
"Three merge chains were pre-built so nothing conflicts on merge: the ledger-tail chain #619 → #632 → #626 → #630 → #634 (each appends a new ledger entry), and the version/bank chain ending in the lesson PR #620 (see each PR’s *Stacked on*). Merge top-down; GitHub retargets the child when the parent lands.",
"**Day 2 (2026-10-06): the whole queue merged, PR by PR, with the owner.** 25 PRs landed — the 23 from night 1 plus #635 (two lesson sentences from the review) and #636 (Air Handlers filter racks). **The Coil Freeze Protection lesson is live** at forced-air step 3; `main` is v3.91.0; zero open PRs.",
"Before the walk: two PRs had gone CONFLICTING overnight (adjacent-hunk ledger collisions) and chain B would have on first merge — all three fixed by rebase; a stray duplicate ledger entry on #625 was dropped.",
"Process gap caught mid-session: a stacked PR gets **no CI run** when GitHub retargets it to `main`. Three chain A PRs merged that way; a full suite on `main` was clean (1223/0/1), and the chain B children were rebase-pushed before merging. Logged as codebase-issues #331 (owner picks the trigger fix) and as a CLAUDE.md Workflow rule.",
"Wrap-up docs PR #637 (rulings §18, #228 accepted, #90 closed, new #99 / #330 / #331, CLAUDE.md notes) merges on green. LAN preview back on `main`."
"**Overnight 2026-10-06 → 07 (autonomous):** the handoff was verified as a workflow first (140 claims: 127 verified, 12 corrected, 1 unverifiable — counts and framings carried forward), then five sequential workflows ran: nine small-fix lanes, two quiz triples, #228 steps 0–1, and the wrap-up.",
"**Merged on the owner's grant:** #645 (CI: `edited` gate + `push: main`, #331) and #646 (preview-script guard, #330). The first two `push: main` suite runs both passed — `main` had never been tested directly before.",
"**Fifteen PRs wait for the walk:** #639–#644 and #647 (small content fixes, the hero badge, the Workbench filter rack), #648/#649/#650 and #653/#654/#655 (wave 3, all six banks to 15), #651 → #652 (#228 steps 0 and 1, stacked). Zero conflicting pairs in the merge-tree matrix; the scratch merge of all fifteen passed the full suite (see *Repo and toolchain*) and is published at cfdev.home.arpa.",
"Walk notes with review pointers: `docs/audits/2026-10-reentry/walk-2026-10-07.md`. Ledger by-catch from the night: codebase-issues #332–#337, content-audit #100–#104 (docs PR, merged on green).",
"Every lane reported at least one drifted line cite in the entry it closed; CLAUDE.md's Workflow and LAN-preview bullets trued up for #645/#646, the hero-badge pointer relabelled `Featured`."
],
"agenda": [
{
Expand Down Expand Up @@ -282,4 +272,4 @@
"**#633** — arc pick recorded (rulings.md §17), the two skipped annotations, coming-soon scan widened to the \"its own page\" shapes.",
"**Day 2, merged with the owner (2026-10-06):** #607 deps · #608 #609 #610 quiz banks · #613 author/breadcrumb · #615 BACnet softenings · #616 PID aside · #617 FAQ rationale · #618 AHU hedge · #619 → #632 → #626 → #630 → #634 (ledger-tail chain) · #621 balancing · #622 narrowed clauses · #625 subhead ids · #631 design note · #612 → #623 → #624 → #627 → #620 (version chain, the lesson) · #635 lesson sentences · #636 filter racks."
]
}
}
81 changes: 81 additions & 0 deletions docs/audits/2026-10-reentry/rulings.md
Original file line number Diff line number Diff line change
Expand Up @@ -265,3 +265,84 @@ sequence may be the most balanced workflow we've used."*
**Merged 2026-10-06:** #607 #608 #609 #610 #612 #613 #615 #616 #617
#618 #619 #620 #621 #622 #623 #624 #625 #626 #627 #630 #631 #632 #634
#635 #636. Open PRs after: none. `main` at 3.91.0.

## 19. Evening rulings before the overnight lanes *(2026-10-06 — frontloaded in the first two hours, then the assistant worked the queue alone)*

The session opened with `/verify-handoff` on `docs/next-session-handoff.md`
(140 claims: 127 verified, 12 corrected, 1 unverifiable — the corrections
are in the handoff's *Corrections* block) and then put every open call to
the owner in four rounds. He answered each one, then slept; the lanes ran
overnight and their PRs wait for the morning walk. Where a
recommendation was offered, he took it on every item but two (marked).

1. **content-audit #99 — the lesson adopts 35–38 °F** as the practical
freezestat band (*What Actually Freezes* and protection-stack item 1 in
`coil-freeze-protection.html`); the tool's `bandTxt` stays. *Against
the recommendation*, which had been to relabel the tool. PR #639.
2. **codebase-issues #331 — both triggers**: `pull_request` listens for
`edited` with a base-change gate, AND `push: branches: [main]` runs the
suite on `main` after every merge. **Merge on green granted** (the
recommendation had been to hold it for the walk). PR #645, merged
2026-10-07 01:14Z; the first `push` runs on `main` followed immediately.
3. **codebase-issues #328 — narrow to scope statements.** All five
*What this page didn't cover* bullets on `bacnet-networking.html`
(segmentation, BACnet/SC, capture-driven troubleshooting, alarms and
events, vendor profiles) plus `bacnet-basics.html`'s "their own future
pages" line. The topics stay listed; the promise goes. PR #643.
4. **codebase-issues #324 — reword as field advice.** The tuner's
cheat-sheet row now says to flip direct ↔ reverse on the real
controller, not on this page. PR #641.
5. **content-audit #91 + #92 — fix, two sentences.** One prose pointer
near the sensor-strip widget to the freeze lesson's 38 °F figure, and
one sentence giving the MA-T-reads-the-coil point in prose (the story
itself stays in the widget). PR #640.
6. **content-audit #94 + #95 — fix.** `pid-basics.html` softens "fast,
clean loop" (duct static is noisy: D has little lag to anticipate and
plenty of noise to amplify) and names the measured variable; the
tuner's Fast row names duct static pressure and mixed-air temperature
as the PVs, with the outputs they drive. PR #641 (with #324 and #329).
7. **content-audit #96 — fix, one disclosure sentence.** "Lockout" is used
at both ends of changeover — high-limit lockout of free cooling, and a
low-ambient / low-limit lockout at the cold end. Name both, legislate
neither (the deadband-convention register). PR #642.
8. **content-audit #93 — no page change.** The damper-stroke caveat is a
candidate question for a later air-handlers wave; the entry stays open
as that pointer.
9. **Home hero badge — feature the Coil Freeze Protection lesson** for
freezestat season; revert to the DDC Workbench in spring (the old
anchor is preserved in an HTML comment beside the badge). PR #644.
10. **Quiz wave 3 — six banks, two batches of three.** `building-pressure`,
`duct-static-control`, `vav-systems`, then `psychrometrics-basics`,
`hydronic-loops`, `load-piping` — freeze-season neighbours of the new
lesson first. Owner merges each bank PR.
11. **F4 case-file mockup — hold** until wave 3 is further along.
12. **#228 — step 0 + step 1 as stacked PRs.** Engine helpers
(`Psychro.mixAir` / `mixFraction`) + `tests/psychro-mixair.spec.js` +
the minor bump first; the psychrometric-chart page with its
before/after fixture stacked on it. Owner merges both; the child is
rebase-pushed after the parent lands (or rides #331's fix).
13. **Morning walk — combined LAN preview.** Every live-page PR merged
into one scratch tree, published to `cfdev.home.arpa`, with full-page
screenshots (dark + light) in the walk notes.
14. **DDC Workbench filter rack — redraw it tonight** with the pleated
idiom (the handoff verification found the Workbench's `#ahu-filter`
still drew the old parallel-line rack; §18.6's "site-wide" had
covered the three lesson racks only). PR #647.
15. **Session shape.** Owner: *"use Sonnet and Opus agents for mechanical
tasks, you judge if Opus is needed based on complexity. But use other
Fable agents for design tasks … let's try to frontload that into the
first 2 hours or so and then I'll want you to work after I go to
sleep."* Merge authority overnight: #330, #331 and the wrap-up docs PR
only; everything that reaches a live page waits for the walk.

**Overnight output (for the morning walk, in order):** #639 freeze band · #640 air-handlers pointer · #641 pid loops · #642 economizer lockout · #643 bacnet scope · #644 hero badge · #647 workbench filter rack · #650 building-pressure · #648 duct-static-control · #649 vav-systems · #651 psychro step 0 · #652 psych chart step 1 (stacked on #651) · #655 psychrometrics-basics · #654 hydronic-loops · #653 load-piping. Merged on the grant: #645 (#331), #646 (#330). Walk notes: `docs/audits/2026-10-reentry/walk-2026-10-07.md`.

**Process notes from the night.** (a) PR #645's `push: main` arm ran on
its own merge commit and on #646's and passed both times — the first
suite runs `main` has ever had. (b) A PR body edit now leaves a SKIPPED
`test` check beside the real one (codebase-issues #331 resolution). (c)
The quiz workflow's second refute round can leave an open item that the
Opus fixer then applies without a third refute; both wave-3 batch-1
open items were applied verbatim and are called out in the walk notes.
(d) Every lane reported at least one drifted line cite in the entry it
was fixing (the 2026-08-12 lesson, again).
Loading
Loading