diff --git a/NEW/src/JdeScoping.Core/Models/Auth/EncryptedLoginRequest.cs b/NEW/src/JdeScoping.Core/Models/Auth/EncryptedLoginRequest.cs
new file mode 100644
index 0000000..b9f9f59
--- /dev/null
+++ b/NEW/src/JdeScoping.Core/Models/Auth/EncryptedLoginRequest.cs
@@ -0,0 +1,7 @@
+namespace JdeScoping.Core.Models.Auth;
+
+///
+/// Encrypted login payload sent from client to API.
+///
+/// Base64-encoded RSA-encrypted JSON of LoginModel
+public record EncryptedLoginRequest(string EncryptedData);
diff --git a/NEW/src/JdeScoping.Core/Models/Auth/LoginModel.cs b/NEW/src/JdeScoping.Core/Models/Auth/LoginModel.cs
new file mode 100644
index 0000000..172e342
--- /dev/null
+++ b/NEW/src/JdeScoping.Core/Models/Auth/LoginModel.cs
@@ -0,0 +1,15 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace JdeScoping.Core.Models.Auth;
+
+///
+/// Login credentials model shared by Client and API.
+///
+public class LoginModel
+{
+ [Required(ErrorMessage = "Username is required")]
+ public string Username { get; set; } = string.Empty;
+
+ [Required(ErrorMessage = "Password is required")]
+ public string Password { get; set; } = string.Empty;
+}
diff --git a/NEW/src/JdeScoping.Core/Models/Auth/LoginResultModel.cs b/NEW/src/JdeScoping.Core/Models/Auth/LoginResultModel.cs
new file mode 100644
index 0000000..4b73ceb
--- /dev/null
+++ b/NEW/src/JdeScoping.Core/Models/Auth/LoginResultModel.cs
@@ -0,0 +1,14 @@
+using JdeScoping.Core.Models;
+
+namespace JdeScoping.Core.Models.Auth;
+
+///
+/// Result returned from login API endpoint.
+///
+/// Whether authentication succeeded
+/// Error message if failed
+/// User info if successful
+public record LoginResultModel(
+ bool Success,
+ string? ErrorMessage,
+ UserInfo? User);
diff --git a/NEW/src/JdeScoping.Core/Models/Auth/PublicKeyResponse.cs b/NEW/src/JdeScoping.Core/Models/Auth/PublicKeyResponse.cs
new file mode 100644
index 0000000..92a12be
--- /dev/null
+++ b/NEW/src/JdeScoping.Core/Models/Auth/PublicKeyResponse.cs
@@ -0,0 +1,7 @@
+namespace JdeScoping.Core.Models.Auth;
+
+///
+/// Server's RSA public key for client-side encryption.
+///
+/// PEM-encoded RSA public key
+public record PublicKeyResponse(string PublicKeyPem);
diff --git a/NEW/src/JdeScoping.DataSync/Fetchers/MockDataFetcher.cs b/NEW/src/JdeScoping.DataSync/Fetchers/MockDataFetcher.cs
deleted file mode 100644
index c9c2344..0000000
--- a/NEW/src/JdeScoping.DataSync/Fetchers/MockDataFetcher.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System.Runtime.CompilerServices;
-using JdeScoping.DataSync.Contracts;
-using Microsoft.Extensions.Logging;
-
-namespace JdeScoping.DataSync.Fetchers;
-
-///
-/// Base class for mock data fetchers used during development.
-/// Returns empty results - real implementations will query source databases.
-///
-/// The entity type being fetched.
-public abstract class MockDataFetcher : IDataFetcher where TEntity : class
-{
- ///
- /// Logger instance.
- ///
- protected readonly ILogger Logger;
-
- ///
- /// Initializes a new instance of the class.
- ///
- protected MockDataFetcher(ILogger logger)
- {
- Logger = logger ?? throw new ArgumentNullException(nameof(logger));
- }
-
- ///
- public virtual async IAsyncEnumerable FetchAsync(
- DateTime? minimumDt,
- [EnumeratorCancellation] CancellationToken cancellationToken = default)
- {
- Logger.LogWarning(
- "MockDataFetcher<{EntityType}> returning empty results. Implement real fetcher for production.",
- typeof(TEntity).Name);
-
- // Return empty enumerable - real implementations will query source databases
- await Task.CompletedTask;
- yield break;
- }
-}