attic
Archives idle herdr agent panes before reclaiming them, and keeps a running inventory of what was open.
See the design spec: docs/superpowers/specs/2026-08-13-attic-herdr-agent-archiver-design.md
Install
./install.sh # installs the LaunchAgent, starts PAUSED, puts `attic` on PATH via `uv tool install`
The soak — do this before enabling reaping
attic installs paused. Inventory runs from minute one; reaping is off.
- Let inventory run for a few days:
attic liststays empty, but~/.attic/inventory/fills up. Confirm it is capturing what you expect. - Run
attic reap --dry-rundaily. Read every verdict. Confirm that nothing you care about is ever markedARCHIVE, especially anythingblocked. Dry-run works while paused and reports real idle durations — the clock keeps advancing during a pause, so what you see is what would actually happen. - When the verdicts look right,
rm ~/.attic/PAUSE. Expect the first unpaused tick to act immediately on panes the dry-run has been showing asARCHIVE— they have been genuinely idle the whole time, and the per-tick cap of 3 bounds the burst. - After the first real archive, run
attic restore <id>immediately and confirm the session resumes with its history intact.
Commands
| Command | Effect |
|---|---|
attic tick |
Snapshot inventory, then reap if all guards pass (what launchd runs) |
attic reap --dry-run |
Print a verdict and reason for every pane; change nothing |
attic list |
List archived sessions, newest first |
attic show <id> |
Print an archive's manifest and scrollback (unique prefix works) |
attic restore <id> |
Reopen the session in a new tab; archive is kept |
Pausing
touch ~/.attic/PAUSE # inventory continues, reaping stops
rm ~/.attic/PAUSE # reaping resumes
What gets archived
Only panes that are all of: an agent pane, agent_status == idle, holding a session
UUID, unfocused, with an unchanged revision counter, idle for 4+ hours. At most 3 per tick.
blocked panes are never archived at any age — they are waiting on you.
What scrollback actually contains
herdr pane read returns the pane's rendered terminal frames, including TUI chrome
(status line, box borders, spinners). It is a faithful record of what was on screen, not
a clean transcript. The conversation itself is recovered by claude --resume, which is
what the manifest's resume command does.
attic ui — the control surface
attic ui # needs the tui extra installed (see below)
A three-tab Textual dashboard — Fleet, Activity, Attic — read from the same evaluation
pipeline as attic tick, so what the UI shows and what the reaper will do can't diverge.
Vim motions (never mutate anything — they only move the cursor or switch tabs):
| Key | Effect |
|---|---|
j / k |
cursor down / up |
ctrl+d / ctrl+u |
half page down / up |
ctrl+f / ctrl+b |
page down / up |
gg / G |
jump to top / bottom |
gt / gT |
next / previous tab |
1gt, 2gt, 3gt |
jump to a specific tab |
R |
force an immediate refresh |
q |
quit |
Mutations require typing a : command — pinning, snoozing, archiving, and restoring
never happen on a bare keystroke, deliberately, the same way vim needs : before anything
destructive:
| Command | Tab | Effect |
|---|---|---|
:pin |
Fleet | never reap the selected pane |
:unpin |
Fleet | allow the selected pane to be reaped again |
:snooze <duration> |
Fleet | protect the selected pane until a deadline, e.g. :snooze 4h |
:unsnooze |
Fleet | clear the selected pane's snooze |
:archive |
Fleet | archive and close the selected pane now, skipping the idle threshold |
:restore |
Attic | reopen the selected archived session |
:help |
any | list available commands |
:q / :quit |
any | quit |
The command line captures its target — the selected row — the moment it opens, not when you press Enter, so the 2-second background refresh can never retarget a command you're still typing.
As a herdr plugin
herdr-plugin.toml exposes attic ui as a pane (control) and adds pin/snooze
context actions on any pane, so pinning or snoozing a session doesn't require switching
to the attic tab at all. Install by linking the plugin per herdr's plugin docs; every
command it runs goes through uv run --extra tui --project ., so it needs no separate
environment setup beyond what ./install.sh or uv sync --extra tui already provides.
Configuration
~/.attic/config.json, all keys optional:
{
"idle_threshold_hours": 4.0,
"per_tick_cap": 3,
"archive_retention_days": 30,
"inventory_retention_days": 90,
"herdr_protocol": 19,
"quiet_hours": "22:00-08:00"
}
quiet_hours
An overnight window, in your machine's local time, during which nothing is
archived and the idle clock is continuously reset. Omit it (or set null) to
disable — that is the default.
Without it, a session you leave open at bedtime passes the idle threshold while you sleep and is archived by the first tick of the morning. With it, the clock restarts when the window ends, so a session needs a full threshold of waking time before it becomes eligible:
21:00 goes idle
22:00 window opens → clock re-stamped every tick, nothing reaped
08:00 window closes → clock reads ~5 minutes old
11:55 4h of waking idleness elapsed → archived
Windows that cross midnight are the normal case; same-day windows
("01:00-05:00") work too. The start is inclusive and the end exclusive, so
08:00 is already the working day. Daylight-saving transitions are handled by
the system timezone rather than by arithmetic.
attic reap --dry-run reports the resolved zone in the skip reason
(overnight hours (22:00-08:00 America/Chicago)) — check it once, since a
daemon that resolves a different zone than your shell would shift the window
by hours. A malformed value aborts the tick and archives nothing.
Development
uv run pytest # unit tests
uv run pytest -m integration # against the live herdr server
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file attic_herdr-0.2.0.tar.gz.
File metadata
- Download URL: attic_herdr-0.2.0.tar.gz
- Upload date:
- Size: 150.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab65375bc2d47924d232d6a9a840bf20258e265f169c0934fd9c103a1dda620d
|
|
| MD5 |
0ca6215714a68e6e6a50278944a2c280
|
|
| BLAKE2b-256 |
b9563e31dd43f69740e2df3d831866fbe06e54fb3c67d80829a538e90541210a
|
Provenance
The following attestation bundles were made for attic_herdr-0.2.0.tar.gz:
Publisher:
release.yml on TheThoughtagen/attic
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
attic_herdr-0.2.0.tar.gz -
Subject digest:
ab65375bc2d47924d232d6a9a840bf20258e265f169c0934fd9c103a1dda620d - Sigstore transparency entry: 2466450414
- Sigstore integration time:
-
Permalink:
TheThoughtagen/attic@383e335052099365dd2cac2f2547aed6c4a44e6f -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/TheThoughtagen
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@383e335052099365dd2cac2f2547aed6c4a44e6f -
Trigger Event:
push
-
Statement type:
File details
Details for the file attic_herdr-0.2.0-py3-none-any.whl.
File metadata
- Download URL: attic_herdr-0.2.0-py3-none-any.whl
- Upload date:
- Size: 41.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b2b98eecd3192e026d8efd1885ce3a0048a5eb0b629aebfa7f456afa06949123
|
|
| MD5 |
4163135258a16e8f0ddfbe89493dd23b
|
|
| BLAKE2b-256 |
d06dd838952503b83cfffe3fabff577f2ba22b25e2b4880974411af8b9d151dd
|
Provenance
The following attestation bundles were made for attic_herdr-0.2.0-py3-none-any.whl:
Publisher:
release.yml on TheThoughtagen/attic
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
attic_herdr-0.2.0-py3-none-any.whl -
Subject digest:
b2b98eecd3192e026d8efd1885ce3a0048a5eb0b629aebfa7f456afa06949123 - Sigstore transparency entry: 2466450435
- Sigstore integration time:
-
Permalink:
TheThoughtagen/attic@383e335052099365dd2cac2f2547aed6c4a44e6f -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/TheThoughtagen
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@383e335052099365dd2cac2f2547aed6c4a44e6f -
Trigger Event:
push
-
Statement type: