You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 24f5a1d
Browse filesBrowse the repository at this point in the historyBrowse files
No enchantment row lists a tag twice; a test refuses a repeated tag in any data table (#1823)
No enchantment row lists a tag twice, and a test now refuses a repeated tag in any data table (#1823).
**The fault.** Five rows on the workbook's Enchantments sheet repeated a tag in their Tags cell:
| Cell | Row | Before |
|---|---|---|
| I5 | Negative_Ultimate_cooldowns_increased_by_100_500 | "Slot.Ultimate, Slot.Ultimate" |
| I167 | Negative_Movement_abilities_have_50_increased_cooldown | "Slot.Movement, Slot.Movement" |
| I182 | Negative_After_you_use_a_movement_ability_you_lose_50_mo | "Slot.Movement, Slot.Movement, Stat.Utility.Movespeed" |
| I193 | Negative_Your_own_ultimate_ability_is_disabled | "Slot.Ultimate, Slot.Ultimate" |
| D378 | Positive_Warlord_s_Will_10_Piece_Bonus_Every_30_second | "Stat.Utility.Movespeed, Slot.Movement, Slot.Movement, Keyword.Consume" |
**Nothing changes in play.** The issue said the second copy is dropped on import. It is not: `FCataclysmEnchantmentRow::Tags` is a plain FString. Its one game reader, `UCataclysmDropRoll::EnchantmentSuitsSlot`, looks only for `Item.Slot.` tags and skips these, and a repeat would give the same answer anyway. Scoping uses the effect rows' RequiredTags, which have no repeats.
**The change:**
- `docs/All_Things_Cataclysm.xlsx`, five cells under the coordinator's grant: the second copy removed, order kept. That regenerates five lines, the Tags field only: `EnchantmentsNegative.csv` 5, 167, 182, 193 and `EnchantmentsPositive.csv` 377. `DT_EnchantmentsNegative` and `DT_EnchantmentsPositive` were rebuilt.
- New `tools/tests/test_no_tag_column_repeats_a_tag.py` (coordinator ruling: a test, not a refusal in the generator). It scans every column whose name contains "tag" in every CSV under `game/Data`, and names the table, column, row and repeated tag. A scope test asserts the six columns it must find, so a rename cannot make it read nothing. Eight columns in eight tables are scanned today.
- No C++ change.
**Proof:** `prove_guard` in a git-archive copy, with Negative line 5's repeat put back: `PROVED: 1 failed, 2 passed | restored: 3 passed`; the named failure is `test_no_row_lists_a_tag_twice`. On the tree before the edit, the test failed naming exactly the five rows.
**Evidence (window enchant-t183w, 2026-10-28, at abcd2e5 on development db73850)**
| Step | Registered | Printed |
|---|---|---|
| Free memory just before the lock | at least 10,240 MB | 11,233 MB |
| Asset rebuild | exactly the two enchantment assets and the sources record | exactly those three; committed 36908a5 |
| Whole Unreal suite | 4343 / 0 (no new Unreal test) | `4343 tests performed, 4343 succeeded, 0 failed`; declared 4343, gap 0 |
| Memory | below 9,500 MB | `final_used_virtual_mb=7772`, peak 8,107 MB |
| Python (JUnit) | 7023 (7020 + 3 new), 0 failures | 7023 / 0 / 0 / 8; ruff `All checks passed!` |
After the tested commit only the asset commit and `docs/DECISIONS.md` changed (`git diff --name-only abcd2e5fd9ffaa`).
Closes#1823 (closed by hand after the merge).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
### JUDGEMENTS OF MY OWN, WITH THE OPTION NOT TAKEN
72
+
73
+
- **The scan reads the generated CSVs, not the workbook**, because the CSVs are what the game reads and every tag
74
+
column reaches one. Not taken: reading the sheets, whose column layout differs per sheet.
75
+
- **A column is a tag column when its name contains "tag"**, which today finds eight columns in eight tables. Not
76
+
taken: a fixed list, which a new table would escape.
77
+
78
+
### NO GENRE SOURCE
79
+
80
+
None. This is authoring hygiene, not a mechanic.
81
+
82
+
### FOR THE OWNER'S PLAY-CHECK LIST
83
+
84
+
- Nothing to see: no enchantment behaves differently.
85
+
86
+
### THE WINDOW'S RUN, t183w
87
+
88
+
Window t183w, run 2026-10-28 under the lock as `enchant-t183w`, at `abcd2e564` on development `db73850a7` (moved from
89
+
`285fae4ce` on `e0351fdcd` as `fix/no-tag-twice-in-an-enchantment-1`; the workbook blob, the zero-context patch ids of
90
+
the CSVs and the test file, and the hash of this file's changed lines matched for all three commits). Free memory
91
+
immediately before the lock, at 13:39:39, was 11,233 MB, against the floor of 10 GiB (10,240 MB). No C++ changed, so
92
+
no new Unreal test and no C++ proof. Every step exited 0:
93
+
94
+
| Step | Result |
95
+
|---|---|
96
+
| The build | "35 actions, 32 files compiled" (development's own C++ from #2540, not yet built in this worktree) |
97
+
| The DataTable assets | exactly `DT_EnchantmentsNegative.uasset`, `DT_EnchantmentsPositive.uasset` and `datatable_asset_sources.json` changed; committed as `36908a535` |
98
+
| The whole Unreal suite | "4343 tests performed, 4343 succeeded, 0 failed"; 4343 declared, gap 0 |
| Python of record | "7015 passed, 8 skipped"; JUnit 7023 tests, 0 failures, 0 errors, 8 skipped (the asset-hash test passes after the asset commit); ruff "All checks passed!" |
101
+
102
+
---
103
+
5
104
## 2026-10-28 — A thrall explodes under Every One Bursts: 3 m, three of its own blows, raised by Volatile (#2540)
6
105
7
106
**Affects:** `CataclysmMinion.h` and `.cpp` (`ThrallExplosionDamage`, `ThrallBurst` and two constants),
Negative_Can_t_use_a_basic_attack,Can’t use a basic attack,Generic,0.0,Scope.BasicOnly,True,
3
3
Negative_80_99_of_your_health_is_reserved,80%-99% of your health is reserved,Generic,1.0,Stat.Defense.Life,True,
4
4
Negative_You_lose_1_4_max_resistances_for_every_100_000,"You lose 1-4% max resistances for every 100,000 - 500,000 kills",Generic,3.0,Stat.Defense.Resist,True,2
5
-
Negative_Ultimate_cooldowns_increased_by_100_500,Ultimate cooldowns increased by 100%-500%,Generic,2.0,"Slot.Ultimate, Slot.Ultimate",True,
5
+
Negative_Ultimate_cooldowns_increased_by_100_500,Ultimate cooldowns increased by 100%-500%,Generic,2.0,Slot.Ultimate,True,
6
6
Negative_You_have_no_armor,You have no armor,Generic,1.0,Stat.Defense.Armor,True,
7
7
Negative_DoTs_deal_double_damage_to_you,DoTs deal double damage to you,Generic,2.0,Keyword.DoT.Generic,True,
8
8
Negative_You_lose_15_of_your_max_hp_every_5_seconds,You lose 15% of your max hp every 5 seconds,Generic,1.0,Stat.Defense.Life,True,
Negative_You_have_25_50_less_crit_chance,You have 25%-50% less crit chance,Generic,3.0,Stat.Offense.Crit,True,
165
165
Negative_Energy_shield_can_now_be_effected_by_bleed,Energy shield can now be effected by bleed,Generic,4.0,"Stat.Defense.EnergyShield, Keyword.DoT.Bleed",True,
Negative_Movement_abilities_have_50_increased_cooldown,Movement abilities have 50% increased cooldown,Generic,4.0,"Slot.Movement, Slot.Movement",True,
167
+
Negative_Movement_abilities_have_50_increased_cooldown,Movement abilities have 50% increased cooldown,Generic,4.0,Slot.Movement,True,
168
168
Negative_Movement_abilities_cost_20_50_of_your_maximum,Movement abilities cost 20%-50% of your maximum mana,Generic,4.0,"Slot.Movement, Stat.Resource.Mana",True,
169
169
Negative_Cooldowns_are_increased_by_30_50,Cooldowns are increased by 30%-50%,Generic,3.0,Scope.Global,True,
170
170
Negative_You_take_10_20_of_the_damage_you_reflect,You take 10%-20% of the damage you reflect,Generic,4.0,,True,
Negative_You_have_10_20_less_chance_to_evade,You have 10%-20% less chance to evade,Generic,4.0,Stat.Defense.Evasion,True,
182
-
Negative_After_you_use_a_movement_ability_you_lose_50_mo,After you use a movement ability you lose 50% movespeed for 3 seconds,Generic,4.0,"Slot.Movement, Slot.Movement, Stat.Utility.Movespeed",True,
182
+
Negative_After_you_use_a_movement_ability_you_lose_50_mo,After you use a movement ability you lose 50% movespeed for 3 seconds,Generic,4.0,"Slot.Movement, Stat.Utility.Movespeed",True,
183
183
Negative_Ranged_skills_have_20_35_reduced_projectile_sp,Ranged skills have 20%-35% reduced projectile speed,Generic,4.0,"Type.Ranged, Type.Projectile",True,
184
184
Negative_Your_movement_speed_is_reduced_by_10,Your movement speed is reduced by 10%,Set,5.0,Stat.Utility.Movespeed,True,
185
185
Negative_Minion_maximum_health_is_reduced_by_50,Minion maximum health is reduced by 50%,Set,6.0,Stat.Defense.Life,True,
@@ -190,7 +190,7 @@ Negative_Melee_damage_is_reduced_by_50,Melee damage is reduced by 50%,Set,10.0,T
190
190
Negative_Ranged_attacks_deal_20_more_damage_to_you,Ranged attacks deal 20% more damage to you,Set,11.0,Type.Projectile,True,
191
191
Negative_Your_direct_damage_is_reduced_by_25,Your direct damage is reduced by 25%,Set,12.0,,True,
192
192
Negative_You_have_no_health_mana_es_regen,You have no health/mana/es regen,Set,13.0,"Stat.Recovery.Regen, Stat.Resource.Mana, Stat.Defense.EnergyShield",True,
193
-
Negative_Your_own_ultimate_ability_is_disabled,Your own ultimate ability is disabled,Set,14.0,"Slot.Ultimate, Slot.Ultimate",True,
193
+
Negative_Your_own_ultimate_ability_is_disabled,Your own ultimate ability is disabled,Set,14.0,Slot.Ultimate,True,
194
194
Negative_Your_health_is_reduced_by_10,Your health is reduced by 10%,Set,16.0,Stat.Defense.Life,True,
195
195
Negative_Your_movement_speed_is_reduced_by_10_1,Your movement speed is reduced by 10%,Set,17.0,Stat.Utility.Movespeed,True,
196
196
Negative_All_of_your_life_regeneration_effects_are_reduce,All of your life regeneration effects are reduced by 50%,Set,18.0,,True,
Positive_Divine_Retribution_10_Piece_Bonus_Every_5_sec,"Divine Retribution (10-Piece Bonus): Every 5 seconds, you gain a stack of 'Sanctified Power.' When you block an attack, you consume all stacks of 'Sanctified Power' and all of your skills are instantly refreshed. The bonus is permanent for the rest of the dungeon",Set,16.0,"Stat.Defense.Block, Keyword.Consume, Trigger.OnBlock",False,
375
375
Positive_Warlord_s_Will_2_Piece_Bonus_Your_armor_is_in,Warlord's Will (2-Piece Bonus): Your armor is increased by 25%,Set,17.0,Stat.Defense.Armor,False,
376
376
Positive_Warlord_s_Will_6_Piece_Bonus_When_you_take_da,"Warlord's Will (6-Piece Bonus): When you take damage, you have a 10% chance to summon a ""Warhound"" to fight for you for a short duration. The Warhound taunts enemies and deals damage based on your armor",Set,17.0,"Type.Minion, Stat.Defense.Armor",False,
377
-
Positive_Warlord_s_Will_10_Piece_Bonus_Every_30_second,"Warlord's Will (10-Piece Bonus): Every 30 seconds, you gain a stack of 'Tactical Advantage.' When you use a movement ability, you consume all stacks of 'Tactical Advantage' and gain 100% more movement speed and 50% more damage for 5 seconds. This bonus scales with the number of enemies in the area: 10% more damage for each enemy within 8 meters, up to 5.",Set,17.0,"Stat.Utility.Movespeed, Slot.Movement, Slot.Movement, Keyword.Consume",False,
377
+
Positive_Warlord_s_Will_10_Piece_Bonus_Every_30_second,"Warlord's Will (10-Piece Bonus): Every 30 seconds, you gain a stack of 'Tactical Advantage.' When you use a movement ability, you consume all stacks of 'Tactical Advantage' and gain 100% more movement speed and 50% more damage for 5 seconds. This bonus scales with the number of enemies in the area: 10% more damage for each enemy within 8 meters, up to 5.",Set,17.0,"Stat.Utility.Movespeed, Slot.Movement, Keyword.Consume",False,
378
378
Positive_Reaper_s_Embrace_2_Piece_Bonus_You_gain_10_m,Reaper's Embrace (2-Piece Bonus): You gain 10% more life from all sources,Set,18.0,Stat.Defense.Life,False,
379
379
Positive_Reaper_s_Embrace_6_Piece_Bonus_When_a_minion,"Reaper's Embrace (6-Piece Bonus): When a minion or pet dies, it leaves behind a ""Soul"" that can be picked up. Picking up a Soul grants a stack of Soul Strike that increases your damage by 10% for 5 seconds. Max 10 stacks.",Set,18.0,Type.Minion,False,
380
380
Positive_Reaper_s_Embrace_10_Piece_Bonus_For_each_stac,"Reaper's Embrace (10-Piece Bonus): For each stack of Soul Strike you gain 5% cull on hit. Killing an enemy instanly spawns one of your minions, up to your max",Set,18.0,Type.Minion,False,
0 commit comments