Skip to content

Support ticket-based phase identifiers for team/async workflows #1019

@denagyantal

Description

@denagyantal

Problem

When multiple teammates use GSD on the same repo, sequential phase numbering causes collisions. Phase numbers are auto-incremented from ROADMAP.md (maxPhase + 1), so if two people create phases concurrently, they get the same number.

In our case, 5 engineers share a GSD-managed monorepo. We constantly collide on the next phase number.

Proposed Solution

Allow non-numeric phase identifiers — specifically, arbitrary string IDs such as ticket/issue IDs (e.g., PROJ-42, AUTH-101, FEAT-7) as phase identifiers.

Why arbitrary string IDs work:

  • Already unique — no coordination needed
  • Maps to existing workflow (Jira, Linear, GitHub Issues, or any custom scheme)
  • Phase ordering already comes from depends_on in plan frontmatter, not from numbering

Example:

.planning/phases/
  PROJ-42-user-authentication/
  AUTH-101-session-management/
  FEAT-7-dashboard-redesign/

ROADMAP.md:

### Phase PROJ-42: User Authentication
**Depends on:** FEAT-7

What would need to change

The sequential integer assumption is hardcoded in several places:

  • core.cjs: normalizePhaseName() only matches ^\d+, comparePhaseNum() only compares integers, searchPhaseInDir() regex assumes numeric prefix
  • phase.cjs: cmdPhaseAdd() does maxPhase + 1, cmdPhaseInsert() assumes numeric base
  • roadmap.cjs: Phase header regex only matches Phase \d+:
  • verify.cjs: Health check warns on "gap in phase numbering" and expects NN-name format
  • commands.cjs: dir.split('-')[0] assumes single-segment numeric prefix

Possible config option

A phase_naming setting in config.json:

{
  "phase_naming": "sequential"  // default, current behavior
  // or
  "phase_naming": "custom"      // accept any arbitrary string ID via --id flag
}

With "custom" mode:

  • gsd-tools phase add --id PROJ-42 "User Authentication"
  • Skip auto-increment logic
  • Relax health check warnings about sequential numbering gaps

Environment

  • 5-person team sharing one GSD repo
  • Each person works on separate feature branches but phases land on main

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-triageNew issue awaiting maintainer review

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions