Condense memory
Skill event4u-app/agent-config/dist/agent-src/skills/condense-memory
Use when shrinking always-loaded memory files (AGENTS.md, CLAUDE.md, .cursorrules) exceeding ~150 lines or ~4,000 chars — telegraph grammar, refuses sensitive paths, .original.md round-trip.From its SKILL.md
npx -y skills add event4u-app/agent-config --skill condense-memoryAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 7 stars7 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
10.3 KB, ~2.6k tokens by cl100k_base, as published. Nobody here has run it
condense-memory
Experimental. Output-side telegraph dialect did not meet kill-criterion in
internal/bench/reports/telegraph-v1.md(vs_tersemedian −9.27 %). Input-side memory condensation is orthogonal use case: savings target always-loaded memory budget, not reply stream. Treat ship-criterion as per-target measurement, not v1 verdict.
When to use
Use when:
- Always-loaded memory file (
AGENTS.md,CLAUDE.md,.cursorrules,GEMINI.md,.windsurfrules) close to or above host tool's char budget and maintainer wants to recover input-token headroom. - Consumer-shipped
templates/AGENTS.mdfailingagents-md-thin-rootcap and pointer-extraction options exhausted. - Maintainer asks to "condense this memory file" or "shrink AGENTS.md" or names input-side telegraph.
Do NOT
- Condense reply, commit message, PR body, ticket summary, or any deliverable written for human reader — those are carve-outs in
telegraph-speak § Carve-outsand stay verbatim. - Condense path matching sensitive-file denylist (
.env*,.netrc,credentials*,secrets*,id_rsa*,*.pem|key|p12|pfx|crt|cer|jks,.ssh/*) — script refuses withSensitivePathErrorand so should you. - Condense generated file (
dist/agent-src/,.augment/,.claude/,.cursor/,.clinerules/,.windsurfrules) — edit source in.agent-src.uncondensed/and regenerate via package's sync + generate-tools scripts (scripts/condense.sh --sync+scripts/condense.ts --generate-tools). - Hand-edit condensed memory file in place — run
--decondensefirst; next condense pass refuses on body-hash drift (CondensationRefused). - Commit condensed file without committing matching
.original.mdbackup — round-trip breaks otherwise.
Procedure
- Analyse target first. Before any write, inspect target with
vieworwc -lto confirm it is always-loaded memory file (AGENTS.md,CLAUDE.md,.cursorrules,GEMINI.md,.windsurfrules), not generated, and has prose paragraphs to condense (pointer-only Thin-Root file may net near-zero). Skip rest of procedure if any check fails. - Check denylist gate. Run
./scripts-run src/scripts/condense_memory <path> --check— exit 0 = safe; exit 2 = denylist hit, stop and surface refusal. - Record baseline.
wc -c <path>— capture pre-condensation char count for commit message. - Condense.
./scripts-run src/scripts/condense_memory <path>. Script writes<path>.original.md(verbatim backup) and rewrites<path>withoriginal_sha256:+condensed_at:frontmatter. - Inspect diff. Eyeball every Iron-Law fence, numbered-options block, code fence, backtick span,
❌/⚠️/✅line, and frontmatter pair — all must be byte-identical. Body prose may have lost articles (the/a/an) and auxiliaries (is/are/was/be/that/which). - Validate idempotency. Re-run
./scripts-run src/scripts/condense_memory <path>— clean re-run is no-op (body hash matches). Non-zero exit = stop, escalate. - Commit both files together.
<path>and<path>.original.mdship as pair. Backup is rollback path; never commit one without other. - Rollback path. If readability fails review at step 5:
./scripts-run src/scripts/condense_memory <path> --decondenserestores backup and deletes.original.md.
Output format
Maintainer-facing report after invoking script MUST contain, in this order:
- Diff line — pre/post
wc -cas single line (AGENTS.md: 2,891 → 2,453 chars (−15.1 %)). - Backup path — full path of
.original.mdbackup so maintainer can verify it landed on disk. - Carve-out check — one line confirming seven carve-out classes round-tripped (
carve-outs: 7 classes preserved · idempotent re-run: clean). - Exit-code surface — on failure, surface verbatim exit code and exception name (
SensitivePathError → exit 2,CondensationRefused → exit 3,FileNotFoundError → exit 4); do not paraphrase.
Do not narrate algorithm, grammar rules, or carve-out theory — rule and this skill document contract; output reports result.
Carve-outs — byte-for-byte preserved
Mirrors seven carve-out classes in telegraph-speak. Condensation engine in src/scripts/condense_memory.ts preserves:
- Triple-backtick fences — any language, any depth.
- Numbered-options lines —
^>?\s*\d+\.\splus**Recommendation:**/**Empfehlung:**label. - Backtick spans — file paths, command names, identifiers inside body prose.
- Status / error markers — lines starting with
❌,⚠️,✅. - Iron-Law ALL-CAPS lines —
^[A-Z][A-Z0-9 ,.\-_/']{3,}$. - Frontmatter blocks —
---fence pairs at head of file. - Mode markers per
role-mode-adherence.
Mangling any of these breaks Iron-Law surface host tool reads. Unit tests in tests/scripts/condense_memory.test.ts lock each carve-out class as regression case.
Idempotency contract — Step 9 guard
Script is idempotent on clean re-runs: running it twice on same target is no-op because body hash matches recondensed hash. Script refuses on body drift:
| State | Outcome |
|---|---|
| No frontmatter SHA marker | Condense + write backup + inject SHA. |
| SHA marker present, body re-condenses to same hash | No-op (return target unchanged). |
| SHA marker present, body hash diverged | Refuse with CondensationRefused exit 3. |
If you need to edit condensed memory file, run --decondense first, edit restored .original.md content, then re-run condenseor. Never hand-edit condensed body — next CI run will either silently corrupt your edit (if it happens to re-condense to same shape) or hard-fail next condense pass.
Sensitive-path gate
Every read path passes through src/scripts/validate_safe_paths.ts assert_safe() before bytes leave disk. Gate is security floor for Phase 2 (input-side condensation) per step-16-telegraph-substance.md Phase 0; rollback of gate is rollback of this skill.
CLI exit codes:
0— condense / decondense / check succeeded.2—SensitivePathError(path matched denylist).3—CondensationRefused(body hash diverged from frontmatter SHA).4—FileNotFoundError(no.original.mdbackup to restore).
Gotchas
- Body-hash drift after manual edit — hand-editing condensed body breaks
original_sha256:invariant. Next condense pass refuses withCondensationRefused(exit 3). Recovery:--decondense, edit restored body, re-condense. .original.mdbackup missing on--decondense— exit 4 (FileNotFoundError). Either someone deleted backup or--decondensealready ran. Restore from git history; never regenerate backup by hand (regenerated content would not be byte-identical).- Denylist false positive — sensitive-looking filename outside denylist surface (project-specific naming) will still pass
assert_safe(). Denylist necessary but not sufficient; maintainer responsible for never feeding secrets to condenseor. - Frontmatter ordering with existing keys — if target already has frontmatter, condenseor preserves existing keys, drops any prior
original_sha256:/condensed_at:entries, and appends new pair. Other agents reading file should treat SHA + timestamp pair as canonical condensation marker, not file size. - Negative savings on pointer-heavy files —
templates/AGENTS.mdalready following Thin-Root (≥ 40 % pointers, ≥ 60-char why-clauses) has little prose left to drop; condensation may net near-zero or even add bytes via frontmatter. Runagents-md-thin-rootfirst to maximise pointer share, then measure whether this skill still pays. - Generated-tree drift — condensing
.agent-src.uncondensed/templates/AGENTS.mddoes NOT propagate to.augment/,.claude/, etc. until package's sync + generate-tools scripts run (scripts/condense.sh --sync+scripts/condense.ts --generate-tools). Always regenerate after condensing templated file.
Measurement — when to condense
No published telegraph-v2 baseline for input-side savings yet (Step 11 of step-16-telegraph-substance.md ships that). Until then, maintainer judges per-target whether condensation pays its readability cost. Suggested workflow:
wc -c <path>before — record baseline char count../scripts-run src/scripts/condense_memory <path>— condense + back up.wc -c <path>after — record post-condensation char count.- Eyeball diff: does prose stay legible? Are all Iron-Law fences intact?
- If yes → commit both
<path>and<path>.original.md. If no →--decondense.
Future telegraph-v2.md will tabulate realised input-token saving against agents-md-thin-root 40 % pointer-ratio constraint so maintainer has numerical floor.
Cross-references
telegraph-speak— runtime rule script mirrors for input-side targets;telegraph.speak_scopedoes not gate this script (input-side runs regardless).src/scripts/validate_safe_paths.ts— Phase 0 gate; ported from upstream Telegraph63a91ec.src/scripts/condense_memory.ts— implementation.tests/scripts/condense_memory.test.ts— regression locks for each carve-out + idempotency + denylist.docs/contracts/condensation-default-kill-criterion.md— v1 verdict (output-side; informs but does not gate this skill).agents-md-thin-root— caps consumer-shippedtemplates/AGENTS.md; this skill is one tool to land under cap.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.