From 7e05c83bfa57d542807e767add1c54407c221033 Mon Sep 17 00:00:00 2001 From: Nathan Whitaker Date: Wed, 10 Jun 2026 18:01:40 -0700 Subject: [PATCH] Hide worker log artifacts from assignments --- internal/eventstore/projection.go | 8 +++++++- internal/eventstore/projection_test.go | 10 +++++++++- internal/orchestrator/task_assignments.go | 6 +++++- internal/orchestrator/task_assignments_test.go | 6 ++++++ web/src/main.tsx | 10 +++++++--- 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/internal/eventstore/projection.go b/internal/eventstore/projection.go index 893bd8d..3700500 100644 --- a/internal/eventstore/projection.go +++ b/internal/eventstore/projection.go @@ -475,7 +475,9 @@ func buildManagerSummaries( if !ok { continue } - summary.Artifacts++ + if isManagerVisibleArtifact(artifact.Kind) { + summary.Artifacts++ + } summary.UpdatedAt = latestTime(summary.UpdatedAt, artifact.UpdatedAt) summaries[artifact.TaskID] = summary } @@ -505,6 +507,10 @@ func isTerminalPullRequestState(state string) bool { return strings.EqualFold(state, "MERGED") || strings.EqualFold(state, "CLOSED") } +func isManagerVisibleArtifact(kind string) bool { + return !strings.EqualFold(strings.TrimSpace(kind), "worker_log") +} + func managerSummaryTone(current string, next string) string { rank := map[string]int{"good": 0, "info": 1, "warning": 2, "danger": 3} if rank[next] > rank[current] { diff --git a/internal/eventstore/projection_test.go b/internal/eventstore/projection_test.go index 8f4e56d..00d1381 100644 --- a/internal/eventstore/projection_test.go +++ b/internal/eventstore/projection_test.go @@ -205,15 +205,23 @@ func TestBuildManagerSummariesCountsOnlyCurrentSignals(t *testing.T) { "artifact": { ID: "artifact", TaskID: "task", + Kind: "benchmark", UpdatedAt: base.Add(13 * time.Minute), }, + "worker-log": { + ID: "worker-log", + TaskID: "task", + Kind: "worker_log", + Name: "Remote stdout", + UpdatedAt: base.Add(14 * time.Minute), + }, } steering := map[string]core.SteeringItem{ "steering": { ID: "steering", TaskID: "task", Status: "pending", - UpdatedAt: base.Add(14 * time.Minute), + UpdatedAt: base.Add(15 * time.Minute), }, } diff --git a/internal/orchestrator/task_assignments.go b/internal/orchestrator/task_assignments.go index 7dbf245..c5a35be 100644 --- a/internal/orchestrator/task_assignments.go +++ b/internal/orchestrator/task_assignments.go @@ -659,7 +659,7 @@ func (b *taskAssignmentBuilder) addPullRequestDisplayRows(pullRequests []core.Pu func (b *taskAssignmentBuilder) addArtifactDisplayRows(artifacts []core.Artifact, task core.Task) { for index, artifact := range artifacts { - if artifact.TaskID != b.taskID { + if artifact.TaskID != b.taskID || !isManagerVisibleArtifact(artifact.Kind) { continue } key := nonEmpty(artifact.ID, artifact.Ref, artifact.URL, fmt.Sprintf("%s-%d", humanizeAssignmentKey(artifact.Kind), index+1)) @@ -806,6 +806,10 @@ func isDisplayWorkItemStatus(status core.WorkItemStatus) bool { return status == core.WorkItemQueued || status == core.WorkItemRunning } +func isManagerVisibleArtifact(kind string) bool { + return !strings.EqualFold(strings.TrimSpace(kind), "worker_log") +} + func isActiveAssignmentStatus(status string) bool { normalized := strings.ToLower(strings.TrimSpace(status)) return normalized == "pending" || normalized == "queued" || normalized == "running" diff --git a/internal/orchestrator/task_assignments_test.go b/internal/orchestrator/task_assignments_test.go index 9792be0..02191e9 100644 --- a/internal/orchestrator/task_assignments_test.go +++ b/internal/orchestrator/task_assignments_test.go @@ -281,6 +281,10 @@ func TestBuildTaskAssignmentsDisplayRowsHideHistoricalFailures(t *testing.T) { {ID: "feedback-merged", TaskID: "task-1", PullRequestID: "pr-merged", Status: "pending", Reason: "review", CreatedAt: now, UpdatedAt: now.Add(time.Minute)}, {ID: "feedback-open", TaskID: "task-1", PullRequestID: "pr-open", Status: "pending", Reason: "review", CreatedAt: now, UpdatedAt: now.Add(2 * time.Minute)}, }, + Artifacts: []core.Artifact{ + {ID: "stdout-log", TaskID: "task-1", Kind: "worker_log", Name: "Remote stdout", Ref: "/home/bot/work/worker/stdout.log", CreatedAt: now, UpdatedAt: now.Add(time.Minute)}, + {ID: "benchmark", TaskID: "task-1", Kind: "benchmark", Name: "Benchmark", Ref: "shared/bench.txt", CreatedAt: now, UpdatedAt: now.Add(2 * time.Minute)}, + }, } result, err := BuildTaskAssignments(snapshot, "task-1") @@ -293,12 +297,14 @@ func TestBuildTaskAssignmentsDisplayRowsHideHistoricalFailures(t *testing.T) { displayRowAbsent(t, result.DisplayRows, "execution_node:node-failed") displayRowAbsent(t, result.DisplayRows, "pr:pr-merged") displayRowAbsent(t, result.DisplayRows, "feedback:feedback-merged") + displayRowAbsent(t, result.DisplayRows, "artifact:stdout-log") displayRowByID(t, result.DisplayRows, "work:queued-work") displayRowByID(t, result.DisplayRows, "debug_worker:worker-queued") displayRowByID(t, result.DisplayRows, "execution_node:node-queued") displayRowByID(t, result.DisplayRows, "pr:pr-open") displayRowByID(t, result.DisplayRows, "feedback:feedback-open") + displayRowByID(t, result.DisplayRows, "artifact:benchmark") } func TestBuildTaskAssignmentsMissingTask(t *testing.T) { diff --git a/web/src/main.tsx b/web/src/main.tsx index f0bba4b..4dd87be 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -2572,7 +2572,7 @@ function deriveAssignmentRows({ }); } - for (const [index, artifact] of artifacts.entries()) { + for (const [index, artifact] of artifacts.filter(isManagerVisibleArtifact).entries()) { const artifactKey = artifact.id || artifact.ref || artifact.url || `${humanizeKey(artifact.kind)}-${index + 1}`; rows.push({ id: `artifact:${artifactKey}`, @@ -3246,7 +3246,7 @@ function ObjectiveBrief({ - {(artifacts.length || task.milestones?.length) && } + {(artifacts.some(isManagerVisibleArtifact) || task.milestones?.length) && } {taskError && ( @@ -4539,6 +4539,10 @@ function isTerminalPullRequestState(state: PullRequestState["state"] | undefined return normalized === "MERGED" || normalized === "CLOSED"; } +function isManagerVisibleArtifact(artifact: Artifact): boolean { + return artifact.kind.trim().toLowerCase() !== "worker_log"; +} + function formatDuration(start: string, end: string): string { const startMs = Date.parse(start); const endMs = Date.parse(end); @@ -7073,7 +7077,7 @@ function deriveManagerSummaryForTask(snapshot: AppSnapshot, taskId: string): Man activeWorkers, activeWorkItems, pullRequests: pullRequests.filter((pr) => !isTerminalPullRequestState(pr.state)).length, - artifacts: artifacts.length, + artifacts: artifacts.filter(isManagerVisibleArtifact).length, latestAction, latestActionAt, latestActionLabel,