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,