fix(gsd): set slice sequence at all three insertion sites

All slices got sequence=0 because the three code paths that insert
slices never set the sequence column. This made positional ordering
degenerate to alphabetical-by-ID, causing deadlocks when dependency-
free slices were ordered after blocked ones.

Now passes sequence at:
- plan-milestone: array index from agent-ordered params.slices
- reassess-roadmap: existingCount + index for newly added slices
- md-importer: parse order from roadmap content

Closes #3356

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Tibsfox 2026-04-06 19:51:16 -07:00
parent b4c6229360
commit 2d3723691a
3 changed files with 11 additions and 4 deletions

View file

@ -586,7 +586,8 @@ export function migrateHierarchyToDb(basePath: string): {
// Parse roadmap for slices
if (!roadmap) continue;
for (const sliceEntry of roadmap.slices) {
for (let si = 0; si < roadmap.slices.length; si++) {
const sliceEntry = roadmap.slices[si]!;
// Per K002: use 'complete' not 'done'
const sliceStatus = sliceEntry.done ? 'complete' : 'pending';
@ -606,6 +607,7 @@ export function migrateHierarchyToDb(basePath: string): {
risk: sliceEntry.risk,
depends: sliceEntry.depends,
demo: sliceEntry.demo,
sequence: si + 1, // Preserve roadmap parse order (#3356)
planning: {
goal: plan?.goal ?? '',
},

View file

@ -256,7 +256,8 @@ export async function handlePlanMilestone(
boundaryMapMarkdown: params.boundaryMapMarkdown,
});
for (const slice of params.slices) {
for (let i = 0; i < params.slices.length; i++) {
const slice = params.slices[i]!;
// Preserve completed/done status on re-plan (#2558).
// Without this, a re-plan after milestone transition would reset
// already-completed slices back to "pending".
@ -272,6 +273,7 @@ export async function handlePlanMilestone(
risk: slice.risk,
depends: slice.depends,
demo: slice.demo,
sequence: i + 1, // Preserve agent-ordered sequence (#3356)
});
upsertSlicePlanning(params.milestoneId, slice.sliceId, {
goal: slice.goal,

View file

@ -186,8 +186,10 @@ export async function handleReassessRoadmap(
});
}
// Insert new slices
for (const added of params.sliceChanges.added) {
// Insert new slices — assign sequence after existing slices (#3356)
const existingCount = getMilestoneSlices(params.milestoneId).length;
for (let i = 0; i < params.sliceChanges.added.length; i++) {
const added = params.sliceChanges.added[i]!;
insertSlice({
id: added.sliceId,
milestoneId: params.milestoneId,
@ -196,6 +198,7 @@ export async function handleReassessRoadmap(
risk: added.risk,
depends: added.depends,
demo: added.demo ?? "",
sequence: existingCount + i + 1,
});
}