fix(public): distinguish TinyStudio from same-name entities and lock identity - #17
Conversation
…identity
Add a deterministic identity clarification to the homepage, audit page,
and offer.md: TinyStudio is the business behind tinystudio.io, the free
leak audit of high-ticket service homepages plus the desk that closes
what it finds; other businesses share the name and none are this one.
Rebrand visible copy from "The Tiny Studio" to "TinyStudio · tinystudio.io"
and extend scripts/check-site.mjs with guards that fail the build if the
identity facts or the stale framing strings ("The Tiny Studio", "Tiny
Studio", "self-serve", "Pipeline Brief", "Agent Desk") drift back into
visible copy. The embedded AI-search evidence bundle stays a verbatim
record; no live search improvement is claimed.
Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
📝 WalkthroughWalkthroughThe public pages now use the TinyStudio identity and tinystudio.io branding. The site-check script validates identity content, domain references, legacy product wording, and the updated check result. ChangesTinyStudio identity alignment
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 49750a0289
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const ownedPages = [ | ||
| ["homepage", siteHome], | ||
| ["audit page", siteAudit], | ||
| ["desk page", read("public/agents.html")], | ||
| ["specimen page", read("public/specimen.html")] |
There was a problem hiding this comment.
Include every live page in the identity guard
The new guard omits active public surfaces that still use the ambiguous branding it is intended to reject: pricing.html is linked from every main navigation and contains “The Tiny Studio” in its title and footer, while /brief-requested is the signup redirect target and contains the same stale name. Consequently npm run check passes even though buyers and crawlers can still encounter the identity collision this change claims to eliminate; include these live pages in ownedPages and update their branding.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@scripts/check-site.mjs`:
- Around line 547-609: Update the identity checks in the ownedPages loop to
reuse each page’s script-stripped visibleCopy for the tinystudio.io domain
assertion and all required identity/brand checks, rather than inspecting raw
pageHtml. Require every owned page to visibly include the exact “TinyStudio ·
tinystudio.io” marker while preserving the existing stale-string scan.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 753e058e-fc1b-451e-97e1-a2f8b6885d4f
📒 Files selected for processing (6)
public/agents.htmlpublic/audit.htmlpublic/index.htmlpublic/offer.mdpublic/specimen.htmlscripts/check-site.mjs
| // ---- TinyStudio identity clarification ------------------------------------- | ||
| // One precise identity must run through every owned public surface: TinyStudio | ||
| // is the business behind tinystudio.io — the free leak audit of high-ticket | ||
| // service homepages plus the desk that closes what it finds. The clarification | ||
| // must be present on the homepage, the audit page, and in offer.md, and the | ||
| // ambiguous or retired framings ("The Tiny Studio", the spaced name form, and | ||
| // the self-serve Agent Desk product names) must not reappear in visible copy. | ||
| // The embedded AI-search evidence bundle is a verbatim record of captured | ||
| // engine answers that legitimately quotes other businesses' names, so script | ||
| // blocks are stripped before the stale-string scan. | ||
| const ownedPages = [ | ||
| ["homepage", siteHome], | ||
| ["audit page", siteAudit], | ||
| ["desk page", read("public/agents.html")], | ||
| ["specimen page", read("public/specimen.html")] | ||
| ]; | ||
|
|
||
| const identityFacts = [ | ||
| "tinystudio.io", | ||
| "Mac subtitle app", | ||
| "fibre-arts magazine", | ||
| "states no base city or office address" | ||
| ]; | ||
|
|
||
| for (const phrase of identityFacts) { | ||
| if (!siteHome.includes(phrase)) failures.push(`Homepage must state the TinyStudio identity: ${phrase}`); | ||
| if (!siteAudit.includes(phrase)) failures.push(`Audit page must state the TinyStudio identity: ${phrase}`); | ||
| if (!offer.includes(phrase)) failures.push(`offer.md must state the TinyStudio identity: ${phrase}`); | ||
| } | ||
|
|
||
| if (!siteHome.includes('id="identity"')) { | ||
| failures.push("Homepage must carry the identity clarification (id=\"identity\")."); | ||
| } | ||
| if (!siteAudit.includes('id="identity"')) { | ||
| failures.push("Audit page must carry the identity clarification (id=\"identity\")."); | ||
| } | ||
| if (!offer.includes("## Identity")) { | ||
| failures.push("offer.md must carry the machine-readable Identity section."); | ||
| } | ||
| if (!offer.includes("is not the current offer")) { | ||
| failures.push("offer.md must keep the legacy Agent Desk demotion statement."); | ||
| } | ||
|
|
||
| const staleIdentityStrings = [ | ||
| "The Tiny Studio", // collides with "The Tiny Studio LA", an unrelated venue | ||
| "Tiny Studio", // the spaced name form is never used by this business | ||
| "self-serve", // the retired Agent Desk framing | ||
| "Pipeline Brief", // the retired Agent Desk deliverable | ||
| "Agent Desk" // the retired product name | ||
| ]; | ||
|
|
||
| for (const [pageName, pageHtml] of ownedPages) { | ||
| const visibleCopy = pageHtml.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, ""); | ||
| for (const stale of staleIdentityStrings) { | ||
| if (visibleCopy.toLowerCase().includes(stale.toLowerCase())) { | ||
| failures.push(`Stale identity string on ${pageName}: ${stale}`); | ||
| } | ||
| } | ||
| if (!pageHtml.includes("tinystudio.io")) { | ||
| failures.push(`Every owned page must anchor the identity to the domain: ${pageName}`); | ||
| } | ||
| } | ||
|
|
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Make all identity assertions use visible content.
Lines 571-574 and 605 inspect raw HTML. A page can remove its visible identity while retaining the same phrases inside the embedded evidence script, and the check will still pass. The validator also does not require the new visible TinyStudio · tinystudio.io marker on each owned HTML page.
Reuse the stripped content for identity and domain checks, then require the visible brand marker.
Suggested validation fix
+const stripScripts = (html) =>
+ html.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "");
+const visibleHome = stripScripts(siteHome);
+const visibleAudit = stripScripts(siteAudit);
+
for (const phrase of identityFacts) {
- if (!siteHome.includes(phrase)) failures.push(`Homepage must state the TinyStudio identity: ${phrase}`);
- if (!siteAudit.includes(phrase)) failures.push(`Audit page must state the TinyStudio identity: ${phrase}`);
+ if (!visibleHome.includes(phrase)) failures.push(`Homepage must state the TinyStudio identity: ${phrase}`);
+ if (!visibleAudit.includes(phrase)) failures.push(`Audit page must state the TinyStudio identity: ${phrase}`);
if (!offer.includes(phrase)) failures.push(`offer.md must state the TinyStudio identity: ${phrase}`);
}
for (const [pageName, pageHtml] of ownedPages) {
- const visibleCopy = pageHtml.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "");
+ const visibleCopy = stripScripts(pageHtml);
...
- if (!pageHtml.includes("tinystudio.io")) {
+ if (!visibleCopy.includes("TinyStudio · tinystudio.io")) {
failures.push(`Every owned page must anchor the identity to the domain: ${pageName}`);
}
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // ---- TinyStudio identity clarification ------------------------------------- | |
| // One precise identity must run through every owned public surface: TinyStudio | |
| // is the business behind tinystudio.io — the free leak audit of high-ticket | |
| // service homepages plus the desk that closes what it finds. The clarification | |
| // must be present on the homepage, the audit page, and in offer.md, and the | |
| // ambiguous or retired framings ("The Tiny Studio", the spaced name form, and | |
| // the self-serve Agent Desk product names) must not reappear in visible copy. | |
| // The embedded AI-search evidence bundle is a verbatim record of captured | |
| // engine answers that legitimately quotes other businesses' names, so script | |
| // blocks are stripped before the stale-string scan. | |
| const ownedPages = [ | |
| ["homepage", siteHome], | |
| ["audit page", siteAudit], | |
| ["desk page", read("public/agents.html")], | |
| ["specimen page", read("public/specimen.html")] | |
| ]; | |
| const identityFacts = [ | |
| "tinystudio.io", | |
| "Mac subtitle app", | |
| "fibre-arts magazine", | |
| "states no base city or office address" | |
| ]; | |
| for (const phrase of identityFacts) { | |
| if (!siteHome.includes(phrase)) failures.push(`Homepage must state the TinyStudio identity: ${phrase}`); | |
| if (!siteAudit.includes(phrase)) failures.push(`Audit page must state the TinyStudio identity: ${phrase}`); | |
| if (!offer.includes(phrase)) failures.push(`offer.md must state the TinyStudio identity: ${phrase}`); | |
| } | |
| if (!siteHome.includes('id="identity"')) { | |
| failures.push("Homepage must carry the identity clarification (id=\"identity\")."); | |
| } | |
| if (!siteAudit.includes('id="identity"')) { | |
| failures.push("Audit page must carry the identity clarification (id=\"identity\")."); | |
| } | |
| if (!offer.includes("## Identity")) { | |
| failures.push("offer.md must carry the machine-readable Identity section."); | |
| } | |
| if (!offer.includes("is not the current offer")) { | |
| failures.push("offer.md must keep the legacy Agent Desk demotion statement."); | |
| } | |
| const staleIdentityStrings = [ | |
| "The Tiny Studio", // collides with "The Tiny Studio LA", an unrelated venue | |
| "Tiny Studio", // the spaced name form is never used by this business | |
| "self-serve", // the retired Agent Desk framing | |
| "Pipeline Brief", // the retired Agent Desk deliverable | |
| "Agent Desk" // the retired product name | |
| ]; | |
| for (const [pageName, pageHtml] of ownedPages) { | |
| const visibleCopy = pageHtml.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, ""); | |
| for (const stale of staleIdentityStrings) { | |
| if (visibleCopy.toLowerCase().includes(stale.toLowerCase())) { | |
| failures.push(`Stale identity string on ${pageName}: ${stale}`); | |
| } | |
| } | |
| if (!pageHtml.includes("tinystudio.io")) { | |
| failures.push(`Every owned page must anchor the identity to the domain: ${pageName}`); | |
| } | |
| } | |
| // ---- TinyStudio identity clarification ------------------------------------- | |
| // One precise identity must run through every owned public surface: TinyStudio | |
| // is the business behind tinystudio.io — the free leak audit of high-ticket | |
| // service homepages plus the desk that closes what it finds. The clarification | |
| // must be present on the homepage, the audit page, and in offer.md, and the | |
| // ambiguous or retired framings ("The Tiny Studio", the spaced name form, and | |
| // the self-serve Agent Desk product names) must not reappear in visible copy. | |
| // The embedded AI-search evidence bundle is a verbatim record of captured | |
| // engine answers that legitimately quotes other businesses' names, so script | |
| // blocks are stripped before the stale-string scan. | |
| const ownedPages = [ | |
| ["homepage", siteHome], | |
| ["audit page", siteAudit], | |
| ["desk page", read("public/agents.html")], | |
| ["specimen page", read("public/specimen.html")] | |
| ]; | |
| const identityFacts = [ | |
| "tinystudio.io", | |
| "Mac subtitle app", | |
| "fibre-arts magazine", | |
| "states no base city or office address" | |
| ]; | |
| const stripScripts = (html) => | |
| html.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, ""); | |
| const visibleHome = stripScripts(siteHome); | |
| const visibleAudit = stripScripts(siteAudit); | |
| for (const phrase of identityFacts) { | |
| if (!visibleHome.includes(phrase)) failures.push(`Homepage must state the TinyStudio identity: ${phrase}`); | |
| if (!visibleAudit.includes(phrase)) failures.push(`Audit page must state the TinyStudio identity: ${phrase}`); | |
| if (!offer.includes(phrase)) failures.push(`offer.md must state the TinyStudio identity: ${phrase}`); | |
| } | |
| if (!siteHome.includes('id="identity"')) { | |
| failures.push("Homepage must carry the identity clarification (id=\"identity\")."); | |
| } | |
| if (!siteAudit.includes('id="identity"')) { | |
| failures.push("Audit page must carry the identity clarification (id=\"identity\")."); | |
| } | |
| if (!offer.includes("## Identity")) { | |
| failures.push("offer.md must carry the machine-readable Identity section."); | |
| } | |
| if (!offer.includes("is not the current offer")) { | |
| failures.push("offer.md must keep the legacy Agent Desk demotion statement."); | |
| } | |
| const staleIdentityStrings = [ | |
| "The Tiny Studio", // collides with "The Tiny Studio LA", an unrelated venue | |
| "Tiny Studio", // the spaced name form is never used by this business | |
| "self-serve", // the retired Agent Desk framing | |
| "Pipeline Brief", // the retired Agent Desk deliverable | |
| "Agent Desk" // the retired product name | |
| ]; | |
| for (const [pageName, pageHtml] of ownedPages) { | |
| const visibleCopy = stripScripts(pageHtml); | |
| for (const stale of staleIdentityStrings) { | |
| if (visibleCopy.toLowerCase().includes(stale.toLowerCase())) { | |
| failures.push(`Stale identity string on ${pageName}: ${stale}`); | |
| } | |
| } | |
| if (!visibleCopy.includes("TinyStudio · tinystudio.io")) { | |
| failures.push(`Every owned page must anchor the identity to the domain: ${pageName}`); | |
| } | |
| } |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@scripts/check-site.mjs` around lines 547 - 609, Update the identity checks in
the ownedPages loop to reuse each page’s script-stripped visibleCopy for the
tinystudio.io domain assertion and all required identity/brand checks, rather
than inspecting raw pageHtml. Require every owned page to visibly include the
exact “TinyStudio · tinystudio.io” marker while preserving the existing
stale-string scan.
intended-outcome: buyers and AI readers can distinguish TinyStudio at tinystudio.io from unrelated same-name entities, with deterministic guards preventing identity drift.
verify: npm run check; npm test; sgscan; local before/after AI-search improvement remains unverified until a fresh live panel is run.
Summary by CodeRabbit
Content Updates
Quality Assurance