Simulation analysis at Foretellixניתוח תוצאות סימולציה ב-Foretellix

Where is the safety gap?איפה פער הבטיחות?

How engineers see, find, define and count the moments that show whether a self-driving system is safe.איך מהנדסים רואים, מוצאים, מגדירים וסופרים את הרגעים שמראים אם מערכת נהיגה אוטונומית בטוחה.

Roleתפקיד Senior UX Designer, then UX LeadSenior UX Designer, ואחר כך UX Lead
Teamצוות Lead designer, with product
and engineering
מעצב מוביל, יחד עם
המוצר והפיתוח
Periodתקופה 2023 - 2026
Platformפלטפורמה Foretify Manager (web)Foretify Manager (ווב)

Overview

A simulation produces numbers. Engineers need events.

A self-driving programme runs hundreds of thousands of simulations to argue that its vehicle is safe enough for public roads. A verification engineer has to know what happened in them: did a car cut in, did the vehicle brake, and how often across the whole regression.

That is step four of Foretellix's flow, Check and measure. Product defined the interval: a named event with a start and an end, recorded during the simulation. I designed how people see intervals, find them, define their own and count them toward coverage.

Diagram: the Foretify Manager flow of select or create, create variations, execute, check and measure, export, with an iterate loop. Check and measure is highlighted, with an arrow into the analysis platform, which turns simulation output into named events. Its four jobs, see it on the timeline, find it among millions, define your own, count it toward coverage, sit above the four surfaces where they happen: run debugger, intervals and filter, compound rules, verification plan.
Analysis is where every run's results land. The four jobs on the top row map to the four surfaces below them.

My role. From 2023 to 2026, as Senior UX Designer and then UX Lead, I owned the interaction model for intervals: the timeline, the filter, the editor for new ones and the path back from coverage. The concepts were product's. I shaped the data model with product and engineering, and directed a designer on my team.

~1 min
to preview a new event on real data, instead of a calculation of over an hour
Millions → 1
from millions of intervals to one run, in one two-level filter
Plan → evidence
a coverage bucket opens the runs and intervals that filled it

Four design decisions shaped the answer to the title's question.


The problem

Reading a line to guess an event

Before intervals, a run's results were values plotted over time: speed, distance, acceleration. To know a cut-in happened, an engineer inferred it from the lines, like reading a heart-rate chart to guess when someone started running. An interval says it outright: cut-in, 1.8 to 4.7 seconds.

Diagram of one cut-in on a shared time axis. Top, a top-down road with the ego car and a car cutting in front of it. Middle, before: two plotted signals, ego speed and the gap to the car ahead, both dipping. Bottom, after: three named event bars, cut-in, ego braking and close following. One playhead runs through all three rows.
The same cut-in, read two ways: as signals the engineer had to interpret, and as named events on the same time axis.

That works for one run. One workspace held over two million intervals, and the system was built for hundreds of millions. A query mixing two kinds of interval came back empty.

Diagram: over 2 million intervals across about 6,000 runs, then one scenario filter by name gives about 34,000 intervals across 100 runs, then one metric condition gives one run, the one that matters.
Product's worked example: two filter steps take a whole regression down to the one run that matters.

Background

Events you plan before the run

An interval exists only if someone planned for it. The engineer writes into the scenario's code what to look for: checkers, and scenario matching that recognises a manoeuvre such as a cut-in.

These usually come from the verification plan, the list of situations the programme must cover and measure. Foretify computes them during the run, and every value they carry is counted against that plan.

Under every coverage item in the plan sit its buckets, ranges of a value such as speed at the start of a cut-in, each hit or not against a target. The plan rolls them up into a grade, and the empty buckets are the safety gap.

Diagram: interval, a named event over time, feeds metric item, a value sampled inside it, which feeds bucket, hit or no hit against a target, then plan entry, a situation the plan must cover, and VGrade, the weighted coverage grade.
Every interval feeds coverage, and the plan rolls it up into one grade.

Anything not planned in advance can't be found afterwards. So users later asked to define new events after the run, from data that already existed. That became compound intervals, in decision 3.


How I worked

The brief said draw it

My first brief was to visualise intervals. Drawing them served one run, already found. The real job was analysis across hundreds of thousands of runs, where people query, combine and count. So the work moved from making intervals visible to making them findable, definable and countable.

I started by mapping what an interval could be, with the product team's definitions on one board. Then I looked at tools that already show events over time: animation timelines in After Effects and Maya, Gantt views in project tools, the Visual Studio and Chrome debuggers, and transaction debug views from chip verification.

Interviews and quick usability sessions with application engineers, who worked with customers daily, stood in for the user access I didn't have.

A whiteboard sketch from March 2023: interval names in a column on the left, red bars over a time axis from 30 to 500, an inspector table on the right with start time, end time and other car, an actor details box, and a small drawing of a car changing lanes.
A second whiteboard sketch: the same interval rows with a note asking about colours, plus layouts that place the map, the event rows and the inspector together on one screen.

March 2023, first sketches: event rows over time, an inspector for the selected one, and the map on the same screen.

Three persona cards: the V&V engineer who wrote the scenario, the V&V engineer new to the data, and the safety and systems engineer. Each lists primary goals in analysis, typical entry points, top tasks, pain points, what they need from UX and success signals.
Three users, rebuilt from the company's role definitions: the author knows the names, the newcomer doesn't, and the safety engineer starts from the plan.

Design decision 1

One timeline, in step with the car

Once intervals existed, people had to see them, next to the car doing them.

The decision

Show every interval as a row on one timeline, in a tree, with one cursor shared with the visualizer. Move the time and the map follows, so the manoeuvre and the event's duration are read together, as at the end of the video above.

My part was the layout: rows over time, the shared cursor and the tree. Two other designers worked on the first wireframes with me. Application engineers were split on mixing value traces with intervals, so the two started apart and joined a release later.

Every new kind of event then wanted its own look. I treated visual channels as a budget. Each type gets one look and a legend entry that filters it, and the only pattern, stripes, marks intervals users upload.

The traces timeline of one run on mock data, grouped by actor: the system under test with an orange anomaly bar and a striped analyst note, then the cut-in car with its scenario, three behaviours in sequence (planned, lane change, keep driving) and the match for the cut-in. A legend of interval types sits above.
Five kinds of interval in one run, one look each: scenario, behaviour, match, anomaly, and the striped note an analyst uploaded. The legend above doubles as a filter. Mock data.

Design decision 2

Which event, then what happened inside it

Engineers' questions have two parts: which event, and what happened during it. For example, cut-ins where the speed during the cut-in was over 60.

The first interval filter couldn't ask that. It couldn't say which kind of interval to return, so a query mixing two kinds came back empty, and it couldn't reach the values measured inside an interval. Product led a revamp of all the app's filters to fix this, with a two-level filter at its core. Engineering capped it at two levels, for speed and for usability.

The decision

Set both levels in one form, in one go. That was product's ruling. The form that makes it possible was mine:

  • One form, two levels: an interval, a condition on its own values beneath it, one click.
  • A magic wand on any interval or metric you find: one click filters all the results by it, without opening the full filter.
The interval filter on mock data: name equals oncoming_lead, and nested under it a metric filter on oncoming_lead.metrics where duration_s is greater than 4.7, with Add Child Condition and Filter Locally.
Two levels in one form: the interval by name, and under it a condition on that interval's own measured values. Mock data.
What I learned

The design didn't break. Its assumption about the user expired. In 2023 the people analysing results had written the scenarios and knew the names. Real-world driving logs brought engineers who never had, and the strict filter asked too much of them. My AI aid for it, shipped in 2025, was the first answer.


Design decision 3

Pairs, then compose

Planned events answered the questions people knew to ask before the run. Coverage and validation engineers then had new ones after it: a cut-in during a junction approach, say, built from intervals that already existed. Product's answer was compound intervals, and a customer asked for up to five intervals in one rule.

The decision

Allow two intervals per rule, joined by a time relation such as A starts before B. A compound is itself an interval, so nesting compounds inside compounds builds any combination, pair by pair. I pushed back hard on five, and two shipped.

My research showed two were enough, because nesting covers the rest. And I was wary of ambiguity. A time relation is always between two intervals. With three in one rule, the form must say which pair each relation joins, and with four, six pairs.

Supporting five from day one meant a far heavier UX and backend for a need nobody had tested. Better to start lean and see whether users could work with two.

Diagram in two bands. Top, in red, one rule with many intervals joined by a time relation: 2 intervals can be paired 1 way, 3 intervals 2 ways, (A then B) then C or A then (B then C), 4 intervals 5 ways, and 5 intervals, as requested, 14 ways. Bottom, in violet, two operands then compose: A plus B gives C, D plus E gives F, and C plus F gives G, one relation per step.
Five intervals in one rule can be read fourteen ways. A pair reads one way, and nesting builds the rest.

Applying a rule to all the data took over an hour, so the tech lead and I designed a playground: the first matches on real data in about a minute, before saving.

Name it, pick A and B, choose how they relate, and the first matches appear beside the rule before it is saved. Mock data.

I also said early that compounds would need a rules manager. It came later, with my column wording.


Design decision 4

A bucket hands back what filled it

The plan showed where the gap was, but a bucket was only a number. Nothing connected it to the runs and the moments behind it.

The decision

Make every bucket a way back to its evidence: its runs appear beneath it, or an interval filter opens its events. The intervals route was my idea. I also proposed showing the histogram inside the plan rather than in a separate app, and a designer on my team built it under my direction.

From a bucket with hits to the runs that filled it, and one run opened on the interval behind the hit. Mock data.
What I learned

The precise answer costs you your place: the interval route leaves the plan. And nobody, me included, designed for the opposite question: why is this bucket empty?


Process

From Figma to a code branch

Most of this work was designed in Figma and handed over in Zeplin, with the filter's keyboard model written as a specification. When a delivery review found designs changing after planning, its two fixes were mine: a review with developers after each upload, and a mark for when a design is final.

By 2026 I designed in a code branch, with AI tools, on the shared components in Storybook. Moving compound rules to the project, shared by every workspace, reached engineering as a working branch, and developers kept testing and stability.

The Filters page of the design system in Figma, on a dark background: the base filter modal with three nested run filters, the basic expression in default, hover and selected states, the list of operators, the AND, OR and NOT condition expressions, the filter chips bar, and a grid of filter chips for run, metric, interval and aggregate filters in default, disabled, pressed and hover states.
The filter in the design system in Figma: the modal, its expressions and operators, the chips bar and every chip state. Click to open full size.
The same filter in the shared component library in Storybook: its building blocks, then the two-level filter live. Mock data.

Outcome

Where is the safety gap? The plan now shows it

The model shipped in steps from 2023 to 2026: intervals on the timeline, the two-level filter, compound intervals with the playground, buckets that open their evidence, and rules shared across the project.

Finding a moment, before and after

How widely it was used, I can't say: one month on two internal servers shows the debugger drew about five times the views of the interval pages, which fits the reframe. Measuring it was partly my job: my ticket to define analytics events stayed open.

What I would do differently

Skip the separate rule editor. Users already found things in the debugger and the filtered table. A blank form asks them to describe what they were looking at. Better: select what you found and name it, because naming it makes it a rule. I proposed this early, and a principal engineer argued the same.

סקירה

סימולציה מייצרת מספרים. מהנדסים צריכים אירועים.

תוכנית לרכב אוטונומי מריצה מאות אלפי סימולציות כדי להראות שהרכב שלה בטוח מספיק לכביש. מהנדס האימות צריך לדעת מה קרה בהן: האם רכב נכנס לנתיב, האם הרכב הנבדק בלם, וכמה פעמים זה קרה בכל ה-regression.

זה השלב הרביעי בתהליך של Foretellix, Check and measure. צוות המוצר הגדיר את ה-interval: אירוע עם שם, התחלה וסוף, שנרשם בזמן הסימולציה. אני עיצבתי איך רואים intervals, איך מוצאים אותם, איך מגדירים חדשים ואיך הם נספרים לכיסוי.

תרשים: התהליך של Foretify Manager, מבחירה או יצירה, דרך יצירת וריאציות, הרצה, בדיקה ומדידה ועד ייצוא, עם לולאת חזרה. השלב Check and measure מודגש, עם חץ אל פלטפורמת הניתוח, שהופכת פלט סימולציה לאירועים עם שם. ארבע המשימות שלה, לראות על ציר הזמן, למצוא בין מיליונים, להגדיר משלך ולספור לכיסוי, מופיעות מעל ארבעת המסכים שבהם הן קורות.
כאן נוחתות התוצאות של כל הרצה. ארבע המשימות בשורה העליונה מתאימות לארבעת המסכים שמתחתן.

התפקיד שלי. בין 2023 ל-2026, כ-Senior UX Designer ואחר כך כ-UX Lead, הייתי אחראי על מודל האינטראקציה של ה-intervals: ציר הזמן, הסינון, העורך להגדרת חדשים והדרך חזרה מהכיסוי. הקונספטים היו של צוות המוצר. עיצבתי איתם ועם הפיתוח את מודל הנתונים, והנחיתי מעצבת מהצוות שלי.

כדקה
לתצוגה מקדימה של אירוע חדש על נתונים אמיתיים, במקום חישוב של יותר משעה
מיליונים ← 1
ממיליוני intervals להרצה אחת, בסינון אחד בשתי רמות
תכנית ← ראיות
bucket של כיסוי פותח את ההרצות וה-intervals שמילאו אותו

ארבע החלטות עיצוב עיצבו את התשובה לשאלה שבכותרת.


הבעיה

לקרוא קו כדי לנחש אירוע

לפני ה-intervals, התוצאות של הרצה היו ערכים על ציר זמן: מהירות, מרחק, תאוצה. כדי לדעת שרכב נכנס לנתיב, המהנדס הסיק את זה מהקווים, כמו לקרוא גרף דופק ולנחש מתי מישהו התחיל לרוץ. interval אומר את זה במפורש: cut-in, משנייה 1.8 עד 4.7.

תרשים של רכב שנכנס לנתיב על ציר זמן משותף. למעלה, כביש במבט מלמעלה עם הרכב הנבדק ורכב שנכנס לפניו. באמצע, לפני: שני אותות, מהירות הרכב והמרחק מהרכב שלפניו, ששניהם יורדים. למטה, אחרי: שלושה אירועים עם שם. סמן זמן אחד עובר דרך שלוש השורות.
אותו רגע, בשתי קריאות: כאותות שהמהנדס היה צריך לפרש, וכאירועים עם שם על אותו ציר זמן.

זה עובד להרצה אחת. workspace אחד הכיל יותר משני מיליון intervals, והמערכת נבנתה למאות מיליונים. שאילתה שערבבה שני סוגי intervals החזירה תוצאה ריקה.

תרשים: יותר משני מיליון intervals בכ-6,000 הרצות, סינון לפי שם תרחיש מוביל לכ-34,000 intervals ב-100 הרצות, ותנאי מדד אחד מוביל להרצה אחת, זו שחשובה.
הדוגמה של צוות המוצר: שני צעדי סינון לוקחים regression שלם אל ההרצה האחת שחשובה.

רקע

אירועים שמתכננים לפני ההרצה

interval קיים רק אם מישהו תכנן אותו. המהנדס כותב בקוד של התרחיש מה לחפש: checkers, ו-scenario matching שמזהה תמרון כמו כניסה לנתיב.

בדרך כלל הם נגזרים מתכנית האימות, רשימת המצבים שהתוכנית חייבת לכסות ולמדוד. Foretify מחשב אותם בזמן ההרצה, וכל ערך שהם נושאים נספר מול התכנית הזאת.

מתחת לכל פריט כיסוי בתכנית יש buckets, טווחים של ערך כמו מהירות בתחילת כניסה לנתיב, וכל אחד נפגע או לא מול יעד. התכנית מסכמת אותם לציון, וה-buckets הריקים הם פער הבטיחות.

תרשים: interval, אירוע עם שם לאורך זמן, מזין metric item, ערך שנדגם בתוכו, שמזין bucket, פגיעה או לא מול יעד, ואחר כך plan entry, מצב שהתכנית חייבת לכסות, ו-VGrade, ציון הכיסוי המשוקלל.
כל interval מזין את הכיסוי, והתכנית מסכמת אותו לציון אחד.

מה שלא תוכנן מראש אי אפשר למצוא אחר כך. לכן משתמשים ביקשו בהמשך להגדיר אירועים חדשים אחרי ההרצה, מנתונים שכבר קיימים. זה הפך ל-compound intervals, בהחלטה 3.


איך עבדתי

הבריף אמר לצייר

הבריף הראשון היה להציג intervals בצורה ויזואלית. הציור שירת הרצה אחת שכבר נמצאה. העבודה האמיתית הייתה ניתוח של מאות אלפי הרצות, שבו שואלים, משלבים וסופרים. אז העבודה עברה מלהפוך intervals לגלויים, ללאפשר למצוא, להגדיר ולספור אותם.

התחלתי במיפוי של מה interval יכול להיות, עם ההגדרות של צוות המוצר על לוח אחד. אחר כך בדקתי כלים שכבר מציגים אירועים לאורך זמן: צירי זמן של אנימציה ב-After Effects וב-Maya, תצוגות Gantt בכלי ניהול פרויקטים, הדיבאגרים של Visual Studio ושל Chrome, ותצוגות דיבאג של טרנזקציות מעולם אימות השבבים.

ראיונות ובדיקות שימושיות קצרות עם מהנדסי האפליקציה, שעבדו עם הלקוחות כל יום, היו התחליף לגישה למשתמשים שלא הייתה לי.

סקיצה על לוח ממרץ 2023: שמות intervals בעמודה משמאל, פסים אדומים על ציר זמן, טבלת inspector מימין, תיבת פרטי שחקן, ושרטוט קטן של רכב שמחליף נתיב.
סקיצה שנייה: אותן שורות של intervals עם שאלה על צבעים, ופריסות שמציבות את המפה, השורות וה-inspector יחד על מסך אחד.

מרץ 2023, סקיצות ראשונות: שורות של אירועים לאורך זמן, inspector לאירוע שנבחר, והמפה על אותו מסך.

שלושה כרטיסי פרסונה: מהנדס ה-V&V שכתב את התרחיש, מהנדס V&V חדש לנתונים, ומהנדס הבטיחות והמערכות. בכל כרטיס: מטרות בניתוח, נקודות כניסה, משימות עיקריות, נקודות כאב, מה הם צריכים מה-UX וסימני הצלחה.
שלושה משתמשים, שנבנו מחדש מהגדרות התפקידים של החברה: הכותב מכיר את השמות, החדש לא, ומהנדס הבטיחות מתחיל מהתכנית.

החלטת עיצוב 1

ציר זמן אחד, בקצב של הרכב

ברגע שה-intervals היו קיימים, היה צריך לראות אותם, ליד הרכב שעושה אותם.

ההחלטה

להציג כל interval כשורה על ציר זמן אחד, בתוך עץ, עם סמן זמן אחד משותף עם ה-visualizer. מזיזים את הזמן והמפה זזה איתו, כך שקוראים את התמרון ואת משך האירוע יחד, כמו בסוף הסרטון למעלה.

החלק שלי היה הפריסה: שורות לאורך זמן, הסמן המשותף והעץ. שני מעצבים נוספים עבדו איתי על הסקיצות הראשונות. מהנדסי האפליקציה היו חלוקים לגבי שילוב של אותות ערכים עם intervals, אז השניים התחילו בנפרד והתאחדו גרסה אחר כך.

כל סוג אירוע חדש רצה אחר כך מראה משלו. התייחסתי לערוצים חזותיים כאל תקציב. לכל סוג מראה אחד ופריט במקרא שמסנן אותו, והדוגמה היחידה, פסים, מסמנת intervals שמשתמשים מעלים.

ציר הזמן של הרצה אחת על נתוני דמה, מקובץ לפי שחקן: המערכת הנבדקת עם פס כתום של אנומליה והערת אנליסט מפוספסת, ואחריה הרכב שנכנס לנתיב עם התרחיש, שלוש התנהגויות ברצף וההתאמה לכניסה. מעל: מקרא של סוגי intervals.
חמישה סוגי intervals בהרצה אחת, מראה אחד לכל סוג: תרחיש, התנהגות, התאמה, אנומליה, וההערה המפוספסת שאנליסט העלה. המקרא שמעל משמש גם כסינון. נתוני דמה.

החלטת עיצוב 2

איזה אירוע, ומה קרה בתוכו

לשאלות של מהנדסים יש שני חלקים: איזה אירוע, ומה קרה בזמן שלו. למשל, כניסות לנתיב שבהן המהירות בזמן הכניסה הייתה מעל 60.

הסינון הראשון של ה-intervals לא ידע לשאול את זה. הוא לא ידע להגדיר איזה סוג interval להחזיר, אז שאילתה שמשלבת שני סוגים חזרה ריקה, והוא לא הגיע לערכים שנמדדו בתוך interval. צוות המוצר הוביל חידוש של כל הסינונים באפליקציה כדי לתקן את זה, ובמרכזו סינון בשתי רמות. הפיתוח הגביל אותו לשתי רמות, בגלל ביצועים ושימושיות.

ההחלטה

להגדיר את שתי הרמות בטופס אחד, בבת אחת. זו הייתה קביעה של צוות המוצר. הטופס שמאפשר את זה היה שלי:

  • טופס אחד, שתי רמות: interval, ומתחתיו תנאי על הערכים שלו, בלחיצה אחת.
  • שרביט קסם על כל interval או מדד שמצאת: לחיצה אחת מסננת לפיו את כל התוצאות, בלי לפתוח את הסינון המלא.
סינון ה-intervals על נתוני דמה: השם שווה oncoming_lead, ומתחתיו סינון מדד על oncoming_lead.metrics שבו duration_s גדול מ-4.7.
שתי רמות בטופס אחד: ה-interval לפי שם, ומתחתיו תנאי על הערכים שנמדדו בתוכו. נתוני דמה.
מה למדתי

העיצוב לא נשבר. ההנחה שלו לגבי המשתמש פגה. ב-2023 מי שניתח תוצאות גם כתב את התרחישים והכיר את השמות. נתוני נהיגה מהעולם האמיתי הביאו מהנדסים שמעולם לא כתבו תרחיש, והסינון המדויק דרש מהם יותר מדי. עוזר ה-AI שעיצבתי לו, שיצא ב-2025, היה התשובה הראשונה.


החלטת עיצוב 3

זוגות, ואז הרכבה

אירועים מתוכננים ענו על השאלות שידעו לשאול לפני ההרצה. מהנדסי כיסוי ואימות שאלו אחריה שאלות חדשות: למשל כניסה לנתיב בזמן התקרבות לצומת, שבנויה מ-intervals שכבר קיימים. התשובה של צוות המוצר הייתה compound intervals, ולקוח ביקש עד חמישה intervals בכלל אחד.

ההחלטה

לאפשר שני intervals בכל כלל, שמחובר ביניהם יחס זמן כמו A starts before B. כל compound הוא בעצמו interval, ולכן קינון של compounds זה בתוך זה בונה כל צירוף, זוג אחרי זוג. התנגדתי בתוקף לחמישה, ושניים הם מה שיצא.

המחקר שלי הראה ששניים מספיקים, כי הקינון מכסה את השאר. וחששתי מעמימות. יחס זמן הוא תמיד בין שני intervals. עם שלושה בכלל אחד, הטופס חייב לומר איזה זוג כל יחס מחבר, ועם ארבעה, שישה זוגות.

תמיכה בחמישה מהיום הראשון הייתה מובילה ל-UX ולתשתית כבדים בהרבה, בשביל צורך שאף אחד עוד לא בדק. עדיף להתחיל רזה ולראות אם משתמשים מסתדרים עם שניים.

תרשים בשני פסים. למעלה, באדום, כלל אחד עם הרבה intervals שמחובר ביניהם יחס זמן: 2 intervals מתחברים בדרך אחת, 3 בשתי דרכים, 4 בחמש, ו-5, כמו שהתבקש, ב-14 דרכים. למטה, בסגול, שני אופרנדים ואז הרכבה: A ועוד B נותנים C, D ועוד E נותנים F, ו-C ועוד F נותנים G, יחס אחד בכל שלב.
חמישה intervals בכלל אחד אפשר לקרוא בארבע עשרה דרכים. זוג נקרא בדרך אחת, והקינון בונה את השאר.

הפעלת כלל על כל הנתונים לקחה יותר משעה, אז ה-tech lead ואני עיצבנו playground: ההתאמות הראשונות על נתונים אמיתיים תוך כדקה, לפני השמירה.

נותנים שם, בוחרים A ו-B, מגדירים את היחס, וההתאמות הראשונות מופיעות לצד הכלל לפני השמירה. נתוני דמה.

אמרתי גם מוקדם שה-compounds יצטרכו מנהל כללים. הוא הגיע מאוחר יותר, עם הניסוח שלי לעמודות.


החלטת עיצוב 4

bucket שמחזיר את מה שמילא אותו

התכנית הראתה איפה הפער, אבל bucket היה רק מספר. שום דבר לא חיבר אותו להרצות ולרגעים שמאחוריו.

ההחלטה

להפוך כל bucket לדרך חזרה לראיות שלו: ההרצות שלו מופיעות מתחתיו, או סינון intervals פותח את האירועים שלו. הדרך דרך ה-intervals הייתה הרעיון שלי. הצעתי גם להציג את ההיסטוגרמה בתוך התכנית ולא באפליקציה נפרדת, ומעצבת מהצוות שלי בנתה אותה בהנחיה שלי.

מ-bucket עם פגיעות אל ההרצות שמילאו אותו, והרצה אחת שנפתחת על ה-interval שמאחורי הפגיעה. נתוני דמה.
מה למדתי

התשובה המדויקת עולה לך במקום שלך: הדרך דרך ה-intervals יוצאת מהתכנית. ואף אחד, כולל אני, לא עיצב את השאלה ההפוכה: למה ה-bucket הזה ריק?


תהליך

מ-Figma לענף קוד

רוב העבודה הזאת עוצבה ב-Figma ונמסרה ב-Zeplin, ומודל המקלדת של הסינון נכתב כמפרט. כשסקירת מסירה מצאה שעיצובים משתנים אחרי התכנון, שני התיקונים הוטלו עליי: סקירה עם המפתחים אחרי כל העלאה, וסימון ברור מתי עיצוב סופי.

ב-2026 כבר עיצבתי בענף קוד, עם כלי AI, על הרכיבים המשותפים ב-Storybook. העברת כללי ה-compound לרמת הפרויקט, משותפים לכל ה-workspaces, הגיעה לפיתוח כענף עובד, והבדיקות והיציבות נשארו אצל המפתחים.

עמוד ה-Filters במערכת העיצוב ב-Figma, על רקע כהה: חלון הסינון הבסיסי עם שלושה סינונים מקוננים, הביטוי הבסיסי במצבי ברירת מחדל, ריחוף ובחירה, רשימת האופרטורים, ביטויי התנאי AND, OR ו-NOT, סרגל צ'יפי הסינון, וטבלת צ'יפים לסינוני הרצה, מדד, interval ואגרגציה בכל המצבים.
הסינון במערכת העיצוב ב-Figma: החלון, הביטויים והאופרטורים, סרגל הצ'יפים וכל מצבי הצ'יפ. לחיצה פותחת בגודל מלא.
אותו סינון בספריית הרכיבים המשותפים ב-Storybook: אבני הבניין, ואחר כך הסינון בשתי רמות, חי. נתוני דמה.

התוצאה

איפה פער הבטיחות? עכשיו התכנית מראה אותו

המודל יצא בשלבים בין 2023 ל-2026: intervals על ציר הזמן, הסינון בשתי רמות, intervals מסוג compound עם ה-playground, buckets שפותחים את הראיות שלהם, וכללים משותפים לכל הפרויקט.

למצוא רגע, לפני ואחרי

כמה השתמשו בזה, אני לא יכול לומר: חודש אחד על שני שרתים פנימיים מראה שה-debugger קיבל בערך פי חמישה צפיות מעמודי ה-intervals, וזה מתיישב עם המסקנה. המדידה הייתה בחלקה התפקיד שלי: המשימה שלי להגדיר אירועי analytics נשארה פתוחה.

מה הייתי עושה אחרת

לוותר על עורך כללים נפרד. משתמשים כבר מצאו דברים ב-debugger ובטבלה המסוננת. טופס ריק מבקש מהם לתאר את מה שהם כבר הסתכלו עליו. עדיף: לבחור את מה שמצאת ולתת לו שם, כי השם הוא מה שהופך אותו לכלל. הצעתי את זה מוקדם, ומהנדס בכיר טען אותו דבר.