Refs #10. Adds docs/contributing.md — a descriptive guide to the patterns already in the codebase (not a redesign), so future changes extend the established architecture instead of reinventing it. CLAUDE.md points to it so it loads as project guidance.
Sections (each example-driven, with file references)
Architecture & layering (the dependency-direction table, now enforced by #12)
CQRS handler conventions (action-named recordIRequest<T>; validation in handlers)
Functional style — LanguageExt (Option/Either/Validation, using static …Prelude)
Testing (NUnit + Shouldly + NSubstitute — not xUnit; golden #11 / arch #12 tests; TZ=UTC)
Build / CI (CPM #14, the pipeline, → docs/ci-cd.md)
Deviation policy (the guiding principle: match the style; diverge only with a stated reason)
Notes
Built with a parallel read-only survey across the four areas not touched this session (CQRS, LanguageExt, Blazor, FFmpeg); the rest is from the foundations work just landed. All file references verified to exist.
Corrects the issue's "xUnit" → the project uses NUnit.
Docs-only; the last of the foundations batch (#14, #8, #15-incr1, #12, #11, #13, #16 already merged).
Refs #10. Adds `docs/contributing.md` — a **descriptive** guide to the patterns already in the codebase (not a redesign), so future changes extend the established architecture instead of reinventing it. `CLAUDE.md` points to it so it loads as project guidance.
## Sections (each example-driven, with file references)
1. Architecture & layering (the dependency-direction table, now enforced by #12)
2. CQRS handler conventions (action-named `record` `IRequest<T>`; validation in handlers)
3. Functional style — LanguageExt (`Option`/`Either`/`Validation`, `using static …Prelude`)
4. Blazor / MudBlazor (thin pages → MediatR; CTS lifecycle; MudForm + Blazored validation; dialogs)
5. Data access / EF Core + **dual-provider migrations** (enforced by #13)
6. FFmpeg pipeline (step-based composition, runtime capability detection, version-gating — feeds #9)
7. Naming / formatting / analyzers (`.editorconfig`, TWAE/NoWarn, the #15 promotion model)
8. Testing (**NUnit** + Shouldly + NSubstitute — *not* xUnit; golden #11 / arch #12 tests; `TZ=UTC`)
9. Build / CI (CPM #14, the pipeline, → `docs/ci-cd.md`)
10. **Deviation policy** (the guiding principle: match the style; diverge only with a stated reason)
## Notes
- Built with a parallel read-only survey across the four areas not touched this session (CQRS, LanguageExt, Blazor, FFmpeg); the rest is from the foundations work just landed. **All file references verified to exist.**
- Corrects the issue's "xUnit" → the project uses **NUnit**.
- Docs-only; the last of the foundations batch (#14, #8, #15-incr1, #12, #11, #13, #16 already merged).
docs/contributing.md — a descriptive guide to the established patterns, derived from
the existing code: architecture/layering, CQRS handler conventions, LanguageExt
functional style, Blazor/MudBlazor UI, EF Core + dual-provider migrations, the FFmpeg
pipeline pattern, naming/formatting/analyzers, testing, and build/CI — each with
concrete file references — plus the deviation policy (match the established style;
diverge only with a concrete, stated reason). Several sections are now CI-enforced
(#12 layering, #15 analyzers, #13 migrations, #11 golden tests). CLAUDE.md points to
it so it's loaded as project guidance.
Survey across the sections done with parallel read-only agents; all file references
verified to exist.
Refs #10
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
timothy
merged commit 969a23909a into main2026-06-27 11:52:04 +02:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Refs #10. Adds
docs/contributing.md— a descriptive guide to the patterns already in the codebase (not a redesign), so future changes extend the established architecture instead of reinventing it.CLAUDE.mdpoints to it so it loads as project guidance.Sections (each example-driven, with file references)
recordIRequest<T>; validation in handlers)Option/Either/Validation,using static …Prelude).editorconfig, TWAE/NoWarn, the #15 promotion model)TZ=UTC)docs/ci-cd.md)Notes