Framework v7.9.1 — Single-day Build Window (8 ships, 14 PRs, 0 new gates)
v7.9.1 was a single-day build window that opened at v7.9 Phase E exit (2026-06-04) and closed the same day. 8 ships landed across 14 PRs with zero new enforcement gates — Phase E exit discipline preserved. Every ship is an observability surface, doc update, reusable substrate, or warn-only CI workflow. Five of the eight ships close documented silent-pass classes (W11.b cron context, W18 og:image 404, W19 GA_ID encoded-newline, W30 YAML parser quirk, and the soak-window denominator dilution pattern). CI workflows grew 8 → 14 (+6); observed-patterns W1-W28 → W1-W32; FT2 dev-env open R-items 7 → 0. Cascading rebase rhythm shipped 14 PRs with 5 mechanical rebases and zero rollbacks.
What do T1 / T2 / T3 mean?▾
Framework v7.9.1 — Single-day Build Window
The v7.9.1 build window opened at v7.9 Phase E exit (2026-06-04) and closed the same day. Eight ships landed across 14 PRs. The unifying constraint: 0 new enforcement gates — Phase E exit discipline forbids new gates for the first 14 days post-promotion, so every ship had to be an observability surface, doc update, reusable substrate, or warn-only CI workflow.
The 8 ships
| # | Ship | Theme | PR(s) |
|---|---|---|---|
| 1 | F16 try-repo harness | 3rd layer of gate testing (subprocess) | #607-#612 |
| 2 | F17 last_fired_at index | Derived telemetry materialization (AWS Config Rules pattern) | #617 |
| 3 | F2 Phase 0 reality-check sub-step | Defense vs post-squash-merge state drift | #618 |
| 4 | Dev-env Track B (R7+R8+R12) | SwiftLint + ruff + markdownlint Makefile + CI | #619 |
| 5 | F-LAUNCHD-DRIFT-EXTENSION (b)+(c) | Cron-context phantom-finding suppression (W11.b) | #621, #622 closure |
| 6 | F-LAUNCHD-DRIFT-EXTENSION (a) | Plist path-resolution health checks | #623, #624 closure |
| 7 | Observed-patterns W29-W32 catalog | v7.8.5 mandatory-rule append | #620 |
| 8 | F-PHASE-E-ADOPTION-FREEZE-DISCIPLINE | Soak-window denominator-dilution discipline | #625 |
| 9 | R9 Track B coverage aggregator | iOS Slather + Python pytest-cov warn-only CI | #626 |
| 10 | Dev-env R11+R13+R14+R17+R18 batch | gitleaks + pip-audit + SBOM + commitlint + shellcheck | #627 |
| 11 | F-DEPLOYED-URL-PROBE FT2 substrate | W18 og:image + W19 GA_ID encoded-newline defense | #628 |
The numbering reflects two grouping layers — the 8 functional ships (F-LAUNCHD-DRIFT-EXTENSION is one feature with sub-fixes b/c then a; W29-W32 catalog is one item) plus the closure PRs they each needed.
Cross-cutting themes
Silent-pass closures
Five of 8 ships close documented silent-pass classes. The unifying pattern: the parser, the cache, the path resolver, or the receiving service has its own interpretation of "valid" that the producer doesn't know about. The defense in every case is to emit ONE explicit advisory instead of either silent failure or noise amplification.
| Ship | Silent-pass class | Catalog ref |
|---|---|---|
| F-LAUNCHD (b)+(c) | Cron context lacks gh keychain → empty PR cache → 319 phantom BROKEN_PR_CITATION findings | W11.b |
| F-LAUNCHD (a) | Plist WorkingDirectory / script path / log dir invalid → silent exit-78 every cron fire | W11.b durable fix |
| F-PHASE-E-ADOPTION-FREEZE-DISCIPLINE | Features added during soak window dilute denominator → −9.4 pp regression looks like real degradation | New (first published rule) |
| F-DEPLOYED-URL-PROBE | Deployed HTML SAYS URL is valid ≠ receiving service can fetch+process it | W18 + W19 |
| W30 (Q6 parity gate YAML quirk) | Bare YAML int - 623 becomes string "623" → regex #\d+ rejects → PR silently dropped | W30 (new) |
The cascading PR rhythm
The session shipped 8 features through 14 PRs in a strict serial cascade. Each PR needed a rebase against the new main after its predecessor merged. The git rebase origin/main pattern executed cleanly 5 times.
A non-obvious win: the rebase-cascade pattern made W31 visible. PR #623's initial push triggered only 5/12 expected workflows — the pull_request-event-triggered ones (CI, Lint, PR Integrity, try-repo-harness) silently didn't fire. The cascading rebase fixed it by triggering a synchronize event with a clean lineage. W31 documents the operator-side workaround.
Quantitative roll-up
| Dimension | Pre-2026-06-04 | Post-2026-06-04 |
|---|---|---|
| Write-time gates | 12 enforced | 12 enforced (no new) |
| Cycle-time gates | 13 enforced + 3 advisories | 13 + 3 (no new) |
| CI workflows baseline | 8 | 14 (+6) |
| Observed-patterns | W1-W28 | W1-W32 (+4) |
| FT2 dev-env open R-items (Tier 2-3) | 7 | 0 |
| Reusable shell substrates | 0 | 1 (probe-deployed-url.sh) |
| v7.9.1 docket open candidates | 7 | 2 (both fitme-story-side) |
Why warn-only baseline for the +6 new CI workflows?
The v8.0 GATE_TEST_MISSING meta-gate needs concrete calibration data — what's the baseline coverage today, which modules drift hardest, what's the typical PR delta? Gating at v7.9.1 with arbitrary thresholds risks two failure modes: (a) thresholds too aggressive → legitimate work gated → operator overrides pile up → discipline erodes; (b) thresholds too lenient → no signal value.
The dev-env master plan explicitly defers gate calibration to "once a 30-day baseline exists." Every v7.9.1 workflow ships with continue-on-error: true. The 30-day calibration window opens 2026-06-04 → 2026-07-04 for coverage; weekly cadence for gitleaks and pip-audit; per-PR cadence for commitlint and shellcheck.
Calendar-anchored follow-ups
| Date | Event |
|---|---|
| 2026-06-11 | T+7d fault-injection verification of F-LAUNCHD-DRIFT-EXTENSION + F-DEPLOYED-URL-PROBE |
| 2026-06-12 | External Audit #2 (operator-driven; audit pack will include today's gitleaks + pip-audit JSON + future SBOM artifacts) |
| 2026-06-17 | F16 T11 advisory→enforced flip — enforced 2026-06-17 (PR #764), one day early via adding the try-repo-harness CI job to main's required status checks (K2 false-positive rate 0% over 60 runs / 13 days) |
| 2026-07-04 | R9 Track B 30-day coverage data read → v8.0 GATE_TEST_MISSING meta-gate calibration can begin |
Cross-repo follow-ups (fitme-story-side, separate session)
- F-AUTH-LATENCY-SERVER-METRIC —
duration_ms_serverfield on the WebAuthn audit event (B12 K3 closure) - F-CONTRACT-FIXTURE-SAMPLING —
make sample-contract-fixturesaggregator + consumer-side fixture refresh discipline - F-DEPLOYED-URL-PROBE workflow integration — fitme-story-side post-deploy GH Action that calls
scripts/probe-deployed-url.sh
What worked
The cascading rebase rhythm scaled. Eight ships in one day with zero merge conflicts requiring manual resolution. The discipline of "one PR per ship" — even when the ship was a small 5-task closure PR — kept the blast radius bounded.
Mandatory --force-incomplete was caught fast. PR #624's first attempt to close f-launchd-drift-extension-sub-a failed because close-feature.py assumed testing as the pre-complete phase; the sub-fix shipped in a single-phase advancement. W32 documents the operator-side workaround.
The Q6 PR-list parity gate caught a real-world quirk. PR #624 spent 4 commit retries before W30 was authored, because bare YAML integers (- 623) get stored as the string "623" and the gate's #\d+ regex rejects them. The fix (string form "PR #623" or inline [N, ...] bracket form) was found by reading the parser source at line 1149.
What's queued for v7.10
- F16 advisory→enforced flip — enforced 2026-06-17 (PR #764), one day early. Not a single-line code flag like v7.9: the
try-repo-harnessCI job was added to main's required status checks viagh apibranch protection (an integration-test gate at the CI layer). K2 false-positive rate 0% over 60 CI runs / 13 days. - R9 Track B coverage data — 30 days of CI runs to accumulate; first read 2026-07-04 → drives v8.0
GATE_TEST_MISSINGmeta-gate per-module threshold calibration. - 3D Framework Universe feature —
scheduled_aftergate lifted at today's v7.9.1 closure; operator decides whether to advance to Phase 2.
References
The full §0-§99 synthesis is at docs/case-studies/framework-v7-9-1-promotion-case-study.md in the FT2 repo. Per-feature case studies (preserved as the depth layer per the Option D pattern):
f16-try-repo-harness-case-study.md(shipped via PR #612 + chain)f17-last-fired-at-index-case-study.md(PR #617)f2-phase-0-reality-check-case-study.md(PR #618)f-launchd-drift-extension-case-study.md(PR #621)f-launchd-drift-extension-sub-a-case-study.md(PR #623)f-phase-e-adoption-freeze-discipline-case-study.md(PR #625)r9-track-b-coverage-aggregator-case-study.md(PR #626)dev-env-r11-r13-r14-r17-r18-batch-case-study.md(PR #627)f-deployed-url-probe-ft2-case-study.md(PR #628)