Skip to content

fix(pstack): let poteto-agent find poteto-mode, drop ignored frontmatter, document the / menu - #597

Merged
poteto merged 6 commits into
mainfrom
lauren/skill-invocation-fixes-47dd
Oct 13, 2026
Merged

poteto merged 6 commits into
mainfrom
lauren/skill-invocation-fixes-47dd

Conversation

@poteto

@poteto poteto commented Oct 13, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

pstack skills often do not run. Part of the cause is in Cursor itself: a /poteto-mode typed as plain text is not attached to the message. That is being fixed in Cursor separately. This PR has only the pstack-side edits that need no decision. The two edits that do need one are listed under Open questions below.

Changes

  • agents/poteto-agent.md: when the parent passes no path, the agent searches ~/.cursor/plugins/ for a file whose path ends in skills/poteto-mode/SKILL.md. The search is the first step. The agent body also says that the skill catalog hides poteto-mode, so a missing catalog entry does not mean pstack is absent. If no file matches, the agent stops and tells its parent. The suffix match is not tied to one install layout, which was the problem with the find fallback in fix(pstack): tell poteto-agent how to find poteto-mode's SKILL.md #569. If more than one copy matches, for example a second version folder in the plugin cache or a copy under local/, the agent uses the copy whose .cursor-plugin/plugin.json has the highest version.
  • skills/poteto-mode/SKILL.md: remove mode: true and reminder:. Cursor ignores mode and reminder in skill frontmatter, so the reminder text was never injected. Keeping the keys suggests a behavior that does not exist.
  • README.md: one line that tells users to pick /poteto-mode from the / menu before they type the task, so Cursor attaches the skill.

Open questions for the pstack owner

  1. Should poteto-mode become model-invocable? This means disable-model-invocation: false, for this one skill only. The investigation behind this PR recommends yes. If yes, the trigger condition from the removed reminder: line can go into description.
  2. Should how, why, recall, and ketchup trigger from plain requests? The alternative is that they stay slash-only and their descriptions drop the "Use for ..." routing language. fix(pstack): drop agent-selection language from slash-only skill descriptions #519 and fix(pstack): drop agent-routing language from slash-only skill descriptions #392 already propose that rewording for slash-only skills.
  3. Does Grok Bot remove slash-only skills before its catalog limit? Known: Grok Bot's skill catalog includes at most 24 skills in total from all non-bot plugins. It takes the first 24 skills from one combined list of those plugins' skills, and this list comes after its managed skills. Not verified: whether Grok Bot removes slash-only (disable-model-invocation: true) skills before it applies that limit. A Cursor agent removes them, so only setup-pstack from pstack is in its catalog. Grok Bot was not tested. If Grok Bot does not remove them, pstack's 51 slash-only skills could fill the 24 places and push out setup-pstack or skills from other plugins. Catalog text is also truncated to fit a token budget. So this PR does not shorten any descriptions. It is better to size them after this item and questions 1 and 2 have answers.

Test plan

  • poteto-agent with no path: before and after the change, same prompt. Each run got the agent body as its instructions and the same small read-only task, with no path to the skill. The pstack folder was removed from the workspace, so the skill existed only in the installed plugin cache. That is the usual situation on a user's machine. I checked tool calls in the transcripts. The two Grok runs on main searched the workspace first and found nothing. On a user's machine, the workspace is their own repository. The "this PR" rows ran before I added the sentence about choosing between copies. With only one copy on disk, that sentence does not apply.

    Agent body Model Read poteto-mode
    main default 1 of 2. One run searched only the workspace and answered without the skill. The other found the skill late, after it had read the task file and searched the code.
    main Grok 4.7 2 of 2, before the task, after four searches each
    this PR default 2 of 2, after one search. The run read the task file at the same time as that search, and read the skill before it started the analysis.
    this PR Grok 4.7 2 of 2, before the task, after one search
  • Two copies on disk: this PR's final text, run twice. I added a second pstack copy next to the installed one. Its files were the same, except that version in plugin.json was 0.15.30 instead of 0.15.21. So that a naive pick would fail, the 0.15.30 copy had the older file times and a folder name that sorts after the other copy. Both runs (default model) compared the two plugin.json versions and read only the 0.15.30 SKILL.md. As in the runs above, both read the task file in the same step as the search, but read the skill before they started the analysis. I removed the second copy afterward.

  • The runs got the body inside the prompt and did not use the installed poteto-agent type. A running session loads agent definitions at startup, so an edited agent file does not reach a spawned poteto-agent until the next session. I did not test install locations outside ~/.cursor/plugins/, and I did not test Windows.

  • Frontmatter: after the edit, the poteto-mode frontmatter still parses as YAML, with keys name, description, disable-model-invocation, icon, and color. Nothing reads the two removed keys, so a before-and-after run would show no difference. On the client side, I searched the agent runtime that ships in this VM: no code reads mode or reminder as fields. For the server side, I depend on the investigation behind this PR, which quotes Cursor's source. I could not see that code myself.

  • README: not verified. Checking it needs the Cursor desktop composer, and this environment does not have it.

  • node scripts/validate-plugins.mjs passes.

  • The diff is plain ASCII. The branch merges cleanly with feat(pstack): shorten /ketchup replies and build them on real visuals #595 and fix(pstack): make skill names match their directories (poteto-mode, make-bot-ui) #596.

Open in Web Open in Cursor 

cursoragent and others added 4 commits October 13, 2026 09:02
Co-authored-by: lauren <poteto@users.noreply.github.com>
Cursor ignores both keys, so the reminder text never reached the model.

Co-authored-by: lauren <poteto@users.noreply.github.com>
Co-authored-by: lauren <poteto@users.noreply.github.com>
Co-authored-by: lauren <poteto@users.noreply.github.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 3ddc8d4. Configure here.

Comment thread pstack/agents/poteto-agent.md Outdated
…poteto-mode copies match

Co-authored-by: lauren <poteto@users.noreply.github.com>
@poteto
poteto merged commit b93e811 into main Oct 13, 2026
1 check passed
@poteto
poteto deleted the lauren/skill-invocation-fixes-47dd branch October 13, 2026 16:17
@poteto poteto mentioned this pull request Oct 13, 2026
1 task done
mstephenholl added a commit to mstephenholl/pstack-claude-codex that referenced this pull request Oct 14, 2026
## Why

The daily sync cannot merge cursor/plugins past 56aca54, because
upstream's cursor#597 changed the line in `poteto-agent.md` that the port also
changed. It reported that in #17. This branch merges upstream at 5108b71
by hand.

Closes #17.

## Scope

- Merge cursor/plugins@5108b71 with `merge-upstream.py`. In
`poteto-agent.md`, take upstream's new fallback for a delegate given no
path, and point it at `~/.agents/pstack/skills/poteto-mode/SKILL.md`
instead of a search of `~/.cursor/plugins/`. The rest of the line is
upstream's word for word.
- Port `in-your-own-words`: a `SKILLS` entry, its Codex invocation
policy, and a README catalog row. The `ketchup` row follows upstream's
shorter replies.
- The new `ketchup` asks for charts from Cursor's `/visualize`.
`check.py` now knows `/visualize` as a Cursor term, `ketchup` gets the
`pstack-harness` pointer, and the harness maps it to a Mermaid diagram
or a chart image rendered with a script.
- Upstream dropped `poteto-mode`'s `mode` and `reminder` frontmatter, so
the harness note about them goes.

## Blast Radius

Users get this release on their next `pstack update`:
`/in-your-own-words`, the shorter `/ketchup`, a `poteto-agent` that
finds `poteto-mode` without a path, and upstream's new root-cause
principle line. Until this merges, the upstream sync stays blocked on
#17.

## Verification

- `check.py` reports 0 problems, and its 2 warnings also appear on
`main`. Before the harness commit, it flagged `ketchup` for `/visualize`
with no pointer and no mapping.
- The unit tests (239), the `poteto-mode` bun tests (58), and
`install_test.sh` (54 skills) pass on Linux.
- With the install pointed at this branch, headless Claude Code probes,
0 permission denials each:
- `poteto-agent` with no path read
`~/.agents/pstack/skills/poteto-mode/SKILL.md` and answered with its
title.
- `/in-your-own-words` played back the goal, the problem, and what it
inferred.
- `smoke.py --harness claude`: 10/10 pass with the install pointed at
this branch (how, why, interrogate, arena, swarm, no-comments,
poteto-mode, show-me-your-work, reflect, create-verification-skill).
- Codex is not installed on the test machine, so the Codex side did not
run.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants