Skip to content

docs: 013 phase 1 — repair an API surface the corpus never had - #152

Merged
iancooper merged 1 commit into
masterfrom
docs/013-phase1-dead-api
Sep 6, 2026
Merged

docs: 013 phase 1 — repair an API surface the corpus never had#152
iancooper merged 1 commit into
masterfrom
docs/013-phase1-dead-api

Conversation

@iancooper

Copy link
Copy Markdown
Member

P0-2 and P0-4. Eleven pages, ten code blocks, and every gate where design §9 said it would be.

Gate Predicted Measured
linkcheck.py unmoved 160
pagelint.py pages unmoved 158
pagelint.py warnings must fall from 779 773
--changed scope 8 strict 10 strict — see finding E
shape · redirects · versioncheck · optioncheck unmoved unmoved ✓

What is now zero across contents/: .ResiliencePipelines(, .ConfigureResiliencePipelines(, InputChannelFactory, DispatchBuilder.With(, .Subscribers(, and all eight dead relational type names. .Resilience(, DefaultResilience and AddBrighterDefault were on 0 pages and are now on 5 — the tell that opened this phase, inverted.

Every repaired block was compiled before it was written to a page: one project per block, <ImplicitUsings>disable</ImplicitUsings>, optioncheck's pinned packages, 0 errors and 0 warnings each.

Seven findings the approved task list did not predict

A. Two of the seventeen sites are correct, and design §5's table would have falsified them. MigratingToPollyV8.md:99 and :101 sit inside a block the page labels V9. At tag 9.33, git grep -c declares With() 1 and Policies( 2; both are 0 at 10.7.0. They are genuine V9 API, correctly shown as history on a migration page — rewriting them would have told readers V9 had a method it never had. A repair inventing a history, the same shape as design §11 Q6's invented type name. The block now carries CLAUDE.md's ❌/✅ markers, so the next dead-API sweep meets an explicit label rather than a bare .With().

B. Every fluent example was missing three mandatory chain steps. CommandProcessorBuilder's interfaces force ExternalBus|NoExternalBus, ConfigureInstrumentation|NoInstrumentation and RequestSchedulerFactory between Resilience and Build. Four of five builder blocks skipped two or three. Repairing only the names design §5 lists would have produced blocks that still do not compile. No grep could see it — the compiler reads a chain, a sweep reads a token.

C. AddBrighterDefault lives in Paramore.Brighter.Extensions — a namespace on 0 of 158 pages. The method the spec set out to add is one the corpus cannot import.

D. UseResiliencePipelineAsync is in Paramore.Brighter.Policies.Attributes, and the two pages already using it carry no using lines at all.

E. Two of P0-4's ten sites are inside fences, not prose — so ten blocks turned strict where eight were budgeted. --changed said so immediately, which is the argument for reading the scope line rather than the verdict.

F. Renaming a type inside a block is not finished until its namespace is imported. BrighterBasicConfiguration.md had Paramore.Brighter.MySql but not ...MySql.EntityFrameworkCore. It passed rule 6 either way — directives, but not the right ones.

G. BrighterOptions.PolicyRegistry raises CS0618 and is NOT a defect — under AC10's three states it is live, merely deprecated. Recorded, not swept.

Checked and deliberately left alone

  • Five Darker calls on CQRSWithBrighterAndDarker.md, verified real in ../Darker against a control of 0. Only the Brighter half of that block was touched — obligation 10.
  • DynamoDbUnitOfWork and MongoDbUnitOfWork survive on five pages — the NoSQL stores genuinely have a unit of work, and they are the control proving the P0-4 sweep discriminated rather than pattern-matching on UnitOfWork.

Full ledger: spec/013-howto_guides/tasks.md § Phase 1 as executed.

🤖 Generated with Claude Code

https://claude.ai/code/session_0146UueHL6H3zGBGTYwz7GtL

P0-2 and P0-4. Eleven pages, ten code blocks, and every gate where design §9
said it would be: link 160 unmoved, pagelint pages 158 unmoved, shape,
redirects, versioncheck and optioncheck all unmoved, and the using-directive
warning count 779 -> 773.

Fifteen dead call sites, three further defects, ten dead type names. What is now
zero across contents/: .ResiliencePipelines(, .ConfigureResiliencePipelines(,
InputChannelFactory, DispatchBuilder.With(, .Subscribers(, and all eight dead
relational type names. .Resilience(, DefaultResilience and AddBrighterDefault
were on 0 pages and are now on 5 — the tell that opened this phase, inverted.

Every repaired block was compiled before it was written to a page: one project
per block, <ImplicitUsings>disable</ImplicitUsings>, optioncheck's pinned
packages, 0 errors and 0 warnings each.

Seven findings the approved task list did not predict — full ledger in
spec/013-howto_guides/tasks.md § Phase 1 as executed:

A. TWO OF THE SEVENTEEN SITES ARE CORRECT AND DESIGN §5 WOULD HAVE FALSIFIED
THEM. MigratingToPollyV8.md:99 and :101 sit inside a block the page labels V9.
At tag 9.33 git grep -c declares With() 1 and Policies( 2; both are 0 at 10.7.0.
They are genuine V9 API shown as history on a migration page, and rewriting them
would have told readers V9 had a method it never had — a repair inventing a
history. The block now carries CLAUDE.md's ❌/✅ markers so the next sweep meets
a label rather than a bare .With().

B. EVERY FLUENT EXAMPLE WAS MISSING THREE MANDATORY CHAIN STEPS. The builder's
interfaces force ExternalBus|NoExternalBus, ConfigureInstrumentation|
NoInstrumentation and RequestSchedulerFactory between Resilience and Build.
Repairing only the names design §5 lists would have produced blocks that still
do not compile. No grep could see it; the compiler reads a chain, a sweep reads
a token.

C. AddBrighterDefault lives in Paramore.Brighter.Extensions — a namespace on 0
of 158 pages. The method the spec set out to add is one the corpus cannot
import.

D. UseResiliencePipelineAsync is in Paramore.Brighter.Policies.Attributes, and
the two pages already using it carry no using lines at all.

E. TWO OF P0-4's TEN SITES ARE INSIDE FENCES, NOT PROSE, so ten blocks turned
strict where eight were budgeted. --changed said so immediately, which is the
argument for reading the scope line rather than the verdict.

F. Renaming a type inside a block is not finished until its namespace is
imported: BrighterBasicConfiguration.md had Paramore.Brighter.MySql but not
...MySql.EntityFrameworkCore. It passed rule 6 either way — directives, but not
the right ones.

G. BrighterOptions.PolicyRegistry raises CS0618 and is NOT a defect: under
AC10's three states it is live, merely deprecated. Recorded, not swept.

Checked and left alone: five Darker calls on CQRSWithBrighterAndDarker.md,
verified real in ../Darker against a control of 0 — only the Brighter half of
that block was touched. DynamoDbUnitOfWork and MongoDbUnitOfWork survive on five
pages and are the control proving the P0-4 sweep discriminated rather than
pattern-matching on UnitOfWork.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0146UueHL6H3zGBGTYwz7GtL
@iancooper
iancooper merged commit c1f3fb1 into master Sep 6, 2026
8 checks passed
@iancooper
iancooper deleted the docs/013-phase1-dead-api branch September 6, 2026 23:00
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