Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1507 commits
Select commit Hold shift + click to select a range
69f0ca7
fix(transport): re-enable RabbitMQ.Client topology recovery
twatson83 May 16, 2026
da12e81
fix(timeouts): sentCount only increments after a real send
twatson83 May 16, 2026
900c33f
fix(streams): DisposeAsync swallows TimeoutException from drain spin
twatson83 May 16, 2026
5cedeb6
docs(releases): add aggregator Name migration recipe
twatson83 May 16, 2026
a502cb5
fix(transport): SuppressPlaintextWarning has DIM defaults
twatson83 May 16, 2026
380c081
fix(consumer): StopAsync also unsubscribes publish-channel shutdown
twatson83 May 16, 2026
d4c89db
fix(mongo-aggregator): ReleaseSnapshotAsync always attempts release
twatson83 May 16, 2026
2f8359b
fix(aggregator): FindAggregatorBaseType walks full hierarchy
twatson83 May 16, 2026
6d5be74
docs(bus): document single-use lifecycle
twatson83 May 16, 2026
55bef68
test(bus): pin latched-stopped contract on Bus.StartConsumingAsync
twatson83 May 16, 2026
41169ef
fix(telemetry): Consume DisplayName truncates destination before suffix
twatson83 May 16, 2026
d294098
docs(saga): correct ConfigureMapper xmldoc — called once per delivery
twatson83 May 16, 2026
1f9a8da
docs(comments): strip Phase/Task labels and temporal framing
twatson83 May 16, 2026
dc93cf0
cleanup(transport): drop dead using System.Net in ConnectionFactoryBu…
twatson83 May 16, 2026
576145c
refactor(di): IProcessManagerTypeRegistry uses TryAddSingleton
twatson83 May 16, 2026
b02b001
refactor(config): GuardedList<T>._inner private
twatson83 May 16, 2026
1d490af
fix(telemetry): server.address handles semicolon-separated cluster lists
twatson83 May 16, 2026
a45fd2b
refactor(handler): rethrow caller's CT, not the collected OCE
twatson83 May 16, 2026
2951553
docs(telemetry): MessagingOperationName example list reflects 'process'
twatson83 May 16, 2026
f884612
refactor(telemetry): Shutdown helpers are internal, not public
twatson83 May 16, 2026
669dffd
docs(streams): Read/ReadSequence xmldoc covers throw on missing packets
twatson83 May 16, 2026
a2077c2
docs(website): align telemetry + observability with v-major follow-up
twatson83 May 17, 2026
2ef6805
fix(saga): reject reference-equality correlation key types in BuildLo…
twatson83 May 17, 2026
06cc839
fix(saga): cache value-equality verdict by valueType, not by (DataTyp…
twatson83 May 17, 2026
1e3175a
fix(routing-slip): stamp HopsCompleted post-middleware
twatson83 May 17, 2026
efbb62c
fix(routing-slip): DIM stamps hop counter for third-party IProducers
twatson83 May 17, 2026
b0574bc
fix(streams): OCE rethrow distinguishes caller-CT from handler-CT
twatson83 May 17, 2026
7da35e1
test(streams): strengthen OCE-rethrow assertions + add caller-CT comp…
twatson83 May 17, 2026
a051536
fix(host): BusHostedService.StopAsync bounds consumer-stop with grace…
twatson83 May 17, 2026
3360567
fix(host): StopAsync distinguishes outer-CT cancellation from grace e…
twatson83 May 17, 2026
45cb26e
fix(streams): DisposeAsync swallows all best-effort close failures
twatson83 May 17, 2026
6812af2
docs(streams): document DisposeAsync best-effort contract on the inte…
twatson83 May 17, 2026
a78df4f
fix(di): UseMongoDbPersistence index-initializer registration is idem…
twatson83 May 17, 2026
7027602
fix(config): TransportConfiguration.ClientSettings returns ReadOnlyDi…
twatson83 May 17, 2026
52abc74
feat(ssl): log warning when AcceptablePolicyErrors or callback weaken…
twatson83 May 17, 2026
9a72eee
refactor(api): OutgoingEventArgs is abstract with protected ctor
twatson83 May 17, 2026
aec3399
fix(telemetry): server.address parser matches transport host-split be…
twatson83 May 17, 2026
20b9a62
docs(streams): SequenceId uniqueness contract on Read/Write stream in…
twatson83 May 17, 2026
9284a4a
test(e2e): update mock SendAsync setups for hop-counter overload
twatson83 May 17, 2026
781c7ef
api(aggregator): require explicit BatchSize and Timeout policy
twatson83 May 17, 2026
7b68897
review(aggregator): strengthen registry rejection sentinel tests
twatson83 May 17, 2026
5bd6e15
api(processmanagers): constrain ConfigureMapping<TMessage> to Message
twatson83 May 17, 2026
171b657
api(config): AddQueueMapping accepts IReadOnlyList<string>
twatson83 May 17, 2026
7e52391
docs(api): strip version-history framing from public xmldoc
twatson83 May 17, 2026
71d24af
fix(handlers): Aggregator<T> hierarchy walk covers scan + DI
twatson83 May 17, 2026
95b9f2f
fix(transport): tear down stale connection on bare channel close
twatson83 May 17, 2026
bd00792
fix(aggregator): release lease on empty-resolved snapshot
twatson83 May 17, 2026
ded6e13
fix(telemetry): force fresh trace root on malformed traceparent
twatson83 May 17, 2026
2f82a74
fix(telemetry): leave fresh-root as Activity.Current after malformed-…
twatson83 May 17, 2026
1e6c544
fix(telemetry): Truncate guards against orphaned UTF-16 surrogate
twatson83 May 17, 2026
d79abec
fix(telemetry): gate MessagingBodySize tag on IsAllDataRequested
twatson83 May 17, 2026
2a2106c
test(telemetry): record-only Consume omits MessagingBodySize tag
twatson83 May 17, 2026
ac24646
docs(aggregator): document at-least-once contract on ExecuteAsync
twatson83 May 17, 2026
58c5abf
docs(aggregator): cancellation paragraph covers RemoveSnapshotAsync-O…
twatson83 May 17, 2026
42c1007
docs(api): strip residual v7/v8 framing from impl xmldoc and test com…
twatson83 May 17, 2026
86c3b3c
fix(consumer): preserve _started and skip channel teardown when Dispo…
twatson83 May 17, 2026
d958c57
review(consumer): correct timeout-path log message and tidy lifecycle…
twatson83 May 17, 2026
c161cbb
fix(telemetry): cancellation does not set ActivityStatusCode.Error
twatson83 May 17, 2026
6e6cac8
review(telemetry): tighten cancellation assertions and cover wrapped-…
twatson83 May 17, 2026
8b111f1
feat(telemetry): add TracerProviderBuilder.AddServiceConnectInstrumen…
twatson83 May 17, 2026
efa6b23
review(telemetry): tracer extension test exercises the OTel SDK pipeline
twatson83 May 17, 2026
23d83fb
fix(rabbitmq): validator does not nack-loop permanently-invalid messa…
twatson83 May 17, 2026
041ad77
review(rabbitmq): validator swallows PublishException and elevates th…
twatson83 May 17, 2026
e417eb6
perf(aggregator): add (Name, LockedBy) compound index to cover lease …
twatson83 May 17, 2026
83887d6
review(aggregator): partial filter on (Name, LockedBy) so the new ind…
twatson83 May 17, 2026
3399fdd
review(consumer): tighten namespace, dispose-timeout mock, and clarif…
twatson83 May 17, 2026
867ef68
fix(aggregator): partial filter uses $type instead of $not for MongoD…
twatson83 May 17, 2026
00d551e
perf(rabbitmq): jitter producer retry delays around fixed mean
twatson83 May 17, 2026
34ead9b
docs: retire superseded review artifacts and prune notes
twatson83 May 17, 2026
e1595aa
docs: add 2026-05-17 architecture review, phasing overview, and phase…
twatson83 May 17, 2026
b4caa31
fix(rabbitmq): log actual jittered retry delay; cover transient path
twatson83 May 17, 2026
7767ad5
docs(reviews): record audit-drop metric finding as false positive
twatson83 May 17, 2026
74f1043
fix(rabbitmq): log deadline-helper unexpected faults at Warning, not …
twatson83 May 17, 2026
a962427
docs(review): record ResetTimer dispose-outside-lock finding as false…
twatson83 May 17, 2026
f9bede9
perf(consume): cache flattened reply-allow-list per IQueueConfiguration
twatson83 May 17, 2026
f6db67a
test(consume): isolate IsKnownQueue perf benchmark from allocation cost
twatson83 May 17, 2026
677002c
docs(review): record Bus.BuildRoutingSlip re-validation as false posi…
twatson83 May 17, 2026
f1b6659
docs(review): reject Bus.ReadInboundHopsCompleted utility extraction …
twatson83 May 17, 2026
2bbca4c
docs(bus): explain StringComparer.Ordinal on ReservedHeaders
twatson83 May 17, 2026
4d8357c
docs(plans): add Phase 2 outbound-pipeline extraction plan
twatson83 May 17, 2026
3ef5c5f
refactor(bus): add PrepareOutboundAsync helper with direct unit tests
twatson83 May 17, 2026
cff9996
test(bus): close PrepareOutboundAsync contract gaps from review
twatson83 May 17, 2026
52d888b
refactor(bus): publish/send/sendtomany/route share PrepareOutboundAsync
twatson83 May 17, 2026
f00ad7a
refactor(bus): add PrepareOutboundForRequestAsync helper for request …
twatson83 May 17, 2026
f4b34db
test(bus): mirror PrepareOutboundForRequestAsync test corners with Pr…
twatson83 May 17, 2026
cdc74d9
refactor(bus): request paths share PrepareOutboundForRequestAsync
twatson83 May 17, 2026
0035a48
test(bus): cover SendRequest{,Multi}Async filter-block paths
twatson83 May 17, 2026
6a00558
refactor(request-reply): extract SuppressUnobservedFault helper
twatson83 May 17, 2026
093b14a
test(request-reply): rename misleading fault-suppression test + tighten
twatson83 May 17, 2026
6c3546c
docs(plans): add Phase 3c MessageDispatcher.DispatchAsync split plan
twatson83 May 18, 2026
a18e59d
docs(plans): add Phase 3a (ActivitySource split) and Phase 3b (Channe…
twatson83 May 18, 2026
50f8830
refactor(dispatch): rename single-letter params in RunProcessors
twatson83 May 18, 2026
0753390
refactor(dispatch): extract TryResolveMessageType helper
twatson83 May 18, 2026
e418f5b
refactor(dispatch): extract HandleDispatchErrorAsync helper
twatson83 May 18, 2026
b6c7729
refactor(dispatch): extract RunDispatchPipelineAsync coordinator
twatson83 May 18, 2026
f466f0b
docs(dispatch): restore MaxRoutingSlipHops amplification-defence rati…
twatson83 May 18, 2026
035beeb
refactor(telemetry): extract TelemetryEnrichment from ServiceConnectA…
twatson83 May 18, 2026
c31baad
refactor(telemetry): extract TraceContextPropagation from ServiceConn…
twatson83 May 18, 2026
3f31ee4
refactor(rabbitmq): introduce RabbitMqChannelHost (dead add, no consu…
twatson83 May 18, 2026
4fc000a
refactor(rabbitmq): wire RabbitMqConsumerHost to RabbitMqChannelHost
twatson83 May 18, 2026
ceb3348
docs(plans): add Phase 4 v8 release plan
twatson83 May 18, 2026
3b9ba75
refactor(retry): replace logAsMaxRetries bool with PublishErrorReason…
twatson83 May 18, 2026
9b5db65
refactor(consumer): split lifecycle semaphore into startup + dispose
twatson83 May 18, 2026
ec40bb3
refactor(bus): depend on IConsumeContextAccessor / IConsumeScopeAccessor
twatson83 May 18, 2026
22af3ee
feat(producer): expose SupportsRoutingKey capability and warn on shim…
twatson83 May 18, 2026
85e6de1
feat(rabbitmq): typed RabbitMqOptions + Action<>-based UseRabbitMQ ov…
twatson83 May 18, 2026
b12f8a4
feat!(bus): throw OutgoingFiltersBlockedException uniformly across al…
twatson83 May 18, 2026
456a3d7
chore(release): bump to v8.0.0 + document breaking changes
twatson83 May 18, 2026
78166c4
chore(release): revert v8 framing — these changes ship in v7
twatson83 May 18, 2026
4bc6c55
fix(filters): E2E test + docs follow-up for OutgoingFiltersBlockedExc…
twatson83 May 18, 2026
8182844
fix(consumer): close start+dispose race on _connection / _model
twatson83 May 18, 2026
cb69aca
chore(docs): remove stale review and plan files from prior architectu…
twatson83 May 18, 2026
13aaf16
docs(plans): add pre-release fixes plan from 2026-05-18 architecture …
twatson83 May 18, 2026
3c55b2c
chore(serialization-compat-tests): strip stale Phase A.2 reference fr…
twatson83 May 18, 2026
816d413
docs(interfaces): document handler-cooperation requirement on StopCon…
twatson83 May 18, 2026
f8b7230
feat(rabbitmq): validate RabbitMqOptions at UseRabbitMQ setup time
twatson83 May 18, 2026
28feffb
feat(persistence-mongodb): expose AggregatorLeaseDuration on MongoDbP…
twatson83 May 18, 2026
947f5bf
feat(diagnostics): emit counter when aggregator snapshot remove fails…
twatson83 May 18, 2026
7218125
feat(bus): fail at host start when no IProducer is registered
twatson83 May 18, 2026
cf8a0d3
docs(plans): add configurable-limits + test-folder-reorganisation plans
twatson83 May 18, 2026
2cbb5bd
feat(rabbitmq): make MaxHeaderCount configurable on RabbitMqOptions
twatson83 May 18, 2026
22be06c
feat(rabbitmq): make MaxHeaderValueBytes configurable on RabbitMqOptions
twatson83 May 18, 2026
ca0e341
feat(bus): make MaxInflightRequests configurable on IBusConfiguration
twatson83 May 18, 2026
6ab6a98
feat(bus): make MaxStreamSizeBytes configurable on IBusConfiguration
twatson83 May 18, 2026
a58ac2b
feat(bus): make MaxActiveStreams configurable on IBusConfiguration
twatson83 May 18, 2026
6a60166
chore(bus): polish operator-facing strings on stream-size + validation
twatson83 May 18, 2026
e4e0bdd
chore(bus): pin invariant culture on MessageBusReadStream throw
twatson83 May 18, 2026
73d1b93
chore(tests): rename Bus/ to BusTests/ and consolidate Bus tests
twatson83 May 18, 2026
3654aa6
chore(tests): consolidate service-layer tests under Services/
twatson83 May 18, 2026
288a6b8
chore(tests): consolidate RabbitMQ-domain tests under RabbitMQ/
twatson83 May 18, 2026
af452f9
chore(tests): consolidate persistence tests under Persistence/InMemor…
twatson83 May 18, 2026
6caf96a
chore(tests): final test-folder reorganisation — Configuration/, Buil…
twatson83 May 18, 2026
48f81d0
docs: sweep v7 surface for accuracy — 79 audit fixes + 9 surface/exam…
twatson83 May 18, 2026
f84b39a
chore(examples): pre-build solutions sequentially before `dotnet run …
twatson83 May 18, 2026
7f6ef00
chore(examples): migrate CustomFilterAndMiddleware to shared docker-c…
twatson83 May 19, 2026
21bf4d5
docs: drop v7/v8 version framing from source, tests, docs, examples
twatson83 May 19, 2026
c2b287d
chore(stress-harness): scaffold three csprojs + empty Program.cs
twatson83 May 19, 2026
574208a
chore(stress-harness): docker-compose + cross-platform run scripts
twatson83 May 19, 2026
c68b6ba
fix(scripts): restore prebuild_solution's displaced doc comment
twatson83 May 19, 2026
f21f0bd
fix(stress-harness): pin rabbitmq container hostname
twatson83 May 19, 2026
97e90a7
feat(stress-harness): IPatternDriver contract + StressFlowContext + h…
twatson83 May 19, 2026
4fe5f69
feat(stress-harness): CrossTenantAssertions + test project
twatson83 May 19, 2026
2d38883
chore(stress-harness): drop unused originRaw extraction in CrossTenan…
twatson83 May 19, 2026
afcba91
feat(stress-harness): FlowAccounting for sent/handled reconciliation
twatson83 May 19, 2026
629a309
feat(stress-harness): MemoryAssertions baseline/delta check
twatson83 May 19, 2026
c57c739
feat(stress-harness): Report DTO + JsonReportWriter
twatson83 May 19, 2026
9368d45
feat(stress-harness): MarkdownReportWriter for human-readable summary
twatson83 May 19, 2026
b4143b7
feat(stress-harness): ConsoleReporter for live progress + summary
twatson83 May 19, 2026
ec60b52
feat(stress-harness): HarnessHost owns two Bus instances under one pr…
twatson83 May 19, 2026
228ef6b
feat(stress-harness): CLI parser + Program.cs dispatch
twatson83 May 19, 2026
4241047
chore(stress-harness): drop Phase 2 framing from CLI comments
twatson83 May 19, 2026
d5b1468
feat(stress-harness): FlowRunner + ModeDispatcher smoke shell
twatson83 May 19, 2026
9907dfc
chore(stress-harness): drop Task 14 references from Program.cs comments
twatson83 May 19, 2026
719ed69
feat(stress-harness): P2pPing contract message
twatson83 May 19, 2026
fb45f38
feat(stress-harness): PointToPoint driver wires the first end-to-end …
twatson83 May 19, 2026
1b10329
feat(stress-harness): PublishSubscribe driver
twatson83 May 19, 2026
7e2920b
feat(stress-harness): RequestReply driver
twatson83 May 19, 2026
f97893a
fix(stress-harness): snapshot headers at signal time
twatson83 May 19, 2026
01ec668
feat(stress-harness): CompetingConsumers driver
twatson83 May 19, 2026
22ad9a9
feat(stress-harness): ContentBasedRouting driver
twatson83 May 19, 2026
01d7890
feat(stress-harness): PolymorphicMessages driver
twatson83 May 19, 2026
e4131cb
feat(stress-harness): Filters driver
twatson83 May 19, 2026
e8e4c49
feat(stress-harness): ProcessManager driver
twatson83 May 19, 2026
6a797a4
feat(stress-harness): Aggregator driver
twatson83 May 19, 2026
b256a09
feat(stress-harness): ScatterGather driver
twatson83 May 19, 2026
f04c8c8
feat(stress-harness): RoutingSlip driver
twatson83 May 19, 2026
1ecd868
feat(stress-harness): Streaming driver
twatson83 May 19, 2026
2717d7f
feat(stress-harness): CustomFilterAndMiddleware driver
twatson83 May 19, 2026
51461ac
feat(stress-harness): Telemetry driver
twatson83 May 19, 2026
7addc88
feat(stress-harness): soak mode — continuous ticks + memory delta ass…
twatson83 May 19, 2026
facdf24
feat(stress-harness): throughput mode + per-pattern latency percentiles
twatson83 May 19, 2026
3199412
feat(stress-harness): lifecycle smoke — dispose-during-flow assertion
twatson83 May 19, 2026
b02931a
fix(stress-harness): reclaim per-flow accumulator entries to bound so…
twatson83 May 19, 2026
586ba30
feat(stress-harness): broker chaos contract + Noop default
twatson83 May 19, 2026
dfe43e5
chore(stress-harness): ship docker-compose.cluster.yml for chaos work
twatson83 May 19, 2026
1680bc6
docs(stress-harness): README + samples.mdx entry
twatson83 May 19, 2026
bd5a709
refactor(stress-harness): per-direction result model + reportVersion 2
twatson83 May 20, 2026
aa2316d
feat(stress-harness): markdown table + console memory render with KB/MB
twatson83 May 20, 2026
bb6a72a
feat(stress-harness): per-flow failure detail in PatternStats + markdown
twatson83 May 20, 2026
dbb9414
feat(stress-harness): report metadata header + quiet soak console output
twatson83 May 20, 2026
132142b
fix(stress-harness): avoid lock+Timer.Dispose deadlock in ConsoleRepo…
twatson83 May 20, 2026
20b2f20
feat(stress-harness): IFlowKeyedSingleton + per-accumulator TryRemove…
twatson83 May 20, 2026
3f3eb81
feat(stress-harness): reclaim per-flow accumulator entries at end of …
twatson83 May 20, 2026
03c7fdd
chore(stress-harness): raise default memory budget from 50 MB to 256 MB
twatson83 May 20, 2026
1f51681
feat(stress-harness): CLI surface for chaos mode
twatson83 May 20, 2026
f0bf2b9
feat(stress-harness): DockerComposeBrokerChaos via Process.Start
twatson83 May 20, 2026
6c5e73d
feat(stress-harness): ChaosClock + ChaosScheduler + Program.cs wiring
twatson83 May 20, 2026
c4e9e7b
feat(stress-harness): per-flow window tagging + RecoveryAssertion + s…
twatson83 May 20, 2026
fd29123
feat(stress-harness): ChaosWindowStats on Report + markdown rendering
twatson83 May 20, 2026
fbdae79
fix(rabbitmq): reset broker-cancelled flag on RabbitMQ.Client auto-re…
twatson83 May 20, 2026
fa87c52
fix(stress-harness): resolve docker-compose path cwd-independently
twatson83 May 20, 2026
163aca6
chore(stress-harness): opt into durable queues + publisher confirms f…
twatson83 May 20, 2026
03d8406
feat(stress-harness): detect over-handled flows in FlowAccounting
twatson83 May 20, 2026
9513f0c
fix(stress-harness): three layered defences against chaos message loss
twatson83 May 20, 2026
8dc5902
docs: spec for chaos message ledger investigation
twatson83 May 20, 2026
dad58d1
docs: implementation plan for chaos message ledger
twatson83 May 20, 2026
08f8239
chore(stress-harness): introduce X-Stress-MessageId header constant
twatson83 May 20, 2026
3b623c9
feat(stress-harness): add MessageLedger value types
twatson83 May 20, 2026
3e2ab05
feat(stress-harness): add MessageLedger flow-keyed singleton
twatson83 May 20, 2026
89e1fc9
chore(stress-harness): rewrite MessageLedger tests in plain xUnit, dr…
twatson83 May 20, 2026
65afe66
feat(stress-harness): add MessageLedgerAnalyzer with four-quadrant cl…
twatson83 May 20, 2026
aac2242
test(stress-harness): pin empty-dictionaries + sample ordering in ana…
twatson83 May 20, 2026
d246b80
feat(stress-harness): add LedgeredSender wrap recording per-publish l…
twatson83 May 20, 2026
e59e7b3
test(stress-harness): cover SendToMany / SendRequestMulti / PublishRe…
twatson83 May 20, 2026
73676ee
feat(stress-harness): wire MessageLedger + LedgeredSender into Harnes…
twatson83 May 20, 2026
2268fef
chore(stress-harness): mirror ledger + clock in registerPerBus TryAdd…
twatson83 May 20, 2026
b8e6115
feat(stress-harness): record consumes on every harness handler via Me…
twatson83 May 20, 2026
4c8012a
refactor(stress-harness): dedupe Saga FlowId parse + document WorkIte…
twatson83 May 20, 2026
956b65f
feat(stress-harness): render Message ledger section in markdown + JSO…
twatson83 May 20, 2026
9f6c216
docs: spec for publish-timeout retry alignment with at-least-once
twatson83 May 20, 2026
b833350
docs: implementation plan for publish-timeout retry alignment
twatson83 May 20, 2026
5fffe18
feat(rabbitmq): add MaxPublishWaitTime setting key
twatson83 May 20, 2026
3529a8b
feat(rabbitmq): expose MaxPublishWaitTime on RabbitMqOptions
twatson83 May 20, 2026
02c3d37
feat(rabbitmq): wire MaxPublishWaitTime through RabbitMQExtensions
twatson83 May 20, 2026
a2bfa3c
feat(rabbitmq): read MaxPublishWaitTime and cap retry loop wall-clock
twatson83 May 20, 2026
9ca664e
chore(rabbitmq): clarify MaxPublishWaitTime validator comment + renam…
twatson83 May 20, 2026
59b58bb
feat(rabbitmq): treat TimeoutException as retriable under at-least-on…
twatson83 May 20, 2026
65fddf0
fix(rabbitmq): preserve MessageId across publish retries by lifting B…
twatson83 May 20, 2026
11e2384
test(rabbitmq): cover retry-on-TimeoutException, MessageId preservati…
twatson83 May 20, 2026
06a4c90
test(rabbitmq): tighten Test 4 callCount assertion + clarify test hel…
twatson83 May 20, 2026
f2b4fdf
docs(rabbitmq): document TimeoutException retry contract on PublishWi…
twatson83 May 20, 2026
165bd94
fix(stress-harness): tolerate at-least-once duplicates in saga + slip…
twatson83 May 20, 2026
ede306c
fix(stress-harness): tolerate duplicate filter+handler trail entries
twatson83 May 20, 2026
8fe854d
docs: spec for aggregator chaos resilience + consume-side instrumenta…
twatson83 May 21, 2026
9fa9544
docs: implementation plan for aggregator chaos resilience
twatson83 May 21, 2026
f25d13a
fix(stress-harness): lengthen aggregator timeout to survive chaos dow…
twatson83 May 21, 2026
04736fb
fix(stress-harness): accept partial aggregator batches under at-least…
twatson83 May 21, 2026
23b70e4
feat(stress-harness): add AggregatorLedgerFilter for consume-side led…
twatson83 May 21, 2026
66f2a8f
feat(stress-harness): register AggregatorLedgerFilter on both buses
twatson83 May 21, 2026
54816cd
docs: spec for IBus.IsConsuming post-recovery flake fix
twatson83 May 21, 2026
fd5b957
docs: implementation plan for IsConsuming recovery-flake fix
twatson83 May 21, 2026
cbedbb5
fix(rabbitmq): ignore stale UnregisteredAsync events whose tag has be…
twatson83 May 21, 2026
aa7620d
docs: spec for FlowAccounting-driven IFlowKeyedSingleton reclamation
twatson83 May 21, 2026
8bd28f6
docs: implementation plan for FlowAccounting-driven reclamation
twatson83 May 21, 2026
3425400
feat(stress-harness): FlowAccounting.TryRemoveCompleted returns recla…
twatson83 May 21, 2026
8ea60dd
feat(stress-harness): reclaim sub-flow ids via FlowAccounting-driven …
twatson83 May 21, 2026
2ddafe1
fix(stress-harness): double scatter-gather reply timeout to absorb tw…
twatson83 May 21, 2026
e563eef
chore: add verify-all.sh end-to-end runner + ignore out/ and docs/
twatson83 May 21, 2026
fa5f557
fix(rabbitmq): suppress IDE0031 on event +=/-= that needs C# 14 syntax
twatson83 May 21, 2026
cb8e0cc
ci(release): run unit + e2e tests before pushing to NuGet.org
twatson83 May 21, 2026
230bfc5
docs: add clustering & quorum-queues operations page
twatson83 May 21, 2026
05404f5
chore: untrack docs/ (locally-only agent plans/specs)
twatson83 May 21, 2026
a41fb3f
chore: untrack notes.md and PR-MESSAGE.md (local scratch files)
twatson83 May 21, 2026
3210c84
ci(docs): deploy Pages from v7-clean-architecture branch
twatson83 May 21, 2026
2d0a590
ci(docs): bump Node to 22 for Astro 6
twatson83 May 21, 2026
cc9a9f0
docs(nav): remove three stale extension-point links
twatson83 May 21, 2026
9b67eb3
fix(rabbitmq): set _shutdownTimedOut before cancelling publish CTS in…
twatson83 May 21, 2026
e713c80
docs(release): rewrite v7 release notes + add v6→v7 migration guide
twatson83 May 21, 2026
dcbb565
docs: audit fixes across learn/reference vs solution
twatson83 May 22, 2026
5b8f78b
docs: fix four broken anchor links in messaging-patterns
twatson83 May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
359 changes: 359 additions & 0 deletions .editorconfig

Large diffs are not rendered by default.

136 changes: 136 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
name: CI

on:
push:
branches: [master, 'v*']
pull_request:
branches: [master, 'v*']
workflow_dispatch:

permissions:
contents: read

# A new push to a PR / branch cancels the previous in-flight run for the same ref.
# Saves CI minutes during rapid iteration; the most recent commit is the one that matters.
concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: 1
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
# Deterministic CI builds — combined with the SourceLink + ContinuousIntegrationBuild
# properties set in src/Directory.Build.props, ensures the produced binaries embed
# repo-relative source paths and are byte-reproducible.
ContinuousIntegrationBuild: true

jobs:
build-and-test:
name: Build + unit tests (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
10.0.x

- name: Restore
working-directory: src
run: dotnet restore ServiceConnect.slnx

- name: Build
working-directory: src
run: dotnet build ServiceConnect.slnx --configuration Release --no-restore

- name: Unit tests
working-directory: src
run: dotnet test ServiceConnect.UnitTests/ServiceConnect.UnitTests.csproj --configuration Release --no-build --logger "trx;LogFileName=unittests.trx"

- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: unit-test-results-${{ matrix.os }}
path: src/**/TestResults/*.trx
if-no-files-found: ignore

e2e:
name: End-to-end tests (Linux)
runs-on: ubuntu-latest
# Testcontainers spins up RabbitMQ + MongoDB; needs a working Docker daemon.
# ubuntu-latest runners have Docker pre-installed, so no setup step is required.
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
10.0.x

- name: Restore
working-directory: src
run: dotnet restore ServiceConnect.slnx

- name: Build
working-directory: src
run: dotnet build ServiceConnect.slnx --configuration Release --no-restore

- name: E2E tests
working-directory: src
run: dotnet test ServiceConnect.EndToEndTests/ServiceConnect.EndToEndTests.csproj --configuration Release --no-build --logger "trx;LogFileName=e2e.trx"

- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: e2e-test-results
path: src/**/TestResults/*.trx
if-no-files-found: ignore

pack-validate:
name: Pack validation (dry-run)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
10.0.x

- name: Restore
working-directory: src
run: dotnet restore ServiceConnect.slnx

- name: Pack
working-directory: src
run: dotnet pack ServiceConnect.slnx --configuration Release --no-restore --output ../artifacts

- name: List produced packages
run: ls -la artifacts/

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: nupkgs
path: |
artifacts/*.nupkg
artifacts/*.snupkg
if-no-files-found: error
retention-days: 14
60 changes: 60 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: Build and deploy docs site

on:
push:
branches: [v7-clean-architecture]
paths:
- 'website/**'
- '.github/workflows/docs.yml'
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: website/package-lock.json

- name: Install website dependencies
working-directory: website
run: npm ci

- name: Build website (Astro + Starlight)
working-directory: website
run: npm run build

- name: Setup Pages
uses: actions/configure-pages@v5

- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v3
with:
path: website/dist

deploy:
needs: build
if: github.ref == 'refs/heads/v7-clean-architecture'
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
118 changes: 118 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
name: Release to NuGet

# Triggered on a `v*` tag push (e.g. `v7.0.0`). The tag value drives the package Version
# property — release the same source tree against a new tag by retagging, not by editing
# csprojs. The "Verify tag matches Version property" step blocks a mismatched cut.

on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
version:
description: 'Version override (without leading v). Used only for manual dispatch; tag pushes use the tag value.'
required: false

permissions:
contents: read

env:
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: 1
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
ContinuousIntegrationBuild: true

jobs:
release:
name: Pack + push
runs-on: ubuntu-latest
environment:
name: nuget
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
10.0.x

- name: Resolve version from tag
id: version
run: |
if [ -n "${{ inputs.version }}" ]; then
VERSION="${{ inputs.version }}"
else
# github.ref is "refs/tags/v7.0.0"; strip the prefix.
VERSION="${GITHUB_REF#refs/tags/v}"
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "Resolved version: $VERSION"

- name: Verify tag matches csproj Version property
working-directory: src
run: |
set -e
DECLARED=$(grep -oP '<Version>\K[^<]+' Directory.Build.props | head -1)
if [ "$DECLARED" != "${{ steps.version.outputs.version }}" ]; then
echo "ERROR: Tag version '${{ steps.version.outputs.version }}' does not match Directory.Build.props <Version> '$DECLARED'."
echo "Bump src/Directory.Build.props and retag, or correct the tag."
exit 1
fi

- name: Restore
working-directory: src
run: dotnet restore ServiceConnect.slnx

- name: Build
working-directory: src
run: dotnet build ServiceConnect.slnx --configuration Release --no-restore -p:Version=${{ steps.version.outputs.version }}

# Re-run the full test suite against the exact tagged commit before pushing to NuGet.org.
# CI already gates merges to master, but a tag can point at any commit and NuGet packages
# cannot be unpublished — only delisted — so a green test run here is the last line of defence.
- name: Unit tests
working-directory: src
run: dotnet test ServiceConnect.UnitTests/ServiceConnect.UnitTests.csproj --configuration Release --no-build --logger "trx;LogFileName=unittests.trx"

- name: E2E tests
working-directory: src
run: dotnet test ServiceConnect.EndToEndTests/ServiceConnect.EndToEndTests.csproj --configuration Release --no-build --logger "trx;LogFileName=e2e.trx"

- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: release-test-results-${{ steps.version.outputs.version }}
path: src/**/TestResults/*.trx
if-no-files-found: ignore
retention-days: 90

- name: Pack
working-directory: src
run: dotnet pack ServiceConnect.slnx --configuration Release --no-build -p:Version=${{ steps.version.outputs.version }} --output ../artifacts

- name: List produced packages
run: ls -la artifacts/

- name: Upload artifacts (audit trail)
uses: actions/upload-artifact@v4
with:
name: nupkgs-${{ steps.version.outputs.version }}
path: |
artifacts/*.nupkg
artifacts/*.snupkg
if-no-files-found: error
retention-days: 90

- name: Push to NuGet.org
# --skip-duplicate so a re-run after a partial failure doesn't error on packages
# already pushed; NuGet.org treats a re-push of the same version as a conflict.
run: |
dotnet nuget push 'artifacts/*.nupkg' \
--api-key "${{ secrets.NUGET_API_KEY }}" \
--source https://api.nuget.org/v3/index.json \
--skip-duplicate
28 changes: 28 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ bld/

# Visual Studio 2015/2017 cache/options directory
.vs/
.vscode/

# MSTest test Results
[Tt]est[Rr]esult*/
Expand Down Expand Up @@ -175,3 +176,30 @@ UpgradeLog*.htm

# Microsoft Fakes
FakesAssemblies/
.gitnexus
.worktrees/

# Claude Code settings
AGENTS.md
CLAUDE.md
.claude/

# Documentation site (Astro/Starlight)
website/dist/
website/.astro/

# Brainstorming companion artifacts
.superpowers/

# Test runner output
**/TestResults/
*.trx

# Stress harness report output (regenerated on every run)
out/
**/out/

# Working specs / plans authored during agent sessions (committed deliberately,
# not auto-staged from the working tree). Anchored to the repo root so the rule
# doesn't accidentally match website/src/content/docs/ and trap new doc pages.
/docs/
6 changes: 0 additions & 6 deletions .travis.yml

This file was deleted.

Loading
Loading