Spaces:
Running
Running
| """Initiatives & Scenarios tab — accordion per phase → initiative → workstreams/scenarios/delivery standards.""" | |
| import streamlit as st | |
| from frontend.utils.terminology import label, ac_badge, domain_label, subdomain_label | |
| def render_epics_tab(result: dict) -> None: | |
| phases = result.get("phases") or [] | |
| if not phases: | |
| st.info("No strategic initiatives generated yet.") | |
| return | |
| for phase in phases: | |
| phase_num = phase.get("phase_number", 1) | |
| phase_name = phase.get("phase_name", f"Phase {phase_num}") | |
| epics = phase.get("epics") or [] | |
| with st.expander( | |
| f"Phase {phase_num}: {phase_name} — {len(epics)} {label('epics')}", | |
| expanded=(phase_num == 1), | |
| ): | |
| if phase.get("objectives"): | |
| st.markdown("**Phase Objectives:**") | |
| for obj in phase["objectives"]: | |
| st.markdown(f"- {obj}") | |
| for epic in epics: | |
| st.markdown("---") | |
| title = epic.get("title") or epic.get("epic_id") or label("epic") | |
| subdomain_raw = epic.get("subdomain_group") or "" | |
| cap_area = subdomain_label(subdomain_raw) | |
| st.markdown(f"#### {epic.get('epic_id', 'INI')} — {title}") | |
| if cap_area: | |
| st.caption(f"{label('subdomain')}: {cap_area}") | |
| col1, col2 = st.columns([2, 1]) | |
| with col1: | |
| if epic.get("description"): | |
| st.markdown(epic["description"]) | |
| if epic.get("business_value"): | |
| st.markdown(f"**{label('business_value')}:** {epic['business_value']}") | |
| if epic.get("strategic_rationale"): | |
| st.markdown(f"**{label('strategic_rationale')}:** {epic['strategic_rationale']}") | |
| with col2: | |
| if epic.get("governance_reference"): | |
| st.info(f"**{label('governance_reference')}**\n\n{epic['governance_reference']}") | |
| if epic.get("trend_alignment"): | |
| st.success(f"**{label('trend_alignment')}**\n\n{epic['trend_alignment']}") | |
| st.metric("Delivery Sprints", epic.get("estimated_sprints", "—")) | |
| # Delivery Standards (Acceptance Criteria) | |
| acs = epic.get("acceptance_criteria") or [] | |
| if acs: | |
| compliance_count = sum(1 for ac in acs if ac.startswith("[Compliance]")) | |
| kpi_count = sum(1 for ac in acs if ac.startswith("[KPI]")) | |
| badge_line = f"{label('acceptance_criteria')} ({len(acs)})" | |
| if compliance_count: | |
| badge_line += f" · 🔒 {compliance_count} Regulatory Obligations" | |
| if kpi_count: | |
| badge_line += f" · 📊 {kpi_count} Performance Targets" | |
| with st.expander(badge_line, expanded=False): | |
| for ac in acs: | |
| st.checkbox( | |
| ac_badge(ac), | |
| value=False, | |
| key=f"ac_{epic.get('epic_id', '')}_{ac[:20]}", | |
| ) | |
| # Risk Landscape | |
| risks = epic.get("risk_register") or [] | |
| if risks: | |
| with st.expander(f"{label('risk_register')} ({len(risks)})", expanded=False): | |
| for r in risks: | |
| st.warning(r) | |
| # Workstreams (Features) | |
| features = epic.get("features") or [] | |
| if features: | |
| with st.expander(f"{label('features')} ({len(features)})", expanded=False): | |
| for feat in features: | |
| st.markdown(f"**{feat.get('title', '')}**") | |
| if feat.get("description"): | |
| st.caption(feat["description"]) | |
| if feat.get("technical_notes"): | |
| st.info(f"Technical Notes: {feat['technical_notes']}") | |
| for story in (feat.get("user_stories") or []): | |
| role = story.get("role") or story.get("as_a") or "User" | |
| want = story.get("want") or story.get("i_want") or "" | |
| so_that = story.get("so_that") or "" | |
| st.markdown( | |
| f"> **{label('user_story')}** — " | |
| f"As a **{role}**, I want **{want}**, " | |
| f"so that **{so_that}**" | |
| ) | |
| story_acs = story.get("acceptance_criteria") or [] | |
| for sac in story_acs: | |
| st.markdown(f" - {ac_badge(sac)}") | |
| tasks = story.get("tasks") or [] | |
| if tasks: | |
| with st.expander(f"Delivery Tasks ({len(tasks)})", expanded=False): | |
| for ti, task in enumerate(tasks): | |
| if isinstance(task, dict): | |
| task_title = task.get("title") or task.get("name") or f"Task {ti+1}" | |
| task_desc = task.get("description") or "" | |
| task_days = task.get("estimated_days") | |
| task_role = task.get("assignee_role") or "" | |
| cols = st.columns([3, 1, 1]) | |
| with cols[0]: | |
| st.markdown(f"**{task_title}**") | |
| if task_desc: | |
| st.caption(task_desc) | |
| with cols[1]: | |
| if task_days: | |
| st.metric("Days", task_days) | |
| with cols[2]: | |
| if task_role: | |
| st.caption(f"👤 {task_role}") | |
| else: | |
| st.markdown(f"- {task}") | |