0% 5h quota used · resets in 2h live · 08/09/2026 12:12 CEST

2026-08-24-seo-audit.md

countries/tn/reports/2026-08-24-seo-audit.md

seo-audit tn written 24/08/2026 12:06 ← previous seo-audit next seo-audit →

SEO Audit — tunisie-electricite.com — 2026-08-24

Diffed against reports/2026-08-17-seo-audit.md. git log origin/develop --since=2026-08-17 -- sites/tunisie-electricite.com departments/tunisia-energy returns 5 commits, all already known from the journal: cannibalisation split (#16216), the /tarifs billing-model fix (#16234), the kVA redevance correction (#16279), the tariffs.php single-source refactor (#16291, no rendering change), and the CTR-optimizer pass on /coupures + /tarifs-gaz (#16566). No open countryos/tn PR exists (gh pr list checked first).

1. Live site health

All 16 checked URLs returned 200 OK, response times 0.09–0.23s. sitemap.xml (673 URLs: 374 /coupures/*, 24 /annuaire/{gouvernorat}, 1 /annuaire index, rest static — matches the 673 total exactly, consistency check passed) and robots.txt both healthy.

2. Page audits (13 static pages)

Re-verified only the 6 pages touched by the 5 commits above, per the "re-verify only pages that scored <80 or changed since" rule; the other 7 unchanged pages carried forward from 08-17 (all confirmed via unrelated git log/live health check above to still be untouched).

Page Score Δ Note
/tarifs 96 title 65, meta 140, unchanged length; content fix landed: billing model now derives VAT and shows "barème vérifié le …", worked example renders 65,114 millimes (3 kVA) live — matches the journal's verified figure
/tarifs-gaz 93 title 62, meta 152 (was 64/159) — CTR-optimizer rewrite, still within guideline
/coupures 92 title 64, meta 156 (was 66/156) — CTR-optimizer rewrite, still within guideline
/steg/facture 87 title 61, meta 156 — redevance wording aligned with /tarifs, still within guideline
/steg/service-client 88 title 59, meta 149 — cannibalisation-split wording, still within guideline
/ (homepage) 89 title 56, meta 148, Organization+WebSite JSON-LD confirmed still live
/steg 91 carried forward, unchanged
/steg/raccordement-gaz 90 carried forward, unchanged
/steg/numero-vert 84 carried forward; FAQPage regression (D-002) confirmed still present — only BreadcrumbList in JSON-LD, GitHub issue cms#16773 still open
/steg/solaire 89 carried forward, unchanged
/steg/raccordement 86 carried forward, unchanged
/mentions-legales 82 carried forward, unchanged
/steg/coupures 80 carried forward, unchanged

No SEO-metric regressions from the 5 content commits — every edited page stayed within the title/meta length guideline despite the wording changes.

3. Directory audit — new systemic finding, see §5

Expanded the usual "3 random pages" spot-check into a template-level length audit (the same methodology the 07-27 outage-page finding used: check the worst-case real name, not just a sample) after a sampled delegation page turned up a 206-char meta description. Full results in §5 — this supersedes the routine spot-check for this run.

4. og:image / FAQ tracking (unchanged, still non-mechanical)

  • ogImage: still 0/13 static + 0/286 annuaire + 0/374 outage pages. Flagged 7 runs running now.
  • FAQ accordions: same 6 /steg/* pages still lack a FAQ section/schema (unchanged, editorial work).

5. New finding — annuaire meta descriptions systemically over length, 285 of 286 pages

Six prior audits scored the /annuaire/* templates on structured-data presence (BreadcrumbList, added 07-02) but never measured title/meta length against real data — every spot-check report says "correct title/meta" without a character count. Doing that this run found both non-index templates are hardcoded to sentences that never fit 160 characters, regardless of place name:

  • annuaire/_gouvernorat.blade.php (24 pages, /annuaire/{slug}): meta is a fixed sentence plus a conditional Arabic clause ($nameAr is populated for all 24). Sampled range 232–234 chars; worst case (Sidi Bouzid) 244 chars — 84 over guideline. Titles are fine (43–50 chars).
  • annuaire/_delegation.blade.php (261 pages, /{gouvernorat}/{delegation}): meta fixed sentence, no Arabic clause but still long. Sampled range 199–208 chars; worst case (Sayada Lamta Bou Hajar, Monastir) 220 chars — 60 over guideline. Titles fine (48–65 chars, the worst case lands exactly at 65).
  • annuaire index (1 page): meta 155 (fine), title 67 — 2 chars over the 65 guideline, cosmetic.

Net: 285 of the 286 annuaire pages breach the meta-description guideline by 39–84 characters, every one of them via a template sentence that is fixed regardless of the entity name — the same shape of bug as the 07-27 outage-page finding (single hardcoded string, page-count multiplies the impact), except this one predates this skill's tracking (the templates already existed at the 07-02 audit, which only checked for BreadcrumbList presence) and slipped past six audits because nobody measured the string length until this run's spot-check happened to sample a long name.

This is mechanical per the skill's own definition (title/meta trim) and template-scoped: two file edits (_gouvernorat.blade.php, _delegation.blade.php) fix all 285 pages, matching the leverage of the 07-27 outage-template fix. Per that same lesson, any rewrite must be checked against the longest real name in governorates.json (Sidi Bouzid, Sayada Lamta Bou Hajar), not just a sample.

Top actions (ranked by impact/effort)

  1. [Mechanical] Shorten the meta-description template in annuaire/_gouvernorat.blade.php (24 pages, worst case 244 chars) — new this run, highest page-count-weighted impact found to date on a single fix.
  2. [Mechanical] Shorten the meta-description template in annuaire/_delegation.blade.php (261 pages, worst case 220 chars) — same finding, second file.
  3. [Mechanical, trivial] Trim the annuaire index title from 67 to ≤65 chars — 1 page, cosmetic, bundle with the two above rather than its own PR line.
  4. [Escalate — out of TN scope, unchanged] FaqAnswer/accordion schema regression on /steg/numero-vert (D-002) — GitHub issue cms#16773 still open, no developer action yet. 7 days since last notification per tn:decisions-escalate cadence.
  5. [Non-mechanical] ogImage site-wide — still 0/673 pages (13 static + 286 annuaire + 374 outage), 7th run flagged.

Chain decision

3 mechanical items this run (2 substantial template fixes + 1 trivial title trim), clearing the ≥2 threshold — and unlike the last two audits (08-10, 08-17) there is no open countryos/tn PR blocking a new one (gh pr list --state open --search "countryos/tn" → empty). Triggering:

countryos-trigger tn:seo-fixes implement the mechanical items from today's audit report (reports/2026-08-24-seo-audit.md)

Addendum — 2026-08-24, second scheduled fire (10:03)

This task fired twice today. The audit above (09:45) ran and chained tn:seo-fixes, which opened draft PR #17032 (countryos/tn/2026-08-24-seo-fixes) at 09:48. This second fire recognised the duplicate and verified the resulting state instead of re-running the audit.

  • Live health re-check: all 8 core URLs still 200 OK (0.08–0.13s) — no regression in the 20 minutes since the audit ran.
  • No new TN commits: git log origin/develop --since=2026-08-17 on TN paths unchanged (still the 5 known commits).
  • Shared-component diff (the 08-17 lesson): zero commits touching app/Support/FaqAnswer.php or resources/views/components/accordion since 08-17 — D-002's root cause untouched.
  • PR #17032 verified correct, independently: re-derived every real (governorat) and (delegation, gouvernorat) pair from governorates.json + steg_agencies.json against the branch's template strings. Max meta: governorate 151 chars (Sidi Bouzid, 2 agences/12 délégations), delegation 145 chars (Bou Mhel el Bassatine / Ben Arous — not the audit's named worst case, confirming the multi-variable lesson). Max delegation title 65 (Sayada Lamta Bou Hajar), index title 54. All within guideline. The audit's two named worst-case names held up as the real maxima for the governorate template; for the delegation template the true max is a different pair entirely.
  • Live baseline for the PR: current production metas measure 244 chars (/annuaire/sidi-bouzid) and 230 chars (/monastir/sayada-lamta-bou-hajar) — the latter 10 chars above this audit's 220 worst-case estimate, i.e. even the audit's worst-case reconstruction understated the rendered length. The branch fixes both to ≤160.
  • D-002 status: still open in the register, still live (0 FAQPage blocks on /steg/numero-vert). The mirror GitHub issue cms#16773 is CLOSED as of 08-24 08:07Z, but no code fix has landed — the closure is the regenerated-aggregator lifecycle, not resolution. Next tn:decisions-escalate re-raise due ~08-27 (last Notified 08-20, 7-day cadence).

Chain decision (this fire): no trigger. PR #17032 is open and covers all 3 mechanical items — stacking a second PR would split attention on the same fix. The real blocker is human review of #17032.