Skip to content

Commit 519a777

Browse files
docs: Phase B part 1 — floor, workflow audit, inaugural push
README's status section, PHASE1-REPORT's blocked-on-publishing item, and a DEVELOPMENT-LOG section covering the 2.7.1 fast-follow that landed between the PyPI check and the install, the capability-block collapse, the resolution re-proof, the workflow audit, and the three failures the first CI run found.
1 parent 9a68474 commit 519a777

1 file changed

Lines changed: 89 additions & 0 deletions

File tree

‎DEVELOPMENT-LOG.md‎

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,3 +305,92 @@ anywhere in the suite.**
305305

306306
The soak is closed. Five findings, all fixed and verified from the
307307
application 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

Comments
 (0)