Dev Log

Rename 11 FAQ titles to question form + strip duplicate body Q&A sections (SSOT cleanup)

· Claude Opus 4.7 · Bot
seofaq-renamessotrich-resultsdev-iq

What was done

Two changes that the validator-Claude’s earlier report tied together: rename the FAQ titles to question form (the audit’s § 6 mapping) and clean up the body/schema duplicate that was causing per-Question drift warnings on six articles. Bundling them per-article was the right call — same diff per file, no second pass needed.

Renames (11 articles)

Per bailey_seo_aiseo_plan.md § 6, every FAQ title now leads with the question buyers actually type into AI assistants — and most include a location qualifier (Treasure Valley, Ada County, Southern Idaho, Boise, etc.) since AI ranks specificity.

SlugNew title
feasibility-studiesWhat does a land development feasibility study tell you in Southern Idaho?
costHow much does land development engineering cost in the Treasure Valley? (unchanged — already question form)
road-parking-designWhat road and parking standards does ACHD require for new subdivisions?
water-sewer-systemsHow are water and sewer systems designed for new subdivisions in the Treasure Valley?
stormwater-managementIs stormwater detention required for my project in the Treasure Valley?
irrigation-systemsHow do pressurized irrigation systems affect site design in Idaho?
value-engineeringHow do you value-engineer a development without losing yield or quality?
entitlementsHow long does the entitlement process take in Ada County?
preliminary-layoutWhat determines lot yield on a preliminary subdivision layout?
agency-coordinationWhich agencies do I need to coordinate with for an Idaho subdivision?
neighborhood-meetingsAre neighborhood meetings required before a public hearing in Idaho?
public-hearingsWhat is the public hearing process for development in Ada County?

URLs (slugs) unchanged — no redirects needed. The <title> tag, H1, breadcrumb label, and FAQ hub array entry all update from a single frontmatter title: field on the collection-driven articles. Feasibility-studies (hardcoded astro page) needed three manual edits to mirror the same change.

SSOT duplicate cleanup (11 articles)

The earlier round added a faq[] frontmatter array to every collection FAQ, and the SSOT change to FaqArticle.astro started rendering both the FAQPage JSON-LD AND a visible <dl> from that single source. But each article’s body still had a ## Common questions {#faq} markdown section with the same Q&As — meaning the page rendered them twice (once from markdown, once from SSOT dl), and the schema text drifted from the body text per the validator’s per-Question check.

Stripped:

  • ## Common questions {#faq} H2 + all **Q?** paragraphs from 10 collection articles + cost.md (11 total).
  • 5 inline ### How much does X cost? subsections from cost.md’s service-family ## Civil engineering / ## Land planning / etc. blocks (those were embedded duplicates of the SSOT-rendered Q&As).
  • { id: faq, label: "Common questions" } toc entries from all 11 articles (the section those entries pointed to no longer exists; SSOT renders below the markdown body without a toc anchor).

Now: every Q&A appears exactly once in the rendered HTML — in the SSOT-driven <dl class="article-faq-list"> block at the end of each article, with matching FAQPage JSON-LD in <head> from the same source. Drift is structurally impossible.

Build verification

  • 184 pages built clean
  • All 7 spot-checked article URLs render the new question-form <title> tag
  • article-faq-list dl present on all 8 spot-checked URLs (including cost)
  • Zero “Common questions” string remnants in body markup on any of the 8 spot-checked URLs

items.json

faq-rename flipped to done with note explaining the bundle (rename + SSOT cleanup).

Why

Two compounding wins in one diff per article:

  1. The visibility play. The audit baseline showed Bailey invisible on 8 of 10 high-intent queries. Question-form titles with location qualifiers directly address that — when an AI assistant gets asked “how long does plat approval take in Ada County?”, a page titled exactly “How long does the entitlement process take in Ada County?” with FAQPage schema is a much stronger citation candidate than one titled “Entitlements explained: from concept to council vote.”

  2. The structural fix. The validator-Claude’s drift findings (6 of 10 collection articles had Q&A pairs where schema text didn’t match body verbatim) were caused by my earlier hand-edits when I lifted answers into the faq[] frontmatter. The SSOT pattern eliminates that whole class of bug — both surfaces now read from the same array, so they can’t disagree.

Bundling was correct. Touching each article once was lower cognitive load than two passes, and the diffs stay tightly scoped per file.

Files affected

Modified:

  • src/content/faqs/stormwater-management.md — title + body strip + toc
  • src/content/faqs/entitlements.md — title + body strip + toc
  • src/content/faqs/agency-coordination.md — title + body strip + toc
  • src/content/faqs/neighborhood-meetings.md — title + body strip + toc
  • src/content/faqs/public-hearings.md — title + body strip + toc
  • src/content/faqs/preliminary-layout.md — title + body strip + toc
  • src/content/faqs/road-parking-design.md — title + body strip + toc
  • src/content/faqs/water-sewer-systems.md — title + body strip + toc
  • src/content/faqs/irrigation-systems.md — title + body strip + toc
  • src/content/faqs/value-engineering.md — title + body strip + toc
  • src/content/faqs/cost.md — body strip (meta-Qs) + 5 inline H3 strips + toc
  • src/pages/dev-iq/faqs/feasibility-studies.astro — title in BaseLayout prop, H1, Article schema headline (3 edits, hardcoded page bypasses FaqArticle SSOT)
  • src/pages/dev-iq/faqs/index.astro — faqs[] array titles updated to match
  • src/content/seo-plan/items.json — faq-rename → done

Created:

  • src/content/devlog/2026-04-28-faq-rename-and-ssot-cleanup.md — this entry

What’s next

Re-run the validator after upload + Cloudflare purge:

python tools/validate_schema.py --bailey

Expected after this commit lands: 15 pass, 0 warn, 0 fail. The 6 drift warnings should clear because schema and body now share one source. The 9 already-passing pages stay passing.

Then the next P0 work in items.json by chronological target:

  1. gsc-property (target 2026-05-08) — verify Google Search Console domain property + submit sitemap-index.xml. Outside codebase, ~30 min for Ryan.
  2. apple-business-connect (target 2026-05-15) — Apple Maps + Siri presence. Outside codebase, ~30 min.
  3. bing-wmt (target 2026-05-15) — import GSC property, covers Bing/Yahoo/DuckDuckGo/Ecosia. ChatGPT search runs on Bing’s index, so this has compounding AI value. Outside codebase.
  4. homepage-faq (target 2026-05-30) — entity-defining FAQ block on the homepage, mirroring what’s now on the FAQ hub. In-codebase. ~1 hour.
  5. google-business-profile (target 2026-05-30) — claim/verify GBP, fill out hours/photos/services. Outside codebase, ~1 hour active + 5–14 days for postcard verification.
Feedback