No retrospectives yet.
; + } + + const lowerQuery = query.toLowerCase(); + const filtered = retros.filter( + (r) => + (smoothnessFilter === "all" || r.smoothness === smoothnessFilter) && + (r.goal.toLowerCase().includes(lowerQuery) || + r.pipeline_name.toLowerCase().includes(lowerQuery)), + ); + + return ( +| Pipeline | +Goal | +Smoothness | +Duration | +Frictions | +When | +
|---|---|---|---|---|---|
| + {retro.pipeline_name} + | ++ {truncate(retro.goal, 60)} + | +
+ |
+ + {formatDuration(retro.stats.total_duration_ms)} + | ++ {retro.friction_points?.length ?? 0} + | ++ {formatTimestamp(retro.timestamp)} + | +
No retrospective found for this run.
; + } + + const smoothness = retro.smoothness ? smoothnessConfig[retro.smoothness] : null; + + return ( +{retro.goal}
++ {retro.pipeline_name} · {new Date(retro.timestamp).toLocaleString()} +
+{retro.intent}
+{retro.outcome}
+{learning.text}
+{fp.description}
+ {fp.stage_id && ( ++ Stage: {retro.stages.find((s) => s.stage_id === fp.stage_id)?.stage_label ?? fp.stage_id} +
+ )} +{item.description}
+| Stage | +Status | +Duration | +Retries | +Cost | +Files | +
|---|---|---|---|---|---|
|
+
+ {stage.stage_label}
+
+ {stage.notes && (
+ {stage.notes} + )} + {stage.failure_reason && ( +{stage.failure_reason} + )} + |
+
+ |
+ + {formatDuration(stage.duration_ms)} + | ++ 0 ? "text-amber" : "text-ice-300"}> + {stage.retries} + + | ++ {formatCost(stage.cost)} + | ++ {stage.files_touched.length} + | +
{label}
++ {value} +
+| Stage | -Model | -Tokens | -Run time | -Cost | -||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {row.stage} | -{row.model} | -- {formatTokens(row.inputTokens)} / {formatTokens(row.outputTokens)} - | -{row.runtime} | -${row.cost.toFixed(2)} | +
| Stage | +Model | +Tokens | +Run time | +Cost |
|---|---|---|---|---|
| Total | -- | - {formatTokens(totalInput)} / {formatTokens(totalOutput)} - | -{totalRuntime} | -${totalCost.toFixed(2)} | -
| Model | +Stages | +Tokens | +Cost | +
|---|---|---|---|
| {row.model} | +{row.stages} | ++ {formatTokens(row.inputTokens)} / {formatTokens(row.outputTokens)} + | +${row.cost.toFixed(2)} | +
| Total | +{stages.length} | ++ {formatTokens(totalInput)} / {formatTokens(totalOutput)} + | +${totalCost.toFixed(2)} | +