@intentsolutionsio/plane 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +24 -0
- package/README.md +57 -0
- package/package.json +40 -0
- package/skills/plane/SKILL.md +150 -0
- package/skills/plane/agents/plane-analyst.md +100 -0
- package/skills/plane/agents/plane-expert.md +75 -0
- package/skills/plane/references/api-surface.md +121 -0
- package/skills/plane/references/compound-commands.md +164 -0
- package/skills/plane/references/noi.md +35 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "plane",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Plane is a team behavior observatory — synthesize Plane API data into observations about how teams actually behave under pressure (cycle velocity vs. plan, ownership churn, reviewer gate strength, priority drift, cross-project load). Reads from the live mcp__plane MCP server.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Jeremy Longshore",
|
|
7
|
+
"email": "jeremy@intentsolutions.io"
|
|
8
|
+
},
|
|
9
|
+
"repository": "https://github.com/jeremylongshore/claude-code-plugins-plus-skills",
|
|
10
|
+
"homepage": "https://tonsofskills.com/plugins/plane",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"plane",
|
|
14
|
+
"project-management",
|
|
15
|
+
"team-behavior",
|
|
16
|
+
"observability",
|
|
17
|
+
"productivity",
|
|
18
|
+
"agent-skills",
|
|
19
|
+
"forge-generated"
|
|
20
|
+
],
|
|
21
|
+
"skills": "./skills",
|
|
22
|
+
"generated": true,
|
|
23
|
+
"author_type": "forge"
|
|
24
|
+
}
|
package/README.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Plane — Team Behavior Observatory
|
|
2
|
+
|
|
3
|
+
> **Plane is a team behavior observatory.** Most Plane integrations wrap the API for ticket entry; this one synthesizes the data Plane already has into observations about how a team actually behaves under pressure — cycle velocity vs. plan, ownership churn on stuck tickets, reviewer gate strength, stated-vs-actual priority drift, and cross-project workload concentration.
|
|
4
|
+
|
|
5
|
+
## What this plugin is
|
|
6
|
+
|
|
7
|
+
A behavioral observation layer on top of Plane's project-tracking API. It does **not** replicate `mcp__plane`'s CRUD surface; that's the data-retrieval layer. This plugin sits one level up — it asks behavioral questions that require JOINing across multiple Plane endpoints to answer.
|
|
8
|
+
|
|
9
|
+
## What this plugin is not
|
|
10
|
+
|
|
11
|
+
- Not a Plane CLI (use `mcp__plane` MCP directly for ticket CRUD)
|
|
12
|
+
- Not a clone of the Plane web dashboard (the dashboard already shows you ticket state)
|
|
13
|
+
- Not a generic project-tracker skill (the framing is specifically behavioral, anchored in the NOI)
|
|
14
|
+
|
|
15
|
+
## The five compound commands
|
|
16
|
+
|
|
17
|
+
Each answers a question that **cannot** be answered from any single Plane API endpoint:
|
|
18
|
+
|
|
19
|
+
| Command | Question |
|
|
20
|
+
|---|---|
|
|
21
|
+
| `/plane-cycle-velocity` | Does cycle close-out match cycle planning? |
|
|
22
|
+
| `/plane-stale-tickets` | Which `In Progress` tickets are quietly failing under shared ownership? |
|
|
23
|
+
| `/plane-reviewer-gate-strength` | Which reviewers gate-keep harder than the spec demands? |
|
|
24
|
+
| `/plane-priority-drift` | Does the team plan high-priority work but ship low-priority work? |
|
|
25
|
+
| `/plane-cross-project-load` | Which engineers are spread across too many active projects? |
|
|
26
|
+
|
|
27
|
+
Each command's exact endpoint sequence, scoring formula, and output table format is documented in [`skills/plane/references/compound-commands.md`](skills/plane/references/compound-commands.md).
|
|
28
|
+
|
|
29
|
+
## Install
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
/plugin install plane@claude-code-plugins-plus
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Prerequisites
|
|
36
|
+
|
|
37
|
+
- `mcp__plane` MCP server installed and configured (env vars `PLANE_API_KEY`, `PLANE_WORKSPACE_SLUG`, `PLANE_API_HOST_URL`). Without it, the skill returns documentation-only output + an install hint.
|
|
38
|
+
- A Plane workspace with at least one project, cycle, and active issues — empty workspaces return informative empty states.
|
|
39
|
+
|
|
40
|
+
## How it works
|
|
41
|
+
|
|
42
|
+
The orchestrator skill (`skills/plane/SKILL.md`) routes user intent to one of two agents:
|
|
43
|
+
|
|
44
|
+
- `plane-expert` — answers "how do I query X in Plane" without firing live API calls
|
|
45
|
+
- `plane-analyst` — orchestrates the compound commands, calling `mcp__plane__*` tools in the documented sequence and synthesizing the result
|
|
46
|
+
|
|
47
|
+
Both agents read from the references in `skills/plane/references/` as their ground truth — `noi.md` is the design anchor; `api-surface.md` is the documented endpoint subset; `compound-commands.md` is the per-command playbook.
|
|
48
|
+
|
|
49
|
+
## Provenance
|
|
50
|
+
|
|
51
|
+
This plugin was produced by `/skill-creator --forge plane` on 2026-05-07. The forge run's audit trail lives in [`.forge/`](.forge/) — research notes, ecosystem analysis, validation evidence — visible to anyone reviewing how the plugin came to exist.
|
|
52
|
+
|
|
53
|
+
`plugin.json` carries `"generated": true` and `"author_type": "forge"` so the marketplace surfaces a "Forge-generated" provenance pill on the detail page.
|
|
54
|
+
|
|
55
|
+
## License
|
|
56
|
+
|
|
57
|
+
MIT. See `LICENSE` (project-wide root file).
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@intentsolutionsio/plane",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Plane is a team behavior observatory — synthesize Plane API data into observations about how teams actually behave under pressure (cycle velocity vs. plan, ownership churn, reviewer gate strength, pri",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"plane",
|
|
7
|
+
"project-management",
|
|
8
|
+
"team-behavior",
|
|
9
|
+
"observability",
|
|
10
|
+
"productivity",
|
|
11
|
+
"agent-skills",
|
|
12
|
+
"forge-generated",
|
|
13
|
+
"claude-code",
|
|
14
|
+
"claude-plugin",
|
|
15
|
+
"tonsofskills"
|
|
16
|
+
],
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/jeremylongshore/claude-code-plugins-plus-skills.git",
|
|
20
|
+
"directory": "plugins/productivity/plane"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://tonsofskills.com/plugins/plane",
|
|
23
|
+
"bugs": "https://github.com/jeremylongshore/claude-code-plugins-plus-skills/issues",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"author": {
|
|
26
|
+
"name": "Jeremy Longshore",
|
|
27
|
+
"email": "jeremy@intentsolutions.io"
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"README.md",
|
|
34
|
+
".claude-plugin",
|
|
35
|
+
"skills"
|
|
36
|
+
],
|
|
37
|
+
"scripts": {
|
|
38
|
+
"postinstall": "node -e \"console.log(\\\"\\\\n→ This npm package is a tracking/proof artifact. Install the plugin via:\\\\n ccpi install plane\\\\n or /plugin install plane@claude-code-plugins-plus in Claude Code\\\\n\\\")\""
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plane
|
|
3
|
+
description: |
|
|
4
|
+
Plane is a team behavior observatory — synthesize Plane API data into observations
|
|
5
|
+
about how teams actually behave under pressure, not just ticket state. Five compound
|
|
6
|
+
commands surface cycle velocity vs. plan, stale-ticket ownership churn, reviewer gate
|
|
7
|
+
strength, stated-vs-actual priority drift, and cross-project workload concentration.
|
|
8
|
+
Reads from the live mcp__plane MCP server when present; documentation-only otherwise.
|
|
9
|
+
Use when investigating "why is this team's plan diverging from reality", auditing cycle
|
|
10
|
+
health, finding orphan tickets, identifying review bottlenecks, or onboarding to a
|
|
11
|
+
new project. Trigger with "/plane-cycle-velocity", "/plane-stale-tickets",
|
|
12
|
+
"/plane-reviewer-gate-strength", "/plane-priority-drift", "/plane-cross-project-load",
|
|
13
|
+
"audit Plane cycle", "team behavior plane", "how is my team behaving".
|
|
14
|
+
allowed-tools: "Read,Bash(jq:*),Bash(date:*),AskUserQuestion"
|
|
15
|
+
version: 0.1.0
|
|
16
|
+
author: Jeremy Longshore <jeremy@intentsolutions.io>
|
|
17
|
+
license: MIT
|
|
18
|
+
compatibility: Designed for Claude Code; requires mcp__plane MCP server configured (PLANE_API_KEY, PLANE_WORKSPACE_SLUG, PLANE_API_HOST_URL env vars)
|
|
19
|
+
tags: [plane, project-management, team-behavior, observability, productivity]
|
|
20
|
+
model: inherit
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Plane — Team Behavior Observatory
|
|
24
|
+
|
|
25
|
+
A behavioral observation layer on top of Plane's project-tracking API. This skill **does not** wrap Plane CRUD — `mcp__plane` already does that and you should call it directly for ticket entry, status changes, etc.
|
|
26
|
+
|
|
27
|
+
Instead, this skill answers behavioral questions about how a team is actually performing under pressure: cycle velocity vs. plan, ownership churn, reviewer gate strength, priority drift, and cross-project load. Each question is answered by a compound command that synthesizes data across multiple Plane endpoints — observations no single endpoint exposes.
|
|
28
|
+
|
|
29
|
+
## Overview
|
|
30
|
+
|
|
31
|
+
The NOI (`references/noi.md`) is the design anchor: **Plane is a team behavior observatory**. Five compound commands derive from that framing:
|
|
32
|
+
|
|
33
|
+
1. `/plane-cycle-velocity` — does cycle close-out match cycle planning?
|
|
34
|
+
2. `/plane-stale-tickets` — which `In Progress` tickets are quietly failing under shared ownership?
|
|
35
|
+
3. `/plane-reviewer-gate-strength` — which reviewers gate-keep harder than the spec demands?
|
|
36
|
+
4. `/plane-priority-drift` — does the team plan high-priority work but ship low-priority work?
|
|
37
|
+
5. `/plane-cross-project-load` — which engineers are spread across too many active projects?
|
|
38
|
+
|
|
39
|
+
None of these are answerable from any single Plane API call. Each requires cross-endpoint synthesis. That synthesis is the value.
|
|
40
|
+
|
|
41
|
+
## Prerequisites
|
|
42
|
+
|
|
43
|
+
- `mcp__plane` MCP server installed and configured (env vars `PLANE_API_KEY`, `PLANE_WORKSPACE_SLUG`, `PLANE_API_HOST_URL`)
|
|
44
|
+
- A Plane workspace with at least one project, cycle, and active issues (otherwise the commands return informative empty states)
|
|
45
|
+
|
|
46
|
+
## Authentication
|
|
47
|
+
|
|
48
|
+
This skill does not handle credentials directly. Auth is delegated to the MCP server. See `references/api-surface.md` for the env-var setup; if `mcp__plane` returns an auth error, the skill surfaces the error verbatim and instructs the user to verify their token.
|
|
49
|
+
|
|
50
|
+
## Instructions
|
|
51
|
+
|
|
52
|
+
### Mode detection
|
|
53
|
+
|
|
54
|
+
Determine user intent from their prompt:
|
|
55
|
+
|
|
56
|
+
- **Compound query mode** (default): user asks about cycle health, team behavior, stale tickets, reviewer patterns, priority drift, or workload distribution → route to `plane-analyst` agent (see `agents/plane-analyst.md`) which orchestrates the compound commands.
|
|
57
|
+
- **API help mode**: user asks "how do I query X in Plane" or "what endpoint does Y" → route to `plane-expert` agent (see `agents/plane-expert.md`) which answers from `references/api-surface.md` without firing live API calls.
|
|
58
|
+
- **Skill metadata**: user asks "what does this skill do" / "explain plane skill" → return the Overview above + the 5 commands.
|
|
59
|
+
|
|
60
|
+
If unclear, use `AskUserQuestion`:
|
|
61
|
+
|
|
62
|
+
> Are you asking about (a) team behavior / cycle health / patterns, or (b) how to use a specific Plane API endpoint?
|
|
63
|
+
|
|
64
|
+
### Step 1: Resolve target project
|
|
65
|
+
|
|
66
|
+
Most compound commands operate on a specific project. Extract the project slug or readable identifier (e.g., `BRAVES`, `OPS`) from the user's prompt.
|
|
67
|
+
|
|
68
|
+
If absent, list available projects via `mcp__plane__get_projects` and ask which one. Cache the chosen project for the rest of the conversation.
|
|
69
|
+
|
|
70
|
+
### Step 2: Route to compound command
|
|
71
|
+
|
|
72
|
+
Match user intent to one of the five commands:
|
|
73
|
+
|
|
74
|
+
| User asks about... | Command |
|
|
75
|
+
|---|---|
|
|
76
|
+
| cycle velocity, sprint completion, overrun | `/plane-cycle-velocity` |
|
|
77
|
+
| stale tickets, orphan work, ownership churn | `/plane-stale-tickets` |
|
|
78
|
+
| reviewer bottlenecks, blocked PRs, gate-keeping | `/plane-reviewer-gate-strength` |
|
|
79
|
+
| priority drift, planning vs. reality, P1 vs. P3 | `/plane-priority-drift` |
|
|
80
|
+
| workload distribution, project sprawl, focus | `/plane-cross-project-load` |
|
|
81
|
+
|
|
82
|
+
Read `references/compound-commands.md` for the exact endpoint sequence and output format per command.
|
|
83
|
+
|
|
84
|
+
### Step 3: Execute via `plane-analyst` agent
|
|
85
|
+
|
|
86
|
+
Invoke the analyst agent (`agents/plane-analyst.md`) with the chosen command + project. The agent:
|
|
87
|
+
|
|
88
|
+
1. Calls the relevant `mcp__plane__*` tools in sequence
|
|
89
|
+
2. Performs the JOIN logic
|
|
90
|
+
3. Computes the behavioral score per the command's formula
|
|
91
|
+
4. Renders the output table per the format in `compound-commands.md`
|
|
92
|
+
5. Adds a "Behavioral signal" interpretation paragraph
|
|
93
|
+
|
|
94
|
+
If `mcp__plane` is unavailable, the agent emits a documentation-only response: shows what the command WOULD return, plus the install hint.
|
|
95
|
+
|
|
96
|
+
### Step 4: Interpret the signal
|
|
97
|
+
|
|
98
|
+
The output is observations, not prescriptions. The skill says "this team plans P1s and ships P3s — the planning conversation is theater." It does NOT say "fire the planner." Interpretation belongs to the human reading the report.
|
|
99
|
+
|
|
100
|
+
## Output
|
|
101
|
+
|
|
102
|
+
Each compound command produces:
|
|
103
|
+
|
|
104
|
+
- A table of metrics specific to that observation
|
|
105
|
+
- A "Behavioral signal" paragraph that names the pattern in plain language
|
|
106
|
+
- Optionally, a follow-up suggestion (e.g., "consolidate projects" / "split this queue") — framed as a question the team can take to its retro
|
|
107
|
+
|
|
108
|
+
## Error Handling
|
|
109
|
+
|
|
110
|
+
| Error | Recovery |
|
|
111
|
+
|---|---|
|
|
112
|
+
| `mcp__plane` unavailable | Emit documentation-only output + install hint pointing at `~/.claude.json` MCP config |
|
|
113
|
+
| API rate limit (429) | Back off + retry with exponential delay; if persistent, advise user to wait and re-run |
|
|
114
|
+
| Empty project (no cycles / issues) | Return informative empty state explaining why the command can't compute |
|
|
115
|
+
| Auth error (401/403) | Surface verbatim + instruct user to verify env vars or re-issue token |
|
|
116
|
+
| Workspace member lookup fails | Fall back to assignee UUIDs in output (less readable but functional) |
|
|
117
|
+
|
|
118
|
+
## Examples
|
|
119
|
+
|
|
120
|
+
**"How is my team performing on cycle velocity?"**
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
/plane-cycle-velocity BRAVES
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
→ Renders the cycle-velocity table from `references/compound-commands.md` § Command 1.
|
|
127
|
+
|
|
128
|
+
**"Are we shipping what we plan?"**
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
/plane-priority-drift BRAVES
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
→ Renders the priority-drift table; surfaces the gap between planned and shipped priorities.
|
|
135
|
+
|
|
136
|
+
**"Which engineers are stretched too thin?"**
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
/plane-cross-project-load
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
→ Walks the entire workspace; lists engineers with their active-project / active-cycle / open-issue counts; flags crisis-level stretch.
|
|
143
|
+
|
|
144
|
+
## Resources
|
|
145
|
+
|
|
146
|
+
- [NOI](references/noi.md) — the secret-identity statement that anchors every command
|
|
147
|
+
- [API surface](references/api-surface.md) — endpoints consumed + auth + pagination
|
|
148
|
+
- [Compound commands](references/compound-commands.md) — exact endpoint sequence + output format per command
|
|
149
|
+
- [Plane docs](https://docs.plane.so/) — upstream API reference
|
|
150
|
+
- `mcp__plane` MCP server — direct CRUD wrapper this skill builds on top of
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plane-analyst
|
|
3
|
+
description: |
|
|
4
|
+
Plane behavioral synthesis agent. Orchestrates the five compound commands
|
|
5
|
+
(cycle-velocity, stale-tickets, reviewer-gate-strength, priority-drift,
|
|
6
|
+
cross-project-load) by calling mcp__plane endpoints in sequence, applying
|
|
7
|
+
the JOIN + scoring logic, and rendering the output tables per the NOI.
|
|
8
|
+
Use when the user asks behavioral questions about a team's Plane workspace
|
|
9
|
+
— cycle health, stuck work, review bottlenecks, planning vs. reality,
|
|
10
|
+
workload distribution.
|
|
11
|
+
allowed-tools: "Read,Glob,Grep"
|
|
12
|
+
model: inherit
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Plane Analyst (Behavioral Synthesis)
|
|
16
|
+
|
|
17
|
+
> **Parent skill**: `skills/plane/SKILL.md`
|
|
18
|
+
|
|
19
|
+
The synthesis agent that turns Plane API data into behavioral observations. Reads the NOI as its design anchor; runs the compound-command logic; renders interpretable output.
|
|
20
|
+
|
|
21
|
+
## Overview
|
|
22
|
+
|
|
23
|
+
The orchestrator skill delegates here when the user asks behavioral questions. This agent:
|
|
24
|
+
|
|
25
|
+
1. Reads `references/noi.md` to stay on-mission (every output should tie back to behavioral signal, not data dump)
|
|
26
|
+
2. Reads `references/compound-commands.md` for the specific endpoint sequence + output format per command
|
|
27
|
+
3. Calls `mcp__plane__*` tools in the documented sequence (the orchestrator authorizes the tool calls)
|
|
28
|
+
4. Performs the JOIN + scoring logic
|
|
29
|
+
5. Emits the table + "Behavioral signal" interpretation paragraph
|
|
30
|
+
|
|
31
|
+
## NOI anchor
|
|
32
|
+
|
|
33
|
+
**Plane is a team behavior observatory.** Every output frames its observations in terms of how the team is actually behaving — not in terms of ticket counts. If a draft response would land equally well on a stand-up note, rewrite it. The signal is behavioral.
|
|
34
|
+
|
|
35
|
+
## Instructions
|
|
36
|
+
|
|
37
|
+
### Step 1: Match user intent to a compound command
|
|
38
|
+
|
|
39
|
+
Per the routing table in the parent skill:
|
|
40
|
+
|
|
41
|
+
| User asks about | Command |
|
|
42
|
+
|---|---|
|
|
43
|
+
| cycle velocity, sprint completion, overrun | cycle-velocity |
|
|
44
|
+
| stale tickets, orphan work, ownership churn | stale-tickets |
|
|
45
|
+
| reviewer bottlenecks, blocked PRs | reviewer-gate-strength |
|
|
46
|
+
| priority drift, planning vs. reality | priority-drift |
|
|
47
|
+
| workload distribution, project sprawl | cross-project-load |
|
|
48
|
+
|
|
49
|
+
If none match, fall back to the orchestrator with a clarifying question.
|
|
50
|
+
|
|
51
|
+
### Step 2: Read the command's playbook
|
|
52
|
+
|
|
53
|
+
Read the relevant `## Command N` section in `references/compound-commands.md`. The section specifies:
|
|
54
|
+
|
|
55
|
+
- Endpoints to call (in order)
|
|
56
|
+
- JOIN logic
|
|
57
|
+
- Scoring formula
|
|
58
|
+
- Output table format
|
|
59
|
+
|
|
60
|
+
Do not improvise. The playbook IS the contract.
|
|
61
|
+
|
|
62
|
+
### Step 3: Execute
|
|
63
|
+
|
|
64
|
+
Call `mcp__plane__*` tools per the playbook. For each batch:
|
|
65
|
+
|
|
66
|
+
- Honor the rate limit (60 req/min) — back off on 429
|
|
67
|
+
- Paginate to completion when scoring requires the full set
|
|
68
|
+
- For sample-mode invocations, stop at first page and label output as "(sampled)"
|
|
69
|
+
|
|
70
|
+
### Step 4: Score + render
|
|
71
|
+
|
|
72
|
+
Apply the scoring formula. Render the table verbatim per the playbook format.
|
|
73
|
+
|
|
74
|
+
### Step 5: Append the behavioral signal
|
|
75
|
+
|
|
76
|
+
After the table, write a 1–3 sentence "Behavioral signal" paragraph that names the pattern in plain language. Reference the NOI framing — what does this observation say about how the team behaves under pressure?
|
|
77
|
+
|
|
78
|
+
## Output discipline
|
|
79
|
+
|
|
80
|
+
- **No prescriptions**. The agent surfaces patterns; the human interprets and acts.
|
|
81
|
+
- **No moralizing**. "Bob takes 6.8 days to clear blockers" is an observation. "Bob is bad at his job" is not — the same pattern can be intentional security review or unintentional overload, and the agent can't tell which.
|
|
82
|
+
- **No raw dumps**. If you'd rather render 200 issue rows than the 6-row score-summary, you've lost the NOI thread. Compress.
|
|
83
|
+
- **Frame outputs as questions the team can take to retro**. "67% of urgents don't ship — is the planning conversation reality-rooted, or theatrical?" is more useful than "67% of urgents don't ship."
|
|
84
|
+
|
|
85
|
+
## Error Handling
|
|
86
|
+
|
|
87
|
+
| Error | Recovery |
|
|
88
|
+
|---|---|
|
|
89
|
+
| Empty project | Return informative empty state — "no cycles closed in the last 90 days, can't compute velocity" |
|
|
90
|
+
| API rate limit hit | Back off + retry; if persistent, return partial result with sampling note |
|
|
91
|
+
| Auth error | Surface to orchestrator; user fixes credentials and re-runs |
|
|
92
|
+
| Unfamiliar workflow (e.g., team doesn't use cycles) | Fall back to issue-level metrics where possible; otherwise return empty state |
|
|
93
|
+
|
|
94
|
+
## Resources
|
|
95
|
+
|
|
96
|
+
- Parent skill: `skills/plane/SKILL.md`
|
|
97
|
+
- Sibling agent: `skills/plane/agents/plane-expert.md` — for API-surface help
|
|
98
|
+
- NOI: `skills/plane/references/noi.md`
|
|
99
|
+
- Compound commands playbook: `skills/plane/references/compound-commands.md`
|
|
100
|
+
- API surface: `skills/plane/references/api-surface.md`
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plane-expert
|
|
3
|
+
description: |
|
|
4
|
+
Plane API surface specialist. Answers "how do I query X in Plane" / "what endpoint
|
|
5
|
+
does Y" / "what is the response shape for Z" without firing live API calls.
|
|
6
|
+
Reads from the parent skill's references/api-surface.md as ground truth. Use when
|
|
7
|
+
the user wants to understand the API surface before running a compound command,
|
|
8
|
+
or when debugging an unexpected response shape from mcp__plane.
|
|
9
|
+
allowed-tools: "Read,Glob,Grep"
|
|
10
|
+
model: inherit
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Plane Expert (Domain Specialist)
|
|
14
|
+
|
|
15
|
+
> **Parent skill**: `skills/plane/SKILL.md`
|
|
16
|
+
|
|
17
|
+
A read-only agent that answers questions about Plane's API surface from the documented references. Does NOT call `mcp__plane` tools — its job is to teach the surface, not to query it.
|
|
18
|
+
|
|
19
|
+
## Overview
|
|
20
|
+
|
|
21
|
+
When the orchestrator skill detects an "API help mode" prompt — the user wants to understand the surface, not run a behavioral query — it delegates here. This agent reads `references/api-surface.md` and `references/compound-commands.md` and produces an answer grounded in those documents.
|
|
22
|
+
|
|
23
|
+
## When to use
|
|
24
|
+
|
|
25
|
+
- "What endpoint returns issues for a cycle?" → list_cycle_issues
|
|
26
|
+
- "How do I get worklog data?" → get_total_worklogs / get_issue_worklogs
|
|
27
|
+
- "Does Plane support webhook subscriptions?" → answer from documented surface
|
|
28
|
+
- "What's the response shape of get_cycle?" → from api-surface.md
|
|
29
|
+
- "Why does mcp__plane return uuids instead of names?" → because Plane normalizes by UUID; member/state/label resolution requires a follow-up call
|
|
30
|
+
|
|
31
|
+
## Instructions
|
|
32
|
+
|
|
33
|
+
### Step 1: Identify the API question type
|
|
34
|
+
|
|
35
|
+
Three sub-types:
|
|
36
|
+
|
|
37
|
+
1. **Endpoint discovery**: "what tool does X" — match user intent to a tool listed in api-surface.md
|
|
38
|
+
2. **Response shape**: "what fields are in Y" — quote the schema excerpt from api-surface.md
|
|
39
|
+
3. **Pagination / auth / rate-limit**: "how do I handle Z" — answer from the relevant section
|
|
40
|
+
|
|
41
|
+
### Step 2: Answer from references
|
|
42
|
+
|
|
43
|
+
Always cite the section of api-surface.md the answer came from. If the user's question isn't covered (e.g., they ask about an endpoint not in the documented subset), say so and direct them to the upstream Plane docs.
|
|
44
|
+
|
|
45
|
+
### Step 3: Suggest the compound command if applicable
|
|
46
|
+
|
|
47
|
+
If the user's question hints at a behavioral pattern (e.g., "how do I find stale tickets" or "which engineers are overloaded"), suggest the matching compound command from compound-commands.md instead of explaining the raw endpoint sequence.
|
|
48
|
+
|
|
49
|
+
## Output
|
|
50
|
+
|
|
51
|
+
Concise, citation-grounded answer. Format:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
[Direct answer to the question]
|
|
55
|
+
|
|
56
|
+
Per `references/api-surface.md` § [section]:
|
|
57
|
+
[relevant excerpt]
|
|
58
|
+
|
|
59
|
+
[Optional: "If you're trying to do X behaviorally, consider /plane-cycle-velocity instead"]
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Error Handling
|
|
63
|
+
|
|
64
|
+
| Error | Recovery |
|
|
65
|
+
|---|---|
|
|
66
|
+
| Question references an undocumented endpoint | Acknowledge gap; point at upstream Plane docs |
|
|
67
|
+
| Question is actually a behavioral query in disguise | Redirect to `plane-analyst` via the orchestrator skill |
|
|
68
|
+
| References file missing | Report the gap; suggest re-forging the plugin |
|
|
69
|
+
|
|
70
|
+
## Resources
|
|
71
|
+
|
|
72
|
+
- Parent skill: `skills/plane/SKILL.md`
|
|
73
|
+
- Sibling agent: `skills/plane/agents/plane-analyst.md` — for behavioral queries
|
|
74
|
+
- API surface: `skills/plane/references/api-surface.md`
|
|
75
|
+
- Compound commands: `skills/plane/references/compound-commands.md`
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Plane API Surface
|
|
2
|
+
|
|
3
|
+
**Captured**: 2026-05-07
|
|
4
|
+
**Source of truth**: `mcp__plane` MCP server tool list + Plane open-source repo (`makeplane/plane`)
|
|
5
|
+
**Plane version targeted**: API v1, current production at `projects.intentsolutions.io`
|
|
6
|
+
|
|
7
|
+
This skill operates against Plane's public REST API. It does NOT implement the API client itself — instead it delegates to `mcp__plane` MCP tools (already wired in the user's environment). When `mcp__plane` is unavailable, the skill degrades to a documentation-only mode and instructs the user how to install it.
|
|
8
|
+
|
|
9
|
+
## Authentication
|
|
10
|
+
|
|
11
|
+
Three environment variables, all required:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
PLANE_API_KEY="<your_personal_access_token>"
|
|
15
|
+
PLANE_WORKSPACE_SLUG="<workspace_slug>"
|
|
16
|
+
PLANE_API_HOST_URL="https://projects.intentsolutions.io"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Mirror these into the MCP server config (already done in user's `~/.claude.json` per `reference_plane_setup.md` memory).
|
|
20
|
+
|
|
21
|
+
**Rate limits**: 60 requests/minute on the standard tier. Compound commands batch where possible and back off on 429.
|
|
22
|
+
|
|
23
|
+
## Endpoint groups consumed
|
|
24
|
+
|
|
25
|
+
### Issues
|
|
26
|
+
|
|
27
|
+
| Tool | Purpose | Used by compound command |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| `mcp__plane__list_project_issues` | Enumerate issues per project | All — base query |
|
|
30
|
+
| `mcp__plane__get_issue_using_readable_identifier` | Full issue detail by `PROJECT-N` ID | priority-drift, stale-tickets |
|
|
31
|
+
| `mcp__plane__list_states` | Project state enum (Backlog / In Progress / Done / etc.) | stale-tickets, cycle-velocity |
|
|
32
|
+
| `mcp__plane__update_issue` | Mutation — used only when explicitly requested by user | (none — this skill is read-mostly) |
|
|
33
|
+
|
|
34
|
+
### Cycles
|
|
35
|
+
|
|
36
|
+
| Tool | Purpose | Used by compound command |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `mcp__plane__list_cycles` | Cycle list per project | cycle-velocity, priority-drift |
|
|
39
|
+
| `mcp__plane__get_cycle` | Cycle details (start/end dates, completion stats) | cycle-velocity |
|
|
40
|
+
| `mcp__plane__list_cycle_issues` | Issues planned in a specific cycle | cycle-velocity, priority-drift |
|
|
41
|
+
| `mcp__plane__transfer_cycle_issues` | Track issues moved between cycles (re-planning signal) | priority-drift (read-side via list_cycle_issues + diff over time) |
|
|
42
|
+
|
|
43
|
+
### Modules
|
|
44
|
+
|
|
45
|
+
| Tool | Purpose | Used by compound command |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| `mcp__plane__list_modules` | Module enumeration | cross-project-load |
|
|
48
|
+
| `mcp__plane__list_module_issues` | Issues per module | cross-project-load |
|
|
49
|
+
|
|
50
|
+
### Comments / Activity
|
|
51
|
+
|
|
52
|
+
| Tool | Purpose | Used by compound command |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| `mcp__plane__get_issue_comments` | Comment thread on an issue | reviewer-gate-strength |
|
|
55
|
+
|
|
56
|
+
### Workspace + Worklogs
|
|
57
|
+
|
|
58
|
+
| Tool | Purpose | Used by compound command |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| `mcp__plane__get_workspace_members` | Engineer roster | engineer-velocity, cross-project-load |
|
|
61
|
+
| `mcp__plane__get_total_worklogs` | Time tracked per assignee | engineer-velocity |
|
|
62
|
+
| `mcp__plane__get_issue_worklogs` | Time tracked per issue | cycle-velocity (estimate-vs-actual) |
|
|
63
|
+
|
|
64
|
+
## Response shapes (excerpts)
|
|
65
|
+
|
|
66
|
+
Full schemas live at `mcp__plane`'s tool-detail descriptions; these are the shapes the compound commands JOIN against.
|
|
67
|
+
|
|
68
|
+
### Issue (excerpt)
|
|
69
|
+
|
|
70
|
+
```jsonc
|
|
71
|
+
{
|
|
72
|
+
"id": "uuid",
|
|
73
|
+
"name": "Issue title",
|
|
74
|
+
"state": "uuid", // → joined against list_states
|
|
75
|
+
"priority": "urgent|high|medium|low|none",
|
|
76
|
+
"assignees": ["uuid", ...], // → joined against get_workspace_members
|
|
77
|
+
"created_at": "ISO-8601",
|
|
78
|
+
"updated_at": "ISO-8601",
|
|
79
|
+
"completed_at": "ISO-8601 | null",
|
|
80
|
+
"estimate_point": 5, // → estimate-vs-actual signal
|
|
81
|
+
"cycle_id": "uuid | null",
|
|
82
|
+
"module_ids": ["uuid", ...],
|
|
83
|
+
"labels": ["uuid", ...]
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Cycle (excerpt)
|
|
88
|
+
|
|
89
|
+
```jsonc
|
|
90
|
+
{
|
|
91
|
+
"id": "uuid",
|
|
92
|
+
"name": "Sprint 14",
|
|
93
|
+
"start_date": "ISO-8601",
|
|
94
|
+
"end_date": "ISO-8601",
|
|
95
|
+
"total_issues": 23,
|
|
96
|
+
"completed_issues": 18,
|
|
97
|
+
"cancelled_issues": 1,
|
|
98
|
+
"started_issues": 4, // still open at close — overrun signal
|
|
99
|
+
"unstarted_issues": 0
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Pagination
|
|
104
|
+
|
|
105
|
+
All `list_*` endpoints return cursor-based pagination:
|
|
106
|
+
|
|
107
|
+
```jsonc
|
|
108
|
+
{
|
|
109
|
+
"results": [...],
|
|
110
|
+
"next_cursor": "<opaque-token>",
|
|
111
|
+
"prev_cursor": "<opaque-token>"
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Compound commands paginate to completion when scoring requires the full set; sample-mode (first page only) is supported via the `--sample` flag for fast iteration.
|
|
116
|
+
|
|
117
|
+
## When the API surface drifts
|
|
118
|
+
|
|
119
|
+
Re-run via `/skill-creator --reforge plane` (see `/skill-creator` SKILL.md § Reforge Mode Workflow). Auto-bumps version per detected change scope.
|
|
120
|
+
|
|
121
|
+
Future enhancement (Phase 5C cron): scheduled daily diff against the live API surface, opens a GitHub issue tagged `forge-drift` when an endpoint adds / removes / changes shape.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Compound Commands — Plane Behavior Observatory
|
|
2
|
+
|
|
3
|
+
Each command answers a question that **cannot** be answered from any single Plane API endpoint. Each is derived from the NOI (`references/noi.md`) and the Project / Workflow archetype's default `velocity / stale / bottleneck` triplet, adapted to Plane's behavioral observatory framing.
|
|
4
|
+
|
|
5
|
+
## Command 1 — `/plane-cycle-velocity`
|
|
6
|
+
|
|
7
|
+
**Question**: Does this team's cycle velocity match its planning?
|
|
8
|
+
|
|
9
|
+
**Synthesizes**:
|
|
10
|
+
- `list_cycles` → enumerate completed cycles
|
|
11
|
+
- `get_cycle` (per cycle) → planned start/end + actual completion counts
|
|
12
|
+
- `list_cycle_issues` (per cycle) → estimate_point sum vs. completed_issues sum
|
|
13
|
+
- `get_issue_worklogs` (sample) → actual time spent per issue (if estimate_point unset)
|
|
14
|
+
|
|
15
|
+
**Output**:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
PROJECT: braves-booth
|
|
19
|
+
Cycles analyzed: 8 most recent
|
|
20
|
+
|
|
21
|
+
Cycle Planned Completed Overrun Estimate Actual Variance
|
|
22
|
+
───────────────── ──────── ───────── ──────── ───────── ──────── ────────
|
|
23
|
+
Sprint 14 14d 18d +4d 42 pts 58 pts +38%
|
|
24
|
+
Sprint 13 14d 14d 0d 38 pts 34 pts -10%
|
|
25
|
+
Sprint 12 14d 21d +7d 45 pts 61 pts +36%
|
|
26
|
+
Sprint 11 14d 14d 0d 40 pts 42 pts +5%
|
|
27
|
+
...
|
|
28
|
+
|
|
29
|
+
Pattern: 4/8 cycles overrun by ≥ 4 days. Mean variance: +21%.
|
|
30
|
+
Behavioral signal: cycle planning is ~20% optimistic — either reduce
|
|
31
|
+
scope per cycle or extend cycle length.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Caching**: cycle data is immutable once a cycle closes; cache by cycle ID in `~/.cache/plane-skill/cycles.sqlite`.
|
|
35
|
+
|
|
36
|
+
## Command 2 — `/plane-stale-tickets`
|
|
37
|
+
|
|
38
|
+
**Question**: Which tickets are quietly failing under shared ownership?
|
|
39
|
+
|
|
40
|
+
**Synthesizes**:
|
|
41
|
+
- `list_project_issues` → open issues
|
|
42
|
+
- `list_states` → identify "In Progress" state UUIDs
|
|
43
|
+
- `get_issue_comments` (per stale candidate) → assignee changes during the open window
|
|
44
|
+
|
|
45
|
+
**Output**:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
PROJECT: braves-booth
|
|
49
|
+
Threshold: In Progress > 14 days
|
|
50
|
+
|
|
51
|
+
Issue Days In Assignee Churn Last Comment Score
|
|
52
|
+
─────────────── ──────── ─────────────── ───────────── ─────
|
|
53
|
+
BRAVES-78 29d 3 assignees 11d ago 9.2 ⚠
|
|
54
|
+
BRAVES-91 21d 2 assignees 4d ago 5.1
|
|
55
|
+
BRAVES-85 18d 1 assignee 2d ago 2.8
|
|
56
|
+
|
|
57
|
+
Score = days_in × (1 + assignee_churn) × (days_since_last_comment / 7)
|
|
58
|
+
|
|
59
|
+
Behavioral signal: BRAVES-78 has 3 assignees and hasn't moved in 11 days
|
|
60
|
+
— classic shared-ownership orphan. Assign one owner or close as won't-do.
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Caching**: open-issue list is mutable; refresh on each invocation.
|
|
64
|
+
|
|
65
|
+
## Command 3 — `/plane-reviewer-gate-strength`
|
|
66
|
+
|
|
67
|
+
**Question**: Which reviewers gate-keep harder than the spec demands?
|
|
68
|
+
|
|
69
|
+
**Synthesizes**:
|
|
70
|
+
- `list_project_issues` filtered to recently-closed
|
|
71
|
+
- `get_issue_comments` (per closed issue) → look for "blocked by reviewer" pattern + reviewer assignment timing
|
|
72
|
+
|
|
73
|
+
Heuristic for blocker detection: a comment containing a state-change to "blocked" or text matching `/blocked|review|approval/i`, followed by a comment lifting the block.
|
|
74
|
+
|
|
75
|
+
**Output**:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
PROJECT: braves-booth
|
|
79
|
+
Period: last 30 days
|
|
80
|
+
|
|
81
|
+
Reviewer Issues Gated Mean Time Blocked Verdict
|
|
82
|
+
────────── ───────────── ────────────────── ──────────────────────
|
|
83
|
+
Alice 12 1.2 days Engineer-fast clearance
|
|
84
|
+
Bob 8 6.8 days Bottleneck — not a senior
|
|
85
|
+
Carol 15 2.1 days Healthy review cadence
|
|
86
|
+
|
|
87
|
+
Behavioral signal: Bob's 6.8-day mean indicates a process bottleneck.
|
|
88
|
+
Either re-route reviews, define explicit review SLAs, or split Bob's
|
|
89
|
+
queue.
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Note**: this command doesn't define "good" or "bad" reviewer behavior — the score surfaces friction, the human decides whether the friction is intentional (security review) or unintentional (overload).
|
|
93
|
+
|
|
94
|
+
## Command 4 — `/plane-priority-drift`
|
|
95
|
+
|
|
96
|
+
**Question**: Does the team plan high-priority work but ship low-priority work?
|
|
97
|
+
|
|
98
|
+
**Synthesizes**:
|
|
99
|
+
- `list_cycles` → recent closed cycles
|
|
100
|
+
- `list_cycle_issues` (per cycle) → priority distribution at planning time
|
|
101
|
+
- Cross-reference with `get_issue_using_readable_identifier` for issues marked `completed` in the cycle
|
|
102
|
+
|
|
103
|
+
**Output**:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
PROJECT: braves-booth
|
|
107
|
+
Cycles analyzed: 8 most recent
|
|
108
|
+
|
|
109
|
+
Priority Planned Shipped Drift
|
|
110
|
+
───────── ───────── ───────── ─────────
|
|
111
|
+
urgent 12 4 -67%
|
|
112
|
+
high 38 18 -53%
|
|
113
|
+
medium 24 31 +29%
|
|
114
|
+
low 8 29 +263%
|
|
115
|
+
|
|
116
|
+
Pattern: 67% of planned urgents and 53% of planned highs do not ship
|
|
117
|
+
in the cycle they're planned in. Meanwhile low-priority work ships
|
|
118
|
+
+263% above plan.
|
|
119
|
+
|
|
120
|
+
Behavioral signal: the planning conversation does not reflect what
|
|
121
|
+
actually gets done. Either the team plans theatrically and ships
|
|
122
|
+
opportunistically, or planning is happening at the wrong time/place.
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**This is the NOI-specific compound command** — not in the default Project/Workflow archetype set; added because the NOI's "stated-vs-actual priority drift" framing demands it.
|
|
126
|
+
|
|
127
|
+
## Command 5 — `/plane-cross-project-load`
|
|
128
|
+
|
|
129
|
+
**Question**: Which engineers are spread across too many active projects?
|
|
130
|
+
|
|
131
|
+
**Synthesizes**:
|
|
132
|
+
- `get_workspace_members` → engineer roster
|
|
133
|
+
- `list_project_issues` (across all active projects, filtered to assignee × open state)
|
|
134
|
+
- `list_modules` (used as a project-internal grouping signal)
|
|
135
|
+
|
|
136
|
+
**Output**:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
WORKSPACE: internal
|
|
140
|
+
Active projects: 14
|
|
141
|
+
|
|
142
|
+
Engineer Projects Active Cycles Open Issues Verdict
|
|
143
|
+
────────────── ───────── ────────────── ──────────── ─────────────
|
|
144
|
+
Alice 7 6 42 Stretched
|
|
145
|
+
Bob 4 4 23 Healthy
|
|
146
|
+
Carol 11 9 68 Crisis ⚠
|
|
147
|
+
David 2 2 9 Focused
|
|
148
|
+
|
|
149
|
+
Behavioral signal: Carol is on 11 active projects and 9 active cycles
|
|
150
|
+
— that's not focus, that's project-management debt. Either consolidate
|
|
151
|
+
projects or rotate Carol off most.
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Caching**: assignment data is mutable; refresh on each invocation.
|
|
155
|
+
|
|
156
|
+
## How agents consume this
|
|
157
|
+
|
|
158
|
+
`plane-expert` agent reads from `api-surface.md` and answers "how do I query X" questions about the Plane API.
|
|
159
|
+
|
|
160
|
+
`plane-analyst` agent reads from `noi.md` + this file and orchestrates the compound commands above. The orchestrator skill (`SKILL.md`) routes to one or the other based on user intent: "tell me about Plane endpoint X" → expert; "how is my team behaving in cycle Y" → analyst.
|
|
161
|
+
|
|
162
|
+
## When new compound commands are added
|
|
163
|
+
|
|
164
|
+
Constraint: any new command must answer a behavioral question that the NOI implies. If a command can be answered by a single endpoint call (e.g., "list issues assigned to me"), it does not belong here. Add it to a separate utility skill or call `mcp__plane` directly.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# NOI — Plane
|
|
2
|
+
|
|
3
|
+
> **Plane is a team behavior observatory.**
|
|
4
|
+
|
|
5
|
+
## What this NOI claims
|
|
6
|
+
|
|
7
|
+
Plane describes itself as an open-source project tracker — issues, cycles, modules, projects, work-in-progress. That's the **claimed identity**. It's accurate but it's the floor, not the ceiling.
|
|
8
|
+
|
|
9
|
+
The **secret identity** is what you can read off Plane that nobody talks about: how a team actually behaves under pressure. Cycle close-out velocity, the gap between estimate and actual, which workflows quietly orphan tickets in `In Progress`, which engineers consistently ship under the wire and which stack up at the deadline, which reviewers gate-keep harder than the spec demands, which projects burn cycles on rework versus on net-new work, and where the team's stated priorities diverge from what's actually getting closed.
|
|
10
|
+
|
|
11
|
+
That's not project tracking. That's an observatory pointed at organizational behavior, with Plane's API as the telescope.
|
|
12
|
+
|
|
13
|
+
## What this NOI unlocks that the obvious wrapper doesn't
|
|
14
|
+
|
|
15
|
+
A "Plane wrapper" skill calls `list_project_issues` and renders results. Useful but generic — every Plane SDK does that. The team-behavior-observatory framing demands compound queries that synthesize multiple endpoints into observations no single endpoint exposes:
|
|
16
|
+
|
|
17
|
+
- **Cycle close velocity vs. estimate**: cross-reference cycle close dates with cycle planning dates and issue-level estimate vs. actual time-to-close. Surfaces "the team consistently overruns 2-week cycles by 4 days" — invisible from any single endpoint.
|
|
18
|
+
- **Stale-ticket drift**: `In Progress` tickets older than the cycle they were planned in, scored by ownership churn (assignee changes during the open window). Surfaces "the cluster of tickets that quietly fail every two weeks because three people share ownership."
|
|
19
|
+
- **Reviewer gate strength**: time-from-blocker-flagged to blocker-cleared, sliced by reviewer. Distinguishes reviewers who clear blockers fast (engineers) from reviewers who serve as control points (process gatekeeping). Surfaces "PRs assigned to X close in 1.4 days; PRs assigned to Y close in 6.8 — Y is a bottleneck, not a senior."
|
|
20
|
+
- **Stated-vs-actual priority drift**: the priority labels on planned issues vs. the priority labels on issues that actually closed in the cycle. Surfaces "the team plans P1s and ships P3s — the planning conversation is theater."
|
|
21
|
+
- **Cross-project workload concentration**: aggregate `assigned_to` counts across all active projects per engineer. Surfaces "Alice is on 7 active cycles across 4 projects; that's not focus, that's project-management debt."
|
|
22
|
+
|
|
23
|
+
None of these are visible in Plane's dashboard. None are accessible from a single API endpoint. Each requires the skill to JOIN data the API only exposes per-resource — which is the compound-command discipline the forge mandates.
|
|
24
|
+
|
|
25
|
+
## Why this NOI matters for downstream design
|
|
26
|
+
|
|
27
|
+
Every gate downstream of this point reads from `noi.md`. The compound commands designed in `compound-commands.md` are derived from these specific observations, not from "what endpoints does Plane have." The agents (`plane-expert`, `plane-analyst`) carry this framing in their system prompts — they answer behavioral questions about teams, not ticket-CRUD questions.
|
|
28
|
+
|
|
29
|
+
If a future maintainer asks "should we add X to this skill?" — the answer is: **does X surface team-behavior signal?** If yes, design it as a compound query. If no (e.g., "create issue from CLI"), add it to a separate utility skill instead. The NOI is the gate that keeps this skill from sprawling into a generic Plane wrapper.
|
|
30
|
+
|
|
31
|
+
## Not what this NOI claims
|
|
32
|
+
|
|
33
|
+
- Not a CRUD wrapper for Plane (that's `mcp__plane` directly)
|
|
34
|
+
- Not a CLI alternative to `projects.intentsolutions.io` (the web UI is fine for ticket entry)
|
|
35
|
+
- Not a Plane-specific clone of standard project-tracker skills (the framing rejects that direction)
|