44c67fca91
Salvage rework of PR #44166 (@dolphin-creator) onto current main: - ONE canonical prune marker: _skill_pruned_marker(name) builds '[SKILL_PRUNED: ... reload with skill_view(name='X')]'; both emit sites and the survival presence check use the same string, fixing the original PR's defect where the emitted marker was '[SKILL_PRUNED:' but the presence check looked for '[SKILL_PRUNED]' (re-injection duplicated markers that had survived). - Phase-1 prune (_prune_old_tool_results) now threads a protected-skill set: skills whose skill_view call is within the last 10 messages, in the protected tail, or named in a tail user message keep their full bodies. Pass-4 pressure demotion deliberately overrides the guard so the #61932 dead-end shape cannot return. - P2 deterministic marker survival: skill names are extracted from the summarizer INPUT (and the previous summary) before the aux LLM call and any dropped canonical markers are re-injected afterward under a '## Pruned Skills' section — routed through _redact_compaction_text, appended to the summary body only (never in front of SUMMARY_PREFIX or scaffolding start-of-content markers; classify_summary_content is unaffected). Same treatment on the static fallback path, re-applied after its size cap since truncation cuts exactly where markers land. - Summarizer prompt gains a '## Pruned Skills' copy-verbatim section. Fixes #32106.