Tool lifecycle audit events (proposed/started/finished) omit call_id, breaking correlation of repeated/concurrent tool calls
`TurnEngine._audit()` builds its payload without the tool call's ID:
```python
coworker/engine.py (main, 2d5e52a)
def _audit(self, tool_call: ToolCall, **event: Any) -> None: if self.audit_sink is None: return payload = { **self.audit_context, "tool": tool_call.name, "arguments": tool_call.arguments, **event, } ```
Every ordinary lifecycle call site (`stage="proposed"`, `"started"`, `"finished"`) passes `tool_call` in, but the payload never surfaces `tool_call.id`. So an external audit sink sees `tool`, `arguments`, `stage`, `status`, `reason` — but no way to tell which invocation a `finished` row belongs to.
This is inconsistent with the rest of the system: the conversational message history does retain `tool_call_id` (`role="tool"` messages), and later-added paths like `reviewer_shadow`/`approval_resolved` do pass `call_id=tool_call.id` explicitly at the call site. The common `_audit()` boundary is the one place that doesn't.
Impact: when the same tool+arguments is invoked more than once in a turn (retries, repeated identical calls, concurrent calls), the durable audit stream can show that N `proposed`/`started`/`finished` events occurred, but not which `started` matches which `finished`. A failed attempt followed by a successful retry produces audit rows that cannot be told apart.
Suggested fix: add `call_id=tool_call.id` unconditionally inside `_audit()`'s payload dict, rather than at each of the ~10 call sites individually — narrower, and it can't be missed by a new call site added later.
Repro sketch: invoke the same tool with identical arguments twice in one turn with an `audit_sink` attached; inspect the `proposed`/`started`/`finished` rows — none carry an ID that lets you join a `started` row to its matching `finished` row when there are two in flight.
(Found via an external evaluation harness exercising `TurnEngine` with a deterministic fake provider/tool; happy to share the reproduction if useful.)
Source: andrewyng/openworker