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/"
},
{