问题
衰减引擎的哲学是「pinned 永不归档」(src/decay_engine.py:306 里显式豁免),但手动归档通道不设防:POST /api/bucket/{id}/archive 直接调 bucket_mgr.archive(),后者无条件移文件,不查 pinned / protected(src/bucket_manager.py:2036 起)。
手动归档要不要拦 pinned,可以算设计选择——毕竟是用户主动点的。真正像是漏掉的是连带的那一半:archive() 只把 type 改成 archived,pinned 标记原样留在 frontmatter 里。而 _find_bucket_file() 是含 archive/ 目录一起搜的,所以这个桶日后只要以任何方式回到活跃态(update() 改 type、或手工把文件移回去),它会带着 pinned 一起复活:继续占 pinned 配额(默认 20),继续在 breath 开场置顶。
用户如果早忘了这个桶,配额就被一个看不见的幽灵占着,而且几乎无从排查——因为它在归档区,日常列表里根本不出现。
(核对版本:main @ f0abeb8)
建议
在 archive() 里把 pinned 落回 False(protected 同理,如果语义上也算配额资源),配额语义才闭环。也可以反过来在恢复路径上清,但目前没有专门的解档入口,落在 archive() 里更稳妥。
问题
衰减引擎的哲学是「pinned 永不归档」(
src/decay_engine.py:306里显式豁免),但手动归档通道不设防:POST /api/bucket/{id}/archive直接调bucket_mgr.archive(),后者无条件移文件,不查 pinned / protected(src/bucket_manager.py:2036起)。手动归档要不要拦 pinned,可以算设计选择——毕竟是用户主动点的。真正像是漏掉的是连带的那一半:
archive()只把type改成archived,pinned 标记原样留在 frontmatter 里。而_find_bucket_file()是含archive/目录一起搜的,所以这个桶日后只要以任何方式回到活跃态(update()改 type、或手工把文件移回去),它会带着 pinned 一起复活:继续占 pinned 配额(默认 20),继续在 breath 开场置顶。用户如果早忘了这个桶,配额就被一个看不见的幽灵占着,而且几乎无从排查——因为它在归档区,日常列表里根本不出现。
(核对版本:main @ f0abeb8)
建议
在
archive()里把pinned落回False(protected同理,如果语义上也算配额资源),配额语义才闭环。也可以反过来在恢复路径上清,但目前没有专门的解档入口,落在archive()里更稳妥。