.claude/skills/review-config-registry/SKILL.md
Audit config registry for dead keys, no-op configs, stale descriptions, and organizational opportunities
npx skillsauth add cwilliams5/Alt-Tabby review-config-registryInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Enter planning mode. Audit src/shared/config_registry.ahk for dead weight, behavioral no-ops, stale metadata, and organizational drift. The config registry is user-facing — every key maps to a line in someone's config.ini. Findings are surfaced for human review, not auto-fixed.
src/shared/config_registry.ahk — the single source of truth for all config definitionscfg.KeyNameA dead key exists in the registry but has zero effect on the application.
For every key in the registry:
query_config.ps1 -Usage <keyName> to find all consumer filesconfig_registry.ahk, config_loader.ahk, and editor files — the key is deadClassification:
cfg.%varName%) won't show in static grep. Check for dynamic access patterns before declaring a key dead.{N} templates (e.g., Shader{N}_ShaderName). The consumer will reference cfg.Shader1_ShaderName etc. — search for expanded names.A no-op key is consumed in source code, but the code behaves identically regardless of the key's value. Grep finds it. The config is still useless.
For each config key (prioritize booleans and enums — they're the most common no-ops):
query_config.ps1 -Usage <keyName>cfg.KeyName)Patterns that indicate a no-op:
if (cfg.Flag) where the body is empty, commented out, or effectively identical to the else branchif (cfg.Flag) with no else, where the guarded code was moved/deleted but the condition shell remainsPatterns that are NOT no-ops (don't flag these):
For each key, check the d (description) field against actual behavior:
For numeric keys with min/max:
default within the min/max range?max: 1000000 — technically valid, practically useless)t (type) field match how the key is actually used? A key typed as int but compared as a string, or typed as bool but used as a numeric threshold.This phase surfaces clustering opportunities. All findings are suggestions — the human decides if reorganization is worth the config.ini migration cost.
s field)Scattered related keys: Keys that relate to the same feature but live in different sections. Signal: similar name prefixes, consumed by the same functions, or controlling different aspects of one visual/behavioral feature.
Example pattern: "inner shadow" keys split across [GUI] and [Performance] when they could be a coherent group.
Oversized sections: Sections with 40+ keys where natural sub-groupings exist. Not a problem per se, but worth surfacing.
Naming inconsistencies:
Keys whose name prefix doesn't match their section. A key named GUI_FooBar in the [Store] section, or a key that was moved between sections but kept its old prefix.
Orphaned sections: Sections with only 1-2 keys that could reasonably merge into a parent section.
Don't just list problems — sketch the potential reorganization so the human can evaluate it as a whole:
Suggestion: Shadow settings consolidation
Currently:
[GUI] GUI_UseInnerShadow, GUI_InnerShadowAlpha, GUI_InnerShadowDepthPx
[Performance] Perf_ShadowQuality
Proposed:
[GUI.Shadow] UseInnerShadow, Alpha, DepthPx, Quality
Impact: Would require config.ini migration for 4 keys
Split by registry section for Phase 1-3 (parallel):
[AltTab], [Launcher], [Setup], [Tools], [IPC] sections[GUI] section (largest — may need the full agent)[Store], [Performance], [Capture] sections[Shader.*], [MouseEffect], [BackgroundImage] sections[Theme], [Diagnostics], [Komorebi] sectionsEach agent runs Phase 1 (dead keys), Phase 2 (no-ops), and Phase 3 (metadata) for its sections.
Phase 4 (organizational review) runs after, since it needs the full picture across all sections.
| Key | Section | Consumers | Status | Notes |
|-----|---------|-----------|--------|-------|
| Store_FooBar | Store | 0 | Dead | No references outside registry/loader |
| GUI_OldFlag | GUI | 1 (test only) | Test-only | Only in test_unit_config.ahk |
| Key | Section | Usage Sites | Why It's a No-Op | Code Evidence |
|-----|---------|-------------|------------------|---------------|
| GUI_SomeFlag | GUI | gui_paint.ahk:142 | if body is empty after refactor | if (cfg.GUI_SomeFlag) { } |
| Store_Mode | Store | gui_data.ahk:88 | Both branches execute identical logic | Both call _Refresh() with same args |
| Key | Field | Issue | Current | Should Be |
|-----|-------|-------|---------|-----------|
| GUI_FooMs | d | References deleted function | "Delay for _GUI_OldFunc()" | "Delay for overlay show" |
| Perf_Bar | min/max | Default outside bounds | default=0, min=1 | Either default=1 or min=0 |
Group by suggestion, not by individual key. Include migration impact.
Suggestion: [descriptive name]
Currently: [where keys live now]
Proposed: [where they could live]
Keys affected: N
Migration impact: [brief — breaking change to config.ini, needs migration in config_loader]
Order all tables: dead keys first (easy wins), no-ops second (highest value — invisible waste), metadata third, organizational last.
Ignore any existing plans — create a fresh one.
tools
Create a new git worktree and switch the session into it
tools
Spawn agent to trace code flow via query tools — answer only, no context cost
tools
Commit, push, and create a PR for the current branch
tools
Retire a shader by moving its files to legacy/shaders_retired