mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-09-06 08:18:58 +00:00
## What Adds a **Context** tab to the stage detail view (`/runs/:id/stages/:stageId`), beside the existing primary tab (Thread / Logs / …) and Debug tab. It surfaces a stage's *deliberate per-visit outputs* — the data the workflow author makes a stage write into shared context, plus the routing hints it emitted: - **Routing** — `preferred_label` and `suggested_next_ids` - **Context writes** — author-set `context_updates` keys This data flow was previously invisible in the UI, which made it hard to debug "why did the next stage get the wrong input / take the wrong edge". ## Why no backend change The per-visit `stage.completed` event already carries `context_updates`, `preferred_label`, and `suggested_next_ids`, and the web UI already fetches it via `useRunStageEvents`. The checkpoint's `node_outcomes` map was rejected as a source: it is keyed by `node_id` only, so it is lossy across visits (`implement@2` would overwrite `implement@1`). ## How - `extractStageContext` (in `stage-renderers/helpers.ts`) reads the `stage.completed` event and filters `context_updates` through an engine-key denylist: `last_stage`, `last_response`, `response.*`, `internal.*`, `current.*`, `command.output`, `human.gate.*`, `parallel.*`. Those are bookkeeping or already shown in the stage's primary tab. - It returns `null` when nothing is left, so the tab stays **conditional** — same pattern as Thread/Logs. It only appears when a stage actually wrote something deliberate. - New `stage-context.tsx` renders the result, reusing `CodeBlock` / `JsonBlock`. - `run-stages.tsx` gains a dynamic `availableTabs` list; `effectiveTab` falls back to `primary` gracefully when the Context tab is absent. ## Verification - `bun run typecheck` clean, `bun test` — 412 pass / 0 fail (4 new tests for the denylist + routing extraction). - Live run `01KS5WBZAE7K8321NHR7KFAHF9` (`context-demo` workflow): the `emit@1` stage emitted `demo.greeting` / `demo.answer` / `demo.payload` plus `preferred_label: "Done"` and `suggested_next_ids: ["exit"]`, and the Context tab rendered them correctly. ## Notes - The second commit adds a small `context-demo` workflow used for that verification — kept separate so it can be dropped independently. - Known limitations (acceptable for v1): data is read from `stage.completed` only, so a stage ending in `stage.failed` shows no tab; parallel stages write `parallel.*` directly to context (denylisted), so they show no tab. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| fabro-web | ||
| marketing | ||
| remotion | ||