Some checks failed
Build / build (pull_request) Has been cancelled
Reference AGENTS.md in CLAUDE.md and record verification claims for the architecture overview and operations runbook. Signed-off-by: Tim Krampitz <Tim.Krampitz@live.com>
151 lines
18 KiB
JSON
151 lines
18 KiB
JSON
{
|
|
"schemaVersion": 1,
|
|
"pageVersion": "sha256:9c2c9eb1e1f116019b34b3aa1db0c6851e923a41cfa25a3c8c135be366ff8c37",
|
|
"claims": [
|
|
{
|
|
"id": "claim_f26387ba0aa64fc7b0d39814b6ef681d",
|
|
"statement": "The .NET Aspire AppHost in SlipItIn.AppHost/AppHost.cs provisions a PostgreSQL container named 'pgsql' with database 'postgresdb', registers the backend SlipItIn.Server project with a reference to and WaitFor dependency on the database, and registers the SlipItIn client project with a service-discovery reference to the server.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn.AppHost/AppHost.cs#L1-L13",
|
|
"version": "repo-lines-v1:sha256:5b10af1a2cea5378effced1c0adef3ecd6049d5f05a4ed540cb701ac1cf37d9c:eyJzZWxlY3RlZExpbmVDb3VudCI6MTMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjA3OTVkNWZmODQyMTVmOTA0YTA4ZjU5MmI2MGNkZmM4MTBiZjk2YThhYzJhMjYzZDJlMzZhMDJmZjZhMWVlYjEiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjU0M2YyYWU1YzNkZTAwZWQyY2NiNjBiNjBkM2I0Yzk0NTc5ZTVmMDg1MjMwNDRjOTRhOTcyODQ1OWZiZDFlZjciLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "claim_d203ca24ede64d428fe33626b57b252c",
|
|
"statement": "Program.cs in SlipItIn.Server registers IDbContextFactory for thread-safe EF Core access, configures JWT Bearer authentication with OnMessageReceived for SignalR query-string extraction and OnTokenValidated for user-existence checks, adds SignalR hubs, CORS AllowAll policy, controllers, and OpenAPI, and at startup runs Database.Migrate and DbSeeder.SeedAsync.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn.Server/Program.cs#L1-L143",
|
|
"version": "repo-lines-v1:sha256:42ad9155f6cc7dda925cb2f2de4409e19d7051ea97416bfcfc0959b2c4fbef3d:eyJzZWxlY3RlZExpbmVDb3VudCI6MTQzLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiI1Y2FjYmU0OTcyM2JiNzJmZTQwODdlMDVlNWMxYmI1NDk5MTQ0OGRiOTY5NDJmYmVkYWY4Y2QwZmNkNGExZDdkIiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiIyYzMyYmVkMTM2YTNlZGMwNjM3MWU3MTkwNjJjYjMyNDE1NmE0MWVlZDdlYTc2ZTIwZWQ3ZmZjOTkyNzViODQxIiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MCwicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MCwiZm9sbG93aW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1In0"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "claim_645e376f85d9494792453dc50a93c5c8",
|
|
"statement": "JWT authentication for SignalR is secured by OnMessageReceived extracting the access_token query parameter only for paths starting with /hubs, and OnTokenValidated creating a short-lived DbContext via IDbContextFactory to verify the user still exists and is active before any hub method executes.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn.Server/Program.cs#L57-L88",
|
|
"version": "repo-lines-v1:sha256:a53b47cadec43a5a8d8dd2af6d6163507c8ba8b4492682545da739babe1fe4c4:eyJzZWxlY3RlZExpbmVDb3VudCI6MzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6Ijc3YTY5ZDgzMDYzMGI1N2IxZGQwMWM2OTRhOTczN2IzOGRhNjUxZDdiYjkwYWYxZTY5YmM5ZmFhZjYxYjlmODgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjkxMDU5YzhjZmI1YTA3MmM2ZjY0ZGQzZDFiZmRiYzM1NmZiZWM5M2FlZWM4ODc5MWRhN2VkYmE4OWMwODg1ZGQiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImU3M2E0NGY1YTM0M2QyNGI5NWU3NjMyMWZiOWI4ZmZhNWMzMzVhY2I1MDcxMTVhOGMzOWIxNTI0NDcxNzBiM2EiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjlhZGRjNGEzN2JiZDE4ZjU0YjNmNjcxNGUyNGNkNjNkZGE0OWVmNjEzMjQ0ODVmMDhjZDZmNDc1ZjMzODViODUifQ"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "claim_ce6c77ab5aea413d8c946333b75d0ad5",
|
|
"statement": "GameHub provides five authorization methods: GetAuthenticatedUserId extracts the NameIdentifier claim; ValidatePlayerAccessAsync verifies Player.UserId matches the caller; ValidateHostAccessAsync verifies Game.HostId matches the caller; ValidateUserInGameAsync verifies the caller is a game participant; ValidateChallengeTargetAccessAsync ensures only the accused player can resolve a challenge.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn.Server/Hubs/GameHub.cs#L29-L100",
|
|
"version": "repo-lines-v1:sha256:b6baa264558236461ef7bf26d6614878e5b3229aa09d0f4de431514f973c8039:eyJzZWxlY3RlZExpbmVDb3VudCI6NzIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImE4MWI3MTE4ZDQwNjdlMjA2N2I2NmUyZmNjNTczMzNiNzg2YTM3NTc4NGYxNjQ0OTk0ZGFlYzBlNWQyZmNhODAiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE0MTlhNmRjYzA0ZTIxM2EzYzdhNzdhNDU2YjAxZTc2ZDFlZjc4Y2QwMGJiZWMxZDhmODE0NThmZTkzZWRjNTYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjljMTQ2ZTY0YjVlZjlmNGFkNjQzMTFlNTgxNzdiOTYwMGJlZmJkMjhlZWEzN2MzNDY0NTAzZThhNWYyZmU4ODYiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJjNGQwYjMxNjQ4N2E2NGQ2MWUxY2NlZDYxOTVkMDQyOTgwMjc4MGFiN2I3ZTBmNDI5YTY4NGExM2ZhNmIzZGMifQ"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "claim_8db66fb0b33c4708a62bdf96f81400fe",
|
|
"statement": "GameHub.OnConnectedAsync detects if the reconnecting user is already in a Lobby or InProgress game, stores the new ConnectionId, and re-joins the SignalR lobby group; OnDisconnectedAsync clears ConnectionId for all affected players to prevent messages to dead connections.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn.Server/Hubs/GameHub.cs#L365-L427",
|
|
"version": "repo-lines-v1:sha256:b1f8a01a846a8dcea0e72cc0a48bb42d85da5a7a22a221566c516c7d133a461d:eyJzZWxlY3RlZExpbmVDb3VudCI6NjMsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImZhYWJhMjJiODNiMTRlYTBlNzAwZWZiZGJlODcyYmU3YjUyOTVhMmMzMTMyMGJiYjdmMWJlMzkxYWY1ZjZhZDUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUyMmZhYTUzNWJkMmVhM2Q1MmU3NDFlZDQ1NDQzNWI3ZmU0OWU4MzU4NmU5NDNkOThkODJiYmZiMjRkMWY1YzUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImM3NTRlYmJmZDhlZmVhNGQ0OWVjNWM3YTM4Yjg3MTYwNWNlNGYzMGM5NTY3NmQ2ZTU5MTBmYzQ4ZjUwMzQ1MTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "claim_c49f2d5d78ef4025890205ea625a5b6b",
|
|
"statement": "MauiProgram.cs registers singletons for IAppConfigurationService, ILocalStorageService, IAuthSessionService, IApiService, ISignalRService, IGameStateService, LobbyViewModel, and GameBoardViewModel, and transients for LoginViewModel and RegisterViewModel.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn/MauiProgram.cs#L22-L33",
|
|
"version": "repo-lines-v1:sha256:0f35d7fb5dd09ff85f16adfd591b5cf3da4f938e550c52bf7d3dc9eab4b42fdd:eyJzZWxlY3RlZExpbmVDb3VudCI6MTIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjQxYmU0ZGRhMGEyYTNlMGNiYjVlOGRkNGZjOTQ3MmU4MWM2MDNhZGRmYmE4MjIyOGViNDIzYTM4MDlhYTY1NDgiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdlYjcwMjU3NTkzZGEwNmY2ODJhM2RkZGE1NGE5ZDI2MGQ0ZmM1MTRmNjQ1MjM3ZjVjYTc0YjA4ZjhkYTYxYTYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjNiMmFjMWFiNDkwY2M4NDg4MTYyNTNjZTMyYTExYTQ0ZDhhNDUxMmFiMzlkOTcyZDQ4ZmQ2YWRiNTNkZjEyNWMiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjAwMWFjMDM2ZWY0ODhkYTUyNmZmNGE2MDg0YjE2ZjVlNmMzNzZhNzM5Njg5ZDQ2YjI5YTQ4OTViZjNkYjFjNDEifQ"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "claim_913269edbc9543739a8a174940dde0cb",
|
|
"statement": "GameStateService subscribes to ISignalRService C# events and translates each into a strongly-typed WeakReferenceMessenger message, including LobbyCreatedMessage, GameStateChangedMessage, GameStartedMessage, PlayerHandChangedMessage, ChallengeReceivedMessage, ErrorOccurredMessage, ConnectionStateChangedMessage, and SyncStateChangedMessage.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn/Services/GameStateService.cs#L1-L62",
|
|
"version": "repo-lines-v1:sha256:6a100233b062c19004f61a4b92579fe0b09c3a108b51a25702463a2b1a0afeda:eyJzZWxlY3RlZExpbmVDb3VudCI6NjIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM2NWRiODRmNWEzNTgxNjY0NDk0MGJkZGNlZDZlYmM3NTljMmM2ODYyNDlmNzQ0ZmQxOWY3ZjY2ZGJhYTY5NjUiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE0MTlhNmRjYzA0ZTIxM2EzYzdhNzdhNDU2YjAxZTc2ZDFlZjc4Y2QwMGJiZWMxZDhmODE0NThmZTkzZWRjNTYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImE5ZDc4OGExN2IxMjNhZTRjZTFiZThlNzJjNWIxYjRjMmI2NDUyYTQ3ODllZjgyODQyYzQxNDY0ZWRkMzE5N2MifQ"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "claim_e23b846d30ab452db2fc8b3d09d56584",
|
|
"statement": "GameStateService.EnqueueActionAsync persists game actions as JSON-serialized QueuedGameAction objects in LocalStorageService when offline; on reconnect ResyncAsync calls FlushQueuedActionsCoreAsync which replays actions sequentially through SignalRService.SendQueuedActionAsync with up to 3 retries per action before dropping poisoned entries.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn/Services/GameStateService.cs#L118-L199",
|
|
"version": "repo-lines-v1:sha256:7b0835e72e6b6bc04c75c5df62801b8e2753bd5759afa41f270ff442f7f295fa:eyJzZWxlY3RlZExpbmVDb3VudCI6ODIsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjFhMmFlZTkyZDgzMTVlZTRjNWRkYWI3OGZjNGM1MmUwODM0NmMzMTNkZDI0MWM5YTVhZjZmZWIzZmYwMWIyMjYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE0MTlhNmRjYzA0ZTIxM2EzYzdhNzdhNDU2YjAxZTc2ZDFlZjc4Y2QwMGJiZWMxZDhmODE0NThmZTkzZWRjNTYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImM3NTRlYmJmZDhlZmVhNGQ0OWVjNWM3YTM4Yjg3MTYwNWNlNGYzMGM5NTY3NmQ2ZTU5MTBmYzQ4ZjUwMzQ1MTAiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImJkZjUwY2NkODM0NzE0YzI2YmI2MzU1OGQ0NjM3ODdkYjFmMjViMGIzMDU4YTBmMWZkNzI1NzA4OGU4ZTQ1MDEifQ"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "claim_07b56e629228493ba5b7f7cf003a13d4",
|
|
"statement": "All database access in GameHub, GameService, AuthController, and Program.cs OnTokenValidated creates short-lived DbContext instances via IDbContextFactory.CreateDbContext or CreateDbContextAsync, preventing thread conflict exceptions under concurrent SignalR hub requests.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn.Server/Controllers/AuthController.cs#L38-L38",
|
|
"version": "repo-lines-v1:sha256:77ab5090a78dcb1145419669804c06b6366749f7806fc98d047a64608f902c41:eyJzZWxlY3RlZExpbmVDb3VudCI6MSwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNzdhYjUwOTBhNzhkY2IxMTQ1NDE5NjY5ODA0YzA2YjYzNjY3NDlmNzgwNmZjOThkMDQ3YTY0NjA4ZjkwMmM0MSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNzdhYjUwOTBhNzhkY2IxMTQ1NDE5NjY5ODA0YzA2YjYzNjY3NDlmNzgwNmZjOThkMDQ3YTY0NjA4ZjkwMmM0MSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiNDU5NzA0MDgwZTNhZTE4MzVkZTJkMzEzNTk5YTA3NjY3MjVmMjdhN2JmNDQwNDgxNWI5Yjc5NGI0NjA2MjAyZiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiZTU0OWU0YzFmZDIzNDY0OThjNGVjMWRlNGVlZGMwYWRiN2VjYzlhYmU1NDNjODAzNzU0OWI4N2ZlNzU3ZWM2MSJ9"
|
|
},
|
|
{
|
|
"resource": "repo://SlipItIn.Server/Hubs/GameHub.cs#L42-L43",
|
|
"version": "repo-lines-v1:sha256:c70cfdcd685e60d484d7eb9539d16eb08ab941f2061620980eab2eb33a31fa3c:eyJzZWxlY3RlZExpbmVDb3VudCI6MiwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiNzdhYjUwOTBhNzhkY2IxMTQ1NDE5NjY5ODA0YzA2YjYzNjY3NDlmNzgwNmZjOThkMDQ3YTY0NjA4ZjkwMmM0MSIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiOTQzZTZkNGQ4MDE5M2NmNDczMTM1NmZmMjFhZWVkMmIyOTBiOTNiZDUyY2UzMWY3MmE5OTkxMzZlMjVhMzQ0NSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiYTU2YzQ0MWNiNWYzODUxOTc1Mzg3N2IxNjAyNGI0OWZmN2I5Njk3Nzg4MDk5NDU4ZDAwYTBmNTAyMDc5OTAzNSIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiOWU4MDM4Nzg0MmVmN2QzY2E1OTRmYzkzN2Q5Mjk3OWJmMmM2YTNmMzM3ZjRkMWMxMTk4OTA2MGVjMjdkZGVmNiJ9"
|
|
},
|
|
{
|
|
"resource": "repo://SlipItIn.Server/Program.cs#L17-L18",
|
|
"version": "repo-lines-v1:sha256:bff89b037a7c9439dad1c8b40eccf119306fadaa4413ad8b97b10e64b6b4addb:eyJzZWxlY3RlZExpbmVDb3VudCI6MiwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiMWUyNzAyZTQ2NjJhNTBjNTZmODljZjE3Yjg1MTZmYTg0NjQ0MTY0ZjQ5N2RhMDEzMGFmZTBmOTZkNjE0NDNhNCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiZGZjNDg2M2VhN2Q3MTBjZDI0MmRiNWVmYWJhYmQ2MTE5ODYwZTM0YzlkMTg0MTQ4YTQ1MzVmNDRjNGViZmJjYiIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiYjhjMDY4NDZjMzI2YjQ5MzNhNGVhZTI4M2Y5N2M1NDJhNTU0MjllYzU4OTM0NzMwM2ViNGYzNDY5ZDY0MWQ3MyIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiM2QwY2U1NGY1Y2I1ZTM0YTRkNGUwMTJjODk4NGFhMTk1ZWRkYzM5OWM0MDEyMDZiN2IyYzc1NDgxYjIyMjkyYSJ9"
|
|
},
|
|
{
|
|
"resource": "repo://SlipItIn.Server/Services/GameService.cs#L11-L14",
|
|
"version": "repo-lines-v1:sha256:d012048db2a9abaa071e8af375215fddb233b1568c5d8d0d0f17fea852e48a5e:eyJzZWxlY3RlZExpbmVDb3VudCI6NCwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZGYwNDNlZjg2YWQ4YTI1MmYwMDAyYjYxZDY0NzEyMjdmMzMxODgwMDJkNTI2ZmMyNTljNzAxOWI3YzRhYzkyZCIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiMjc2N2MzY2U5MmMwY2NmOGIwYjRhOWQ1ODIxYmYxNGQ5MDJkYTM3Y2FiNDA2MDQxYWIyZWMzMzYzN2YzODJhZCIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiZWE1ZDA4NzY3ZWJhNGZlYzNlYTE2NjEzMjMzMzc0ZWEyZDkwYzliNGU0ODBmNGQyZTRmMWFiNDczODAyOTNjMCIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiMjBjYWRmY2MzNTE1OTZkYzliMzMzOTJjNDY3OWU5ZTU4Y2U4OWE1YTkzMWVhYWJmMTZhNjY3MThkYmI3YmViMCJ9"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "claim_29bd98f9e4864a119c2725b72e0c5e50",
|
|
"statement": "GameStateDto is broadcast to all lobby players but contains no card text, only CardCount per player; PlayerHandDto containing actual phrase text is unicast via Clients.Client(connectionId) only to the owning player, ensuring opponents cannot discover card content from network traffic.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn.Server/Hubs/GameHub.cs#L200-L209",
|
|
"version": "repo-lines-v1:sha256:df5be4995be1bf304a8eb363a228f2873280db6ef56d8fdb92392f2afab1a137:eyJzZWxlY3RlZExpbmVDb3VudCI6MTAsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6IjdlYjcwMjU3NTkzZGEwNmY2ODJhM2RkZGE1NGE5ZDI2MGQ0ZmM1MTRmNjQ1MjM3ZjVjYTc0YjA4ZjhkYTYxYTYiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImM5YTg1NzJiODg4YjA4Zjc5Nzk4YTE5YWNhZDFlZmRhZmVkMDI3MDQyNWEzZTFjMjJkODg4ZDEwNmQ2NTY4M2IiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjhhNjY3MzEyOWYwMTk1NTQzZjEyMjJkNTRlOTk0OGU3MTAxYWRjMDczMGQ0YjE0MzdhMjhlZTcxZjNmZTY1ODUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImU0OTJkNGNkNjU1ZGYzYWViMGE1NjEzMzdhNjViYjIwMGM1OTIwNTgxYThlNzczNjBkYWQyOGNjZTM2MDA2NTUifQ"
|
|
},
|
|
{
|
|
"resource": "repo://SlipItIn.Server/Services/GameService.cs#L253-L327",
|
|
"version": "repo-lines-v1:sha256:57d62dc5c76f75b5f6785dae111fb31c3ed5d709d982d09ed7a4ce670629c5fa:eyJzZWxlY3RlZExpbmVDb3VudCI6NzUsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImQ2YjYyMmRkODk2YTgxODdlZDU2ODY2NWExNDE3OTEyYmY0YzYyODI5NmVmMTQwZjZjZmZhN2ZhZjE5NmY5MTkiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6IjE0MTlhNmRjYzA0ZTIxM2EzYzdhNzdhNDU2YjAxZTc2ZDFlZjc4Y2QwMGJiZWMxZDhmODE0NThmZTkzZWRjNTYiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjozLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6IjdlOTViODAwZmFiMDU0OGJlYThlMmVhYzU0NmVhZjU0MTAzZmM2NWI1Yzc1NmMzYjZhYmI2YmZlYWY2ODI2NzEiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjozLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6IjRjZWUyNzBmNTdiNjJkZDY2ZTE4NjI1NThjZDdmOWUxMTg0NWI4ODhiYzI5YmI3MWI0YTAwN2I4NGE1MjhjMGEifQ"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "claim_d1cae5dd74ab46b3ad3f2f737cfe6627",
|
|
"statement": "LocalStorageService uses platform SecureStorage exclusively for the JWT auth token, and Preferences for all non-sensitive cached data including auth_user, game_state, player_hand, and queued_actions.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn/Services/LocalStorageService.cs#L1-L110",
|
|
"version": "repo-lines-v1:sha256:b8701c760891572e530b7bd10fa6e7871c9eaa6b3941f4d0bbb438cc06926628:eyJzZWxlY3RlZExpbmVDb3VudCI6MTEwLCJmaXJzdFNlbGVjdGVkTGluZUhhc2giOiJjNjVkYjg0ZjVhMzU4MTY2NDQ5NDBiZGRjZWQ2ZWJjNzU5YzJjNjg2MjQ5Zjc0NGZkMTlmN2Y2NmRiYWE2OTY1IiwibGFzdFNlbGVjdGVkTGluZUhhc2giOiJlMjJmYWE1MzViZDJlYTNkNTJlNzQxZWQ0NTQ0MzViN2ZlNDllODM1ODZlOTQzZDk4ZDgyYmJmYjI0ZDFmNWM1IiwicHJlY2VkaW5nQ29udGV4dExpbmVDb3VudCI6MCwicHJlY2VkaW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1IiwiZm9sbG93aW5nQ29udGV4dExpbmVDb3VudCI6MCwiZm9sbG93aW5nQ29udGV4dEhhc2giOiJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1In0"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "claim_c3a287d4f636401f9913e4e013d41fbf",
|
|
"statement": "ServiceHelper captures MauiApp.Services at startup and exposes a static GetRequiredService method for resolving dependencies in contexts where constructor DI is unavailable, such as WeakReferenceMessenger handlers.",
|
|
"evidence": [
|
|
{
|
|
"resource": "repo://SlipItIn/Infrastructure/ServiceHelper.cs#L1-L16",
|
|
"version": "repo-lines-v1:sha256:6fae980d1a7b7a70ae8f3d6cbb917465716b173b1993cfd0095859f34360ca02:eyJzZWxlY3RlZExpbmVDb3VudCI6MTYsImZpcnN0U2VsZWN0ZWRMaW5lSGFzaCI6ImU5NzdlOWYyOTk3MjdiZjE4YjRjNDc3NDY4ZTg0OTdhNzgzYTkxODI0OTNhZDgyOWJkOTlmNzU0ZTAyZGM2MWQiLCJsYXN0U2VsZWN0ZWRMaW5lSGFzaCI6ImUyMmZhYTUzNWJkMmVhM2Q1MmU3NDFlZDQ1NDQzNWI3ZmU0OWU4MzU4NmU5NDNkOThkODJiYmZiMjRkMWY1YzUiLCJwcmVjZWRpbmdDb250ZXh0TGluZUNvdW50IjowLCJwcmVjZWRpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiLCJmb2xsb3dpbmdDb250ZXh0TGluZUNvdW50IjowLCJmb2xsb3dpbmdDb250ZXh0SGFzaCI6ImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUifQ"
|
|
},
|
|
{
|
|
"resource": "repo://SlipItIn/MauiProgram.cs#L38-L39",
|
|
"version": "repo-lines-v1:sha256:6aa9ec7803623036281bba0c2de1bc4c936f6394f0decaf9ca0b3d8fbfbab0d5:eyJzZWxlY3RlZExpbmVDb3VudCI6MiwiZmlyc3RTZWxlY3RlZExpbmVIYXNoIjoiZGE0NGQxZjIzNzQ1MzE2NWYxNThjNmVkZmU5MWY3Y2Y0NWM0NDcyY2UwNjkwY2QwMzdjZjMxYTQ5MGVjMzIyNyIsImxhc3RTZWxlY3RlZExpbmVIYXNoIjoiNjFjMzJhN2JlNzEzOTRhMjY4ZDFhN2ZmZGRmOWZhZTBmODc1YjE3MzUxOWQxMjMxMDAxZDc5MmFmYjMyMThhYSIsInByZWNlZGluZ0NvbnRleHRMaW5lQ291bnQiOjMsInByZWNlZGluZ0NvbnRleHRIYXNoIjoiMDZlYTc3NmZlMTZhYWUzY2M0M2YyNzdkZTA3MmYwOThlYTkxYWVmMjgxY2E3Yjg5M2Y0N2M1MGI0MzFhOWYzMiIsImZvbGxvd2luZ0NvbnRleHRMaW5lQ291bnQiOjMsImZvbGxvd2luZ0NvbnRleHRIYXNoIjoiNmExMWFjZGY0MjE2ZjgzZDQ2MTQwZGJkOTk0MzIyMjczOWE0MTFmZWRiNDgyNTg4Njc5ZDhlZGQ3NDk3ZTNjMSJ9"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"verification": {
|
|
"by": "openwiki/0.5.0",
|
|
"at": "2026-09-07T15:04:46.288Z"
|
|
}
|
|
}
|