Merge origin/main into garrytan/tilde-fix-design

main shipped #1030 (context rot defense for /ship — subagent isolation +
clean step numbering) under v0.18.2.0 while this wave's v0.18.2.0 was open.
Per CLAUDE.md branch-scoped CHANGELOG rules, bumped this branch to v0.18.3.0
with its own entry on top, kept main's v0.18.2.0 entry intact.

Auto-merged from main (no behavioral conflicts):
- /ship resolver renumbering (review-army.ts, review.ts, testing.ts, utility.ts)
- ship/SKILL.md.tmpl + regenerated ship/SKILL.md
- design-review/SKILL.md, qa/SKILL.md (touched by ship resolver pass)
- test/skill-validation.test.ts (regression guards)
- test/gen-skill-docs.test.ts (golden baseline updates)
- Golden test fixtures (test/fixtures/golden/*-ship-SKILL.md)
- .gitignore, CLAUDE.md, TODOS.md (auto-merged cleanly)

Conflict resolved:
- CHANGELOG.md: kept both v0.18.2.0 entries by promoting this wave to v0.18.3.0
  on top, leaving main's v0.18.2.0 (/ship subagent isolation) directly below.
  Verified contiguous version sequence: 0.18.3.0 → 0.18.2.0 → 0.18.1.0 →
  0.18.0.1 → 0.18.0.0.

Synced VERSION + package.json to 0.18.3.0.

Verification: bun test passes (EXIT=0). Build clean.
This commit is contained in:
Garry Tan
2026-04-17 14:27:08 +08:00
19 changed files with 901 additions and 553 deletions
+6 -6
View File
@@ -752,13 +752,13 @@ describe('TEST_COVERAGE_AUDIT placeholders', () => {
test('ship SKILL.md contains review army specialist dispatch', () => {
expect(shipSkill).toContain('Specialist Dispatch');
expect(shipSkill).toContain('Step 3.55');
expect(shipSkill).toContain('Step 3.56');
expect(shipSkill).toContain('Step 9.1');
expect(shipSkill).toContain('Step 9.2');
});
test('ship SKILL.md contains cross-review finding dedup', () => {
expect(shipSkill).toContain('Cross-review finding dedup');
expect(shipSkill).toContain('Step 3.57');
expect(shipSkill).toContain('Step 9.3');
});
test('ship SKILL.md contains re-run idempotency behavior', () => {
@@ -839,7 +839,7 @@ describe('PLAN_COMPLETION_AUDIT placeholders', () => {
test('ship SKILL.md contains plan completion audit step', () => {
expect(shipSkill).toContain('Plan Completion Audit');
expect(shipSkill).toContain('Step 3.45');
expect(shipSkill).toContain('Step 8');
});
test('review SKILL.md contains plan completion in scope drift', () => {
@@ -888,7 +888,7 @@ describe('PLAN_VERIFICATION_EXEC placeholder', () => {
const shipSkill = fs.readFileSync(path.join(ROOT, 'ship', 'SKILL.md'), 'utf-8');
test('ship SKILL.md contains plan verification step', () => {
expect(shipSkill).toContain('Step 3.47');
expect(shipSkill).toContain('Step 8.1');
expect(shipSkill).toContain('Plan Verification');
});
@@ -946,7 +946,7 @@ describe('Ship metrics logging', () => {
const shipSkill = fs.readFileSync(path.join(ROOT, 'ship', 'SKILL.md'), 'utf-8');
test('ship SKILL.md contains metrics persistence step', () => {
expect(shipSkill).toContain('Step 8.75');
expect(shipSkill).toContain('Step 20');
expect(shipSkill).toContain('coverage_pct');
expect(shipSkill).toContain('plan_items_total');
expect(shipSkill).toContain('plan_items_done');