DL-365
compass.v1.AgentAttribution regains owner_handle (field 2 — the slot DL-186’s wire-compat strip freed), populated at the three parse sites that already produce it and discard it (stripBodyToRef in go/internal/forge/githubapp_webhook.go, linearCommentRef in go/internal/linearagent/data_event.go, detectArtifact in go/internal/ingest/notify_detect.go) from forge.Author.OwnerHandle (Author in go/internal/forge/owner.go). AMENDS — does not reverse — the “owner is an account property, resolved server-side, never restated per artifact” clause DL-094 wrote and DL-186 carried forward: that clause was scoped to attribution as a DISPLAY fact (the board renders a bare @handle), and its “resolved server-side” escape hatch does not survive an identity-MATCHING consumer, because the only server-side key available for a comment actor is the bare agent handle, which is unique only per (tenant_id, owner_user_id, handle) (go/internal/store/migrations/0001_init.sql) — the exact ambiguity owner-qualification exists to resolve. Neither DL-094 nor DL-186 weighed a matching consumer; DL-338’s self-origin suppression is the first, and without the owner half its COMMENT/REVIEW arm is structurally inert. Attribution stays a display fact, not a trust claim (DL-094’s core semantics unchanged) — it now carries both halves of the identity it already parsed. forge.ForgeEvent additionally gains an internal Actor *AgentAttribution carrying the same owner-qualified attribution for kinds with no CommentRef (STATE, populated by RIG-3331). DL-186 stays Active: its wire-compat-strip clause is untouched
Status: Active (Matt, 2026-09-05)