Skip to content

Claude/app database inconsistencies nj0kqk#7424

Closed
fmoraldo-mithraw wants to merge 345 commits into
BSData:mainfrom
fmoraldo-mithraw:claude/app-database-inconsistencies-nj0kqk
Closed

Claude/app database inconsistencies nj0kqk#7424
fmoraldo-mithraw wants to merge 345 commits into
BSData:mainfrom
fmoraldo-mithraw:claude/app-database-inconsistencies-nj0kqk

Conversation

@fmoraldo-mithraw

Copy link
Copy Markdown

No description provided.

claude and others added 30 commits June 9, 2026 17:37
Diff-checked: Memnyr Strategist Predictive Guidance, Uthar the Destined
Ancestral Fortune.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
…Greater Good

Updated the shared faction-rule definitions to v1.0 (diff-checked).
Aeldari 'Star Engines' and GSC 'Cult Ambush' already matched the pack.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Necrons (Chronomancer, Geomancer, Orikan, Plasmancer, Psychomancer,
Technomancer) and Genestealer Cults (Biophagus, Clamavus, Locus, Nexos):
removed Leader core ability + attachment profile, added Support.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
…acities

- Night Scythe: M -> 14", removed AIRCRAFT keyword.
- Transport capacity rewrites: Falcon (Aeldari), Sagitaur (Votann),
  Stompa (Orks). Battlewagon already matched.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
…eams

- New Smoke category + SMOKE keyword on Psychophage.
- Night Scythe: added Hover core ability + Invasion Beams embark clause
  (Deep Strike already present).
(Annihilation Protocol & Hyperphasing already matched v1.0.)

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
… factions)

New 'Force Disposition' profileType in the game system (.gst) + a Force
Disposition profile on each detachment selectionEntry holding its value
(Take and Hold / Purge the Foe / Disruption / Reconnaissance / Priority
Assets). Covers Space Marines (+DA/BA/SW/BT/DW), Grey Knights, Orks,
Aeldari, Drukhari, Tyranids, Genestealer Cults, Necrons, Votann, T'au.
Boarding Actions detachments (no disposition) left untouched.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Add Force Disposition to every matched-play detachment (145 across 14…
Every enhancement added with the faction packs (SM/DA/BA/SW/BT, GK and
the 8 xenos factions) is now wired to the units its rules text names,
resolved by keyword conjunction (e.g. 'KROOT SHAPER model only' = units
having both the KROOT and SHAPER keywords -> Kroot Flesh/Trail/War
Shaper). ~60 enhancements moved out of the generic character menu into
shared entries with detachment-gated entryLinks on each matching
datasheet (Enhancement category kept for the army cap of 4; 'excluding'
clauses and Epic Hero exclusion honoured; Legends/Crucible sheets
skipped).

Also:
- dedupe the duplicated 'Benediction of Fury' (Wrathful Procession)
- extend Fulguris SPEEDER pair to Land Speeder Vengeance, Argent Assault
  pair to the GK Terminator characters (squads kept), Death in the Dark
  to Phobos characters/Wolf Scouts/Spectrus Kill Team
- fix missed T'au v1.0 texts: Experimental Prototype Cadre x3 (now
  BATTLESUIT model) and Admired Leader
- prune the 28 menu groups left empty; faction-wide bearers (e.g.
  'ADEPTUS ASTARTES model only') stay in the character menu

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Re-target all recently added enhancements to their actual bearers
…rence

- Orks.cat: delete the orphaned 'Runtherd' shared model entry (11e
  Gretchin datasheet has no Runtherd; nothing referenced any of its 17
  internal ids).
- Quartermaster Cadre Squad [Legends] (Astra Militarum Library): drop
  the 'Infantry Squad' bullet from its Leader list - that datasheet no
  longer exists. The other listed units (Death Korps of Krieg, Death
  Korps Grenadier Squad [Legends], Krieg Combat Engineers) all exist.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Data hygiene: remove orphan Runtherd entry + dead Infantry Squad refe…
…s = non-Epic characters

- Upgrade-named enhancements (36): removed army-uniqueness (roster/force
  max-1 constraints and self-hide modifiers) so they can be taken
  multiple times, bounded by the army cap of 4 (Enhancement category);
  still max 1 per unit via the per-datasheet link group; keyword-matched
  targets now include Epic Hero units when keywords match (e.g. Dead
  Shiny Shootas -> + Ghazghkull, Boss Snikrot, Zodgrod).
- Renamed 16 unit-bearer enhancements to carry the pack 'Upgrade'
  suffix (Dead Shiny Shootas [pack-confirmed], Necrons x5, Votann x4,
  GK x4, SM x7 incl. Bellicose Weapon Spirits, Death in the Dark,
  Petition/Entreaty, Fervent Exemplars, Inheritors of Sigismund) with
  entryLink names updated.
- Non-Upgrade enhancements: non-Epic CHARACTERS only - removed the
  Argent Assault squad links (Psychic Celerity / Vigilance of Titan now
  on the 4 GK Terminator characters only) and pruned emptied groups.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Final enhancement rule: 'Upgrade' = unit-attached & repeatable; other…
…elerity & Vigilance of Titan

The GK central Enhancements menu referenced both via entryLinks (a menu
shape the earlier prune missed), so any GK character could still take
them. They are now reachable only through their 4 Terminator character
datasheets (Brother-Captain, Brotherhood Chaplain, Brotherhood
Librarian, Grand Master). Also pruned 4 menu groups left empty by the
earlier moves (Armoured Warhost, Argent Assault, Warrior Bioform
Onslaught, More Dakka!). Repo-wide sweep confirms no other attached
enhancement is still menu-linked (89 checked).

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
GK Argent Assault: remove leftover character-menu links for Psychic C…
Removed every enhancement->Epic-Hero entryLink (4 total): Dead Shiny
Shootas Upgrade no longer reaches Boss Snikrot / Ghazghkull / Zodgrod
(added before this rule existed), and Thundercowl Turbines drops Sammael.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Nightforged Battery, Thundercowl Turbines (Dark Angels) and Fierce
Example (Space Wolves) target a non-character UNIT in their rules text
but lacked the 'Upgrade' name. Renamed to '... Upgrade' (entry, profile,
all entryLinks), dropped army-uniqueness so they are repeatable under the
cap of 4, kept their unit attachments. Full audit of all 887 enhancement
entries now reports zero rule violations.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
… of 4

- Merged duplicated container blocks repo-wide (the Orks central group
  declared its constraints in two <constraints> blocks; ~22 groups had
  two <modifiers> blocks, 4 GK entries two <categoryLinks>) - some
  parsers only read the first block, hiding half the rules.
- One army cap per central Enhancements menu: the legacy GW max-3
  (roster/force) constraint is now THE cap at max 4 roster (keeping its
  id so the Boarding Actions 'set -1' modifier still works); the
  redundant max-4 force constraint added alongside it is removed.
  Per-character 'max 1 self/parent' kept unchanged.
- Added the Enhancement categoryLink to the 21 central menu groups that
  lacked it (SM already had it): menu picks now count toward the global
  roster cap of 4 together with unit-attached Upgrades.
- Epic Hero hide-gate verified present on all central menus.
- Full rule audit: 887 enhancement entries, 0 violations.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
… Yriel

The Eldritch Raiders enhancement 'Pirate Prince' names Prince Yriel (an
Epic Hero) as its only bearer in its rules text; the Epic menu lock made
it unusable. Per explicit decision it is now the single allowed
exception to the no-Epic rule: moved out of the character menu into a
shared entry and attached to the Prince Yriel datasheet via an Eldritch
Raiders-gated group (unique, Enhancement category for the cap of 4).
Kharseth is named by no enhancement and stays Epic-locked.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Per decision, the flagged GW-design cases are sanctioned exceptions and
now use the explicit per-datasheet attachment pattern (what the app
reads as bearers), since their prose targets keywords granted at
muster time and the menu offered no resolvable bearer:

- Aeldari Corsair Enhancements (Veterans of the Void): Alacritous
  Assault, Exotic Munitions, Adrenal Infusions (Eldritch Raiders) and
  Infamy, Webway Pathstone, Archraider, Voidstone (Corsair Coterie)
  attached to the Anhrathe units (incl. Legends bands and the two Epic
  Heroes Prince Yriel & Kharseth - named exception), det-gated; their
  central-menu links removed.
- Astra Militarum: Steel Hammer (Battalion Commander, Titan Killer ->
  TITANIC; Assault Hatches -> TITANIC TRANSPORT) and Hammer of the
  Emperor (Indomitable Steed, Calm Under Fire, Veteran Crew, Regimental
  Banner) attached to the exact super-heavy set that previously linked
  the menu (incl. Legends); menu links removed.
- Chaos Knights left as-is: War Dogs can be NAMED characters (runtime
  keyword grant) and CK enhancements carry no bearer prose - the menu
  links are the correct encoding there.

All moved entries keep/gain uniqueness (max 1 roster) and the
Enhancement category (army cap of 4).

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Captures the workflow for future packs: tooling (editor/lib), detachment
data model, the Upgrade rule (name 'Upgrade' = unit-attached + repeatable
+ never Epic; others = non-Epic characters only), keyword bearer
resolution, the central-menu invariants, known pitfalls (selfClose,
duplicated blocks, dup-id, typographic apostrophes), constants, and the
mandatory validation/AskUserQuestion gates.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Root CLAUDE.md is auto-loaded at session start: points to
editor/FACTION_PACK_PROMPT.md and pins the house rules (Upgrade rule,
keyword bearer resolution, DP + Force Disposition, mandatory
validation). editor/README.md now links the prompt up top.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
… factions)

CSM, World Eaters, Emperor's Children, Death Guard, Thousand Sons, Chaos
Knights, Chaos Daemons - per the v1.0 tables. The 17 new detachments
will receive theirs at creation.

https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Add the 3 new detachments with pack-exact rules + enhancements, DP and
Force Disposition per the pack:

- Brazen Engines (Rampaging Terrors / Purge the Foe / 1DP) with unit
  upgrades Talons of Butchery (Maulerfiend) and Murder-Forged Entity
  (World Eaters Vehicle).
- Butchers of Khorne (Adamantine Avalanche / Disruption / 1DP) with
  unit upgrades Sanctified in Slaughter and Gore-Stained Veterans
  (Terminator Squad).
- Vessels of Wrath: reconcile the pre-v1.0 stub to the pack — rewrite
  Wrath of Khorne, Archslaughterer and Gateways to Glory to v1.0; drop
  the non-pack stub enhancements Vox-Diabolus and Avenger's Crown.

Unit upgrades follow the house rule: shared entries wired to bearers by
keyword, Enhancement cap category, repeatable, never on an Epic Hero.
Validated: xmllint, catalog.validate ok (0 error), 0 new duplicate ids.
- Contagion Engines (Warped and Rusted Animus / Purge the Foe / 1DP)
  with unit upgrades Parasitic Woe-Reaper (Contagion Engine units) and
  Lancet of the Worldsore (Helbrute / Myphitic Blight-hauler).
- Paragons of Putrescence (Hypervirulent Strains / Priority Assets /
  1DP) with character enhancements Rejuvenating Swarm and Host of the
  Hybridised Pox (Death Guard Infantry characters).
- Flyblown Host: reconcile the pre-v1.0 stub to the pack — refresh
  Verminous Haze, rebuild Insectile Murmuration and Plagueveil as Plague
  Marines unit upgrades; drop the non-pack stub entries (Droning Chorus,
  and the mis-assigned Rejuvenating Swarm now correctly under Paragons).

Validated: xmllint, catalog.validate ok (0 error), duplicate-id groups
unchanged vs HEAD, Upgrade audit clean (cumulable, capped, no Epic).
fmoraldo-mithraw and others added 18 commits June 23, 2026 14:37
Imperial Agents: price psycannon (+5) and twin multi-melta (+15)
Kravek Morne (Epic Hero, eec8-c21f-c284-a682) had no <costs> element at all;
the MFM lists it at 120 pts. Add the pts cost. Found via a full MFM-vs-data
base-points / size-tier / repeat-cost audit — the only genuine points gap.

xmllint OK, catalog.validate 0 error.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
CSM: add missing points cost to Kravek Morne (120 pts)
…tion)

Detachment DP costs vary by sub-chapter in the MFM, but the shared detachments
in Space Marines.cat carried a single DP value. Add chapter-cost-style overrides
(set DP modifier conditioned on primary-catalogue), keeping the base unchanged:

- Stormlance Task Force (base 3 DP) -> 2 DP for Black Templars, Blood Angels,
  Deathwatch (Dark Angels / Space Wolves stay 3).
- Bastion Task Force (base 2 DP) -> 3 DP for Black Templars (others stay 2).

Same mechanism as unit chapter-cost (MARINE_CHAPTER_COST_APP_PROMPT.md), applied
to the DP field. Derived from the per-chapter detachment list (5 chapters).
xmllint OK, catalog.validate 0 error.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Note in MARINE_CHAPTER_COST_APP_PROMPT.md that shared detachment DP costs also
vary by sub-chapter via the same primary-catalogue set-modifier (field = DP
typeId), so a consuming app evaluating cost modifiers generically handles it
with no special logic.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Add DETACHMENT_DP_APP_PROMPT.md. Shared Space Marine detachments carry a base DP
cost plus primary-catalogue-conditioned `set` modifiers on the DP cost type
(0d99-4ee2-7b3c-1f5a) — same mechanism as unit chapter-cost but on the DP field.
The app must evaluate DP like any cost type (apply the set when the roster's
primary chapter matches), not special-case pts only. Examples: Stormlance 3->2
for BT/BA/DW, Bastion 2->3 for BT. Data is correct; app-side eval only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
…ot 2 smash)

The Boss Nob "Wargear Options" group is min=2/max=2 with Rokkit pistol {min=1,
max=2} and Smash hammer {max=1} — so 2 smash hammers is already illegal in data.
But neither option had a defaultAmount, so the app guessed the default wrong
(2 smash hammers, violating smash max=1 and rokkit min=1). Add defaultAmount=1 to
both so the default loadout is 1 rokkit pistol + 1 smash hammer, matching the
datasheet ("equipped with: rokkit pistol; smash hammer; choppa"). Replacing the
smash hammer still gives 2 rokkit pistols.

xmllint OK, catalog.validate 0 error.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Scan of all min>=2 count-based weapon groups without an explicit default found
only these two (Legends Ork walkers): "Wargear Options" min=2/max=2 over Dread
killsaw / Killkannon / Dread rippa klaw (all free, max=2 each), no defaultAmount,
so the app guesses 2 of 3. Add defaultAmount=1 to killsaw + rippa klaw (two
close-combat arms) so the default is a valid 2-weapon loadout. Best-effort
default for Legends units; adjust if the official loadout differs.

(The Deathwatch Fortis "Squad Members" group flagged by the scan is a model-
composition group, not weapons — false positive, left as-is.)

xmllint OK, catalog.validate 0 error.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
… groups

Mandatory single-choice weapon groups (min>=1/max=1, >=2 weapon options) that had
no defaultSelectionEntryId, no defaultAmount and no min-forced option -> the app
had to guess which weapon to show (often nothing / wrong). Add
defaultSelectionEntryId pointing to a sensible standard weapon per group, picked
by a "basic weapon first" heuristic (bolt/heavy-bolt pistol, chainsword, flamer,
heavy bolter...), skipping combined-loadout options.

50 groups across 13 files (SM + chapters, CSM/EC/WE, GSC, Aeldari, AM, Agents,
Votann). All weapons are free, so this changes only the default shown, not points.
Pure attribute additions; xmllint OK, catalog.validate 0 error, 0 gaps remaining.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
Set default weapon (defaultSelectionEntryId) on 50 single-pick weapon…
…, etc.)

Count-based weapon groups (min=max=N>=2) that named a default weapon via
defaultSelectionEntryId but had no defaultAmount: the app knew WHICH weapon was
default but not HOW MANY (N), so it showed no weapons. Add defaultAmount=N to the
default option on 15 such groups, incl. Drukhari Ravager (3x Dark Lance),
Wraithlord, Telemon/Achillus/Contemptor/Leviathan/Decimator dreadnoughts, Chaos
Acastus Porphyrion, Hekaton Land Fortress, Warlord Titan, Grot Tank, etc.

Also fixed Tankbustas Boss Nob: its defaultSelectionEntryId was dangling (pointed
to a non-existent id); repoint to Rokkit pistol and set defaultAmount=1 on rokkit
pistol + smash hammer (default 1+1, not 2 smash) like the Breaka Boyz Boss Nob.

xmllint OK, catalog.validate 0 error.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
…ups)

Add DEFAULT_LOADOUT_APP_PROMPT.md. The app failed to show a model's weapons
(e.g. Ravager's 3 dark lances) because the default loadout includes count-based
weapon groups (min=N) it didn't auto-fill. Document: always-on min>=1 weapons +
fill each count group to N using defaultAmount (per-option counts), else
defaultSelectionEntryId x min, else first option x min — never leave a min=N slot
empty. Data is correct; app-side display/eval only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014YbxbnBDLLS42pVZJygRgE
§4 décrivait l'entrée scindée `(additional)` comme « encodage confirmé »,
alors qu'elle est abandonnée (CLAUDE.md règle #5) au profit du modifier de
coût `increment` + marqueur `repeat-cost: threshold=N delta=Δ`. Ajout d'un
bandeau de dépréciation renvoyant vers REPEAT_COST_APP_PROMPT.md ; la
description de l'ancien encodage est conservée uniquement pour reconnaître
d'éventuelles jumelles résiduelles.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H91iCeAmyQaQemrLgvLLyy
Matérialise les bonus offensifs de capacités/datasheet en marqueurs
déclaratifs <comment>sim-mod: …</comment> (1er enfant de la selectionEntry),
lus par le simulateur de dégâts de l'appli pour les proposer en bascule.

- Castellan Crowe : Champion of the Order of Purifiers (+1 A à Purifying
  Flame en menant) + Foesight (relance touche vs Character).
- Grand Master : Might of Titan (1×/bataille, +3 A & +3 S en mêlée).
- Brother-Captain : Hammerhand (Lethal Hits en mêlée en menant).

Documente la convention dans editor/SIM_MOD_APP_PROMPT.md + index CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H91iCeAmyQaQemrLgvLLyy
Met à jour SIM_MOD_APP_PROMPT.md : un effet weapon="…" ne touche que les
profils correspondants via une surcouche par arme passée au moteur, et
l'appli peint en vert les valeurs déplacées par un bonus actif. Remplace
l'ancienne « limite connue » (repli global).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H91iCeAmyQaQemrLgvLLyy
claude added 2 commits June 29, 2026 20:09
Boons of Deimos Upgrade (Purgation Squad) : +2 S aux attaques de tir →
sim-mod: source="Boons of Deimos" str=+2 when=ranged. Premier marqueur
sur une amélioration (le simulateur ne l'expose que si elle est prise).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H91iCeAmyQaQemrLgvLLyy
…ensives

Encodage de masse des bonus offensifs modélisables par le simulateur de
dégâts, sur 36 catalogues : 883 entrées (capacités de datasheet + entrées
d'amélioration) portant 1198 lignes sim-mod, qui se résolvent en ~2926
unités + 333 améliorations une fois l'import inter-catalogues appliqué.

Couvre : +A/+S/+PA/+D, +touche/+blessure, Sustained/Lethal/Dev/Anti/
Twin-linked/ignore-couvert, seuils de critique, relances touche/blessure/
dégâts. Portée par arme (weapon="…"), mêlée/tir (when=), et conditions
vs=/oncePer=/onCharge/whileLeading + flag générique `conditional` pour les
déclencheurs situationnels (décochés par défaut). Auras vers d'autres unités,
debuffs ennemis, défensif, valeurs absolues et règles d'armée écartés.

Marqueurs posés en 1er enfant <comment>, fusionnés avec les marqueurs
existants (repeat-cost/chapter-cost/leader-link préservés). Validé :
xmllint, catalog.validate (0 erreur), 0 id dupliqué introduit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H91iCeAmyQaQemrLgvLLyy
@Dunamis55

Copy link
Copy Markdown
Contributor

Please do not submit unrequested pull requests.

@Dunamis55 Dunamis55 closed this Jun 29, 2026
@TBarker746

Copy link
Copy Markdown
Collaborator

As an addendum to the above, this is not the dataset for 11th Edition. That dataset will hopefully release later this week; this dataset will be retained as a legacy builder for those who wish to continue playing games of 10th Edition.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants