surface-parity

surface-parity is a cursor rule for Cursor from arturogarrido/claudinho. It costs 0 tokens per session (1,462 once invoked), scanned A, original, MIT.

A rule requiring the command-line interface, MCP tools, and shared links to accept and apply the same formatting options, such as time zone and language.

In plain words
What is it for?
Use it when changing user-visible formatting, so the CLI, MCP integration, and sharing view are updated and tested together.
Why use it?
It prevents users from seeing different dates, times, or flags depending on how they access the same data.

Cursor rule for Cursor

Written for Cursor: installed under .cursor/. Also seen: mentions Claude Code; mentions AGENTS.md.

Good fit Use it when changing user-visible formatting, so the CLI, MCP integration, and sharing view are updated and tested together.

Compare 6 cursor rules from other repositories ↓
Install with agentmods
npx agentmods add rules/arturogarrido/claudinho/surface-parity
Install

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.

Clone the repo
git clone --depth 1 https://github.com/arturogarrido/claudinho

Made for: Cursor.

Wrote 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.

agentmods badge for surface-parity

README.md
[![agentmods](https://agentmods.dev/badge/rules/arturogarrido/claudinho/surface-parity/github.svg)](https://agentmods.dev/rules/arturogarrido/claudinho/surface-parity)
Your own site
<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.

agentmods 80×15 button for surface-parity

Your own site · 80×15
<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>
Per session 0 Nothing until a file matches its globs; then the whole rule loads.
When invoked 1,462 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce 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

Measured 7d ago against content hash 340622191605, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

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.

.cursor/rules/surface-parity.mdc · 45 lines

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.

Read the full file on GitHub · 45 lines

Changes

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.

  1. 7d ago Changed 340622191605
  2. 9d ago Changed · +3 lines 4e3a6142aaa0
  3. 12d ago Changed 923792a33715
  4. 13d ago Changed · +4 lines ca57edd9d124
  5. 14d ago Changed 09f8fd406dc4
  6. 16d ago Changed · +2 lines fccb0f6e7d1b
  7. 17d ago Changed · -47 lines f22741a530ad
  8. 21d ago Changed · +2 lines 7885b9f74d74
  9. 22d ago Changed · +8 lines c1df7b6e521a
  10. 23d ago First seen · 73 lines · 0 tokens per session scan A 7e563baf6ce5

Subscribe to this mod's changes

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.