Skip to content

spec: 009 Phase 3 — rung 1, the first Tutorial-typed page - #116

Open
iancooper wants to merge 1 commit into
masterfrom
docs/spec-009-phase-3-rung-1
Open

spec: 009 Phase 3 — rung 1, the first Tutorial-typed page#116
iancooper wants to merge 1 commit into
masterfrom
docs/spec-009-phase-3-rung-1

Conversation

@iancooper

Copy link
Copy Markdown
Member

Spec 009, Phase 3 — D1. contents/TutorialFirstCommand.md: a command dispatched to a handler in-process, no broker, no Docker. The corpus's first Tutorial-typed page — a banner type pagetypes.tsv shows 0 of 142 pages had ever used.

Five tasks, 3.1–3.5. Phase 3 opens no Brighter PR: rung 1 reuses samples/CommandProcessor/HelloWorld unchanged, which is what makes it the one rung nothing upstream can stall.

host.Run(), settled by observation

Design said decide at writing time by running it; do not guess. Run: the sample prints Hello Ian, then Application started. Press Ctrl+C to shut down., and sits there — still running at 45 seconds. The greeting arrives before the host starts, so Send completes and host.Run() contributes nothing but the block. AddBrighter().AutoFromAssemblies() registers no IHostedService — the only two in the DI package come from the opt-in BrighterPipelineValidationExtensions.

The page drops that one line and says why the sample keeps it. No change was made to Brighter.

The near-miss is worth the paragraph: git grep "host.Run()" matched one sibling of three, and the finding drafted from it — "HelloWorld is an outlier among its own siblings" — is false. The other two end await host.RunAsync(). One term, two spellings, and the query was well-formed and answering a different question — exactly Box Provisioning against BoxProvisioning, one phase earlier.

The Tutorial banner asserted, not inferred

A repo-wide 0 errors is a silence. So: BANNER_RE called directly and asserted to match with group(1) == 'Tutorial'; then two red-proofs on the page, each asserting the mutation produced the input the branch rejects before the tool ran — type out of vocabulary → BANNER MALFORMED, banner deleted → BANNER MISSING, both exit 1. Restored from a copy taken aside, asserted byte-identical.

The timed run was wrong the first time, and looked right

NUGET_PACKAGES moves the global packages folder but not the HTTP cache. A plausible "cold" restore of 4.5s was served from ~/.local/share/NuGet/http-cache while the target directory really did go 0 files → 195 MB, so every cheap check agreed. Redone with all four locations redirected and each verified empty via dotnet nuget locals all --list: restore 4.5s → 6.2s, http-cache 0 → 113 files, total machine time 10.9s. An empty cache is a claim about one directory; cold is a claim about four.

The page publishes that measurement as a diagnostic rather than a promise — ten minutes is reading and typing; if your restore takes minutes, the problem is your feed.

The code on the page is the code that ran

The three csharp blocks were extracted from the markdown and compared byte for byte against the .cs files that were compiled and run: identical. The xml block against the <ItemGroup> the three dotnet add package commands actually generated: identical.

Four reader-facing claims were checked against the Brighter source; two were wrong as drafted, including "rung 2 swaps in a broker and this line does not change" — rung 2 uses Post, so that was a promise a future page would have broken.

One finding the later rungs inherit

Design's D1 outline links rung 2, which does not exist yet — written as outlined the page would have failed linkcheck.py with MISSING FILE. Link down the ladder, never up. Phases 6, 8 and 11 each inherit this; the upward links are Phase 9's to add.

Gates

Gate Result
linkcheck.py clean, 145 files
pagelint.py 0 errors, 790 warnings, 144 pages — debt unmoved
pagelint.py --changed origin/master 0 errors, 7 code blocks strict
urlmap.py --check-shape 0 — 143 pages, 12 sections
urlmap.py --check-redirects 0 — 77 entries

The debt staying at 790 is the point: all three C# blocks carry their own using directives and none uses the // ... escape, so the page adds nothing to AC1's baseline by construction. And 7 code blocks strict is this spec's first non-vacuous --changed run — Phases 1 and 2 reached 0 blocks and said so.

Predicted URL, from urlmap.py rather than guessed: get-started/tutorialfirstcommand.

Tasks re-derived, not incremented: 11 done, 28 open, 39 total, and the phase table still sums to 39 independently.

🤖 Generated with Claude Code

… ran

D1. `contents/TutorialFirstCommand.md`, the corpus's first `Tutorial`-typed
page: a command dispatched to a handler in-process, no broker, no Docker.

Task 3.1 settled `host.Run()` by observation rather than guessing. The sample
prints `Hello Ian`, then `Application started. Press Ctrl+C to shut down.`, and
sits there — still running at 45 seconds. `AddBrighter().AutoFromAssemblies()`
registers no `IHostedService`; the only two in the DI package come from the
opt-in `BrighterPipelineValidationExtensions`. So the page drops that one line
and says why the sample keeps it. No change was made to Brighter.

The near-miss on the way: `git grep "host.Run()"` matched one sibling of three,
and the finding drafted from it — "HelloWorld is an outlier" — was false. The
other two end `await host.RunAsync()`. One term, two spellings, exactly Phase
2's `Box Provisioning` against `BoxProvisioning`, one phase later.

Task 3.3's assertion is the point, because a repo-wide `0 errors` is a silence.
`BANNER_RE` was called directly and asserted to match with group(1) ==
'Tutorial' — the vocabulary alternative that had never fired on a real page.
Then two red-proofs on the page itself, each asserting the mutation produced the
input the branch rejects before the tool ran: a type out of vocabulary gives
BANNER MALFORMED, a deleted banner gives BANNER MISSING, both exit 1. Restored
from a copy taken aside and asserted byte-identical.

Task 3.4's first measurement was wrong and looked right. `NUGET_PACKAGES` moves
the global packages folder but not the HTTP cache, so a "cold" restore of 4.5s
was served locally while the directory really did go 0 → 195 MB. Redone with all
four cache locations redirected and each verified empty: restore 4.5s → 6.2s,
http-cache 0 → 113 files, total machine time 10.9s. An empty cache is a claim
about one directory; cold is a claim about four.

The three `csharp` blocks were then extracted from the markdown and compared
byte for byte against the `.cs` files that were compiled and run — identical —
and the `xml` block against the `<ItemGroup>` the three `dotnet add package`
commands generated. Four reader-facing claims were checked against the Brighter
source; two were wrong as drafted, including a promise about rung 2 that rung 2
would have broken.

Design's D1 outline links rung 2, which does not exist yet and would have failed
linkcheck with MISSING FILE. Link down the ladder, never up — Phases 6, 8 and 11
inherit this.

Gates: linkcheck clean at 145 files; pagelint 0 errors, 790 warnings, 144 pages
— the using-directive debt unmoved, since all three C# blocks carry their own
directives and none uses the `// ...` escape; `--changed origin/master` reached
7 code blocks strict, this spec's first non-vacuous strict run; both urlmap
checks 0. Tasks re-derived, not incremented: 11 done, 28 open, 39 total.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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