Overview
Governance covers four time horizons: the release lifecycle (how each version of the application is planned, built, and deployed), the OS support policy (which platform versions the application targets), the technical debt management process (how architectural decisions are reviewed and revised), and the dependency evolution policy (how third-party libraries are kept current).
Release Lifecycle
Versioning: semantic versioning (MAJOR.MINOR.PATCH) for the user-visible version string. Major: breaking changes to data formats or app behaviour. Minor: new features. Patch: bug fixes. Build number: monotonically increasing integer managed by CI (the CI run number). The App Store and Play Store use the build number for ordering — it must never decrease.
Release cadence: feature releases every 2-4 weeks (bi-weekly sprints align to bi-weekly releases). Hotfix releases as needed for P1/P2 production issues, targeting 4-8 hours from diagnosis to App Store submission. Hotfix process: create a hotfix branch from the release tag, apply the minimal fix, submit for expedited App Store review with documented user-impact justification.
OS Version Support Policy
Support policy must be explicit and communicated to clients before project launch. The Ascendion default:
Android: support the last 5 major Android versions (currently Android 10-15), covering >95% of active Android devices as reported by Google Play Console. Minimum SDK version set accordingly. APIs introduced after the minimum SDK version use conditional availability checks (Build.VERSION.SDK_INT >= Build.VERSION_CODES.X).
iOS: support the current and previous two major iOS versions (currently iOS 16-18), covering >95% of active iOS devices as reported by App Store analytics. APIs introduced in newer iOS versions use #available(iOS 17, *) conditional availability.
OS support policy review: annually, after each major OS release (September-October). Dropping a platform version is a minor version increment — it removes user-visible capability (the ability to update the app on older OS versions).
Technical Debt Management
Technical debt register maintained per project. Each debt item: description, affected layers, estimated remediation effort, business risk if unaddressed, severity (P1-P4). Reviewed in architecture retrospectives: monthly for active projects, quarterly for maintenance-mode projects.
Debt reduction policy: minimum 20% of sprint capacity allocated to technical debt reduction when the register exceeds 10 P2+ items. Debt reduction work is treated as equivalent to feature development — estimated, tracked, and celebrated as delivery.
Architecture fitness functions: automated tests in CI that verify architectural invariants. Example: a fitness function that fails the build if any Use Case class imports an Android SDK class. These catch architectural drift before it accumulates into structural debt.
Anti-Patterns to Avoid
⚠ 1. No OS Deprecation Planning
Supporting Android 6 (API 23) because "some users still have old devices" while GoogleAPIs and security libraries have dropped support. Engineering effort spent working around deprecated APIs and missing security features.
Hover to see the fix ↻
↺ Correct Approach
Explicit OS support policy agreed with the client at project inception. Annual review with data from Google Play Console and App Store analytics. OS version drops planned 6 months in advance with user communication.
⚠ 2. Technical Debt Register Ignored After Creation
A debt register created during an architecture review, never reviewed again. Debt accumulates until it produces a production incident.
Hover to see the fix ↻
↺ Correct Approach
Technical debt reviewed monthly in architecture retrospectives. Debt reduction capacity allocated every sprint proportionally to register severity.
Flowchart
%%{init:{'theme':'base','themeVariables':{'fontSize':'14px','fontFamily':'IBM Plex Sans, system-ui, sans-serif','primaryColor':'#DBEAFE','primaryTextColor':'#1e3a5f','primaryBorderColor':'#2563EB','lineColor':'#374151','clusterBkg':'#F9FAFB','clusterBorder':'#D1D5DB','edgeLabelBackground':'#FFFFFF'},'flowchart':{'curve':'orthogonal','padding':30,'nodeSpacing':65,'rankSpacing':75,'useMaxWidth':true}}}%%
flowchart TD
subgraph Release["📦 Release Lifecycle"]
SV["Semantic Versioning
MAJOR.MINOR.PATCH"]
CAD["Release Cadence
Feature: bi-weekly
Hotfix: < 8 hours"]
VER["Version Policy
Build number from CI
Never decreases"]
end
subgraph OS["📱 OS Support Policy"]
AND4["Android
Last 5 major versions
> 95% active devices"]
IOS4["iOS
Current + 2 prior
> 95% active devices"]
REV["Annual Review
Post-OS-release Sept-Oct
6 month notice to drop"]
end
subgraph Debt["🔧 Technical Debt Management"]
REG["Debt Register
P1–P4 severity
Effort + Business risk"]
CAP["Sprint Capacity
20% to debt when
> 10 P2+ items"]
AFF2["Fitness Functions
CI architecture tests
Prevent drift accumulation"]
end
Release --> OS --> Debt
style Release fill:#E3F2FD,stroke:#1565C0
style OS fill:#E8F5E9,stroke:#1B5E20
style Debt fill:#FFF3E0,stroke:#E65100
References
- Fowler, Martin — Technical Debt Quadrant. martinfowler.com/bliki/TechnicalDebtQuadrant.html
- Ford et al. — Building Evolutionary Architectures. O'Reilly, 2017.
- Semantic Versioning. semver.org
- Google — Play Console — Distribution Dashboard. play.google.com/console
Mobile Engineering Reference
← Mobile Development