taskplane 0.9.2 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -530,7 +530,10 @@ function renderLanesTasks(batch, tmuxSessions) {
530
530
  // Worker stats from lane state sidecar + telemetry badges
531
531
  let workerHtml = "";
532
532
  const telemBadges = task.status !== "pending" ? telemetryBadgesHtml(tel) : "";
533
- const reviewerActive = ls && ls.reviewerStatus === "running";
533
+ // Reviewer sub-row should only appear under the task currently being reviewed,
534
+ // not all tasks in the lane. The lane-state sidecar is per-lane (shared by all
535
+ // tasks in the lane), so check that the sidecar's current taskId matches this task.
536
+ const reviewerActive = ls && ls.reviewerStatus === "running" && ls.taskId === task.taskId;
534
537
  if (ls && ls.workerStatus === "running" && task.status === "running") {
535
538
  const elapsed = ls.workerElapsed ? `${Math.round(ls.workerElapsed / 1000)}s` : "";
536
539
  const tools = ls.workerToolCount || 0;
@@ -170,13 +170,15 @@ export function syncTaskOutcomesFromMonitor(
170
170
  }
171
171
 
172
172
  // Completed tasks => succeeded
173
+ // Use existing endTime if already set — prevents changed=true on every
174
+ // poll tick (lastPollTime differs each tick, causing persist log spam).
173
175
  for (const taskId of lane.completedTasks) {
174
176
  const existing = outcomes.find(o => o.taskId === taskId);
175
177
  changed = upsertTaskOutcome(outcomes, {
176
178
  taskId,
177
179
  status: "succeeded",
178
180
  startTime: existing?.startTime ?? null,
179
- endTime: monitorState.lastPollTime,
181
+ endTime: existing?.endTime ?? monitorState.lastPollTime,
180
182
  exitReason: existing?.exitReason || ".DONE file created by task-runner",
181
183
  sessionName: existing?.sessionName || lane.sessionName,
182
184
  doneFileFound: true,
@@ -193,7 +195,7 @@ export function syncTaskOutcomesFromMonitor(
193
195
  taskId,
194
196
  status: "failed",
195
197
  startTime: existing?.startTime ?? null,
196
- endTime: monitorState.lastPollTime,
198
+ endTime: existing?.endTime ?? monitorState.lastPollTime,
197
199
  exitReason: existing?.exitReason || "Task failed or stalled",
198
200
  sessionName: existing?.sessionName || lane.sessionName,
199
201
  doneFileFound: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taskplane",
3
- "version": "0.9.2",
3
+ "version": "0.9.3",
4
4
  "description": "AI agent orchestration for pi — parallel task execution with checkpoint discipline",
5
5
  "keywords": [
6
6
  "pi-package",