Source/Core/AkronFeatureRegistry.cs.
Status Categories
Do not introduce new policy words. Akron does not use Yellow, Practice, or a separate room-lab clear category.
AkronStatus order matters because attempt status escalates by enum value:
Classification Flow
Suboptions
Classify the smallest meaningful behavior. A parent row can be clean while a tooltip suboption is Cheat. Examples:- Safe Mode can be clean while stat-freeze suboptions are Cheat.
- Room or map capture can be clean while a timer-freeze suboption is Cheat.
- Input history can be Goldberry/Hardlist clear while extra history review options are Normal clear.
- If the row maps to an
AkronFeatureKind, classify it inDefinitions. - If the row has no
AkronFeatureKind, add it toUiLabelClassifications. - If a tooltip suboption differs from the parent, add it to
UiSuboptionClassifications. - Add or update tests in
tests/feature-registry-tests.cs.
Feature Shape
Pick the row type based on how the user interacts with it.
Configuration values should not activate a feature by themselves. For example, if a sound override volume is set to
150 but the per-sound modifier is off, the live game should use vanilla sound volume.
Classification Examples
Enforcement
Policy is enforced through:Source/Core/AkronFeatureRegistry.csfor classifications and reasons.- UI label and suboption classification maps.
- Runtime calls that use
TryUseorCanUse. - Feature registry tests.
- Clean vs cheat classifications.
Writing Policy Reasons
Good reasons say what behavior affects policy:Displays local inputs without changing gameplay.Changes simulation cadence and gameplay timing.Draws hidden trigger volumes for map inspection.
Tooltip Writing
Tooltips should describe what the feature does. They should not justify why a player might use it. Good tooltip style:- Say what changes when the option is enabled.
- Mention the affected state: gameplay, camera, proof, timer, save, audio, overlay, recording, or import/export.
- Keep it concrete and short.
- For dangerous options, name the risk plainly.
- Do not repeat policy badge text manually. The UI owns policy display.
- Do not say a feature is “for practice”, “for cheating”, or “safe” as the main explanation.
- Do not imply configuration is active when the parent toggle is off.
Prefer concrete verbs such as show, hide, dim, mute, route, export, import, record, set, clear, save, load, reset, apply, reduce, skip, clamp, cache, and filter.
Feature Registry Checklist
When adding or changing a policy-visible feature:- Decide the smallest behavior unit that needs policy tracking.
- Add an
AkronFeatureKindonly if the behavior is a real policy unit reused by code or attempt tracking. - Add a
FeatureDefinitionwithGoldberryHardlistClean,RegularClean, orCheat. - Write the reason as a policy explanation, not a tooltip.
- If the UI row lacks
FeatureKind, addUiLabelClassificationscoverage. - If a popup suboption differs from the parent, add
UiSuboptionClassificationscoverage. - Add or update rows in
tests/feature-registry-tests.cs. - Run
dotnet test tests/akron-tests.csproj --nologo --filter FeatureRegistryTests.
- No
AkronStatus.Practice,QolSafe,CleanCaution, or Yellow category text was reintroduced. - Every
AkronFeatureKindhas aFeatureDefinition. - Every new row or suboption displays an accurate classification.
- Tooltip copy describes behavior and leaves classification formatting to the UI.
- The registry, tests, feature guide, and classification docs agree on the policy rule.