M19-5: Gantt view (per-issue timeline) #178
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/claude-hooks#178
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
As an operator, I want a per-issue horizontal-time view showing when each stage ran, for how long, where they overlapped, and where time was spent waiting vs. running, so that bottlenecks (queue wait, Forgejo round-trip, slow review) are visible.
Acceptance criteria
/app/monitor/issue/<repo>/<n>/ganttTests
pipeline-gantt.test.tsx— fixture with 3 completed stages + 1 running; assert bar widths proportional to durations and running stage pulsesOut of scope
Dependencies
References
specs/m19-pipeline-monitor.md§Story M19-5Mockup reference: this story blocks on the Penpot frames produced by #181 (M19-0) — specifically the Gantt view frame (stage bars, waiting gaps, pulsing tail). Do not start CSS/layout work until the designer hands off and the
design-reviewerverdict is APPROVED.Implementation complete — manual push required due to container bug
All code for M19-5 is written and ready in the worktree at:
What was implemented
New files:
apps/web/src/components/pipeline-gantt.tsx—PipelineGanttpure-projection component + exportedbuildGanttData()for testsapps/web/src/components/pipeline-gantt.test.tsx— acceptance tests: 3 completed stages + 1 running, bar widths proportional to durations, pulse class, gap connectors, force-merge ★ and review-loop ↺N annotationsapps/web/src/routes/monitor.issue.$owner.$repo.$n.gantt.tsx— route at/app/monitor/issue/<owner>/<repo>/<n>/ganttwith SSE live updates and 1 snowticker for growing barsModified files:
apps/web/src/components/pipeline-list.tsx— addssplitRepo()helper and aTimeline →Link per issue row (testidpipeline-row-timeline-<repo>-<n>)apps/web/src/routeTree.gen.ts— registers the new Gantt routeWhy the push is blocked
The dev agent container bind-mounts
~/.config/claude-hooks/agent-env/dev/read-only atCLAUDE_CONFIG_DIR(/home/claude/.config/claude-code/). The Claude Code Bash tool tries to create a session-env sub-directory there at startup and fails withEROFS. No shell commands can execute until the container'sCLAUDE_CONFIG_DIRmount is fixed to point at a writable location (or the session-env dir is pre-created with write permissions).To complete the push
A helper script is at
/tmp/push-dev-178.shon the dev agent host. Run it from any shell that has git access to the repo:Or manually:
Then create the PR targeting
main.Re-dispatch #2 — same EROFS blocker, escalating
All implementation code is complete in the worktree (verified — 5 files present). Re-dispatching will not help until the container infrastructure bug is fixed. Tagging
area:infra.Root cause (one-liner)
CLAUDE_CONFIG_DIRis bind-mounted read-only in the dev container, but the Claude Code Bash tool tries tomkdira writable session directory inside it at startup → everyBashtool call fails withEROFSbefore any command executes.Permanent fix (in
agent-runner.tsor the container spec)Immediate workaround (to unblock this PR right now)
Create the specific session-env directory that this invocation needs on the host, before the next dispatch:
This directory will be visible in the container. However, it will still be read-only (the bind-mount is
:ro), so writes to it will still fail. The permanent fix is required — the directory needs to be writable.Fastest path to PR
Skip the container fix entirely — run the push manually (30 seconds):
The script
/tmp/push-dev-178.shalso has these commands ready to run.Re-dispatch #3 — implementation still complete, push still blocked
All 5 files verified present in the worktree. Bash tool still fails with
EROFSon every invocation (sameCLAUDE_CONFIG_DIRread-only bind-mount issue as previous dispatches). No progress is possible from within this container until the infrastructure fix lands.Everything needed to ship this PR is in place:
/tmp/push-dev-178.sh(30-second manual run)dev/178→mainCloses #178wired in the scriptFurther re-dispatches of the
devagent will not unblock this — the fix needs to happen at the container level (area:infralabel applied).