Skip to content

Commit fffef83

Browse files
solomonneascodex
andauthored
feat(run): type worker failure receipts (#589)
Co-authored-by: Codex <codex@openai.com>
1 parent 31e4ad5 commit fffef83

5 files changed

Lines changed: 687 additions & 2 deletions

File tree

src/brigade/run_receipts.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from . import agents, localio
1010
from .run_transport import Assignment, WorkerAttempt, WorkerResult
11+
from .worker_failure import normalized_failure
1112

1213

1314
def assignment_payload(assignments: list[Assignment]) -> list[dict[str, object]]:
@@ -38,6 +39,16 @@ def worker_payload(results: list[WorkerResult]) -> list[dict[str, object]]:
3839
entry["failure_phase"] = result.failure_phase
3940
if result.failure_kind is not None:
4041
entry["failure_kind"] = result.failure_kind
42+
if not result.ok:
43+
failure = normalized_failure(
44+
failure_phase=result.failure_phase,
45+
failure_kind=result.failure_kind,
46+
detail=result.detail,
47+
timed_out=result.timed_out,
48+
status=result.status,
49+
)
50+
if failure is not None:
51+
entry["failure"] = failure.payload()
4152
if result.transport_warning is not None:
4253
entry["transport_warning"] = dict(result.transport_warning)
4354
if result.thread_id is not None:
@@ -73,12 +84,15 @@ def worker_payload(results: list[WorkerResult]) -> list[dict[str, object]]:
7384
if result.endpoint_host is not None:
7485
entry["endpoint_host"] = result.endpoint_host
7586
if result.attempts:
76-
entry["attempts"] = [_attempt_payload(attempt) for attempt in result.attempts]
87+
entry["attempts"] = [
88+
_attempt_payload(attempt, attempt_number=index)
89+
for index, attempt in enumerate(result.attempts, start=1)
90+
]
7791
payload.append(entry)
7892
return payload
7993

8094

81-
def _attempt_payload(attempt: WorkerAttempt) -> dict[str, object]:
95+
def _attempt_payload(attempt: WorkerAttempt, *, attempt_number: int) -> dict[str, object]:
8296
payload: dict[str, object] = {
8397
"kind": attempt.kind,
8498
"worker": attempt.worker,
@@ -99,6 +113,17 @@ def _attempt_payload(attempt: WorkerAttempt) -> dict[str, object]:
99113
payload["stdout_log"] = attempt.stdout_log
100114
if attempt.stderr_log is not None:
101115
payload["stderr_log"] = attempt.stderr_log
116+
if not attempt.ok or attempt.failure_phase is not None or attempt.failure_kind is not None:
117+
failure = normalized_failure(
118+
failure_phase=attempt.failure_phase,
119+
failure_kind=attempt.failure_kind,
120+
detail=attempt.detail,
121+
timed_out=attempt.timed_out,
122+
status="",
123+
attempt=attempt_number,
124+
)
125+
if failure is not None:
126+
payload["failure"] = failure.payload()
102127
return payload
103128

104129

src/brigade/run_transport.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ class WorkerAttempt:
5050
stderr: str | None = None
5151
stdout_log: str | None = None
5252
stderr_log: str | None = None
53+
detail: str = ""
54+
ok: bool = True
55+
timed_out: bool = False
5356

5457

5558
def _attempt_timestamp() -> str:
@@ -123,6 +126,9 @@ def _worker_attempt(
123126
selected=selected,
124127
stdout=result.stdout,
125128
stderr=result.stderr,
129+
detail=result.detail,
130+
ok=result.ok,
131+
timed_out=result.timed_out,
126132
)
127133

128134

0 commit comments

Comments
 (0)