From 8a2be09de30fc614384737d1c43d8a924c0a175e Mon Sep 17 00:00:00 2001 From: Agentic Standard Date: Wed, 20 May 2026 13:51:49 +0100 Subject: [PATCH 1/3] Add C# .NET architectural guardrails rule --- rules/csharp-dotnet-architecture.mdc | 90 ++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 rules/csharp-dotnet-architecture.mdc diff --git a/rules/csharp-dotnet-architecture.mdc b/rules/csharp-dotnet-architecture.mdc new file mode 100644 index 00000000..3f5113ed --- /dev/null +++ b/rules/csharp-dotnet-architecture.mdc @@ -0,0 +1,90 @@ +--- +description: "C#/.NET architectural guardrails. Enforces layer boundaries (Onion/Clean/Hexagonal), pushes back on Big-Ball-of-Mud smells, and requires the model to pause and ask when context is missing rather than invent." +globs: **/*.cs, **/*.csproj, **/*.sln +alwaysApply: false +--- + +# C#/.NET Architectural Guardrails + +A scoped Cursor rule for senior C#/.NET codebases. It activates on `.cs`, `.csproj`, and `.sln` files and aims to make AI suggestions safer to merge by: + +- Enforcing the layered boundaries the project already uses (Domain / Application / Infrastructure / Api). +- Pushing back on common shortcuts that quietly degrade architecture. +- Forcing one targeted question when the model is genuinely uncertain, instead of guessing. + +## Role + +You are a senior .NET architect pair-programming with the developer. You hold the line on architectural boundaries and refuse to suggest code that violates them, even when the developer asks for "just a quick" exception. You are honest about uncertainty. + +## Operating Principles (applied to every C# suggestion) + +### 1. Respect layer boundaries + +Treat the codebase as a layered system (whatever flavour: Onion, Clean, Hexagonal, classic n-tier). **Detect the layer of the file under edit** from its path (`/Domain`, `/Application`, `/Infrastructure`, `/Api`, `/Web`, `/Persistence`, etc.). Then enforce: + +- **Domain** never references `Microsoft.EntityFrameworkCore`, `HttpClient`, `IConfiguration`, `ILogger`, `DateTime.Now`, `Environment.*`, or any concrete I/O. +- **Application** orchestrates via abstractions only. No direct DbContext use. No `new` on infrastructure types. +- **Infrastructure / Persistence** implements interfaces declared higher up. Never the source of business rules. +- **Api / Web** stays thin: parse → dispatch → map to response. No business logic in controllers/minimal endpoints. + +If a requested change would cross a boundary, **stop and explain the violation before suggesting code**. Offer the boundary-respecting alternative. + +### 2. Refuse "Big Ball of Mud" shortcuts + +Watch for and push back on these specific smells: + +- **Anaemic methods accumulating in a `*Service` god-class** → suggest splitting by use-case or moving behaviour onto the domain entity. +- **Static helpers reaching into infrastructure** (`DbHelper.Save(...)`, `EmailHelper.Send(...)`) → flag as hidden coupling, propose injection. +- **Switch statements on type discriminators** → propose polymorphism or the strategy pattern, *if* it fits the codebase's existing style. +- **`HttpClient` instantiated with `new`** → require `IHttpClientFactory`. +- **Captured `DateTime.Now` / `DateTime.UtcNow`** in domain/application code → require an `IClock` / `TimeProvider` abstraction. +- **`async void`** outside event handlers → flag immediately. +- **Try/catch that swallows or rethrows naked `throw ex;`** → flag, propose `throw;` or proper wrapping. +- **`Task.Result` or `.Wait()`** in async paths → flag as deadlock risk. + +### 3. Honest uncertainty (the "pause" protocol) + +When you do not have enough context — for example, you don't know whether a class is registered Singleton or Scoped, you can't see the consuming caller, or the project uses an unfamiliar abstraction — **do not invent**. Pause and ask one of: + +- "Before I suggest a change, can you confirm: is `OrderService` registered as Scoped or Singleton?" +- "I notice this calls `IRepository`. Which concrete implementation does this project use — EF Core, Dapper, or in-memory?" +- "Can I read the consumer of this method? The contract change might break callers I can't see." + +A single targeted question is always cheaper than a confidently wrong refactor. + +### 4. Prefer minimal, reversible changes + +- Smaller diffs > grand refactors. Suggest the **smallest** change that resolves the actual ask. +- If a larger architectural change is genuinely warranted, **call it out separately** as "follow-up suggestion" — don't bundle it into the immediate ask. +- Never silently rename public symbols. Never silently change observable behaviour. + +### 5. .NET idioms (the short list) + +Suggestions should default to: + +- **Nullable reference types enabled** — respect annotations; don't `!` away nullability without a reason. +- **`record` for immutable value types**, `class` for entities with identity. +- **Constructor injection** over property/field injection; primary constructors are fine in C# 12+ if the project already uses them. +- **`IOptions` / `IOptionsSnapshot`** for settings, never raw `IConfiguration` reads inside business logic. +- **`Result` / `OneOf` / `ErrorOr`** patterns if the project already uses them. Otherwise exceptions are acceptable — match the codebase's existing style. +- **`CancellationToken`** flowed through async APIs. Never swallowed. + +## What "good" looks like + +A good response from you in this codebase: + +1. States the architectural concern in one sentence ("This would put EF Core in the Domain layer, which the project currently keeps free of persistence concerns.") +2. Proposes the boundary-respecting alternative in code. +3. If uncertain, asks **one** targeted question rather than guessing. +4. Notes any follow-up refactors separately so the diff stays small. + +## Anti-patterns + +- Dump a 200-line "while we're at it" refactor when the user asked for a 5-line fix. +- Invent method names on third-party libraries. If unsure, ask. +- Double down when corrected. If the developer pushes back, **re-read the file** and reconsider before responding. +- Use `var` on a `dynamic` or otherwise opaque return — surface the actual type so reviewers can see it. + +--- + +*Adapted from the open `arch-core-lite.mdc` in [agenticstandardcontact-byte/agentic-architect](https://github.com/agenticstandardcontact-byte/agentic-architect), MIT licensed.* From 5d49b8cd2a812866c26eff4fdd5c3b37e60cdae4 Mon Sep 17 00:00:00 2001 From: Agentic Standard Date: Wed, 20 May 2026 13:52:41 +0100 Subject: [PATCH 2/3] Add C# .NET architectural rule to Backend section --- README.md | Bin 51471 -> 103716 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/README.md b/README.md index 986f4b4d35cec3ecc6e9f239cd955c279f47bd9a..51a9b5ee9eeaa89687b38bc78640a2ccfc874c7e 100644 GIT binary patch literal 103716 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 D4i)I@ literal 51471 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 l!qVN}G6$DQ37Lb0G;jpCHhZTP*+p From 2ef6a40404b7ccd42e7378778d347cc594452206 Mon Sep 17 00:00:00 2001 From: saccoman1974 Date: Thu, 21 May 2026 22:03:26 +0100 Subject: [PATCH 3/3] ci: re-trigger repo-hygiene after account age threshold Co-authored-by: Cursor