Repository navigation
content: homepage answers the live 'apa calda' intent (status + FAQ) - #19
tiXor-code wants to merge 3 commits into
Conversation
GSC: 'apa calda' at position 8.2 with 1,412 impressions lands on the
homepage, and the live SERP is led by CMTEB's status pages - the intent
is 'is there hot water right now', which the homepage never answered.
- Citywide answer-first block: one sentence with PTs currently off,
how many from avarii and the worst sector, computed from the same
getSectorLive rollups the sector pages use (distinct PT slugs).
- Per-sector live table (PTs off now / of which avarii) linking all six
/sector/ pages; numeric table is data-nosnippet like the other blocks.
- Five-question citywide FAQ + FAQPage JSON-LD via the escaping
faqJsonLd/JsonLd helpers; answers use only bundle aggregates.
- Title carries the live intent ('avarii azi si istoric', 59 rendered
chars incl. brand - the layout template does not apply to the root
page); description leads with avarii + daily update.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Reviewed the full diff. Verified:
cityStatusSentence(app/page.tsx:60-77) and the per-sector live table correctly reusegetSectorLive(same call pattern/year as app/sector/[id]/page.tsx:118), counting distinct PT slugs viaSetso a PT with multiple ongoing episodes isn't double-counted;ptsAvarieis a proper subset ofpts. Singular/plural and "de" agreement (fmtZile/deFor) handled correctly, including thetotal === 1and tied-max-sector edge cases.- FAQ answers are built from existing, already-verified bundle aggregates (
cityHeadlineDays,cityDeficientaDays,summary,totalEpisodes) with no scraped names entering the new sections, and are rendered as plain strings that match the JSON-LDfaqJsonLd/JsonLdoutput verbatim — consistent with the CLAUDE.md JSON-LD escaping rule. - Title (59 chars) and description (150 chars) fit the site's established rendered-length windows.
- The
components/OngoingBand.tsxfix is a correct minimal swap to the prefetch-off@/components/Linkwrapper, directly fixinglink-prefetch.test.ts.
No correctness, security, or quality issues found. Approving.
Conflict resolution for app/page.tsx: main's Oct 5 title and indexable intro section win (they postdate this branch); the branch's citywide live-status section, five-question FAQ with FAQPage JSON-LD, and live-first meta description are re-applied on top. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
TLDR: branch refreshed on 2026-10-12 — merged main (was 44 commits behind, conflicted), build and all 137 tests pass. GSC now shows 'apa calda bucuresti' at position 9.4 with 3,080 impressions, and today's live SERP (checked 2026-10-12) is positions 1-5 news coverage of an ongoing major avarie plus RADET, which re-confirms the live intent this PR answers. Conflict resolution: main's newer homepage title ('Apa calda Bucuresti: intreruperi pe strazi', Oct 5) and the indexable intro section were kept; this branch's citywide live-status section with per-sector table, the five-question FAQ with FAQPage JSON-LD, and the live-first meta description were re-applied on top. The OngoingBand Link fix in this branch had already landed on main and merged away cleanly. |
There was a problem hiding this comment.
Reviewed the current diff (post-merge-conflict-resolution commit adbec88, superseding the earlier approval on 5b8f80c).
Verified:
cityStatusSentence/fmtPuncteTermice(app/page.tsx:49-82) and the per-sector table correctly reusegetSectorLive(sector, lcy)with the same call signature asapp/sector/[id]/page.tsx:135,171; PT counts are deduped viaSeton slug, so multi-episode PTs aren't double-counted, andptsAvarieis a proper subset ofpts.- Singular/plural/"de" agreement (
fmtZile/deFor, app/page.tsx:49-82) correctly handles the 0/1/tied-max-sector/all-avarie/no-avarie branches. - FAQ answers (app/page.tsx:133-176) are plain strings built only from existing bundle aggregates, rendered verbatim into both the visible
<p>andfaqJsonLd/JsonLd— satisfies the CLAUDE.md JSON-LD escaping rule, and no scraped names enter the new sections. daysvsdays_deficientaare reported separately in FAQ #5, never summed, per CLAUDE.md.components/OngoingBand.tsxfix correctly swaps to the prefetch-off@/components/Linkwrapper.- cmteb.ro nofollow link matches the existing pattern in
app/sector/[id]/page.tsx:376.
Minor non-blocking note: cityStatusSentence/fmtPuncteTermice have several grammar branches (0/1/tie/partial-avarie) but aren't unit tested, unlike the project's convention of testing grammar helpers in test/format.test.ts. Worth a follow-up, not a blocker for this content PR.
TLDR: GSC shows the generic query 'apa calda' landing on the homepage at position 8.2 with 1,412 impressions, and the live SERP is led by CMTEB's own live-status pages, so the intent is 'is there hot water right now' -- which the homepage never answered. This adds a citywide answer-first live-status block with a per-sector table, tunes the homepage title/description to that intent, and adds a five-question citywide FAQ with FAQPage JSON-LD. All numbers come from the nightly termo-data bundle.
Why
SERP for 'apa calda' (checked 2026-09-14): positions 1-4 are all CMTEB (live status page, system map, Facebook, homepage), position 5 is Digi24 news about the Berceni avarie. We cannot beat the supplier on 'official now', but we win on aggregation by sector, history and street-level lookup. The homepage was 100% historical with zero live content; sector pages already answer per-sector, the homepage now answers citywide and routes people to them.
What changed (app/page.tsx)
Also in this branch
Verification
Generated by SEO Sentinel (order 71). PR only, human review required before merge.
🤖 Generated with Claude Code