Record the log pull as installed, and the rename it does not carry - #58
Merged
Conversation
The off-host access-log pull is no longer a design. It is installed as a daily timer, and its first copy exists. Both records here said the opposite, because both were written before it was installed, and an operational document understating what runs is as misleading as one overstating it. The distinction kept is that the timer has never fired: that first copy was started by hand, so one copy is a fact and "backed up daily" is still a unit file until the first scheduled run. The finding the copy produced is the more useful half. The pull passes no --delete for the logs, deliberately, so a file the VPS renames after it has been pulled keeps its old name here forever alongside the new one. That has already happened, to two archives whose names were a day ahead of their contents, and a count over the archive by filename now returns 110 lines where 58 exist. Verified a strict subset with comm rather than assumed. Read a date from a line's StartUTC rather than from the filename holding it. Also recorded: why restoring mtimes in CI comes after a live media check rather than before, since making --link-dest effective means a third of the tree starts arriving as hard links carrying their inode's mode instead of having it re-asserted per deploy; and the log evidence that reframes the robots.txt decision, where no crawler has ever fetched the sitemap and the only thing advertising it is the file the cutover deletes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Updates operational documentation to reflect that the off-host VPS access-log pull is now installed (but has not yet executed on schedule), and records an observed edge case where VPS-side log archive renames do not propagate to the off-host copy—requiring log analysis to trust per-line StartUTC over filenames.
Changes:
- Update
TODO.mdstate and recurring-operations entries to record the installedvps-backup-pull.timer, its first manual run, and the “rename not carried” behavior. - Update
OPERATIONS.md“Log Review” guidance to reflect the off-host copy’s existence and warn that filename-based counting can double-count when archives are renamed/merged after being pulled. - Add additional measured context affecting operational decisions (notably around
robots.txt/ sitemap discovery).
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| TODO.md | Records current operations state, the installed off-host log pull (manual first run), and the rename-not-propagated finding; adds measured context around robots.txt/sitemap discovery. |
| OPERATIONS.md | Updates log-review prerequisites and procedure notes to reflect the off-host log copy and the need to rely on StartUTC over filenames when archives are renamed post-pull. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Both review findings are about a reader landing on the wrong side of a two-host sentence. The rename paragraph sat under one that mentions the backup host, so "the host renames" could be read as the machine doing the pulling rather than the one being pulled from, and the State row's "has run on its cadence" reads as "has run at all" one clause before the same row says it has copied once. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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 freeto 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.
Both records here said the off-host access-log pull was not installed. It is, and both were written before it was. An operational document that understates what runs misleads exactly as much as one that overstates it, so the correction is the same size either way.
What changed
TODO.mdState table and the#53entry. The pull is installed asvps-backup-pull.timer, 09:00 UTC daily withPersistent=true, and a first copy exists: 42 archives and 4 log files, 2026-08-08 12:59 UTC.The distinction kept is that the timer has never fired. That first run was started by hand, so
systemctl list-timersreportsLASTas-. One copy is a fact; "backed up daily" is still a unit file until the first scheduled run on 2026-08-09.The finding the copy produced, which is the more useful half
The pull passes no
--deletefor the logs, deliberately, since that flag exists to mirror the VPS's fourteen-archive window and must never touch an append-only record. So a file the VPS renames after it has been pulled keeps its old name off-host forever, alongside the new one, and nothing detects the divergence.That has already happened. The host side found its archived log filenames were a day ahead of their contents, fixed it with
dateyesterday, and merged the two existing files. Off-host, the pre-fix name survived:access.log-2026-08-08access.log-2026-08-07.gzVerified a strict subset with
comm -23over the sorted line sets rather than assumed one: 0 lines unique to the misnamed file. So a count over the off-host archive returned 110 lines where 58 exist, half of them filed under a date whose traffic they are not — the same defect the host fixed, surviving on the copy the log review will read once the VPS's window rolls past what it needs.OPERATIONS.mdnow says to read a date from a line'sStartUTCrather than from the filename holding it, and that a host-side rename is something the channel has to carry because no transfer will.Also recorded
Why restoring mtimes in CI comes after a live media check rather than before. The host side measured zero shared inodes across every release the pipeline has delivered, against 1052 of 3266 built locally, and refuted the call-site hypothesis by testing
--link-destthrough a relative symlink underrrsync -wo, where it links correctly. The cause is that git stores no mtimes, so a CI checkout writes all 3,272 files inside a 23-second window.git-restore-mtimefixes it and needs no checkout change, sincefetch-depth: 0is already there. The ordering matters because today every file arrives as a fresh inode and--no-g --chmod=D2755,F644re-establishes the mode contract on every deploy; make the mtimes honest and a third of the tree starts arriving as hard links carrying whatever mode its chain began with.The log evidence that reframes the
robots.txtdecision./robots.txtwas requested nine times on the interim hostname and answered 404 every time, five from real agents on a name with no inbound links, while no crawler fetchedsitemap.xmlorfeed.xmlonce — every request to either came fromcurl. Crawlers are told where a sitemap is rather than guessing, and the only thing telling them is the file the cutover deletes, so the question is whether the sitemap stays advertised at all.Verification
Documentation only, no behaviour, so the local mirror gate does not apply per
OPERATIONS.md"Local Verification Before a Pull Request".markdownlint-cli2andeditorconfig-checkerboth clean over the changed files.🤖 Generated with Claude Code