Skip to content

plugin.json missing commands/watch-inbox.md + commands/unwatch-inbox.md — PR #603 inbox-wake mechanism non-functional in installed plugin #608

@michael-wojcik

Description

@michael-wojcik

Summary

PR #603 (28189e57) migrated the inbox-wake skill into a command pair (commands/watch-inbox.md + commands/unwatch-inbox.md) but did not register the new commands in pact-plugin/.claude-plugin/plugin.json. As a result, the entire wake mechanism shipped in #591/#603 is non-functional in the installed plugin.

Impact

  • /PACT:watch-inbox and /PACT:unwatch-inbox are NOT slash-typeable for the user.
  • They are NOT exposed via the Skill tool, so the PostToolUse emitter's Skill("PACT:watch-inbox") / Skill("PACT:unwatch-inbox") directives error with Unknown skill: PACT:watch-inbox even when surfaced.
  • STATE_FILE (~/.claude/teams/{team_name}/inbox-wake-state.json) is never created in any session.
  • The wake mechanism silently degrades to baseline useInboxPoller — exactly the failure mode Lead + teammate: arm Monitor on own inbox file for wake-on-message (UI-focus-independent delivery) #591 was designed to fix.
  • All 198 inbox-wake structural tests still pass because they parse the command file contents; they never verify the file is registered.

Reproduction

In a fresh session running plugin 3.21.0:

```
$ ls ~/.claude/plugins/cache/pact-plugin/PACT/3.21.0/commands/ | grep inbox
unwatch-inbox.md
watch-inbox.md

$ python3 -c "import json; print('watch-inbox.md' in open('/.claude/plugins/cache/pact-plugin/PACT/3.21.0/.claude-plugin/plugin.json'.replace('', '$HOME')).read())"
False
```

Lead-session orchestrator after creating first lifecycle-relevant task:

```
Skill("PACT:watch-inbox")
→ Unknown skill: PACT:watch-inbox
```

~/.claude/teams/{team_name}/inbox-wake-state.json does not exist.

Root Cause

The migration commit "Migrate inbox-wake skill to /PACT:watch-inbox + /PACT:unwatch-inbox commands" (squashed into 28189e57) moved the skill body to command files but did not update the commands array in .claude-plugin/plugin.json. The array currently lists 12 commands; it should list 14.

commands/prune-memory.md is also unregistered (likely predates #603 — separate latent issue, but worth catching in the same sweep).

Fix

Add two (or three) entries to pact-plugin/.claude-plugin/plugin.json:

```json
"commands": [
"./commands/bootstrap.md",
"./commands/teammate-bootstrap.md",
"./commands/orchestrate.md",
"./commands/comPACT.md",
"./commands/rePACT.md",
"./commands/imPACT.md",
"./commands/peer-review.md",
"./commands/plan-mode.md",
"./commands/wrap-up.md",
"./commands/pause.md",
"./commands/pin-memory.md",
"./commands/telegram-setup.md",
"./commands/watch-inbox.md",
"./commands/unwatch-inbox.md",
"./commands/prune-memory.md"
],
```

Patch version bump (3.21.0 → 3.21.1).

Test Invariant

Add to tests/test_plugin_manifest.py (new file or existing manifest-shape test):

For every *.md file in commands/, the file path appears in plugin.json's commands array. Manifest-vs-filesystem parity prevents future drift.

This invariant would have caught the #603 miss at PR-review time.

Blocks

Source

Surfaced 2026-05-02 in dogfood orchestration session pact-7b1e760a while preparing to fix #605 — discovered `Skill("PACT:watch-inbox")` errors with Unknown skill; investigation traced to manifest gap.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions