| name | development-workflow |
| description | ReactiveProperty repository development policy. Use whenever you implement a feature or bug fix, change library or test code under Source/ or Test/, make a design or architecture decision, or write documentation in this repo. Enforces strict Test-Driven Development (Red -> Green -> Refactor) with MSTest and `dotnet test ReactiveProperty.slnx`, requires recording design decisions as ADRs under dev-docs/adr/, and defines the documentation split: docs/ is user-facing (published via VuePress) while dev-docs/ holds implementer/contributor documentation. Triggers include "implement", "add feature", "fix bug", "TDD", "red green refactor", "design decision", "architecture", "ADR", "where do docs go", and "contributor docs". |
Development Workflow (ReactiveProperty)
The required development workflow and documentation policy for this repository.
When to Use
- Implementing any feature or bug fix in
Source/ or Test/.
- Making a design or architecture decision (public API shape, threading model, new package, dependency, breaking change).
- Deciding where a piece of documentation belongs.
When Not to Use
- Pure release/versioning mechanics (see
AGENTS.md and the build/publish workflow).
- One-off exploration or read-only investigation with no code change.
1. TDD is mandatory — Red → Green → Refactor
Every code change to Source/ must be driven by a failing test first. Follow the cycle
strictly and do not skip steps:
- Red — Write the smallest test that expresses the desired behavior, then run it and
watch it fail. The failure must be for the right reason (asserting the new behavior,
not a compile error you didn't expect).
dotnet test ReactiveProperty.slnx
Narrow the loop while iterating, e.g. a single project or filter:
dotnet test Test/ReactiveProperty.NETStandard.Tests/ReactiveProperty.NETStandard.Tests.csproj --filter "FullyQualifiedName~YourNewTest"
- Green — Write the minimum production code to make the test pass. Re-run the
tests and confirm they are green. Don't add unrequested functionality.
- Refactor — With tests green, clean up production and test code (naming, duplication,
structure). Re-run tests after refactoring; they must stay green. Behavior must not change.
Rules:
- Never write production code without a failing test that requires it.
- Keep each Red→Green→Refactor cycle small and focused on one behavior.
- A change is not "done" until
dotnet test ReactiveProperty.slnx passes on Windows
(WPF/UWP projects require Windows).
Test conventions (this repo)
- Framework: MSTest (
MSTest.TestAdapter / MSTest.TestFramework).
- Helpers available: Moq, Microsoft.Reactive.Testing (
TestScheduler for time-based
Rx), the bundled ChainingAssertion (actual.Is(expected) fluent assertions); Blazor
tests use bunit.
- Put tests in the matching
Test/* project; the core test project uses namespace
ReactiveProperty.Tests.
- Keep new
Source/ code compatible with netstandard2.0 / net472 (lowest TFMs).
See the writing-mstest-tests and run-tests skills for MSTest authoring details and
filter/runner syntax.
2. Record design decisions as ADRs
Going forward, every non-trivial design / architecture decision is recorded as an
Architecture Decision Record (ADR).
Write an ADR when you:
- add or remove a public API surface, or change its semantics;
- add a new package/project or a new external dependency;
- change threading/scheduling, validation, or serialization behavior;
- make a breaking change or deprecate something;
- choose between competing implementation approaches with long-term impact.
How:
- ADRs live in
dev-docs/adr/, one file per decision.
- Copy
dev-docs/adr/template.md, name it NNNN-short-title.md with the next zero-padded
number (e.g. 0002-...), and fill in Status, Context, Decision, Consequences.
- New ADRs start as
Status: Proposed; mark Accepted once agreed. Don't edit accepted
ADRs to reverse a decision — add a new ADR that supersedes the old one and update both
Status lines.
- Add the new ADR to the index in
dev-docs/adr/README.md.
Trivial, reversible choices (local refactors, naming) do not need an ADR.
3. Documentation split: docs/ vs dev-docs/
docs/ = user-facing documentation, published as the VuePress site
(npm run docs:build). Write here for library consumers: getting-started, API usage,
samples. Available in English and Japanese (*-ja).
dev-docs/ = implementer/contributor-facing documentation, not published.
Write here for people working on ReactiveProperty: architecture notes, internal design,
contributor workflow, and ADRs (dev-docs/adr/).
When you add documentation, pick the audience first:
- "How does a consumer use this feature?" →
docs/.
- "How/why is this implemented, or how do I contribute?" →
dev-docs/.
Checklist before finishing a change