feat(dashboard): show lane parallelization in wave chips + task title in lane view (#484, #485)#550
Merged
HenryLach merged 1 commit intoMay 7, 2026
Conversation
… in lane view (#484, #485) Two dashboard enhancements addressing #484 and #485 in a single PR. #484 — Lane parallelization in wave indicator chips: - Adds formatWaveLaneBreakdown() in app.js that groups a wave's tasks by lane, joining same-lane tasks with → (serial) and different-lane tasks with | (parallel). Within a lane, tasks render in execution order (per lane.taskIds), not appearance order. - Wave chip example: 'W1 [TP-165 → TP-166 | TP-168 | TP-167]'. - Title attribute on each chip exposes a multi-line tooltip: 'W1\n L1: TP-165 → TP-166\n L2: TP-168\n L3: TP-167'. - Future waves with no lane data fall back to the previous flat comma-separated display — no regression for unprovisioned waves. - No server changes needed: lanes data is already exposed via /api/state. #485 — Task title under task ID in lane view: - Adds parseTaskTitle(taskFolder) in server.cjs, reading the human- readable title from PROMPT.md's '# Task: <ID> - <title>' first-line heading. Cached per-folder for the server lifetime since the prompt header is immutable above the --- divider. - /api/state task records now include 'taskTitle' alongside 'statusData'. - app.js task-row rendering wraps the task-id cell in a flex column with the ID on top and the title as a smaller muted subtitle underneath. Falls back gracefully (no subtitle div) when title is null. - New CSS: .task-id is now flex-column; .task-id-line preserves the monospace ID look; .task-title-subtitle is the smaller muted line. Validation: - Logic unit-tested in isolation: 4 scenarios for formatWaveLaneBreakdown (issue example, scrambled appearance order, future wave fallback, empty input) — all pass. - Visual validation deferred to next live batch run (operator's choice; both changes are display-only and cannot affect orch correctness even if rendered imperfectly). Per supervisor primer: this PR touches dashboard/ files, so the operator should restart the dashboard server after integration to pick up the new server-side parseTaskTitle logic.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two dashboard enhancements bundled in one PR. Both are display-only — cannot affect orchestrator correctness even if rendered imperfectly. Visual validation will happen during the next live batch run.
#484 — Lane parallelization in wave indicator chips
Before:
W1 looks like 4 independent tasks. In reality TP-165→TP-166 are serialized on lane 1 while TP-168 and TP-167 run in parallel on lanes 2 and 3.
After:
Same-lane tasks join with
→(serial). Different-lane tasks join with|(parallel). At a glance:|separators = number of parallel lanes used in the wave→arrows = serialized tasks on a single laneHover tooltip on each chip exposes the expanded lane breakdown:
Implementation
formatWaveLaneBreakdown(taskIds, lanes, waveNumber)indashboard/public/app.jslane.taskIds), not by their appearance order in the wave's task listlanesdata is already exposed via/api/state#485 — Task title under task ID in lane view
Before:
After:
Operator no longer needs to remember what each TP-XXX means.
Implementation
parseTaskTitle(taskFolder)indashboard/server.cjsreads the title from PROMPT.md's# Task: <ID> - <title>first-line heading. Regex:/^# Task:\s*\S+\s*[-—–]\s*(.+?)\s*$/m(handles dash, em-dash, en-dash separators).---divider so the title never changes mid-batch./api/statetask records now carry ataskTitlefield alongside the existingstatusData.taskTitleis null..task-idis now flex-column;.task-id-linepreserves the monospace ID look;.task-title-subtitleis the smaller muted line with ellipsis truncation for long titles.Validation
formatWaveLaneBreakdown:TP-165 → TP-166 | TP-168 | TP-167✓parseTaskTitle(purely additive read of PROMPT.md, cached, fail-safe to null)Operator note
Per the supervisor primer rule, after this PR merges and a new dashboard binary lands, restart the dashboard server to pick up the new server-side
parseTaskTitlelogic. Frontend-only changes refresh on browser reload, but the new API field requires a server restart.Closes