Inferensys

Prompt

Feature Flag Dependency Tangle Detection Prompt

A practical prompt playbook for using the Feature Flag Dependency Tangle Detection Prompt in production release engineering workflows.
Developer doing prompt engineering on laptop, prompt variations visible on screen, casual coding session.
PROMPT PLAYBOOK

When to Use This Prompt

Defines the job, the user, and the operational constraints for detecting tangled feature flag dependencies before they block releases.

This prompt is for release engineers and platform teams who need to audit a feature flag system that has grown beyond simple on/off toggles. The job-to-be-done is producing a structured tangle report that identifies interdependent flags, maps flag-to-code coupling, and surfaces removal sequencing constraints. You should use this when you suspect flag debt is slowing down releases, when a flag cleanup sprint is being planned, or when a production incident was caused by an unexpected interaction between flags. The ideal user has access to flag configuration files, the codebase where flags are evaluated, and ideally a flag tracking system or spreadsheet. Required context includes the flag definitions, their rollout rules, and the code paths they gate.

Do not use this prompt for a simple inventory of flags or for basic stale flag detection. It is not a replacement for a feature flag management platform's built-in analytics. This prompt is specifically designed for dependency analysis—finding hidden coupling where one flag's behavior depends on another flag's state, or where removing a flag would silently change the behavior of a different flag. If your system has fewer than ten flags or you are only looking for flags that are always true or always false, a simpler dead flag detection prompt will be faster and cheaper. This prompt becomes valuable when the interaction graph is too complex to reason about manually, typically above twenty flags with overlapping rollout rules or shared code paths.

Before running this prompt, gather the raw material: your flag configuration as structured data (JSON, YAML, or TOML), the relevant source files where flags are evaluated, and any existing documentation about flag ownership or expected retirement dates. The prompt expects you to provide these as [FLAG_CONFIG] and [CODE_SNIPPETS] placeholders. If you cannot provide the actual code where flags are evaluated, the analysis will be limited to configuration-level dependencies and will miss the most dangerous class of bugs—code-level coupling where one flag's evaluation branch calls another flag. After receiving the tangle report, validate the findings against your flag management system and prioritize remediation based on the removal sequencing constraints and dead flag quantification provided in the output.

PRACTICAL GUARDRAILS

Use Case Fit

Where the Feature Flag Dependency Tangle Detection Prompt works, where it fails, and the operational preconditions required before you run it in a production release pipeline.

01

Good Fit: Pre-Release Flag Audits

Use when: You are within a week of a major release and need to identify which flags must be removed, which are interdependent, and what the safe removal sequence is. Guardrail: Run this prompt against the release branch, not main, to avoid flagging in-progress work as debt.

02

Bad Fit: Runtime Evaluation Logic

Avoid when: Your flag evaluation rules are computed dynamically at runtime (e.g., based on user segments in a third-party service). The prompt cannot execute or trace runtime decision trees. Guardrail: Pair this prompt with a static analysis of your flag configuration files only; use a separate runtime audit tool for dynamic evaluation paths.

03

Required Input: Flag Manifest and Codebase

Risk: Without a complete flag registry and access to the codebase, the model will hallucinate dependencies or miss dead flags entirely. Guardrail: Provide a machine-readable flag manifest (JSON/YAML) and ensure the prompt has access to the full repository context, not just a subset of files.

04

Operational Risk: Flag Removal Ordering

Risk: The prompt may suggest a removal sequence that is logically sound but operationally unsafe (e.g., removing a flag before its dependent services have been deployed). Guardrail: Cross-reference the suggested removal sequence with your deployment topology and service dependency map before executing any flag removal.

05

Operational Risk: Dead Flag False Positives

Risk: Flags that appear dead in the current branch may be active in long-running feature branches or canary deployments. Premature removal can break those environments. Guardrail: Validate dead flag candidates against all active deployment branches and your feature flag management platform's evaluation history before removal.

06

Bad Fit: Non-Code Flag Dependencies

Avoid when: Flag dependencies span infrastructure configs, database migrations, or third-party vendor settings that are not represented in the codebase. Guardrail: Supplement this prompt with a manual audit of your IaC repos, migration scripts, and vendor dashboards to capture dependencies outside the application code.

PROMPT PLAYBOOK

Copy-Ready Prompt Template

A reusable prompt template for detecting interdependent feature flags, flag-to-code coupling, and removal sequencing constraints.

This prompt template is designed to be dropped into your release engineering workflow. It expects structured input describing your feature flag inventory, the codebase context, and your desired output format. The square-bracket placeholders allow you to adapt it to your specific flag management system, programming language, and risk tolerance without rewriting the core analysis logic.

text
You are a release engineering auditor specializing in feature flag hygiene and system complexity.

Your task is to analyze the provided feature flag inventory and codebase context to produce a Feature Flag Dependency Tangle Report.

## INPUT

### Feature Flag Inventory
[FLAG_INVENTORY]

### Codebase Context
[CODEBASE_CONTEXT]

### Constraints
[CONSTRAINTS]

## OUTPUT SCHEMA

Return a single JSON object conforming to this structure:
{
  "tangled_flags": [
    {
      "flag_id": "string",
      "flag_name": "string",
      "dependencies": ["flag_id"],
      "dependents": ["flag_id"],
      "code_locations": ["file_path:line_number"],
      "tangle_severity": "high" | "medium" | "low",
      "removal_blockers": ["string describing why this flag cannot be removed independently"],
      "suggested_removal_order": "integer representing safe removal sequence position"
    }
  ],
  "dead_flags": [
    {
      "flag_id": "string",
      "flag_name": "string",
      "evidence_of_death": "string explaining why this flag is considered dead",
      "last_modified_date": "ISO date string or null"
    }
  ],
  "flag_debt_quantification": {
    "total_flags": "integer",
    "tangled_flags_count": "integer",
    "dead_flags_count": "integer",
    "average_dependency_depth": "float",
    "estimated_removal_effort_days": "float"
  },
  "removal_sequencing_plan": [
    {
      "step": "integer",
      "flag_id": "string",
      "action": "remove" | "untangle",
      "prerequisite_steps": ["integer"],
      "risk_notes": "string"
    }
  ]
}

## INSTRUCTIONS

1. Parse the [FLAG_INVENTORY] to identify all flags, their current status, and any declared dependencies or rollout rules.
2. Analyze the [CODEBASE_CONTEXT] to find actual flag usage in code, including boolean checks, context propagation, and any implicit dependencies where one flag's behavior changes based on another flag's state.
3. Identify **tangled flags**: flags that depend on other flags being in a specific state, or flags whose code paths are interleaved such that removal order matters.
4. Identify **dead flags**: flags that are no longer referenced in code, have been fully rolled out with no off-ramp, or whose controlling code has been removed.
5. Quantify flag debt using the metrics in the output schema.
6. Produce a safe removal sequencing plan that respects all dependencies.
7. Apply any [CONSTRAINTS] provided, such as ignoring test files, respecting allowlists, or flagging specific risk patterns.

## RISK LEVEL
[RISK_LEVEL]

If [RISK_LEVEL] is "high", flag any uncertainty and require human review before finalizing the removal plan. Do not assume a flag is dead without explicit evidence.

To adapt this template, replace the placeholders with data from your systems. [FLAG_INVENTORY] should be a structured dump from your feature flag service (e.g., LaunchDarkly, Split, or an internal system) containing flag keys, rollout percentages, targeting rules, and creation dates. [CODEBASE_CONTEXT] can be a grep output of flag references, an AST analysis summary, or a concatenation of relevant source files. [CONSTRAINTS] might include rules like "ignore flags in /test/ directories" or "do not suggest removal of flags tagged 'permanent'." [RISK_LEVEL] should be set to "high" for production-critical systems where a bad removal plan could cause an outage.

After copying the template, test it with a small, known set of flags where you can manually verify the output. Compare the model's tangle detection against your own understanding of the flag dependencies. If the model misses a known dependency, add an example to [CODEBASE_CONTEXT] that makes the relationship explicit. For high-risk environments, always run the output through a human review step before executing any removal plan.

IMPLEMENTATION TABLE

Prompt Variables

Required and optional inputs for the Feature Flag Dependency Tangle Detection Prompt. Each placeholder must be populated with concrete data before the prompt is sent. Validation notes describe how to verify the input is well-formed and safe.

PlaceholderPurposeExampleValidation Notes

[FLAG_MANIFEST]

Complete list of feature flags with metadata: name, status, rollout percentage, owner team, creation date, last modified date

{"flags": [{"name": "checkout_v2", "status": "active", "rollout": 100, "owner": "checkout-team", "created": "2024-01-15", "modified": "2024-11-20"}]}

Schema check: array of objects with required fields name and status. Status must be one of active, inactive, retired, dead. Dates must be ISO 8601. Null or empty array triggers abort.

[CODEBASE_REFERENCES]

Source file paths and line numbers where each flag is evaluated, including conditional logic and flag-to-flag references

{"checkout_v2": [{"file": "src/checkout/service.ts", "line": 142, "expression": "isEnabled('checkout_v2') && isEnabled('payment_v3')"}]}

Parse check: valid JSON with flag names as keys. Each entry must include file path and line number. File paths must be relative to repository root. Missing line numbers trigger a warning; missing file paths trigger a failure.

[FLAG_DEPENDENCY_GRAPH]

Explicit or inferred dependency edges between flags, including the relationship type

{"edges": [{"from": "checkout_v2", "to": "payment_v3", "type": "runtime_and", "source": "src/checkout/service.ts:142"}]}

Schema check: edges array with from, to, type fields. Type must be one of runtime_and, runtime_or, config_override, rollout_dependency, kill_switch_parent. Source field must reference a valid file path from CODEBASE_REFERENCES.

[REMOVAL_QUEUE]

Ordered list of flags scheduled for removal with planned removal dates and sequencing constraints

{"queue": [{"flag": "old_search", "planned_removal": "2025-01-15", "blocked_by": ["search_v2"], "blocks": []}]}

Parse check: array of objects with flag and planned_removal fields. Flag names must exist in FLAG_MANIFEST. Dates must be future or null. Circular blocked_by chains must be flagged as invalid input.

[DEAD_FLAG_THRESHOLD_DAYS]

Number of days since last modification after which a flag is considered dead

90

Type check: positive integer. Range: 30-365. Values below 30 produce excessive false positives; values above 365 miss stale flags. Default 90 if not provided.

[OUTPUT_SCHEMA]

Expected structure for the tangle report output, including required fields and severity levels

{"tangles": [{"id": "tangle-001", "flags_involved": ["checkout_v2", "payment_v3"], "tangle_type": "mutual_dependency", "severity": "high", "removal_blocked": true}]}

Schema check: must define tangles array with id, flags_involved, tangle_type, severity fields. Severity must be low, medium, high, critical. tangle_type must be from allowed enum. Missing schema defaults to standard tangle report format.

[FLAG_DEBT_WEIGHTS]

Scoring weights for quantifying flag debt: staleness, complexity, coupling breadth, and removal risk

{"staleness_weight": 0.3, "complexity_weight": 0.25, "coupling_weight": 0.3, "removal_risk_weight": 0.15}

Parse check: object with four numeric fields. All values must be between 0.0 and 1.0. Sum must equal 1.0 within 0.01 tolerance. Non-conforming weights trigger a warning and normalization fallback.

[EXEMPTION_LIST]

Flags or flag patterns excluded from tangle detection, such as kill switches or platform-level flags

["global_kill_switch", "platform_*"]

Parse check: array of strings. Wildcards allowed with asterisk suffix only. Each entry must match at least one flag in FLAG_MANIFEST or produce a warning. Empty list is valid and means no exemptions.

PROMPT PLAYBOOK

Implementation Harness Notes

How to wire the Feature Flag Dependency Tangle Detection Prompt into a release engineering workflow with validation, retries, and CI/CD integration.

This prompt is designed to run as a scheduled analysis job or a pre-release gate, not as an interactive chat. The primary integration point is a release engineering pipeline that collects flag configuration files, codebase references to flags, and flag metadata (owner, creation date, expected removal date) into a structured [INPUT] payload. The model returns a tangle report that downstream automation can parse and act on. Because the output drives cleanup tickets and release go/no-go decisions, the harness must validate the report structure, ground every claimed dependency to a source location, and fail closed when the model produces ambiguous or incomplete results.

Wire the prompt into a script or microservice that assembles the input from three sources: your feature flag management system (e.g., LaunchDarkly, Split, or an internal service), a grep or static analysis pass over the codebase for flag references, and a metadata file mapping flag keys to owning teams and removal deadlines. The assembled [INPUT] should include a JSON array of flag objects, each with the flag key, the files and line numbers where it appears, its current state (active, deprecated, removed), and any known dependencies declared in flag rules. The [OUTPUT_SCHEMA] should enforce a strict JSON structure with fields for tangled_flags (arrays of mutually dependent flag groups), dead_flags (flags with no code references), removal_sequence (a topologically ordered list for safe flag removal), and debt_score (a numeric estimate of flag debt severity). Validate the output against this schema before accepting it. If validation fails, retry once with a repair prompt that includes the schema violation details. If the second attempt fails, escalate to a human reviewer and block the release gate.

Model choice matters here. Use a model with strong structured output capabilities and a context window large enough to hold the full flag-to-code mapping. For large codebases with hundreds of flags, split the input by service or team boundary and run the prompt in parallel, then merge the results with a deduplication step. Log every run: the input hash, the model version, the output, the validation result, and any retry attempts. This audit trail is essential when a flag removal breaks production and the team needs to trace whether the tangle report missed a dependency. For high-risk releases, add a human approval step that presents the removal_sequence and tangled_flags to the release manager before any flag is toggled or removed.

Common failure modes to guard against: the model may report false dependencies when two flags appear in the same file but are logically independent. Mitigate this by including a [CONSTRAINTS] block that instructs the model to only report a dependency when one flag's evaluation directly gates another flag's state, not when they merely co-occur. The model may also miss dependencies that are constructed dynamically (e.g., flag keys built from string concatenation). The harness should flag any flag key that appears in the codebase but not in the model's output as a potential missed dependency and route it for manual review. Finally, the debt_score is a heuristic, not a metric to automate decisions on. Use it to prioritize cleanup backlogs, not to auto-remove flags.

Integrate the validated output into your existing toolchain: create Jira tickets for each tangled flag group, post the removal sequence to the release runbook, and update a dashboard tracking flag debt over time. The prompt is a diagnostic tool, not a remediation engine. It tells you what is tangled and what to remove first. The actual flag removal, code cleanup, and deployment verification remain engineering tasks that require human judgment and testing.

IMPLEMENTATION TABLE

Expected Output Contract

Schema, types, and validation rules for the tangle report. Use this contract to parse the model output, run automated checks, and reject malformed responses before they reach downstream systems.

Field or ElementType or FormatRequiredValidation Rule

tangle_report_id

string (UUID v4)

Must match regex ^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$

generated_at

string (ISO 8601 UTC)

Must parse as valid Date; must be within 5 minutes of system clock at validation time

flags

array of objects

Array length must be >= 1; each object must contain flag_key (string, required) and status (enum: active | dead | unknown, required)

flags[].flag_key

string

Must match pattern [A-Za-z0-9_-]+; must be unique within the flags array

flags[].status

enum string

Must be one of: active, dead, unknown. If dead, a dead_flag_evidence object must be present in the tangle_edges referencing this flag

tangle_edges

array of objects

Array length must be >= 0; each object must contain source_flag, target_flag, dependency_type, and confidence

tangle_edges[].source_flag

string

Must match a flag_key present in the flags array

tangle_edges[].target_flag

string

Must match a flag_key present in the flags array; must not equal source_flag

tangle_edges[].dependency_type

enum string

Must be one of: code_level, config_level, evaluation_order, removal_prerequisite, or semantic

tangle_edges[].confidence

number (0.0-1.0)

Must be a float between 0.0 and 1.0 inclusive; edges with confidence < 0.5 must include a low_confidence_reason string

tangle_edges[].evidence_snippet

string

Must be non-empty; must contain a code or config fragment that demonstrates the dependency; max 500 characters

removal_sequence

array of strings

Array length must be >= 0; each string must match a flag_key in the flags array; order must respect removal_prerequisite edges

dead_flag_debt_count

integer

Must equal the count of flags with status dead; must be >= 0

cyclomatic_tangle_score

number

Must be a float >= 0.0; calculated as (number of edges in cycles / total edges) * 10; if no edges, score must be 0.0

human_review_required

boolean

Must be true if cyclomatic_tangle_score > 7.0 or dead_flag_debt_count > 5 or any edge confidence < 0.5; otherwise false

PRACTICAL GUARDRAILS

Common Failure Modes

What breaks first when using a Feature Flag Dependency Tangle Detection Prompt and how to guard against it.

01

False Positives from Dynamic Access

What to watch: The model flags a dependency because it sees a flag name string in the code, but the flag is accessed via a dynamic lookup (e.g., getFlag(variable)). This inflates the tangle report with phantom dependencies. Guardrail: Pre-process the codebase to extract only statically analyzable flag references. Add a strict instruction in the prompt to ignore flag name strings inside dynamic accessor functions unless a concrete string literal is passed.

02

Ignoring Flag Retirement Logic

What to watch: The prompt identifies a flag as a dead flag, but the code contains an else block that executes when the flag is off. Removing the flag without analyzing the full conditional branch can delete critical fallback logic. Guardrail: Require the output to include the full conditional context for every flagged dead flag. Add a verification step that checks if the 'dead' branch is truly unreachable or just currently disabled.

03

Missing Cross-Repository Dependencies

What to watch: The analysis is scoped to a single repository, but a flag in repo-a gates a client-side change in repo-b. The tangle report looks clean, but a production outage occurs because the cross-repo coupling was invisible. Guardrail: Explicitly list all repositories and services in the [CONTEXT] input. Instruct the model to flag any flag name that matches a pattern across service boundaries and mark cross-repo dependencies as high-risk.

04

Hallucinated Removal Sequences

What to watch: The model confidently outputs a flag removal order that is logically impossible—e.g., removing Flag A before Flag B, when B's code path is nested inside A's. This leads to broken releases if followed blindly. Guardrail: Require the output to include a directed acyclic graph (DAG) of dependencies. Validate the DAG for cycles before accepting the sequence. Add a human-review gate for any removal plan before it reaches a release pipeline.

05

Conflating Kill-Switch and Permission Flags

What to watch: The prompt treats all flags as equivalent, suggesting a permission flag used for entitlement gating can be removed like a temporary release flag. Removing an operational kill-switch removes a critical safety mechanism. Guardrail: Categorize flags by type (release, experiment, permission, ops) in the [OUTPUT_SCHEMA]. Add a hard rule that no ops or permission flag removal is suggested without explicit human approval.

06

Stale Analysis from Outdated Branch

What to watch: The analysis runs against a stale feature branch or a local clone that is weeks behind main. The resulting tangle report misses recently added flags and suggests removing flags already deleted on the main branch. Guardrail: Add a pre-prompt check that verifies the analyzed commit SHA is within a configurable recency window (e.g., 24 hours). Include the commit SHA and analysis timestamp in the output header for auditability.

IMPLEMENTATION TABLE

Evaluation Rubric

Criteria for evaluating the quality of a Feature Flag Dependency Tangle Detection report before integrating it into a release pipeline or architectural review. Each criterion includes a pass standard, a failure signal, and a test method.

CriterionPass StandardFailure SignalTest Method

Flag-to-Flag Dependency Accuracy

Every reported dependency between flags corresponds to a code path where one flag's state gates the evaluation or effect of another.

A dependency is reported based on textual co-occurrence in a config file or comment, without a corresponding code-level control flow link.

Sample 5 reported flag pairs. For each, require the output to cite the specific file, line number, and code snippet showing the gating logic. Manually verify the citation.

Dead Flag Detection Precision

All flags classified as 'dead' have zero references in the current codebase and are not toggled by any active experiment system.

A flag is marked dead because it is absent from the main branch's config file, but it is still referenced in a long-lived release branch or an active experiment system.

For each 'dead' flag, run a cross-reference check against the experiment system API and all active release branches. A false positive occurs if the flag is found.

Removal Sequencing Correctness

The suggested removal order does not require removing a flag that is a dependency of another flag that is listed for later removal.

The sequence suggests removing Flag A before Flag B, but the report's own dependency graph shows Flag B depends on Flag A.

Parse the output's removal sequence. For each flag, check the dependency graph provided in the same report. A violation is a topological sort error.

Flag Debt Quantification Grounding

The 'debt score' for each flag is calculated from concrete, defined metrics present in the report (e.g., age, number of dependents, code complexity of gated blocks).

A high debt score is assigned with a vague justification like 'complex flag' or 'old flag' without linking to specific metrics or source evidence.

For the top 3 highest debt scores, require the output to list the contributing metrics and their values. A failure is a missing or non-quantitative justification.

Tangle Severity Classification

A 'tangle' is correctly classified as 'high severity' only if it contains a cycle or a flag with more than a defined threshold of direct dependents (e.g., 5).

A simple, linear chain of two flags is classified as a 'critical tangle'.

Define a severity threshold in the prompt's [CONSTRAINTS]. Parse the output's tangle list. Verify that each 'high severity' tangle meets the defined criteria based on the dependency graph in the report.

False Positive Handling for Dead Code

Flags gating only code within a recognized dead-code block (e.g., an unreachable if false branch) are noted but not counted as active dependencies.

A dependency is reported for a flag gating code inside a block that static analysis or a prior dead-code report has confirmed is unreachable.

Provide a pre-computed list of dead code blocks as [CONTEXT]. Verify that no dependency is reported where the gating flag's only reference is inside one of these blocks.

Output Schema Compliance

The output is valid JSON that strictly conforms to the provided [OUTPUT_SCHEMA], with all required fields present and correctly typed.

The output is missing a required field like removal_sequence, or a field like dependency_count is a string instead of an integer.

Validate the raw model output against the [OUTPUT_SCHEMA] using a JSON schema validator. A single validation error is a failure.

ADAPTATION OPTIONS

Adapt This Prompt

How to adapt

Add strict JSON schema validation, retry logic, and eval cases. Ground every tangle claim with specific file paths and flag keys. Include removal sequencing with explicit ordering constraints.

Add to the prompt:

json
{
  "output_schema": {
    "tangles": [{
      "id": "string",
      "flags_involved": ["string"],
      "coupling_type": "flag_to_flag | flag_to_code | shared_target",
      "evidence": [{"file_path": "string", "line_range": "string"}],
      "removal_order": ["string"],
      "dead_flag": true | false
    }]
  },
  "constraints": [
    "Every tangle must cite at least one file path",
    "Removal order must be a valid topological sort",
    "Dead flags must be flagged before sequencing"
  ]
}

Watch for

  • Silent format drift when the model drops optional fields
  • Missing human review for high-severity tangles that affect production rollouts
  • Removal order cycles that indicate the model didn't detect a true dependency cycle
  • Stale evidence when flag configurations have changed since the last audit
Prasad Kumkar

About the author

Prasad Kumkar

CEO & MD, Inference Systems

Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.

His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.