v0.21.0
Memory is now something you distill on purpose. Nothing reads a session transcript on its own any more — /iwe:distill walks you through what a session established and writes only what you choose to keep, and session start tells you how many sessions are still waiting. Documents written into the store are normalized and checked against their schemas as they land, and iwe normalize -k <key> cleans up just the pages you name.
iwe
Added
iwe normalize -k <key>normalizes only the named documents, leaves their frontmatter as written and prints only the paths that changedknowledge_filter,recency_field,injection,max_proposals_per_readandremind_every_daysknobs onMEMORY.md- Switching memory on installs a default
.iwe/schemas/memory.yamlthat constrains only thecreatedandsessionfields - A document written with the Write or Edit tool is normalized, checked against the schemas that bind it, and reported when it closely matches one the store already has
- A captured document under an area directory is linked into that area's hub when one exists
- Session start reports how many sessions are undistilled and, at most once per
remind_every_days, offers to read them
Changed
updateblock operators (--append,--replace,--delete, …) given an argument that is not a YAML mapping now report the flag, the mapping shape it takes and an example (previously the raw parser error)- Memory's own state lives under
.iwe/claude/, outside the graph (previouslysessions/<id>documents in the store). The defaultknowledge_filteris{ $key: { $nin: [MEMORY, queries] } }(was{ distilled_lines: { $exists: false }, $key: { $nin: [MEMORY, queries] } }) - The
init,distillandreflectprompts carry procedure only; the shape of a memory document is theMEMORY.mdpolicy's alone, read by section name (## How to write it,## Dedup and updates,## Curation) /iwe:distillasks about every candidate before anything is written —Keep all/Skip all/Let me pick, then one candidate at a time for a handful, or a numbered list with batched multi-select questions for more — and reads a backlog with one reader per session, so a fact several sessions raised is asked about once (previously it walked the backlog session by session and re-proposed what recurred)- Reading a session can now run unattended; selection never does
/iwe:initsets memory up and hands the sessions on disk to/iwe:distill; it reads none of them itself- The session-start block's closing lines come from the policy's
## At session startsection (previously hard-coded) iwe createandiwe update --contentnormalize the body on the way in, leaving the frontmatter as written
Removed
- Automatic capture: nothing reads a transcript on its own any more, and the chunks it kept under
.iwe/claude-sessions/are gone - The
sweep_threshold_lines,max_chunks_per_sweep,max_items_per_chunkandinflight_ttl_minutesknobs; a policy that still sets one is ignored
Library crates (liwe, diwe)
liwe
Added
parse_filter_mapping— build a queryFilterfrom an already-parsed YAMLMapping
Changed
$setaccepts reserved-prefix keys ($,_,.,#,@) inside a value; the field path itself is still refused when a segment starts with one