Feature Maturity Gate
Language models are least reliable about exactly one thing in engine work: what is true in
your version. Training data averages across years of releases, so a feature that was
Experimental for three versions, shipped as Beta, and is now Production Ready has all three
states represented in what the model learned, with no reliable way to tell which one applies
to you. The answer arrives confident and unlabeled either way.
This produces two failures that look nothing alike:
- Building on sand. A feature adopted as though stable turns out to be Experimental in
your version — its API changes under you at the next upgrade, and its edge cases are
documented nowhere because it was never meant to be relied on yet.
- Refusing free capability. A feature avoided as "experimental" that has actually been
production-ready for several versions, so the project hand-rolls a worse version of it.
Both are avoidable in about five minutes, using evidence that is already on your disk.
Determine maturity before committing to a feature
- Never accept a maturity claim without a version. "Substepping is experimental" is not
a statement about your project until it names an engine version. Treat unversioned claims
— from a model, a tutorial, or a memory — as unverified.
- Check on this machine. Plugin descriptors, editor labels, deprecation macros, and
console variable help all carry maturity information in the installed engine. The
procedures are in
references/maturity-discovery.md.
- Apply the guardrails for the level you found, not the level you hoped for. Experimental
is not forbidden — it is permitted with containment. See
references/decision-rules.md.
- Record the finding with its evidence and date in the project context file. A maturity
claim with no evidence is the thing this skill exists to prevent, and writing one down
makes it authoritative for everyone after you.
- Re-check on upgrade. Maturity is the most upgrade-volatile fact in a project. See
references/drift-and-upgrade.md.
Load only what applies:
references/maturity-discovery.md — the four on-disk
checks, in order of cost, and how to read each result.
references/decision-rules.md — what each maturity level
permits, and the containment an Experimental dependency requires.
references/drift-and-upgrade.md — re-verification after
an engine upgrade and what silently changes.
Required answer format
When this skill fires, return:
- Feature and version — the exact engine version checked against.
- Maturity finding — Production Ready / Beta / Experimental / deprecated / not present,
and which check produced it.
- Evidence — the file, label, macro, or command output, quoted.
- Guardrails required — per
references/decision-rules.md, for the level found.
- Decision — adopt, adopt with containment, or avoid, with the reason.
- Unverified — anything where the checks disagreed or returned nothing, marked
explicitly rather than resolved by assumption.
Hard rules
- Never state a maturity level without naming the engine version it applies to. An unversioned
claim is a guess even when it is right.
- Never infer maturity from a tutorial, a forum post, or a model's confidence. Those describe
some version, and rarely say which.
- An Experimental dependency requires containment before the first line of code that uses it —
an isolation boundary and a fallback plan, not an intention to add them later.
- Absence of an Experimental label is not evidence of stability. Check positively rather than
concluding from what you did not see.
- A deprecation warning is a deadline, not a style note. Record which version removes it.
- Record the finding with its date. An undated maturity claim becomes wrong silently at the
next upgrade, and nobody will know when it was last true.
Verification
The evidence test. For every maturity claim in the project, a named artifact must exist:
a descriptor field, an editor label, a compiler warning, or command output. A claim nobody can
produce evidence for is unverified — mark it so rather than defending it.
The upgrade re-check. After any engine version change, re-run the discovery procedure for
every feature in the table and diff the results. Features move in both directions, and the
ones that got more stable are worth finding too — they may retire code you wrote to work
around them.
The containment test. For each Experimental dependency, confirm the isolation boundary is
real: the number of files that reference it directly should be small and enumerable. If it is
neither, the containment exists only in the design document.
Scope
This skill establishes what state a feature is in and what that implies. It does not decide
whether a feature is a good fit for your design, does not cover phase-driven exclusions
(ue5-phase-bans — a different decision with a different lift condition), and does not track
third-party plugin quality, which has no engine-published maturity label at all.
It deliberately contains no list of which features are Experimental in which version. Such
a list is wrong within one release and cannot be verified from inside this repository. The
procedures here answer the question for whatever version you are actually running, which is
the only version that matters.
1---2name: ue5-feature-maturity-gate3description: Establish whether an engine feature is Production Ready, Beta, Experimental, or deprecated in the exact UE5 version this project uses, before building on it — by checking the plugin descriptors, editor labels, deprecation macros, and console variable help on this machine rather than trusting recalled defaults. Use before adopting any engine subsystem or plugin, when an agent recommends a feature confidently without naming a version, when an API that "should exist" does not, after an engine upgrade, or when behavior differs from every tutorial.4---56# Feature Maturity Gate78Language models are least reliable about exactly one thing in engine work: **what is true in9your version.** Training data averages across years of releases, so a feature that was10Experimental for three versions, shipped as Beta, and is now Production Ready has all three11states represented in what the model learned, with no reliable way to tell which one applies12to you. The answer arrives confident and unlabeled either way.1314This produces two failures that look nothing alike:1516- **Building on sand.** A feature adopted as though stable turns out to be Experimental in17 your version — its API changes under you at the next upgrade, and its edge cases are18 documented nowhere because it was never meant to be relied on yet.19- **Refusing free capability.** A feature avoided as "experimental" that has actually been20 production-ready for several versions, so the project hand-rolls a worse version of it.2122Both are avoidable in about five minutes, using evidence that is already on your disk.2324## Determine maturity before committing to a feature25261. **Never accept a maturity claim without a version.** "Substepping is experimental" is not27 a statement about your project until it names an engine version. Treat unversioned claims28 — from a model, a tutorial, or a memory — as unverified.292. **Check on this machine.** Plugin descriptors, editor labels, deprecation macros, and30 console variable help all carry maturity information in the installed engine. The31 procedures are in32 [`references/maturity-discovery.md`](references/maturity-discovery.md).333. **Apply the guardrails for the level you found**, not the level you hoped for. Experimental34 is not forbidden — it is permitted with containment. See35 [`references/decision-rules.md`](references/decision-rules.md).364. **Record the finding with its evidence and date** in the project context file. A maturity37 claim with no evidence is the thing this skill exists to prevent, and writing one down38 makes it authoritative for everyone after you.395. **Re-check on upgrade.** Maturity is the most upgrade-volatile fact in a project. See40 [`references/drift-and-upgrade.md`](references/drift-and-upgrade.md).4142Load only what applies:4344- [`references/maturity-discovery.md`](references/maturity-discovery.md) — the four on-disk45 checks, in order of cost, and how to read each result.46- [`references/decision-rules.md`](references/decision-rules.md) — what each maturity level47 permits, and the containment an Experimental dependency requires.48- [`references/drift-and-upgrade.md`](references/drift-and-upgrade.md) — re-verification after49 an engine upgrade and what silently changes.5051## Required answer format5253When this skill fires, return:54551. **Feature and version** — the exact engine version checked against.562. **Maturity finding** — Production Ready / Beta / Experimental / deprecated / not present,57 and which check produced it.583. **Evidence** — the file, label, macro, or command output, quoted.594. **Guardrails required** — per `references/decision-rules.md`, for the level found.605. **Decision** — adopt, adopt with containment, or avoid, with the reason.616. **Unverified** — anything where the checks disagreed or returned nothing, marked62 explicitly rather than resolved by assumption.6364## Hard rules6566- Never state a maturity level without naming the engine version it applies to. An unversioned67 claim is a guess even when it is right.68- Never infer maturity from a tutorial, a forum post, or a model's confidence. Those describe69 some version, and rarely say which.70- An Experimental dependency requires containment before the first line of code that uses it —71 an isolation boundary and a fallback plan, not an intention to add them later.72- Absence of an Experimental label is not evidence of stability. Check positively rather than73 concluding from what you did not see.74- A deprecation warning is a deadline, not a style note. Record which version removes it.75- Record the finding with its date. An undated maturity claim becomes wrong silently at the76 next upgrade, and nobody will know when it was last true.7778## Verification7980**The evidence test.** For every maturity claim in the project, a named artifact must exist:81a descriptor field, an editor label, a compiler warning, or command output. A claim nobody can82produce evidence for is unverified — mark it so rather than defending it.8384**The upgrade re-check.** After any engine version change, re-run the discovery procedure for85every feature in the table and diff the results. Features move in both directions, and the86ones that got *more* stable are worth finding too — they may retire code you wrote to work87around them.8889**The containment test.** For each Experimental dependency, confirm the isolation boundary is90real: the number of files that reference it directly should be small and enumerable. If it is91neither, the containment exists only in the design document.9293## Scope9495This skill establishes what state a feature is in and what that implies. It does not decide96whether a feature is a good fit for your design, does not cover phase-driven exclusions97(`ue5-phase-bans` — a different decision with a different lift condition), and does not track98third-party plugin quality, which has no engine-published maturity label at all.99100It deliberately contains **no list of which features are Experimental in which version**. Such101a list is wrong within one release and cannot be verified from inside this repository. The102procedures here answer the question for whatever version you are actually running, which is103the only version that matters.