Skip to content

Idea: Convention for use of milestones when building work plans #55

Description

@mmcky

Adopt wp{issue#}-stage{n} milestone naming for work-plan stages

Proposal: when a work plan divides its work into stages, give each stage a GitHub milestone named after the work-plan issue that owns it — wp{issue#}-stage{n}, e.g. wp8-stage1 for stage 1 of the plan tracked in issue #8. Adopted ad hoc in QuantEcon/textstrata on 2026-08-25; filing it here to decide whether it becomes the documented convention for all work plans.

Why name the milestone after the plan

Milestones are a flat, repo-global namespace with no parent field, so a bare Stage 1 is ambiguous the second a repo has two work plans, and there is nothing in the milestone itself that says which plan it belongs to. Embedding the issue number makes the milestone self-describing and gives the convention four practical properties:

  • Ownership is readable from the name. Anyone landing on the milestone list can tell wp8-stage1 belongs to the plan in TRACKING: work plan 2026-07-22 — rubric v2 quick-wins, merge + email, skill wiring toward the #654 re-test #8, without opening anything.
  • No label sprawl. QEP-2 keeps the label set deliberately minimal, and stage-1/stage-2/stage-3 labels would sit outside it. Milestones carry percent-complete and an issue list natively, which is exactly what a phased plan wants, so the structure lands without touching the label vocabulary.
  • Retirement is unambiguous. When the plan closes, its wp8-* milestones close with it. A generic Stage 2 would linger and invite a later, unrelated plan to reuse it with different meaning.
  • It is the only native grouping axis left when sub-issues are taken. GitHub allows one parent per issue. In the textstrata case the roadmap issues were already native sub-issues of a cross-repo programme tracker (QuantEcon/project-translation#49), so claiming them as sub-issues of the local plan was not possible without breaking that hierarchy. Milestones grouped them inside the repo while the cross-repo parentage stayed intact — a situation any repo whose work belongs to a programme tracker will hit.

First instance

QuantEcon/textstrata#8 is a phased work plan produced from a repository audit. Its stage milestones were created and assigned on 2026-08-25:

Milestone Issues
wp8-stage1 #1, #2, #5, #6
wp8-stage2 #3
wp8-stage3 #7

The tracker issue itself was left unmilestoned, since it spans all three stages — worth confirming as part of the convention rather than leaving to taste.

Where it would be documented

File Section Change
qe/skills/workplan-project/SKILL.md step 4 (draft the work package) The drafting rules cover labels per QEP-2 but say nothing about milestones. Add the naming rule, and that the plan table's phases are what the milestones mirror.
qe/skills/workplan-project/SKILL.md step 5 (file it) The creation order does not create or assign milestones. Add both steps, after the sub-issues exist.
qe/skills/workplan/SKILL.md "The convention" Records observed practice pending a QEP. If this is adopted, it belongs in that list alongside the untyped-plan-issues rule.
the planned work-plan QEP qe/skills/workplan/SKILL.md notes that formalising the convention as a QEP is planned; if that is where naming rules should live, this issue is an input to it rather than a skill edit.

Tooling note

Milestones must exist before anything can be assigned to one, and creating them is not covered by every agent surface: in the textstrata run the available tooling could assign a milestone by number but could neither create nor list milestones, so a human created the three by hand and the numbers had to be looked up before assignment. gh can do it directly — gh api repos/{owner}/{repo}/milestones -f title=wp8-stage1 — so if this convention is adopted, workplan-project step 5 should create the milestones itself rather than leaving a manual gap in an otherwise scripted flow.

Open questions

  • stage or phase? Tracking: sequenced work plan for the Stage 1–3 roadmap textstrata#8's own plan table is organised by "Phase 0–5" while its milestones track the programme's Stage 1–3 — the two divisions are real and distinct there, but a convention should say which one the milestone mirrors, or allow either token.
  • Cross-repo plans. Milestones are per-repo. When a plan in repo A drives work in repo B, wp8-stage1 in repo B names an issue number that does not exist there. Options: accept the ambiguity, or qualify the token.
  • Does the tracker carry a milestone? Left unmilestoned in the first instance; needs a stated rule.
  • Separator and padding. wp8-stage1 as used, versus wp-8-stage-1 or zero-padded forms. Worth fixing so milestone lists sort predictably once a repo has several plans.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    discussOpen-ended team deliberation or a decision to be made

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions