Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
2cc6c52
docs: specify flow replay viewer semantics
osolmaz Mar 27, 2026
8e0e4e3
docs: tighten replay viewer presentation rules
osolmaz Mar 27, 2026
29ea97c
docs: remove redundant replay viewer chrome
osolmaz Mar 27, 2026
a66504d
feat: tighten replay viewer flow inspection
osolmaz Mar 27, 2026
39e7526
fix: keep empty ACP session pane full height
osolmaz Mar 27, 2026
4f22282
fix: move replay transport into graph footer
osolmaz Mar 27, 2026
95693f4
fix: tighten replay footer and empty session layout
osolmaz Mar 27, 2026
81141e3
fix: stretch replay viewer to full viewport height
osolmaz Mar 27, 2026
3d6507c
fix: simplify ACP session conversation styling
osolmaz Mar 27, 2026
272295c
fix: widen replay viewer user bubbles
osolmaz Mar 27, 2026
261cb88
fix: remove replay viewer session notes
osolmaz Mar 27, 2026
99c5e47
docs: specify continuous replay behavior
osolmaz Mar 27, 2026
34c29ea
feat: add continuous replay playback
osolmaz Mar 27, 2026
a69c61f
fix: remove replay viewer message outlines
osolmaz Mar 27, 2026
97e685c
fix: simplify replay viewer chrome
osolmaz Mar 27, 2026
d81c856
fix: tighten replay playback behavior
osolmaz Mar 27, 2026
49cf30c
feat: support replay viewer session switching
osolmaz Mar 27, 2026
e037aba
fix: remove replay viewer session details
osolmaz Mar 27, 2026
3769abc
fix: improve replay viewer terminal layout
osolmaz Mar 27, 2026
7072fc3
fix: stream only assistant turns in replay
osolmaz Mar 27, 2026
16d5f25
feat: add follow mode to replay viewer
osolmaz Mar 27, 2026
05c316e
refactor: split replay viewer internals
osolmaz Mar 27, 2026
a9cee1b
fix: normalize replay start behavior
osolmaz Mar 27, 2026
1a5e7d1
fix: stabilize replay viewer camera layout
osolmaz Mar 27, 2026
0d04c70
feat: use ELK for replay viewer layout
osolmaz Mar 27, 2026
ac0888f
fix: clamp replay scrubber at timeline end
osolmaz Mar 27, 2026
4ef3883
feat: add replay speed controls
osolmaz Mar 27, 2026
61d7227
fix: keep replay controls centered
osolmaz Mar 27, 2026
7b6a2a9
fix: move replay camera controls into graph
osolmaz Mar 27, 2026
7d50add
fix: remove duplicate replay speed control
osolmaz Mar 27, 2026
9c7e1ff
fix: reset replay sessions on non-acp steps
osolmaz Mar 27, 2026
99173f7
fix: keep pr triage ci monitoring in one step
osolmaz Mar 28, 2026
5a6c9cc
feat: keep selected replay run in the URL
osolmaz Mar 28, 2026
3361743
feat: use path-based replay run URLs
osolmaz Mar 28, 2026
eb95682
fix: tighten replay viewer controls
osolmaz Mar 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
741 changes: 741 additions & 0 deletions docs/2026-03-27-flow-replay-viewer.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion examples/flows/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ They range from small primitives to one larger end-to-end example.
- `echo.flow.ts`: one ACP step that returns a JSON reply
- `branch.flow.ts`: ACP classification followed by a deterministic branch into either `continue` or `checkpoint`
- `pr-triage/pr-triage.flow.ts`: a larger single-PR workflow example with a colocated written spec in `pr-triage/README.md`
- `replay-viewer/`: a browser app that visualizes saved flow run bundles with React Flow, a recent-runs picker, and ACP session inspection
- `replay-viewer/`: a browser app that visualizes saved flow run bundles with React Flow, a recent-runs picker, ACP session inspection, and a dedicated viewer spec in `docs/2026-03-27-flow-replay-viewer.md`
- `shell.flow.ts`: one native runtime-owned shell action that returns structured JSON
- `workdir.flow.ts`: native workspace prep followed by an ACP step that runs inside that isolated cwd
- `two-turn.flow.ts`: two ACP prompts in the same implicit main session
Expand Down
2 changes: 1 addition & 1 deletion examples/flows/pr-triage/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ These are the current operational timeout assumptions in the single-file executa
- nested local `codex review` inside `collect_review_state`: 30 minutes
- `review_loop`: 90 minutes
- `collect_ci_state`: 15 minutes
- `fix_ci_failures`: 30 minutes
- `fix_ci_failures`: 60 minutes
- `check_final_conflicts`: 20 minutes
- `resolve_final_conflicts`: 30 minutes
- `post_close_pr`: 15 minutes
Expand Down
13 changes: 7 additions & 6 deletions examples/flows/pr-triage/pr-triage.flow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ const flow = {
nodeType: "acp",
session: MAIN_SESSION,
cwd: ({ outputs }) => prepared(outputs).workdir,
timeoutMs: 30 * 60_000,
timeoutMs: 60 * 60_000,
async prompt({ outputs }) {
return promptFixCiFailures(prepared(outputs), outputs);
},
Expand Down Expand Up @@ -366,7 +366,6 @@ const flow = {
switch: {
on: "$.route",
cases: {
collect_ci_state: "collect_ci_state",
check_final_conflicts: "check_final_conflicts",
comment_and_escalate_to_human: "comment_and_escalate_to_human",
},
Expand Down Expand Up @@ -1043,19 +1042,21 @@ function promptFixCiFailures(pr, outputs) {
"Stay on the autonomous CI lane for this single PR.",
`Target PR: ${prRef(pr)}`,
`The CI mechanics have already been collected by the flow runtime in ${ciStatePath}.`,
"Read that local JSON file and the checked-out repo state instead of rerunning broad CI discovery yourself.",
"Start from that local JSON file and the checked-out repo state, then own the CI lane yourself until it reaches a stable green outcome or a real blocker forces escalation.",
`Use the local branch ${pr.localBranch}. If you need to push, use remote ${pr.pushRemote} branch ${pr.pushRef}.`,
"If any relevant GitHub Actions workflow run is approval-blocked, approve it immediately yourself with `gh api -X POST repos/{owner}/{repo}/actions/runs/{run_id}/approve` before making any escalation decision.",
"Treat a workflow run as approval-blocked when its state clearly shows `action_required`, including cases where that appears in the conclusion rather than the status.",
"After you approve a blocked workflow run, route back to `collect_ci_state` so the flow runtime can re-check CI on the updated state.",
"If related failures remain and you can fix them, fix them directly in the repo, run focused checks when feasible, rerun the earlier targeted validation, commit and push the branch yourself, and then route back to `collect_ci_state` so the flow runtime can re-check CI.",
"Do not bounce back to `collect_ci_state` just to wait for CI. If a relevant workflow run is queued or in progress, monitor it yourself with `gh run watch`, `gh pr checks --watch`, or direct `gh api` polling until it reaches a terminal state.",
"If you approve a blocked workflow run successfully, keep monitoring inside this same step until the rerun finishes green, surfaces a real related failure, or hits a real platform/permission blocker.",
"If related failures remain and you can fix them, fix them directly in the repo, run focused checks when feasible, rerun the earlier targeted validation, commit and push the branch yourself, rerun or monitor CI yourself, and stay in this same step until the updated CI reaches a terminal state.",
"Only return from this step once CI is actually green/unrelated, or once you have a real reason that a human must take over.",
`Latest validation summary: ${validation?.summary ?? "none"}.`,
"If CI is green or the remaining failures are clearly unrelated, route to `check_final_conflicts` so the final conflict gate can run before the human handoff.",
"Only route to `comment_and_escalate_to_human` for workflow approval if you actually tried to approve the blocked run and could not clear it because of a real permission or platform failure.",
...exactJsonResponse([
"Return exactly one JSON object with this shape:",
"{",
' "route": "collect_ci_state" | "check_final_conflicts" | "comment_and_escalate_to_human",',
' "route": "check_final_conflicts" | "comment_and_escalate_to_human",',
' "ci_status": "related_failures_remain" | "green_or_unrelated" | "approval_blocked",',
' "summary": "short explanation",',
' "related_failures": ["brief failure"],',
Expand Down
6 changes: 6 additions & 0 deletions examples/flows/replay-viewer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

This example app visualizes one saved flow run bundle at a time.

For the viewer semantics and UX/layout rules, see
[docs/2026-03-27-flow-replay-viewer.md](../../../docs/2026-03-27-flow-replay-viewer.md).

It is separate from the `acpx` CLI surface on purpose:

- `acpx` writes replayable run bundles under `~/.acpx/flows/runs/`
Expand Down Expand Up @@ -45,6 +48,9 @@ bundle outside that default directory.
- the ACP conversation slice for the selected ACP step
- the raw bundled ACP event slice for that step

The full flow definition remains the main graph. The run is shown as an overlay
on that graph rather than replacing it with an execution-only path.

## Included sample

The bundled sample under `public/sample-run/` comes from a real run of
Expand Down
Loading
Loading