inventory: only the seeded backlog may be grandfathered, so a new part's row is checked (review fix)

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
This commit is contained in:
garrytanandcapy-ai[bot] committed 2026-11-02 05:33:38 +00:00
1 parent 5f0be66afa
commit d0b3028b5a
2 files changed
+80 -2

No files matched your search

+76
View File
@@ -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"
]
}
+4 -2
View File
@@ -51,8 +51,10 @@ describe('the ledger covers every key and validates', () => {
expect(validateLedger(ledger, keys)).toEqual([]); expect(validateLedger(ledger, keys)).toEqual([]);
}); });
test('the initial backlog is grandfathered and the guards are safety rows', () => { test('the initial backlog is grandfathered, nothing else is, and the guards are safety rows', () => {
for (const [key, row] of Object.entries<any>(ledger.parts)) expect([key, row.grandfathered]).toEqual([key, true]); 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<any>(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 ['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' }); for (const key of ['capy-skill', 'capy-factory']) expect(ledger.parts[key]).toMatchObject({ status: 'untested', plan: 'none' });
}); });