Skip to content

docs: 013 phase 4 — the claim check, and MSSQL for all three roles - #155

Merged
iancooper merged 2 commits into
masterfrom
docs/013-phase4-large-messages-mssql
Sep 10, 2026
Merged

docs: 013 phase 4 — the claim check, and MSSQL for all three roles#155
iancooper merged 2 commits into
masterfrom
docs/013-phase4-large-messages-mssql

Conversation

@iancooper

Copy link
Copy Markdown
Member

Spec 013 phase 4: P1-1 and P1-2, two new nested pages, plus repairs to four pages they lean on.

contents/HandlingLargeMessages.md (P1-1)

The wiring ClaimCheck.md does not cover: which luggage store, how to register it, where the threshold is measured, and how to tell whether the payload really left.

Step 3 is why the page exists. UseExternalLuggageStore<T> was on 0 of 157 pages, and AddBrighter finishes by registering a NullLuggageStore whose every method throws "you must register a real store after Brighter".

Four claims measured in a PackageReference 10.7.0 harness rather than read:

  • AddBrighter() alone → resolving IAmAStorageProvider throws that message
  • the same registration after AddBrighter displaces it — AddSingleton, last wins, the opposite of AddBrighterDefault's TryAdd rule
  • the throw lands on resolution, because RegisterLuggageStore calls EnsureStoreExists() eagerly in its factory — not at the first over-threshold message, which is what my first draft of this page claimed
  • thresholdInKb: 0 checks every message; a body under the threshold is untouched

contents/MSSQLTransportInboxAndOutbox.md (P1-2)

The same composition as P0-1 with an Inbox added, establishing that it generalises. It mostly does — and the page names the place it does not: the MSSQL gateway has no provisioning path at all, so OnMissingChannel.Create is inert and the queue table is yours to create. MsSqlQueueBuilder has no production call site, which is why it is public.

The ChannelFactory downcast was run with a control:

Subscription<T>      : ConfigurationException: MS SQL ChannelFactory We expect an
                       MsSqlSubscription or MsSqlSubscription<T> as a parameter
MsSqlSubscription<T> : accepted

Companion sample: BrighterCommand/Brighter#4331, which fixes two receivers in samples/TaskQueue/MsSqlMessagingGateway/ that carried exactly that defect and could never have started.

Defects found in pages this phase links

  • ClaimCheck.md printed an IAmAStorageProviderAsync with three members that do not exist — UploadAsync/DownloadAsync for StoreAsync/RetrieveAsync, and no EnsureStoreExistsAsync or Tracer — plus a V9 one-argument MapToMessage, and a store list that stopped after one of seven, mid-bold
  • MSSQLOutbox.md (6 sites) and MSSQLInbox.md (1) named MsSqlOutboxBuilder and MsSqlInboxBuilder, which have never existed. Nine of ten providers prefix the builder; MSSQL alone does not, and the docs wrote the pattern. The types are SqlOutboxBuilder and SqlInboxBuilder
  • PostgreSQLTransportAndOutbox.md step 8 was missing the DI using for AddBrighter

Gates

Gate Before After
linkcheck 162 164
pagelint pages 160 162
pagelint warnings 772 768
--check-shape 159, widest 12 of 20 161, widest unmoved
--check-redirects 77 / 7858 unmoved
versioncheck 0 stale of 18 unmoved
optioncheck 0 across 59 tables, 519 rows unmoved

--changed origin/master reads 6 documentation page(s), 25 code block(s) strict, 0 errors — the scope line, not just the verdict.

Every block on both new pages compiles against 10.7.0 with ImplicitUsings disabled and no NoWarn: 4 blocks and 9 blocks, 0 errors, and no CS0618.

One convention conflict, recorded rather than worked around

Design §4.4 says P1-2 must mirror P0-1's shape; rule 3a says ## headings are unique across pages. Both cannot hold literally once two how-tos share a step sequence, which is the first time that has happened. The four colliding headings are qualified on the new page only, so no published PostgreSQL anchor moves. Evidence for spec 014.

🤖 Generated with Claude Code

https://claude.ai/code/session_0146UueHL6H3zGBGTYwz7GtL

iancooper and others added 2 commits September 10, 2026 10:32
Two new nested pages, and repairs to four they lean on.

contents/HandlingLargeMessages.md (P1-1) — the wiring ClaimCheck.md does not
cover: which luggage store, how to register it, where the threshold is measured,
and how to tell whether the payload really left. Step 3 is why the page exists.
UseExternalLuggageStore<T> was on 0 of 157 pages, and AddBrighter ends by
registering a NullLuggageStore whose every method throws "you must register a
real store after Brighter".

Measured rather than read, in a 10.7.0 PackageReference harness:
- AddBrighter() alone -> resolving IAmAStorageProvider throws that message
- the same registration after AddBrighter displaces it (AddSingleton, last wins)
- the throw lands on RESOLUTION, because RegisterLuggageStore calls
  EnsureStoreExists() eagerly in its factory — not at the first over-threshold
  message, which is what a first draft of this page claimed
- thresholdInKb: 0 checks every message; a body under the threshold is untouched

contents/MSSQLTransportInboxAndOutbox.md (P1-2) — the same composition as P0-1
with an Inbox added, establishing that it generalises. It mostly does, and the
page names the place it does not: the MSSQL gateway has no provisioning path at
all, so OnMissingChannel.Create is inert and the queue table is yours to create.
MsSqlQueueBuilder has no production call site, which is why it is public.

Defects found in pages this phase links:
- ClaimCheck.md printed an IAmAStorageProviderAsync with three members that do
  not exist — UploadAsync/DownloadAsync for StoreAsync/RetrieveAsync, and no
  EnsureStoreExistsAsync or Tracer — plus a V9 one-argument MapToMessage and a
  store list that stopped after one of seven, mid-bold
- MSSQLOutbox.md (6 sites) and MSSQLInbox.md (1) named MsSqlOutboxBuilder and
  MsSqlInboxBuilder, which have never existed. Nine of ten providers prefix the
  builder; MSSQL alone does not, and the docs wrote the pattern. The types are
  SqlOutboxBuilder and SqlInboxBuilder
- PostgreSQLTransportAndOutbox.md step 8 was missing the DI using for AddBrighter

Every block on both new pages compiles against 10.7.0 with ImplicitUsings
disabled and no NoWarn: 4 blocks and 9 blocks, 0 errors, and no CS0618.

Gates: link 162 -> 164, pagelint 160 -> 162 pages with warnings 772 -> 768,
shape 159 -> 161 widest unmoved at 12 of 20; redirects, versioncheck and
optioncheck unmoved. --changed reads 6 documentation page(s), 25 code block(s)
strict, 0 errors.

Note for spec 014: rule 3a and design 4.4 conflict here. "Mirror P0-1's shape"
and "## headings are unique across pages" cannot both hold literally once two
how-tos share a step sequence, which is the first time that has happened. The
four colliding headings are qualified on the NEW page only, so no published
PostgreSQL anchor moves.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0146UueHL6H3zGBGTYwz7GtL
Ticks tasks 4.1-4.8 and records what running the pages found, including the two
things the phase got wrong before it got them right: the null luggage store
throws on resolution rather than on threshold, and nine of ten providers prefix
their DDL builder while MSSQL does not.

Finding G is for spec 014: CLAUDE.md justifies the "## Step N:" convention partly
on step headings being unique across pages, and that precondition fails the first
time two how-tos deliberately share a shape — which design 4.4 required.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0146UueHL6H3zGBGTYwz7GtL
@iancooper
iancooper merged commit 1fc5984 into master Sep 10, 2026
8 checks passed
@iancooper
iancooper deleted the docs/013-phase4-large-messages-mssql branch September 10, 2026 10:35
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