diff --git a/SVSim.Database/Models/AchievementCatalogEntry.cs b/SVSim.Database/Models/AchievementCatalogEntry.cs
new file mode 100644
index 0000000..5db492b
--- /dev/null
+++ b/SVSim.Database/Models/AchievementCatalogEntry.cs
@@ -0,0 +1,23 @@
+using SVSim.Database.Common;
+
+namespace SVSim.Database.Models;
+
+///
+/// One tier of an achievement. PK is composite (AchievementType, Level). Rows are seeded from
+/// seeds/achievement-catalog.json. The captured tier IS the max tier in our world —
+/// max_level on the wire is computed as MAX(Level) per AchievementType at /mission/info time.
+/// Inherits Id from BaseEntity but the Id is unused; PK is configured in DbContext.
+///
+public class AchievementCatalogEntry
+{
+ public int AchievementType { get; set; }
+ public int Level { get; set; }
+ public string Name { get; set; } = "";
+ public int RequireNumber { get; set; }
+ public int RewardType { get; set; }
+ public long RewardDetailId { get; set; }
+ public int RewardNumber { get; set; }
+ public int OrderNum { get; set; }
+ public string? EventType { get; set; }
+ public int? EventArg { get; set; }
+}
diff --git a/SVSim.Database/Models/BattlePassMonthlyMissionEntry.cs b/SVSim.Database/Models/BattlePassMonthlyMissionEntry.cs
new file mode 100644
index 0000000..4ddec79
--- /dev/null
+++ b/SVSim.Database/Models/BattlePassMonthlyMissionEntry.cs
@@ -0,0 +1,28 @@
+using System.ComponentModel.DataAnnotations.Schema;
+using SVSim.Database.Common;
+
+namespace SVSim.Database.Models;
+
+///
+/// One row of the BP monthly mission list, keyed to a specific (Year, Month).
+/// `RewardType` is nullable because some monthly missions only award BP points (capture shows
+/// the "Play 5 Challenge matches" entry has no reward_info block on wire).
+/// Id is auto-generated — override BaseEntity's [DatabaseGenerated(None)] default.
+///
+public class BattlePassMonthlyMissionEntry : BaseEntity
+{
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public override int Id { get; set; }
+
+ public int Year { get; set; }
+ public int Month { get; set; }
+ public int OrderNum { get; set; }
+ public string Name { get; set; } = "";
+ public int RequireNumber { get; set; }
+ public int BattlePassPoint { get; set; }
+ public int? RewardType { get; set; }
+ public long? RewardDetailId { get; set; }
+ public int? RewardNumber { get; set; }
+ public string? EventType { get; set; }
+ public int? EventArg { get; set; }
+}
diff --git a/SVSim.Database/Models/MissionCatalogEntry.cs b/SVSim.Database/Models/MissionCatalogEntry.cs
new file mode 100644
index 0000000..7301a6c
--- /dev/null
+++ b/SVSim.Database/Models/MissionCatalogEntry.cs
@@ -0,0 +1,26 @@
+using SVSim.Database.Common;
+
+namespace SVSim.Database.Models;
+
+///
+/// One mission template. Id = wire mission_id. Rows are seeded from
+/// seeds/mission-catalog.json (extracted from /mission/info captures).
+/// LotType 2 = weekly rotation slot; LotType 6 = daily slot (per UserMission.GEM_MISSION_TYPE).
+/// EventType is the catalog-side key the progress service matches against; NULL means the row
+/// was captured but no event mapping has been added yet (importer logs a warning).
+///
+public class MissionCatalogEntry : BaseEntity
+{
+ public string Name { get; set; } = "";
+ public int LotType { get; set; }
+ public int RequireNumber { get; set; }
+ public int RewardType { get; set; }
+ public long RewardDetailId { get; set; }
+ public int RewardNumber { get; set; }
+ public int BattlePassPoint { get; set; }
+ public bool DefaultFlag { get; set; }
+ public string? EventType { get; set; }
+ public int? EventArg { get; set; }
+ public long StartTime { get; set; }
+ public long? EndTime { get; set; }
+}