2026-08-24-seo-audit.md
countries/tn/reports/2026-08-24-seo-audit.md
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 ($nameAris 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).annuaireindex (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)
- [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. - [Mechanical] Shorten the meta-description template in
annuaire/_delegation.blade.php(261 pages, worst case 220 chars) — same finding, second file. - [Mechanical, trivial] Trim the
annuaireindex title from 67 to ≤65 chars — 1 page, cosmetic, bundle with the two above rather than its own PR line. - [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 pertn:decisions-escalatecadence. - [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-17on TN paths unchanged (still the 5 known commits). - Shared-component diff (the 08-17 lesson): zero commits touching
app/Support/FaqAnswer.phporresources/views/components/accordionsince 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.jsonagainst 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
openin the register, still live (0FAQPageblocks 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. Nexttn:decisions-escalatere-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.