The sink client in DEV-610 was built against the architecture-doc shape
(POST canonical bytes to `/api/v1/handover` with headers) but DEV-611's
dummy-sink speaks a different contract: `POST /api/v1/sink/dummy/deliver`
with a JSON wrapper `{decision_id, payload_hash, payload, approval_ref,
transform_ref}`. The two subtasks therefore never actually talked to each
other.
Reconcile on the dummy-sink's wire format because the sink's extra
fields (decision_id, approval_ref, transform_ref) are mandatory for the
verification-service replay guard and chain checks:
- Switch `sink.Client.Deliver` to take a `DeliverRequest` carrying all
five fields, and parse the handover_ref / log_index out of the sink's
response for the caller.
- Pull `decision_id` from the handover payload's top-level field inside
`transform.Runner.Execute` and plumb it through to the sink, surface
`SinkHandoverRef` on the result.
- Update the mock sink inside `runner_test.go` to accept the new wire
format and assert every wrapper field survives round-trip.
Additionally add `TRANSFORM_DEV_POCKET_ID_TOKEN` /
`TRANSFORM_DEV_WORKLOAD_TOKEN` env vars so the Phase-1 smoke harness can
drive the agent without a Pocket-ID server or a projected SA token
mount; both short-circuit directly to a `StaticToken`.
Co-Authored-By: Paperclip <noreply@paperclip.ing>