From 42172998584fedec9bbd389950858419ff7fa2cc Mon Sep 17 00:00:00 2001 From: nish3451 <257724087+nish3451@users.noreply.github.com> Date: Tue, 11 Aug 2026 02:58:15 +0530 Subject: [PATCH] fix(seo): cut retired Agent Desk title consolidation wires MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 2026-08-09 pass added noindex and retired framing to the legacy /agent-desk surface, but two index-facing wires remained that keep feeding Google the retired 'TinyStudio Agent Desk' title/snippet for tinystudio.io: - The legacy page's canonical and og:url still point at the homepage — the exact consolidation path through which its title reached tinystudio.io. They now name the legacy page itself (https://tinystudio.io/agent-desk.html). - The app./api. 410 responses still claimed the main domain 'now runs the self-serve Agent Desk'. They now state both are retired and that the current offer is the Website Appraisal. Extends the retired-desk dogfood guard in scripts/check-site.mjs so the canonical/og:url wire and the stale 410 claim fail CI if they return, and records the pass in docs/evidence/agent-desk-retired-title-2026-08-11.md. --- .../agent-desk-retired-title-2026-08-11.md | 106 ++++++++++++++++++ public/agent-desk.html | 4 +- scripts/check-site.mjs | 35 ++++++ src/worker.js | 4 +- 4 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 docs/evidence/agent-desk-retired-title-2026-08-11.md diff --git a/docs/evidence/agent-desk-retired-title-2026-08-11.md b/docs/evidence/agent-desk-retired-title-2026-08-11.md new file mode 100644 index 00000000..8531c618 --- /dev/null +++ b/docs/evidence/agent-desk-retired-title-2026-08-11.md @@ -0,0 +1,106 @@ +# Retired Agent Desk title/snippet: cut the canonical consolidation wire + +Date: 2026-08-11 +Scope: `public/agent-desk.html` (head canonical/og:url), `src/worker.js` +(retired 410 response copy), `scripts/check-site.mjs` (regression guard). +Follow-up to `docs/evidence/agent-desk-retired-title-2026-08-09.md`, which +added `noindex, nofollow` and retired framing to the legacy surface. This +receipt records the second, deterministic pass: the two remaining wires that +could still feed the retired "TinyStudio Agent Desk" title/snippet to Google +were cut. It is not a live Google-index measurement and claims nothing about +when or whether Google's search results change. + +## Why this pass exists + +Google still presents the retired self-serve "TinyStudio Agent Desk" +title/snippet for tinystudio.io. The 2026-08-09 pass is verified live (both +fetches below), so the stale presentation can no longer come from the legacy +page's own title or description — those are gone. Two index-facing wires +remained: + +1. **The canonical/og:url wire.** The 2026-08-09 receipt itself diagnosed the + original mechanism: "the legacy page's title consolidated through its + canonical" onto the homepage URL. The pass added `noindex, nofollow` but + left `` and + `` in place. + Live-before state (2026-08-11): + `curl -s https://tinystudio.io/agent-desk` served `noindex, nofollow`, + the retired title/description — and still declared the homepage as the + page's canonical and og:url. A noindex page whose canonical names a live + page tells Google it is a duplicate of that page: exactly the consolidation + that handed the retired title to tinystudio.io, still declared on every + recrawl until the removal is processed. Google's own guidance is that a + page you do not want indexed should not canonicalize to another URL. +2. **The retired-410 copy wire.** `app.tinystudio.io` and `api.tinystudio.io` + respond 410 Gone with the copy "TinyStudio.io now runs the self-serve + Agent Desk from the main domain." Live-before state (2026-08-11): both + fetches returned that sentence. It re-presents the retired self-serve + product as the current thing the main domain runs, and the pages stay + crawlable until the 410 is processed. + +## What changed + +1. `public/agent-desk.html` head: the canonical and og:url now name the + legacy page itself (`https://tinystudio.io/agent-desk.html`) instead of the + homepage. The consolidation wire is cut: no indexed page points the legacy + surface at `tinystudio.io/` any more, so a recrawl can no longer merge the + retired page's signals or title onto the homepage URL. +2. `src/worker.js`: the retired 410 responses (app and api) no longer claim + the main domain runs the self-serve Agent Desk. They now say the app and + the self-serve Agent Desk are both retired and that TinyStudio.io's + current offer is the Website Appraisal. +3. `scripts/check-site.mjs`: the retired-desk dogfood guard now fails `npm + run check` when the legacy page's canonical or og:url points anywhere but + the legacy page itself (or is absent), and when the worker's retired 410 + copy claims the main domain "now runs the self-serve Agent Desk" — so + neither wire can silently return. + +## What deliberately did not change + +- The legacy surface itself: `agent-desk.html` remains a working self-serve + page served at `/agent-desk` and `/agent-desk.html`, still `noindex, + nofollow`, still retired-framed. Old deep links and bookmarks keep working. +- `robots.txt`, `sitemap.xml`, the homepage, and the other public pages: + their titles and descriptions were already current. +- No redirect was added for `/agent-desk`: the page stays reachable, it is + just no longer indexable or canonicalizable onto the homepage. + +## What is tested and what is not + +Tested: the extended guard fails loudly on regression (the canonical and the +410 copy are asserted directly), and the full suite passes on this commit — +`npm run check` green, `npm test` green, exit code 0. + +Not tested: whether or when Google drops the old title/snippet from its +results. De-indexing and re-consolidation are live processes that start only +after Google recrawls the pages; nothing here implies a ranking, visibility, +lead or revenue outcome. The honest measure is a future controlled re-run +recorded through `evidence-fixtures/ai-search` (or Search Console), once +enough time has passed for a recrawl. + +## Verification (reproduce) + +``` +npm run check +npm test +git diff --check +``` + +All three checks pass on this commit. Live-before state (2026-08-11): + +``` +curl -s https://tinystudio.io/agent-desk # noindex + retired head, canonical/og:url still -> homepage +curl -s https://app.tinystudio.io/ # 410 body still claimed the main domain runs the Agent Desk +curl -s https://api.tinystudio.io/ # 410 JSON message made the same claim +``` + +After deploy, the same fetches should show the self-canonical +`https://tinystudio.io/agent-desk.html` and the corrected 410 copy. + +## Closeout + +This closes the repository-side item against current main: the legacy Agent +Desk surface no longer declares itself a duplicate of the homepage through +its canonical or og:url, the retired 410 responses no longer present the +retired self-serve Agent Desk as the main domain's current offer, and CI +fails if either returns. diff --git a/public/agent-desk.html b/public/agent-desk.html index 4f68447e..12564494 100644 --- a/public/agent-desk.html +++ b/public/agent-desk.html @@ -15,8 +15,8 @@ content="The self-serve Agent Desk is retired and is not the current offer. TinyStudio's current offer is the free leak audit of high-ticket service homepages." /> - - + + diff --git a/scripts/check-site.mjs b/scripts/check-site.mjs index ef40c8c5..264a7cfa 100644 --- a/scripts/check-site.mjs +++ b/scripts/check-site.mjs @@ -1076,6 +1076,41 @@ if (!/\bretired\b/i.test(retiredDeskDescription)) { failures.push("Retired Agent Desk description must frame the surface as retired."); } +// The legacy page must never canonicalize to the homepage or any other live +// page: the canonical-to-homepage was the consolidation path that handed the +// retired page's title to tinystudio.io in the first place (see the receipt +// above), and a noindex page pointing its canonical at a live page tells +// Google it is a duplicate of that page while the noindex removal is +// processing. The canonical must name the legacy page itself (or be absent), +// and og:url must not name any other page either. +const legacyPageUrl = "https://tinystudio.io/agent-desk.html"; +const retiredDeskCanonical = + retiredDeskHead.match(/]*\brel\s*=\s*["']canonical["'][^>]*>/i)?.[0] ?? ""; +const retiredDeskCanonicalHref = + retiredDeskCanonical.match(/\bhref\s*=\s*["']([^"']*)["']/i)?.[1] ?? ""; +if (retiredDeskCanonicalHref && retiredDeskCanonicalHref !== legacyPageUrl) { + failures.push( + `Retired Agent Desk canonical must be self-referencing (${legacyPageUrl}) or absent; found ${retiredDeskCanonicalHref}.` + ); +} +const retiredDeskOgUrl = + retiredDeskHead.match(/]*\bproperty\s*=\s*["']og:url["'][^>]*>/i)?.[0] ?? ""; +const retiredDeskOgUrlHref = retiredDeskOgUrl.match(/\bcontent\s*=\s*["']([^"']*)["']/i)?.[1] ?? ""; +if (retiredDeskOgUrlHref && retiredDeskOgUrlHref !== legacyPageUrl) { + failures.push( + `Retired Agent Desk og:url must be self-referencing (${legacyPageUrl}) or absent; found ${retiredDeskOgUrlHref}.` + ); +} + +// The worker's retired 410 responses (app.tinystudio.io / api.tinystudio.io) +// must not re-present the retired self-serve Agent Desk as what the main +// domain "now runs": that phrasing claims the retired product is the current +// offer of tinystudio.io and stays crawlable on 410 pages until they drop out +// of the index. +if (/now runs the self-serve Agent Desk/i.test(worker)) { + failures.push("Worker retired 410 responses must not claim the main domain now runs the self-serve Agent Desk."); +} + // ---- Meta descriptions (dogfood) ------------------------------------------- // The leak audit this site sells flags a homepage whose served HTML carries no // description, so the site's own five public pages must not carry the same diff --git a/src/worker.js b/src/worker.js index 7035e176..45c76f50 100644 --- a/src/worker.js +++ b/src/worker.js @@ -1266,7 +1266,7 @@ function retiredAppResponse() {

TinyStudio app retired.

-

The old TinyStudio app has been retired. TinyStudio.io now runs the self-serve Agent Desk from the main domain.

+

The old TinyStudio app has been retired, and so has the self-serve Agent Desk. TinyStudio.io's current offer is the Website Appraisal: the free leak audit of high-ticket service homepages.

Go to TinyStudio.io
@@ -1288,7 +1288,7 @@ function retiredApiResponse() { { ok: false, status: "retired", - message: "The old TinyStudio API has been retired. TinyStudio.io now runs the self-serve Agent Desk from the main domain.", + message: "The old TinyStudio API has been retired, and so has the self-serve Agent Desk. TinyStudio.io's current offer is the Website Appraisal: the free leak audit of high-ticket service homepages.", publicSite: "https://tinystudio.io/" }, {