diff --git a/test/fixtures/inventory-grandfathered.json b/test/fixtures/inventory-grandfathered.json new file mode 100644 index 000000000..906d7bd8f --- /dev/null +++ b/test/fixtures/inventory-grandfathered.json @@ -0,0 +1,76 @@ +{ + "note": "The parts present when the R56 ledger was seeded (GST-914, PR #3837). Only these rows may say grandfathered: true; a part added later carries reason, plan, owner and measure_by (ETHOS.md: 9. Earn Its Place). Never add a key here.", + "keys": [ + "autoplan", + "autoplan-phases", + "benchmark", + "benchmark-models", + "browse", + "canary", + "captain", + "capy-factory", + "capy-skill", + "careful", + "catalog", + "claude-code", + "codex", + "context-restore", + "context-save", + "cso", + "design-consultation", + "design-html", + "design-motion", + "design-review", + "design-shotgun", + "deslop-shared-libs", + "devex-review", + "diagram", + "document-generate", + "document-release", + "eval-plan", + "freeze", + "gstack", + "gstack-upgrade", + "guard", + "health", + "investigate", + "ios-clean", + "ios-design-review", + "ios-fix", + "ios-qa", + "ios-sync", + "land-and-deploy", + "landing-report", + "learn", + "make-pdf", + "modernize", + "office-hours", + "open-gstack-browser", + "pair-agent", + "plan-ceo-review", + "plan-design-review", + "plan-devex-review", + "plan-eng-review", + "plan-tune", + "preamble", + "qa", + "qa-only", + "retro", + "review", + "scrape", + "setup-browser-cookies", + "setup-deploy", + "setup-gbrain", + "ship", + "ship-docs-audit", + "ship-review-panel", + "skillify", + "spec", + "sync-gbrain", + "test-audit", + "ubicloud", + "unfreeze", + "verify", + "write-skill" + ] +} diff --git a/test/inventory.test.ts b/test/inventory.test.ts index 6ef746820..b254831b8 100644 --- a/test/inventory.test.ts +++ b/test/inventory.test.ts @@ -51,8 +51,10 @@ describe('the ledger covers every key and validates', () => { expect(validateLedger(ledger, keys)).toEqual([]); }); - test('the initial backlog is grandfathered and the guards are safety rows', () => { - for (const [key, row] of Object.entries(ledger.parts)) expect([key, row.grandfathered]).toEqual([key, true]); + test('the initial backlog is grandfathered, nothing else is, and the guards are safety rows', () => { + const backlog: string[] = JSON.parse(fs.readFileSync(path.join(ROOT, 'test', 'fixtures', 'inventory-grandfathered.json'), 'utf8')).keys; + for (const key of backlog) expect([key, ledger.parts[key]?.grandfathered]).toEqual([key, true]); + for (const [key, row] of Object.entries(ledger.parts)) if (row.grandfathered) expect(backlog).toContain(key); for (const key of ['careful', 'freeze', 'guard', 'unfreeze', 'cso']) expect(ledger.parts[key].status).toBe('safety'); for (const key of ['capy-skill', 'capy-factory']) expect(ledger.parts[key]).toMatchObject({ status: 'untested', plan: 'none' }); });