mirror of
https://github.com/affaan-m/ECC.git
synced 2026-08-17 21:15:40 +02:00
* fix(skill-evolution): wire Skill PostToolUse tracker so skill-health shows real runs (#2463) recordSkillExecution() had no production callers, so ~/.claude/state/skill-runs.jsonl was never written and `scripts/skills-health.js --dashboard` always reported 0 runs. Adds scripts/hooks/skill-run-tracker.js and registers it as an async PostToolUse hook (matcher: Skill) in posttooluse-dispatcher.js, which is now the single PostToolUse entrypoint on main. Addresses the privacy and bounds review on #2555's sibling PR: - No prompt text is persisted. task_description is synthesized as "Skill invocation: <skill_id>"; tool_input.task_description/description/ prompt are never read. - Every persisted string is bounded and charset-restricted. A skill id is an identifier, so free text, newlines, or an over-long value are dropped rather than truncated and written through. - The JSONL sink is created 0600 and re-tightened on each append, repairing files written before this bound existed. - The sink is capped at MAX_RUN_RECORDS (5000), trimmed oldest-first, so the append-only file can no longer grow without limit. Tests cover the privacy guarantee (no prompt text reaches a record), the identifier bounds, the file mode on POSIX, and the retention cap. * fix(skill-evolution): re-register the tracker for PostToolUseFailure The rebase onto current main dropped the hooks.json entry, which silently resurrected the P1 from the earlier review round: deriveOutcome() still branches on hook_event_name === 'PostToolUseFailure', but the PostToolUse dispatcher does not fan that event out, so the branch was unreachable in production. Hard Skill failures were dropped from telemetry entirely, which inflates the dashboard success rate — the opposite of what #2463 asks for. Restores the dedicated PostToolUseFailure entry (matcher Skill, id post:skill:track, same run-with-flags wrapper and standard,strict gating as the dispatcher registration). Verified end-to-end: a PostToolUseFailure payload piped through run-with-flags now records outcome "failure". Adds a regression test asserting the registration so a future rebase cannot quietly drop it again. --------- Co-authored-by: haelyra <49814733+haelyra@users.noreply.github.com>