diff --git a/SVSim.Bootstrap/Importers/AchievementCatalogImporter.cs b/SVSim.Bootstrap/Importers/AchievementCatalogImporter.cs
index 1558a85..da327a4 100644
--- a/SVSim.Bootstrap/Importers/AchievementCatalogImporter.cs
+++ b/SVSim.Bootstrap/Importers/AchievementCatalogImporter.cs
@@ -53,7 +53,7 @@ public class AchievementCatalogImporter
{
Console.WriteLine($"[AchievementCatalogImporter] WARN: {unmappedTypes.Count} types " +
$"with no event_type: [{string.Join(", ", unmappedTypes.OrderBy(x => x))}] — " +
- "add to ACHIEVEMENT_EVENT_MAP in data_dumps/extract/extract-achievements.py");
+ "add to ACHIEVEMENT_EVENT_MAP in data_dumps/scripts/extract-achievements.py");
}
return created + updated;
}
diff --git a/SVSim.Bootstrap/Importers/BattlePassMonthlyMissionImporter.cs b/SVSim.Bootstrap/Importers/BattlePassMonthlyMissionImporter.cs
index 9f2bb9d..8986c15 100644
--- a/SVSim.Bootstrap/Importers/BattlePassMonthlyMissionImporter.cs
+++ b/SVSim.Bootstrap/Importers/BattlePassMonthlyMissionImporter.cs
@@ -54,7 +54,7 @@ public class BattlePassMonthlyMissionImporter
{
Console.WriteLine($"[BattlePassMonthlyMissionImporter] WARN: {unmapped.Count} rows " +
$"with no event_type: [{string.Join(", ", unmapped)}] — add name to " +
- "BP_MONTHLY_EVENT_MAP in data_dumps/extract/extract-bp-monthly-missions.py");
+ "BP_MONTHLY_EVENT_MAP in data_dumps/scripts/extract-bp-monthly-missions.py");
}
return created + updated;
}
diff --git a/SVSim.Bootstrap/Importers/ImporterBase.cs b/SVSim.Bootstrap/Importers/ImporterBase.cs
index 46bbbdf..08548b0 100644
--- a/SVSim.Bootstrap/Importers/ImporterBase.cs
+++ b/SVSim.Bootstrap/Importers/ImporterBase.cs
@@ -2,7 +2,7 @@ namespace SVSim.Bootstrap.Importers;
///
/// Tiny shared helper for content importers. Capture parsing has moved out of the bootstrap
-/// project entirely (extractors under data_dumps/extract/ emit per-table seed JSON);
+/// project entirely (extractors under data_dumps/scripts/ emit per-table seed JSON);
/// only the wire-date normaliser stays here because several seed-driven importers still need
/// to canonicalise prod-shaped timestamp strings.
///
diff --git a/SVSim.Bootstrap/Importers/ItemImporter.cs b/SVSim.Bootstrap/Importers/ItemImporter.cs
index 93da5fb..a353646 100644
--- a/SVSim.Bootstrap/Importers/ItemImporter.cs
+++ b/SVSim.Bootstrap/Importers/ItemImporter.cs
@@ -8,7 +8,7 @@ namespace SVSim.Bootstrap.Importers;
///
/// Idempotent upsert of the item catalog from seeds/items.json. Source is the client's
/// item_master.csv + itemtext.json (extracted via
-/// data_dumps/extract/extract-items.py). Rows missing from the seed are LEFT INTACT.
+/// data_dumps/scripts/extract-items.py). Rows missing from the seed are LEFT INTACT.
///
public class ItemImporter
{
diff --git a/SVSim.Bootstrap/Importers/ItemPurchaseImporter.cs b/SVSim.Bootstrap/Importers/ItemPurchaseImporter.cs
index d4b2ee3..574d71a 100644
--- a/SVSim.Bootstrap/Importers/ItemPurchaseImporter.cs
+++ b/SVSim.Bootstrap/Importers/ItemPurchaseImporter.cs
@@ -8,7 +8,7 @@ namespace SVSim.Bootstrap.Importers;
///
/// Idempotent upsert of the item-purchase catalog from seeds/item-purchase.json.
/// Source is the wire /item_purchase/info response, extracted via
-/// data_dumps/extract/extract-item-purchase.py. Rows missing from the seed are LEFT INTACT.
+/// data_dumps/scripts/extract-item-purchase.py. Rows missing from the seed are LEFT INTACT.
///
public class ItemPurchaseImporter
{
diff --git a/SVSim.Bootstrap/Importers/LeaderSkinShopImporter.cs b/SVSim.Bootstrap/Importers/LeaderSkinShopImporter.cs
index 5d0a880..9ccc5a2 100644
--- a/SVSim.Bootstrap/Importers/LeaderSkinShopImporter.cs
+++ b/SVSim.Bootstrap/Importers/LeaderSkinShopImporter.cs
@@ -9,7 +9,7 @@ namespace SVSim.Bootstrap.Importers;
/// Idempotent upsert of the leader-skin-shop catalog from seeds/leader-skin-shop.json.
/// Mirror of . Source is the wire
/// /leader_skin/products response, extracted via
-/// data_dumps/extract/extract-leader-skin-shop.py. Rows missing from the seed are LEFT INTACT.
+/// data_dumps/scripts/extract-leader-skin-shop.py. Rows missing from the seed are LEFT INTACT.
///
public class LeaderSkinShopImporter
{
diff --git a/SVSim.Bootstrap/Importers/MissionCatalogImporter.cs b/SVSim.Bootstrap/Importers/MissionCatalogImporter.cs
index ed7944b..036eb20 100644
--- a/SVSim.Bootstrap/Importers/MissionCatalogImporter.cs
+++ b/SVSim.Bootstrap/Importers/MissionCatalogImporter.cs
@@ -50,7 +50,7 @@ public class MissionCatalogImporter
{
Console.WriteLine($"[MissionCatalogImporter] WARN: {unmapped.Count} mission_ids with " +
$"no event_type: [{string.Join(", ", unmapped)}] — add to MISSION_EVENT_MAP " +
- "in data_dumps/extract/extract-missions.py and re-run the extractor");
+ "in data_dumps/scripts/extract-missions.py and re-run the extractor");
}
return created + updated;
}
diff --git a/SVSim.Bootstrap/Importers/SeedLoader.cs b/SVSim.Bootstrap/Importers/SeedLoader.cs
index ec343ed..6648193 100644
--- a/SVSim.Bootstrap/Importers/SeedLoader.cs
+++ b/SVSim.Bootstrap/Importers/SeedLoader.cs
@@ -5,7 +5,7 @@ namespace SVSim.Bootstrap.Importers;
///
/// Reads a JSON seed file under SVSim.Bootstrap/Data/seeds/. Replaces ImporterBase.LoadCapture.
-/// Files are produced by extractors in data_dumps/extract/; the bootstrap project does not
+/// Files are produced by extractors in data_dumps/scripts/; the bootstrap project does not
/// transform wire formats. Missing files are non-fatal (returns empty/null) — caller decides.
///
public static class SeedLoader
diff --git a/SVSim.Bootstrap/Importers/SleeveShopImporter.cs b/SVSim.Bootstrap/Importers/SleeveShopImporter.cs
index f2b9428..ee71026 100644
--- a/SVSim.Bootstrap/Importers/SleeveShopImporter.cs
+++ b/SVSim.Bootstrap/Importers/SleeveShopImporter.cs
@@ -8,7 +8,7 @@ namespace SVSim.Bootstrap.Importers;
///
/// Idempotent upsert of the sleeve-shop catalog from seeds/sleeve-shop.json.
/// Source is the wire /sleeve/info response, extracted via
-/// data_dumps/extract/extract-sleeve-shop.py. Mirror of the BuildDeck importer pattern.
+/// data_dumps/scripts/extract-sleeve-shop.py. Mirror of the BuildDeck importer pattern.
/// Rows missing from the seed are LEFT INTACT (so manual test fixtures survive re-runs).
///
public class SleeveShopImporter
diff --git a/SVSim.Bootstrap/Importers/SpotCardExchangeImporter.cs b/SVSim.Bootstrap/Importers/SpotCardExchangeImporter.cs
index 182fcf0..6b79082 100644
--- a/SVSim.Bootstrap/Importers/SpotCardExchangeImporter.cs
+++ b/SVSim.Bootstrap/Importers/SpotCardExchangeImporter.cs
@@ -8,7 +8,7 @@ namespace SVSim.Bootstrap.Importers;
///
/// Idempotent upsert of the spot card exchange catalog from seeds/spot-card-exchange.json.
/// Source is the wire /spot_card_exchange/top response, extracted via
-/// data_dumps/extract/extract-spot-card-exchange.py. Rows missing from the seed are
+/// data_dumps/scripts/extract-spot-card-exchange.py. Rows missing from the seed are
/// LEFT INTACT.
///
public class SpotCardExchangeImporter
diff --git a/SVSim.Bootstrap/Program.cs b/SVSim.Bootstrap/Program.cs
index ab2ecde..e009b25 100644
--- a/SVSim.Bootstrap/Program.cs
+++ b/SVSim.Bootstrap/Program.cs
@@ -76,7 +76,7 @@ public static class Program
if (!opts.SkipGlobals)
{
// Per-domain seed pipeline. Each importer reads a per-table JSON seed file under
- // SVSim.Bootstrap/Data/seeds/ produced by an extractor in data_dumps/extract/.
+ // SVSim.Bootstrap/Data/seeds/ produced by an extractor in data_dumps/scripts/.
//
// RotationConfigImporter writes the Rotation GameConfig section that RotationFlagUpdater
// reads; CardImporter ran earlier in the !SkipCards block so CardSets are populated.
@@ -229,7 +229,7 @@ public static class Program
" --story-data-dir
Override story data directory (default: shipped Data/story)\n" +
" --skip-story Skip story import (worlds/sections/chapters/sbs)\n" +
"\n" +
- "Capture-derived seeds are produced by extractors under data_dumps/extract/* and\n" +
+ "Capture-derived seeds are produced by extractors under data_dumps/scripts/* and\n" +
"checked into SVSim.Bootstrap/Data/seeds/. The bootstrap project never parses wire\n" +
"captures directly — refresh seeds by re-running the relevant extractor.\n" +
"\n" +
diff --git a/SVSim.Database/Models/Config/ResourceConfig.cs b/SVSim.Database/Models/Config/ResourceConfig.cs
index 6a5373e..3fb2366 100644
--- a/SVSim.Database/Models/Config/ResourceConfig.cs
+++ b/SVSim.Database/Models/Config/ResourceConfig.cs
@@ -13,7 +13,7 @@ public class ResourceConfig
/// PlayerPrefs["RES_VER"] and uses it as the version path component for asset
/// manifest lookups: https://<cdn>/dl/Manifest/<RES_VER>/<lang>/<Platform>/.
///
- /// Default value is the prod-captured version from data_dumps/traffic_prod_tutorial.ndjson
+ /// Default value is the prod-captured version from data_dumps/captures/traffic_prod_tutorial.ndjson
/// (2026-05-28) — i.e., a path Akamai actually serves. When this rotates (or Akamai sunsets
/// ahead of June 2026), update via DB GameConfigs row, appsettings.json, or this
/// shipped default; no code change needed.
diff --git a/SVSim.Database/Models/ItemEntry.cs b/SVSim.Database/Models/ItemEntry.cs
index 9d8b6a9..5b03a27 100644
--- a/SVSim.Database/Models/ItemEntry.cs
+++ b/SVSim.Database/Models/ItemEntry.cs
@@ -4,7 +4,7 @@ namespace SVSim.Database.Models;
///
/// Item master row. Mirrors the client's item_master.csv + itemtext.json
-/// (under data_dumps/client_master_csv/): matches the client-side
+/// (under data_dumps/client-assets/): matches the client-side
/// item_type enum (1 = challenge ticket, 2 = card-pack ticket, 3 = premium orb,
/// 4 = colosseum ticket, 5 = orb piece, 6 = skin/event ticket, 7 = other);
/// is the client-resolved sprite key.
diff --git a/SVSim.Database/Models/StoryDeckEntry.cs b/SVSim.Database/Models/StoryDeckEntry.cs
index c37b1dd..52d46a9 100644
--- a/SVSim.Database/Models/StoryDeckEntry.cs
+++ b/SVSim.Database/Models/StoryDeckEntry.cs
@@ -8,7 +8,7 @@ namespace SVSim.Database.Models;
/// main_story/get_deck_list's build_deck_list / trial_deck_list. PK (DeckNo) equals the deck's
/// wire deck_no, which also equals BuildDeckProductEntry.Id — the 40-card list is read from that
/// product (single source of truth), NOT stored here. Sourced from
-/// data_dumps/traffic_prod_trial_decks.ndjson via seeds/story-decks.json.
+/// data_dumps/captures/traffic_prod_trial_decks.ndjson via seeds/story-decks.json.
///
public class StoryDeckEntry : BaseEntity
{
diff --git a/SVSim.Database/Repositories/Pack/PackRepository.cs b/SVSim.Database/Repositories/Pack/PackRepository.cs
index 417fe94..702b604 100644
--- a/SVSim.Database/Repositories/Pack/PackRepository.cs
+++ b/SVSim.Database/Repositories/Pack/PackRepository.cs
@@ -16,7 +16,7 @@ public class PackRepository : IPackRepository
// parent_gacha_id DESC matches the prod /pack/info wire order. The tutorial pack
// UI runs with controls locked and auto-selects the FIRST entry in
// pack_config_list, so the legendary starter pack (99047) MUST be index 0 for the
- // tutorial to progress. Verified against data_dumps/traffic_prod_tutorial.ndjson —
+ // tutorial to progress. Verified against data_dumps/captures/traffic_prod_tutorial.ndjson —
// prod emits [99047, 92001, 80047, 16015..16011, 10032..10001].
.OrderByDescending(p => p.Id)
.ToListAsync();
diff --git a/SVSim.EmulatedEntrypoint/Controllers/DeckBuilderController.cs b/SVSim.EmulatedEntrypoint/Controllers/DeckBuilderController.cs
index 6620c0e..2e45842 100644
--- a/SVSim.EmulatedEntrypoint/Controllers/DeckBuilderController.cs
+++ b/SVSim.EmulatedEntrypoint/Controllers/DeckBuilderController.cs
@@ -48,7 +48,7 @@ public class DeckBuilderController : ControllerBase
Clan = req.Clan.ToString(),
SubClan = req.SubClan ?? 0,
// Standard decks emit int 0; my-rotation decks emit the rotation id as a string.
- // Mixed wire typing matches prod (data_dumps/traffic_prod_deckcode.ndjson).
+ // Mixed wire typing matches prod (data_dumps/captures/traffic_prod_deckcode.ndjson).
RotationId = (object?)req.RotationId ?? 0,
// Strip the foil flag (ones digit) — matches prod's normalize-on-encode behaviour
// observed in the traffic dump (e.g. 703441011 → 703441010).
diff --git a/SVSim.EmulatedEntrypoint/Middlewares/ShadowverseTranslationMiddleware.cs b/SVSim.EmulatedEntrypoint/Middlewares/ShadowverseTranslationMiddleware.cs
index 8bcc3da..a48e217 100644
--- a/SVSim.EmulatedEntrypoint/Middlewares/ShadowverseTranslationMiddleware.cs
+++ b/SVSim.EmulatedEntrypoint/Middlewares/ShadowverseTranslationMiddleware.cs
@@ -234,7 +234,7 @@ public class ShadowverseTranslationMiddleware : IMiddleware
// Wrap the response in a datawrapper. Portal (no-encryption) endpoints emit an anonymous
// envelope — viewer/udid/sid stay zero/empty — matching the prod portal traffic shape
- // captured in data_dumps/traffic_prod_deckcode.ndjson.
+ // captured in data_dumps/captures/traffic_prod_deckcode.ndjson.
DataWrapper wrappedResponseData = new DataWrapper
{
Data = responseData,
diff --git a/SVSim.EmulatedEntrypoint/Models/Dtos/GachaPointRewardDetailEntry.cs b/SVSim.EmulatedEntrypoint/Models/Dtos/GachaPointRewardDetailEntry.cs
index ec6b7e1..10cb6f2 100644
--- a/SVSim.EmulatedEntrypoint/Models/Dtos/GachaPointRewardDetailEntry.cs
+++ b/SVSim.EmulatedEntrypoint/Models/Dtos/GachaPointRewardDetailEntry.cs
@@ -7,7 +7,7 @@ namespace SVSim.EmulatedEntrypoint.Models.Dtos;
/// One entry inside gacha_point_rewards[i].reward_list. Different shape from the
/// post-state-totals used by /pack/open: this is a catalog
/// declaration ("here's what you'd get if you exchanged"), not a viewer-state assignment.
-/// Wire keys verified against prod capture data_dumps/traffic_prod_tradeables_capture.ndjson.
+/// Wire keys verified against prod capture data_dumps/captures/traffic_prod_tradeables_capture.ndjson.
///
[MessagePackObject]
public class GachaPointRewardDetailEntry
diff --git a/SVSim.EmulatedEntrypoint/Models/Dtos/Requests/DeckBuilder/GenerateDeckCodeRequest.cs b/SVSim.EmulatedEntrypoint/Models/Dtos/Requests/DeckBuilder/GenerateDeckCodeRequest.cs
index 64d5b28..57d3252 100644
--- a/SVSim.EmulatedEntrypoint/Models/Dtos/Requests/DeckBuilder/GenerateDeckCodeRequest.cs
+++ b/SVSim.EmulatedEntrypoint/Models/Dtos/Requests/DeckBuilder/GenerateDeckCodeRequest.cs
@@ -28,7 +28,7 @@ public class GenerateDeckCodeRequest
[Key("deck_format")]
public int DeckFormat { get; set; }
- // Wire key is camelCase mid-word capital — verified in data_dumps/traffic.ndjson live
+ // Wire key is camelCase mid-word capital — verified in data_dumps/captures/traffic.ndjson live
// capture (`"cardID":[...]`). The client's LitJson serializer emits the C# property name
// verbatim, and the param classes in Wizard/GenerateDeckCodeTask.cs use `cardID` /
// `phantomCardID`. Snake-case would silently bind to empty and the controller would emit
diff --git a/SVSim.EmulatedEntrypoint/Models/Dtos/Requests/MyPageRefreshRequest.cs b/SVSim.EmulatedEntrypoint/Models/Dtos/Requests/MyPageRefreshRequest.cs
index ee3ccba..8e98dd1 100644
--- a/SVSim.EmulatedEntrypoint/Models/Dtos/Requests/MyPageRefreshRequest.cs
+++ b/SVSim.EmulatedEntrypoint/Models/Dtos/Requests/MyPageRefreshRequest.cs
@@ -5,7 +5,7 @@ namespace SVSim.EmulatedEntrypoint.Models.Dtos.Requests;
///
/// Request body for /mypage/refresh. Carries only the standard auth envelope —
/// no carrier field, unlike MyPageIndexRequest. Confirmed against prod traffic
-/// in data_dumps/traffic_prod.ndjson: both refresh request bodies have exactly
+/// in data_dumps/captures/traffic_prod.ndjson: both refresh request bodies have exactly
/// viewer_id / steam_id / steam_session_ticket.
///
[MessagePackObject]
diff --git a/SVSim.EmulatedEntrypoint/Services/DeckCodeService.cs b/SVSim.EmulatedEntrypoint/Services/DeckCodeService.cs
index 5753ac1..5df8b34 100644
--- a/SVSim.EmulatedEntrypoint/Services/DeckCodeService.cs
+++ b/SVSim.EmulatedEntrypoint/Services/DeckCodeService.cs
@@ -6,7 +6,7 @@ namespace SVSim.EmulatedEntrypoint.Services;
///
/// In-memory deck-code store with a 3-minute absolute TTL. Codes are lowercase 4-character
/// alphanumeric tokens — matches the shortest sample observed in prod (e.g. "t7rz" in
-/// data_dumps/traffic_prod_deckcode.ndjson). The portal's anonymous global namespace is
+/// data_dumps/captures/traffic_prod_deckcode.ndjson). The portal's anonymous global namespace is
/// mirrored here: codes are not scoped to viewer.
///
public sealed class DeckCodeService : IDeckCodeService
diff --git a/SVSim.UnitTests/Controllers/PackControllerGachaPointTests.cs b/SVSim.UnitTests/Controllers/PackControllerGachaPointTests.cs
index 8b7c242..6811d02 100644
--- a/SVSim.UnitTests/Controllers/PackControllerGachaPointTests.cs
+++ b/SVSim.UnitTests/Controllers/PackControllerGachaPointTests.cs
@@ -243,7 +243,7 @@ public class PackControllerGachaPointTests
var text = await response.Content.ReadAsStringAsync();
// Literal wire-key checks — verified against
- // data_dumps/traffic_prod_tradeables_capture.ndjson pack 10008 response.
+ // data_dumps/captures/traffic_prod_tradeables_capture.ndjson pack 10008 response.
Assert.That(text, Does.Contain("\"gacha_point_rewards\""));
Assert.That(text, Does.Contain("\"class_id\":\"0\""), "class_id MUST be a string");
Assert.That(text, Does.Contain("\"reward_detail_id\":1080410100"),
diff --git a/SVSim.UnitTests/Story/StoryServiceTests.cs b/SVSim.UnitTests/Story/StoryServiceTests.cs
index 1c80aa5..6590ae3 100644
--- a/SVSim.UnitTests/Story/StoryServiceTests.cs
+++ b/SVSim.UnitTests/Story/StoryServiceTests.cs
@@ -416,7 +416,7 @@ public class StoryServiceTests
// Section 17 in prod offers 4 custom leaders (chara_ids 500901-500904), not the default
// 8 classes. Ordering is by ascending min(story_id) of each chara's chapters:
// 500901 (569), 500903 (591), 500904 (594), 500902 (597) — non-numeric chara_id sequence.
- // Verified against data_dumps/traffic_prod_626_story.ndjson section_id=17 leader_select.
+ // Verified against data_dumps/captures/traffic_prod_626_story.ndjson section_id=17 leader_select.
var s17chapters = new List {
Ch(569, 17, 500901, "1", "2"), Ch(570, 17, 500901, "2", "3"),
Ch(591, 17, 500903, "1", "2"), Ch(592, 17, 500903, "2", "3"),