diff --git a/evidence-fixtures/ai-search/evidence.json b/evidence-fixtures/ai-search/evidence.json index 45371422..1710577a 100644 --- a/evidence-fixtures/ai-search/evidence.json +++ b/evidence-fixtures/ai-search/evidence.json @@ -48,7 +48,7 @@ "captured": "TinyStudio most commonly refers to a free Mac application that uses artificial intelligence to generate video and audio subtitles locally. Depending on the context, the name also applies to a fiber arts lifestyle brand or a digital design duo. ...", "sources": [ { "title": "Fiberygoodness - what is tinyStudio", "url": "https://www.fiberygoodness.com/whatistinystudio" }, - { "title": "TinyStudio - App Store", "url": "https://apps.apple.com/app/tinystudio" }, + { "title": "TinyStudio - App Store", "url": "https://apps.apple.com/us/app/tinystudio/id6448954288" }, { "title": "TinyStudio (design agency)", "url": "https://tinystudio.ch/" } ], "remediation": { diff --git a/public/audit.html b/public/audit.html index 11e66e51..4231531b 100644 --- a/public/audit.html +++ b/public/audit.html @@ -116,7 +116,7 @@

The AI-search evidence, on our own site

The business under test, stated precisely: TinyStudio is the business behind this site, tinystudio.io — the free leak audit of high-ticket service homepages and the human-reviewed desk that closes what the audit finds. Other businesses share the name — a Mac subtitle app, a fibre-arts magazine, a design agency, a video production studio, a Los Angeles venue, an unrelated studio LLC. None of them are this TinyStudio. Clients are never named, and the site states no base city or office address.

The states are strict. Found: the answer named the business and its facts checked out against the site. Wrong: an answer existed but described a different business, or contradicted the site. Absent: we ran the question and no AI answer came back. Not tested: we did not run it, and the reason is printed beside it. Absent is not the same as not tested. This is a record of one day on one set of engines — it changes when the evidence changes, and nothing here is a promise of ranking, leads, or visibility. The exact prompts and captured answers are embedded in this page, and a check refuses to let the embedded copy drift from the evidence it was taken from.

- +
diff --git a/scripts/check-site.mjs b/scripts/check-site.mjs index 84b5bae3..1bd56924 100644 --- a/scripts/check-site.mjs +++ b/scripts/check-site.mjs @@ -661,6 +661,34 @@ if (aiQuestions && aiEvidence) { } } + // External citation links (dogfood 78fcaed682fa, audit run + // 20260808T074205Z-msk2fl3n): the engine found apps.apple.com/app/tinystudio + // returning 404 on /audit.html (issue-19, "Broken external links on + // /audit.html"). The App Store family of hosts resolves only the + // id-carrying forms — https://apps.apple.com/app/ or + // https://apps.apple.com//app//id — so a bare slug + // such as /app/tinystudio is structurally dead. This rule is checked + // offline, so CI never depends on the network. + for (const run of runs) { + for (const source of run.sources || []) { + let parsedUrl = null; + try { + parsedUrl = new URL(source.url); + } catch { + parsedUrl = null; + } + if (!parsedUrl) continue; + const host = parsedUrl.hostname.replace(/^www\./, ""); + if (host === "apps.apple.com" || host === "itunes.apple.com") { + const path = parsedUrl.pathname; + const carriesAppId = /^\/app\/\d+/.test(path) || /\/id\d+/.test(path); + if (!carriesAppId) { + failures.push(`AI-search source URL is a dead App Store form (must carry an app id): ${run.questionId}/${run.engine} ${JSON.stringify(source.url)}`); + } + } + } + } + // Strict state transition: "found" means the answer named the tested business // and its facts checked out against the site — so the run must cite the // business's own site. This prevents relabeling a wrong/absent result as