Scope events export when their OWNING scope closes. Turn scopes close every turn; session scopes close only at session end. Marks were attached to the session handle, so a long-lived conversation — a Slack thread open all day, the normal enterprise case — emitted no approval or turn marks for hours, and none at all if the process died first. Audit dashboards showed an empty approval table while approvals were demonstrably firing; the operator had to end the session to see anything. Attach marks to the live turn handle when one exists for the mark's session (active_turn already validates live/same-profile/same-session/ unreleased), falling back to the session handle otherwise — correct for session-level events like session.end and for marks emitted outside a turn. Parentage semantics are unchanged: the turn is a child of the session, so the session tree is identical, only export cadence changes from per-session to per-turn. |
||
|---|---|---|
| .. | ||
| browser | ||
| context_engine | ||
| cron_providers | ||
| dashboard_auth | ||
| disk-cleanup | ||
| google_meet | ||
| hermes-achievements | ||
| image_gen | ||
| kanban | ||
| memory | ||
| model-providers | ||
| observability | ||
| platforms | ||
| security-guidance | ||
| spotify | ||
| teams_pipeline | ||
| video_gen | ||
| web | ||
| __init__.py | ||
| plugin_utils.py | ||