Commit bf45445
authored
Add AI Instruction Files for GitHub Copilot (#1078)
* Add AI instruction files for DynamicData
Three instruction files for GitHub Copilot and AI assistants:
1. .github/copilot-instructions.md — General overview
- What DynamicData is and why it matters
- Why performance and Rx compliance are critical
- Repository structure (public API surface, not internals)
- Operator architecture pattern (extension method -> internal class -> Run())
- Thread safety principles
- Breaking change policy
- Testing patterns
2. .github/instructions/rx-contracts.instructions.md — Comprehensive Rx guide
- Core concepts: composability, hot vs cold, Publish/RefCount
- The Observable contract (serialized notifications, terminal semantics)
- Scheduler guide: all common schedulers, injection for testability
- Complete Disposable helper guide: Disposable.Create, CompositeDisposable,
SerialDisposable, SingleAssignmentDisposable, RefCountDisposable,
BooleanDisposable, CancellationDisposable
- Writing custom operators (single-source and multi-source patterns)
- Operator review checklist
- Common pitfalls (cold re-subscribe, leak, sync-over-async, Subject exposure)
3. .github/instructions/dynamicdata-operators.instructions.md — Operator guide
- Changeset model and change reasons
- Complete operator catalog with detailed code examples:
Filtering, Transformation, Sorting, Paging, Grouping, Joining,
Combining, Aggregation, Fan-out/Fan-in, Refresh, Lifecycle,
Buffering, Binding, Utilities
- How to write a new operator (10-step guide)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Revise AI instructions: remove internal fix references, add Rx operator catalog
Changes:
- Remove all references to deadlock fixes, queue-drain pattern,
SharedDeliveryQueue, SynchronizeSafe (these are PR-specific concepts
that don't exist in the main branch yet)
- Thread safety guidance uses neutral language about Synchronize behavior
- Add comprehensive standard Rx operator reference table (~80 operators)
organized by category: Creation, Transformation, Filtering, Combining,
Aggregation, Error Handling, Scheduling, Utility
- Each operator has a concise description
* Rename rx-contracts → rx, link both instruction files from main
- rx-contracts.instructions.md → rx.instructions.md (covers far more than contracts)
- copilot-instructions.md now links to both rx.instructions.md and
dynamicdata-operators.instructions.md
* Expand testing section, update breaking changes for SemVer
Testing section expanded from 7 lines to ~340 lines covering:
- Both observation patterns (AsAggregator vs RecordCacheItems)
- Required test coverage per operator (10 categories)
- Rx contract validation with ValidateSynchronization
- Completion/error propagation testing with TestSourceCache
- Multi-threaded stress test patterns with Barrier
- Regression test requirements (mandatory for all bug fixes)
- Stub/fixture pattern, changeset assertion techniques
- Complete test utilities reference table
- Domain types catalog with Bogus faker usage
- Anti-patterns with bad/good examples
Breaking changes updated: SemVer allows them in major versions,
but they must be explicitly called out to the maintainer.
* Expand operator docs: rename, add change reason tables, add list guide
- Rename dynamicdata-operators → dynamicdata-cache (it's cache-specific)
- Expand cache guide from 278 → 598 lines:
- SourceCache, ISourceUpdater, Edit() API documented
- Change<T,K> struct, ChangeReason enum, ChangeAwareCache explained
- Every operator has a table showing exact handling per ChangeReason
- Covers: Filter (4 variants), Transform (7 variants), Sort, Page,
Virtualise, Top, Group (3 variants), all 4 Joins, set operations,
MergeChangeSets, MergeMany, SubscribeMany, DisposeMany, AutoRefresh,
lifecycle callbacks, buffering, binding, utilities, property observers
- Writing a new operator: step-by-step with full code example
- New dynamicdata-list.instructions.md (424 lines):
- SourceList, IExtendedList, Edit() API
- ListChangeReason (8 reasons vs cache's 5), ChangeAwareList
- Every list operator with change reason handling tables
- List vs Cache comparison table
- Converting between list and cache
- Writing a new list operator with checklist
- Update main copilot-instructions.md links
* Fix malformed single-row tables in operator docs
Replace 10 broken markdown tables (single data row with no proper
header) with plain prose notes. These were cases where an operator's
behavior is the same as another and a full table wasn't needed.
* Move Cache vs List comparison to main instructions
The list-vs-cache guidance belongs in the main copilot-instructions.md
where it serves as a top-level navigation aid, not buried in the list
operator file. Also consolidates the instruction file links into the
new section.
* Split testing into main + cache + list instruction files
Testing section was too cache-specific. Now split into three:
- copilot-instructions.md (Testing section, 73 lines): Philosophy,
requirements, frameworks, Rx contract validation, regression test
rules, stress test principles, utilities reference, domain types,
anti-patterns — all universal, no cache/list specifics
- testing-cache.instructions.md (175 lines, NEW): Both observation
patterns (AsAggregator + RecordCacheItems), cache changeset
assertions, TestSourceCache, stub/fixture pattern, cache stress
tests, per-operator test checklist
- testing-list.instructions.md (143 lines, NEW): List aggregator,
RecordListItems, list changeset assertions (item vs range changes),
cache-vs-list testing differences table, list fixture pattern,
list stress tests, per-operator test checklist
* Add ObservableChangeSet.Create docs, instruction maintenance rule
Cache instructions: Added ObservableChangeSet.Create section with
8 overloads documented, 3 practical examples (sync event bridge,
async API loading, SignalR live updates), key behaviors explained.
List instructions: Added ObservableChangeSet.Create<T> section with
sync and async examples (FileSystemWatcher, async stream).
Main instructions: Added 'Maintaining These Instructions' section
requiring new operators to be added to instruction files, operator
behavior changes to update tables, new utilities/domain types to
be documented.
* Add deterministic completion pattern and stress test guidelines
Testing instructions updated with three new subsections:
- Waiting for Pipeline Completion: Publish + LastOrDefaultAsync + ToTask
pattern. Never use Task.Delay to wait for pipelines to settle.
- Chaining Intermediate Caches: AsObservableCache() to materialize stages,
Connect() to chain, completion cascades through the chain.
- Stress Test Pattern: Full 7-step pattern for stress testing operators:
deterministic seed data, chained pipelines, multi-threaded writers,
pre-computed LINQ expectations, exact content verification.
Anti-patterns updated: Task.Delay for settling → completion pattern.
* Potential fix for pull request finding
* Make UTF-8
* docs: add composition-first Rx guidance with Defer pattern examples
Captures the principle that Observable.Create with manual observer
forwarding is a code smell — prefer declarative composition using
Defer, Do, Merge, Concat, and other existing operators. Includes
concrete before/after examples and criteria for when Observable.Create
IS appropriate.
* docs: strengthen Rx contract trust — axioms, not guidelines
The contracts are unconditional guarantees. Doubting them and adding
safety wrappers abandons the very thing that makes Rx code correct
by construction.1 parent 9bc6b44 commit bf45445
File tree
6 files changed
+2922
-0
lines changed- .github
- instructions
6 files changed
+2922
-0
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
0 commit comments