Skip to content

Commit f4ea31f

Browse files
authored
Correct + reinforce version/issue/milestone/project tracking across harnesses (#153)
type:* label taxonomy (per gh-labels-milestones), schema-valid config (status_field_id; dropped ad-hoc keys), Status casing (In progress), and the rule reinforced in the orchestrator agents across .claude/.cursor/.opencode. Closes #152.
1 parent 65c92ed commit f4ea31f

12 files changed

Lines changed: 108 additions & 38 deletions

File tree

.claude/agents/orchestrator.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,19 @@ If failure → return to Phase 5.
262262
On success: Create PR via gh pr create, post completion summary.
263263

264264
## GitHub Issue Management
265-
Every feature has a corresponding GitHub issue. Update issues at each phase transition:
265+
266+
### Version & Issue Tracking (mandatory — every change)
267+
Classify the SemVer bump first: **major** (breaking) / **minor** (new backward-compatible
268+
feature) / **patch** (bug fix / no API change). Then:
269+
- **Milestone — major & minor only.** Ensure `vX.Y.0` exists (`gh-labels-milestones`);
270+
patches attach to their minor's `vX.Y.0`, never get their own.
271+
- **Issue — every change.** Labelled the matching **`type:*`** label (`type:bug` fix · `type:feature` feature · `type:docs`/`type:refactor`/`type:chore`, per `gh-labels-milestones`), assigned to the target major/minor milestone (`gh-issues`).
272+
- **Project board.** Add the issue and set **Status** (`In progress``Done`); read the
273+
board number from `github.project_number` in `project.config.yaml` (`gh-projects`),
274+
never hard-code it.
275+
- PR `Closes #N`. **No Claude/Anthropic attribution** anywhere.
276+
277+
Every change has a corresponding GitHub issue. Update issues at each phase transition:
266278

267279
```bash
268280
# Create issue (done by @product-owner, but you track)

.claude/schemas/project.config.schema.json

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
"title": "MAPLE Project Configuration",
55
"description": "Project-level configuration for the MAPLE platform (project.config.yaml).",
66
"type": "object",
7-
"required": ["project"],
7+
"required": [
8+
"project"
9+
],
810
"additionalProperties": false,
911
"properties": {
1012
"project": {
1113
"type": "object",
1214
"description": "Project identity and metadata.",
13-
"required": ["name"],
15+
"required": [
16+
"name"
17+
],
1418
"additionalProperties": false,
1519
"properties": {
1620
"name": {
@@ -38,7 +42,10 @@
3842
"mode": {
3943
"type": "string",
4044
"description": "standard: full Spec-Kit + 8-phase pipeline. spike: skips Spec-Kit; used for time-boxed research tasks.",
41-
"enum": ["standard", "spike"],
45+
"enum": [
46+
"standard",
47+
"spike"
48+
],
4249
"default": "standard"
4350
},
4451
"require_adr_for": {
@@ -75,7 +82,11 @@
7582
"bdd": {
7683
"type": "string",
7784
"description": "BDD framework used for Gherkin scenario automation. cucumber = @cucumber/cucumber (JS/TS) or Cucumber-JVM (Java/.NET). behave = Python. none = disabled.",
78-
"enum": ["cucumber", "behave", "none"],
85+
"enum": [
86+
"cucumber",
87+
"behave",
88+
"none"
89+
],
7990
"default": "cucumber"
8091
},
8192
"step_defs_dir": {
@@ -98,7 +109,12 @@
98109
"ui_library": {
99110
"type": "string",
100111
"description": "Component library used for mockup generation and component scaffolding.",
101-
"enum": ["mantine", "tailwind", "shadcn", "none"],
112+
"enum": [
113+
"mantine",
114+
"tailwind",
115+
"shadcn",
116+
"none"
117+
],
102118
"default": "none"
103119
},
104120
"tokens_file": {
@@ -109,13 +125,20 @@
109125
"wireframe_format": {
110126
"type": "string",
111127
"description": "Default format for wireframes generated by the wireframe-architect agent.",
112-
"enum": ["ascii", "svg", "html"],
128+
"enum": [
129+
"ascii",
130+
"svg",
131+
"html"
132+
],
113133
"default": "ascii"
114134
},
115135
"target": {
116136
"type": "string",
117137
"description": "UI medium the design phase targets. web = HTML/React/CSS artifacts and browser a11y. tui = terminal ASCII wireframes, lipgloss mockups, and terminal a11y. Selects which artifacts the design agents emit; artifact paths are identical across targets.",
118-
"enum": ["web", "tui"],
138+
"enum": [
139+
"web",
140+
"tui"
141+
],
119142
"default": "web"
120143
}
121144
}
@@ -126,14 +149,28 @@
126149
"additionalProperties": false,
127150
"properties": {
128151
"project_number": {
129-
"type": ["integer", "null"],
152+
"type": [
153+
"integer",
154+
"null"
155+
],
130156
"description": "GitHub Project v2 number (numeric ID, not node ID). Set by `maple project bootstrap`.",
131157
"default": null
132158
},
133159
"project_node_id": {
134-
"type": ["string", "null"],
160+
"type": [
161+
"string",
162+
"null"
163+
],
135164
"description": "GitHub Project v2 GraphQL node ID. Set by `maple project bootstrap`.",
136165
"default": null
166+
},
167+
"status_field_id": {
168+
"type": [
169+
"string",
170+
"null"
171+
],
172+
"description": "GitHub Project v2 Status single-select field node ID (used to set a card's Status). Set by `maple project bootstrap`.",
173+
"default": null
137174
}
138175
}
139176
},

.claude/skills/gh-projects/SKILL.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Manage GitHub Projects v2 board operations: add issues as cards, update field va
1818
| `issue_node_id` | `gh-issues` skill output | `"I_kwDO..."` |
1919
| `issue_number` | `gh-issues` skill output | `42` |
2020
| `field_name` | project field name | `"Status"` |
21-
| `field_value` | target option name | `"In Progress"` |
21+
| `field_value` | target option name | `"In progress"` |
2222

2323
## Read project config
2424

@@ -153,8 +153,8 @@ gh api graphql -f query='
153153
| Phase | Field | Value |
154154
|---|---|---|
155155
| Discover | Status | `Todo` |
156-
| Architect | Status | `In Progress` |
157-
| Implement | Status | `In Progress` |
156+
| Architect | Status | `In progress` |
157+
| Implement | Status | `In progress` |
158158
| Validate | Status | `In Review` |
159159
| Done | Status | `Done` |
160160

@@ -182,6 +182,6 @@ gh project item-list "$PROJECT_NUMBER" \
182182

183183
```
184184
[gh-projects] ADD #42 → project #{project_number} item_id={id}
185-
[gh-projects] UPDATE #42 field=Status value="In Progress"
185+
[gh-projects] UPDATE #42 field=Status value="In progress"
186186
[gh-projects] SKIP #42 already on board
187187
```

.cursor/agents/orchestrator.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,19 @@ If failure → return to Phase 5.
262262
On success: Create PR via gh pr create, post completion summary.
263263

264264
## GitHub Issue Management
265-
Every feature has a corresponding GitHub issue. Update issues at each phase transition:
265+
266+
### Version & Issue Tracking (mandatory — every change)
267+
Classify the SemVer bump first: **major** (breaking) / **minor** (new backward-compatible
268+
feature) / **patch** (bug fix / no API change). Then:
269+
- **Milestone — major & minor only.** Ensure `vX.Y.0` exists (`gh-labels-milestones`);
270+
patches attach to their minor's `vX.Y.0`, never get their own.
271+
- **Issue — every change.** Labelled the matching **`type:*`** label (`type:bug` fix · `type:feature` feature · `type:docs`/`type:refactor`/`type:chore`, per `gh-labels-milestones`), assigned to the target major/minor milestone (`gh-issues`).
272+
- **Project board.** Add the issue and set **Status** (`In progress``Done`); read the
273+
board number from `github.project_number` in `project.config.yaml` (`gh-projects`),
274+
never hard-code it.
275+
- PR `Closes #N`. **No Claude/Anthropic attribution** anywhere.
276+
277+
Every change has a corresponding GitHub issue. Update issues at each phase transition:
266278

267279
```bash
268280
# Create issue (done by @product-owner, but you track)

.cursor/rules/version-and-issues.mdc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
description: Version & issue tracking — every change gets a SemVer class, an issue with bug|enhancement label, a major/minor milestone, and a card on the configured project board (project.config.yaml)
2+
description: Version & issue tracking — every change gets a SemVer class, an issue with the matching type:* label, a major/minor milestone, and a card on the configured project board (project.config.yaml)
33
alwaysApply: true
44
---
55

@@ -14,7 +14,7 @@ finish it):
1414
target minor/major; create it if missing. **Patches never get their own
1515
milestone** — attach them to their minor's milestone (`vX.Y.0`).
1616
3. **Issue — every change, patches included.** Create a GitHub issue, labelled
17-
**`bug`** (patch / fix) or **`enhancement`** (feature / minor / major), assigned
17+
the matching **`type:*`** label (`type:bug` fix · `type:feature` feature · `type:docs`/`type:refactor`/`type:chore`, per `gh-labels-milestones`), assigned
1818
to the target major/minor milestone.
1919
4. **Project board.** Add the issue to the project board — read its number from
2020
`github.project_number` in `project.config.yaml` (never hard-code it) — and set

.cursor/skills/gh-projects/SKILL.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Manage GitHub Projects v2 board operations: add issues as cards, update field va
1818
| `issue_node_id` | `gh-issues` skill output | `"I_kwDO..."` |
1919
| `issue_number` | `gh-issues` skill output | `42` |
2020
| `field_name` | project field name | `"Status"` |
21-
| `field_value` | target option name | `"In Progress"` |
21+
| `field_value` | target option name | `"In progress"` |
2222

2323
## Read project config
2424

@@ -153,8 +153,8 @@ gh api graphql -f query='
153153
| Phase | Field | Value |
154154
|---|---|---|
155155
| Discover | Status | `Todo` |
156-
| Architect | Status | `In Progress` |
157-
| Implement | Status | `In Progress` |
156+
| Architect | Status | `In progress` |
157+
| Implement | Status | `In progress` |
158158
| Validate | Status | `In Review` |
159159
| Done | Status | `Done` |
160160

@@ -182,6 +182,6 @@ gh project item-list "$PROJECT_NUMBER" \
182182

183183
```
184184
[gh-projects] ADD #42 → project #{project_number} item_id={id}
185-
[gh-projects] UPDATE #42 field=Status value="In Progress"
185+
[gh-projects] UPDATE #42 field=Status value="In progress"
186186
[gh-projects] SKIP #42 already on board
187187
```

.github/copilot-instructions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ Every change is tracked automatically. When you start a piece of work (and befor
210210

211211
1. **Classify the SemVer bump** — major (breaking) / minor (new backward-compatible feature) / patch (bug fix, no API change).
212212
2. **Milestone — major & minor only.** Ensure `vX.Y.0` exists (create if missing). **Patches never get their own milestone** — attach to their minor's `vX.Y.0`.
213-
3. **Issue — every change, patches included.** Labelled **`bug`** (patch/fix) or **`enhancement`** (feature), assigned to the target major/minor milestone.
213+
3. **Issue — every change, patches included.** Labelled the matching **`type:*`** label (`type:bug` fix · `type:feature` feature · `type:docs`/`type:refactor`/`type:chore`, per `gh-labels-milestones`), assigned to the target major/minor milestone.
214214
4. **Project board** — add the issue and set **Status** (`In progress``Done`). Read the board number from `github.project_number` in `project.config.yaml` (never hard-code it).
215215
5. **Link & close** — the PR says `Closes #N`; on release the milestone version equals the release tag.
216216
6. **No Claude/Anthropic attribution** anywhere — commits, PR bodies, issues, releases.

.opencode/agents/orchestrator.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,19 @@ If failure → return to Phase 5.
266266
On success: Create PR via gh pr create, post completion summary.
267267

268268
## GitHub Issue Management
269-
Every feature has a corresponding GitHub issue. Update issues at each phase transition:
269+
270+
### Version & Issue Tracking (mandatory — every change)
271+
Classify the SemVer bump first: **major** (breaking) / **minor** (new backward-compatible
272+
feature) / **patch** (bug fix / no API change). Then:
273+
- **Milestone — major & minor only.** Ensure `vX.Y.0` exists (`gh-labels-milestones`);
274+
patches attach to their minor's `vX.Y.0`, never get their own.
275+
- **Issue — every change.** Labelled the matching **`type:*`** label (`type:bug` fix · `type:feature` feature · `type:docs`/`type:refactor`/`type:chore`, per `gh-labels-milestones`), assigned to the target major/minor milestone (`gh-issues`).
276+
- **Project board.** Add the issue and set **Status** (`In progress``Done`); read the
277+
board number from `github.project_number` in `project.config.yaml` (`gh-projects`),
278+
never hard-code it.
279+
- PR `Closes #N`. **No Claude/Anthropic attribution** anywhere.
280+
281+
Every change has a corresponding GitHub issue. Update issues at each phase transition:
270282

271283
```bash
272284
# Create issue (done by @product-owner, but you track)

.opencode/skills/gh-projects/SKILL.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Manage GitHub Projects v2 board operations: add issues as cards, update field va
1818
| `issue_node_id` | `gh-issues` skill output | `"I_kwDO..."` |
1919
| `issue_number` | `gh-issues` skill output | `42` |
2020
| `field_name` | project field name | `"Status"` |
21-
| `field_value` | target option name | `"In Progress"` |
21+
| `field_value` | target option name | `"In progress"` |
2222

2323
## Read project config
2424

@@ -153,8 +153,8 @@ gh api graphql -f query='
153153
| Phase | Field | Value |
154154
|---|---|---|
155155
| Discover | Status | `Todo` |
156-
| Architect | Status | `In Progress` |
157-
| Implement | Status | `In Progress` |
156+
| Architect | Status | `In progress` |
157+
| Implement | Status | `In progress` |
158158
| Validate | Status | `In Review` |
159159
| Done | Status | `Done` |
160160

@@ -182,6 +182,6 @@ gh project item-list "$PROJECT_NUMBER" \
182182

183183
```
184184
[gh-projects] ADD #42 → project #{project_number} item_id={id}
185-
[gh-projects] UPDATE #42 field=Status value="In Progress"
185+
[gh-projects] UPDATE #42 field=Status value="In progress"
186186
[gh-projects] SKIP #42 already on board
187187
```

AGENTS.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ finish it):
8282
feature) / patch (bug fix, no API change).
8383
2. **Milestone — major & minor only.** Ensure `vX.Y.0` exists (create if missing).
8484
**Patches never get their own milestone** — attach to their minor's `vX.Y.0`.
85-
3. **Issue — every change, patches included.** Labelled **`bug`** (patch/fix) or
86-
**`enhancement`** (feature), assigned to the target major/minor milestone.
85+
3. **Issue — every change, patches included.** Labelled the matching **`type:*`** label (`type:bug` fix · `type:feature` feature · `type:docs`/`type:refactor`/`type:chore`, per `gh-labels-milestones`), assigned to the target major/minor milestone.
8786
4. **Project board** — add the issue and set **Status** (`In progress``Done`).
8887
Read the board number from `github.project_number` in `project.config.yaml`
8988
(never hard-code it).

0 commit comments

Comments
 (0)