review-docs
Skill459 starsChanged 59 days agoApache-2.0View on GitHub
Audit a game environment's README.md and AGENTS.md against its engine implementation. Use when the user asks to "review", "audit", "check", or "fact-check" environment docs, when players report doc/engine discrepancies, or before a competition launch. Also use proactively after changing an environment's engine (`kaggle_environments/envs/<game>/<game>.py`) when a sibling README.md or AGENTS.md exists — rebalances and mechanic changes routinely leave those docs stale. The engine is always the source of truth — docs get fixed, not the engine.
23 other projects use a version of this.
Adopted by
Most recently taken up by
- heypinchy/pinchytheir own version, first seen Nov 6, 2026
- opensanctions/opensanctionstheir own version, first seen Nov 1, 2026
- desbma/agent-skillstheir own version, first seen Oct 27, 2026
- FranciscoMoretti/chat-jstheir own version, first seen Oct 19, 2026
- app-dev-panel/app-dev-paneltheir own version, first seen Oct 8, 2026
- thoughtfulllc/gridlandtheir own version, first seen Oct 8, 2026
Used with
Projects with it also use create-vercel-ai-issue, dev-auth-bypass and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
FranciscoMorettiSkillcreate-vercel-ai-issue
Create a well-formed GitHub issue in vercel/ai using the gh CLI. Use when reporting an AI SDK bug or preparing an issue body that contains logs, code blocks, versions, reproduction steps, and shell-sensitive text.
Also in 3 projects that use this
FranciscoMorettiSkilldev-auth-bypass
Authenticate a browser against a local ChatJS app without OAuth. Use for development login, local auth bypass, authenticated browser or Playwright testing, and the /api/dev-login route.
Also in 3 projects that use this
- +10 more from FranciscoMoretti
Other versions23 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 23
- tldraw/tldraw★ 51ksame name
- videojs/video.js★ 40ksame name
- reactjs/react.dev★ 12ksame name
- hashicorp/terraform-provider-aws★ 11ksame name
- JamieMason/syncpack★ 2.1ksame name
- OpenAEV-Platform/openaev★ 1.8ksame name
- FranciscoMoretti/chat-js★ 1.2ksame name
- FranciscoMoretti/chatjs★ 1.2ksame name
- FranciscoMoretti/sparka★ 1.2ksame name
- opensanctions/opensanctions★ 870same name
13 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository17 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- create-environmentSkill
- create-harnessSkill
- create-playable-visualizerSkill
- create-visualizerSkill
- onboard-open-spiel-gameSkill
- review-harnessSkill
- run-ablationSkill
- create-environmentSkill
- create-harnessSkill
- create-playable-visualizerSkill
- create-visualizerSkill
- onboard-open-spiel-gameSkill
- review-docsSkill
- review-harnessSkill
- run-ablationSkill
The file
We split this skill into the rules it gives an agent
6 rules. 0 are common, 4 are distinctive, and 2 are very specific to this project.
0
Common
Most of the 21 edited versions we read keep these.
4
Distinctive
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 18
Never verify a claim by reading code and reasoning about it.
- Very specific: line 38
Don't name scratch files after stdlib modules (numbers.py breaks the import chain).
- Very specific: line 40
Verify action- and transaction-related claims through make() too.
- Distinctive: line 128
No bold lead-ins to make a rule feel urgent.
- Distinctive: line 129
Leave pre-existing prose alone unless it's factually wrong.
- Distinctive: line 139
Before finishing: re-verify every number you wrote with one audit script asserting doc value == engine value, and run the env's test suite.
“Common” is measured: kept by at least 6 in 10 of the 21 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Review Environment Docs Against the Engine
Audit kaggle_environments/envs/<game>/README.md and AGENTS.md for claims that disagree with the engine.
Core rule
The engine is the source of truth. Fix the docs, not the engine. Agents play against the implementation, and changing engine behavior late invalidates existing submissions and replays.
Exception: if a mechanic is clearly a bug rather than an undocumented quirk, flag it and ask. Don't silently enshrine a bug as intended.
Method: simulate, don't reason
Never verify a claim by reading code and reasoning about it. Execute the engine and observe. Cheapest entry point first:
# 1. Internal helpers — isolates one rule
from kaggle_environments.envs.<game> import <game> as G
G._new_<entity>(...) # constructor: initial field values
G._apply_<action>(...) # one action
G._<periodic_hook>(...) # end-of-turn / round / phase transition
# 2. Full env — catches validation the helpers skip
from kaggle_environments import make
env = make("<game>", configuration={...}); env.reset(2); env.step([a0, a1])
# 3. OpenSpiel games
import pyspiel; state = pyspiel.load_game("<name>").new_initial_state()Step through the entire lifecycle — creation to terminal state — recording observable state at every step, not just the endpoints. Most doc bugs live in the middle: a value that plateaus early, a counter starting at the wrong number, a transition firing a step sooner than the prose implies.
Gotchas:
- Don't name scratch files after stdlib modules (
numbers.pybreaks the import chain). - Helpers may replace an object rather than mutate it (one entity type becoming another). Re-read from the container after each call.
- Verify action- and transaction-related claims through
make()too.
Checklist
Skip sections that don't apply. Each item is a real bug class found in a prior audit.
Constants, tables, and formulas
- Every value in a doc table matches the engine's constants. Check every row, not a sample.
- Derived columns (rates, per-unit costs) use one consistent formula, and the doc says which. Mixed formulas across rows is the tell.
- "Max" values are reachable. A cap needing an optional booster needs that qualifier; a cap unreachable in a variant lacking the booster is wrong.
- Column headers mean what the values show. If they disagree, ask the user whether to change the number or the header.
- Formulas match the code symbol for symbol — exponents, log bases, clamps, order of operations. Recompute any worked example.
State initialization and lifecycle
- Initial value of every field in each constructor. A counter starting at 1 instead of 0 silently removes a grace period the prose implies.
- "Ongoing" / "indefinite" / "repeating" claims: find the cap (a count-vs-max guard, a lifespan field being armed). If one exists, the doc must say so.
- Exact step an entity or episode ends, and what stays usable on the way out.
- Ordering inside periodic hooks: which mutations run before which checks. That ordering is often what makes a rule surprising.
- Cooldowns: when the counter ticks relative to the action, whether a failed attempt consumes it, turns-between vs. turns-until.
- Rates that ramp or decay: recompute at start, middle, and end. Watch for rounding or a clamp that makes the stated endpoint arrive early.
- Entities that change type in place (transforming, upgrading, being captured) — what carries over, what resets.
Actions and preconditions
- Walk each documented action against its handler. Every early
return/continueis an undocumented precondition. - Partial success: an action that works in one state but no-ops in a neighbouring one needs the qualifier.
- No-op semantics: does a rejected action still consume the resource, turn, or cooldown?
- Legality rules for movement, placement, targeting — and whether spawn/setup logic obeys the same rules the player does.
- Malformed input: wrong arity, wrong type, out-of-range. Silently dropping one move from a submitted list is a rule players need.
- Per-turn action limits and what happens to the excess.
Turn pipeline and interaction resolution
- If the doc lists a numbered turn order, walk the engine top to bottom and confirm each stage's position. Late-inserted stages (cleanup, spawning, expiry) get omitted.
- Where an entity is mutated relative to where it's read. Spawned after the action phase → unusable until next turn; removed before it → never usable.
- Contested outcomes (combat, collision, simultaneous claims): work ties, three-way contests, and zero-survivor cases by hand. Docs describe only the two-party win case.
- Continuous vs. endpoint-sampled detection (swept paths vs. position checks). Changes which interactions are possible; state it outright.
- Precedence when several removal conditions fire on one entity in the same step.
Procedural generation and randomness
- Documented ranges match the generator's bounds, including any retry cap that can silently under-deliver.
- Guarantees ("at least one of X", "always symmetric") are enforced by code, not merely likely. Find the loop that makes them true, or drop "guaranteed".
- Distribution claims ("skewed low", "weighted toward") imply specific sampling — verify rather than restate.
- What the seed controls, and whether it's scrubbed from the observation before agents see it.
Hidden state and partial observability
- Fields agents are told to use for prediction contain what's claimed, and stay valid as the episode progresses.
- Anything the doc says is derivable, derive it: recompute from the observation alone and compare to engine state.
- Information agents should not have is genuinely absent — check what the agent receives, not the shared state object. Engines routinely keep global state on
state[0].observationand strip it per player. Run an agent that dumps its own observation keys. - If visibility is asymmetric, confirm the players' observations actually differ and each sees only its share.
- Per-category persistence. In a "visible now / remembered later" table every row is a separate claim, and "remembered" may mean last-known-value rather than live.
- Sentinels for unknown data (
-1,None, absent key) are documented and mean unknown, not a legitimate zero.
Termination and scoring
- Every termination condition, not just the step limit. Elimination, stalemate, and early-exit branches get missed.
- The step the episode actually ends on. Off-by-one against
episodeStepsis common; run to completion. - The reward the interpreter assigns, including ties and all-players-eliminated. Does the doc's "winner" language match a win/loss constant or a raw score?
- Rewards that change meaning mid-episode (running score during play, win/loss constant at the end) need both forms documented.
- Multi-stage tiebreakers: each stage exists, in that order, with the stated final fallback.
- What counts toward the final score and what's excluded — value in intermediate state often doesn't count.
Observation and action format
- Every documented field exists, with that type and meaning.
- Field comments describing when something is set: verify the trigger. "Set after X" is often wrong when the engine sets it unconditionally.
- Boolean vs. counter. A boolean means it doesn't accumulate — say so if a player might expect stockpiling.
- Anything the docs imply lives in the state structure but doesn't. Agents will search and find nothing; document the coordinates or accessor instead.
- Documented action strings and argument shapes match what the handler parses.
Configuration
- Doc defaults match the
.jsonspecification. - Every documented knob is actually read. Diff the doc table against the
.jsonkeys, then grep each in the engine. A knob ignored in favour of a module constant is worse than undocumented — players tune it and see no effect. - Claims holding only at default config are labelled as such.
- Derived figures quoted in prose recompute from the stated defaults.
Resource and economy systems (if present)
- Which items/actions are permitted on each side of a transaction. Check membership tests (
x in SOME_LIST) separately from explicit whitelists — an unfiltered membership test permits more than the author may have intended. - Calibration constants: confirm the stated derivation reproduces them. If not, they're stale from a rebalance or the explanation is wrong.
- Any horizon or reference quantity differing from the episode length needs a reason in the doc.
Cross-file consistency
- README and AGENTS.md agree. When they conflict, both may still be wrong — check the engine.
- Beginner/advanced or base/arena variants have their own engines. A fix in one usually applies to the sibling, but verify against that sibling's engine — constants often differ.
- Module-level comments and docstrings in the engine are docs too, and drift.
Style
Docs are declarative rulebooks, not strategy guides.
- State the rule; don't advise. Say what the mechanic does, not what the player should do about it.
- No "you should", "plan on", "budget for", "make sure", "worth noting".
- No bold lead-ins to make a rule feel urgent.
- Leave pre-existing prose alone unless it's factually wrong. Rewriting a doc's voice is out of scope; if a paragraph is hard to read, a paragraph break beats an edit.
Reporting
Group findings as confirmed / overstated / rejected. For each: file:line, what the engine does, how you verified it. Separate doc bugs from engine bugs — engine bugs need the user's decision, not your fix.
Surface explicitly:
- Bugs the reporter missed. A user-filed list is a starting point, not a scope.
- Judgment calls, where the engine's behavior looks unintentional. Documenting it is the default, but say so plainly and give the alternative fix.
Before finishing: re-verify every number you wrote with one audit script asserting doc value == engine value, and run the env's test suite.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

