src/autoskillit/skills_extended/audit-feature-gates/SKILL.md
Audit feature flag isolation — traces import chains, runtime gates, tool/skill tag coverage, UI surfaces, and test markers to detect leakage and miswiring.
npx skillsauth add talont-org/autoskillit audit-feature-gatesInstall 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.
Audits feature flag isolation across 6 dimensions: config projection, import chain integrity, runtime gate consistency, tool/skill tag completeness, boundary coupling, and test marker coverage. Detects where disabled features leak through import chains, runtime bypasses, UI surfaces, and ungated callables.
FEATURE_REGISTRY to verify isolation is completefull-audit.yaml 4th parallel chainNo arguments required. Reads FEATURE_REGISTRY from src/autoskillit/core/_type_constants.py
to enumerate features.
NEVER:
{{AUTOSKILLIT_TEMP}}/audit-feature-gates/run_in_background: true is prohibited)ALWAYS:
model: "sonnet" when spawning all subagents via the Task toolRead src/autoskillit/core/_type_constants.py. Extract all entries from FEATURE_REGISTRY exhaustively — do not assume a fixed list.
For each feature, note: name, lifecycle, import_package, tool_tags, skill_categories,
default_enabled.
Issue ALL 6 Task calls in a single message.
D1 — Config Projection (subagent):
Finding IDs: Assign each finding a unique ID using the scheme FG-D1-{seq:02d} where
{seq} is a zero-padded sequence starting at 01 (e.g., FG-D1-01, FG-D1-02). Include
the ID in every finding line. For inventory table rows, cite file:line for the config
source (e.g., src/autoskillit/config/defaults.yaml:NN or
src/autoskillit/core/_type_constants.py:NN for the registry entry).
For each feature in FEATURE_REGISTRY: do not output any prose between iterations — process all features and return findings as structured text only.
src/autoskillit/config/defaults.yaml features: section.autoskillit/config.yaml features: section (if it exists)config_override ?? defaults ?? FeatureDef.default_enableddefault_enabled=True in registrysunset_date values (compare against today's date, if field present)ID | FEATURE | LIFECYCLE | DEFAULT | CONFIG | RESOLVED | RISK | file:lineReturn findings as structured text. Do NOT create any files.
D2 — Import Chain Integrity (subagent):
Finding IDs: Assign each finding a unique ID using the scheme FG-D2-{seq:02d} (e.g.,
FG-D2-01). Every BLOCK and WARN finding must include file:line — this is mandatory,
not optional.
For each feature's import_package: do not output any prose between iterations — return findings as structured text only.
from {package} import and import {package} across src/ (excluding tests)if TYPE_CHECKING:, or inside if is_feature_enabled(...):file:linetools_kitchen.py, _cook.py, _prompts.py, _fleet.pyReturn findings as structured text. Do NOT create any files.
D3 — Runtime Gate Consistency (subagent):
Finding IDs: Assign each finding a unique ID using the scheme FG-D3-{seq:02d} (e.g.,
FG-D3-01). Every BLOCK and WARN finding must include file:line.
For each feature: do not output any prose between iterations — return findings as structured text only.
is_feature_enabled("{name}" call sites across src/AUTOSKILLIT_FEATURES__{NAME} env-var reads (bypass paths)is_feature_enabled() in the same code path_fleet_auto_gate_boot() calling mcp.enable() without then calling _redisable_subsets() (server/_lifespan.py)is_feature_enabled() check (e.g., dispatch_food_truck in server/tools_execution.py)Return findings as structured text. Do NOT create any files.
D4 — Tool/Skill Tag Completeness (subagent):
Finding IDs: Assign each finding a unique ID using the scheme FG-D4-{seq:02d} (e.g.,
FG-D4-01). Every BLOCK and WARN finding must include file:line.
For each feature: do not output any prose between iterations — return findings as structured text only.
feature_def.tool_tags against TOOL_SUBSET_TAGS in src/autoskillit/core/_type_constants.pysrc/autoskillit/skills_extended/ for feature-specific references_DISPLAY_CATEGORIES in cli/_cook.py applies feature-check filtering before displayinglist_recipes in server/tools_recipe.py filters kind: campaign when fleet is disabledrun_python callable in skill_contracts.yaml whose package matches feature_def.import_package without a feature gate in the execution pathReturn findings as structured text. Do NOT create any files.
D5 — Boundary Coupling (subagent):
Finding IDs: Assign each finding a unique ID using the scheme FG-D5-{seq:02d} (e.g.,
FG-D5-01). For WARN/BLOCK coupling table rows, cite file:line for the import site or
field declaration (e.g., src/autoskillit/pipeline/context.py:NN).
For each feature:
src/autoskillit/core/ (IL-0) for feature-specific constants or imports beyond FeatureDef/FEATURE_REGISTRYsrc/autoskillit/pipeline/context.py for feature-specific fields unconditionally allocated on ToolContextsrc/autoskillit/config/settings.py for feature-specific config dataclasses parsed without a validation gatesrc/autoskillit/execution/headless.py for unconditional reads of feature configsrc/autoskillit/server/_factory.py for unconditional feature-object allocationID | LAYER | FEATURE | COUPLING TYPE | SEVERITY | file:lineReturn findings as structured text. Do NOT create any files.
D6 — Test Marker Coverage (subagent):
Finding IDs: Assign each finding a unique ID using the scheme FG-D6-{seq:02d} (e.g.,
FG-D6-01). Every WARN finding must include file:line (the test file missing the marker).
For each feature:
feature.import_package or referencing feature-specific symbols (Grep tests/ for the import_package name)pytest.mark.feature("{name}") at file or class leveltests/arch/test_feature_markers.py for per-feature enforcement liststest_feature_markers.pyfeature("{name}") markerfeature("fleet") marker; check if planner marker enforcement exists in test_feature_markers.pyReturn findings as structured text. Do NOT create any files.
After all 6 subagents return, consolidate findings per dimension. Count BLOCK/WARN/INFO totals.
Ensure {{AUTOSKILLIT_TEMP}}/audit-feature-gates/ exists (mkdir -p). All paths below are
relative to the current working directory.
Write report to:
{{AUTOSKILLIT_TEMP}}/audit-feature-gates/feature_gate_audit_{YYYY-MM-DD_HHMMSS}.md
Report format:
# Feature Gate Audit
**Date:** {YYYY-MM-DD HH:MM:SS} **Features audited:** {comma-separated list from FEATURE_REGISTRY}
## Config Projection
{D1 findings with BLOCK/WARN/INFO severity badges and FG-D1-NN IDs}
### D1 Remediation Checklist
- [ ] [{ID}] {one-line action to resolve the finding}
## Import Chain Integrity
{D2 findings with BLOCK/WARN/INFO severity badges and FG-D2-NN IDs}
### D2 Remediation Checklist
- [ ] [{ID}] {one-line action to resolve the finding}
## Runtime Gate Consistency
{D3 findings with BLOCK/WARN/INFO severity badges and FG-D3-NN IDs}
### D3 Remediation Checklist
- [ ] [{ID}] {one-line action to resolve the finding}
## Tool/Skill Tag Completeness
{D4 findings with BLOCK/WARN/INFO severity badges and FG-D4-NN IDs}
### D4 Remediation Checklist
- [ ] [{ID}] {one-line action to resolve the finding}
## Boundary Coupling
{D5 findings with BLOCK/WARN/INFO severity badges and FG-D5-NN IDs}
### D5 Remediation Checklist
- [ ] [{ID}] {one-line action to resolve the finding}
## Test Marker Coverage
{D6 findings with BLOCK/WARN/INFO severity badges and FG-D6-NN IDs}
### D6 Remediation Checklist
- [ ] [{ID}] {one-line action to resolve the finding}
## Summary
| Severity | Count |
|----------|-------|
| BLOCK | N |
| WARN | N |
| INFO | N |
| **Total**| N |
Print to terminal:
[audit-feature-gates] Done.
BLOCK: {N} | WARN: {N} | INFO: {N}
Report: {AUTOSKILLIT_TEMP}/audit-feature-gates/feature_gate_audit_{ts}.md
{{AUTOSKILLIT_TEMP}}/audit-feature-gates/
└── feature_gate_audit_{YYYY-MM-DD_HHMMSS}.md
/autoskillit:validate-audit — validates the report produced by this skill/autoskillit:audit-arch — parallel audit chain in full-audit.yaml/autoskillit:audit-tests — parallel audit chain in full-audit.yaml/autoskillit:audit-cohesion — parallel audit chain in full-audit.yamldevelopment
Generate YAML recipes for .autoskillit/recipes/. Use when user says "make script skill", "generate script", "script a workflow", "write a script", "create a script", "new recipe", "write a pipeline", or when loaded by other skills for script formatting.
data-ai
Create Uncertainty Representation visualization planning spec showing error bar definitions, distribution-aware alternatives, and multi-seed variance protocols. Statistical lens answering "How is uncertainty honestly represented?"
data-ai
Create Temporal Dynamics visualization planning spec showing axis scaling (linear vs log), smoothing disclosure, epoch/step alignment, run aggregation (mean + variance bands), early-stopping markers, and wall-clock vs step-count x-axis. Temporal lens answering "Are training dynamics shown clearly and honestly?"
data-ai
Create Narrative Story Arc visualization planning spec showing visual consistency across the report (same color = same model everywhere), logical figure progression, redundant figure detection, and narrative dependency between figures. Narrative lens answering "Do the figures tell a coherent story across the report?"