Repository navigation
pstack: in Claude Code, poteto-mode cites principles without reading their SKILL.md files #726
Description
Problem
In Claude Code, /pstack:poteto-mode runs almost never read the files that the skill tells the agent to read. SKILL.md line 11 says to read docs/harness/claude-code.md once per session. Line 17 says to cite only principles whose leaf SKILL.md the agent read this session. The agent skips both reads. It then does one of two things:
- It names principles from the inline index without reading them. That breaks the "cite only what you read" rule.
- It names no principles at all, so the Principles section has no visible effect.
From the user's side, poteto-mode follows its principles on some days and ignores them on others.
Evidence
I audited 18 poteto-mode runs across 4 Claude Code sessions (pstack 0.15.25 and 0.15.27, Claude Code 2.1.304, Opus 5.5):
- Every run injected the full skill body, so the skill loaded correctly.
- The agent read
docs/harness/claude-code.mdin 1 run. - The agent read a
principle-*/SKILL.mdfile in 0 runs and a playbook file in 0 runs. - One session named principles in its replies anyway. The other three named none.
- One run spawned
general-purposewhere the adapter maps delegates topstack:poteto-agent.
poteto-mode, poteto-agent, and the principle-* skills are identical in 0.15.25 and 0.15.27, so the version change did not cause this.
All 24 principle-* skills set disable-model-invocation: true, so the Skill tool refuses them. The only way to load a principle file is to Read it by path. The current wording states the citation rule but never makes the read a step, so the agent treats the inline index as enough.
Proposed fix
Make the reads an explicit first step in the Non-negotiables:
-The Principles section below grounds every trigger. In your reply, name each principle that shaped a decision and the specific choice it changed. Cite only principles whose leaf SKILL.md you read this session.
+The Principles section below grounds every trigger. Before your first reply in a run, `Read` the adapter above if you have not this session, then `Read` `../principle-<name>/SKILL.md` for each principle you expect to shape a decision. The index below is a pointer, not a substitute. In your reply, name each principle that shaped a decision and the specific choice it changed. Cite only principles whose leaf SKILL.md you read this session.
The adapter clause applies only in Claude Code, because line 11 scopes the adapter to Claude Code. In Cursor the change adds only the leaf read, which line 17 already requires.
Test
I applied the patch locally to 0.15.27 and ran:
claude -p "/pstack:poteto-mode avg() in stats.py crashes on an empty list. Propose a fix, don't edit files."
The agent read docs/harness/claude-code.md, then principle-fix-root-causes/SKILL.md and principle-boundary-discipline/SKILL.md. Its reply named both principles and said what each one changed. That is one run, not a benchmark.
Related
- feat(pstack): support Claude Code as a harness #629 adds Claude Code support but does not change line 17.
- I haven't tested whether
poteto-agentdelegates have the same gap. Their fallback search forSKILL.mdlooks only in~/.cursor/plugins/.
Activity
boom-bang commentedon Oct 19, 2026
Tested the proposed sentence against two alternatives on omp, which shares the skill body and the
disable-model-invocationleaves. The sentence helps a little. Putting the principle list inside each playbook helps far more.Setup
/skill:poteto-mode(checked on a real session record, 20,703 characters).readtool call on aprinciple-*skill file, and it matches a raw grep of the tool calls with 0 mismatches.Arms
Results (all 72 runs per arm)
todo. Compliance fell with each added step.What this does not show
prove-it-worksandattack-the-premise). Other lists were not tried.Suggested fix
Instead of, or alongside, the sentence in this issue:
Readthese principle skills" line at the top of each playbook, naming that playbook's principles.Readthe playbook before anything else. Cite only principles whoseSKILL.mdyou read."principle-*named in a playbook exists underskills/, so the lists cannot rot.This is a few lines in six playbook files and needs no hook, so it works on every harness. It still needs a retest on Claude Code with Opus before anyone calls it a fix. The harness, per-run sessions and scoring scripts are local and I can share them.