# PR [#23550](https://github.com/pingdotgg/t3code/pull/23550) bot findings round 4 — proof (Claude Code 2.1.303, throwaway CLAUDE_CONFIG_DIR + HOME, no account)

## prcomment_01m5hn07hnf97v60wxy7mv8kpa (ClaudeSkills missing installPath) — REJECTED, no code change
Fixture: enabled `mine@shop` in installed_plugins.json, plus `skills/mine/.claude-plugin/plugin.json` {"name":"mine"}. Each `claude plugin list` child was bounded by the PID captured at spawn.

### Local directory marketplace: installPath missing vs present (conclusive)
```
=== missing (install present: False)
--- missing plugin list --json exit=0
    "id": "mine@shop",
    "readFromFolder": "<case>/market/mine",
    "id": "mine@skills-dir",
      "Not loaded — the name \"mine\" is already taken by an installed plugin (mine@shop), which takes precedence. Give the plugin at <case>/claude-home/skills/mine a different \"name\" (in plugin.json or SKILL.md frontmatter) to load this copy."
--- missing plugin list exit=0
  ❯ mine@skills-dir: ✘ Not loaded — the name "mine" is already taken by an installed plugin (mine@shop), which takes precedence. Give the plugin at <case>/claude-home/skills/mine a different "name" (in plugin.json or SKILL.md frontmatter) to load this copy.
=== present (install present: True)
--- present plugin list --json exit=0
    "id": "mine@shop",
    "readFromFolder": "<case>/market/mine",
    "id": "mine@skills-dir",
      "Not loaded — the name \"mine\" is already taken by an installed plugin (mine@shop), which takes precedence. Give the plugin at <case>/claude-home/skills/mine a different \"name\" (in plugin.json or SKILL.md frontmatter) to load this copy."
--- present plugin list exit=0
  ❯ mine@skills-dir: ✘ Not loaded — the name "mine" is already taken by an installed plugin (mine@shop), which takes precedence. Give the plugin at <case>/claude-home/skills/mine a different "name" (in plugin.json or SKILL.md frontmatter) to load this copy.
=== missing-remote (install present: False)
--- missing-remote plugin list --json exit=-9
--- missing-remote plugin list exit=-9
=== present-remote (install present: True)
--- present-remote plugin list --json exit=-9
--- present-remote plugin list exit=-9
```
Native keeps `mine@skills-dir` *Not loaded — name taken* even with the installPath missing. The current guard matches that; the suggested change would surface wrapper skills that native refuses.

### Remote (github-source) marketplace: inconclusive
```
=== missing-remote (install present: False)
[missing-remote] TIMEOUT
--- missing-remote plugin list --json exit=-9
[missing-remote] TIMEOUT
--- missing-remote plugin list exit=-9
=== present-remote (install present: True)
[present-remote] TIMEOUT
--- present-remote plugin list --json exit=-9
[present-remote] TIMEOUT
--- present-remote plugin list exit=-9
```
Both missing and **present** variants hang until killed (60s, then 20s behind a dead proxy). The hang is native's remote-marketplace handling, unrelated to installPath, so it gives no evidence either way. A first probe with no marketplace registered at all left the wrapper loaded even with the install present (`Marketplace shop not found`). That is a pre-existing, out-of-scope edge, not this finding.

## prcomment_01m5hksrhhe0ft8pqb6gfrpq87 (observer backpressure) — CONFIRMED, fixed
Smoke: 121 MB of stream-json fed as fast as possible into the observer, wrapping a child that reads 64 KiB per 2 ms. Ends with a user frame containing a multibyte char and no trailing newline.
```
{"label": "before", "exit": 0, "seconds": 5.6, "sent_bytes": 120930057, "child_bytes": 120930057, "bytes_identical": true, "observer_peak_rss_mb": 171.4, "user_records": [["final é line"]]}
{"label": "after", "exit": 0, "seconds": 4.8, "sent_bytes": 120930057, "child_bytes": 120930057, "bytes_identical": true, "observer_peak_rss_mb": 58.5, "user_records": [["final é line"]]}
```
Peak observer RSS drops from 171.4 MB to 58.5 MB (≈ node baseline). Byte count and sha256 are identical at the child, and the final unterminated line is still recorded intact. When the child exits immediately (/bin/true) under 50 MB of input, the observer still fails with exit 1 (write error propagates).

## Checks
- vp test run ClaudeSkills.test.ts ClaudeSkillDispatch.test.ts: 32/32 passed
- vp lint / vp fmt --check on ClaudeStdin.fixture.mjs: clean
- vp run knip:check (files,deps + exports): 2/2 successful
