Contribute fixes, bug reports, and upstream discussions to badlogic/pi-mono without wasting maintainer time. Use when filing pi issues, preparing pi PRs, debugging whether a bug belongs upstream, or responding to maintainer pushback. Triggers on: 'contribute to pi', 'pi-mono issue', 'upstream pi fix', 'open a pi issue', 'why did Mario reject this', or any work in ~/Code/badlogic/pi-mono meant for upstream.
74
93%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
This skill exists to stop us sending half-baked upstream reports to Mario.
The maintainer standard is reasonable: understand the bug, isolate the boundary that actually breaks, and show a concrete repro. If we can't do that yet, we are still in local debugging mode — not upstream contribution mode.
Use this skill when:
~/Code/badlogic/pi-monobadlogic/pi-monoAlways read both files in the local clone before touching upstream threads:
~/Code/badlogic/pi-mono/CONTRIBUTING.md~/Code/badlogic/pi-mono/AGENTS.mdThe important bits:
lgtm)pkg:* labelsnpm run checknpm testFor the repo/maintainer deep dive, read:
references/pi-mono-research.mdIf the failure only happened in one of these environments, say that plainly and do more work before filing upstream:
~/.local/bin/pi~/.bun/install/global/...Use a clean worktree when in doubt:
cd ~/Code/badlogic/pi-mono
git fetch origin
git worktree add /tmp/pi-mono-main origin/main
cd /tmp/pi-mono-main
npm installIf the bug disappears on clean origin/main, it is not yet an upstream core bug.
"It crashed in packages/agent/src/agent-loop.ts" is not enough.
If a type-level invariant says the state is impossible, prove where reality violated the invariant:
AssistantMessageUpstream wants the cause chain, not just a defensive ?? [] around the symptom.
For any LLM/runtime bug, record:
pi, local repo build, published install)If you cannot answer "which provider/model triggered this?", you are not ready to open the issue.
CONTRIBUTING.md is explicit. New contributors start with an issue. A PR opened before approval is churn and will be closed.
Mario made this explicit on X on 2026-03-09 while linking issue #1993:
you will be banned from the pi-mono repo if:
- you are a dick
- you keep submitting clanker slop repeatedly for the same "issue" to which you got a reply and workaround from yours truely there is no way to appeal my decision.
Source: https://x.com/badlogicgames/status/2031085220221563021
Treat that as policy, not vibes.
If a maintainer already gave a workaround, explanation, or boundary call, do not re-litigate the same thing with a slightly reworded agent-generated issue. Either bring a new repro with stronger evidence, or shut up and go debug more.
Ask, in order:
origin/main?If any answer is "no" or "not sure", keep digging locally.
Before filing an issue, collect this in a scratch note:
--no-extensions repro or not)pkg:agent, pkg:ai, pkg:coding-agent, etc.)For GitHub reading, use the maintainer-friendly command from AGENTS.md:
gh issue view <number> --json title,body,comments,labels,stateRead all comments before replying.
Strip it down until another person can run it without our whole machine state.
Good repros usually look like one of these:
Bad repros look like:
Keep it short. Human voice. No agent mush.
Use this shape:
Problem
- One sentence describing the failure.
Repro
1. Step one
2. Step two
3. Step three
Environment
- provider/model:
- build: clean origin/main | local repo build | published install
- extensions: on/off
Expected
- ...
Actual
- ...
Hypothesis
- The invariant appears to break in <provider|adapter|extension|core> because ...Add the right pkg:* labels.
If you comment on an issue or PR, write the comment to a temp file first and preview it before posting.
Prepare local repro, patch, and regression checks when requested. Maintainer approval gates opening an upstream PR under CONTRIBUTING.md; it does not block local preparation:
npm run checkWhat we got wrong:
packages/agent/src/agent-loop.tscontent.filter() crash also showed up in patched runtime paths around grind_stop, which pointed to a broader boundary problem than the issue body admittedMario's pushback was correct:
toolUse with missing content should be impossibleFuture rule:
If the maintainer can reasonably ask "how can this state even exist?", answer that before opening the issue.
Use this to decide where a bug probably belongs:
packages/ai — provider adapters, streaming normalization, tool-call event translation, malformed usage/stop reasonspackages/agent — agent loop state machine, tool execution, context handling after normalized messages already existpackages/coding-agent — interactive mode, compaction UX, session persistence, slash commands, extension interaction surfacesDon't dump provider or extension bugs into packages/agent because that is where the null dereference landed.
CONTRIBUTING.mdAGENTS.mdorigin/mainpkg:* labelsaa0116c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.