I wrote gsc-telemetry with no pip dependencies. It found six invisible pages in four days.

The gsc-telemetry digest arrived on 24 June with six rows. Five legal pages and /stamp-duty-calculator, each carrying the same status: “URL is unknown to Google.”

That phrase is specific. It is not “Crawled, currently not indexed”, which means Googlebot visited and made a decision. It is not “Discovered, currently not indexed”, which means a link led Googlebot to the URL and it was queued. Unknown means no record. Not in the graph.

Those pages had been live for weeks. The sitemap included them. The skills had been running for four days.

Weeks of exposure with no Googlebot visit, surfaced in four days of daily digest. That is the operational case for building the telemetry as skills rather than as scripts you run when you remember to.

Why stdlib only

gsc-telemetry shipped first, on the morning of 20 June, as part of Phase 1.6’s operator-side push. Three things landed alongside it: a sitemap canonical fix, twelve manual Request-Indexing nudges, and IndexNow going live. ga-telemetry shipped the same day, same architecture, different upstream API, and lives at ~/.claude/skills/ga-telemetry/: six stdlib-only Python modules, a SKILL.md, and a launchd plist. Both install as global skills into ~/.claude/skills/, available in any Claude session that invokes them.

The constraint going in: no pip dependencies. Both skills had to run inside Claude sessions globally, without a virtual environment or any pre-install step. Google’s API client library is a pip package. Choosing stdlib instead produces more verbose code. The modules cover OAuth token refresh, raw HTTP requests, JSON parsing, output formatting. The tradeoff: longer code, simpler operational model, and one survival property that matters more than either.

A stdlib skill has nothing to drift. It installs via a symlink, runs on any Python interpreter, and survives machine rebuilds and environment resets without any maintenance cycle. There is no middle state where a missing package silently skips a run and the digest stops appearing. It either works or fails loudly.

The SKILL.md is the interface contract: not a README that may or may not be read, but an instruction set that loads into the Claude session when the skill is invoked. It carries the interpretation layer alongside execution. What the data means, what signals to act on, what to ignore. A script returns output. A skill returns output with context.

The launchd plist wires each skill to a daily firing schedule. That is the second half of the shift. The skills exist, and they fire on a clock, and they deposit their output before anyone has decided whether today is a GSC day.

The operational shift

Improving on the framing in “the eight-pillar map closed in three days, ga-telemetry and gsc-telemetry are why”: that article treated the telemetry as the mechanism behind an editorial sprint. This is about what the stdlib constraint unlocked, and why the constraint is the mechanism, not the API access.

Google Search Console had been accessible throughout the project. The tab was there. The data was current. The reason those six pages went unnoticed is not a GSC limitation. It is the initiation cost. You open GSC when something prompts you to open it. The editorial pace of Phase 1.6 was prompting action on content: eight PRs shipped in a single day at the peak, six articles published on the morning of 23 June. Nobody arrived at work that day primed to audit crawl coverage.

The daily digest removes the initiation cost. The output arrives before you have decided whether to look. If the digest contains six rows showing “URL is unknown to Google”, you see them. You do not have to have thought to investigate coverage.

Four days from skill deployment to the first actionable signal. The same gap would have persisted until missing impressions for those pages became visible enough in the GSC dashboard to prompt investigation. That is a multi-step diagnostic that requires arriving at GSC already looking for coverage problems, not traffic patterns or query rankings.

What the code review found

The morning the digest surfaced the six rows, I ran a code review across all six surfaces. The brief: find the technical SEO blocker.

It found nothing. HTTP 200 on all six. index, follow set. Canonical tags pointing to self. No render-blocking issues, no schema errors, no structured data violations. The pages were technically correct on every dimension the review could assess.

That result closes off the most natural response to an indexing gap: looking for a configuration error. There was no noindex to remove, no misconfigured canonical to correct, no robots.txt exclusion to unblock. The problem was not in the page. It was in the crawl path.

The crawl path problem

The legal pages lived in the footer. /stamp-duty-calculator lived in the sitemap and in the footer. Footer links are real links. Googlebot follows them, they carry PageRank, but they are the same link repeated on every page of the site. A repeated sitewide anchor is not the same crawl signal as an in-content link from a topically relevant page. Sitemap entries are hints, not instructions; they do not override crawl prioritisation. A page whose only inbound signal is a sitemap entry and a sitewide footer has a thin crawl path.

The fix: body-prose internal links from six articles pointing to /disclaimer and /stamp-duty-calculator. Links embedded in article body text, from pages already indexed and on Googlebot’s existing crawl schedule provide a contextual signal arriving via a content path. Googlebot follows them in the course of crawling pages it already visits regularly.

Out of scope from the same commit: the remaining legal pages beyond /disclaimer. The same pattern applies; they were not wired at the same time.

The skill that runs

The six pages were invisible for weeks with GSC access throughout. That is the default state of passive monitoring. Without a daily digest, surfacing the coverage gap would have required opening GSC to investigate coverage on the right day, with the right pages in scope. Not traffic. Not queries. Not impressions.

The stdlib constraint is not a stylistic choice. It is the property that determines whether the skill fires tomorrow. A skill with a pip dependency lives in a virtual environment. Virtual environments accumulate drift. Drifted environments produce silent skips. Silent skips mean the digest stops appearing, you do not know it has stopped, and the monitoring gap is invisible by definition.

Zero dependencies. Runs under launchd. Deposits output on a clock.

The six pages it found in four days had been unknown for weeks. The skill was not cleverer than GSC. It ran every morning without being asked, and it ran every morning because it had nothing that could break between one morning and the next.

All writing