Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
git clone --depth 1 https://github.com/arturogarrido/claudinhoWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/rules/arturogarrido/claudinho/surface-parity)<a href="https://agentmods.dev/rules/arturogarrido/claudinho/surface-parity"><img src="https://agentmods.dev/badge/rules/arturogarrido/claudinho/surface-parity/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/rules/arturogarrido/claudinho/surface-parity"><img src="https://agentmods.dev/badge/rules/arturogarrido/claudinho/surface-parity.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.01462 |
| Opus 5.5 | $0.00000 | $0.00585 |
| Sonnet 5.5 | $0.00000 | $0.00292 |
| Haiku 4.5 | $0.00000 | $0.00146 |
Grade A, and why
surface-parity scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 7d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 45 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Surface parity (CLI / MCP / share)
Any user-visible formatter change must land on all three surfaces before merge (the language exception below aside):
| Surface | Verify |
|---|---|
| CLI | packages/cli command + packages/cli/test/ |
| MCP | toolGet* in packages/mcp/src/tools.ts + packages/mcp/test/tools.test.ts |
| Share | formatShare* + packages/mcp/test/share.test.ts |
One stated exception: the match timeline (core timelineRows) is CLI match (its text and --json's lines) and MCP
get_match only (the plugin's match pane draws match --json's rows, with lines for an older CLI, so it shows the same rows); a share card prints
none. A second: the ambient --json line and the plugin's moments (its toasts and celebration, from words) follow the
CLI's language (lang), while the statusline and the hook stay English; MCP is unchanged by this exception (it
localizes by its own lang argument, as before).
Knockout surfaces live-resolve — never read the skeleton (the #1 recurring bug)
Rule: every team-facing surface must reach the live overlay (getBracket / getNextFixtureForTeam — on the bundled competition, the same fetchWindow the bracket uses; off it next reads discovery's schedule ahead and bracket makes no request), fail closed on outage, and attribute the provider only when the overlay served the chosen fixture.
| Surface | Entry point | Must |
|---|---|---|
CLI bracket / next |
cmdBracket / cmdNext |
call getBracket / getNextFixtureForTeam (a saved pin: nextFixtureForPin, which on the bundle IS getNextFixtureForTeam by code) |
CLI share bracket / share next |
cmdShare |
same |
MCP get_bracket / get_next_fixture |
toolGetBracket / toolGetNextFixture |
same (no team: the server's CLAUDINHO_TEAM, else the pin through nextFixtureForPin) |
MCP get_share_snippet{bracket,next} |
toolGetShareSnippet |
same |
| statusline | renderPrompt + runRefresh |
hot path, NO network — indirect: refresher caches getKnockoutFixtures → CacheState.fixtures; renderPrompt merges them, failing closed to ⚽ — when the cache lacks the pairing; unresolved placeholders dropped in syncing (never 🏳️). Empty successful fetch uses a short TTL (~60s); provider errors keep prior cache. cmdPrompt and cmdHook both spawn fixtures refresh in knockout phase. |
ambient --json |
cmdAmbient → ambientView |
the statusline's cache through the same reader: its line and next come from the resolved pairings and fail closed the same way (⚽ —, next: null); its line says its countdown, syncing phrase and HT/LIVE in the view's lang (words beside it, the moment words in that language), while claudinho prompt stays English; hot path, NO network, the same refresher trigger as cmdPrompt. |
Claude Code plugin's band, /claudinho and the match pane |
packages/plugin/hooks/register.tsx (ui.render on AbovePrompt; command.run on claudinho; ui.render on Pane, requestId match) |
the band renders ambient --json's lineParts (its strong part bold) when their texts join to line, else line; the toasts and the celebration read the view's live, finished, pinnedSide, names and lastGoal, today's text for a view without names, their words from the view's words (today's English ones when unreadable); every ambient run (the band's, /claudinho's) ends with --lang <code>, and the match runs too once any view states lang; /claudinho relays its line, then its attribution and disclaimer from a view; /claudinho match binds the view's first live record (else its next) and its competition, and the pane draws match <id> --json's rows (with lines verbatim for an older CLI; the run names no competition, so the CLI's mode row says where the person's choice came from; once an answer names another competition, or none, the binding is pinned and every read passes --competition <slug>), then its attribution and disclaimer; all read no skeleton (no cache, no bundle: the CLI's objects only), so they fail closed where ambient --json and match --json do; its coverage is the kit (packages/plugin-tests/hooks/*.test.tsx, claude plugin test through scripts/plugin-test.sh), not the two coverage tests. |
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 7d ago Changed 340622191605
- 9d ago Changed · +3 lines 4e3a6142aaa0
- 12d ago Changed 923792a33715
- 13d ago Changed · +4 lines ca57edd9d124
- 14d ago Changed 09f8fd406dc4
- 16d ago Changed · +2 lines fccb0f6e7d1b
- 17d ago Changed · -47 lines f22741a530ad
- 21d ago Changed · +2 lines 7885b9f74d74
- 22d ago Changed · +8 lines c1df7b6e521a
- 23d ago First seen · 73 lines · 0 tokens per session scan A 7e563baf6ce5
surface-parity is a cursor rule published in the GitHub repository arturogarrido/claudinho (34 stars, last pushed yesterday), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 1,462 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other cursor rules, from other repositories
docs-i18n-parity
Guide docs must stay in sync across all VitePress locales (en + pt-BR, es, zh-CN, hi-IN).
docs-translation
The Russian documentation tree (docs/ru), what moves with an English page, the stamp, and the writing rules for Russian and English documentation.
russian-wording
Russian wording for agent-related text (UI dictionaries, documentation, answers).
i18n
Multi-language content, translations, and localized templates.
hatch3r-i18n
Internationalization, localization, and RTL support conventions for the project.
appstore-ppp-pricing
Bulk-set App Store in-app purchase and subscription prices across 175+ countries by purchasing power parity (PPP) with the appstore-ppp-prices CLI. Use for regional App Store pricing, price localization, bulk price updates, or making an app cheaper in emerging markets.