tribunal-kit 2.4.6 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/.agent/ARCHITECTURE.md +99 -99
  2. package/.agent/GEMINI.md +52 -52
  3. package/.agent/agents/accessibility-reviewer.md +139 -86
  4. package/.agent/agents/ai-code-reviewer.md +160 -90
  5. package/.agent/agents/backend-specialist.md +164 -127
  6. package/.agent/agents/code-archaeologist.md +115 -73
  7. package/.agent/agents/database-architect.md +130 -110
  8. package/.agent/agents/debugger.md +137 -97
  9. package/.agent/agents/dependency-reviewer.md +78 -30
  10. package/.agent/agents/devops-engineer.md +161 -118
  11. package/.agent/agents/documentation-writer.md +151 -87
  12. package/.agent/agents/explorer-agent.md +117 -99
  13. package/.agent/agents/frontend-reviewer.md +127 -47
  14. package/.agent/agents/frontend-specialist.md +169 -109
  15. package/.agent/agents/game-developer.md +28 -164
  16. package/.agent/agents/logic-reviewer.md +87 -49
  17. package/.agent/agents/mobile-developer.md +151 -103
  18. package/.agent/agents/mobile-reviewer.md +133 -50
  19. package/.agent/agents/orchestrator.md +121 -110
  20. package/.agent/agents/penetration-tester.md +103 -77
  21. package/.agent/agents/performance-optimizer.md +136 -92
  22. package/.agent/agents/performance-reviewer.md +139 -69
  23. package/.agent/agents/product-manager.md +104 -70
  24. package/.agent/agents/product-owner.md +6 -25
  25. package/.agent/agents/project-planner.md +95 -95
  26. package/.agent/agents/qa-automation-engineer.md +174 -87
  27. package/.agent/agents/security-auditor.md +133 -129
  28. package/.agent/agents/seo-specialist.md +160 -99
  29. package/.agent/agents/sql-reviewer.md +132 -44
  30. package/.agent/agents/supervisor-agent.md +137 -109
  31. package/.agent/agents/swarm-worker-contracts.md +17 -17
  32. package/.agent/agents/swarm-worker-registry.md +46 -46
  33. package/.agent/agents/test-coverage-reviewer.md +132 -53
  34. package/.agent/agents/test-engineer.md +0 -21
  35. package/.agent/agents/type-safety-reviewer.md +143 -33
  36. package/.agent/patterns/generator.md +9 -9
  37. package/.agent/patterns/inversion.md +12 -12
  38. package/.agent/patterns/pipeline.md +9 -9
  39. package/.agent/patterns/reviewer.md +13 -13
  40. package/.agent/patterns/tool-wrapper.md +9 -9
  41. package/.agent/rules/GEMINI.md +63 -63
  42. package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
  43. package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
  44. package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
  45. package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
  46. package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
  47. package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
  48. package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
  49. package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
  50. package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
  51. package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
  52. package/.agent/scripts/compress_skills.py +167 -0
  53. package/.agent/scripts/consolidate_skills.py +173 -0
  54. package/.agent/scripts/deep_compress.py +202 -0
  55. package/.agent/scripts/minify_context.py +80 -0
  56. package/.agent/scripts/security_scan.py +1 -1
  57. package/.agent/scripts/strip_tribunal.py +41 -0
  58. package/.agent/skills/agent-organizer/SKILL.md +60 -100
  59. package/.agent/skills/agentic-patterns/SKILL.md +0 -70
  60. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +108 -53
  61. package/.agent/skills/api-patterns/SKILL.md +197 -257
  62. package/.agent/skills/api-security-auditor/SKILL.md +125 -57
  63. package/.agent/skills/app-builder/SKILL.md +326 -50
  64. package/.agent/skills/app-builder/templates/SKILL.md +13 -15
  65. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
  66. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
  67. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
  68. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
  69. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
  70. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
  71. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
  72. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
  73. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
  74. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
  75. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
  76. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
  77. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
  78. package/.agent/skills/appflow-wireframe/SKILL.md +71 -98
  79. package/.agent/skills/architecture/SKILL.md +161 -200
  80. package/.agent/skills/authentication-best-practices/SKILL.md +121 -54
  81. package/.agent/skills/bash-linux/SKILL.md +71 -166
  82. package/.agent/skills/behavioral-modes/SKILL.md +8 -69
  83. package/.agent/skills/brainstorming/SKILL.md +345 -127
  84. package/.agent/skills/building-native-ui/SKILL.md +125 -57
  85. package/.agent/skills/clean-code/SKILL.md +266 -149
  86. package/.agent/skills/code-review-checklist/SKILL.md +0 -62
  87. package/.agent/skills/config-validator/SKILL.md +73 -131
  88. package/.agent/skills/csharp-developer/SKILL.md +434 -73
  89. package/.agent/skills/database-design/SKILL.md +190 -275
  90. package/.agent/skills/deployment-procedures/SKILL.md +81 -158
  91. package/.agent/skills/devops-engineer/SKILL.md +255 -94
  92. package/.agent/skills/devops-incident-responder/SKILL.md +50 -69
  93. package/.agent/skills/doc.md +5 -5
  94. package/.agent/skills/documentation-templates/SKILL.md +19 -63
  95. package/.agent/skills/edge-computing/SKILL.md +75 -165
  96. package/.agent/skills/extract-design-system/SKILL.md +84 -58
  97. package/.agent/skills/framer-motion-expert/SKILL.md +195 -0
  98. package/.agent/skills/frontend-design/SKILL.md +151 -499
  99. package/.agent/skills/game-design-expert/SKILL.md +71 -0
  100. package/.agent/skills/game-engineering-expert/SKILL.md +88 -0
  101. package/.agent/skills/geo-fundamentals/SKILL.md +52 -178
  102. package/.agent/skills/github-operations/SKILL.md +197 -272
  103. package/.agent/skills/gsap-expert/SKILL.md +194 -0
  104. package/.agent/skills/i18n-localization/SKILL.md +60 -172
  105. package/.agent/skills/intelligent-routing/SKILL.md +123 -103
  106. package/.agent/skills/lint-and-validate/SKILL.md +8 -52
  107. package/.agent/skills/llm-engineering/SKILL.md +281 -195
  108. package/.agent/skills/local-first/SKILL.md +76 -159
  109. package/.agent/skills/mcp-builder/SKILL.md +48 -188
  110. package/.agent/skills/mobile-design/SKILL.md +213 -219
  111. package/.agent/skills/motion-engineering/SKILL.md +184 -0
  112. package/.agent/skills/nextjs-react-expert/SKILL.md +184 -203
  113. package/.agent/skills/nodejs-best-practices/SKILL.md +403 -185
  114. package/.agent/skills/observability/SKILL.md +211 -203
  115. package/.agent/skills/parallel-agents/SKILL.md +53 -146
  116. package/.agent/skills/performance-profiling/SKILL.md +171 -151
  117. package/.agent/skills/plan-writing/SKILL.md +49 -153
  118. package/.agent/skills/platform-engineer/SKILL.md +57 -103
  119. package/.agent/skills/playwright-best-practices/SKILL.md +110 -63
  120. package/.agent/skills/powershell-windows/SKILL.md +61 -179
  121. package/.agent/skills/python-patterns/SKILL.md +7 -35
  122. package/.agent/skills/python-pro/SKILL.md +273 -114
  123. package/.agent/skills/react-specialist/SKILL.md +227 -108
  124. package/.agent/skills/readme-builder/SKILL.md +15 -85
  125. package/.agent/skills/realtime-patterns/SKILL.md +216 -243
  126. package/.agent/skills/red-team-tactics/SKILL.md +10 -51
  127. package/.agent/skills/rust-pro/SKILL.md +525 -142
  128. package/.agent/skills/seo-fundamentals/SKILL.md +92 -153
  129. package/.agent/skills/server-management/SKILL.md +110 -166
  130. package/.agent/skills/shadcn-ui-expert/SKILL.md +154 -55
  131. package/.agent/skills/skill-creator/SKILL.md +18 -58
  132. package/.agent/skills/sql-pro/SKILL.md +543 -68
  133. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +28 -68
  134. package/.agent/skills/swiftui-expert/SKILL.md +124 -57
  135. package/.agent/skills/systematic-debugging/SKILL.md +49 -151
  136. package/.agent/skills/tailwind-patterns/SKILL.md +433 -149
  137. package/.agent/skills/tdd-workflow/SKILL.md +63 -169
  138. package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
  139. package/.agent/skills/testing-patterns/SKILL.md +437 -130
  140. package/.agent/skills/trend-researcher/SKILL.md +30 -71
  141. package/.agent/skills/ui-ux-pro-max/SKILL.md +0 -41
  142. package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
  143. package/.agent/skills/vue-expert/SKILL.md +225 -119
  144. package/.agent/skills/vulnerability-scanner/SKILL.md +264 -226
  145. package/.agent/skills/web-accessibility-auditor/SKILL.md +141 -58
  146. package/.agent/skills/web-design-guidelines/SKILL.md +17 -61
  147. package/.agent/skills/webapp-testing/SKILL.md +71 -196
  148. package/.agent/skills/whimsy-injector/SKILL.md +58 -132
  149. package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
  150. package/.agent/workflows/api-tester.md +96 -224
  151. package/.agent/workflows/audit.md +81 -122
  152. package/.agent/workflows/brainstorm.md +69 -105
  153. package/.agent/workflows/changelog.md +65 -97
  154. package/.agent/workflows/create.md +73 -88
  155. package/.agent/workflows/debug.md +80 -111
  156. package/.agent/workflows/deploy.md +119 -92
  157. package/.agent/workflows/enhance.md +80 -91
  158. package/.agent/workflows/fix.md +68 -97
  159. package/.agent/workflows/generate.md +165 -164
  160. package/.agent/workflows/migrate.md +106 -109
  161. package/.agent/workflows/orchestrate.md +103 -86
  162. package/.agent/workflows/performance-benchmarker.md +77 -268
  163. package/.agent/workflows/plan.md +120 -98
  164. package/.agent/workflows/preview.md +39 -96
  165. package/.agent/workflows/refactor.md +105 -97
  166. package/.agent/workflows/review-ai.md +63 -102
  167. package/.agent/workflows/review.md +71 -110
  168. package/.agent/workflows/session.md +53 -113
  169. package/.agent/workflows/status.md +42 -88
  170. package/.agent/workflows/strengthen-skills.md +90 -51
  171. package/.agent/workflows/swarm.md +114 -129
  172. package/.agent/workflows/test.md +125 -102
  173. package/.agent/workflows/tribunal-backend.md +60 -78
  174. package/.agent/workflows/tribunal-database.md +62 -100
  175. package/.agent/workflows/tribunal-frontend.md +62 -82
  176. package/.agent/workflows/tribunal-full.md +56 -100
  177. package/.agent/workflows/tribunal-mobile.md +65 -94
  178. package/.agent/workflows/tribunal-performance.md +62 -105
  179. package/.agent/workflows/ui-ux-pro-max.md +72 -121
  180. package/README.md +11 -15
  181. package/package.json +1 -1
  182. package/.agent/skills/api-patterns/api-style.md +0 -42
  183. package/.agent/skills/api-patterns/auth.md +0 -24
  184. package/.agent/skills/api-patterns/documentation.md +0 -26
  185. package/.agent/skills/api-patterns/graphql.md +0 -41
  186. package/.agent/skills/api-patterns/rate-limiting.md +0 -31
  187. package/.agent/skills/api-patterns/response.md +0 -37
  188. package/.agent/skills/api-patterns/rest.md +0 -40
  189. package/.agent/skills/api-patterns/security-testing.md +0 -122
  190. package/.agent/skills/api-patterns/trpc.md +0 -41
  191. package/.agent/skills/api-patterns/versioning.md +0 -22
  192. package/.agent/skills/app-builder/agent-coordination.md +0 -71
  193. package/.agent/skills/app-builder/feature-building.md +0 -53
  194. package/.agent/skills/app-builder/project-detection.md +0 -34
  195. package/.agent/skills/app-builder/scaffolding.md +0 -118
  196. package/.agent/skills/app-builder/tech-stack.md +0 -40
  197. package/.agent/skills/architecture/context-discovery.md +0 -43
  198. package/.agent/skills/architecture/examples.md +0 -94
  199. package/.agent/skills/architecture/pattern-selection.md +0 -68
  200. package/.agent/skills/architecture/patterns-reference.md +0 -50
  201. package/.agent/skills/architecture/trade-off-analysis.md +0 -77
  202. package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
  203. package/.agent/skills/database-design/database-selection.md +0 -43
  204. package/.agent/skills/database-design/indexing.md +0 -39
  205. package/.agent/skills/database-design/migrations.md +0 -48
  206. package/.agent/skills/database-design/optimization.md +0 -36
  207. package/.agent/skills/database-design/orm-selection.md +0 -30
  208. package/.agent/skills/database-design/schema-design.md +0 -56
  209. package/.agent/skills/dotnet-core-expert/SKILL.md +0 -103
  210. package/.agent/skills/framer-motion-animations/SKILL.md +0 -74
  211. package/.agent/skills/frontend-design/animation-guide.md +0 -331
  212. package/.agent/skills/frontend-design/color-system.md +0 -329
  213. package/.agent/skills/frontend-design/decision-trees.md +0 -418
  214. package/.agent/skills/frontend-design/motion-graphics.md +0 -306
  215. package/.agent/skills/frontend-design/typography-system.md +0 -363
  216. package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
  217. package/.agent/skills/frontend-design/visual-effects.md +0 -383
  218. package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
  219. package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
  220. package/.agent/skills/game-development/SKILL.md +0 -236
  221. package/.agent/skills/game-development/game-art/SKILL.md +0 -185
  222. package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
  223. package/.agent/skills/game-development/game-design/SKILL.md +0 -129
  224. package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
  225. package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
  226. package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
  227. package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
  228. package/.agent/skills/game-development/web-games/SKILL.md +0 -150
  229. package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
  230. package/.agent/skills/mobile-design/decision-trees.md +0 -516
  231. package/.agent/skills/mobile-design/mobile-backend.md +0 -491
  232. package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
  233. package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
  234. package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
  235. package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
  236. package/.agent/skills/mobile-design/mobile-performance.md +0 -767
  237. package/.agent/skills/mobile-design/mobile-testing.md +0 -356
  238. package/.agent/skills/mobile-design/mobile-typography.md +0 -433
  239. package/.agent/skills/mobile-design/platform-android.md +0 -666
  240. package/.agent/skills/mobile-design/platform-ios.md +0 -561
  241. package/.agent/skills/mobile-design/touch-psychology.md +0 -537
  242. package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
  243. package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
  244. package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
  245. package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
  246. package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
  247. package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
  248. package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
  249. package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
  250. package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
@@ -1,107 +1,468 @@
1
1
  ---
2
2
  name: csharp-developer
3
- description: Senior C# developer with mastery of .NET 8+ and the Microsoft ecosystem. Specializing in high-performance web applications, cloud-native solutions, cross-platform development, ASP.NET Core, Blazor, and Entity Framework Core.
3
+ description: Senior C#/.NET developer with mastery of .NET 9+, C# 13, ASP.NET Core Minimal APIs, Entity Framework Core, Blazor, gRPC, AOT compilation, Span<T>/Memory<T> performance, dependency injection, and clean architecture. Covers modern language features, async patterns, testing with xUnit, and production deployment. Use when building .NET applications, APIs, or any C# code.
4
4
  allowed-tools: Read, Write, Edit, Glob, Grep
5
- version: 1.0.0
6
- last-updated: 2026-03-12
5
+ version: 2.0.0
6
+ last-updated: 2026-04-01
7
7
  applies-to-model: gemini-2.5-pro, claude-3-7-sonnet
8
8
  ---
9
9
 
10
- # Csharp Developer - Claude Code Sub-Agent
10
+ # C# / .NET Pro .NET 9+ & C# 13 Mastery
11
11
 
12
- You are a senior C# developer with mastery of .NET 8+ and the Microsoft ecosystem. Your focus spans building high-performance web applications, cloud-native solutions, cross-platform development, and modern C# language features with a focus on clean code and architectural patterns.
12
+ ---
13
13
 
14
- ## Configuration & Context Assessment
15
- When invoked:
16
- 1. Query context manager for existing .NET solution structure and project configuration
17
- 2. Review `.csproj` files, NuGet packages, and solution architecture
18
- 3. Analyze C# patterns, nullable reference types usage, and performance characteristics
19
- 4. Implement solutions leveraging modern C# features and .NET best practices
14
+ ## Modern C# Language Features
20
15
 
21
- ---
16
+ ### Records & Primary Constructors
17
+
18
+ ```csharp
19
+ // Records — immutable data types with value equality
20
+ public record UserDto(string Name, string Email, string Role = "user");
21
+
22
+ // With custom validation
23
+ public record CreateUserRequest(string Name, string Email)
24
+ {
25
+ public string Name { get; init; } = !string.IsNullOrWhiteSpace(Name)
26
+ ? Name.Trim()
27
+ : throw new ArgumentException("Name is required", nameof(Name));
28
+ }
29
+
30
+ // Primary constructors (C# 12+) — classes too
31
+ public class UserService(IUserRepository repo, ILogger<UserService> logger)
32
+ {
33
+ public async Task<User?> GetUserAsync(int id, CancellationToken ct = default)
34
+ {
35
+ logger.LogInformation("Fetching user {UserId}", id);
36
+ return await repo.GetByIdAsync(id, ct);
37
+ }
38
+ }
39
+
40
+ // ❌ HALLUCINATION TRAP: Primary constructor parameters are NOT fields
41
+ // They're captured by closure — don't use them where a field is needed
42
+ // For mutable backing, assign to a private field explicitly
43
+ ```
44
+
45
+ ### Pattern Matching (C# 12+)
46
+
47
+ ```csharp
48
+ // Switch expressions with pattern matching
49
+ public static string ClassifyTemperature(double temp) => temp switch
50
+ {
51
+ < 0 => "Freezing",
52
+ >= 0 and < 15 => "Cold",
53
+ >= 15 and < 25 => "Comfortable",
54
+ >= 25 and < 35 => "Warm",
55
+ >= 35 => "Hot",
56
+ };
57
+
58
+ // Property patterns
59
+ public static decimal CalculateDiscount(Order order) => order switch
60
+ {
61
+ { Total: > 1000, Customer.IsPremium: true } => 0.20m,
62
+ { Total: > 500 } => 0.10m,
63
+ { Customer.IsPremium: true } => 0.05m,
64
+ _ => 0m,
65
+ };
66
+
67
+ // List patterns (C# 11+)
68
+ public static string DescribeArray(int[] arr) => arr switch
69
+ {
70
+ [] => "Empty",
71
+ [var single] => $"Single: {single}",
72
+ [var first, .., var last] => $"First: {first}, Last: {last}",
73
+ };
74
+ ```
75
+
76
+ ### Collection Expressions & Ranges
77
+
78
+ ```csharp
79
+ // Collection expressions (C# 12+)
80
+ List<int> numbers = [1, 2, 3, 4, 5];
81
+ int[] array = [10, 20, 30];
82
+ Span<byte> bytes = [0xFF, 0x00, 0xAB];
83
+
84
+ // Spread operator
85
+ int[] combined = [..numbers, ..array, 99];
86
+
87
+ // Ranges and indices
88
+ var last = array[^1]; // last element
89
+ var slice = array[1..^1]; // skip first and last
90
+ var firstThree = array[..3]; // first 3 elements
91
+ ```
92
+
93
+ ### Nullable Reference Types
94
+
95
+ ```csharp
96
+ // Enable globally in .csproj
97
+ // <Nullable>enable</Nullable>
98
+
99
+ public class UserService
100
+ {
101
+ // Non-nullable — compiler enforces this is never null
102
+ public string GetDisplayName(User user)
103
+ {
104
+ return user.DisplayName ?? user.Email; // DisplayName might be null
105
+ }
22
106
 
23
- ## The C# Excellence Checklist
24
- - Nullable reference types enabled
25
- - Code analysis with `.editorconfig`
26
- - StyleCop and analyzer compliance
27
- - Test coverage exceeding 80%
28
- - API versioning implemented
29
- - Performance profiling completed
30
- - Security scanning passed
31
- - Documentation XML generated
107
+ // Nullable return caller MUST handle null
108
+ public async Task<User?> FindUserAsync(string email, CancellationToken ct)
109
+ {
110
+ return await _db.Users.FirstOrDefaultAsync(u => u.Email == email, ct);
111
+ }
112
+
113
+ // ❌ HALLUCINATION TRAP: Never use the null-forgiving operator (!) to suppress warnings
114
+ // var user = await FindUserAsync(email, ct)!; ← hides nulls, crashes at runtime
115
+ // var user = await FindUserAsync(email, ct) ?? throw new NotFoundException("User");
116
+ }
117
+ ```
32
118
 
33
119
  ---
34
120
 
35
- ## Core Architecture Decision Framework
121
+ ## ASP.NET Core Minimal APIs
122
+
123
+ ### Route Structure
124
+
125
+ ```csharp
126
+ var builder = WebApplication.CreateBuilder(args);
127
+
128
+ // Services
129
+ builder.Services.AddDbContext<AppDbContext>(options =>
130
+ options.UseNpgsql(builder.Configuration.GetConnectionString("Default")));
131
+ builder.Services.AddScoped<IUserService, UserService>();
132
+ builder.Services.AddEndpointsApiExplorer();
133
+ builder.Services.AddSwaggerGen();
36
134
 
37
- ### Modern C# Patterns & Language Features
38
- * **Immutability & Types:** Record types, Nullable reference types discipline, Global using directives.
39
- * **Control Flow & Expressions:** Pattern matching expressions, LINQ optimization techniques, Expression trees usage.
40
- * **Advanced Concepts:** Async/await best practices, Source generators adoption.
41
- * **Async Programming:** `ConfigureAwait` usage, Cancellation tokens, Async streams, `Parallel.ForEachAsync`, Channels for producers, Exception handling, Deadlock prevention.
135
+ var app = builder.Build();
136
+
137
+ // Middleware
138
+ if (app.Environment.IsDevelopment())
139
+ {
140
+ app.UseSwagger();
141
+ app.UseSwaggerUI();
142
+ }
143
+ app.UseHttpsRedirection();
144
+ app.UseAuthentication();
145
+ app.UseAuthorization();
146
+
147
+ // Route groups
148
+ var api = app.MapGroup("/api").RequireAuthorization();
149
+
150
+ var users = api.MapGroup("/users").WithTags("Users");
151
+ users.MapGet("/", GetUsersAsync);
152
+ users.MapGet("/{id:int}", GetUserByIdAsync);
153
+ users.MapPost("/", CreateUserAsync).AllowAnonymous();
154
+ users.MapPut("/{id:int}", UpdateUserAsync);
155
+ users.MapDelete("/{id:int}", DeleteUserAsync);
156
+
157
+ app.Run();
158
+ ```
42
159
 
43
- ### ASP.NET Core & Blazor Development
44
- * **Minimal APIs:** Middleware pipeline optimization, Endpoint filters, OpenAPI integration, Route groups, custom model binding, Output caching strategies, Health checks.
45
- * **Blazor:** Component architecture design, State management patterns, JavaScript interop, WebAssembly optimization, Server-side vs WASM, Component lifecycle, Real-time with SignalR.
46
- * **gRPC Integration:** Service definition, Client factory setup, Interceptors, Streaming patterns.
160
+ ### Handler Methods
47
161
 
48
- ### Entity Framework Core & Data Access
49
- * Code-first migrations and Interceptors
50
- * Query optimization, compiled queries, and bulk operations
51
- * Complex relationships and change tracking optimization
52
- * Multi-tenancy implementation
162
+ ```csharp
163
+ static async Task<Results<Ok<UserDto>, NotFound>> GetUserByIdAsync(
164
+ int id,
165
+ IUserService userService,
166
+ CancellationToken ct)
167
+ {
168
+ var user = await userService.GetByIdAsync(id, ct);
169
+ return user is not null
170
+ ? TypedResults.Ok(user.ToDto())
171
+ : TypedResults.NotFound();
172
+ }
53
173
 
54
- ### Extreme Performance & Architecture Patterns
55
- * `Span<T>` and `Memory<T>` usage, ArrayPool for allocations
56
- * ValueTask patterns, SIMD operations
57
- * AOT compilation readiness, trimming compatibility
58
- * Clean Architecture setup, CQRS with MediatR, Repository pattern, Result/Options pattern.
174
+ static async Task<Results<Created<UserDto>, ValidationProblem>> CreateUserAsync(
175
+ CreateUserRequest request,
176
+ IUserService userService,
177
+ IValidator<CreateUserRequest> validator,
178
+ CancellationToken ct)
179
+ {
180
+ var validation = await validator.ValidateAsync(request, ct);
181
+ if (!validation.IsValid)
182
+ return TypedResults.ValidationProblem(validation.ToDictionary());
183
+
184
+ var user = await userService.CreateAsync(request, ct);
185
+ return TypedResults.Created($"/api/users/{user.Id}", user.ToDto());
186
+ }
187
+
188
+ // ❌ HALLUCINATION TRAP: Always accept CancellationToken in async handlers
189
+ // ASP.NET Core provides it automatically via DI
190
+ // Without it, requests can't be cancelled on client disconnect
191
+ ```
192
+
193
+ ### Endpoint Filters (Middleware for Endpoints)
194
+
195
+ ```csharp
196
+ // Validation filter
197
+ public class ValidationFilter<T> : IEndpointFilter where T : class
198
+ {
199
+ public async ValueTask<object?> InvokeAsync(
200
+ EndpointFilterInvocationContext ctx,
201
+ EndpointFilterDelegate next)
202
+ {
203
+ var validator = ctx.HttpContext.RequestServices.GetService<IValidator<T>>();
204
+ var argument = ctx.Arguments.OfType<T>().FirstOrDefault();
205
+
206
+ if (validator is not null && argument is not null)
207
+ {
208
+ var result = await validator.ValidateAsync(argument);
209
+ if (!result.IsValid)
210
+ return TypedResults.ValidationProblem(result.ToDictionary());
211
+ }
212
+
213
+ return await next(ctx);
214
+ }
215
+ }
216
+
217
+ // Usage:
218
+ users.MapPost("/", CreateUserAsync)
219
+ .AddEndpointFilter<ValidationFilter<CreateUserRequest>>();
220
+ ```
59
221
 
60
222
  ---
61
223
 
62
- ## Output Format
224
+ ## Entity Framework Core
63
225
 
64
- When this skill produces or reviews code, structure your output as follows:
226
+ ### DbContext & Configuration
65
227
 
228
+ ```csharp
229
+ public class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options)
230
+ {
231
+ public DbSet<User> Users => Set<User>();
232
+ public DbSet<Post> Posts => Set<Post>();
233
+
234
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
235
+ {
236
+ modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
237
+ }
238
+
239
+ // Auto-set timestamps
240
+ public override async Task<int> SaveChangesAsync(CancellationToken ct = default)
241
+ {
242
+ foreach (var entry in ChangeTracker.Entries<BaseEntity>())
243
+ {
244
+ if (entry.State == EntityState.Added)
245
+ entry.Entity.CreatedAt = DateTime.UtcNow;
246
+ if (entry.State is EntityState.Added or EntityState.Modified)
247
+ entry.Entity.UpdatedAt = DateTime.UtcNow;
248
+ }
249
+ return await base.SaveChangesAsync(ct);
250
+ }
251
+ }
252
+
253
+ // Entity configuration (separate file per entity)
254
+ public class UserConfiguration : IEntityTypeConfiguration<User>
255
+ {
256
+ public void Configure(EntityTypeBuilder<User> builder)
257
+ {
258
+ builder.HasIndex(u => u.Email).IsUnique();
259
+ builder.Property(u => u.Name).HasMaxLength(100).IsRequired();
260
+ builder.Property(u => u.Email).HasMaxLength(255).IsRequired();
261
+ builder.HasMany(u => u.Posts).WithOne(p => p.Author).HasForeignKey(p => p.AuthorId);
262
+ }
263
+ }
66
264
  ```
67
- ━━━ Csharp Developer Report ━━━━━━━━━━━━━━━━━━━━━━━━
68
- Skill: Csharp Developer
69
- Language: [detected language / framework]
70
- Scope: [N files · N functions]
71
- ─────────────────────────────────────────────────
72
- Passed: [checks that passed, or "All clean"]
73
- ⚠️ Warnings: [non-blocking issues, or "None"]
74
- Blocked: [blocking issues requiring fix, or "None"]
75
- ─────────────────────────────────────────────────
76
- VBC status: PENDING → VERIFIED
77
- Evidence: [test output / lint pass / compile success]
265
+
266
+ ### Query Patterns
267
+
268
+ ```csharp
269
+ // ✅ Efficient queries — project to DTOs at the database level
270
+ public async Task<List<UserDto>> GetActiveUsersAsync(CancellationToken ct)
271
+ {
272
+ return await _db.Users
273
+ .AsNoTracking() // read-only — no change tracking overhead
274
+ .Where(u => u.IsActive)
275
+ .OrderByDescending(u => u.CreatedAt)
276
+ .Select(u => new UserDto(u.Name, u.Email, u.Role)) // projects SQL SELECT
277
+ .ToListAsync(ct);
278
+ }
279
+
280
+ // ❌ HALLUCINATION TRAP: Loading entities then mapping is N+1 and memory waste
281
+ // ❌ var users = await _db.Users.ToListAsync(ct); ← loads ALL columns, ALL rows
282
+ // return users.Select(u => new UserDto(u.Name, u.Email)); ← maps in memory
283
+ // ✅ Use .Select() BEFORE .ToListAsync() to project at DB level
284
+
285
+ // Pagination
286
+ public async Task<PagedResult<UserDto>> GetUsersPagedAsync(int page, int pageSize, CancellationToken ct)
287
+ {
288
+ var query = _db.Users.AsNoTracking().Where(u => u.IsActive);
289
+
290
+ var totalCount = await query.CountAsync(ct);
291
+ var items = await query
292
+ .OrderBy(u => u.Id)
293
+ .Skip((page - 1) * pageSize)
294
+ .Take(pageSize)
295
+ .Select(u => new UserDto(u.Name, u.Email, u.Role))
296
+ .ToListAsync(ct);
297
+
298
+ return new PagedResult<UserDto>(items, totalCount, page, pageSize);
299
+ }
300
+
301
+ // Compiled queries (for hot paths)
302
+ private static readonly Func<AppDbContext, string, CancellationToken, Task<User?>> _getUserByEmail =
303
+ EF.CompileAsyncQuery((AppDbContext db, string email, CancellationToken ct) =>
304
+ db.Users.FirstOrDefault(u => u.Email == email));
305
+ ```
306
+
307
+ ---
308
+
309
+ ## Async Patterns
310
+
311
+ ```csharp
312
+ // ✅ Correct async patterns
313
+ public async Task<Result<User>> ProcessUserAsync(int id, CancellationToken ct)
314
+ {
315
+ // Parallel async operations
316
+ var (user, permissions) = await (
317
+ _userRepo.GetByIdAsync(id, ct),
318
+ _permissionService.GetPermissionsAsync(id, ct)
319
+ );
320
+
321
+ // Async streams (IAsyncEnumerable)
322
+ await foreach (var notification in GetNotificationsAsync(id, ct))
323
+ {
324
+ await SendNotificationAsync(notification, ct);
325
+ }
326
+
327
+ return Result.Ok(user);
328
+ }
329
+
330
+ // Channels (producer-consumer)
331
+ var channel = Channel.CreateBounded<WorkItem>(100);
332
+
333
+ // Producer
334
+ async Task ProduceAsync(ChannelWriter<WorkItem> writer, CancellationToken ct)
335
+ {
336
+ await foreach (var item in GetWorkItemsAsync(ct))
337
+ {
338
+ await writer.WriteAsync(item, ct);
339
+ }
340
+ writer.Complete();
341
+ }
342
+
343
+ // Consumer
344
+ async Task ConsumeAsync(ChannelReader<WorkItem> reader, CancellationToken ct)
345
+ {
346
+ await foreach (var item in reader.ReadAllAsync(ct))
347
+ {
348
+ await ProcessAsync(item, ct);
349
+ }
350
+ }
351
+
352
+ // ❌ HALLUCINATION TRAP: Never use .Result or .Wait() on async methods
353
+ // ❌ var user = GetUserAsync(id).Result; ← deadlock risk
354
+ // ❌ GetUserAsync(id).Wait(); ← deadlock risk
355
+ // ✅ var user = await GetUserAsync(id, ct);
78
356
  ```
79
357
 
80
- **VBC (Verification-Before-Completion) is mandatory.**
81
- Do not mark status as VERIFIED until concrete terminal evidence is provided.
358
+ ---
359
+
360
+ ## Performance Patterns
361
+
362
+ ```csharp
363
+ // Span<T> — zero-allocation slicing
364
+ public static ReadOnlySpan<char> ExtractDomain(ReadOnlySpan<char> email)
365
+ {
366
+ var atIndex = email.IndexOf('@');
367
+ return atIndex >= 0 ? email[(atIndex + 1)..] : ReadOnlySpan<char>.Empty;
368
+ }
82
369
 
370
+ // ArrayPool — rent instead of allocate
371
+ public static void ProcessLargeData()
372
+ {
373
+ var buffer = ArrayPool<byte>.Shared.Rent(8192);
374
+ try
375
+ {
376
+ // Use buffer...
377
+ }
378
+ finally
379
+ {
380
+ ArrayPool<byte>.Shared.Return(buffer);
381
+ }
382
+ }
383
+
384
+ // Frozen collections (immutable, optimized lookup)
385
+ FrozenDictionary<string, int> lookup = new Dictionary<string, int>
386
+ {
387
+ ["admin"] = 1,
388
+ ["user"] = 2,
389
+ ["moderator"] = 3,
390
+ }.ToFrozenDictionary();
391
+ ```
83
392
 
84
393
  ---
85
394
 
86
- ## 🏛️ Tribunal Integration (Anti-Hallucination)
395
+ ## Testing with xUnit
396
+
397
+ ```csharp
398
+ public class UserServiceTests
399
+ {
400
+ private readonly Mock<IUserRepository> _repoMock = new();
401
+ private readonly Mock<ILogger<UserService>> _loggerMock = new();
402
+ private readonly UserService _sut;
403
+
404
+ public UserServiceTests()
405
+ {
406
+ _sut = new UserService(_repoMock.Object, _loggerMock.Object);
407
+ }
408
+
409
+ [Fact]
410
+ public async Task GetUserAsync_ReturnsUser_WhenFound()
411
+ {
412
+ // Arrange
413
+ var expected = new User { Id = 1, Name = "Alice", Email = "alice@test.com" };
414
+ _repoMock.Setup(r => r.GetByIdAsync(1, It.IsAny<CancellationToken>()))
415
+ .ReturnsAsync(expected);
87
416
 
88
- **Slash command: `/tribunal-backend`**
89
- **Active reviewers: `logic` · `security` · `dependency` · `type-safety`**
417
+ // Act
418
+ var result = await _sut.GetUserAsync(1);
90
419
 
91
- ### ❌ Forbidden AI Tropes in C#
92
- 1. **Missing Async/Await** — always use async methods for I/O bound operations. Never use `.Wait()` or `.Result` synchronously.
93
- 2. **Ignoring Nullable Reference Types** — always respect `?` and `!` annotations; do not hallucinate null-checks if the compiler validates it.
94
- 3. **Leaking Entity instances to APIs** — always use DTOs or ViewModels instead of returning raw Entity Framework models from controllers/Minimal APIs.
95
- 4. **Hardcoded Connection Strings** — always use `IConfiguration` or secret managers (Azure Key Vault).
96
- 5. **Inefficient LINQ** — beware of multiple enumeration or pulling entire DB tables into memory before filtering (`.ToList().Where(...)`).
420
+ // Assert
421
+ Assert.NotNull(result);
422
+ Assert.Equal("Alice", result.Name);
423
+ }
97
424
 
98
- ### ✅ Pre-Flight Self-Audit
425
+ [Fact]
426
+ public async Task GetUserAsync_ReturnsNull_WhenNotFound()
427
+ {
428
+ _repoMock.Setup(r => r.GetByIdAsync(999, It.IsAny<CancellationToken>()))
429
+ .ReturnsAsync((User?)null);
99
430
 
100
- Review these questions before generating C# code:
101
- ```text
102
- ✅ Did I maximize the use of modern C# features (records, pattern matching, primary constructors)?
103
- ✅ Are all asynchronous methods passing `CancellationToken` correctly?
104
- ✅ Is dependency injection configured properly without anti-patterns (e.g. Service Locator)?
105
- ✅ Are my Minimal APIs grouped and versioned properly?
106
- Did I use MediatR or Repository layers instead of stuffing logic into the Endpoint/Controller?
431
+ var result = await _sut.GetUserAsync(999);
432
+
433
+ Assert.Null(result);
434
+ }
435
+
436
+ [Theory]
437
+ [InlineData("", "required")]
438
+ [InlineData("ab", "too short")]
439
+ public async Task CreateUser_Fails_WithInvalidName(string name, string expectedError)
440
+ {
441
+ var request = new CreateUserRequest(name, "test@test.com");
442
+
443
+ var ex = await Assert.ThrowsAsync<ValidationException>(
444
+ () => _sut.CreateAsync(request));
445
+
446
+ Assert.Contains(expectedError, ex.Message, StringComparison.OrdinalIgnoreCase);
447
+ }
448
+ }
449
+
450
+ // Integration test with WebApplicationFactory
451
+ public class UsersApiTests(WebApplicationFactory<Program> factory)
452
+ : IClassFixture<WebApplicationFactory<Program>>
453
+ {
454
+ private readonly HttpClient _client = factory.CreateClient();
455
+
456
+ [Fact]
457
+ public async Task GetUsers_Returns200()
458
+ {
459
+ var response = await _client.GetAsync("/api/users");
460
+ response.EnsureSuccessStatusCode();
461
+
462
+ var users = await response.Content.ReadFromJsonAsync<List<UserDto>>();
463
+ Assert.NotNull(users);
464
+ }
465
+ }
107
466
  ```
467
+
468
+ ---