Observed behavior supplied by the trident-de-ds-app investigation. These statements describe the current product and known implementation gaps.
Executive recommendation
deprecationDate.
Legend
The proposed end-state contract. These choices require PM agreement and, where noted, backend contract support.
Implementation contract
releaseStage
Authoritative lifecycle state. The UI must not derive GA, EOSA, or EOS from a date.
deprecationDate
Display-only lifecycle context. Validate it as a calendar date, interpret the boundary in UTC, and localize it for display.
allowedRuntimeVersionOptions
Authoritative selectability. It governs which runtimes are valid for a new selection.
defaultSparkRuntimeVersion
A default, not a recommendation. It must not be presented automatically as the migration target.
Verified current behavior Current surfaces
- The current Workspace dropdown warns for EOSA but has no lifecycle MessageBar.
- Environment supports EOSA and EOS icons.
- Monitoring currently omits EOSA when the date is missing.
These are evidence about the current implementation, not the proposed end state.
Final lifecycle scenario matrix
Recommended PM decision Apply these rules to the effective runtime and to selector options where stated.
| Scenario | Decision inputs | New-selection behavior | Workspace UI treatment | Recommended MessageBar copy | Actions/dismissal |
|---|---|---|---|---|---|
ExperimentalPublicPreview |
Stage plus presence in allowedRuntimeVersionOptions. |
Selectable only if allowed. | Dropdown label: Experimental. No lifecycle MessageBar. | None. | None. |
PublicPreview |
Stage plus presence in allowedRuntimeVersionOptions. |
Selectable if allowed. | Dropdown label: Public Preview. No lifecycle MessageBar. | None. | None. |
| GA without date | releaseStage = GA; no valid date. |
Selectable if allowed. | No lifecycle MessageBar. | None. | None. |
GA with deprecationDate |
releaseStage = GA; date may be valid. |
Selectable if allowed. | No lifecycle MessageBar. Stage is authoritative; a date alone must never imply EOSA or EOS. | None. | None. |
| EOSA with valid future date | releaseStage = EOSA; valid future calendar date. |
Selectable only if allowed. | Warning icon for the affected option/current selection. Persistent Warning MessageBar. | Fabric Runtime {version} will reach end of support on {date}. Switch to a supported Fabric Runtime to reduce security and reliability risks. | Change runtime and Learn more; not dismissible. |
| EOSA with missing/invalid date | releaseStage = EOSA; absent or invalid calendar date. |
Selectable only if allowed. | Same warning icon and persistent Warning MessageBar. | Fabric Runtime {version} will reach end of support. Switch to a supported Fabric Runtime to reduce security and reliability risks. | Change runtime and Learn more; not dismissible. |
| EOSA where announced date has passed | releaseStage = EOSA; valid date is on or before the current UTC date. |
Do not infer EOS or block from the date alone; follow allowed options. | Keep persistent Warning. Emit sanitized contract-anomaly telemetry. Wait for backend stage to advance to EOS. | Fabric Runtime {version} has reached its announced end-of-support date. Switch to a supported Fabric Runtime. | Change runtime and Learn more; not dismissible. |
EOS |
releaseStage = EOS plus allowed options. |
Exclude or disable according to allowedRuntimeVersionOptions. Preserve display for a workspace already pinned to it. |
Persistent Error MessageBar for the effective runtime. | Fabric Runtime {version} is no longer supported in Fabric. New sessions and jobs may fail. Switch to a supported Fabric Runtime to continue running workloads. | Change runtime and Learn more; not dismissible. |
releaseStage = null |
Runtime metadata exists but has no stage. | Hidden and invalid for new execution. | If a legacy workspace still resolves to it, show persistent Error. | Fabric Runtime {version} isn't available. Choose a supported runtime. | Change runtime; not dismissible. |
Current runtime absent from sparkRuntimeVersionMap |
Persisted effective value cannot be resolved in the runtime map. | Preserve the value; do not guess GA. | Persistent Warning. | We couldn't determine the support status for Fabric Runtime {version}. Refresh or choose another runtime. | Refresh and Change runtime; not dismissible. |
| Constraints API failure or invalid schema | Request failure or contract validation failure. | Preserve the current setting. Do not create a GA-shaped fallback. | Persistent Warning. | We couldn't load runtime support information. Refresh and try again. | Refresh; not dismissible. |
Python PR #2285527 reuse matrix
The Python implementation offers useful UX patterns, but its date-based block-new state does not match the Spark contract.
| Python lifecycle pattern | Spark decision | Rationale |
|---|---|---|
| Backend-driven and version-independent | Reuse | Lifecycle policy should not be hard-coded to a particular runtime version. |
| Warning icon only when selected value is affected | Reuse | A lifecycle state on an unselected option must not create a workspace-level warning. |
| Keep all backend-supported alternatives selectable | Reuse | The backend constraints contract remains the source of truth for valid choices. |
| Hide blocked choices while preserving legacy metadata/value | Reuse for EOS | New selection and display of an existing persisted value are different concerns. |
| Missing/invalid date still gets a date-free warning | Reuse | EOSA remains actionable even when display metadata is incomplete. |
Python EOSA_BLOCKNEW / date-based blocking | Do not copy | Spark has no EOSA_BLOCKNEW; the lifecycle Wiki defines the date as UX-only. |
| Auto-computing "latest version" or "X and lower" | Do not copy | 1.3acc and release channels are not safely ordered by simple semantic version rules. |
Migration recommendation strategy
Recommended PM decision Keep guidance generic until the backend provides an explicit campaign target.
- Do not always use
defaultSparkRuntimeVersionas the migration target; a default is not necessarily the campaign recommendation. - With the current API, say a supported Fabric Runtime and open the full selector.
- If PM wants copy such as Switch to Runtime 2.0, the backend should expose
recommendedSparkRuntimeVersionor lifecycle campaign metadata. - Show a concrete target only when it is present in the map, allowed, GA, and different from the current runtime.
- Never use the frontend fallback to
1.1for lifecycle guidance.
Display placement and priority
| Concern | Recommended rule |
|---|---|
| Placement | Place the lifecycle MessageBar above the Workspace Spark Settings Runtime section. |
| Effective runtime | Use the workspace runtime for standard settings; use the published Environment runtime when a custom Environment is selected. |
| Single-bar priority | At most one lifecycle/campaign bar: EOS/unavailable > EOSA > lifecycle-data error > adoption campaign. |
| Runtime 2.0 campaign | Suppress the Runtime 2.0 adoption campaign while EOS or EOSA is active. |
| Preview states | Preview is a selector label, not a lifecycle MessageBar. |
| Dismissal | Lifecycle bars are persistent. An adoption campaign can be dismissible. |
Current sample outcome
This table applies the recommended policy to the supplied sample runtime metadata. It does not introduce additional implementation facts.
| Runtime | Supplied state | Workspace outcome |
|---|---|---|
| 1.0 / 1.1 / 1.2 | EOS | Persistent Error only when the runtime is currently effective/selected; do not show lifecycle bars merely because EOS options exist. |
| 1.3 | GA and current default | No lifecycle bar even with deprecationDate. A separate Runtime 2.0 adoption Info banner may appear. |
| 1.3acc | GA | No lifecycle bar. The existing adoption campaign may match base version 1.3. |
| 2.0 | GA | No lifecycle bar. |
PM decision table
| Decision | Recommendation |
|---|---|
| Should EOSA/EOS be dismissible? | No. Lifecycle risk remains until the effective runtime changes or backend state changes. |
| Should GA plus a date warn? | No. releaseStage is authoritative. |
| Do we need an intermediate block-new state? | Add explicit backend EOSA_BLOCKNEW or isSelectable; never infer it from a date. |
| Should we show a concrete migration target? | Use generic guidance now; use a backend-provided target if PM requires one. |
| Should the Runtime 2.0 campaign appear alongside a lifecycle bar? | No. Show at most one bar using the defined priority. |
| What severity should each state use? | EOS: Error; EOSA: Warning; data retrieval/status anomaly: Warning; campaign: Info. |
References
- PR 2285527: Python lifecycle notification pattern
- PR 1639576: Spark runtime lifecycle implementation context
- Fabric Runtime lifecycle Wiki
- Work item 5559025
- Work item 5486806
Evidence boundary: Current implementation facts on this page are limited to the verified behaviors supplied by the investigation. All other lifecycle handling is explicitly presented as a recommendation for PM decision.