Record operations as recurring work, not as a finished milestone - #54
Merged
Conversation
There was a problem hiding this comment.
Pull request overview
Updates the repository’s running backlog (TODO.md) so ongoing operational responsibilities (log review cadence and off-host log pulls) are tracked explicitly as recurring work rather than appearing as one-off migration milestones.
Changes:
- Extends the “State” table to include an explicit Operations row, and refines the VPS production status entry.
- Introduces a new “Recurring operations” section and moves the periodic log review + off-host log pull items into it.
- Records an open decision about where operational tooling should live, and adds issue link references for #52 and #53.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
The backlog listed the log review and the off-host log pull among the one-off migration tasks, so a reader finishing that list would read the migration as done while neither duty had ever run on its cadence. Both move to a Recurring operations section that says outright that everything above it ends and this does not, and the State table gains an Operations row so the summary stops implying the pipeline is the whole system. The open decision behind them is that the tooling has no home in git. vps-backup-pull, its systemd units, and the variables naming both ends of the copy exist only on the Proxmox host, which is the host the backup runs from, so losing it loses both the copies and the means of making them. Two candidate homes are recorded without choosing between them. The same question covers the fourteen migration scripts in the capture directory, and one of them already shows the cost of leaving it open: build-redirects.py exists in three places, the two capture copies identical to each other at 115 lines and this repo's maintained copy at 225. The capture is not a git repository, so nothing detects that. Two open questions are closed with measurements rather than assumptions. The production environment's HUGO_BASEURL held the live WordPress address, which the deploy workflow both builds with and points the live check at, and it is now the interim name. And the first production deploy does not fix the robots.txt 404 the VPS agent flagged in its 22.10: hugo.yaml sets no enableRobotsTXT so the site emits none at all, while sitemap.xml is emitted and becomes fetchable at that same deploy. The VPS production row said the resource was deliberately disabled, which its own file contradicted twenty lines later. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The gallery caption entry under Open decisions is gone: #55 answered the question it posed, against the captured live site, and closed #52 with it. Two findings from the VPS agent's §23.3 and §24.3 replace it. The robots.txt entry described a gap on the interim name and missed that the cutover makes it a loss. The live .com blog serves a robots.txt today carrying a Sitemap: line, and this site emits none, so M7b moves a site that has had crawl directives for years to having none and takes the sitemap pointer with them. That side found it from the outside, will not put a file in this bundle, and has made it block step 1 of the M7b checklist rather than be discovered after it. Recorded as deliberately undecided with the three options, and Open decisions points at it rather than restating it, so the two cannot drift. Nothing checks that media survived the trip to the server. A 3,095-request gate run fetched no image at all, which prompted the question of whether the legacy media list is wired in. It is, at build time, against files on disk. The live check requests pages and redirects and never an image, so a media tree lost between the build and the server is caught by neither, the build having passed before the loss and the live gate never asking. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ptr727
force-pushed
the
record-operations-as-recurring-work
branch
from
August 8, 2026 05:02
e362e54 to
4d64eed
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
TODO.mdonly. No code, no content, no workflow change.Do not merge this before #51. That promotion is open against
develop, and merging here first pulls this commit into it and invalidates the verification its body describes.Why
The backlog listed the periodic log review and the off-host log pull among the one-off migration tasks. A reader finishing that list would read the migration as done, while neither duty has ever run on its cadence — which is the shape a recurring duty has right before it silently becomes a one-off. Both move into a Recurring operations section that says outright that everything above it ends and this does not, and the State table gains an
Operationsrow so the summary stops implying the deploy pipeline is the whole system.The decision this records
The operational tooling has no home in git.
vps-backup-pull, itssystemdunits, and the environment variables naming both ends of the copy exist only on the Proxmox host — which is the host the backup runs from. Losing it loses both the copies and the means of making them, and the instructions that produced them live in a channel file this repository deliberately does not carry.Two candidate homes are recorded without choosing between them: here, beside the deploy tooling the same host runs, or the home-automation config repository with the rest of that host's configuration.
One instance of the cost is already measurable rather than hypothetical.
build-redirects.pyexists in three places: twice under the capture directory, identical to each other at 115 lines, and once here atchecks/build-redirects.py, the maintained copy at 225. The capture is not a git repository, so nothing detects the drift.The same open question covers the other thirteen migration scripts in the capture — the
wp2hugorun, the content restructure and clean passes, media localization, the crawl and mirror, the golden-URL build, the media inventory. Some are worth keeping only if generalized and some are cheaper to rewrite than to maintain, so it is a per-script call.Two open questions closed with measurements
HUGO_BASEURLon theproductionenvironment heldhttps://blog.insanegenius.com/, the live WordPress address.deploy-site-task.ymluses that value twice: it builds with it, and it pointscheck-live-urls.shat it. A production deploy would have baked the old platform's address into every canonical tag, feed link andsitemap.xml, then sent 1,245 requests at the live site to verify it. Now set to the interim.netname; the revert at M7b is recorded as the unfinished half./robots.txt404 the VPS agent raised in its §22.10.hugo.yamlsets noenableRobotsTXT, so this site emits norobots.txtat all and the 404 survives the deploy, leavingX-Robots-Tagas the only control.sitemap.xmlis emitted and becomes fetchable on the interim hostname at that same deploy. A crawler therefore gets a full sitemap and no robots file.Also filed from this work: #52 (gallery captions render as a stray text node) and #53 (the log pull, written and tested but not installed).
Verification
markdownlint-cli2andeditorconfig-checkerclean.cspellis not run againstTODO.mdby CI, which gatesREADME.mdandHISTORY.mdonly, so it was run by hand — the file's twelve unknown words are all pre-existing except one British spelling this branch introduced and then fixed.Nothing in this branch changes the built site, so the local-mirror gate does not apply.
🤖 Generated with Claude Code