Repository navigation
Session Handoff [default]: Env File Rename in Develop, Secret Readers Next After Hub #3534 #493
Copy link
Copy link
Open
Labels
handoffA link in the session handoff chain, one open issue per trackA link in the session handoff chain, one open issue per track
Description
Next steps, in priority order
- #553: carry the hub's secret readers. Step 1 is Declare host-secrets for Blog and Name It the Overlay's First Adopter ProjectTemplate#3534, which adds
host-secretsto Blog's registrytypes. It is open andCLEANinto hubdevelop, and the maintainer merges and promotes it. Once it reaches hubmain, from a feature worktree: runcarry.py applyto carrylib/shtolib/fleet/sh, then switchdeploy/make-release.shtorequire_secretandread_env_valueinstead ofset -a; . "$ENV_FILE". The env file names are already the underscore form from Rename the Host Env Files to the Fleet's Underscore-Joined Form #557. The docs describingset -asourcing (ENVIRONMENT.md,OPERATIONS.md"Configuration Layout",deploy/README.md,.secrets/example.env) change with it. Done means the hub'scarried-treescheck reads the copy as current andmake-release.shreads its env file only through the readers. - #549: retire the media parser fuzz gate. Unchanged from round 36. Remove the script, its tests, its validate-action step, and every doc describing it, with the reference sweep a deletion owes. Keep the media gate's own metadata and damage checks.
- Promote
developtomainwhen the maintainer asks. It holds resync Resync the Carried Instruction Set and Skills Tree With Hub f60f57d #556 and rename Rename the Host Env Files to the Fleet's Underscore-Joined Form #557. The promotion body lists Rename the Host Env Files to the Fleet's Underscore-Joined Form #550 as closing. No deploy is owed for either. - Run the next monthly 404 pass on or after 2026-11-23, per
OPERATIONS.md"Logs and Debugging", withstart='2026-10-23T15:42'. It needs a production-log go-ahead, asked in a dialog. Done means a comment here with the date range, the count left after filtering, and each finding's disposition. - #546 and #547, small conformance fixes, one pull request each.
- When the host side flips a VPS staging name to proxied, run the live check once with
EXPECT_SITE_ENVand report on ptr727/HomeAutomation-Config#580. #495 waits on a proxied host that can take a test release.
External blockers
- Declare host-secrets for Blog and Name It the Overlay's First Adopter ProjectTemplate#3534 must be merged and promoted to hub
mainby the maintainer before Read the Release Env File Through the Hub's Carried Readers #553 steps 2 and 3 can run. - Bring the Durable Knowledge Handoff Bullets Onto the Standing-Issue Lifecycle ProjectTemplate#3504, #3502, #3492, #3489, #3529 are the hub's. Nothing here waits on them.
- Production log and CrowdSec reads need the maintainer's go-ahead once per session.
- Script-injecting zone features stay off per ptr727/HomeAutomation-Config#1393.
Internal dependencies
- Read the Release Env File Through the Hub's Carried Readers #553 lands after Rename the Host Env Files to the Fleet's Underscore-Joined Form #557, which it did, so it reads the new env file names.
- Retire the Media Parser Fuzz Gate, Since Its Inputs Are Trusted #549 rides before any further edit to
OPERATIONS.md"Trust Boundaries". Remove the Incidental Counts From OPERATIONS.md #547 editsOPERATIONS.md, so it goes after Retire the Media Parser Fuzz Gate, Since Its Inputs Are Trusted #549 or mergesdevelopfirst. Read the Release Env File Through the Hub's Carried Readers #553 also editsOPERATIONS.md, so whichever of Retire the Media Parser Fuzz Gate, Since Its Inputs Are Trusted #549, Remove the Incidental Counts From OPERATIONS.md #547, and Read the Release Env File Through the Hub's Carried Readers #553 opens later mergesdevelopbefore pushing.
State
developis atb885743(Rename the Host Env Files to the Fleet's Underscore-Joined Form #557).mainis at1a4a86a, a Dependabot merge. Neither Resync the Carried Instruction Set and Skills Tree With Hub f60f57d #556 nor Rename the Host Env Files to the Fleet's Underscore-Joined Form #557 is promoted. Re-read both.- No release was dispatched this round. Local and VPS sites still serve the 1.0.271 pages.
- The Rename the Host Env Files to the Fleet's Underscore-Joined Form #557 worktree and its branch
chore/env-file-underscore-namesremain, local and remote, pending the cleanup dialog. - Hub: branch
registry/blog-host-secrets, PR Declare host-secrets for Blog and Name It the Overlay's First Adopter ProjectTemplate#3534 open into hubdevelop, held in a scratch hub clone of this session's. - The four host env files on the maintainer's workstation are renamed to
blog_<server>_<environment>.env. - The primary checkout is clean on
develop, though behindorigin/developuntil pulled. - Open issues besides this one: Read the Release Env File Through the Hub's Carried Readers #553, Rename the Host Env Files to the Fleet's Underscore-Joined Form #550 (closes on promotion), Retire the Media Parser Fuzz Gate, Since Its Inputs Are Trusted #549, Remove the Incidental Counts From OPERATIONS.md #547, Let the Read Be the Check in the checks/ Gates That Probe First #546, Measure no-transform Behind Cloudflare Before the Page Classes Carry It #495.
The parked decision queue
Empty. No open issue carries decision.
What the last round did
- Round 36 ended before Resync the Carried Instruction Set and Skills Tree With Hub f60f57d #556 was written. The fifth resync then merged as Resync the Carried Instruction Set and Skills Tree With Hub f60f57d #556 against hub
f60f57d, carrying the env file naming rule intoCODESTYLE.md, and it left Rename the Host Env Files to the Fleet's Underscore-Joined Form #550 and Read the Release Env File Through the Hub's Carried Readers #553 open as follow-ups. - This round: #557 renamed every env file reference to
blog_<server>_<environment>.envand merged intodevelop. The host files were renamed. Opened Declare host-secrets for Blog and Name It the Overlay's First Adopter ProjectTemplate#3534 for Read the Release Env File Through the Hub's Carried Readers #553 step 1, which also corrected the conformance matrix'shost-secretsrow, since it had named a repository that does not declare the type.
What not to repeat
- Assuming
carry.py applycan carry a tree a repository has not declared. It selectslib/shby the registry'stypes, so a hub registry change comes before any Blog-side carry, and that change waits on a hub promotion. - Updating the hub's
reports/blog/audit.mdin a registry PR. A reviewer asked for it on #3534 and it was declined with evidence. The report is the 2026-08-05 run, already older than thepythontype, and a run replaces it whole from a hub-side audit. - Everything in earlier rounds' "What not to repeat" still applies.
New learnings
- None beyond the two entries above, which are attempt-specific.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
handoffA link in the session handoff chain, one open issue per trackA link in the session handoff chain, one open issue per track
Activity
ptr727 commentedon Oct 23, 2026
Round 25, closed 2026-10-23: Session Handoff [default]: Periodic 404 log review, monthly from 2026-11-23
Next steps, in priority order
start='2026-10-23T15:42', where this pass ended. It runschecks/log-review.jqover the joined window.403s with "A 403 is CrowdSec's until shown otherwise", and check any crawler403or404by forward-confirmed DNS.404on/news-sitemap.xmlis a regression, and so is one onviljoen.family/robots.txt,/sitemap.xml,/tag/review,/viljoen-family, or/20180811_172609507_ios.404cluster beside502s is the edge restarting. Leave it alone, per the new paragraph under "The log is three tiers".checks/log-review.jqin the same change that records the pass.External blockers
sitemap.xmlonce this window, where the previous window saw none. Whether both sitemaps are submitted in Google Search Console is visible only there.302/307) on both sites. Host-side, filed as ptr727/HomeAutomation-Config#1077, and that session left it in its backlog.Internal dependencies
State
Folded track:
log-reviewwas issue Session Handoff [log-review]: Periodic 404 Log Review, Monthly From 2026-11-23 #491, closed into this standingdefaultissue.mainis at997bdb0(Promote the News Sitemap Redirect #490), anddevelopis at1861c43(Redirect the Old News Sitemap to sitemap.xml #489). Release 1.0.258 is published.1.0.258 is deployed to VPS production by run 39996345850 as release
20261023-173814-39996345850-1, and/news-sitemap.xmlanswers 301 there. The local production mirror serves997bdb0and passed all 1294 URLs. VPS staging was not redeployed. Re-read each site'sX-Blog-Releaserather than trusting this line.No feature branches or worktrees are left. The primary checkout is on
developand clean.The local staging mirror serves a test build of Redirect the Old News Sitemap to sitemap.xml #489's branch, release
0a1593a-news2, which matchesdevelop's Caddyfile and contract.ptr727/HomeAutomation-Config#893, #894 and #1077 are open, and all three belong to the HomeAutomation-Config session.
The parked decision queue
Zero issues carry
decision. This round asked four questions as it went, all answered: run the pass early with the production-read go-ahead, the news-sitemap redirect and the route-loss note, the #489 merge, and the #490 merge and release.What the last round did
/news-sitemap.xmlto/sitemap.xmlthrough a@news_sitemapclass (contract now 956 URLs), names/sitemap.xmlamong the sampled fixed destinations, and records in OPERATIONS.md that a routerless https404beside502s is the edge restarting. Merged into develop.--print-sampleuntilSAMPLE_MAX_PATHSincheck-live-urls.shandMAX_PATHSin its test move together, or a class is folded.What not to repeat
deploy/maps/slugs.map.capture/build-redirects.pyrewrites it from the capture, and its filter never emits a one-slash key, so a fixed root-file redirect goes in the Caddyfile as its own exact-path class, the way/atom.xmland now/news-sitemap.xmldo. The first strict review pass caught this after a staging check had already passed, since staging cannot see a future regeneration./news-sitemap.xmlthat way, and it was served for two years. Run the CDX query before dropping any name a real crawler polls.checks/README.md,deploy/README.md, and OPERATIONS.md each describeSAMPLE_DESTINATIONS, and Copilot found the first while the strict review found the other two. A change to that array edits all three.New learnings
404on a served hostname beside502s is the edge restarting nightly or during a daytime host-side push, per the maintainer, and needs no action. Recorded in OPERATIONS.md "The log is three tiers".pieter.viljoen.nameis a registrar-level redirector that forwards its path to the blog, so a probe against it lands on the blog as a referer-bearing404. Nothing to fix here, and the referer is the tell.gh-write-guardhook refuses agit -C "$var"and agit commit -F "$var"shape even in a linked worktree. Write the path out in full, or put the probe in a script run withbash <path>.[-]Session Handoff [default]: Periodic 404 log review, monthly from 2026-11-23[/-][+]Session Handoff [default]: Promote the Cache Lifetimes, Then the Monthly 404 Pass From 2026-11-23[/+]ptr727 commentedon Oct 24, 2026
viljoen.family went behind the Cloudflare proxy at 2026-10-24T01:47Z (ptr727/HomeAutomation-Config#580). The blog hostnames are still DNS-only and flip later.
Zone settings applied before the flip, per the host side: SSL Full (strict), Browser Cache TTL "Respect Existing Headers", and Always Use HTTPS, Automatic HTTPS Rewrites, Browser Integrity Check, Bot Fight Mode, Rocket Loader, Email Address Obfuscation, Hotlink Protection, and edge HSTS all off.
Step 3 is done for the family pilot.
checks/check-live-urls.shran against production at 2026-10-24T01:49Z withSAMPLE_CONTRACT=1andEXPECT_SITE_ENV=production, from develop at 070b7ab. It passed 33 sampled URLs. The family pages answeredserver: cloudflarewithX-Blog-Env: production.server: cloudflareand acf-rayheader are present.Cache-Controlyet, and Cloudflare reports themDYNAMIC.crest.svgkeeps its week and reportsMISSon the first request. The cache lifetimes arrive with promotion Promote the Edge Proxy Cache Lifetimes #494.ClientHoston viljoen.family lines as a forwarded chain.checks/log-review.jqalready keeps its last element. A cached file type there is answered at the edge, so its count is a floor.ptr727 commentedon Oct 24, 2026
Round 26, closed 2026-10-23: Session Handoff [default]: Promote the Cache Lifetimes, Then the Monthly 404 Pass From 2026-11-23
Next steps, in priority order
developtomainand release when the maintainer wants the cache headers live. #492 changeddeploy/Caddyfile, so this is a deploy, not a docs-only promotion: open thedevelop -> mainpromotion PR, release, deploy VPS production, and runmake-release.shagainst the local production mirror. Until then production and the local production mirror serve noCache-Control.start='2026-10-23T15:42', where the last pass ended. It runschecks/log-review.jqover the joined window, which now rewritesClientHostto the last forwarded address, so a proxied line reads correctly without a hand step.403s with "A 403 is CrowdSec's until shown otherwise", whose snippet reads the last forwarded address the same way, and check any crawler403or404by forward-confirmed DNS.404on/news-sitemap.xmlis a regression, and so is one onviljoen.family/robots.txt,/sitemap.xml,/tag/review,/viljoen-family, or/20180811_172609507_ios.404cluster beside502s is the edge restarting. Leave it alone, per "The log is three tiers".checks/log-review.jqin the same change that records the pass.checks/check-live-urls.shagainst production once withEXPECT_SITE_ENVset, and read cached media counts in the next 404 pass as a floor, per the new paragraph under "The log is three tiers". Nothing here flips the proxy, and the Blog's readiness findings are a comment on that issue.External blockers
301rather than carrying the old finding forward.Internal dependencies
404. Promote before the pilot flips the blog, or accept that window.State
mainis at997bdb0(Promote the News Sitemap Redirect #490), anddevelopis at070b7ab(Name a Cache Lifetime on Every Response Ahead of an Edge Proxy #492). Release 1.0.258 is published and is what production and the local production mirror serve. Re-read each site'sX-Blog-Releaserather than trusting this line.1e1d6c4-cfprep3, a test build of Name a Cache Lifetime on Every Response Ahead of an Edge Proxy #492's branch one comment-only commit before its merge, so its behavior matchesdevelop. It passed all 1294 URLs and served the documentedCache-Controlper class, redirects included.developatorigin/developand clean.log-reviewwas issue Session Handoff [log-review]: Periodic 404 Log Review, Monthly From 2026-11-23 #491, closed into this standingdefaultissue.The parked decision queue
Zero issues carry
decision. This round asked one question as it went, the #492 merge intodevelopwith cleanup, answered yes. One judgment call is recorded rather than asked: the media lifetime is one hour, chosen so a redacted image leaves every copy within the hour without a purge step, and a longer value is a one-line change indeploy/Caddyfileif origin revalidation ever matters.What the last round did
Cache-Control,no-cachefor pages, feeds, sitemaps,index.json,robots.txt, redirects, and both error pages, a year immutable for the fingerprinted assets, an hour for media and the root icons, andno-cacheon the family pages.checks/log-review.jqkeeps the last element ofClientHost. OPERATIONS.md names Cloudflare as a tier above Traefik and what it hides, anddeploy/README.mdgained "Cache lifetimes". Three local staging releases, five local strict review passes (seven findings fixed across them, none left open), one Copilot round whose single finding moved the baseline header ahead of the redirects. Squash-merged intodevelop.What not to repeat
routeblock. Aredirends the route, so a header after it never reaches a redirect response. Copilot caught it after three local passes had read the block.cat -Afirst.$varword anywhere ingh pr merge, and a>/dev/nulltail on anyghwrite. The guard refuses both before anything runs. Read the SHA in its own call and write it out literally, and let a write print its result.python3 -I.pr_review.pyimportsgh_graphqlfrom its own directory, and-Idrops that path. Reserve-Ifor a script that reads untrusted downloads.ClientHostguards as hardening against input the deployment never produces. Check what the producer guarantees before guarding.deploy/maps/slugs.map, no dropping a sitemap or feed name without a Wayback check, no appending to a line holding a pre-existing over-long sentence, and the three sampled-destination sentences move together.New learnings
ClientHostto the wholeX-Forwarded-Forheader when one survives the entry point's trust filter, so behind Cloudflare it is a chain whose last element is the address Cloudflare saw. Recorded in OPERATIONS.md "The log is three tiers".404on a cacheable extension for three minutes, cachesrobots.txt, and stores nothing markedno-cachewhile Origin Cache Control is off. The free plan shows aggregates and a sample, never a per-request log.headerinsideroutekeeps file order and its default operation replaces an earlier value, and aheaderinhandle_errorsoverrides whatever lifetime a matched class gave the request, verified on the local staging mirror.gh issue list --searchon a sibling repository finds a standing issue a fresh request would duplicate. Search before filing, and comment instead.[-]Session Handoff [default]: Promote the Cache Lifetimes, Then the Monthly 404 Pass From 2026-11-23[/-][+]Session Handoff [default]: Proxied-Run Check in OPERATIONS.md, Then the Monthly 404 Pass From 2026-11-23[/+]ptr727 commentedon Oct 24, 2026
blog.insanegenius.com went behind the Cloudflare proxy at 2026-10-24T14:26:46Z (ptr727/HomeAutomation-Config#580). The two VPS staging names are still DNS-only.
The host side applied these insanegenius.com zone settings before the flip: SSL Full (strict), Browser Cache TTL "Respect Existing Headers", and Caching Level Standard. Always Use HTTPS, Automatic HTTPS Rewrites, Browser Integrity Check, Bot Fight Mode, Rocket Loader, Email Address Obfuscation, Hotlink Protection, and edge HSTS are all off.
Step 3 is done for this hostname. This machine's resolver kept answering with the origin until 14:30:40Z, about four minutes after the flip. Once
server: cloudflareandcf-rayappeared,checks/check-live-urls.shran against production at 14:30Z, from develop at f35ec08, withSAMPLE_CONTRACT=1andEXPECT_SITE_ENV=production. It passed 33 sampled URLs, against release20261024-135159-40099784378-1(1.0.259).Cloudflare cache status per class, read once each after the run:
/and/feed.xmlDYNAMIC/robots.txtREVALIDATED/favicon.icoMISSMISSHIT?live-check=queryMISSThe last row is #496's per-run query doing its job: the edge copy cannot answer for a media file a release lost.
For the next monthly 404 pass, both production hostnames are now proxied.
ClientHoston their lines is a forwarded chain, whichchecks/log-review.jqalready reads by its last element, and counts on cached file types are a floor.ptr727 commentedon Oct 24, 2026
New next step, ranked first: #497. The blog site block sends no HSTS,
nosniff, orReferrer-Policy, while the family block sends all three. The host side found it while measuring blog.insanegenius.com through the proxy, and a live read confirms it. Add the three headers to the blog baseline with the family values, verify every class on local staging, and release. Done means #497 is closed with the headers live on production.ptr727 commentedon Oct 24, 2026
Round 27, closed 2026-10-24: Session Handoff [default]: Proxied-Run Check in OPERATIONS.md, Then the Monthly 404 Pass From 2026-11-23
Next steps, in priority order
server: cloudflarewith acf-rayheader. Right after the viljoen.family flip, this machine's resolver still answered with the origin for about two minutes while DNS over HTTPS answered with Cloudflare. Add that sentence where OPERATIONS.md describes hand runs against production, in a small docs PR. Done means it is merged intodevelop. It needs no release on its own.start='2026-10-23T15:42', where the last pass ended.checks/log-review.jqkeeps the last element ofClientHost, so a proxied viljoen.family line reads correctly without a hand step.403s with "A 403 is CrowdSec's until shown otherwise", and check any crawler403or404by forward-confirmed DNS.404on/news-sitemap.xmlis a regression, and so is one onviljoen.family/robots.txt,/sitemap.xml,/tag/review,/viljoen-family, or/20180811_172609507_ios.404cluster beside502s is the edge restarting. Leave it alone.checks/log-review.jqin the same change that records the pass.checks/check-live-urls.shagainst it once withEXPECT_SITE_ENVset (SAMPLE_CONTRACT=1for production), after confirming the proxy headers per step 1. Report the result to the HomeAutomation-Config session on ptr727/HomeAutomation-Config#580.no-transformbehind Cloudflare once a proxied host can serve a test release. Add it to the page classes only if a client that does not accept Brotli receives a body it can read.External blockers
no-transform. Bot Fight Mode cannot be written through the API on the family zone, so the dashboard toggle is the fix if it drifts.?live-check=query does not touch the crawl budget.Internal dependencies
State
mainis at6cda25d(Promote the Edge Proxy Cache Lifetimes #494), anddevelopis atf35ec08(Defeat the Edge Cache in the Media Check and Name the Zone Settings #496). Release 1.0.259 is published, and the VPS production deploy (run 40099784378) and the local production mirror both serve it. Re-read each site'sX-Blog-Releaserather than trusting this line.f31c0c5, a test build of Defeat the Edge Cache in the Media Check and Name the Zone Settings #496's branch before its last docs-only commit.developatorigin/developand clean.The parked decision queue
Zero issues carry
decision. This round asked four questions as it went, each answered: drive #494 to merge and release, do the follow-up PR in this session, dropno-transformpast the edit budget and file it as #495, and merge and release #494 although its last Copilot round stated no coverage.What the last round did
main, released 1.0.259 to the GitHub release, VPS production, and the local production mirror (1294 URLs).?live-check=query on the first request and the legacy hop. The blog error page serves precompressed siblings.deploy/README.mdnames the Browser Cache TTL and Caching Level dependencies, qualifiesclient_ipbehind Cloudflare, and uses reference-style links throughout. OPERATIONS.md corrects therobots.txtandclient_ipsentences.What not to repeat
no-transformon the strength of the Email Obfuscation doc alone. The third strict pass found that Cloudflare's compression doc leaves undefined what happens for a client that does not accept Brotli. It cost a fourth pass and a revert. Measure no-transform Behind Cloudflare Before the Page Classes Carry It #495 holds the measurement.?. No input reaches that branch, since the media list holds no query and Caddy'sredir @uploadsdrops one. The second pass flagged it as dead code.no-cachekeeps a response "from being stored". It allows storage and requires revalidation. Copilot caught it on Defeat the Edge Cache in the Media Check and Name the Zone Settings #496.deploy/README.md. That file now uses reference-style links, per the fleet rule. Only AGENTS.md, GOVERNANCE.md, OPERATIONS.md, and the Copilot file keep inline ones.ccr-overview-v2headline as a finding list. On Promote the Edge Proxy Cache Lifetimes #494 both rounds named concerns with no file or line. Answer each against the head withpr_review.py comment, then ask the maintainer about the unstated coverage.$varingh pr merge.New learnings
no-transform. Recorded indeploy/README.md"Cache lifetimes" and Measure no-transform Behind Cloudflare Before the Page Classes Carry It #495.client_ipis the leftmost forwarded address, which a client can write. Recorded in OPERATIONS.md anddeploy/README.md"Trusting the proxy".http-logsparser strips the query before deriving the file extension, measured by the host side. This line is its only record here, since the Blog depends on it only through the live check's query.[-]Session Handoff [default]: Proxied-Run Check in OPERATIONS.md, Then the Monthly 404 Pass From 2026-11-23[/-][+]Session Handoff [default]: Monthly 404 Pass From 2026-11-23, Then Header Assertions (#500)[/+]ptr727 commentedon Oct 24, 2026
Round 28, closed 2026-10-24: Session Handoff [default]: Monthly 404 Pass From 2026-11-23, Then Header Assertions (#500)
Next steps, in priority order
start='2026-10-23T15:42', where the last pass ended.ClientHoston their lines is a forwarded chain, whichchecks/log-review.jqreads by its last element. A cached file type is answered at the edge, so its count is a floor, per "The log is three tiers".403s with "A 403 is CrowdSec's until shown otherwise", and check any crawler403or404by forward-confirmed DNS.404on/news-sitemap.xmlis a regression, and so is one onviljoen.family/robots.txt,/sitemap.xml,/tag/review,/viljoen-family, or/20180811_172609507_ios.404cluster beside502s is the edge restarting. Leave it alone.checks/log-review.jqin the same change that records the pass.checks/check-live-urls.sh. Its comment adds a second part: printserverandcf-rayfrom the preflight, so a hand run shows whether it went through Cloudflare. If that lands, shorten the OPERATIONS.md "Deploying" probe paragraph to point at the preflight line. Done means a unit case fails on a missing header and the live check passes on staging.Content-Security-Policy-Report-Onlyon local staging first. Whether to enforce it is the maintainer's call, so ask before shipping one.checks/check-live-urls.shonce withEXPECT_SITE_ENV, and report on ptr727/HomeAutomation-Config#580.no-transformbehind Cloudflare once a proxied host can take a test release.External blockers
no-transform. Edge HSTS stays off, perdeploy/README.md"Security headers".Internal dependencies
State
mainis at9f5cad7(Promote Consistent Site Security Headers and the Proxied-Run Check #502), anddevelopis at64b8793(Print a Proxied Verdict for Every Host the Check Reaches #503). Release 1.0.260 is published. The VPS staging deploy (run 40111059572), the VPS production deploy (run 40111525117), and the local production mirror all serve it. Re-read each site'sX-Blog-Releaserather than trusting this line.5ff25e7, a test build of Send the Same Security Headers and Image Lifetime From Both Sites #499's branch whose served config matchesmain.developatorigin/developand clean.The parked decision queue
Zero issues carry
decision. This round asked four questions, and each was answered: squash-merge #498 and #499, squash-merge #503, merge and release #502, and post the release note on ptr727/HomeAutomation-Config#580.What the last round did
nosniff, andReferrer-Policywith the family values, and the family SVG, PNG, and ICO take the one-hour image class.deploy/README.mdgains "Security headers" and gives the reason for each difference that stays (family-only CSP, family CSS and JSno-cache).<host> proxiedonly onserver: cloudflarepluscf-ray, and<host> UNCONFIRMEDotherwise. This was the previous round's step 1.What not to repeat
NOT proxiedmatches a test forproxied. Use disjoint words (UNCONFIRMED).<<<in a block fencedsh. Copilot flags it as bash-only. Useprintf '%s\n' "$h" | grep.waitexited 50 on its headline. Answer each headline withpr_review.py comment.replyreturnedNO_MATCH. Answer withcommentinstead.git pushwith other commands in one Bash call. The write guard refuses the whole command. Push with an explicit refspec as its own call.New learnings
deploy/README.md"Security headers" and "Cache lifetimes".[-]Session Handoff [default]: Monthly 404 Pass From 2026-11-23, Then Header Assertions (#500)[/-][+]Session Handoff [default]: Settle the Staging Crawl Ban (#510), Then Deploy 1.0.263 and the 404 Pass From 2026-11-23[/+]ptr727 commentedon Oct 24, 2026
Parked decision queue at the round 29 close: one issue, #510. Put to the maintainer, who answered: decide later, since the route is for HomeAutomation-Config and the VPS deployment to decide, with Blog as one party, and the site should not get trapped by CrowdSec where Cloudflare covers the same protection. Filed as ptr727/HomeAutomation-Config#1374, and that repository's session was messaged. Step 1 therefore waits on #1374's outcome rather than on a Blog-side choice, and #510 keeps its decision label until then.
ptr727 commentedon Oct 25, 2026
Round 29, closed 2026-10-24: Session Handoff [default]: Settle the Staging Crawl Ban (#510), Then Deploy 1.0.263 and the 404 Pass From 2026-11-23
Next steps, in priority order
SAMPLE_CONTRACT=1for VPS staging in the deploy hook and update OPERATIONS.md "Deploying", which says staging proves the whole contract. A host-side exemption goes to ptr727/HomeAutomation-Config. Done means a VPS staging deploy passes, then production deploys and its sampled check passes through Cloudflare.start='2026-10-23T15:42', where the last pass ended. Both production names are proxied, soClientHostis a forwarded chain thatchecks/log-review.jqreads by its last element. Cached file types are answered at the edge, so their counts are a floor. Cross-check403s with "A 403 is CrowdSec's until shown otherwise", and run "Checking that search engines can index both sites". Done means a comment on this issue with the date range, the count left after filtering, and each finding's disposition.Content-Security-Policy-Report-Onlyon local staging first. Adding a blog CSP means adding its row tochecks/security-headers.txt, since the sync case refuses a Caddyfile header the file lacks. Whether to enforce it is the maintainer's call.EXPECT_SITE_ENVand read its<host> proxiedline, then report on ptr727/HomeAutomation-Config#580.no-transformbehind Cloudflare once a proxied host can take a test release.External blockers
no-transform. The home-network CrowdSec allowlist is still ptr727/HomeAutomation-Config#893, so keep production probes to a handful per pass.Internal dependencies
State
mainis at83e7bae(Dependabot Bump the actions-deps group with 5 updates #509), which contains promotion Promote the Security Header Assertions in the Live Check #505. Release 1.0.263 is published from it.developis at5eae753(Dependabot Bump the actions-deps group with 5 updates #508).X-Blog-Releaserather than trusting this.5ff25e7, whose served config matchesmain.developatorigin/developand clean.decision), Survey What Blog Posts Load Before a Blog Content-Security-Policy #501, Measure no-transform Behind Cloudflare Before the Page Classes Carry It #495.The parked decision queue
One issue carries
decision: #510, filed this round, and put to the maintainer at this close.What the last round did
checks/check-live-urls.shasserts the exact values inchecks/security-headers.txton every response it requests, and prints<host> proxiedor<host> UNCONFIRMEDper host. A unit case holds the file todeploy/Caddyfilethroughcaddy adaptin a Caddy imagechecks/caddy/Dockerfilepins. Dependabot's newdockerentries track that pin. The maintainer chose Docker after a hand-written reader kept missing directive forms.404is probed too.mainand the merge bot dispatched its own release, which published 1.0.263 with the promotion in it.What not to repeat
match { status }, scoped deletions). Runningcaddy adaptand walking its JSON ended it. CODESTYLE "Parsing Structured Formats" already says this.deploy-site.ymlis a separate dispatch per environment.mainmakes the merge bot dispatch its own release, which supersedes a manual one mid-publish. Readgh run listfor a newer run on a latermainbefore dispatching again.ENTRYPOINT, and a local pass claimed%header{}joins repeated headers. Both were false:docker image inspectshows no entrypoint, and curl 8.14 prints only the first copy.New learnings
404probes, and the Docker-based sync case are described inchecks/README.md"security-headers.txt, and why every response's headers are read".[-]Session Handoff [default]: Settle the Staging Crawl Ban (#510), Then Deploy 1.0.263 and the 404 Pass From 2026-11-23[/-][+]Session Handoff [default]: Crawl Exemption Live, 1.0.263 Deployed Everywhere, 404 Pass From 2026-11-23 Next[/+]9 remaining items
ptr727 commentedon Oct 25, 2026
Parked decision queue at the round 33 close: empty, with no open issue carrying
decision. Two questions were put to the maintainer this round and answered. The every-fetch gate extends the CSP gate, recorded on #529. Promotion #534 was to be merged, released, and deployed, which is done: 1.0.271 runs on all four sites.🤖 Generated with Claude Code
ptr727 commentedon Oct 26, 2026
Round 33, closed 2026-10-25: Session Handoff [default]: Self-Hosted Fonts and Every-Fetch CSP Gate Live in 1.0.271, 404 Pass From 2026-11-23 Next
Next steps, in priority order
start='2026-10-23T15:42'. Both production names are proxied, soClientHostis a forwarded chain thatchecks/log-review.jqreads by its last element, and counts for cached file types are a floor. 1.0.271 moved the blog's font to/fonts/lexend/and dropped the Google links, so a404under/fonts/is new, and so is a reader hitting an old Google URL. The pass needs a production-log go-ahead, asked in a dialog. Done means a comment here with the date range, the count left after filtering, and each finding's disposition./search/out of a browser check run over another URL list, so a family-only run passes on its own pages. Done meanscheck-csp-browser.py --urlsover/en/and/af/against the family mirror passes.checks/.EXPECT_SITE_ENVand report on ptr727/HomeAutomation-Config#580. #495 waits on a proxied host that can take a test release.External blockers
coverage=none. The maintainer said on 2026-10-25 that large numbers of non-code files will never be reviewed by Copilot. That settled Promote the Self-Hosted Fonts, the Every-Fetch CSP Gate, and the Restored Images to Main #534's merge, and it is not a standing rule for the next pull request.Internal dependencies
checks/, in different files, so they can land in either order.State
mainis at75fc00e(promotion Promote the Self-Hosted Fonts, the Every-Fetch CSP Gate, and the Restored Images to Main #534), anddevelopis ataa0af50. Re-read both.75fc00eand deployed everywhere:20261025-233058-40244884709-1, passed the full contract, 1296 URLs20261025-233520-40245223351-1, passed 35 sampled URLs with both names proxied75fc00e, each passed 1296 URLsstyle-src 'self' 'unsafe-inline'; font-src 'self'.develop, and the cleanup sweep reported nothing.The parked decision queue
Empty, with no open issue carrying
decision. #513's label came off this round once the maintainer's Drive held all 95 originals. Two questions were asked and answered in the session: the gate's design, recorded on #529, and #534's scope, merge, release, and deploy.What the last round did
woff2subsets with itsOFL.txt. Both policies dropped the Google hosts, and the fonts joined the one-hour cache class.checks/check-csp-scripts.pytochecks/check-csp.pyand extended it. It now checks every fetch on both sites against each site's own policy, and fails where a policy names a host. The maintainer chose this over a separate local-only check.check-live-urls.shasserts each site's own headers on its responses, before any Caddyfile pull request and in every deploy. Merged, released as 1.0.271, and deployed to all four sites.What not to repeat
pathmatcher with a wildcard mid-path, such as/fonts/*.woff2, matches nothing, and the files silently keep the defaultno-cache. Use a prefix,/fonts/*, and readCache-Controlback from the mirror rather than trusting the matcher.pr_review.py cleanup. The remote branch deletes, then the local half stops on a locked directory.cdout first, then rerun cleanup.--argtogh --jq.ghhas no such flag and reads it as a subcommand. Interpolate the value into the expression instead.--urls. It also requests/search/and fails there (Leave /search/ Out of a Browser Check Run Over Another URL List #535). Read only the family pages' own results.New learnings
checks/check-csp.py's docstring anddeploy/README.md"Security headers". The fonts' layout is insites/viljoen.family/README.md"Page Design" andthemes/README.md.[-]Session Handoff [default]: Self-Hosted Fonts and Every-Fetch CSP Gate Live in 1.0.271, 404 Pass From 2026-11-23 Next[/-][+]Session Handoff [default]: Fleet snake_case Python Names and Browser Check URL Lists in 1.0.273, 404 Pass From 2026-11-23 Next[/+]ptr727 commentedon Oct 26, 2026
Parked decision queue at the round 34 close: empty. #538 was put to the maintainer and answered: keep
checks/andscripts/, since they differ by Python profile. Recorded on #538, which is closed with itsdecisionlabel removed. The body's step list does not change.ptr727 commentedon Oct 26, 2026
Round 34, closed 2026-10-26: Session Handoff [default]: Fleet snake_case Python Names and Browser Check URL Lists in 1.0.273, 404 Pass From 2026-11-23 Next
Next steps, in priority order
start='2026-10-23T15:42'. Both production names are proxied, soClientHostis a forwarded chain thatchecks/log-review.jqreads by its last element, and counts for cached file types are a floor. 1.0.271 moved the blog's font to/fonts/lexend/, so a404under/fonts/is new, and so is a reader hitting an old Google Fonts URL. The pass needs a production-log go-ahead, asked in a dialog. Done means a comment here with the date range, the count left after filtering, and each finding's disposition.--helpand refuses an unknown argument, and so doesdeploy/make-release.sh. Start withmake-release.sh, which reads--helpas its deploy root and starts a release. Done means each script on the issue's list answers-hand--helpbefore any read, and a test covers it.RESYNC.md. Blog'sCODESTYLE.mdlacks the file-name and command-line rules that Rename Every Python File to the Fleet's snake_case Names #537 and Answer --help and Refuse Unknown Arguments in Every Python Script #539 apply. Done means the audit's findings are applied and its report is filed hub-side..github/copilot-instructions.mdfor E402, throughcopilot-instructions-keeper. On Promote the Browser Check's URL Lists and the snake_case Python Names to Main #541, Copilot claimed ruff refuses an import aftersys.path.insert. Blog's ruff config does not select E402, and every test now uses that pattern, so the claim will recur. Fold it into step 3 if that lands first.EXPECT_SITE_ENVand report on ptr727/HomeAutomation-Config#580. #495 waits on a proxied host that can take a test release.External blockers
coverage=none.Internal dependencies
--helphandling follows the command-line rule, which step 3 brings into this repository's ownCODESTYLE.md. Neither blocks the other.State
mainis atf937194(promotion Promote the Browser Check's URL Lists and the snake_case Python Names to Main #541), anddevelopis at9bd721a. Re-read both.f937194by publish-release run 40252335132. No deploy is owed, since nothing the server sends changed.9bd721a, which passed the full contract with 1296 URLs. Local production and the VPS sites still run 1.0.271, which serves the same pages and headers.develop, and the cleanup sweep reported nothing..pyis snake_case now, and gates take_gate, sochecks/check-csp.pyischecks/csp_gate.py. Earlier rounds' text names the old files.The parked decision queue
One issue, #538: whether
checks/andscripts/converge on one directory. The hub session's view, recorded there, is to keep the split, because the two directories differ by Python profile rather than by purpose. The recommendation is to keep both and close #538 on that reason.What the last round did
/search/only on a run over the default list, and a--urlslist naming no page is a usage error, which Copilot found..pyfile is renamed to snake_case with a_gatesuffix, siblings import by name, and tests insert their directory onsys.path, as the hub's do. The first version, a sharedchecks/sibling.pyloader, broke direct test runs and was replaced.What not to repeat
--helpbefore reading its usage header.deploy/make-release.sh --helpstarted a release against the local production environment from the primary checkout. It stopped during the build when the pipe closed, and installed nothing (Answer --help and Refuse Unknown Arguments in Every Python Script #539).ruff check --fixorruff formatovercapture/. That directory is not declared, it is not ruff-clean, and the fix rewrote pre-existing code. Lint only the declaredchecks/andscripts/.New learnings
sys.path.insertpasses the CI gate. The evidence is on Promote the Browser Check's URL Lists and the snake_case Python Names to Main #541's two threads.[-]Session Handoff [default]: Fleet snake_case Python Names and Browser Check URL Lists in 1.0.273, 404 Pass From 2026-11-23 Next[/-][+]Session Handoff [default]: Script --help Handling in 1.0.276, 404 Pass From 2026-11-23 Next[/+]ptr727 commentedon Oct 26, 2026
Parked decision queue at the round 35 close: empty, with no open issue carrying
decision. Four questions were put to the maintainer this round and answered. #542 was to be squash-merged into develop, and #545 merged and released, which is done as 1.0.276 with no deploy owed. The #542 cleanup ran, and the sweep found nothing. The hub was to get an issue for a carried CLI-usage harness, filed as ptr727/ProjectTemplate#3502.ptr727 commentedon Oct 26, 2026
Round 35, closed 2026-10-26: Session Handoff [default]: Script --help Handling in 1.0.276, 404 Pass From 2026-11-23 Next
Next steps, in priority order
start='2026-10-23T15:42'. Both production names are proxied, soClientHostis a forwarded chain thatchecks/log-review.jqreads by its last element, and counts for cached file types are a floor. 1.0.271 moved the blog's font to/fonts/lexend/, so a404under/fonts/is new, and so is a reader hitting an old Google Fonts URL. The pass needs a production-log go-ahead, asked in a dialog. Done means a comment here with the date range, the count left after filtering, and each finding's disposition.RESYNC.md. Blog'sCODESTYLE.mdlacks the file-name and command-line rules that Rename Every Python File to the Fleet's snake_case Names #537 and Answer --help and Refuse Unknown Arguments in Every Script #542 now apply. Done means the audit's findings are applied and its report is filed hub-side..github/copilot-instructions.mdfor E402, throughcopilot-instructions-keeper. On Promote the Browser Check's URL Lists and the snake_case Python Names to Main #541, Copilot claimed ruff refuses an import aftersys.path.insert. Blog's ruff config does not select E402, and the tests use that pattern, so the claim will recur. Fold it into step 2.EXPECT_SITE_ENVand report on ptr727/HomeAutomation-Config#580. #495 waits on a proxied host that can take a test release.External blockers
checks/tests/test_cli_usage.pycan be replaced by the carried one. Nothing here waits on it.coverage=none.Internal dependencies
State
mainis at2e51a27(promotion Promote Script --help and Unknown-Argument Handling to Main #545), anddevelopis atb18f7cc. Re-read both.2e51a27by publish-release run 40344294169. No deploy is owed, since nothing the server sends changed.851dd6b, which passed the full contract with 1296 URLs. Local production and the VPS sites still run 1.0.271, which serves the same pages and headers.develop, and the cleanup sweep reported nothing.The parked decision queue
Empty. No open issue carries
decision.What the last round did
--helpand-h, including after another argument, and refuses an unknown argument before any read.deploy/make-release.shchecks its arguments before it sources an environment file.checks/tests/test_cli_usage.pydiscovers every tracked executable and holds it to the rule under stubbed commands and empty scratch directories.What not to repeat
checks/CI runs bareuvx coverage, with no Pillow or PyYAML, so afind_specskip there would have skippedredact_media.pyandclean_content.pyon every run. The fix was in the scripts: parse before reporting a missing module.tryimport that leaves names unbound for pyright. Setting a flag in theexceptbranch made pyright report every Pillow name as possibly unbound. Theexceptbranch now parses and exits itself, so every path that continues has the names bound.--help. Copilot caughtcheck-live-urls.sh extra --helprefused as an extra argument. Scan every argument for help first.New learnings
BEFORE_FLAGfollows that.[-]Session Handoff [default]: Script --help Handling in 1.0.276, 404 Pass From 2026-11-23 Next[/-][+]Session Handoff [default]: Fleet Resync in 1.0.277, Fuzz Gate Retirement and 404 Pass Next[/+]ptr727 commentedon Oct 26, 2026
Parked decision queue at the round 36 close: empty, with no open issue carrying
decision. Questions put to the maintainer this round, and their answers:OPERATIONS.md"Trust Boundaries", and Retire the Media Parser Fuzz Gate, Since Its Inputs Are Trusted #549 retires the gate.develop, and promotion Promote the Fleet Instruction Set Resync to Main #552 merged and released. Done as 1.0.277, with no deploy owed.The env-file naming question was settled on the hub side as ptr727/ProjectTemplate#3503, with Blog's rename tracked in #550.
🤖 Generated with Claude Code
ptr727 commentedon Oct 27, 2026
Round 36, closed 2026-10-26: Session Handoff [default]: Fleet Resync in 1.0.277, Fuzz Gate Retirement and 404 Pass Next
Next steps, in priority order
GOVERNANCE.md"Trust Boundaries and Hardening Effort" rule, since every media input is the maintainer's own, and fuzzing has cost far more than it returned. Remove the script, its tests, its validate-action step, and every doc describing it, with the reference sweep a deletion owes. Keep the media gate's own metadata and damage checks. Done means Retire the Media Parser Fuzz Gate, Since Its Inputs Are Trusted #549 is closed with the gate gone and CI green.OPERATIONS.md"Logs and Debugging" carries the procedure. Use the window block withstart='2026-10-23T15:42'. Both production names are proxied, soClientHostis a forwarded chain read by its last element, and counts for cached file types are a floor. A404under/fonts/is new since 1.0.271. The pass needs a production-log go-ahead, asked in a dialog. Done means a comment here with the date range, the count left after filtering, and each finding's disposition.checks/gates that probe first. Remove the Incidental Counts From OPERATIONS.md #547 removes incidental counts fromOPERATIONS.md. They touch different files and can ride one pull request each.blog_<server>_<environment>.env. It is blocked until Apply One Naming Convention to Every Env and Secret File, Host-Side Files Included ProjectTemplate#3503 writes the rule into the hub'sCODESTYLE.md. Then it lands in the resync that carries that rule, and the pull request lists the host-side rename as the maintainer's step.EXPECT_SITE_ENVand report on ptr727/HomeAutomation-Config#580. #495 waits on a proxied host that can take a test release.External blockers
GOVERNANCE.md"Durable Knowledge" bullets still describe per-link handoffs. Nothing here waits on it.Internal dependencies
OPERATIONS.md"Trust Boundaries".OPERATIONS.md, so it goes after Retire the Media Parser Fuzz Gate, Since Its Inputs Are Trusted #549 or in a branch that mergesdevelopfirst.State
mainis atdbb671e(promotion Promote the Fleet Instruction Set Resync to Main #552), anddevelopis at8eb0043. Re-read both.dbb671eby publish-release run 40355952569. No deploy is owed, since nothing the server sends changed. Local and VPS sites still serve the 1.0.271 pages.develop, and the cleanup sweep reported no problems. A Dependabot branch was in flight.The parked decision queue
Empty. No open issue carries
decision.What the last round did
mainat5344d82, closing Resync the Carried Instruction Set, Starting With CODESTYLE.md's General Rules #540. #548 carried theAGENTS.mdandGOVERNANCE.mdverbatim sections, including the new "Design Before Code" and "Trust Boundaries" sections, plusCODESTYLE.md,WORKFLOW.md, the Copilot runbook, and the skills tree. It added Blog's first disproved-claims entry, for E402, and moved the trust list underOPERATIONS.md"Configuration Layout". #551 carried the Markdown config, the ref-scoped publisher group, the numbered concurrency citations, and the README shield and sort. #552 promoted both, released as 1.0.277.repo-config/configure.sh checkreports the live settings match. The remaining audit drift is the documentedcapture/Python directory andversion.json's timestamp-only advisory.What not to repeat
ruff check --show-settingsbefore citing a default.GOVERNANCE.mdonly gained in Resync the Carried Instruction Set and Skills Tree With the Hub #548. Merge the instruction set first, then mergedevelopinto the dependent branch.New learnings
git applying the hub's own diff since the copy's last resync revision, which keeps local sections by construction. That held again here forCODESTYLE.md,WORKFLOW.md, and the Copilot runbook's hunks. A hunk touching the hub's own ledger entries is carried by hand instead.[-]Session Handoff [default]: Fleet Resync in 1.0.277, Fuzz Gate Retirement and 404 Pass Next[/-][+]Session Handoff [default]: Env File Rename in Develop, Secret Readers Next After Hub #3534[/+]ptr727 commentedon Oct 27, 2026
Parked decision queue at the round 37 close: empty, with no open issue carrying
decision. Questions put to the maintainer this round, and their answers:develop, done asb885743.🤖 Generated with Claude Code
ptr727 commentedon Oct 27, 2026
State update after the round 37 close: the cleanup dialog was answered. The #557 worktree, its local branch, and
origin/chore/env-file-underscore-namesare removed, andgit worktree listshows only the primary checkout.ptr727 commentedon Oct 27, 2026
State update after the round 37 close: the maintainer asked for a promotion, then for merge and release. Promotion #558 merged into
mainasc8e5bbaand closed #550. publish-release run 40600286491 published 1.0.280 fromc8e5bba. No deploy is owed, since nothing the server sends changed. Next steps 3 (promote) is done. #553 still waits on ptr727/ProjectTemplate#3534 reaching hubmain. The list-only cleanup sweep reported no problems, and the primary checkout is clean ondevelopatb885743.