Show task, active project and workspace per control board row (#1503)

Gate A fix asked by the professor session on Jason's behalf. Each row
now carries three derived fields, shown as "unknown" when the log and
tmux do not hold them:

- task: the session's first user message (pi logs have no task envelope)
- workspace: the live pane path of the pane running pi, else session cwd
- activeProject: basename of the nearest git checkout above the workspace

tmuxInspect replaces the bare liveness call in the CLI and returns
{ alive, workspace }; tmuxIsAlive stays as a wrapper. The grouping column
and seen.json keys are unchanged. Fixture test per field, tmux parse
tests, page test; missing launcher signals are recorded in the plan page.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
2026-09-12 09:52:45 -05:00
co-authored by Claude Fable 5.1
parent 6ec253de20
commit 4a7e16c3ec
9 changed files with 321 additions and 26 deletions
+23
View File
@@ -2040,3 +2040,26 @@ packages/mosaic 69/69. Live check at 14:27Z on the real board: orch-01
(assistant + toolCall) working, rev-code-01 (tool result last) working,
velma (text-only, stop) waiting. Sonnet review: APPROVED, no findings.
No seat changed state because of this change; it closes a gap, not a bug.
## 2026-09-12 — Control board step 3, Gate A fix: task, project, workspace per row (#1503)
Before: a row said who and what state, but not what the seat was asked to
do or where it was working. Jason asked (through the professor session)
for task, project and workspace per row, with "unknown" instead of a guess.
After: readSession records the first user message (task); tmuxInspect
reads `#{pane_current_command}\t#{pane_current_path}` and returns
{ alive, workspace }; findRepoRoot walks up from the workspace to the
nearest `.git` directory or worktree file (activeProject). The grouping
column and seen.json keys are unchanged. Page: Task and Active project
columns in all three tables, Task, Active project and Workspace in the
detail row, every value through esc(), nulls shown as "unknown". Tests:
six fixture tests (task from blocks, task from a string, no task, workspace
tmux/cwd/none, activeProject dir/file/none, record on disk) plus parsePanes
and two tmuxInspect tests and one page test. Suites: control-board 79/79,
packages/mosaic 69/69. Live check at 14:51Z on a scratch server (port
7332): 42 rows, all three fields derived on every row, 16 workspaces from
a live pane, the rest from the log; every fleet seat reads `.mosaic` as
its active project because `~/.mosaic` is a git checkout and the roster
names no project. Missing launcher signals are listed in the plan page
Step 3 log. Sonnet review: APPROVED, no findings.