Skip to content

Release Cycle

This document defines the end-to-end release cycle for FCC — not just the packaging mechanics (which live in RELEASING.md), but the full hardening-and-validation loop that follows every release, culminating in a manual-UAT hand-off to the maintainer.

It is the default, expected path. It exists so the cycle is followed consistently rather than reconstructed from memory each time.


Governing principle — no silent deviation

The documented workflow below is the default. If a request appears to deviate from it — or if there is any temptation to shortcut a step (for speed, to work around a flake, or to act on an opportunistic find) — stop and get explicit maintainer validation before circumventing the workflow.

A terse instruction does not implicitly authorize skipping a standard step. When unsure whether something is a deviation, treat it as one and confirm. Asking is cheap; an unauthorized process change is not.


The cycle

A release has two halves: ship (packaging mechanics) and harden + validate (this document's focus).

commit → PR → push → build the release        ← RELEASING.md (packaging)
      → create the hardening patch
      → run AND extend automated UAT
      → build up the performance model
      → extend testing
      → run AI vision (qwen3-vl vision-diff)
      → fix all issues found, on the patch
      → stand up a build for MANUAL UAT        ← hand-off (below)

1. Ship the release

Follow RELEASING.md: version bump → changelog → PR → CI green → merge → GitHub Release → CI publishes (TestPyPI → PyPI). The package publish is irreversible — never cut the GitHub Release without explicit maintainer go-ahead.

2. Create the hardening patch

After a release — especially a minor or major — open the next patch (x.y.0 → x.y.1) as the vehicle for the hardening-and-validation work below. The feature/minor ships capability; the patch immediately following it is where validation deepens.

3. Run and extend automated UAT

Run the executable probe / UAT suite against the running services. Every cycle, extend it — add probes, journey-stream coverage, and tripwires. The goal is accumulation, not a static mirror: each pass leaves the automated suite stronger than the last.

4. Build up the performance model

Capture and refine the performance envelope (the Quick ≤250 ms / Moderate ≤2 s / Slow >2 s bands), recording API-layer and UI-layer implications. Track progress and regressions across patches.

5. Extend testing

Broaden unit/integration/contract coverage for whatever the release touched, at the standing 98 % line / 80 % branch gate (CI == Release).

6. Run AI vision

Run the qwen3-vl vision-diff baselines over the frontend and /admin surfaces. Track how vision coverage progresses and what it surfaces.

7. Fix all issues found — on the patch

Everything surfaced by steps 3–6 is fixed on the hardening patch before hand-off.

8. Stand up a build for manual UAT — the hand-off

Stand up a running build for the maintainer's manual UAT. The hand-off is not just "here's a build" — it must report:

  • Manual validation guide — the specific flows the maintainer should walk through by hand.
  • Automated UAT — what was extended this cycle (new probes / streams / tripwires), and current pass state.
  • Performance model — progress, new measurements, and any regressions or issues in the envelope.
  • AI vision — how vision-diff coverage is progressing and what it found.

Current status (as of v1.9.x)

The automated-UAT / performance-model / AI-vision machinery does not exist yet — it is the Phase 2 (v1.10.0) build-out (executable make uat-probe, three journey streams, performance bands, cross-surface tripwires, FCC-native Playwright + qwen3-vl vision-diff). FCC's own service ports are still being stood up there.

Therefore:

  • Phase 2 (v1.10.0) performs the initial build-out of the machinery and produces the first manual-UAT hand-off.
  • From v1.10.0 onward, the per-release patch → (run + extend UAT / perf / vision) → fix → manual-UAT hand-off cadence is standing practice after every minor/major.
  • Earlier patches (e.g. v1.9.1) are scoped hardening patches that do not yet run the full validation loop, because there is nothing to run until Phase 2 builds it.

See ROADMAP.md for the phased plan.