mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-10 18:45:53 +00:00
e4e43c3f11
The 30d window said 18 of 26 approved action attempts failed but carried zero cause information. Every approved attempt that is not a verified success now lands in exactly one content-free bucket: - pre_dispatch: terminally refused before dispatch (plan drift, expiry, emergency stop, policy authorization) - execution: dispatched execution failed or ended inconclusive - unverified: execution succeeded but outcome verification was not confirmed (reads as success in the UI, counted as failure here) - stuck_executing: still executing over an hour after dispatch plus one sanitized machine reason code for the most recent failure. Successes, failure buckets, and recent in-flight attempts partition the attempt count, so the next window explains its own gap. RefuseActionExecution now persists the specific refusal code (plan_drift, action_plan_expired, ...) as the canonical execution reason code instead of the generic pre_dispatch_refused, so audit truth and telemetry distinguish refusal causes without message parsing. Privacy disclosures updated in both PRIVACY.md copies; the adoption report script surfaces the new counters. Contract-Neutral: additive content-free telemetry counters + specific pre-dispatch refusal reason codes; privacy disclosures updated in-commit per security-privacy extension point