Skip to content

Commit d9a2a49

Browse files
dzmitrys-devclaude
andcommitted
docs(09-06): translate Phase 9 README section to zh-CN/es/ja/ru + bump synced-with SHA
- Add ⏳ feature-table row + full "Per-source temporal validity" section to all 4 translations, after the Phase 8 reranker section. - Code blocks, config keys, file paths, badges, and the worked-decay table cells stay in canonical English form (per AGENTS.md "README Translations" rule); only prose, headings, and explanatory text are translated. - Bump synced-with SHA marker on line 2 of each translation: f96d0a1dcd3185 (Task 1 commit). - AI-assistance disclosure on line 5 of each translation preserved. - Language switcher line 1 unchanged across all 5 files. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent dcd3185 commit d9a2a49

4 files changed

Lines changed: 315 additions & 4 deletions

File tree

README.es.md

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
**Idiomas:** [English](README.md) · [简体中文](README.zh-CN.md) · [Español](README.es.md) · [日本語](README.ja.md) · [Русский](README.ru.md)
22

3-
<!-- synced-with: README.md @ f96d0a1 -->
3+
<!-- synced-with: README.md @ dcd3185 -->
44

55
> Esta traducción fue generada con asistencia de IA. Las correcciones de hablantes nativos son bienvenidas vía PR.
66
@@ -165,6 +165,7 @@ El **banner SessionStart** (v0.1.4+) también lanza una línea de estado en tu c
165165
|---|---|
166166
| 🔍 **Retrieval híbrido** | Fusión sparse (BM25) + dense (MiniLM) afinada, schema fijo D-25 |
167167
| 🎯 **Reranker consciente del código** | Cross-encoder `mxbai-rerank-base-v2` (Apache-2.0) re-puntúa los candidatos de `tuned_hybrid` por defecto. Desactívalo con `retrieval.reranker = "off"` para volver al comportamiento previo a v0.2.4a1. (Phase 8, RERANK-01..04) |
168+
|**Validez temporal por fuente** | Cada chunk lleva `valid_from`/`valid_to`; reindexar un archivo modificado supersede atómicamente los chunks previos y el filtro de retrieval excluye los puntos superados en todos los backends. Decay de recencia opcional solo para transcripciones (apagado por defecto). Auto-GC tras `retention_days = 90` (`0` = conservar siempre / colecciones de auditoría). (Phase 9, TEMP-01..03) |
168169
| 📚 **Chunker Markdown** | Consciente de headers, chunks de 200-token con tope suave de 250-token (T-1) |
169170
| 🤖 **Servidor MCP** | Transportes `stdio` (default) y `http`, SDK oficial `mcp` |
170171
| 🪝 **Hooks multi-cliente** | session-start de Claude Code, session-start de OpenCode, MDC de Cursor |
@@ -480,6 +481,85 @@ través del pipeline de fetch de install/init/repair.
480481

481482
---
482483

484+
## ⏳ Validez temporal por fuente (v0.3.0a1+)
485+
486+
Cada chunk indexado lleva un campo binario `valid_to`:
487+
488+
- `valid_to = null` → vigente
489+
- `valid_to ≤ now()` → superado (filtrado fuera de toda búsqueda)
490+
491+
Cuando un archivo cambia y lo reindexas, el indexador, atómicamente:
492+
493+
1. Hace scroll de todos los chunks existentes para esa ruta de archivo.
494+
2. Aplica `set_payload(valid_to = now())` a cada uno (cierra la ventana de validez previa).
495+
3. Hace upsert de los nuevos chunks bajo UUIDs derivados de un hash de contenido,
496+
con `valid_to = null`.
497+
498+
Los chunks viejos y nuevos coexisten en Qdrant; solo los nuevos se devuelven en retrieval
499+
hasta que el barrido de auto-GC borra los viejos pasados de `retention_days`. El filtro
500+
de retrieval se construye en un único sitio y lo heredan todos los backends
501+
(`tuned_hybrid` ambas ramas Prefetch, `dense`, `bm25`, `qdrant_find`,
502+
`dual_memory_search`) — usa el `IsEmptyCondition` de Qdrant (NO `IsNullCondition`,
503+
ver [Qdrant#5342](https://github.com/qdrant/qdrant/issues/5342): `IsNull` no matchea
504+
campos ausentes).
505+
506+
Configura en `.supamem/config.toml`:
507+
508+
```toml
509+
[supamem.retrieval.temporal]
510+
retention_days = 90 # 0 = conservar siempre (compliance / auditoría)
511+
```
512+
513+
### Decay de recencia solo para transcripciones (opt-in, apagado por defecto)
514+
515+
El código, los ADRs y la documentación no "envejecen". Las transcripciones, sí — los
516+
turnos antiguos de soporte con APIs deprecadas distraen al agente del diálogo actual.
517+
Phase 9 incorpora un knob de decay multiplicativo con piso (multiplicative-floor) que
518+
corre **solo** sobre chunks de transcripción, después del rerank, y nunca se activa
519+
automáticamente para código / ADR / docs:
520+
521+
```toml
522+
[supamem.retrieval.recency.per_source.transcript]
523+
enabled = true # default false
524+
half_life_days = 14.0
525+
alpha = 0.7 # piso: la transcripción más vieja conserva 0.7x del score
526+
```
527+
528+
Ejemplo trabajado con los defaults bloqueados (`alpha = 0.7`, `half_life_days = 14`):
529+
530+
| Age (days) | Multiplier |
531+
|------------|--------------------|
532+
| 0 | 1.000 |
533+
| 7 | 0.924 |
534+
| 14 | 0.850 |
535+
| 28 | 0.775 |
536+
|| 0.700 (floor at α) |
537+
538+
El ranking de código / ADR / docs queda byte-idéntico cuando se cambia el knob —
539+
verificado por un test end-to-end de identidad de bytes (criterio TEMP-03).
540+
541+
Referencias: [Customers.ai recency-weighted scoring](https://customers.ai/recency-weighted-scoring),
542+
[Snowflake Cortex Search scoring docs](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/cortex-search-customize-scoring).
543+
544+
### Doctor
545+
546+
`supamem doctor` muestra un panel `Temporal validity` (entre Reranker y Subagent
547+
reachability) que lista contadores de live / superseded / awaiting_gc / future-dated,
548+
desglose por fuente, `valid_from` más antiguo y más reciente, y la procedencia de
549+
`retention_days`. Solo lectura por construcción; nunca cambia el exit code de doctor.
550+
551+
### Migración
552+
553+
El primer `supamem index` post-upgrade rellena `valid_to=null` en puntos legados
554+
(controlado por una clave reservada del manifest, idempotente en sucesivas corridas).
555+
Defensa en profundidad junto al filtro `IsEmpty` de runtime.
556+
557+
> **El retention por defecto es destructivo** para usuarios que vienen de v0.2.x
558+
> con colecciones modo auditoría de más de 90 días. Setea
559+
> `[supamem.retrieval.temporal] retention_days = 0` para deshabilitar el auto-GC.
560+
561+
---
562+
483563
## 🪛 Cableando a tu cliente
484564

485565
<details>

README.ja.md

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
**言語:** [English](README.md) · [简体中文](README.zh-CN.md) · [Español](README.es.md) · [日本語](README.ja.md) · [Русский](README.ru.md)
22

3-
<!-- synced-with: README.md @ f96d0a1 -->
3+
<!-- synced-with: README.md @ dcd3185 -->
44

55
> この翻訳は AI 支援によるものです。ネイティブスピーカーによる修正 PR を歓迎します。
66
@@ -159,6 +159,7 @@ supamem doctor
159159
|---|---|
160160
| 🔍 **ハイブリッド検索** | 調整済み sparse(BM25) + dense(MiniLM) 融合、ロックされたスキーマ D-25 |
161161
| 🎯 **コード対応リランカー** | クロスエンコーダ `mxbai-rerank-base-v2`(Apache-2.0)が既定で `tuned_hybrid` の候補を再採点します。`retrieval.reranker = "off"` で無効化すると v0.2.4a1 以前の挙動に戻ります。(Phase 8, RERANK-01..04) |
162+
|**ソース別の時間有効性** | 各 chunk に `valid_from`/`valid_to` を付与;変更されたファイルを再インデックスすると、旧 chunk をアトミックに無効化し、検索時フィルタが全バックエンド共通で無効化済み点を除外します。トランスクリプト専用の任意の recency 減衰(既定 OFF)。`retention_days = 90` を超えると自動 GC(`0` で恒久保持 / 監査用コレクション)。(Phase 9, TEMP-01..03) |
162163
| 📚 **Markdown チャンカー** | ヘッダー意識、200 トークン目標 / 250 トークン軟上限(T-1) |
163164
| 🤖 **MCP サーバー** | `stdio`(デフォルト)と `http` トランスポート、公式 `mcp` SDK |
164165
| 🪝 **マルチクライアントフック** | Claude Code セッション開始、OpenCode セッション開始、Cursor MDC |
@@ -469,6 +470,83 @@ fetch パイプラインで実行されます。
469470

470471
---
471472

473+
## ⏳ ソース別の時間有効性(v0.3.0a1+)
474+
475+
インデックスされた各 chunk は二値の `valid_to` フィールドを持ちます:
476+
477+
- `valid_to = null` → 有効
478+
- `valid_to ≤ now()` → 置き換え済み(あらゆる検索で除外)
479+
480+
ファイルが変更されて再インデックスを行うと、インデクサはアトミックに:
481+
482+
1. そのファイルパスの既存 chunk すべてを scroll します。
483+
2. 各々に `set_payload(valid_to = now())` を適用(従前の有効期間を閉じる)。
484+
3. 内容ハッシュベースの UUID で `valid_to = null` の新 chunk を upsert します。
485+
486+
新旧の chunk は Qdrant 内に共存し、検索結果には新 chunk のみが返ります。`retention_days`
487+
を超えた古い chunk は自動 GC スイープで削除されます。検索時フィルタは単一の場所で
488+
構築され、すべてのバックエンド(`tuned_hybrid` の両 Prefetch アーム、`dense`
489+
`bm25``qdrant_find``dual_memory_search`)に継承されます。Qdrant の
490+
`IsEmptyCondition` を使用します(`IsNullCondition` は使いません — 詳細は
491+
[Qdrant#5342](https://github.com/qdrant/qdrant/issues/5342):`IsNull` は欠損フィールドに
492+
マッチしません)。
493+
494+
`.supamem/config.toml` で設定:
495+
496+
```toml
497+
[supamem.retrieval.temporal]
498+
retention_days = 90 # 0 = 恒久保持(コンプライアンス / 監査用コレクション)
499+
```
500+
501+
### トランスクリプト専用の recency 減衰(opt-in、既定 OFF)
502+
503+
コード、ADR、ドキュメントは「古くなる」ことはありません。しかしトランスクリプトはしばしば
504+
古くなります — 旧サポートチャットの非推奨 API がエージェントを現在の対話から逸脱させます。
505+
Phase 9 ではトランスクリプト chunk **のみ**に作用し、rerank 後に走り、コード / ADR /
506+
ドキュメントには絶対に自動適用されない、乗法フロア型の任意 decay knob を提供します:
507+
508+
```toml
509+
[supamem.retrieval.recency.per_source.transcript]
510+
enabled = true # 既定 false
511+
half_life_days = 14.0
512+
alpha = 0.7 # フロア:最古のトランスクリプトでも 0.7 倍の score を保つ
513+
```
514+
515+
ロックされた既定値での例(`alpha = 0.7``half_life_days = 14`):
516+
517+
| Age (days) | Multiplier |
518+
|------------|--------------------|
519+
| 0 | 1.000 |
520+
| 7 | 0.924 |
521+
| 14 | 0.850 |
522+
| 28 | 0.775 |
523+
|| 0.700 (floor at α) |
524+
525+
knob を切り替えてもコード / ADR / ドキュメントのランキングはバイト一致 — エンドツーエンド
526+
のバイト同一性テストで検証されています(TEMP-03 受け入れ基準)。
527+
528+
参考:[Customers.ai recency-weighted scoring](https://customers.ai/recency-weighted-scoring)
529+
[Snowflake Cortex Search scoring docs](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/cortex-search-customize-scoring)
530+
531+
### Doctor パネル
532+
533+
`supamem doctor` は Reranker と Subagent reachability の間に `Temporal validity`
534+
パネルを追加し、live / superseded / awaiting_gc / future-dated のカウント、ソース別
535+
内訳、コレクション内の最古/最新の `valid_from`、そして `retention_days` のプロビナンス
536+
を表示します。構造的に読み取り専用で、doctor の終了コードを変えることはありません。
537+
538+
### マイグレーション
539+
540+
アップグレード後の最初の `supamem index` は、レガシーポイントに `valid_to=null`
541+
バックフィルします(マニフェストの予約キーで管理、以降の実行は冪等)。ランタイムの
542+
`IsEmpty` フィルタと並行する、深層防御です。
543+
544+
> **既定の retention は破壊的**:90 日を超える監査モードコレクションを持つ v0.2.x
545+
> からのアップグレードユーザは要注意。`[supamem.retrieval.temporal] retention_days = 0`
546+
> に設定すれば自動 GC を完全に無効化できます。
547+
548+
---
549+
472550
## 🪛 クライアントへの配線
473551

474552
<details>

README.ru.md

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
**Языки:** [English](README.md) · [简体中文](README.zh-CN.md) · [Español](README.es.md) · [日本語](README.ja.md) · [Русский](README.ru.md)
22

3-
<!-- synced-with: README.md @ f96d0a1 -->
3+
<!-- synced-with: README.md @ dcd3185 -->
44

55
> Перевод выполнен с помощью ИИ. Корректировки от носителей языка приветствуются — открывайте PR.
66
@@ -164,6 +164,7 @@ supamem doctor
164164
|---|---|
165165
| 🔍 **Гибридный retrieval** | Настроенная фьюжн sparse (BM25) + dense (MiniLM), зафиксированная схема D-25 |
166166
| 🎯 **Code-aware reranker** | Cross-encoder `mxbai-rerank-base-v2` (Apache-2.0) по умолчанию переоценивает кандидатов `tuned_hybrid`. Отключается `retrieval.reranker = "off"` — возврат к поведению до v0.2.4a1. (Phase 8, RERANK-01..04) |
167+
|**Per-source временная валидность** | Каждый чанк несёт `valid_from`/`valid_to`; переиндексация изменённого файла атомарно помечает прежние чанки как устаревшие, а фильтр на этапе retrieval единообразно исключает устаревшие точки во всех бэкендах. Опциональный recency-decay только для транскриптов (по умолчанию OFF). Авто-GC после `retention_days = 90` (`0` = хранить вечно / для аудит-коллекций). (Phase 9, TEMP-01..03) |
167168
| 📚 **Markdown-чанкер** | Header-aware, чанки по 200 токенов с мягким потолком 250 (T-1) |
168169
| 🤖 **MCP-сервер** | Транспорты `stdio` (по умолчанию) и `http`, официальный SDK `mcp` |
169170
| 🪝 **Multi-client хуки** | session-start Claude Code, session-start OpenCode, MDC Cursor |
@@ -478,6 +479,86 @@ fetch-pipeline команд install/init/repair.
478479

479480
---
480481

482+
## ⏳ Per-source временная валидность (v0.3.0a1+)
483+
484+
Каждый индексируемый чанк несёт бинарное поле `valid_to`:
485+
486+
- `valid_to = null` → активный
487+
- `valid_to ≤ now()` → устаревший (отфильтровывается из любого retrieval-запроса)
488+
489+
Когда файл изменяется и вы его переиндексируете, индексер атомарно:
490+
491+
1. Скроллит все существующие чанки для этого пути.
492+
2. Выставляет `set_payload(valid_to = now())` на каждом (закрывает прежнее окно
493+
валидности).
494+
3. Делает upsert новых чанков с UUID на основе хеша содержимого и `valid_to = null`.
495+
496+
Старые и новые чанки сосуществуют в Qdrant; в выдачу попадают только новые — пока
497+
авто-GC не удалит устаревшие после `retention_days`. Фильтр на этапе retrieval
498+
конструируется в одном месте и наследуется всеми бэкендами (обеими ветвями Prefetch
499+
у `tuned_hybrid`, `dense`, `bm25`, `qdrant_find`, `dual_memory_search`) — использует
500+
`IsEmptyCondition` Qdrant (НЕ `IsNullCondition` — см.
501+
[Qdrant#5342](https://github.com/qdrant/qdrant/issues/5342): `IsNull` не матчит
502+
отсутствующие поля).
503+
504+
Конфигурация в `.supamem/config.toml`:
505+
506+
```toml
507+
[supamem.retrieval.temporal]
508+
retention_days = 90 # 0 = хранить вечно (compliance / аудит)
509+
```
510+
511+
### Recency-decay только для транскриптов (opt-in, по умолчанию OFF)
512+
513+
Код, ADR и документация не «устаревают». А вот транскрипты — часто: старые ходы
514+
саппорт-чатов с устаревшими API уводят агента от текущего диалога. Phase 9 даёт
515+
opt-in мультипликативный decay с полом, который применяется **только** к чанкам
516+
транскриптов, после rerank, и никогда не активируется автоматически для код / ADR /
517+
docs:
518+
519+
```toml
520+
[supamem.retrieval.recency.per_source.transcript]
521+
enabled = true # default false
522+
half_life_days = 14.0
523+
alpha = 0.7 # пол: самый старый транскрипт всё ещё получает 0.7x от score
524+
```
525+
526+
Пример с зафиксированными дефолтами (`alpha = 0.7`, `half_life_days = 14`):
527+
528+
| Age (days) | Multiplier |
529+
|------------|--------------------|
530+
| 0 | 1.000 |
531+
| 7 | 0.924 |
532+
| 14 | 0.850 |
533+
| 28 | 0.775 |
534+
|| 0.700 (floor at α) |
535+
536+
При переключении knob ранжирование код / ADR / docs остаётся побайтово идентичным —
537+
покрыто end-to-end тестом байтового равенства (приёмочный критерий TEMP-03).
538+
539+
Источники: [Customers.ai recency-weighted scoring](https://customers.ai/recency-weighted-scoring),
540+
[Snowflake Cortex Search scoring docs](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-search/cortex-search-customize-scoring).
541+
542+
### Панель doctor
543+
544+
`supamem doctor` показывает панель `Temporal validity` (между Reranker и Subagent
545+
reachability) со счётчиками live / superseded / awaiting_gc / future-dated, разбивкой
546+
по источникам, самым старым и самым новым `valid_from` в коллекции и provenance-
547+
строкой `retention_days`. По построению read-only; никогда не меняет код выхода
548+
doctor.
549+
550+
### Миграция
551+
552+
Первый `supamem index` после апгрейда заполняет `valid_to=null` на легаси-точках
553+
(управляется зарезервированным ключом манифеста, идемпотентен на последующих
554+
запусках). Эшелонированная защита параллельно с runtime-фильтром `IsEmpty`.
555+
556+
> **Дефолтный retention — деструктивный** для пользователей, переходящих с v0.2.x
557+
> с аудит-коллекциями старше 90 дней. Установите
558+
> `[supamem.retrieval.temporal] retention_days = 0`, чтобы полностью отключить авто-GC.
559+
560+
---
561+
481562
## 🪛 Подключение к клиенту
482563

483564
<details>

0 commit comments

Comments
 (0)