Skip to content

Commit fdd260a

Browse files
nickolas122claude
andcommitted
Phase 0 of the strip: stop promising a rebase, and cut the fallback release
The strip deletes upstream code outright rather than patching over it, so an upstream rebase stops being possible the moment the first deletion lands. FORK.md still said "Rebasing on a newer upstream moves the base and resets the counter", and the same sentence sat in the header comment of qzforkversion.h. Both now say what will actually be true: 2.21.6 is a record of where the tree came from, the -qz.N counter never resets, and upstream fixes arrive by hand. The tag half of this phase was written down as already satisfied by v2.21.6-qz.1. It was not, and STRIP-SPEC now says why: qz.1 predates the entire virtual-bike test stage, so rolling back to it would have thrown away the safety net along with the strip. The fallback has to be the tree as it stands on the eve of the first deletion. That is v2.21.6-qz.2, tagged at this commit with QZ_FORK_VERSION bumped to match, as the release job requires. Two corrections to STRIP-SPEC while here, both of them stale rather than wrong when written. Section 10 still said "there is no unit-test safety net here", which section 11.1 already contradicted and the six virtual-bike phases have now made comprehensively false; the phase table gains a coverage column and 11.1 gains the five suites that provide it. And the distinction those columns record is worth stating plainly: the loop covers the bridge core end to end and covers the UI not at all, because homeform cannot be constructed without a QML engine. That splits the phases cleanly - 1, 2, 4, 5 and 6 are covered, 3 and 7 are not - and argues for taking the covered ones first, which is noted without renumbering, since the 11.6 criteria refer to the existing numbers. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 39ebe93 commit fdd260a

3 files changed

Lines changed: 67 additions & 24 deletions

File tree

FORK.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,22 @@ turned out not to be the cause — are in [docs/fork/](docs/fork/).
135135
## Versioning
136136

137137
Releases are tagged `v<upstream base>-qz.<n>` — for example `v2.21.6-qz.1`, meaning the
138-
first release of this fork built from upstream 2.21.6. Rebasing on a newer upstream moves
139-
the base and resets the counter.
138+
first release of this fork built from upstream 2.21.6.
139+
140+
**The base does not move.** This fork deletes upstream code outright rather than carrying
141+
patches on top of it (see [docs/fork/STRIP-SPEC.md](docs/fork/STRIP-SPEC.md)), so rebasing
142+
stopped being possible. `2.21.6` is a record of where the tree came from, not a number that
143+
will be bumped; the `-qz.<n>` counter keeps climbing and never resets. Upstream fixes worth
144+
having arrive by reading the diff and reimplementing them here by hand.
145+
146+
`v2.21.6-qz.2` is the last release with upstream's shape intact — the fallback if a deletion
147+
turns out to have taken something load-bearing with it.
140148

141149
The same string lives in [`src/qzforkversion.h`](src/qzforkversion.h) and is written to
142150
the top of every log:
143151

144152
```
145-
QZ fork release 2.21.6-qz.1
153+
QZ fork release 2.21.6-qz.2
146154
QZ build <sha> Qt <version> on <os>
147155
```
148156

docs/fork/STRIP-SPEC.md

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -481,23 +481,34 @@ and those take calendar time rather than effort.
481481

482482
## 10. Phasing
483483

484-
Each phase must end with a tree that **builds on both Windows and Android** and **rides
485-
with Rouvy**. That is the acceptance test for all of them; there is no unit-test safety
486-
net here.
484+
Each phase must end with a tree that **builds on both Windows and Android** and **passes
485+
the suite, including the Layer C ride loop** ([VIRTUAL-BIKE.md](VIRTUAL-BIKE.md)). A ride
486+
with Rouvy is still the final word, but it is no longer the only evidence available — see
487+
§11.1, and the coverage column below.
487488

488-
| Phase | Content | Risk |
489-
| --- | --- | --- |
490-
| 0 | Rewrite `FORK.md` §Versioning (§3.1); tag a pre-strip release as the fallback | none |
491-
| 1 | Group A — leaf integrations | low |
492-
| 2 | Group B — recording | low |
493-
| 3 | Group C — training programs | medium (homeform surgery) |
494-
| 4 | Group D — telemetry | medium (verify RTSS first) |
495-
| 5 | Group E — drivers | low, once cscbike is resolved |
496-
| 6 | Settings consolidation | medium (§3.6 runtime failures) |
497-
| 7a | `RideState` object + `ui_next` flag + new tree under `src/ui/` | medium |
498-
| 7b | Ride on the new UI with Rouvy and Zwift; flip the default | low, but needs calendar time |
499-
| 7c | Delete Group F — old tree, tile system, `homeform.cpp`, the flag | high |
500-
| 8 | Group G, Pi build revival | medium |
489+
| Phase | Content | Risk | Harness |
490+
| --- | --- | --- | --- |
491+
| 0 | Rewrite `FORK.md` §Versioning (§3.1); tag a pre-strip release as the fallback | none | n/a |
492+
| 1 | Group A — leaf integrations | low | **covered** |
493+
| 2 | Group B — recording | low | **covered** |
494+
| 3 | Group C — training programs | medium (homeform surgery) | **none** |
495+
| 4 | Group D — telemetry | medium (verify RTSS first) | **covered** |
496+
| 5 | Group E — drivers | low, once cscbike is resolved | **covered** |
497+
| 6 | Settings consolidation | medium (§3.6 runtime failures) | **covered** |
498+
| 7a | `RideState` object + `ui_next` flag + new tree under `src/ui/` | medium | **none** |
499+
| 7b | Ride on the new UI with Rouvy and Zwift; flip the default | low, but needs calendar time | **none** |
500+
| 7c | Delete Group F — old tree, tile system, `homeform.cpp`, the flag | high | **none** |
501+
| 8 | Group G, Pi build revival | medium | partial |
502+
503+
"Covered" means the end-to-end loop asserts on that phase's blast radius: bike frames in,
504+
metrics, DIRCON, a client reading numbers back out. It is deliberately **not** UI coverage
505+
`homeform` cannot be constructed without a QML engine, so the loop asserts on the wire
506+
rather than on tiles. That is the whole of the distinction in the column.
507+
508+
Which argues for taking the covered phases first. The numbering here is from the original
509+
plan and the §11.6 criteria refer to it, so it stays; but **1, 2, 5, 4, 6 before 3 and 7**
510+
spends the safety net where it exists and arrives at the UI work — the part that has to be
511+
validated by riding — against a much smaller tree.
501512

502513
Phase 0 matters more than it looks: once phase 1 lands, there is no going back to
503514
upstream. A tagged release beforehand is the only rollback.
@@ -540,6 +551,22 @@ Existing suites, and their fate:
540551
**Deleting a feature without deleting its suite breaks the build, not the tests.** Each
541552
phase below therefore names the suites that go with it.
542553

554+
Since this section was written the virtual-bike work ([VIRTUAL-BIKE.md](VIRTUAL-BIKE.md))
555+
added the end-to-end half it was missing. These are the suites the "covered" column in §10
556+
refers to, and none of them is a candidate for deletion:
557+
558+
| Suite | Covers | Layer |
559+
| --- | --- | --- |
560+
| `TestRideScenario`, `TestSimulatedBikeAnnouncement` | scripted rides, `.ride` fixtures, the simulated bike | A |
561+
| `TestFtmsFrameHarness` | the shipped `ftmsbike` parser, byte-exact against recorded frames | B |
562+
| `TestDirconFakeApp` | a training app connecting and enumerating over DIRCON | C |
563+
| `TestDirconRideLoop` | bike → metrics → DIRCON → client, asserted over a whole ride | C |
564+
| `TestDirconDiscovery` | mDNS advertisement, the Rouvy and MyWhoosh profiles | C |
565+
566+
The loop runs entirely in-process over loopback TCP: no radio, no trainer, no training app.
567+
What it does not touch is the UI — `homeform` needs a QML engine — so it proves the bridge
568+
survived a deletion, and says nothing about whether the screen did.
569+
543570
### 11.2 The browser-session workflow
544571

545572
`on:` carries `pull_request:` with **no branch filter**, while `push:` is restricted to
@@ -636,7 +663,14 @@ Universal gates (§11.4) apply throughout and are not repeated.
636663
**Phase 0 — versioning correction**
637664
*Criteria:* `FORK.md` no longer claims upstream rebasing is supported; a pre-strip release
638665
tag exists. *Test:* documentation only; CI green.
639-
*Status:* the tag half is **already satisfied** by `v2.21.6-qz.1`, cut before any deletion.
666+
*Status:* **done 2026-08-18.** `FORK.md` §Versioning and the header comment in
667+
`src/qzforkversion.h` now say the base does not move, and `v2.21.6-qz.2` is tagged at the
668+
tip of `lite-version` with `QZ_FORK_VERSION` bumped to match.
669+
670+
An earlier draft called the tag half satisfied by `v2.21.6-qz.1`. That stopped being true:
671+
`qz.1` predates the whole virtual-bike test stage, so rolling back to it would have
672+
discarded the safety net along with the strip. The fallback has to be the tree as it stands
673+
on the eve of the first deletion, which is what `qz.2` is.
640674

641675
**Phase 1 — leaf integrations**
642676
*Criteria:* no Peloton/Strava/Garmin/Intervals.icu/HomeFitnessBuddy/PowerZonePack symbol,

src/qzforkversion.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
* file version resource, which is what QCoreApplication::applicationVersion() reports - so
99
* the fork's release number lives here instead, where it can carry a suffix.
1010
*
11-
* The base is the upstream version this fork is built from, and the -qz.N counter bumps
12-
* once per release of this fork. Rebasing on a newer upstream moves the base and resets
13-
* the counter to 1.
11+
* The base is the upstream version this fork was built from, and the -qz.N counter bumps
12+
* once per release of this fork. The base does not move: this fork deletes upstream code
13+
* rather than carrying patches on top of it, so there is no rebase to move it, and the
14+
* counter never resets. See FORK.md, Versioning.
1415
*
1516
* The release workflow refuses to publish if the tag and this string disagree, so bump
1617
* this in the same commit that gets tagged.
1718
*/
18-
#define QZ_FORK_VERSION "2.21.6-qz.1"
19+
#define QZ_FORK_VERSION "2.21.6-qz.2"
1920

2021
#endif // QZFORKVERSION_H

0 commit comments

Comments
 (0)