12 KiB
Release Checklist
Owner: Release Committee
Applies to: kell_web (Flutter Web / Windows Desktop) and kell_mobile (Flutter Android)
Last reviewed: 2026-08-29
Review cycle: Every release; document reviewed at least quarterly
Purpose
This document defines the mandatory gates a build must pass before it is promoted into each target environment. Each environment inherits every gate from the environment before it, then adds its own.
Promotion is sequential: Development → Test/QA → Staging → Production. A build may not skip an environment.
1. Environment Matrix
| Environment | Target | KC_ENV |
Square mode | Data | Audience | Approver |
|---|---|---|---|---|---|---|
| Development | Local workstation | fake |
n/a | In-memory fakes | Engineer | Self |
| Test / QA | CI runner + internal test devices | wordpress |
n/a | WooCommerce staging | Engineer + QA | Engineering lead |
| Staging | Pre-production host + test device | multi |
sandbox |
Staging WC + Square SBX | QA + business | Release committee |
| Production | Live web host + Play Store track | wordpress / multi |
production |
Live WC + Square live | Operators | Release committee |
Rule:
KC_SQUARE_ENVIRONMENT=productionis permitted only in the Production environment. Any lower environment using a live Square token is an immediate stop-ship defect.
2. Universal Gates (all environments)
These must pass before any promotion.
dart analyze --fatal-infosis clean for all 11 packages and both apps- Full test suite passes — current baseline 1,475 / 1,475
- No test is skipped,
@Skip-ed, or commented out without a linked issue docs/development/build_execution_tracker.mdhas a slice entry for the changedocs/development/master_development_brief.mdreflects the new baseline- No secrets committed — credentials supplied only via
--dart-define - No
TODO/FIXMEintroduced without a linked tracker item
Commands:
cd kell_creations_apps
./tools/run_all_tests.sh --analyze
3. Development Environment
Purpose: Fast inner-loop work against in-memory fakes. No external calls.
Build
flutter run -d chrome --dart-define=KC_ENV=fake # kell_web
flutter run -d android --dart-define=KC_ENV=fake # kell_mobile
Gates
- Universal gates pass
- Feature branch is cut from current
main - Slice is vertical and reviewable (domain → application → data → presentation)
- New public APIs carry doc comments
- Environment badge renders
FAKE - "Report a problem" action opens the dialog and submits successfully
- No unexpected
ERROR/FATALrecords in the console during a smoke pass
Exit criteria
Analyze clean, tests green, tracker updated. Open PR into main.
4. Test / QA Environment
Purpose: Validate real WooCommerce integration and cross-platform parity.
Build
flutter build web --dart-define=KC_ENV=wordpress \
--dart-define=KC_WC_SITE_URL=https://staging.kellcreations.com \
--dart-define=KC_WC_CONSUMER_KEY=ck_xxx \
--dart-define=KC_WC_CONSUMER_SECRET=cs_xxx
flutter build apk --debug --dart-define=KC_ENV=wordpress \
--dart-define=KC_WC_SITE_URL=https://staging.kellcreations.com \
--dart-define=KC_WC_CONSUMER_KEY=ck_xxx \
--dart-define=KC_WC_CONSUMER_SECRET=cs_xxx
Gates
- All Development gates pass
- Forgejo
Flutter Testworkflow green - Forgejo
Flutter Analyzeworkflow green - Coverage reported in the CI summary; no unexplained decrease
- Credentials point at staging WooCommerce — never production
- Environment badge renders
WP - Missing-credential path verified: app falls back to
FAKEand logs a warning
Functional verification (WooCommerce)
- Product list loads, filters, searches, and sorts
- Single-field edits persist (name, price, description, category)
- Status transitions behave (
unpublished→draft,pendingReview→published) - Product creation completes on web (
CreateProductDialog) and mobile (MobileCreateProductPage) - Category CRUD works
- Bulk actions (move-to-draft, publish, submit-for-review) work
- API failures surface a user-visible error — never a silent failure
Observability verification
- Startup record written with the effective environment
- A forced API failure produces an
ERRORrecord with source and context - Bug report submission attaches the recent log tail
- Credential redaction confirmed — no token, key, or secret appears in any log or report
Mobile-specific
- Touch targets meet the 48×48dp minimum
- Haptics fire (
mediumImpactstate changes,lightImpactfield edits) - Layout is correct on a notch/gesture-bar device
- Back navigation behaves throughout
Exit criteria
CI green, functional pass recorded, no open Critical or High defects.
5. Staging Environment
Purpose: Production rehearsal with both channels live in sandbox mode.
Build
flutter build web --release --dart-define=KC_ENV=multi \
--dart-define=KC_WC_SITE_URL=https://staging.kellcreations.com \
--dart-define=KC_WC_CONSUMER_KEY=ck_xxx \
--dart-define=KC_WC_CONSUMER_SECRET=cs_xxx \
--dart-define=KC_SQUARE_ACCESS_TOKEN=EAAAl_sandbox_xxx \
--dart-define=KC_SQUARE_LOCATION_ID=L_xxx \
--dart-define=KC_SQUARE_ENVIRONMENT=sandbox
The Android build uses the same defines with flutter build apk --release.
Gates
- All Test/QA gates pass
- Built in release mode (not debug/profile)
KC_SQUARE_ENVIRONMENT=sandbox— confirmed, notproduction- Square token is a sandbox token
- Environment badge renders
MULTI - Incomplete-credential path falls back to
FAKEwith a logged warning
Multi-channel verification
- Square catalog sync completes;
SquareSyncStatusPanelreports the result ProductIdMappingrecords are created correctly — no duplicate listings- Already-synced products reuse their existing mapping (ID conflation regression check)
- Square inventory counts load and reconcile
- Partial sync failure surfaces per-item
SyncErrordetail - Integrations page reflects live sync state on web and mobile
Mobile POS verification (sandbox)
- Product selection → cart → payment flow completes
- Cash payment records correctly
- Card payment completes against Square sandbox
- Receipt renders with the correct total
- Payment failure is handled without data loss
Non-functional
- Release build starts within an acceptable time on a representative device
- No memory growth across an extended session
- Web build loads over the target network profile
- Offline/interrupted-network behaviour is understood and documented
Known limitation: Offline caching and the sales queue (Stage 14) are not implemented. Network loss during a market sale is currently unrecoverable. This must be stated in release notes for any field use.
Exit criteria
Business sign-off recorded, no open Critical/High defects, rollback plan agreed.
6. Production Environment
Purpose: Live operator use against real customers and real money.
Pre-flight
- All Staging gates pass
- Release committee approval recorded
- Release notes drafted, including known limitations
- Rollback plan documented and the previous artifact retained
- Version bumped in both
pubspec.yamlfiles AppServices.appVersionandMobileAppServices.appVersionmatchpubspec.yaml- Release tagged in Git
Credential and safety gates
- Production WooCommerce credentials sourced from the secret store — not the repo
KC_SQUARE_ENVIRONMENT=productionset deliberately- Square production token scoped to the minimum required permissions
- Square location ID matches the intended physical location
- A staging credential is confirmed absent from the production build
- Credential redaction verified once more in the production artifact
Build
flutter build web --release --dart-define=KC_ENV=multi \
--dart-define=KC_WC_SITE_URL=https://store.kellcreations.com \
--dart-define=KC_WC_CONSUMER_KEY=$WC_KEY \
--dart-define=KC_WC_CONSUMER_SECRET=$WC_SECRET \
--dart-define=KC_SQUARE_ACCESS_TOKEN=$SQUARE_TOKEN \
--dart-define=KC_SQUARE_LOCATION_ID=$SQUARE_LOCATION \
--dart-define=KC_SQUARE_ENVIRONMENT=production
The Android release build uses the same defines with flutter build appbundle --release.
Post-deployment verification
- App loads and the environment badge is correct
- A read-only operation succeeds (product list loads)
- A single low-risk write succeeds and is confirmed in WooCommerce admin
- Square sync runs once and mappings are correct
- One low-value real transaction processed end-to-end and reconciled in Square
- Bug reporting works from the production build
- No
ERROR/FATALrecords during the verification pass
Monitoring window
- Observed for the first operating session
- Bug report queue reviewed before sign-off
- Operators briefed on "Report a problem" and known limitations
Rollback triggers
Roll back immediately on any of:
- Incorrect pricing, inventory, or payment amounts
- Duplicate product listings from a sync defect
- Failed or double-charged payments
- Credential leakage in any log or report
- Any Critical defect without a workaround
7. Release Sign-Off Record
| Field | Value |
|---|---|
| Release version | |
| Git tag / commit | |
| Target environment | |
| Test result | __ / 1475 passing |
| Analyze result | |
| Known limitations | |
| Approver | |
| Date |
8. Open Release Blockers
Carried from PROJECT_STATE_AUDIT.md. Each must be closed or explicitly accepted
as a documented limitation before the affected environment is used in earnest.
| ID | Item | Blocks |
|---|---|---|
| P2.5 | WooCommerceOrdersRepository not wired into AppServices |
Test/QA orders workflow |
| P2.6 | WooCommerceInventoryRepository not wired into AppServices |
Test/QA inventory workflow |
| P2.8 | Offline cache and sales queue not implemented (Stage 14) | Production field use |
| P3.2 | SecureCredentialStore not implemented |
Production |
| P3.3 | Auth guard not wired into either shell | Production |
| P3.1 | RetryPolicy / RateLimiter not wired into API clients |
Staging, Production |
| P3.6 | feature_policy has only a smoke test |
Test/QA |
| P2.10 | Policy register CSVs contain headers only | Governance compliance |
Committee position: With Stage 16A complete, the platform now has error logging and bug reporting. It is approved for Development and Test/QA. Staging is conditionally approved pending P3.1. Production is not approved until P3.2, P3.3, and P2.8 are closed — the platform currently has no authentication guard, no secure credential storage, and no offline resilience for in-person sales.