Attic
First, in the same shell command as anything below, locate the script:
ATTIC_JS=$(ls -d "${CODEX_HOME:-$HOME/.codex}"/plugins/cache/attic/attic/*/skills/attic/scripts/attic.js "${CODEX_HOME:-$HOME/.codex}"/skills/attic/scripts/attic.js "$HOME"/.agents/skills/attic/scripts/attic.js .agents/skills/attic/scripts/attic.js 2>/dev/null | sort -V | tail -1)
You keep the conversation lean. Anything worth remembering goes into the
attic, not into the chat. The chat holds the handle, the attic holds the
detail.
Level requested: $ARGUMENTS (empty means full). If it is off, stop
applying these rules until /attic is run again. Otherwise confirm the level
in one line and continue with the user's task.
Scope
Attic governs what you keep in context. It does not govern how terse your
prose is, or how much code you write. Do not use it for one-line answers,
typo fixes, or anything the user will never need again.
Persistence
ACTIVE EVERY RESPONSE. No drift back to dumping everything into the chat.
Still active if unsure. Off only: /attic off, "stop attic", "normal mode".
Default: full. Switch: /attic lite|full|ultra. Level persists until
changed or session end.
Use the script, not your own bookkeeping
$(dirname "$ATTIC_JS")/../scripts/attic.js owns every mechanical part: slug
hygiene, frontmatter, INDEX and DECISIONS bookkeeping, atomic writes, and
secret detection. Call it. Do not hand-write these files when the script is
available.
node "$ATTIC_JS" stash \
--slug login-test-timeout --kind finding \
--title "Login test times out" \
--hook "5s fixture timeout in tests/conftest.py:41, SMTP call is real" \
--tags tests,flaky \
--body-file /tmp/body.md
node "$ATTIC_JS" recall "login timeout"
node "$ATTIC_JS" index
node "$ATTIC_JS" validate
--kind is one of finding, decision, plan, output, note. Add
--decision-why "<reason>" to also log a line in DECISIONS.md. Long bodies
go through --body-file. Exit code 2 means the script refused because it
detected a credential: redact and retry, never pass --force to smuggle a
secret past it.
Your judgement decides what is worth stashing and writes the prose. The
script decides how it lands on disk.
Rules
Stash after investigating. After any investigation (reading more than
~3 files, a grep sweep, a test run, tracing a flow), stash the conclusion
and reply with the handle plus at most three lines of what matters now.
Never re-explain what is in the attic. Point at the handle. If the
user wants detail, they run /attic-recall <slug>.
Long output never lands in prose. Logs, diffs, dumps, stack traces:
summarise in at most five lines, stash as kind: output with the exact
command, reference the handle. Read big results with head, grep,
tail; do not paste them.
Check the attic before re-reading. .attic/INDEX.md is normally
already in your context from session start. Scan it before opening a file
or re-running a search. If an item answers the question, say so
(per attic:<slug>).
If no index appears in your context and a .attic/ exists in the
project, the session-start injection did not run. Read the index once
yourself and carry on. Do not conclude the attic is empty because
nothing was injected.
Decisions get logged with their why, at the moment they are made.
Sweep before the context gets long, before /compact or /clear, and
at the end of a work session. See /attic-sweep.
Exactness inside items. Code, commands, paths, line numbers and error
text are copied verbatim. Never paraphrase them.
Never stash secrets. The script enforces this; do not work around it.
Intensity
| Level |
What changes |
| lite |
Stash only on explicit /attic-stash, at the end of a task, or when asked to sweep. Normal replies otherwise. |
| full |
All rules above, always on. Default. |
| ultra |
Every non-trivial finding is stashed. Replies are handle + at most three lines. INDEX.md must be consulted before any read or search of something already seen this session. |
| off |
Dormant. Nothing is stashed. |
Example: after tracing why a login test fails.
- lite: normal explanation, then "Want this in the attic?
/attic-stash."
- full: "
attic:login-test-timeout · 5s fixture timeout at tests/conftest.py:41, the SMTP call is real. Raising it to 15s."
- ultra: "
attic:login-test-timeout · fixture timeout, tests/conftest.py:41. Fixing."
Output
Handle first, then what matters now, then the next action. No feature tours,
no recap of what the attic already holds. Explanation the user explicitly
asked for is given in full; the rule is only against unrequested repetition.
Pattern: `attic:<slug>` · <one line> · <next action>
References
Load only when needed:
references/what-to-stash.md — the stash/skip/never call when it is unclear.
references/item-format.md — the on-disk format, for hand-editing without the script.
references/workflow.md — the loop and sweep pipelines, and the boundary with sibling skills.
templates/item.md, templates/session.md — starting shapes.
The best context is the context you do not have to carry.
1---2name: attic-23description: Offloads context. Stashes findings, decisions, plans and long tool outputs into a project-local .attic/ folder and keeps only a one-line index in the conversation, so the live context stays lean and important knowledge survives /compact, /clear and new sessions. Supports intensity levels: lite, full (default), ultra, off. Use on ANY multi-step task that involves investigating a codebase, reading many files, running noisy commands, or making design decisions. Also use whenever the user says "attic", "stash this", "remember this", "save this for later", "put it in the attic", "context is getting long", "before compact", or complains that Claude forgot something after compaction. Do NOT use for one-line answers, typo fixes, or non-coding chat.4license: MIT5---67# Attic89First, in the same shell command as anything below, locate the script:1011```bash12ATTIC_JS=$(ls -d "${CODEX_HOME:-$HOME/.codex}"/plugins/cache/attic/attic/*/skills/attic/scripts/attic.js "${CODEX_HOME:-$HOME/.codex}"/skills/attic/scripts/attic.js "$HOME"/.agents/skills/attic/scripts/attic.js .agents/skills/attic/scripts/attic.js 2>/dev/null | sort -V | tail -1)13```1415You keep the conversation lean. Anything worth remembering goes into the16attic, not into the chat. The chat holds the handle, the attic holds the17detail.1819Level requested: `$ARGUMENTS` (empty means **full**). If it is `off`, stop20applying these rules until `/attic` is run again. Otherwise confirm the level21in one line and continue with the user's task.2223## Scope2425Attic governs **what you keep in context**. It does not govern how terse your26prose is, or how much code you write. Do not use it for one-line answers,27typo fixes, or anything the user will never need again.2829## Persistence3031ACTIVE EVERY RESPONSE. No drift back to dumping everything into the chat.32Still active if unsure. Off only: `/attic off`, "stop attic", "normal mode".33Default: **full**. Switch: `/attic lite|full|ultra`. Level persists until34changed or session end.3536## Use the script, not your own bookkeeping3738`$(dirname "$ATTIC_JS")/../scripts/attic.js` owns every mechanical part: slug39hygiene, frontmatter, INDEX and DECISIONS bookkeeping, atomic writes, and40secret detection. Call it. Do not hand-write these files when the script is41available.4243```bash44node "$ATTIC_JS" stash \45 --slug login-test-timeout --kind finding \46 --title "Login test times out" \47 --hook "5s fixture timeout in tests/conftest.py:41, SMTP call is real" \48 --tags tests,flaky \49 --body-file /tmp/body.md5051node "$ATTIC_JS" recall "login timeout"52node "$ATTIC_JS" index53node "$ATTIC_JS" validate54```5556`--kind` is one of `finding`, `decision`, `plan`, `output`, `note`. Add57`--decision-why "<reason>"` to also log a line in `DECISIONS.md`. Long bodies58go through `--body-file`. Exit code 2 means the script refused because it59detected a credential: redact and retry, never pass `--force` to smuggle a60secret past it.6162Your judgement decides *what* is worth stashing and writes the prose. The63script decides *how* it lands on disk.6465## Rules66671. **Stash after investigating.** After any investigation (reading more than68 ~3 files, a grep sweep, a test run, tracing a flow), stash the conclusion69 and reply with the handle plus at most three lines of what matters now.702. **Never re-explain what is in the attic.** Point at the handle. If the71 user wants detail, they run `/attic-recall <slug>`.723. **Long output never lands in prose.** Logs, diffs, dumps, stack traces:73 summarise in at most five lines, stash as `kind: output` with the exact74 command, reference the handle. Read big results with `head`, `grep`,75 `tail`; do not paste them.764. **Check the attic before re-reading.** `.attic/INDEX.md` is normally77 already in your context from session start. Scan it before opening a file78 or re-running a search. If an item answers the question, say so79 (`per attic:<slug>`).8081 If no index appears in your context and a `.attic/` exists in the82 project, the session-start injection did not run. Read the index once83 yourself and carry on. Do not conclude the attic is empty because84 nothing was injected.855. **Decisions get logged** with their why, at the moment they are made.866. **Sweep before the context gets long**, before `/compact` or `/clear`, and87 at the end of a work session. See `/attic-sweep`.887. **Exactness inside items.** Code, commands, paths, line numbers and error89 text are copied verbatim. Never paraphrase them.908. **Never stash secrets.** The script enforces this; do not work around it.9192## Intensity9394| Level | What changes |95|-------|-------------|96| **lite** | Stash only on explicit `/attic-stash`, at the end of a task, or when asked to sweep. Normal replies otherwise. |97| **full** | All rules above, always on. Default. |98| **ultra** | Every non-trivial finding is stashed. Replies are handle + at most three lines. INDEX.md must be consulted before any read or search of something already seen this session. |99| **off** | Dormant. Nothing is stashed. |100101Example: after tracing why a login test fails.102- lite: normal explanation, then "Want this in the attic? `/attic-stash`."103- full: "`attic:login-test-timeout` · 5s fixture timeout at `tests/conftest.py:41`, the SMTP call is real. Raising it to 15s."104- ultra: "`attic:login-test-timeout` · fixture timeout, `tests/conftest.py:41`. Fixing."105106## Output107108Handle first, then what matters now, then the next action. No feature tours,109no recap of what the attic already holds. Explanation the user explicitly110asked for is given in full; the rule is only against unrequested repetition.111112Pattern: `` `attic:<slug>` · <one line> · <next action> ``113114## References115116Load only when needed:117118- `references/what-to-stash.md` — the stash/skip/never call when it is unclear.119- `references/item-format.md` — the on-disk format, for hand-editing without the script.120- `references/workflow.md` — the loop and sweep pipelines, and the boundary with sibling skills.121- `templates/item.md`, `templates/session.md` — starting shapes.122123The best context is the context you do not have to carry.