Ran gh pr list --state open --json number,title,headRefName,isDraft --jq '.[] | select(.headRefName | startswith("countryos/"))' in cms — zero results. Cross-checked via gh pr list --state all --search "head:countryos/global": all five countryos/global/ PRs to…
Global
Workspace countries/_global/ — not a market. The leading underscore means cross-country work on the shared cms.
Guardrails
countries/_global/country.yaml — every run is admitted against these- On exceed
- alert reported and carried on — API-equivalent dollars are a quota proxy, not money
- A task may declare
- autonomy autonomouspr · at most 200 turns · at most 120 min
- Per-run ceiling
- $15.00 — alert only, a finished run is already spent
- Warns at
- 80%
- Refused so far
- nothing has been refused
- Declared, not enforced
- —
Read country.yaml
# Not a country: cross-country maintenance of the shared cms monorepo (see
# CLAUDE.md). Field reference: ../COUNTRY.md.
identity:
name: Global
guardrails:
autonomy_allowed: [autonomous, pr]
turns_max: 200
minutes_max: 120
budget:
run_max_usd: 15
daily_max_usd: 30
monthly_max_usd: 100
monthly_spend_max_usd: 10 # real money
runs_per_day: 10
on_exceed: alert
Tasks
the whole fleet| Task | Does | Policy | Next | Last 12 | Spent |
|---|---|---|---|---|---|
| sentry-triage | Weekly Sentry triage of the cms, telecom and renovation repos — fix what is safely code-fixable, one draft PR per repo, journal the rest. Ignores third-party noise. | pr | in 18h | $32.71 | |
| sentry-verify | Check whether merged sentry-triage fixes actually deployed and actually worked, and resolve in Sentry the issues whose errors stopped. The ones still bleeding are left open and come back on the triage worklist as FIX-FAILED. Deterministic, no LLM. | autonomous | in 17h | $0 | |
| monthly-report | Monthly "what Country OS did" report for every workspace — one Google Doc per country plus the cross-country one, each on a stable link updated in place. Journal + ledger + GitHub only; the business/traffic view is tn:business-review. | autonomous | in 23d | $3.21 | |
| pr-review | Process human review feedback on open countryos/global/* draft PRs — apply requested changes, answer questions, revert rejected fixes, and record the rejected patterns in memory so future runs never repeat them. | pr | in 21h | $15.04 | |
| price-watch | Weekly check that each provider's published prices still match orchestrator/src/rates/*.json, and announce anything a human has to settle. Writes no rate: a difference becomes an entry in _global/decisions.md. | autonomous | on demand | $0 | |
| price-parser-repair | Repair a pricing-page parser after a provider redesigns its page, once a human has settled what the price actually is. Opens a draft PR; never edits a rate table. | pr | on demand | $0 | |
| decisions-answer | Record a human answer to an open platform decision (OS-001, OS-002…) in _global's decisions.md — approve, reject, or note a conditional reply that arrived by Google Chat. | autonomous | on demand | $2.97 | |
| decisions-escalate | Announce platform decisions to Google Chat and defects to GitHub the day they are opened, and re-raise anything still unanswered. Deterministic, no LLM. Without it _global's register is write-only — which is the failure the register exists to fix, one level up. | autonomous | in 20h | $0 |
Spend by month
The brief this workspace runs on
countries/_global/CLAUDE.md · every run reads it firstRead CLAUDE.md
Country OS — _global
This is not a country. It is the cross-country workspace: repo-wide and platform-wide maintenance that isn't tied to any single country's business — work that benefits every site. Tasks here own the health of the shared application repos (Sentry triage, PR review follow-up), not a market.
Country workspaces (de, tn, …) run their business. This one runs the
plumbing underneath all of them. If a task only makes sense for one country, it
belongs in that country's workspace, not here.
Historically these tasks lived in countries/fr/ because France is Selectra's
main country and the cms was "its" repo — that conflation ended 2026-08-11 when
this workspace was created. The fr history (journal, triage records, review
rules) moved here unchanged: it is this workspace's history.
Where things live
The repos are declared in orchestrator/src/repos.yaml — that file is the source
of truth for where each clone is, which branch to work from, and which Sentry
project reports on it. A run is told the same facts in its prompt. All are
Laravel.
cms — the monorepo hosting every site. No admin UI, content is Blade files
in git.
- Sites:
sites/<domain>/(pages, config) - Shared verticals/data:
departments/<name>/ - App code:
app/(controllers, services),routes/ - The monorepo has its own Claude skills — use them when relevant.
telecom — the telecom comparator (comparateur.selectra.info/telecom).
France live, Belgium in progress. A single application, standard Laravel layout.
renovation — the Renovation API, part of Web Sales Telecom. A single
application, standard Laravel layout.
Each repo has its own CLAUDE.md. When you are working in one, it governs —
read it before you change anything there.
Hard rules
- Maintenance, not features. Fixes here must be minimal, mechanical and low-risk: handle the exact failing case, no refactors, no behavior changes on the happy path. Human teams own every site's roadmap.
- All changes go through git branches named
countryos/global/<date>-<topic>(no underscore — reviewers see this name), then a DRAFT PR to that repo's base branch — never commit to a base branch directly, never merge or mark a PR ready. One repo per branch and per PR: they are separate remotes with separate reviewers, and a branch spanning two of them cannot be reviewed by either. - Never invent factual data. If a fix needs a real-world fact (tariff, phone number, address), stop and flag it instead of guessing.
- Never touch
vendor/, dependency manifests (composer.*,package*), CI/deploy config, or.env*files. - Match each site's language and the conventions of the code you edit.
memory/review-feedback.mdis binding. It holds rules distilled from human PR reviews. Read it before changing any code; never ship a pattern a reviewer has rejected. If a rule seems to forbid the only viable fix, classify the issue REPORT instead of overriding the rule.- As few comments as possible in the code you ship. A comment says why,
and only when the reason is genuinely unusual. Delete it and re-read the code:
if it still makes sense, it stays deleted. Configuration files are the
exception — see the full rule and its worked examples in
memory/review-feedback.md. - Blast radius is what the repo makes it. In
cms, a fix inapp/ordepartments/serves dozens of sites in several languages: "safe for the site that errored" is not the bar, "safe for every site touching this code" is. Intelecomandrenovation— single applications — shared code has one caller set you can actually read, so the same caution would just be superstition. Judge the reach of the code you are touching, in the repo you are touching it.
Memory
memory/journal.md is your run journal — read it at the start of every run,
append a dated entry at the end. Durable lessons go to memory/ as separate
files.
Journal
54 entriesRan gh pr list --state open --json number,title,headRefName,isDraft --jq '.[] | select(.headRefName | startswith("countryos/"))' in cms — one result: PR #19418 (countryos/tn/2026-09-05-content-calculateur-facture-steg, Tunisia, not ours). Confirmed via gh pr l…
Ran gh pr list --state open --json number,title,headRefName,isDraft --jq '.[] | select(.headRefName | startswith("countryos/"))' in cms — zero results. Confirmed via gh pr view 18722 that PR #18722 (countryos/global/2026-09-02-sentry-fixes) is still MERGED (me…
Ran gh pr list --state open --json number,title,headRefName,isDraft --jq '.[] | select(.headRefName | startswith("countryos/"))' in cms — zero results. gh pr view 18722 confirms it MERGED at 2026-09-02T09:48:16Z (same-day merge from yesterday's sentry-triage r…
This run's repo grant was cms only (base develop), so checked that repo alone, matching this task's own scope. gh pr list --state open --json number,title,headRefName,isDraft --jq '.[] | select(.headRefName | startswith("countryos/"))' returned two: PR #18722…
Monthly report
- Google Doc
- Country OS — Cross-country
- Updated
- 01/09/2026 08:11
Latest runs
all 64| When | Task | What it reported | Cost | |
|---|---|---|---|---|
| 08/09/2026 09:00 | pr-review | No open Country OS PRs found this cycle — all five `countryos/global/*` PRs remain merged since #18722 on 2026-09-02, and the previously-open other-co… | $0.68 | ok |
| 08/09/2026 08:00 | decisions-escalate | Nothing to announce (1 open, all seen within the last 7 days). | $0 | skipped |
| 08/09/2026 05:00 | sentry-verify | Nothing to resolve. | $0 | skipped |
| 07/09/2026 12:41 | decisions-escalate | Nothing to announce (1 open, all seen within the last 7 days). | $0 | skipped |
| 07/09/2026 09:00 | pr-review | No open `countryos/global/*` PR exists — all five to date are merged, and the only open Country OS PR right now (#19418, Tunisia's STEG calculator) ha… | $0.73 | ok |
| 07/09/2026 08:00 | decisions-escalate | Nothing to announce (1 open, all seen within the last 7 days). | $0 | ok |
| 07/09/2026 05:00 | sentry-verify | Nothing to resolve. | $0 | error |
| 06/09/2026 08:00 | decisions-escalate | Nothing to announce (1 open, all seen within the last 7 days). | $0 | ok |
| 06/09/2026 05:00 | sentry-verify | Nothing to resolve. | $0 | error |
| 05/09/2026 08:00 | decisions-escalate | Nothing to announce (1 open, all seen within the last 7 days). | $0 | ok |
| 05/09/2026 05:00 | sentry-verify | 2 issue(s) resolved. | $0 | ok |
| 04/09/2026 09:00 | pr-review | No open Country OS PRs exist in `cms` — PR #18722 (the last `countryos/global/*` PR) has been merged since 2026-09-02, and no other open PR uses a `co… | $0.75 | ok |
| 04/09/2026 08:00 | decisions-escalate | Nothing to announce (1 open, all seen within the last 7 days). | $0 | ok |
| 04/09/2026 05:00 | sentry-verify | Nothing to resolve. | $0 | error |
| 03/09/2026 09:00 | pr-review | No open Country OS PRs exist anywhere — PR #18722 (yesterday's sentry-triage fix) already merged with only the auto-merge bot's scope-check comment an… | $0.73 | ok |