Skip to content

Spec 018 phase 4: S2, Commands, Handlers and Pipelines; Get Started - #203

Merged
iancooper merged 11 commits into
masterfrom
spec/018-phase4
Oct 18, 2026
Merged

iancooper merged 11 commits into
masterfrom
spec/018-phase4

Conversation

@iancooper

@iancooper iancooper commented Oct 18, 2026 •

Copy link
Copy Markdown
Member

Summary

Spec 018 phase 4, S2: Commands, Handlers and Pipelines, and Get Started (ten pages). It also includes the two sweeps you ruled on today, D19 and D20. This changes the published site, so it needs your sign-off.

  • 106 of S2's 107 FAILED blocks now build, and so does one fence that was split, so the ten pages hold 115 C# blocks, 109 of them BUILT. The 2 that stay FAILED are same-page and listed; 4 are SKIPPED V9 forms. Ten scaffold units are new or extended.
  • Rulings:
    • D13: Polly.RateLimiting is pinned, so each pin has 553 assemblies.
    • D14: FeatureSwitches.md now reads IConfiguration.
    • D15: ShowMeTheCode.md follows the WebAPI sample.
    • D17: MongoDBOutbox.md's handler was rewritten and run against MongoDB.
    • D16 and D18 were filed upstream as Brighter#4609 and #4616.
  • Running the blocks overturned three claims (ledger 37–39). AgreementDispatcher.md routed a Command to several handlers, which Send refuses. Two [UsePolicy] attributes on one method are CS0579. new PolicyRegistry() fails at startup without the RETRYPOLICY and CIRCUITBREAKER policies.
  • D19, the prose sweep:
    • Every defect the docs dated "at 10.7.0" was run at both versions, with 10.7.0 as the control: #4414, #4335, #4437, Replay, #4432, #4510, #4453/#4454, #4443/#4444 and messaging.system.
    • Every one held at 10.7.0 and is fixed at 10.8.0. 21 pages (#4414 among them) now state 10.8.0's behaviour and keep the 10.7.0 workaround, labelled as such.
    • The runs also found Monitoring.md's setup never registered IAmAControlBusSenderAsync, so [MonitorAsync] failed at both versions, and Telemetry.md's flag table lacked CircuitBreaker.
  • D20, the relational DDL: six blocks are now 10.8.0's GetDDL output, and each was created on its own database: CausationId is absent at 10.7.0 and present at 10.8.0. Three of them (MSSQL, MySQL, SQLite) had never been builder output at all, and the SQLite one was not valid SQL.
  • Probes: every run is a spec/018-compile_residual/probe/<group>/<name>/ project against the released packages, with its case and its control (tasks.md § Behaviour (4.4), Second pass (4.5), Sweep (4.5a), The relational DDL (4.5b)).

Gates

Gate Result
blockcheck --report 994 blocks: 536 BUILT, 441 FAILED, 17 SKIPPED — 0 findings, exit 0. 553 assemblies on each pin, 60 units, 0 violations
pagelint 0 errors / 346 warnings (was 410); --changed strict, 0 errors; --plant 5 / 5
symbolcheck 0 — 24 entries, 14 silenced
linkcheck · shape · redirects · --verify · versioncheck · optioncheck unmoved: 168 / 0 · 161 · 77 · 161 = 161 · 0 of 18 · 0 / 59 / 529

Every gate is inside the band task 4.1 predicted except pagelint, which is 1 above at 346. Eleven BUILT blocks build on their page's scaffold alone, so no repair touched them and none gained its usings (tasks.md § Phase 4 closed).

For you

  1. Sign-off: this changes the published site.

    • S2's ten pages.
    • The D19 pages: the nine inbox pages, BrighterInboxSupport.md, SchedulingAMessage.md, InMemoryScheduler.md, FAQ.md, DispatcherConfigurationReference.md, Compression.md, Telemetry.md, ConfiguringOpenTelemetry.md, Monitoring.md, SweeperCircuitBreaking.md, PostgreSQLMessageBroker.md and RelationalDatabaseConfigurationReference.md.
    • The D20 pages: five Outbox pages and SpannerInbox.md.
    • Off-group repairs: AgreementDispatcherRouting.md, CloudEventsSupport.md, HowConfiguringTheCommandProcessorWorks.md, EFCoreOutbox.md, MongoDBOutbox.md and BrighterOutboxSupport.md.

    May I merge?

  2. After the merge, may I delete the head ref spec/018-phase4?

🤖 Generated with Claude Code

https://claude.ai/code/session_01LjnH2pJ98aMabu1MyTpRxy

iancooper and others added 11 commits October 15, 2026 07:23
…he second compile

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjnH2pJ98aMabu1MyTpRxy
…ulings R1–R4 asked

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjnH2pJ98aMabu1MyTpRxy
…ied, ledger 31–36, R5 asked

- D13: Polly.RateLimiting 8.8.0 pinned in refs and refs-v4 (553 assemblies);
  PolicyRetryAndCircuitBreaker.md names the package
- D14: FeatureSwitches.md registry reads IConfiguration from appsettings.json
- D15: ShowMeTheCode.md follows the WebAPI_Dapper sample at 10.8.0
- Fragments made whole on AsyncDispatchARequest, PipelineValidation (#3 split),
  PolicyFallback, AgreementDispatcher, UsingTheContextBag
- Recurrences repaired off-group: Activity.SetTag on CloudEventsSupport.md;
  List<Id> on BrighterOutboxSupport, EFCoreOutbox (now the sample's handler),
  MongoDBOutbox

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjnH2pJ98aMabu1MyTpRxy
…MongoDB

The handler asked for an IAmATransactionConnectionProvider nothing registers for
MongoDB, cast it to MongoDbUnitOfWork, and read members that type lacks. It now
uses the provider as IAmABoxTransactionProvider<IClientSessionHandle>, the
transaction type Brighter configures for MongoDbOutbox; passing
IAmAMongoDbTransactionProvider throws a transaction-type mismatch.
probe/s5/mongo-outbox runs the page's block with a rollback control.
BrighterOutboxSupport.md's provider sentence now says relational.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjnH2pJ98aMabu1MyTpRxy
…ovider's transaction type

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjnH2pJ98aMabu1MyTpRxy
…d repaired

Fifteen claims on S2's changed blocks run against 10.8.0 under probe/s2/, each
with a control. Three were false:

- AgreementDispatcher.md #7 routed a Command to several handlers, which Send
  refuses; the route is now on an Event, and the page says Publish runs the
  handlers in parallel, so the list is not a sequence (ledger 37)
- MigratingToPollyV8.md advised two [UsePolicy] attributes on one method,
  which is CS0579; the advice is now the array, circuit breaker first (38)
- new PolicyRegistry() fails Brighter's startup check for RETRYPOLICY and
  CIRCUITBREAKER; DefaultPolicy at all three sites, one off-group on
  HowConfiguringTheCommandProcessorWorks.md (39)

UsingTheContextBag.md now says Context.ResilienceContext is null unless the
caller attaches one. Gates unmoved: 994 / 536 / 441 / 17; pagelint 0 / 346.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjnH2pJ98aMabu1MyTpRxy
…4.5a)

Ledger 21–39 re-run as written, all at their After. Widened greps found one
recurrence of ledger 37 (AgreementDispatcherRouting.md, "Supports multiple
handlers"), repaired. #4414 was said unreleased; probe/s1/scheduler-autoscan
shows 10.7.0 dies and 10.8.0 handles on both scans, so SchedulingAMessage.md
and its two linking pages now say 10.8.0 fixes it (ledger 40). The wider
10.7.0-dated prose is D19, scheduled as task 4.5a.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjnH2pJ98aMabu1MyTpRxy
…rsions, ledger 41–50, R7 asked

Each defect the prose dated to 10.7.0 was probed with -p:BV=10.7.0 as the
control: #4335, #4437, Replay, #4432, #4510, #4453/#4454, #4443/#4444 and
messaging.system. Every claim held at 10.7.0 and is false at 10.8.0; 22
pages now state 10.8.0's behaviour and keep the 10.7.0 workaround as such.
The runs found Monitoring.md #1 never registered IAmAControlBusSenderAsync
(fails at both versions; ledger 47) and Telemetry.md's flag table missing
CircuitBreaker (ledger 48). The relational DDL refresh is R7.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjnH2pJ98aMabu1MyTpRxy
…on all five databases; ledger 51

probe/s5/ddl-refresh creates each builder's table on its database at both
versions: CausationId absent at 10.7.0, present at 10.8.0. Three of the six
blocks were never builder output (MSSQL, MySQL, SQLite; the SQLite one had
two primary keys). All six are now 10.8.0's output verbatim, each page says
Replay needs the column, and SpannerOutbox.md shows GetCausationIndexDDL.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjnH2pJ98aMabu1MyTpRxy
…onciled against 4.1

baseline.tsv lists every BUILT block on the ten S2 pages at 6ad8b0a, and
re-measures Monitoring.md #1 there: 536 rows = 536 BUILT, --report exit 0,
0 findings. Readings over 5f2294c..HEAD: 8 added `// ...` in 7 blocks, all
BUILT; every behavioural claim run or named. Every gate in band but
pagelint, 346 against 331-345: 11 untouched BUILT blocks kept their
warning. tools/README.md rows 2 and 9 updated; 552 assemblies is 553.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LjnH2pJ98aMabu1MyTpRxy
@iancooper
iancooper merged commit 0fc79a3 into master Oct 18, 2026
10 checks passed
@iancooper
iancooper deleted the spec/018-phase4 branch October 18, 2026 17:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant