Scheduled Site Audit: Automate Reliable Live Rechecks
Configure a scheduled site audit with UTC timing, a bounded page sample, concurrency control, retained JSON evidence, ownership, and actionable failure alerts.
Author credentials: William Zhu is cofounder of InfiniSynapse (GitHub @allwefantasy · auto-coder). Desk: shipping SEO Health and the /en/tool/ visibility pages. No personal LinkedIn published. About: team / editorial standards.
Publisher credentials: InfiniSynapse has public profiles on GitHub, YouTube, and X. A 2026 WAIC Future Tech OPC excellence award covers the Agentic Data Infra entry (WAIC; third-party recap: Xinhua / Caohejing). That award does not review this page or SEO Health. Method CLI: infinitegrowth on npm. Archive: recognition and scope notes.

On this page
By William Zhu · Cofounder, InfiniSynapse · Published: 2026-09-09 · Last updated: 2026-09-14 · Last verified: 2026-09-14 · Reviewed by the InfiniSynapse Data Team.
Reviewed by: InfiniSynapse Data Team · method review 2026-09-14.
findof this website repo plus a four-file workflow inventory in the Skills tree.
Trust / COI: About · Corrections. SEO Health is a commercial product from this team. The workflow table is this tree, not a hosted cron log and not a customer alert.
TL;DR
scheduled site audit work in this tree is still a missing clock. Four Skills YAML files exist. Zero of them contain a schedule: key. Two fire on pull request. Two fire on workflow_dispatch. A timer job is absent here.
Direct answer: Treat a scheduled site audit as a UTC cron, a page cap, a concurrency rule, and a dated JSON file the parser can fail. On 2026-09-14 this website repo had no
.github/workflows. The Skills tree had four YAML files and zeroschedule:keys. A platform cron docs page is not proof this host runs one.
The sample size is four workflow files and a website-root find. That sample cannot establish that GitHub fired a cron for this host, and it does not prove a recovery from any core update. A scheduled site audit record that drops those four filenames is no longer replayable.
What you will learn
- Which four Skills workflows this desk actually opened
- Why none of them declare
schedule: - How website-root
findreturned zero.gitlab-ci.ymland zero Actions YAML - What
gate.mjsstill has to do after a timer fires - Where this scheduled site audit page stops and a URL-file loop begins
What a scheduled site audit actually requires
Key definition: A scheduled site audit is a clock-triggered sample with an explicit UTC expression, a page cap, overlap control, and a retained dated file. It does not certify rankings. It does not become true because GitHub documents cron syntax. Its useful output is a timestamped artifact plus a parser exit someone owns.
GitHub scheduled events is the platform reminder that on.schedule uses POSIX cron in UTC. That docs page is capability. It is not a log that this repository enabled the trigger.
People open a scheduled site audit when they already have a parser and want breadth on a clock. They do not need a pull-request job renamed as a timer. They need an owner, a timezone, and a file that still exists when the run is red.
IANA time-zone database is why the runbook should say UTC and not "Monday morning in the office." A scheduled site audit that stores local wall time without an offset becomes unreproducible after the next DST change.
A clock job can still hand a dated file to humans. If a team later wants narrative sequencing, they may open an InfiniSynapse Server API long-task workspace and watch SSE; the API does not fire the cron.
A clock without a file is telemetry
If the job starts and writes nothing, you cannot distinguish "never ran" from "ran and failed." Retention belongs in the same commit as the cron. GitHub concurrency controls is how overlapping timers cancel instead of stacking. That page does not prove we configured a group here.
A dispatch button is not a schedule
clawhub-publish.yml (7912 bytes) and clawhub-deprecate-old-slug.yml (2164 bytes) declare workflow_dispatch and do not declare schedule:. Manual publish is not a scheduled site audit. Do not relabel those two files as timers.
Workflow inventory on 2026-09-14
Node v22.18.0 was on PATH. The website repository had no .github/workflows directory and no .gitlab-ci.yml. The only first-party workflow inventory sat under Skills/seo-geo-claude-skills-main/.github/workflows/.
| File | Bytes | pull_request | workflow_dispatch | schedule: |
|---|---|---|---|---|
validate-skill.yml | 2256 | yes | no | no |
sync-skills.yml | 1491 | yes | no | no |
clawhub-publish.yml | 7912 | no | yes | no |
clawhub-deprecate-old-slug.yml | 2164 | no | yes | no |
None of those four files upload an SEO JSON artifact. None call seo-health. The clock job is therefore still a template in this tree, not an observed hosted job.
The same desk ran local gate.mjs fixtures and a live CLI on first-party tool URLs. Fixture exits were 1 for red, 2 for malformed, and 0 for warn and good. Live CLI rows left exit 0 beside one Image Alt Text warning. Those numbers are parser facts. They are not proof a cron fired.
If you later copy a YAML snippet into this website repo, treat it as a draft until a runner you control has written a dated file. The Skills workflows already show two other trigger families. Pull request is how validate-skill.yml and sync-skills.yml start. Dispatch is how the two ClawHub files start. Neither family is a Monday UTC sample. Writing 17 3 * * 1 into a new file would be a new claim. It would not retroactively make the 2026-09-14 search true. Keep the empty rg output next to any future cron so the before-and-after is visible.
This website repo also has no .gitlab-ci.yml. A GitLab rules: timer would be a second absent surface. Do not fill that gap with a screenshot from another company. The inventory is this tree only.
Figure: Two trigger series from the same inventory. Dispatch is not a clock. Neither series is a ranking score.
Website root is empty of CI YAML
find returned zero .github/workflows files at the app root. Zero .gitlab-ci.yml. A scheduled site audit article that pastes a green badge from this website repo is inventing a runner.
Skills YAML is not an SEO timer
validate-skill.yml and sync-skills.yml are pull-request jobs. They do not sample a sitemap. They do not pin infinitegrowth@0.1.1. Citing them as a timer is a category error. They can stay in the inventory as the jobs that actually exist.
How to reproduce the schedule search
Search the four files. Count schedule: keys. Expect zero as of 2026-09-14.
find Skills/seo-geo-claude-skills-main/.github/workflows -name '*.yml' -print
rg -n "schedule:" Skills/seo-geo-claude-skills-main/.github/workflows/
find . -name .gitlab-ci.yml -o -path './.github/workflows/*'
# website root: no workflow files
crontab format manual is the POSIX syntax reference you would use if you later added 17 3 * * 1. That man page does not mean the expression is committed here.
A scheduled site audit write-up should keep the search command beside the table. If a later commit adds schedule:, the same rg will stop returning empty. Until then, say the clock is absent.
How to reproduce the fixture
A timer that later exists still needs the same gate the desk already ran.
node gate.mjs red.fixture.json; echo exit:$?
# SEO_RED Title Length · exit 1
node gate.mjs malformed.fixture.json; echo exit:$?
# SEO_CONTRACT missing_result_arrays · exit 2
A cron that omits -p will never reach a sitemap: the desk already recorded exit 1 and error: unknown command 'seo-health'. Any future timer must pin -p infinitegrowth@0.1.1.
A scheduled site audit that only records "the job started" is unfinished. Parse the dated file. Return 1 on a red row. Return 2 on a missing array.
Google SRE distributed periodic scheduling is why overlap and ownership belong in the design. It does not say this host runs a periodic job.
Why a clock is not a parser
Transport success only proves that a process returned data. It does not prove the page passed the checks inside that data. For a scheduled site audit, a green Actions square that never opened JSON is still telemetry. Fail on per-file JSON SEO report exits, not one blob.
NIST log management guidance is an independent retention reference. It does not prescribe this cron and it does not endorse SEO Health.
Overlap without cancel-in-progress
If last week's 50-page sample is still running when this week's starts, you need a concurrency group. The four Skills files do not declare one for SEO. Do not claim we observed overlap behavior here. We observed the absence of a timer. A scheduled site audit that skips concurrency will stack two samples and then argue about which dated file is current.
Page cap without an owner
audit --pages 50 is a later choice. Name an owner, a runtime budget, and a retention period before you add the key. A timer without an owner becomes an orphan alert. Write the owner in the same commit as the cron so on-call is not a guess.
Where this page stops
This page owns the missing-clock inventory. Surfaces that fail differently live on siblings. A scheduled site audit write-up does not become a six-URL sequential loop on this URL.
A reviewed urls.txt is a different input of record. A pull_request workflow is a different trigger. Record the expression, the timezone, the package version, the UTC date, the page cap, the original fields, and the actual exit code. A scheduled site audit that stores only the cron line cannot name the row that failed.
Keep the dated file even when the parser later returns 1. A red timer without a file creates an argument. A retained file creates a repair queue.
The SEO CI/CD complete guide owns the shared decision model. Open that hub when the question is the merge rule rather than the clock. This page only answers whether a timer file is present and what it would have to keep.
Adoption in four reviewable commits
Do not land cron, sitemap, parser, and alerts in one opaque commit. A scheduled site audit is easier to revert when each change leaves a file.
Commit the parser first
Land gate.mjs and the red plus malformed fixtures. Record exits 1 and 2. A clock that has nothing to fail is decoration.
Add a dispatch-only job
Start with workflow_dispatch and a 50-page cap on a public sitemap you own. Do not add schedule: until the artifact path is stable. This repo has not done that step.
Add UTC cron and concurrency
Only then add on.schedule and a concurrency group. Cite the GitHub schedule docs as the syntax you copied. Do not claim a hosted run until one exists.
Require the dated artifact
Configure if-no-files-found: error (or the GitLab equivalent). A scheduled site audit that can finish without a file is already lying.
Failure modes worth a missing cron
Docs cited as proof. Platform cron documentation is capability. The 2026-09-14 search found zero schedule: keys. Cite the docs for syntax. Cite rg for presence. A scheduled site audit needs both.
Dispatch relabeled as schedule. Two Skills files are buttons. They are not a scheduled site audit.
Green square, no JSON. A scheduled site audit that uploads nothing cannot name a row.
Wrong argv on the clock. Forgetting -p prints unknown command 'seo-health' and never samples a page.
Local wall time. Store UTC. The IANA database exists because "3am" is ambiguous.
Cluster guides
Use this page for the missing-clock inventory, then open the surface you actually operate.
| Job you actually have | Guide to open next |
|---|---|
| Shared merge rule: file, fields, exit | SEO CI/CD |
| A reviewed URL file with per-URL JSON | batch SEO URL check |
A pull_request workflow whose check reads the parsed report | GitHub Actions SEO audit |
Inspect one URL before you write a cron
Run the browser form once, then reproduce the same JSON from the pinned CLI and keep a dated file.
Run SEO Health CheckerFrequently Asked Questions
Does the timer job require a login?
No. Default check, audit, and links do not need a CLI key. eeat, aivisibility, and gsc do. Keep those deep commands out of the default scheduled site audit job unless a named owner accepts the spend.
How should a timer run treat malformed JSON?
Fail closed. The desk used exit 2 for a missing issues array. Keep stderr and the partial file. Malformed data is not a warning, because a scheduled site audit cannot prove the required checks ran.
Can scheduling policy trust only process status?
No. Live first-party CLI rows in the same desk exited 0 while Image Alt Text was warning. Parse issues[] and onPage[]. Preserve name and status. Then apply the repository rule.
Is the scheduled result an official Google score?
No. A scheduled site audit can keep traffic-light rows in a dated file. That file is not a Google grade, an index promise, or a recovery forecast.
Do we claim a hosted cron passed?
No. This rewrite searched four YAML files and the website root. No schedule: key was present. Do not display a badge we did not earn.
Conclusion
Use a scheduled site audit when the job is to attach a UTC clock, a page cap, and a dated file to the same parser you already trust. The 2026-09-14 desk shows four Skills workflows and zero schedule: keys. Close the scheduled site audit file when the search command, the four filenames, the timezone, and the parser exit are still visible. An honest missing clock is more useful than an unsupported cron claim.
Open the InfiniSynapse web app only when a signed-in deep command has an owner. The clock, if you add one later, still ends at a dated file.
William Zhu · Cofounder, InfiniSynapse · GitHub @allwefantasy
Desk-validated SEO Health methods. Corrections: zhuhl@infinisynapse.com · corrections policy.