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.
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:* labelsjoelhooks/joelclaw
ee2c272
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.