Files
msd-core/tests
Tom Boucher bfd749cb9a fix(#3213): segment-boundary membership for letter-named phase dirs (#3368)
* test(#3213): add letter-named phase regression for getMilestonePhaseFilter

The custom-ID branch's greedy capture excluded every letter-named phase
directory (Phase A:..Phase L:) from the milestone, fabricating counts.
Add two failing-first regression tests: a single letter phase + numeric
control, and the full A..L + 00 tree from the issue's reproduction.

RED — fails on next; fix follows in a separate fix: commit.

* fix(#3213): segment-boundary membership for letter-named phase dirs

The custom-ID branch of isDirInMilestone (getMilestonePhaseFilter) used a
greedy capture ^([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z0-9]+)*) that swallowed the
whole hyphenated directory name (A-tool-output-contract was captured as
'A-tool-output-contract', not 'A'). The set lookup then failed and every
letter-named phase directory (Phase A:..Phase L: — GSD's own convention,
ADR-612 first-class non-numeric IDs) fell out of the milestone, silently
fabricating progress/plan counts over whatever numeric dir survived.

Replace the capture-then-lookup with a segment-boundary membership test: a
directory belongs if its lowercased name EQUALS a declared phase ID or BEGINS
with that ID followed by '-' (so 'A-tool-output-contract' matches ID 'a';
'PROJ-42-description' matches ID 'proj-42'; 'AB-combined' does NOT match
'a'). IDs are sorted longest-first so a hyphenated id (proj-42) is tested
before a prefix of it (proj). Additive only — numericRe still handles every
leading-digit dir first, and this can only ADMIT a dir the greedy capture
wrongly excluded, never exclude one already matched.

* chore(#3213): add changeset fragment

* chore(#3213): backfill changeset PR number (#3368)

---------

Co-authored-by: sim <sim@local>
2026-08-11 19:18:08 -04:00
..