Merge pull request #3695 from Tibsfox/fix/block-phantom-milestone-creation

fix(gsd): default insertMilestone status to queued instead of active
This commit is contained in:
Jeremy McSpadden 2026-04-07 07:03:09 -05:00 committed by GitHub
commit 559abeb95c
2 changed files with 42 additions and 1 deletions

View file

@ -1119,7 +1119,9 @@ export function insertMilestone(m: {
).run({
":id": m.id,
":title": m.title ?? "",
":status": m.status ?? "active",
// Default to "queued" — never auto-create milestones as "active" (#3380).
// Callers that need "active" must pass it explicitly.
":status": m.status ?? "queued",
":depends_on": JSON.stringify(m.depends_on ?? []),
":created_at": new Date().toISOString(),
":vision": m.planning?.vision ?? "",

View file

@ -0,0 +1,39 @@
/**
* Regression test for #3695 insertMilestone defaults status to "queued"
*
* Milestones were being auto-created with status "active", causing phantom
* milestones to appear as active work. The fix defaults to "queued" so
* new milestones must be explicitly activated.
*/
import { describe, test } from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const dbSrc = readFileSync(
join(__dirname, '..', 'gsd-db.ts'),
'utf-8',
);
describe('insertMilestone defaults status to queued (#3695)', () => {
test('insertMilestone function exists', () => {
assert.match(dbSrc, /export function insertMilestone\(/,
'insertMilestone should be exported from gsd-db.ts');
});
test('default status is "queued" not "active"', () => {
// The status parameter should default to "queued" via nullish coalescing
assert.match(dbSrc, /m\.status\s*\?\?\s*"queued"/,
'insertMilestone should default status to "queued"');
});
test('comment explains the rationale', () => {
assert.match(dbSrc, /never auto-create milestones as "active"/i,
'should have a comment explaining why default is queued');
});
});