01-RecipeData Rev 6 (A4) added the field as a Summarize-branch
discriminator for module 02. Resolved as IsExpertRecipe OR the
output item's AlwaysCollectable flag, the latter being the canonical
FFXIV signal for collectable submissions (custom delivery, masterpiece
supply, collectables shop).
- AnvilRecipe.cs: new required bool property after CanHQ, with a
why-comment pointing at module 02's Summarize branch and noting
the OR-resolve.
- LuminaRecipeAdapter.cs: resolve folded into the recipe walk via
the same itemSheet.TryGetRow call that already fetches the
display name - no bootstrap-order question, no 2-pass needed.
hasOutputItem is hoisted so the OR-branch can guard against a
missing item-sheet row without touching the default(Item) struct.
- RecipeDataAdapterLoadStep.cs: new pass criterion #10 that asserts
at least one recipe surfaces IsCollectable == true. Catches a
silent resolve-path failure. Existing Cosmic-surface check shifts
to #11 to keep numbering stable.
Build clean (0/0), csharpier clean.
01-RecipeData Rev 6 (A1) added the field as the character-level
equivalent of a recipe's RecipeLevelTable, so module 02 can branch the
mod-penalty in BaseProgress and BaseQuality. The adapter resolves it
from the existing RecipeLevelTable.Value in the recipe walk.
- AnvilRecipe.cs: new required byte property after RecipeLevel, with
a why-comment that points consumers at module 02 and warns against
confusing the field with the row-id one above it.
- LuminaRecipeAdapter.cs: levelTable.ClassJobLevel assignment in the
Recipe walk - levelTable was already resolved earlier in the loop.
- RecipeDataAdapterLoadStep.cs: new pass criterion #9 that asserts at
least one recipe carries a positive RecipeLevelTableClassJobLevel.
Catches a silent RecipeLevelTable-walk failure that would otherwise
only surface inside the simulator. Existing Cosmic-surface check
shifted to #10 to keep the spec numbering stable.
Build clean (0/0), csharpier clean.
Splendorous-Tool-Bonus is character-equipment state, not recipe state.
The flag moved to the simulator's stats layer (CraftStats.HasSplendorousTool
in module 02) per the 01-RecipeData Rev 6 spec polish (A2).
- AnvilRecipe.cs: IsSplendorCosmic property removed. Cosmic doc-block
trimmed to four flags (IsCosmic + two MissionHas* + IsIshgardExpert)
and now points consumers at the stats-layer for the Splendor branch.
- LuminaRecipeAdapter.cs: assignment in the recipe walk removed.
ValidateCosmicInvariant drops the IsSplendorCosmic implication
(MissionHas* checks unchanged).
- ConditionMechanicsTable.cs: header comment rewritten to describe
Splendor as a stats-layer override rather than a recipe-flag override.
Sweep over Anvil/RecipeData/, Anvil/SelfTest/, Anvil/Hosting/,
Plugin.cs, and PluginHostFactory.cs: zero remaining references to
IsSplendorCosmic. Build clean (0/0), csharpier check clean.
Module 01 public-API surface: six sealed records with init-only
properties plus their nine enums. All BCL-only - no Lumina or Dalamud
types in any public property, which is what keeps the simulator and
catalog xUnit-testable per the Critical Boundary in 00-Anvil-Scope §3.3.
- AnvilRecipe + AnvilRecipeIngredient: flat representation of the
Recipe + RecipeLevelTable sheet pair with the five Cosmic-Exploration
flags. v0.1.0 ships with MissionHas* always false (SH-15 option B);
the schema stays in place so v0.2.0 can wire the WKS mission sheet
without touching the type.
- AnvilItem: slim per-recipe / per-food item view (full ~50k-row item
mirror is left to the UI layer).
- AnvilAction + AnvilActionKind + AnvilActionCategory + AnvilActionFlags:
one logical action per Kind value with RowIdByClassJob mapping; Cosmic
actions use ClassJobId 0 as the sentinel for "every crafter".
AnvilActionFlags bit 1 << 2 is intentionally vacant (ConsumesGreatStrides
was removed in spec rev 5; consumption logic lives in 02-CraftingSimulator).
- AnvilBuff + AnvilBuffKind + AnvilBuffBehavior + AnvilBuffCategory:
static buff catalog entry with the duration field that matches Behavior
(Steps / Seconds / Actions). Two Cosmic buffs (MaterialMiracleBuff,
StellarSteadyHandBuff).
- AnvilCondition + AnvilConditionKind: eleven conditions including the
Cosmic Robust variant. DisplayName comes from AnvilStrings.resx, not
Lumina (the Status sheet does not expose the crafting condition labels
cleanly).
- AnvilFood + AnvilFoodBonus + AnvilFoodKind + AnvilFoodStat: ItemFood
mirror with IsRelative flag (percentage vs flat bonus).