Loading...

Engineering

Ticket flow. Reliability. Throughput per developer.
DataOS reads Salesforce Ticket__c + history straight from the source — surfacing cycle time, MTTR, rework, intake wait, and release reliability without any spreadsheets.
Cycle Time (median)
...
days, dev-start → close
MTTR (P1/P2 defects)
...
hours
Throughput / Dev
...
weighted hours · per month
Rework Rate
...
% of tickets reopened
Engineering KPIs Live
Loading KPIs…
Cycle Time Trend Median days, per close month
MTTR Trend P1/P2 defect restore hours
Throughput Trend Weighted hours / active dev
Incident & Inflow P1/P2 incidents vs. tickets created
Ticket Query Live
Loading…
Name Title Department Type Cycle (days) Status Close Month
Loading…
Department Rollups Live
Department Tickets Median Cycle (d) Weighted Hours Unique Assignees Hours / Person Rework %
Loading…
Backlog Snapshot Live
Loading backlog…
Department Open Tickets
Loading…
IT Steering Committee Roadmap Form-based · live
Replaces the ITSC Phased Execution.xlsx workbook. Every row of the canonical "ITSC Plan" sheet maps to one project record. Add a project to create a new row; click any row to open the detail view (with the brief and intake scoring matrix); edit inline from the form.
Loading roadmap…
Projects
Priority Feature Department Status LOE Product Owner IT Lead Launch Target Actions
Loading…
V2 ITSC Strategic Initiative Tracking — Salesforce Implementation Specs

Dual-write integration plan

Supersedes the v1 architecture recommendation. Locks in the Ticket__c + Strategic Initiative record type direction, fills the gaps v1 silently dropped (voter total, four-panel brief, exec sponsor, intake metadata), and defines the dual-write contract between the DataOS /dept/engineering ITSC tab and Salesforce.

1. Overview

The ITSC Phased Execution workbook has already been replaced by a form-based UI at /dept/engineering?tab=itsc, backed by a Firestore collection (itsc_projects) with 50 imported records. This v2 spec moves the system-of-record to Salesforce by extending the existing Ticket__c object with a Strategic Initiative record type, while keeping the DataOS form as the system-of-entry through a deterministic dual-write.

DataOS form ← user types ──► dual-write service ──► Firestore (cache) + Salesforce (SoR)
Reports / Power BI / SF users ← SOQL ──► Salesforce (SoR)

Both sides see the same data. Either side can edit. Conflicts are resolved by LastModifiedDate.

2. Architecture

Use the existing Ticket__c object with a new Strategic Initiative record type. This decision (carried forward from v1) avoids a duplicate object hierarchy, inherits ticket lifecycle / ownership / sharing for free, and keeps reporting in one universe.

Three things that are different in v2:

  • Dual-write contract (§13) — the DataOS form remains the operational UI; the Firestore document is a cache, not the system of record.
  • Three additional brief fields (§4) — the workbook's per-project one-pager has 4 panels, not 1, and v1 only mapped one of them.
  • Total score + executive sponsor + intake metadata (§4) — preserves the upstream nomination/scoring artifacts the steering committee uses.

3. Record Type Configuration

New Record Type: Strategic Initiative

Represents strategic roadmap initiatives, cross-functional programs, and operational improvement efforts. Does not replace standard development / Salesforce-ops tickets, bug tracking, or support workflows — those keep their existing record types.

  • Profile assignment: Initial access to Engineering Leadership, IT, and Strategy users; broader once the workflow is validated.
  • Page layout: see §7.
  • Default record-type behavior: new Ticket created from /dept/engineering always carries this record type ID.

4. Field Additions on Ticket__c

20 new fields. Bold = additions beyond the v1 spec. Italic = clarifications.

4a. Strategic context

Field LabelAPI NameTypeNotes
Strategic GroupStrategic_Group__cPicklistRetention & Intelligence · Demand Gen & Efficiency · Cross-Functional · Operational AI Layer · Operational Excellence · Operational Reliability · AI & Engagement · AI & Personalization · AI & Decision Intelligence
Strategic ValueStrategic_Value__cText(255)Expected business value (e.g. "Lead quality ↑, faster follow-up")
Launch Target DateLaunch_Target__cDateTarget delivery date. Nullable — see Launch_Target_Raw__c for sentinel handling.
Launch Target RawLaunch_Target_Raw__cText(16)Preserves sentinels (?, TBD, N/A) the committee uses when the date is intentionally undecided. Formula populates Launch_Target__c only when this is a valid ISO date.
Level of EffortLevel_of_Effort__cPicklistHigh · Medium · Low (plain text — emoji stripped during migration)
Sort OrderSort_Order__cNumber(3,0)Manual within-band ordering for the roadmap table

4b. Alignment flags (5 booleans, unchanged from v1)

Field LabelAPI NameType
AlignmentAlignment__cCheckbox
High Impact WorkHigh_Impact_Work__cCheckbox
Retention FocusRetention_Focus__cCheckbox
Thought LeadershipThought_Leadership__cCheckbox
AI Ways of WorkingAI_Ways_of_Working__cCheckbox

4c. Brief one-pager new in v2 (four panels)

The workbook stores a four-panel one-pager per project. v1 mapped only the first panel to the existing Description field. v2 adds the missing three.

Field LabelAPI NameTypeNotes
Why It MattersWhy_It_Matters__cLong Text Area (8000)"What's broken today" — the cost / pain / hours-wasted justification.
Business ImpactBusiness_Impact__cLong Text Area (8000)Concrete outcomes once shipped — retention lift, lead quality, hours saved.
PunchlinePunchline__cText(500)The one-line metaphor the committee uses verbatim ("Think of this as fixing the plumbing").
What It Does(reuses Description)(existing)No change.

4d. Intake / scoring new in v2

Field LabelAPI NameTypeNotes
Executive SponsorExecutive_Sponsor__cLookup(User)Non-negotiable for leadership reporting. Free-text fallback acceptable until SF user reconciliation lands.
Submitted BySubmitted_By__cLookup(User)Person who originally nominated the project (distinct from CreatedBy, which is the SF DML actor).
Total ScoreTotal_Score__cNumber(3,0)Sum of voter scores from the nomination matrix. Recomputed by DataOS on every write and pushed to SF. Per-voter detail stays in the DataOS workflow today; can become a child object later (§8) without breaking this field.
Primary SystemPrimary_System__cPicklistSalesforce · CMS · Navigator · GTZenda · Hubspot · Other. The primary platform the work touches.
Dev T-ShirtDev_T_Shirt__cPicklistXS · S · M · L · XL. Engineering's effort estimate; complements Level_of_Effort__c (which is steering-committee LOE).
Dev ReadinessDev_Readiness__cPercent (0-100)Confidence the work is scoped enough to start. Validation: 0 ≤ value ≤ 100.
Intake Document URLIntake_Document_URL__cURLSharePoint / Google Doc link to the full nomination write-up.
Reviewer CommentsReviewer_Comments__cLong Text Area (8000)Free-form steering-committee notes — merge suggestions, dependency call-outs, duplicate flags. Distinct from Project_Notes.

4e. Hierarchy + identity

Field LabelAPI NameTypeNotes
Parent InitiativeParent_Initiative__cLookup(Ticket__c)Self-lookup. Filter on RecordType = Strategic Initiative.
DataOS External IDDataOS_Project_Id__cText(32) — Unique, External ID, indexedHolds the Firestore project_id. Join key for the dual-write upsert (see §13).
IT LeadIT_Lead__cLookup(User)Typo fix from v1 — added __c suffix.

4f. Audit (preserve original attribution through migration)

Field LabelAPI NameTypeNotes
Imported Created ByImported_Created_By__cText(200)Original created_by email — preserved because the Bulk API upsert overwrites CreatedById with the integration user.
Imported Updated ByImported_Updated_By__cText(200)Same rationale for updated_by.

5. Existing Fields to Reuse

DataOS fieldExisting Ticket__c fieldAction
feature_nameTitle (or Subject)direct map
statusStatusdirect map after picklist expansion (§9a)
priorityPrioritydirect map after picklist expansion (§9b)
departmentDepartmentdirect map — kept distinct from Strategic_Group__c (§10)
brief.what_it_doesDescriptiondirect map
(existing notes channel)Project_Notesunchanged — DataOS form does not write this

6. Parent / Child Initiative Structure

Parent_Initiative__c is a self-lookup on Ticket__c filtered to the Strategic Initiative record type. Validated needs from the 50 imported records:

  • 🧩 Feedback Platform (v1)(v2)
  • 🌐 Event Segmentation (v1)(v2)
  • 📱 Event App : PWA – In-House (v1)(v2)
  • ⚡ BidSpeed (cloverleaf)⚡ BidSpeed (euna) (siblings under a new "BidSpeed" parent record)
  • 📊 Sponsor Portal Automation (Pre-Event)(Post-Event)
  • 3 × 🤖 Agent Phase 2 (Tell Me When Alerts / Proposal Generator / Personal Document Library) under a new "Agent Phase 2" parent
  • 3 × GTZenda items (Process Optimization / Full Autonomy / Grants Data API Integration) under a new "GTZenda" parent

Backfill creates the umbrella parent records where one doesn't already exist; assigns Parent_Initiative__c for each child during the same migration pass.

7. Page Layout

Sections, in order:

  1. Initiative Details — Title, Record Type, Status, Priority, Sort Order, Owner, IT Lead, Launch Target Raw, Launch Target Date (formula), Department, Strategic Group
  2. Strategic Context — Strategic Value, Level of Effort, Dev T-Shirt, Dev Readiness, Total Score, Primary System
  3. Goal Alignment — Alignment, High Impact Work, Retention Focus, Thought Leadership, AI Ways of Working (5 checkboxes inline)
  4. Brief — Description ("What It Does"), Why It Matters, Business Impact, Punchline
  5. Intake — Submitted By, Executive Sponsor, Intake Document URL, Reviewer Comments
  6. Hierarchy — Parent Initiative, Related list: Child Initiatives (filtered self-lookup)
  7. System — DataOS Project Id, Imported Created/Updated By, standard audit fields (collapsed by default)

8. Voter Scoring — Decision and Future Path

v2 decision: scoring lives in DataOS, only Total_Score__c syncs to Salesforce.

Rationale: the per-voter scoring exercise is upstream of becoming a real Ticket__c — six voters per nominee, scores 1-5, the committee tallies and picks. The total is what leadership reads; the per-voter detail is committee-internal. Putting per-voter rows in SF today would require a child object that only DataOS writes to.

Future path (additive, no migration of Total_Score__c): if SF needs per-voter history later, add an ITSC_Voter_Score__c master-detail child with Voter_Name__c / Voter_User__c / Score__c / Recorded_At__c, and convert Total_Score__c to a Roll-Up Summary. The DataOS sync then writes child rows instead of just the rolled-up total. Zero impact on existing reports.

9. Picklist Expansions

Validated against the 50 records currently in Firestore.

9a. Status

ValueCurrent countMap from
Yet to Start25direct
In Design3direct
In Development6direct
In QA0(new — replaces "In Proof")
In Progress5direct (distinct from In Development per workbook usage)
Completed5add
Paused1add
Unknown3maps from ?
N/A1direct

9b. Priority

ValueCurrent countMap from
P115direct (drop ⭐ emoji)
P214direct (drop 🔶 emoji)
TBD12direct (drop ⚪ emoji)
Not yet Prioritized9add — TBD ("we will decide") and Not yet Prioritized ("we haven't looked") mean different things to the committee

9c. Level of Effort

Plain High / Medium / Low. Emoji stripped at migration; no data loss (clean 50-of-50 map).

10. Department vs. Strategic Group — Two-Field Model

These are different concepts and stay in different fields:

  • Department (existing, free-text or picklist) = operational owner. The 50 records have 32 distinct values like "Product / Events / Sales Ops" or "Marketing / Demand Gen". Preserved as-is.
  • Strategic_Group__c (new picklist, §4a) = strategic lens. One project can be in dept "Marketing / Demand Gen" AND strategic group "Retention & Intelligence".

This avoids the lossy force-fit of 32 free-text departments into 9 strategic-group picklist values.

11. List Views

  • All Strategic Initiatives — RecordType = Strategic Initiative, sort by Priority ASC, Sort_Order__c ASC, Launch_Target__c ASC NULLS LAST
  • P1 Active — Priority = P1 AND Status NOT IN (Completed, N/A)
  • P2 Pipeline — Priority = P2 AND Status NOT IN (Completed, N/A)
  • Not Yet Prioritized — Priority IN (TBD, Not yet Prioritized)
  • Needs Attention — Status IN (Paused, Unknown) OR (Launch_Target__c < TODAY AND Status NOT IN (Completed, N/A))
  • Upcoming 90d — Launch_Target__c BETWEEN TODAY AND TODAY+90, Status NOT IN (Completed, N/A)

12. Validation Rules

  • Launch_Target_Raw_ValidLaunch_Target_Raw__c is blank OR matches ^\d{4}-\d{2}-\d{2}$ OR ∈ {?, TBD, N/A}
  • Dev_Readiness_Range — 0 ≤ Dev_Readiness__c ≤ 100
  • Total_Score_NonNegTotal_Score__c ≥ 0
  • Parent_Cannot_Be_SelfParent_Initiative__cId

13. Dual-Write Contract (DataOS ⇄ Salesforce)

This is the v2-specific addition. The DataOS form remains the system of entry; Salesforce is the system of record. Both stay consistent through a deterministic dual-write keyed on DataOS_Project_Id__c.

13a. Write path (DataOS form → SF)

User submits the form at /dept/engineering
   │
   ▼
services/itsc_roadmap.py::create_project / update_project / delete_project
   │   (existing: validates + persists to Firestore)
   ▼
services/itsc_sf_sync.py::push_to_sf(project_id)        ← NEW MODULE
   │   - simple-salesforce upsert against Ticket__c using
   │     DataOS_Project_Id__c as the external ID
   │   - field map lives in one dict (mirrors §4)
   │   - on success: stores SF Id back on the Firestore doc
   │   - on failure: logged + queued for retry, does NOT fail the user request
   ▼
SF Ticket__c (Strategic Initiative record type) — system of record
  • Idempotent: upsert by external ID, safe to replay.
  • Fail-open from the user's perspective: a transient SF outage doesn't block the form save. The retry worker (scheduled every 15 min via the existing ETL scheduler) drains the queue.
  • Voter scores: when the form submits, the recomputed total_score is what gets pushed. Per-voter rows are NOT pushed (see §8).

13b. Read path (today: Firestore; tomorrow: SF)

Phase 1 (immediate after backfill): reads continue from Firestore for sub-50ms latency in the /dept/engineering tab. SF is shadow-of-truth.

Phase 2 (once SF UI exists and is in steady use): a nightly reconciliation job pulls every Ticket__c with RecordType = Strategic Initiative, diffs against Firestore by DataOS_Project_Id__c, and applies SF-side edits back into Firestore. Conflict resolution: LastModifiedDate wins.

Phase 3 (optional, future): cut over reads to SOQL directly, decommission the Firestore collection. Service signature doesn't change, only the loader behind services/itsc_roadmap.py::list_projects does.

13c. Reverse path (SF → DataOS, Phase 2 onward)

  • Triggered by either:
    • A scheduled reconciliation (15-min cadence), OR
    • A SF Outbound Message / Platform Event on Ticket__c update (if SF ops is comfortable adding it)
  • For each SF record where LastModifiedDate > Firestore.updated_at, write the SF state back to Firestore.
  • Skips records where DataOS write happened in the last 60 seconds (debounce so a DataOS write doesn't immediately echo back as a SF→DataOS overwrite).

13d. Source of truth for each field

FieldAuthoritative sideNotes
All §4 fields, all §5 reuse fields, auditWhichever side wrote last (LastModifiedDate wins)Single source of truth: the conflict-resolution rule
DataOS_Project_Id__cDataOS (immutable after first write)Never changes
CreatedById / CreatedDateSFStandard; DataOS preserves original via Imported_Created_By__c

14. Data Migration

Migration target: the 50 records currently in itsc_projects Firestore.

Steps:

  1. Export Firestore → flat CSV via a one-shot scripts/export_itsc_to_sf_csv.py (writes itsc_to_sf.csv with columns = SF API names per §4 + §5; emojis stripped from Priority and LOE; status remapped per §9a).
  2. Identify the 7 parent-record umbrellas from §6 — create them in SF first (manually or as separate CSV rows), capture their SF Ids.
  3. Backfill parent_id column in itsc_to_sf.csv using the umbrella SF Ids.
  4. Bulk upsert into Ticket__c keyed on DataOS_Project_Id__c. Validate row count = 50 + umbrella count.
  5. Spot-check the 5 emoji-heavy records (Custom Communication, Health Dashboard, both Feedback Platforms, GTZenda variants) to confirm round-trip.
  6. Turn on dual-write in DataOS (env flag ITSC_SF_SYNC_ENABLED=1). From that moment, all DataOS writes also push to SF.
  7. Run a one-time reconciliation read (SF → Firestore) to confirm parity.

Rollback: disable ITSC_SF_SYNC_ENABLED. DataOS reverts to Firestore-only operation. SF records remain but go stale until re-enabled.

15. Phasing / Rollout

PhaseOwnerDeliverablesGate to next
1. SF object buildSF opsAll §4 fields, validation rules (§12), page layout (§7), list views (§11), record type assignmentsSandbox sign-off from steering committee
2. DataOS sync wiringDataOS engservices/itsc_sf_sync.py, retry queue, ITSC_SF_SYNC_ENABLED env flag (off by default), unit tests against simple-salesforce mockAll 50 records dual-write cleanly in sandbox
3. BackfillDataOS eng + SF ops50 records imported via §14 steps, parent umbrellas linked, spot-check sign-offSteering committee verifies parity in SF
4. Production cut-overDataOS engFlip ITSC_SF_SYNC_ENABLED=1 in production, monitor for 1 weekZero sync failures over a week
5. SF-as-read-source (optional, future)DataOS engReverse-sync + Ticket__c reader in services/itsc_roadmap.pySteering committee actively using SF Lightning record pages

16. Benefits of This Approach

  • No duplicate object hierarchy — uses existing Ticket__c lifecycle, ownership, sharing, audit.
  • Single source of truth in Salesforce — Power BI, SF reports, and the rest of the company's data universe see initiatives in the same place they see tickets.
  • DataOS form remains the operational UI — the steering committee keeps the fast, purpose-built /dept/engineering tab they're already using.
  • Zero data loss from the current workbook — every field that today has a non-trivial value (brief panels, voter total, exec sponsor, intake metadata) has a home.
  • Additive future path for voter detail — when/if SF needs per-voter rows, it's an additive child object, not a migration.
  • Fail-soft on SF outage — user writes never block on SF availability.

17. Open Questions for Steering / SF Ops

  1. In Progress vs. In Development — are these two genuinely different statuses, or did the workbook accidentally accumulate both? Currently 5 records use In Progress and 6 use In Development. Recommend keeping both (committee call).
  2. Submitted_By__c vs. ownership — is the submitter the same as the eventual owner in 90% of cases? If yes, we can default Submitted_By__c to OwnerId on insert and skip the extra picker in the form.
  3. Intake docs — keep Intake_Document_URL__c as a URL field, or move to native SF Files (ContentDocument)? Files give versioning and access control; URL is simpler for the SharePoint links the committee already uses.
  4. Reviewer commentsReviewer_Comments__c field, or Chatter? Chatter gives threading and notifications but is harder to migrate from the workbook's free-text field.
  5. Strategic_Group picklist values — the 9 listed are from v1. Should the committee add / rename / drop any before deployment, while picklist changes are still cheap?

18. Changes from V1

For anyone who's already read v1:

ChangeWhy
3 new brief fieldsWhy_It_Matters__c, Business_Impact__c, Punchline__cThe workbook's one-pager has 4 panels; v1 only mapped 1
8 new intake fieldsExecutive_Sponsor__c, Submitted_By__c, Total_Score__c, Primary_System__c, Dev_T_Shirt__c, Dev_Readiness__c, Intake_Document_URL__c, Reviewer_Comments__cPreserves the Sheet2 nomination matrix that drives committee decisions
Status picklist expanded to include Completed, Paused; In Proof becomes In QA7 of 50 records would otherwise be unmappable
Priority picklist expanded to include Not yet Prioritized9 of 50 records would otherwise be unmappable
Two-field department model — keep Department as-is, add Strategic_Group__c as a separate strategic lensAvoids force-fitting 32 free-text departments into 9 picklist values
Launch_Target_Raw__c text + Launch_Target__c formula dateThe workbook genuinely uses ? / TBD / N/A as launch-target values
DataOS_Project_Id__c external IDRequired join key for the dual-write upsert
Section 13: Dual-write contractThe whole "DataOS form remains operational UI, SF is system of record" model is new in v2
IT_LeadIT_Lead__cTypo fix

Notifications

No notifications

Create Opportunity

DATA OS

Opportunity Created

DataOS
Install DataOS Add to home screen for quick access
All Features