Sprint Plan (6 × 2-week sprints)
Each sprint delivers a shippable increment. Infrastructure-first: Fabric and state machine before any user-facing agent.
Weeks 1–4
- Provision Microsoft Fabric capacity (F8 for dev, F32 for staging)
- Create three Fabric workspaces: Dev, Staging, Prod
- Define OneLake folder structure: Bronze / Silver / Gold layers with naming convention
- Set up Fabric Eventstream: create CLProcess-events stream with schema definition
- Configure Entra ID groups for Fabric RBAC (Admin, Contributor, Viewer per workspace)
- Seed OneLake Gold with Phase 0 modular content inventory and claims register export
- Write infrastructure-as-code (Bicep templates) for all Azure resources
Weeks 5–8
- Build Brief Intelligence Agent in Copilot Studio — Teams channel deployment
- Agent collects: objective, product, indication, channel, market, deadline, reference files
- Agent validates completeness, posts structured brief JSON to Fabric lakehouse via Power Automate
- Build Logic Apps Event Router: subscribe to Fabric Eventstream, define routing rules per state
- Wire Jira integration: create task on state 1 (Brief Submitted), update on each subsequent state
- Teams Adaptive Card notifications on each state transition (assigned reviewer + due date)
- Test full loop: submit brief via agent → state 1 event → Jira task → Teams notification
Weeks 9–12
- Build Fabric semantic model on OneLake Silver layer (state transition events)
- Create Power BI cycle time dashboard: avg days per state, active items by state, SLA breach alerts
- User Acceptance Testing with 3 real content items: brief submission → Brand Review state
- Document all bugs and fix within sprint. No Phase 2 start until 0 P1 bugs remain.
- Train content ops team on brief agent, Jira workflow, and Teams notifications (1-hour session)
- Handover runbook for Fabric Admins: capacity scaling, workspace management, Eventstream monitoring
What Gets Built
- Delta Lake format for all OneLake tables — time-travel queries for audit
- Fabric Data Pipeline runs nightly: Bronze → Silver transformation with deduplication
- Silver → Gold promoted only on Approved Master state event
Both paths produce an identical BriefPayload JSON written to OneLake Bronze and fire the same content_lifecycle.state_changed{toState:"brief_submitted"} Eventstream event. Downstream systems (Event Router, Logic Apps, Power BI) are unaware of which path was used.
- Trigger: @ContentBrief mention in any Teams channel, or Personal App tab
- Step 1 — Campaign name + objective: free-text. Agent paraphrases back for confirmation.
- Step 2 — Content type: quick-reply buttons (HCP Detail Aid / Email / Press Release / CLM / Social)
- Step 3 — Product / indication: adaptive card dropdown populated from OneLake Gold product table (refreshed nightly from SAP)
- Step 4 — Channel scope: multi-select checkboxes (Web, Email, Field Sales, Social, Print)
- Step 5 — Market scope: multi-select from configured market list. Agent shows estimated localisation SLA based on market count.
- Step 6 — Requested live date: date picker. Enforces minimum T+24 working days. Shows warning if date conflicts with known market freeze periods.
- Step 7 — Reference materials: optional file upload (→ SharePoint via Graph API) or URL. Agent checks URL is reachable.
- Duplicate check: agent calls OneLake embedding search. If similarity >80% to existing item — shows card "Similar content exists: [title]. Create derivative instead?" with two buttons.
- Confirmation: full brief summary card. Submitter clicks "Submit Brief" → Power Automate writes JSON to OneLake Bronze → Eventstream event fired → agent replies with ContentItemId and Jira Epic link.
- Project: CLPx (Content Lifecycle Process). Type: Business project or Software project — either works.
- Issue type "Content Brief" — custom issue type, separate from Story/Task/Bug. Icon: document. Available only in this project.
- Required fields (validation enforced by webhook handler):
- Summary →
campaignName - Description →
objective(min 30 chars) - Custom field "Product" (single-select, options synced from OneLake nightly via Jira API)
- Custom field "Indication" (single-select)
- Custom field "Content Type" (single-select: HCP Detail Aid / Email / Press Release / CLM / Social)
- Custom field "Channel Scope" (multi-select checkboxes)
- Custom field "Market Scope" (multi-select, all configured markets)
- Custom field "Requested Live Date" (date picker)
- Summary →
- Optional fields: "Parent Content Item" (text — enter existing ContentItemId to create derivative), "Reference URLs" (URL field, multi-value), Attachments (Jira native)
- Jira screen scheme: separate Create / Edit / View screens for Content Brief — only relevant fields shown. No sprint, story points, or dev-focused fields visible to content requesters.
- Draft → requester fills fields, can save and return. Not yet submitted to lifecycle.
- Ready for Submission → requester clicks "Submit". Webhook fires. Azure Function validates and writes to OneLake.
- In Lifecycle → ContentItemId assigned. Issue becomes a read-only audit record — all state transitions now driven by the lifecycle system, not Jira-native transitions.
- Completed / Archived → set by Logic Apps Event Router on state 8 (Live) or archive event.
- Jira automation rule: if issue stays in "Draft" for >5 days → remind reporter via Jira notification.
- PM creates a "Content Brief" Jira issue linked to an existing sprint Epic via "relates to"
- Fills "Parent Content Item" field with ContentItemId of the approved master (e.g.
clp-2026-01-007) - Azure Function detects
isDerivative=true→ pre-fills brief with parent content metadata from OneLake Gold - Derivative skips authoring (state 2) if content type is "localisation only" — jumps directly to state 7 (Localisation)
- All Jira sprint planning, story point estimation, and roadmap tracking stays in Jira — lifecycle system only picks up the brief data it needs
- Trigger: HTTP request from Copilot Studio on brief confirmation
- Action 1: POST brief JSON to OneLake Bronze via Fabric REST API (same endpoint as Jira Azure Function)
- Action 2: Publish state-1 Eventstream event with intakeSource: "teams_agent"
- Action 3: Return ContentItemId + Jira Epic deep-link to Copilot Studio for confirmation card display
- Trigger: Eventstream event consumer (Fabric Eventstream → Event Hub → Logic Apps)
- Switch on toState field: each state has its own branch
- State 1 (Brief Submitted): create Jira ticket, post Teams card to content-ops channel, assign writer
- State 2 (In Authoring): update Jira status, notify assigned writer with brief link
- State 3 (Claims Check): trigger Claims Validation Azure Function (Phase 2); in Phase 1 — skip, auto-advance
- State 4 (Brand Review): create Jira review task for Brand Owner, Teams notification with document link
- State 5 (MLR Review): create three parallel Jira tasks (Medical/Legal/Regulatory); Teams notification; Phase 2 adds Veeva sync
- State 6 (Approved Master): update Jira epic to Done, notify Content Owner, trigger Gold-layer write in Fabric pipeline
- State 7 (Localisation): create Jira tasks per market, Teams notification to local market managers
- State 8 (Live): close all Jira tasks, Teams celebration card, trigger Power BI refresh
- SLA watchdog: scheduled Logic App runs every 4 hours, checks Silver layer for items exceeding state SLA, fires Teams escalation notification
- Project type: Scrum. Board: Content Lifecycle Operations.
- Epic = content item. Custom field: ContentItemId (mapped to OneLake ID)
- Issue type hierarchy: Epic → Story (per state) → Sub-task (per reviewer in parallel states)
- Custom workflow: mirrors 8 lifecycle states. No Jira-native transitions — all state changes driven by Logic Apps.
- Automation rule: when all sub-tasks in state 5 (MLR) are Done → auto-transition Epic story to Approved Master
- Label taxonomy: market, indication, channel, content-type
- SLA: Jira Service Management SLAs configured per state (mirroring lifecycle SLAs)
- Semantic model: DirectLake mode (reads Silver layer without import) — near-real-time refresh
- Page 1 — Active Pipeline: all items by current state, days in current state, SLA RAG status
- Page 2 — Cycle Time Analysis: avg total days, avg per state, P50/P90 distribution, trend over time
- Page 3 — Volume & Throughput: items submitted per week, items approved per week, revision cycle count
- Row-level security: Content Ops sees all; Local Market managers see only their market's items
- Alerts: Power BI Data Alerts on "Items breaching SLA" measure — Teams notification to Content Ops Lead
Service Pricing & Recommended Tiers
| SKU | Compute Units | Price / month | Use Case |
|---|---|---|---|
| F2 | 2 CU | $263 | Proof-of-concept only — limited concurrency |
| F4 | 4 CU | $526 | Development workspace |
| F8 Phase 1 Dev | 8 CU | $1,052 | Single team, Eventstream + Pipelines |
| F32 Phase 1 Staging | 32 CU | $4,208 | Staging environment with parallel workloads |
| F64 | 64 CU | $8,415 | Production (Phase 2–3) |
| Plan | Includes | Price | Recommendation |
|---|---|---|---|
| M365 E3/E5 included Use this | Copilot Studio for Teams bots, Power Automate per-user | Included with E3 ($36/user/mo) or E5 ($57/user/mo) | If org is on M365 E3+ — no additional cost for the Brief Agent |
| Copilot Studio standalone | 25,000 messages/month per tenant | $200 / tenant / month | Only if org does not have M365 E3/E5 |
| Pay-per-use overage | Per message beyond included quota | $0.01 / message | Monitor usage; ~10,000 messages/month expected in Phase 1 |
| Plan | Billing | Estimated Phase 1 cost | Notes |
|---|---|---|---|
| Consumption | $0.000025 / action + $0.08 / 1K connector calls | ~$20 – $80 / month | Good for low volume. Cold start latency. |
| Standard (WS1) Recommended | $190 / month (1 vCPU, 3.5 GB RAM) | ~$190 / month fixed | Stateful workflows, better SLA, no cold starts. Scales up to WS2/WS3 in Phase 2–3. |
| Plan | Price | Key features | Recommendation |
|---|---|---|---|
| Free | $0 (up to 10 users) | Basic boards, backlog | Too limited — no SLAs, no automation rules |
| Standard Recommended | $7.75 / user / month | Audit log, SLAs, project roles, 250GB storage | Sufficient for Phase 1. Upgrade to Premium if advanced roadmaps needed. |
| Premium | $15.25 / user / month | Advanced roadmaps, sandbox, unlimited storage | Consider for Phase 2 when volume increases |
| License | Price | Included in Fabric? | Notes |
|---|---|---|---|
| Power BI Pro | $10 / user / month | No (separate) | Required for sharing reports with other users. Report creators and consumers both need Pro. |
| Power BI Premium Per User (PPU) Recommended | $20 / user / month | Included with Fabric capacity for workspace users | If Fabric F-SKU is purchased: all workspace users can access Power BI without separate Pro license. Best value. |
Roles & Permissions
Principle of least privilege. Each role has the minimum permissions required for its function. All roles managed via Entra ID security groups — no direct user assignments.
Logic Apps and Power Automate flows authenticate to Fabric/OneLake via a dedicated Service Principal (app registration in Entra ID). This SP has: Fabric Contributor on the workspace, OneLake Data Owner on Bronze path only. Never use a human user account for automation — it breaks when the person leaves. SP credentials stored in Azure Key Vault, referenced by Logic Apps managed identity.
Departments & Engagement Model
Monthly Cost Estimate
Fabric capacity can be paused outside business hours via the Fabric Admin Portal — reduces Dev environment cost by ~65%. Set a daily schedule: pause at 19:00, resume at 08:00. F8 dev cost drops to ~$370/month with overnight pausing. Staging environment may only need to run during sprint test periods.
Exit Criteria — Gate to Phase 2
All 8 state transition events flow correctly from Bronze to Silver. Schema validated, no dropped events over 1-week observation period.
At least 10 real briefs submitted via the agent by content team (not engineers). Agent creates OneLake record and fires Eventstream event on each submission.
Logic Apps routes all 8 state transitions correctly. Jira task created on state 1, all Jira updates accurate. No manual workarounds required.
Content Ops Lead reviews the dashboard weekly. SLA breach alert has fired at least once and escalation notification was received by correct person.
3 real content items walked through states 1–6 using the new system. No Priority 1 bugs (data loss, incorrect routing, broken audit trail).