openplanr 2.1.1 → 2.2.0

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.
Files changed (85) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/cli/commands/planning-artifacts.d.ts.map +1 -1
  3. package/dist/cli/commands/planning-artifacts.js +6 -18
  4. package/dist/cli/commands/planning-artifacts.js.map +1 -1
  5. package/dist/cli/commands/sprint-refinement.d.ts +5 -0
  6. package/dist/cli/commands/sprint-refinement.d.ts.map +1 -0
  7. package/dist/cli/commands/sprint-refinement.js +141 -0
  8. package/dist/cli/commands/sprint-refinement.js.map +1 -0
  9. package/dist/cli/commands/status.d.ts.map +1 -1
  10. package/dist/cli/commands/status.js +4 -2
  11. package/dist/cli/commands/status.js.map +1 -1
  12. package/dist/cli/commands/update.d.ts.map +1 -1
  13. package/dist/cli/commands/update.js +5 -8
  14. package/dist/cli/commands/update.js.map +1 -1
  15. package/dist/dashboard/.vite/manifest.json +1 -1
  16. package/dist/dashboard/assets/{index-BCvntXFj.js → index-B74ddyXA.js} +2 -2
  17. package/dist/dashboard/assets/{index-BCvntXFj.js.map → index-B74ddyXA.js.map} +1 -1
  18. package/dist/dashboard/dashboard-manifest.json +8 -8
  19. package/dist/dashboard/index.html +1 -1
  20. package/dist/models/sprint-refinement-schema.d.ts +122 -0
  21. package/dist/models/sprint-refinement-schema.d.ts.map +1 -0
  22. package/dist/models/sprint-refinement-schema.js +147 -0
  23. package/dist/models/sprint-refinement-schema.js.map +1 -0
  24. package/dist/models/types.d.ts +8 -0
  25. package/dist/models/types.d.ts.map +1 -1
  26. package/dist/services/delivery-status-service.d.ts +6 -1
  27. package/dist/services/delivery-status-service.d.ts.map +1 -1
  28. package/dist/services/delivery-status-service.js +28 -1
  29. package/dist/services/delivery-status-service.js.map +1 -1
  30. package/dist/services/git-service.d.ts +19 -0
  31. package/dist/services/git-service.d.ts.map +1 -1
  32. package/dist/services/git-service.js +41 -0
  33. package/dist/services/git-service.js.map +1 -1
  34. package/dist/services/graph-service.d.ts.map +1 -1
  35. package/dist/services/graph-service.js +3 -1
  36. package/dist/services/graph-service.js.map +1 -1
  37. package/dist/services/sprint-refinement-service.d.ts +162 -0
  38. package/dist/services/sprint-refinement-service.d.ts.map +1 -0
  39. package/dist/services/sprint-refinement-service.js +645 -0
  40. package/dist/services/sprint-refinement-service.js.map +1 -0
  41. package/dist/templates/sprints/refinement.md.hbs +94 -0
  42. package/dist/templates/sprints/sprint-tasks.md.hbs +16 -0
  43. package/dist/templates/sprints/sprint.md.hbs +17 -12
  44. package/dist/utils/constants.d.ts +2 -0
  45. package/dist/utils/constants.d.ts.map +1 -1
  46. package/dist/utils/constants.js +6 -1
  47. package/dist/utils/constants.js.map +1 -1
  48. package/docs/CLI.md +26 -2
  49. package/lib/host-packages/adapter-registry.json +1 -1
  50. package/lib/host-packages/capability-map.json +16 -0
  51. package/lib/host-packages/claude/openplanr/.openplanr-content.json +27 -7
  52. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +1 -1
  53. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +1 -1
  54. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +1 -1
  55. package/lib/host-packages/claude/openplanr/skills/openplanr/SKILL.md +1 -0
  56. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +1 -1
  57. package/lib/host-packages/claude/openplanr/skills/sprint/SKILL.md +181 -0
  58. package/lib/host-packages/claude/openplanr/skills/sprint/openplanr.skill.json +59 -0
  59. package/lib/host-packages/claude/openplanr/skills/sprint/references/refinement-contract.md +154 -0
  60. package/lib/host-packages/claude/openplanr/skills/sprint/references/sprint-formats.md +146 -0
  61. package/lib/host-packages/claude/openplanr/skills/sprint/schemas/refinement.schema.json +140 -0
  62. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +24 -8
  63. package/lib/host-packages/cursor/openplanr/manifest.json +2 -1
  64. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/package.json +1 -1
  65. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/package.json +1 -1
  66. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/package.json +1 -1
  67. package/lib/host-packages/cursor/openplanr/rules/planr-openplanr.mdc +1 -0
  68. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/package.json +1 -1
  69. package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/refinement-contract.md +154 -0
  70. package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/sprint-formats.md +146 -0
  71. package/lib/host-packages/cursor/openplanr/rules/planr-sprint/schemas/refinement.schema.json +140 -0
  72. package/lib/host-packages/cursor/openplanr/rules/planr-sprint.mdc +180 -0
  73. package/lib/host-packages/openai/openplanr/.openplanr-content.json +31 -7
  74. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +1 -1
  75. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +1 -1
  76. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +1 -1
  77. package/lib/host-packages/openai/openplanr/skills/openplanr/SKILL.md +1 -0
  78. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +1 -1
  79. package/lib/host-packages/openai/openplanr/skills/sprint/SKILL.md +181 -0
  80. package/lib/host-packages/openai/openplanr/skills/sprint/agents/openai.yaml +6 -0
  81. package/lib/host-packages/openai/openplanr/skills/sprint/openplanr.skill.json +59 -0
  82. package/lib/host-packages/openai/openplanr/skills/sprint/references/refinement-contract.md +154 -0
  83. package/lib/host-packages/openai/openplanr/skills/sprint/references/sprint-formats.md +146 -0
  84. package/lib/host-packages/openai/openplanr/skills/sprint/schemas/refinement.schema.json +140 -0
  85. package/package.json +2 -2
@@ -0,0 +1,180 @@
1
+ ---
2
+ description: "Refine every open backlog item against the code and the calendar, refute the picks, and select a sprint that fits capacity and the release cut. Use before a cut or sprint; not for decomposing one specification or reporting status."
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # Planr Sprint
7
+
8
+ Backlog refinement followed by sprint selection. **Refine** reads every open
9
+ item in full and judges it against the default branch and the calendar.
10
+ **Select** fits the surviving items to the stated capacity and the next release
11
+ cut, refutes the picks with three independent lenses, and writes the sprint.
12
+ Perform the reasoning in this session; never delegate it to a model subprocess.
13
+ The CLI (`planr sprint …`) stores what this skill decides. It is optional: when
14
+ it is unavailable, write the same files by hand in the shapes given in
15
+ [sprint formats](references/sprint-formats.md).
16
+
17
+ Use `planr-plan` to decompose one specification, `planr-status` to report
18
+ without judging, and `planr-operate` for an executive decision queue. This skill
19
+ never implements work and never chains into `planr-ship`.
20
+
21
+ `--refine-only` runs the refine phase (steps 1 to 4 for the blocked and
22
+ close-or-demote buckets) and writes the refinement note without creating a
23
+ sprint. Any run can be repeated and diffed against the previous one.
24
+
25
+ ## Inputs are tiers, not gates
26
+
27
+ Every input except the backlog is optional. A missing tier removes one
28
+ capability; it never blocks the run. Name every degraded input in `Issues`.
29
+
30
+ | Input | If present | If absent |
31
+ | --- | --- | --- |
32
+ | Open backlog and quick tasks (`.planr/backlog/`, `.planr/quick/`, open spec tasks) | The core: read, score, bucket | The only hard requirement; zero items means "nothing to refine" |
33
+ | Git history and the code paths items cite | Evidence lens: stale, already fixed, premise false | Buckets rest on the items' own dates; say "not verified against code" |
34
+ | Release profile (`.release/profile.md`: cut date, cadence, freezes) | Size the In-progress bucket to the cut; the sprint gets `releaseCut` | Ask once for a horizon; default to a two-week sprint from today |
35
+ | Capacity (engineers × working days) | Fit the list and name the overflow | Ask once; default 1 engineer × 10 days, stated in the return |
36
+ | Previous sprint or refinement note (`.planr/sprints/SPRINT-NNN/refinement.json`) | Carry `leftovers`; `planr sprint diff` is possible | First run, no diff |
37
+ | Last Operate cycle | Rank its unfinished actions alongside | Skipped silently |
38
+ | Linear or GitHub connector | Push statuses on approval, read PR state | Local files only; report the external step as not run |
39
+
40
+ ## Step 0: Frame the run
41
+
42
+ Before reading the backlog, ask through the host's structured question surface
43
+ (Claude Code `AskUserQuestion`, the Codex equivalent), never through free text
44
+ when a structured surface exists.
45
+
46
+ - One call, at most three questions, each with mutually exclusive options and
47
+ a recommended default; the user can always answer "Other".
48
+ - Ask only what the repository cannot answer: capacity and horizon when no
49
+ profile and no argument supplies them; a focus (one product or area, or
50
+ everything); what to do with items judged dead (close, demote, or list only);
51
+ refine only, or refine and select.
52
+ - Never ask about facts derivable from files (the cut date in the profile, the
53
+ last sprint, the open item count). Never ask mid-run.
54
+ - With `--yes` or no structured surface, take the defaults and list the ones
55
+ taken in `Issues`.
56
+
57
+ The only other question is the approval at the end (step 6).
58
+
59
+ ## Step 1: Read the calendar and capacity
60
+
61
+ Next cut and freezes from `.release/profile.md`; capacity from the framing
62
+ question or argument; `leftovers` from the previous sprint's `refinement.json`;
63
+ unfinished actions from the last Operate cycle. Record the git revision the run
64
+ judges against (`git rev-parse --short HEAD` on the default branch).
65
+
66
+ ## Step 2: Read every open item in full
67
+
68
+ Backlog items, quick tasks and open spec tasks: the whole file, not the title.
69
+ For each item record the fields in the
70
+ [refinement contract](references/refinement-contract.md): what it claims, the
71
+ latest dated evidence, the code path it names and whether that path still
72
+ exists on the default branch as described, what blocks it (partner, team
73
+ decision, another item, nothing), an effort class (`hours`, `day`, `days`,
74
+ `week+`), and a score: production impact this month × tractability now.
75
+
76
+ Read the code an item names before believing its claim. `git log -S`, `git
77
+ log -- <path>` and the merged pull requests since the item's evidence date are
78
+ the cheapest refutations.
79
+
80
+ ## Step 3: Rank into four buckets
81
+
82
+ - **In progress now**: fits capacity to the cut, in execution order, grouped
83
+ into PR batches by product or into sessions. Each batch carries a title and
84
+ an effort in days.
85
+ - **Plan next**: real, but after the cut.
86
+ - **Blocked**: the named blocker and the one question that unblocks it.
87
+ - **Close or demote**: with the evidence (`file:line`, PR number or date) and
88
+ the target status or priority in the repository's own vocabulary.
89
+
90
+ Carry the previous Operate cycle's unfinished actions explicitly. Include the
91
+ release cut itself as work; when it has no artifact yet, file it with
92
+ `planr quick create "Release cut <date>"` so the sprint contains only artifact
93
+ ids.
94
+
95
+ ## Step 4: Refute the In-progress bucket
96
+
97
+ Before the bucket is shown, run three independent lenses over every pick:
98
+
99
+ 1. **Evidence**: still real on the default branch; premise not false; not
100
+ already fixed.
101
+ 2. **Capacity and sequencing**: fits the days; migrations, partner
102
+ dependencies, PR batching and CI cost per PR are accounted for.
103
+ 3. **User impact**: who is hit this month if it is not done, and which
104
+ higher-impact item was omitted for it.
105
+
106
+ A pick that fails moves or drops, and the reason is kept in `refuted[]` with its
107
+ lens. The list must fit the stated capacity; when it does not, say what was cut.
108
+
109
+ ## Step 5: Write the sprint, the note and the JSON, then stop
110
+
111
+ Write the three durable outputs (formats in
112
+ [sprint formats](references/sprint-formats.md)); the chat return is a view of
113
+ them.
114
+
115
+ ```bash
116
+ planr sprint create --data sprint.json --json # name, releaseCut, capacityDays, startDate
117
+ planr sprint refinement SPRINT-NNN --data refinement.json --json # validates, stores the note and JSON, fills the sprint body
118
+ planr sprint diff SPRINT-MMM SPRINT-NNN # when a previous run exists
119
+ ```
120
+
121
+ `refinement.json` must satisfy [the schema](schemas/refinement.schema.json); the
122
+ CLI rejects an inconsistent document with `$`-rooted diagnostics. Fix the
123
+ document, never the validation. With `--refine-only`, skip `sprint create` and
124
+ record the refinement against the current active sprint, or write only the note
125
+ and JSON when none exists.
126
+
127
+ Then stop. Ask the approval question through the structured surface: apply the
128
+ write-back, or leave the proposal as written.
129
+
130
+ ## Step 6: On approval, apply
131
+
132
+ ```bash
133
+ planr sprint apply SPRINT-NNN --dry-run # show the status and priority changes
134
+ planr sprint apply SPRINT-NNN --yes --commit # one commit: chore(planr): refine backlog for SPRINT-NNN
135
+ ```
136
+
137
+ Where a connector is configured, push each changed item afterwards
138
+ (`planr linear push <id>`, `planr github push <id>`) and report the ones that
139
+ were not pushed. When the CLI is unavailable, apply the same status changes with
140
+ the repository's own vocabulary and commit them with the same message.
141
+
142
+ Close a finished sprint with `planr sprint close SPRINT-NNN`; it records the
143
+ leftovers the next run carries.
144
+
145
+ ## Rules from production use
146
+
147
+ - Never move an item to In progress on its own priority label; a months-old P0
148
+ or P1 is often dead. Evidence date beats label.
149
+ - Never accept an item's claim of impact without reading the code path it names.
150
+ - Items blocked on a partner or a team decision are never In progress; they get
151
+ the question that unblocks them.
152
+ - The list must fit the stated capacity; if it does not, say what was cut.
153
+ - No new migration in a hand deploy unless the sprint says so explicitly.
154
+ - Use the repository's own status vocabulary (`planr update --help` lists it);
155
+ never introduce a second one.
156
+ - The note and the JSON are the durable output; the chat return is a view of
157
+ them. That is what keeps the third run from re-arguing the first two.
158
+
159
+ ## Return
160
+
161
+ - **Outcome:** `proposed` (sprint written, nothing else changed) or `applied`
162
+ (status changes written on approval), plus capacity used vs available in
163
+ engineer-days.
164
+ - **Sprint:** the sprint id and path, and the cut it targets.
165
+ - **Buckets:** four lists, one line per row: `ID · title · effort · why`.
166
+ In-progress rows sit under their batch heading in execution order. Blocked
167
+ rows carry the blocker and the unblocking question. Close-or-demote rows carry
168
+ the evidence.
169
+ - **Refuted:** every pick a refuter changed, with the lens and the change.
170
+ - **Issues:** degraded inputs, items that could not be read or judged, defaults
171
+ taken, or `none`.
172
+
173
+ `planr status` shows the active sprint with its cut and progress; the dashboard
174
+ (`planr-dashboard`) renders the sprint from the same frontmatter and checkboxes.
175
+
176
+ ## Reference files
177
+
178
+ - [Refinement contract](references/refinement-contract.md): item record, scoring, effort classes, buckets, refuter lenses, `refinement.json` fields
179
+ - [Sprint formats](references/sprint-formats.md): sprint artifact, refinement note, chat return, hand-written fallback
180
+ - [Refinement schema](schemas/refinement.schema.json): the JSON Schema the CLI validates against
@@ -3,7 +3,7 @@
3
3
  "schemaVersion": "1.0.0",
4
4
  "protocolVersion": "1.8.0",
5
5
  "host": "openai",
6
- "skillCount": 26,
6
+ "skillCount": 27,
7
7
  "roleCount": 0,
8
8
  "files": [
9
9
  {
@@ -368,7 +368,7 @@
368
368
  },
369
369
  {
370
370
  "path": "skills/design-loop/scripts/runtime/packages/protocol/package.json",
371
- "digest": "sha256:9a11f3b5e52bb2bd3f2310a9cbc1276b62b1b08e401279769228d5bfd8567995"
371
+ "digest": "sha256:d3a009b9b304680df08d3ec30bccea5b0baf7444fee4f65e90708125535d8773"
372
372
  },
373
373
  {
374
374
  "path": "skills/design-loop/scripts/runtime/packages/protocol/registry/artifact-theme.json",
@@ -540,7 +540,7 @@
540
540
  },
541
541
  {
542
542
  "path": "skills/design-review/scripts/runtime/packages/protocol/package.json",
543
- "digest": "sha256:9a11f3b5e52bb2bd3f2310a9cbc1276b62b1b08e401279769228d5bfd8567995"
543
+ "digest": "sha256:d3a009b9b304680df08d3ec30bccea5b0baf7444fee4f65e90708125535d8773"
544
544
  },
545
545
  {
546
546
  "path": "skills/design-review/scripts/runtime/packages/protocol/registry/artifact-theme.json",
@@ -712,7 +712,7 @@
712
712
  },
713
713
  {
714
714
  "path": "skills/design/scripts/runtime/packages/protocol/package.json",
715
- "digest": "sha256:9a11f3b5e52bb2bd3f2310a9cbc1276b62b1b08e401279769228d5bfd8567995"
715
+ "digest": "sha256:d3a009b9b304680df08d3ec30bccea5b0baf7444fee4f65e90708125535d8773"
716
716
  },
717
717
  {
718
718
  "path": "skills/design/scripts/runtime/packages/protocol/registry/artifact-theme.json",
@@ -860,7 +860,7 @@
860
860
  },
861
861
  {
862
862
  "path": "skills/openplanr/SKILL.md",
863
- "digest": "sha256:0796e0cce4d8fdf6f5b8cca86ef7c96fd02150493b609d08e74bb78045fcb2dd"
863
+ "digest": "sha256:f1e2daabc532519e6e9b83e49bddae8948d234bdf1be0e858528c2d0ecf65bc5"
864
864
  },
865
865
  {
866
866
  "path": "skills/operate/agents/openai.yaml",
@@ -972,7 +972,7 @@
972
972
  },
973
973
  {
974
974
  "path": "skills/plan/scripts/runtime/packages/protocol/package.json",
975
- "digest": "sha256:9a11f3b5e52bb2bd3f2310a9cbc1276b62b1b08e401279769228d5bfd8567995"
975
+ "digest": "sha256:d3a009b9b304680df08d3ec30bccea5b0baf7444fee4f65e90708125535d8773"
976
976
  },
977
977
  {
978
978
  "path": "skills/plan/scripts/runtime/packages/protocol/registry/artifact-theme.json",
@@ -1118,6 +1118,30 @@
1118
1118
  "path": "skills/spec/SKILL.md",
1119
1119
  "digest": "sha256:a046aed2e39c309173c47f66ca9d6182ca2a7dc0d34b1a7cc04e4fae67dfeb27"
1120
1120
  },
1121
+ {
1122
+ "path": "skills/sprint/agents/openai.yaml",
1123
+ "digest": "sha256:37d78cf09ed49e07dc2246f17d3a4aab61979d073735e7c36efa52460ca94fe1"
1124
+ },
1125
+ {
1126
+ "path": "skills/sprint/openplanr.skill.json",
1127
+ "digest": "sha256:8083ebeb2c89a73d127b99fc299e6ee4d2891b56740c4e266b52450f55a01794"
1128
+ },
1129
+ {
1130
+ "path": "skills/sprint/references/refinement-contract.md",
1131
+ "digest": "sha256:0e2e621c0aa735b756187f28310f265be6a0330c790ecf71e27c527bad13cdcd"
1132
+ },
1133
+ {
1134
+ "path": "skills/sprint/references/sprint-formats.md",
1135
+ "digest": "sha256:fc9620515dd2cfa1ecf9319c949bc491c620de9450e33f4e2ce08483023333c2"
1136
+ },
1137
+ {
1138
+ "path": "skills/sprint/schemas/refinement.schema.json",
1139
+ "digest": "sha256:591bcd9bb94bbcbae0e3494f2e7f42a7ea953c90076254c1b290fa399901b690"
1140
+ },
1141
+ {
1142
+ "path": "skills/sprint/SKILL.md",
1143
+ "digest": "sha256:8ffa44b0f3ce532cada1841ad781294c5b6c9c84c87caa9e4c8aa9f259946c9f"
1144
+ },
1121
1145
  {
1122
1146
  "path": "skills/status/agents/openai.yaml",
1123
1147
  "digest": "sha256:08055207da8033bdd60f2c7bec5b80b0da6905ba010251fbbe5590bb15e0f7d1"
@@ -1147,5 +1171,5 @@
1147
1171
  "digest": "sha256:53698324b62f43b672ce8fe1654c526c96fb202e313442f09c6fc1e72268677e"
1148
1172
  }
1149
1173
  ],
1150
- "contentDigest": "sha256:ebec93efd22f8e04e5f6dce3b933fedc54b51a69809ef85de2080c79349b0fb1"
1174
+ "contentDigest": "sha256:313e4909a57b70aded41d61e44acd9cf625e2934885e06792f3dddcad82f0986"
1151
1175
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/protocol",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "Canonical OpenPlanr schemas, registries, typed errors, and portable contract validation",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/protocol",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "Canonical OpenPlanr schemas, registries, typed errors, and portable contract validation",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/protocol",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "Canonical OpenPlanr schemas, registries, typed errors, and portable contract validation",
6
6
  "license": "MIT",
@@ -27,6 +27,7 @@ Claude Code and `$planr:plan` in Codex). Do not perform the routed work here.
27
27
  | Create or check an architecture, process, sequence, or data diagram | `planr-diagram` |
28
28
  | Share, import, or export an HTML artifact review | `planr-artifact` |
29
29
  | Know what is done, pending, blocked, or next | `planr-status` |
30
+ | Refine the open backlog and select the sprint for the next release cut | `planr-sprint` |
30
31
  | See planning or Operate state in the browser | `planr-dashboard` |
31
32
  | Check artifacts for graph, status, or schema drift | `planr-sync` |
32
33
  | Judge release readiness or prepare a landing sequence | `planr-land` |
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/protocol",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "Canonical OpenPlanr schemas, registries, typed errors, and portable contract validation",
6
6
  "license": "MIT",
@@ -0,0 +1,181 @@
1
+ ---
2
+ name: sprint
3
+ description: Refine every open backlog item against the code and the calendar, refute the picks, and select a sprint that fits capacity and the release cut. Use before a cut or sprint; not for decomposing one specification or reporting status.
4
+ license: MIT
5
+ ---
6
+
7
+ # Planr Sprint
8
+
9
+ Backlog refinement followed by sprint selection. **Refine** reads every open
10
+ item in full and judges it against the default branch and the calendar.
11
+ **Select** fits the surviving items to the stated capacity and the next release
12
+ cut, refutes the picks with three independent lenses, and writes the sprint.
13
+ Perform the reasoning in this session; never delegate it to a model subprocess.
14
+ The CLI (`planr sprint …`) stores what this skill decides. It is optional: when
15
+ it is unavailable, write the same files by hand in the shapes given in
16
+ [sprint formats](references/sprint-formats.md).
17
+
18
+ Use `planr-plan` to decompose one specification, `planr-status` to report
19
+ without judging, and `planr-operate` for an executive decision queue. This skill
20
+ never implements work and never chains into `planr-ship`.
21
+
22
+ `--refine-only` runs the refine phase (steps 1 to 4 for the blocked and
23
+ close-or-demote buckets) and writes the refinement note without creating a
24
+ sprint. Any run can be repeated and diffed against the previous one.
25
+
26
+ ## Inputs are tiers, not gates
27
+
28
+ Every input except the backlog is optional. A missing tier removes one
29
+ capability; it never blocks the run. Name every degraded input in `Issues`.
30
+
31
+ | Input | If present | If absent |
32
+ | --- | --- | --- |
33
+ | Open backlog and quick tasks (`.planr/backlog/`, `.planr/quick/`, open spec tasks) | The core: read, score, bucket | The only hard requirement; zero items means "nothing to refine" |
34
+ | Git history and the code paths items cite | Evidence lens: stale, already fixed, premise false | Buckets rest on the items' own dates; say "not verified against code" |
35
+ | Release profile (`.release/profile.md`: cut date, cadence, freezes) | Size the In-progress bucket to the cut; the sprint gets `releaseCut` | Ask once for a horizon; default to a two-week sprint from today |
36
+ | Capacity (engineers × working days) | Fit the list and name the overflow | Ask once; default 1 engineer × 10 days, stated in the return |
37
+ | Previous sprint or refinement note (`.planr/sprints/SPRINT-NNN/refinement.json`) | Carry `leftovers`; `planr sprint diff` is possible | First run, no diff |
38
+ | Last Operate cycle | Rank its unfinished actions alongside | Skipped silently |
39
+ | Linear or GitHub connector | Push statuses on approval, read PR state | Local files only; report the external step as not run |
40
+
41
+ ## Step 0: Frame the run
42
+
43
+ Before reading the backlog, ask through the host's structured question surface
44
+ (Claude Code `AskUserQuestion`, the Codex equivalent), never through free text
45
+ when a structured surface exists.
46
+
47
+ - One call, at most three questions, each with mutually exclusive options and
48
+ a recommended default; the user can always answer "Other".
49
+ - Ask only what the repository cannot answer: capacity and horizon when no
50
+ profile and no argument supplies them; a focus (one product or area, or
51
+ everything); what to do with items judged dead (close, demote, or list only);
52
+ refine only, or refine and select.
53
+ - Never ask about facts derivable from files (the cut date in the profile, the
54
+ last sprint, the open item count). Never ask mid-run.
55
+ - With `--yes` or no structured surface, take the defaults and list the ones
56
+ taken in `Issues`.
57
+
58
+ The only other question is the approval at the end (step 6).
59
+
60
+ ## Step 1: Read the calendar and capacity
61
+
62
+ Next cut and freezes from `.release/profile.md`; capacity from the framing
63
+ question or argument; `leftovers` from the previous sprint's `refinement.json`;
64
+ unfinished actions from the last Operate cycle. Record the git revision the run
65
+ judges against (`git rev-parse --short HEAD` on the default branch).
66
+
67
+ ## Step 2: Read every open item in full
68
+
69
+ Backlog items, quick tasks and open spec tasks: the whole file, not the title.
70
+ For each item record the fields in the
71
+ [refinement contract](references/refinement-contract.md): what it claims, the
72
+ latest dated evidence, the code path it names and whether that path still
73
+ exists on the default branch as described, what blocks it (partner, team
74
+ decision, another item, nothing), an effort class (`hours`, `day`, `days`,
75
+ `week+`), and a score: production impact this month × tractability now.
76
+
77
+ Read the code an item names before believing its claim. `git log -S`, `git
78
+ log -- <path>` and the merged pull requests since the item's evidence date are
79
+ the cheapest refutations.
80
+
81
+ ## Step 3: Rank into four buckets
82
+
83
+ - **In progress now**: fits capacity to the cut, in execution order, grouped
84
+ into PR batches by product or into sessions. Each batch carries a title and
85
+ an effort in days.
86
+ - **Plan next**: real, but after the cut.
87
+ - **Blocked**: the named blocker and the one question that unblocks it.
88
+ - **Close or demote**: with the evidence (`file:line`, PR number or date) and
89
+ the target status or priority in the repository's own vocabulary.
90
+
91
+ Carry the previous Operate cycle's unfinished actions explicitly. Include the
92
+ release cut itself as work; when it has no artifact yet, file it with
93
+ `planr quick create "Release cut <date>"` so the sprint contains only artifact
94
+ ids.
95
+
96
+ ## Step 4: Refute the In-progress bucket
97
+
98
+ Before the bucket is shown, run three independent lenses over every pick:
99
+
100
+ 1. **Evidence**: still real on the default branch; premise not false; not
101
+ already fixed.
102
+ 2. **Capacity and sequencing**: fits the days; migrations, partner
103
+ dependencies, PR batching and CI cost per PR are accounted for.
104
+ 3. **User impact**: who is hit this month if it is not done, and which
105
+ higher-impact item was omitted for it.
106
+
107
+ A pick that fails moves or drops, and the reason is kept in `refuted[]` with its
108
+ lens. The list must fit the stated capacity; when it does not, say what was cut.
109
+
110
+ ## Step 5: Write the sprint, the note and the JSON, then stop
111
+
112
+ Write the three durable outputs (formats in
113
+ [sprint formats](references/sprint-formats.md)); the chat return is a view of
114
+ them.
115
+
116
+ ```bash
117
+ planr sprint create --data sprint.json --json # name, releaseCut, capacityDays, startDate
118
+ planr sprint refinement SPRINT-NNN --data refinement.json --json # validates, stores the note and JSON, fills the sprint body
119
+ planr sprint diff SPRINT-MMM SPRINT-NNN # when a previous run exists
120
+ ```
121
+
122
+ `refinement.json` must satisfy [the schema](schemas/refinement.schema.json); the
123
+ CLI rejects an inconsistent document with `$`-rooted diagnostics. Fix the
124
+ document, never the validation. With `--refine-only`, skip `sprint create` and
125
+ record the refinement against the current active sprint, or write only the note
126
+ and JSON when none exists.
127
+
128
+ Then stop. Ask the approval question through the structured surface: apply the
129
+ write-back, or leave the proposal as written.
130
+
131
+ ## Step 6: On approval, apply
132
+
133
+ ```bash
134
+ planr sprint apply SPRINT-NNN --dry-run # show the status and priority changes
135
+ planr sprint apply SPRINT-NNN --yes --commit # one commit: chore(planr): refine backlog for SPRINT-NNN
136
+ ```
137
+
138
+ Where a connector is configured, push each changed item afterwards
139
+ (`planr linear push <id>`, `planr github push <id>`) and report the ones that
140
+ were not pushed. When the CLI is unavailable, apply the same status changes with
141
+ the repository's own vocabulary and commit them with the same message.
142
+
143
+ Close a finished sprint with `planr sprint close SPRINT-NNN`; it records the
144
+ leftovers the next run carries.
145
+
146
+ ## Rules from production use
147
+
148
+ - Never move an item to In progress on its own priority label; a months-old P0
149
+ or P1 is often dead. Evidence date beats label.
150
+ - Never accept an item's claim of impact without reading the code path it names.
151
+ - Items blocked on a partner or a team decision are never In progress; they get
152
+ the question that unblocks them.
153
+ - The list must fit the stated capacity; if it does not, say what was cut.
154
+ - No new migration in a hand deploy unless the sprint says so explicitly.
155
+ - Use the repository's own status vocabulary (`planr update --help` lists it);
156
+ never introduce a second one.
157
+ - The note and the JSON are the durable output; the chat return is a view of
158
+ them. That is what keeps the third run from re-arguing the first two.
159
+
160
+ ## Return
161
+
162
+ - **Outcome:** `proposed` (sprint written, nothing else changed) or `applied`
163
+ (status changes written on approval), plus capacity used vs available in
164
+ engineer-days.
165
+ - **Sprint:** the sprint id and path, and the cut it targets.
166
+ - **Buckets:** four lists, one line per row: `ID · title · effort · why`.
167
+ In-progress rows sit under their batch heading in execution order. Blocked
168
+ rows carry the blocker and the unblocking question. Close-or-demote rows carry
169
+ the evidence.
170
+ - **Refuted:** every pick a refuter changed, with the lens and the change.
171
+ - **Issues:** degraded inputs, items that could not be read or judged, defaults
172
+ taken, or `none`.
173
+
174
+ `planr status` shows the active sprint with its cut and progress; the dashboard
175
+ (`planr-dashboard`) renders the sprint from the same frontmatter and checkboxes.
176
+
177
+ ## Reference files
178
+
179
+ - [Refinement contract](references/refinement-contract.md): item record, scoring, effort classes, buckets, refuter lenses, `refinement.json` fields
180
+ - [Sprint formats](references/sprint-formats.md): sprint artifact, refinement note, chat return, hand-written fallback
181
+ - [Refinement schema](schemas/refinement.schema.json): the JSON Schema the CLI validates against
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "Planr Sprint"
3
+ short_description: "Refine every open backlog item against the code and the…"
4
+ default_prompt: "Use $planr:sprint to refine every open backlog item against the code and the calendar, refute the picks, and select a sprint that fits capacity and the release cut. Use before a cut or sprint; not for decomposing one specification or reporting status."
5
+ policy:
6
+ allow_implicit_invocation: true
@@ -0,0 +1,59 @@
1
+ {
2
+ "kind": "openplanr-skill-package",
3
+ "schemaVersion": "1.0.0",
4
+ "protocolVersion": "1.8.0",
5
+ "skillId": "planr-sprint",
6
+ "skillVersion": "1.0.0",
7
+ "entrypoint": "SKILL.md",
8
+ "hosts": [
9
+ "claude-code",
10
+ "codex",
11
+ "chatgpt",
12
+ "cursor"
13
+ ],
14
+ "execution": "host-agent",
15
+ "resources": [
16
+ {
17
+ "path": "agents/openai.yaml",
18
+ "kind": "agent-metadata",
19
+ "hosts": [
20
+ "codex",
21
+ "chatgpt"
22
+ ],
23
+ "executable": false
24
+ },
25
+ {
26
+ "path": "references/refinement-contract.md",
27
+ "kind": "reference",
28
+ "hosts": [
29
+ "claude-code",
30
+ "codex",
31
+ "chatgpt",
32
+ "cursor"
33
+ ],
34
+ "executable": false
35
+ },
36
+ {
37
+ "path": "references/sprint-formats.md",
38
+ "kind": "reference",
39
+ "hosts": [
40
+ "claude-code",
41
+ "codex",
42
+ "chatgpt",
43
+ "cursor"
44
+ ],
45
+ "executable": false
46
+ },
47
+ {
48
+ "path": "schemas/refinement.schema.json",
49
+ "kind": "schema",
50
+ "hosts": [
51
+ "claude-code",
52
+ "codex",
53
+ "chatgpt",
54
+ "cursor"
55
+ ],
56
+ "executable": false
57
+ }
58
+ ]
59
+ }