| name | update-graft-inventory |
| description | Update the graft (feature flag) inventory when flags are added or removed. Use when adding new grafts via migrations, after CI flags inventory mismatches, or periodically to ensure docs match production D1. |
Update Graft Inventory Skill
When to Activate
Activate this skill when:
- Adding new feature flags via SQL migrations
- Removing or deprecating grafts
- The graft-inventory CI check fails
- You want to verify inventory matches production D1
- After applying migrations that add grafts
Files Involved
| File | Purpose |
|---|
.github/graft-inventory.json | Source of truth for graft counts and metadata |
libs/engine/migrations/*.sql | Migration files that define grafts |
libs/engine/src/lib/platform/feature-flags/flags.ts | Type definitions (KnownFlagId) |
docs/guides/adding-grafts-and-flags.md | Developer guide (grafts = Grove term for feature flags) |
Inventory Structure
The inventory tracks grafts with full metadata:
{
"grafts": {
"total": 10,
"breakdown": {
"platform": 8,
"greenhouse": 2
},
"byType": {
"boolean": 9,
"number": 1
}
},
"flags": [
{
"id": "fireside_mode",
"name": "Fireside Mode",
"type": "boolean",
"greenhouseOnly": true,
"migration": "040_fireside_scribe_grafts.sql",
"description": "AI-assisted writing prompts"
}
]
}
Step-by-Step Process
1. List Grafts from Migrations
grep -hoP "INSERT OR IGNORE INTO feature_flags.*?VALUES\s*\(\s*'\K[a-z_]+" libs/engine/migrations/*.sql | sort -u
2. Query Production D1
npx wrangler d1 execute grove-engine-db --remote --command="SELECT id, name, flag_type, greenhouse_only, enabled FROM feature_flags ORDER BY id;"
3. Compare with Inventory
cat .github/graft-inventory.json | jq '.flags[].id' | sort
4. Identify Discrepancies
Look for:
- New grafts: In migrations/D1 but not in inventory
- Removed grafts: In inventory but not in D1
- Changed metadata: Type, greenhouse_only, or description changed
5. Update Inventory JSON
Edit .github/graft-inventory.json:
-
Update counts:
"grafts": {
"total": <new count>,
"breakdown": {
"platform": <non-greenhouse count>,
"greenhouse": <greenhouse_only count>
}
}
-
Add/remove flag entries:
"flags": [
{
"id": "new_flag_id",
"name": "Human Readable Name",
"type": "boolean",
"greenhouseOnly": false,
"migration": "XXX_migration_name.sql",
"description": "What this flag controls"
}
]
-
Update metadata:
"lastUpdated": "YYYY-MM-DD",
"lastAuditedBy": "claude/<context>"
6. Update KnownFlagId Type
Edit libs/engine/src/lib/platform/feature-flags/flags.ts:
export type KnownFlagId =
| "fireside_mode"
| "scribe_mode"
| "meadow_access"
| "jxl_encoding"
| "jxl_kill_switch"
| "new_flag_id";
7. Commit Changes
git add .github/graft-inventory.json libs/engine/src/lib/platform/feature-flags/flags.ts
git commit -m "docs: update graft inventory
- Add <flag_id> to inventory
- Update total: X -> Y
- Update KnownFlagId type"
Quick Reference Commands
grep -c "INSERT OR IGNORE INTO feature_flags" libs/engine/migrations/*.sql | awk -F: '{sum+=$2} END {print sum}'
grep -hoP "INSERT OR IGNORE INTO feature_flags.*?VALUES\s*\(\s*'\K[a-z_]+" libs/engine/migrations/*.sql | sort -u
npx wrangler d1 execute grove-engine-db --remote --command="SELECT COUNT(*) FROM feature_flags WHERE greenhouse_only = 1;"
npx wrangler d1 execute grove-engine-db --remote --command="SELECT * FROM feature_flags ORDER BY id;"
Adding a New Graft (Full Checklist)
When adding a new graft:
Verifying Production Sync
After updating, verify production matches:
jq '.grafts.total' .github/graft-inventory.json
npx wrangler d1 execute grove-engine-db --remote --command="SELECT COUNT(*) as count FROM feature_flags;"
If they don't match, migrations may need to be applied:
npx wrangler d1 execute grove-engine-db --remote --file=libs/engine/migrations/XXX_name.sql
CI Integration
The .github/workflows/graft-inventory.yml workflow:
- Runs on PRs touching
libs/engine/migrations/*.sql
- Runs on PRs touching
libs/engine/src/lib/feature-flags/**
- Parses migrations for INSERT statements
- Compares count to inventory
- Comments on PRs when there's a mismatch
- Creates issues for drift on scheduled runs (Wednesdays)
When CI fails, run this skill to fix the mismatch.
Checklist
Before finishing: