tn:ctr-optimizer
Convert impressions the site already earns into clicks — rewrite titles, meta descriptions and rich-result markup on pages that rank well but earn few clicks, and grade the previous run's pages 28 days on.
Manifest
tn/tasks.yaml- Address
tn:ctr-optimizer— alsotn:ctr-optimizer- Runner
- claude-code
- Policy
- pr may push a countryos/* branch and open a draft PR — the review is the gate
- Workspace
- the cms clone
- Schedule
0 9 20 * *· next 20/09/2026 09:00- Model
- opus
- Budget
- 100 turns · 60 minutes
- Triggerable
- yes — free text can reach it
- Notifies
- every run — 🟢 on success, 🔴 on failure
- Description (manifest)
- Convert impressions the site already earns into clicks — rewrite titles, meta descriptions and rich-result markup on pages that rank well but earn few clicks, and grade the previous run's pages 28 days on.
| When | What it reported | Turns | Took | Cost | |
|---|---|---|---|---|---|
| 20/08/2026 09:05 | Opened draft PR #16566 (https://github.com/Selectra-Dev/cms/pull/16566) with two attributable CTR rewrites — `/coupures` retargeted at "panne de courant" (1,282 impr at 0… | 28 | 5m | $1.56 | ok |
The skill it runs
countries/tn/skills/ctr-optimizer/SKILL.md · 112 linesRead the skill
CTR optimizer — tunisie-electricite.com
You are in the cms monorepo clone. Unlike seo-audit, which asks is this page
healthy, this task asks is this page earning what its rank should earn — and
it is the only TN task with a metric that grades its own previous run.
The site's bottleneck is not rank. Average position sits around 6, impressions grow faster than clicks, and several pages hold five-figure impression pools at under 1 % CTR. That gap is what this task closes.
Before anything else: grade the last run
Read memory/journal.md for the previous ctr-optimizer entry. If one exists
and its PR merged at least 28 days ago, re-measure exactly the URLs it
touched before choosing new work:
gsc page https://tunisie-electricite.com/<path> --site tunisie-electricite.com
Journal the before → after for each: impressions, clicks, CTR, position. This is the point of the task — a rewrite that lost clicks must be reported as a loss and its page put on a do-not-touch list, not quietly replaced with a new attempt. Do not roll back a losing rewrite in the same run: recommend the revert, let the human decide, then move on to fresh pages.
Pick the work
gsc-opportunities --site tunisie-electricite.com
Three of its sections are actionable here; use them in this order.
cannibalsfirst. Two of your own URLs splitting one query is the only failure this task can fix outright, and it caps every other gain on those pages. For each: decide which URL should own the query, then make the loser stop competing — retarget its title/H1/meta at its own distinct intent and link it to the winner. Never delete or redirect a page in this task; that is an architecture decision for a human.ctr-gapsnext, top of the list down. These pages already rank — they are losing the click in the SERP.page-twoonly to inform the copy: a query at position 8-25 needs rank, which is content and links, not a snippet. Note the good ones forbusiness-reviewto raise as content proposals; do not try to fix them here.
Then, for every page you intend to touch, pull what it actually ranks for:
gsc page https://tunisie-electricite.com/<path> --site tunisie-electricite.com
Write to the queries the page really receives, not to the topic you assume it
covers. A page whose top queries are paiement facture steg par carte bancaire
and steg en ligne is being found by people mid-transaction; a title that
promises an explanation loses them.
Cap the run at 6 pages. A smaller batch that can be attributed beats a sweep whose result nobody can read.
What you may change
$title— write for the real query, front-load the words the searcher typed, keep ≤ 65 characters.$metaDescription— ≤ 160 characters, French (fr-TN), and it must promise something the official STEG site does not: the number without a login, the procedure in steps, the figure itself.$keywords, H1, and the intro paragraph, when they contradict the new angle.- Rich-result markup:
FAQPagewhere a real FAQ accordion exists,HowTofor a procedure the page genuinely documents. Copy the exact JSON-LD pattern from a page that already has it — do not invent a structure, and never mark up questions or steps the page does not visibly answer.
What you may not change
- Any fact — tariff, phone number, address, procedure. Hard rule 1 applies in full: a rewrite that rephrases a figure must keep the figure identical. If a snippet would read better with a number the page does not already state, leave it out.
- Body content beyond the intro, page structure, new pages, data files, or
anything outside
sites/tunisie-electricite.com/anddepartments/tunisia-energy/. - The dynamic templates' data — you may rewrite the title/meta expression in
annuaire/_gouvernorat.blade.phporcoupures/_municipalite.blade.php, but check what it renders for several real slugs first, including the longest governorate name, so no generated title blows the character limit.
Ship it
- Branch
countryos/tn/<YYYY-MM-DD>-ctr-optimizerfromorigin/develop. One commit per page, so a reviewer can reject a single rewrite. - Re-measure every new title and meta with
nodeand confirm the real character count — count them, do not eyeball, and decode HTML entities first ('inflates a naive.length). - Push and open a draft PR to
developwithgh pr create --draft, titled[tn] CTR optimizer <YYYY-MM-DD>. The body must be a table: page · impressions · current CTR · position · before → after title and meta · the queries each rewrite targets. A reviewer has to be able to disagree with one line without reading the diff. - Append a journal entry naming every URL touched and the date this run becomes measurable (merge date + 28 days), so the next run knows what to grade.
- Report the PR URL and the modelled click gap you went after in your final message.
Never merge or mark the PR ready yourself.