@@ -305,3 +305,92 @@ anywhere in the suite.**
305305
306306The soak is closed. Five findings, all fixed and verified from the
307307application side, on the seam a package suite structurally cannot reach.
308+
309+ ---
310+
311+ ## 9. Phase B — to production, part 1 (2026-08-23)
312+
313+ dimll shipped, so the migration's production half opened: floor bump →
314+ workflow audit → inaugural push. Stops at the owner gate; no service
315+ creation, no cutover.
316+
317+ ### The floor is 2.7.1, not 2.7.0
318+
319+ Checked PyPI at execution time as instructed. The first check showed 2.7.0
320+ (uploaded 17:48:38Z) and ** no 2.7.1** . The clean install minutes later
321+ resolved ** 2.7.1** — the fast-follow landed at 18:24:03Z, * between* the check
322+ and the install. Re-verified and floored on the later one, per the rule that
323+ the fleet's floor round happens once.
324+
325+ 2.7.0 is what this app cannot ** start** without (it calls ` configure_geo ` ,
326+ the panel, per-vendor policy and the rate ceiling unconditionally). 2.7.1 is
327+ additive: ` rel="describedby" ` discovery relations on both document lanes plus
328+ ` Link ` headers, a ` text/plain ` Accept ramp, and a source digest that makes
329+ representation parity provable. Nothing here needed changing for it.
330+
331+ Moved by ** grepping the number** , not from memory — which turned up a third
332+ encoding nobody had touched: ` ci.yml ` still asserted ` >=2.3.4 ` , inherited
333+ from the template.
334+
335+ ### The capability block is gone
336+
337+ That was its design promise, not a convenience. Collapsed to a plain import,
338+ and every guarded call site with it — including ` requires_dimll_27 ` and the
339+ ` pytestmark ` in six modules. That marker could no longer fire once the floor
340+ guaranteed the feature, and ** a skipif that can never trigger is a suite
341+ quietly overstating its own coverage** .
342+
343+ ### The resolution re-proof
344+
345+ Phase 1 mirrored the boilerplate's venv because the sandbox had no network,
346+ and said so. This is the real thing: fresh venv on ** Python 3.12** (CI's
347+ primary, not phase 1's 3.11), full resolve from PyPI. It pulled genuinely
348+ newer transitives than the mirror — DMC 2.8.0, plotly 6.9.0, pandas 3.0.5,
349+ numpy 2.5.2, gunicorn 26.1.0 — and the suite is green on all of it.
350+
351+ * Environment note:* pip ≥24.2 verifies TLS through the macOS keychain, which
352+ this sandbox denies (` OSStatus -26276 ` ), while plain OpenSSL + certifi
353+ through the same proxy works. pip falls back to certifi when
354+ ` pip._vendor.truststore ` cannot be imported, so the install ran through a
355+ three-line wrapper that blocks that import. Nothing in the repo changed —
356+ only how pip verifies.
357+
358+ ### The workflow audit, before the push
359+
360+ The excalidraw lesson. ` cd.yml ` carried
361+ ` SITE_URL: https://boilerplate.2plot.dev ` ** hard-coded** . Unguarded, the
362+ inaugural push would have polled another site's ` /healthz ` for fifteen
363+ minutes waiting for a commit it will never serve, failed, then run both live
364+ batteries against it — a fork failing CD on day one over a host it does not
365+ own. ` ci.yml ` still tagged its image ` dash-docs-boilerplate:ci ` and described
366+ this repo as the template.
367+
368+ Everything touching a running host is now gated on the repository variable
369+ ` SITE_URL ` , ** with no hard-coded fallback** — an empty value * is* the signal
370+ that no service exists, and a default would silently re-point the workflow at
371+ someone else's host. Unguarding takes no workflow edit, twice: B3 sets the
372+ variable to the ` .onrender.com ` URL, B5 changes it to the domain.
373+
374+ ### The inaugural push, and its three failures
375+
376+ The first run in this repo's history went red in three places, all mine, none
377+ catchable locally because ** neither lint nor the older-Dash matrix leg had
378+ ever run here** :
379+
380+ - ** flake8, 8 findings** — seven unused imports and a blank-line count,
381+ almost all orphaned by edits earlier in this same phase.
382+ - ** dash 4.4.0, both backends** — ` test_the_nonce_mask_is_sound ` , the control
383+ for every byte-identical assertion in the geo file, asserted that two
384+ identical requests DIFFER. True on 4.4.1 (which stamps a per-request
385+ ` end_id ` nonce), false on 4.4.0. ** A control test coupled to a Dash version
386+ fact.** Rewritten to assert the two properties that actually matter and
387+ hold on either version: the mask is sound (identical requests compare
388+ equal) and not over-broad (it must not equalise two * different* pages).
389+
390+ The CD guard worked on that same run: ` deploy to render ` and `verify the live
391+ site` both skipped. Nothing was battered against a host this repo does not
392+ own — which was the entire point of auditing before pushing rather than
393+ after.
394+
395+ Verified on both Dash versions this time: ** 597 / 594 passed** on 4.4.0 and
396+ 4.4.1 alike, flake8 clean.
0 commit comments