dsh-biocore 0.5.1 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/lib/index.js +10 -0
  2. package/lib/py/bridge.py +98 -0
  3. package/package.json +1 -1
  4. package/python/biocore_memory/adapters/dsh_cli.py +56 -2
  5. package/python/biocore_memory/core/config.py +274 -142
  6. package/python/biocore_memory/engine.py +3346 -2738
  7. package/python/biocore_memory/engine_helpers.py +15 -1
  8. package/python/biocore_memory/event/activation.py +118 -0
  9. package/python/biocore_memory/event/chains.py +112 -0
  10. package/python/biocore_memory/event/claims.py +486 -0
  11. package/python/biocore_memory/event/compaction.py +240 -0
  12. package/python/biocore_memory/event/consistency.py +10 -99
  13. package/python/biocore_memory/event/event_graph.py +100 -0
  14. package/python/biocore_memory/event/events.py +926 -0
  15. package/python/biocore_memory/event/facts.py +150 -0
  16. package/python/biocore_memory/event/json_tolerant.py +73 -0
  17. package/python/biocore_memory/event/keynorm.py +380 -0
  18. package/python/biocore_memory/event/rolling.py +211 -0
  19. package/python/biocore_memory/event/segment.py +164 -0
  20. package/python/biocore_memory/event/segment_adaptive.py +114 -0
  21. package/python/biocore_memory/event/timerender.py +68 -0
  22. package/python/biocore_memory/evict/consequence.py +10 -14
  23. package/python/biocore_memory/index/entities.py +11 -51
  24. package/python/biocore_memory/recall/activation.py +144 -0
  25. package/python/biocore_memory/recall/api.py +5 -2
  26. package/python/biocore_memory/recall/cover.py +134 -0
  27. package/python/biocore_memory/recall/embedding.py +555 -50
  28. package/python/biocore_memory/recall/point_expand.py +169 -0
  29. package/python/biocore_memory/recall/providers.py +442 -0
  30. package/python/biocore_memory/recall/segments.py +111 -0
  31. package/python/biocore_memory/space.py +967 -24
  32. package/python/biocore_memory/space_learning.py +347 -0
  33. package/python/biocore_memory/store/dedupe.py +5 -42
  34. package/python/biocore_memory/store/json_store.py +81 -2
  35. package/python/biocore_memory/store/near_dup.py +250 -0
  36. package/python/biocore_memory/store/sql_store.py +665 -0
  37. package/python/biocore_memory/store/versioning.py +291 -0
  38. package/python/biocore_model/entity_graph.py +13 -7
  39. package/python/biocore_model/tests/conftest.py +58 -0
  40. package/python/biocore_model/tests/test_appraisal.py +23 -9
  41. package/python/biocore_model/tests/test_appraisal_v2.py +140 -0
  42. package/python/biocore_model/tests/test_batch_b.py +310 -0
  43. package/python/biocore_model/tests/test_batch_d.py +244 -0
  44. package/python/biocore_model/tests/test_batch_e.py +210 -0
  45. package/python/biocore_model/tests/test_batch_registry.py +272 -0
  46. package/python/biocore_model/tests/test_bio_tick.py +50 -5
  47. package/python/biocore_model/tests/test_damping_needs_split.py +144 -0
  48. package/python/biocore_model/tests/test_dimensions.py +249 -0
  49. package/python/biocore_model/tests/test_dimensions_conflict.py +192 -0
  50. package/python/biocore_model/tests/test_expression.py +254 -0
  51. package/python/biocore_model/tests/test_governance.py +180 -181
  52. package/python/biocore_model/tests/test_learning_eval.py +142 -0
  53. package/python/biocore_model/tests/test_module_monitor.py +172 -0
  54. package/python/biocore_model/tests/test_paper_alignment.py +138 -0
  55. package/python/biocore_model/tests/test_perception_batch.py +371 -0
  56. package/python/biocore_model/tests/test_perception_batch_a2.py +304 -0
  57. package/python/biocore_model/tests/test_proposal_split.py +214 -0
  58. package/python/biocore_model/tests/test_runtime_pipeline.py +3 -6
  59. package/python/biocore_model/tests/test_source_split.py +170 -0
  60. package/python/biocore_model/tests/test_space.py +240 -0
  61. package/python/biocore_model/tests/test_spatial_recall.py +288 -0
  62. package/python/biocore_model/tests/test_surprise_priority.py +143 -0
  63. package/python/biocore_model/tests/test_timescales.py +181 -0
  64. package/python/biocore_runtime/extensions.py +2 -2
  65. package/python/biocore_runtime/pipeline.py +3996 -183
  66. package/python/biocore_runtime/rerank.py +51 -84
  67. package/python/biocore_model/tests/test_autonomy_self.py +0 -153
  68. package/python/biocore_model/tests/test_memory_inject.py +0 -211
  69. package/python/data/signals.json +0 -15307
@@ -1,142 +1,274 @@
1
- # -*- coding: utf-8 -*-
2
- """All memory-layer thresholds/defaults in one place."""
3
- from __future__ import annotations
4
-
5
- SCHEMA_VERSION = 1
6
- MAX_VERSIONS = 8
7
- TOMBSTONE_LIMIT = 100
8
- DEFAULT_BUDGET = 3
9
- MAX_BUDGET = 5
10
-
11
- # recall fusion / tiers (M2). [engineering] no fitting source; .50/.30/.10/.10
12
- # is the single口径 now (the old "0.6/0.4" comment and the task's .4/.3/.2/.1
13
- # are retired, code unchanged).
14
- CUE_WEIGHT = 0.50
15
- SEM_WEIGHT = 0.30
16
- IMPORTANCE_WEIGHT = 0.10
17
- TIME_BONUS = 0.10
18
- HIGH_TIER = 0.55
19
- MID_TIER = 0.35
20
-
21
- # source credibility gate (separate from importance)
22
- SOURCE_MIN_CONFIDENCE = 0.55
23
- SOURCE_CONFIDENCE_DEFAULT = 0.70
24
-
25
- # memory value formula (deterministic; trust is NOT part of value)
26
- # [engineering] product definition, no behavioural data behind the weights.
27
- VALUE_BASE = 0.20
28
- VALUE_W_INTENSITY = 0.30
29
- VALUE_W_VALENCE = 0.20
30
- VALUE_W_SELF = 0.15
31
- VALUE_W_MAINLINE = 0.15
32
- VALUE_W_ROUTINE = 0.20
33
-
34
- # eviction weights (read-only score) [engineering]
35
- EVICT_W_SALIENCE = 0.30
36
- EVICT_W_POSITION = 0.20
37
- EVICT_W_REDUNDANCY = 0.20
38
- EVICT_W_CONFIDENCE = 0.15
39
- EVICT_W_STALENESS = 0.15
40
-
41
- # identity write-back gate
42
- SAME_DIRECTION_MIN = 3
43
- MAX_STEP = 0.02
44
- MAJOR_EVENT_STEP = 0.02
45
-
46
- # thread card
47
- THREAD_TTL = 21600.0
48
- THREAD_LIMIT = 3
49
-
50
- # memory-point gate (OR): value >= MIN_VALUE or importance >= MIN_IMPORTANCE or self >= MIN_SELF
51
- # (event centrality / emotional intensity; self-reference effect; engineering thresholds)
52
- MEMORY_POINT_MIN_VALUE = 0.60 # [engineering]
53
- MEMORY_POINT_MIN_SELF = 0.45
54
- MEMORY_POINT_MIN_IMPORTANCE = 0.75
55
-
56
- # engine wiring knobs (all read by MemoryEngine only)
57
- RATE_LIMIT_PER_MIN = 30
58
- COMPRESS_MAX_CHARS = 200
59
- AUDIT_TAIL = 50
60
- COOC_MAX_ENTRIES = 400
61
- # after-turn auto consolidation: every N successful remember() calls
62
- CONSOLIDATE_AUTO_TURNS = 10
63
-
64
- # recall -> affect feedback (task-218): a recalled memory nudges the live
65
- # affect a little. Engine owns the state; recall/feedback.py owns the guards.
66
- # [engineering] gain / step / cooldown / floor are hand-set (see PAPER-MAP.md).
67
- FEEDBACK_MAX_STEP = 0.02 # per-turn cap on |delta valence| and |delta arousal|
68
- FEEDBACK_GAIN = 0.50 # share of (recalled - current) that flows back
69
- FEEDBACK_COOLDOWN = 1800.0 # same entry: no second feedback inside 30 minutes
70
- FEEDBACK_NEG_FLOOR = -0.40 # at/below this valence a further negative pull is dropped
71
-
72
-
73
- # Per-mechanism flags: safety/read-path filters default ON; every optional
74
- # mechanism defaults OFF and must keep the old code path when disabled.
75
- # A flags.json in the data directory overrides these booleans at engine start
76
- # (and MemoryEngine.set_flags(..., persist=True) rewrites it).
77
- FLAGS = {
78
- # safety / read-path (default ON)
79
- # GA-03: keep engine default ON. DSH private mode disables it per-store via
80
- # <dsh store>/flags.json; the shared engine must not be relaxed globally.
81
- "security": True, # store/security.should_reject before write
82
- "provenance": True, # provenance hash tag + chained tombstones
83
- "source_filter": True, # low-confidence candidates are counted/dropped
84
- "temporal_filter": True, # honour valid_at/invalid_at on recall
85
- "dedupe": True, # remember-side L0-L3 dedupe
86
- "relay": True, # relay card
87
- "thread": True, # thread card / TTL expiry
88
- "embedding": True, # optional embedding provider
89
- # attention / model features (default OFF)
90
- "slots": False,
91
- "boundary": False, # slots/boundary.py event-boundary switching
92
- "three_channel": False,
93
- "eviction_readonly": False,
94
- "identity": False,
95
- "identity_writeback": False,
96
- "due_hints": False,
97
- # recall extensions (default OFF)
98
- "bm25": False,
99
- "bm25_multi": False,
100
- "ppr": False,
101
- "mmr": False,
102
- "mood_recall": False,
103
- "affect_encoding": False,
104
- "memory_feedback": False, # task-218: recalled affect nudges the live affect
105
- "preference_drift": False, # task-219: repeated topics drift value_order weights
106
- "complexity": False,
107
- "constraints": False,
108
- "tiering": False,
109
- "entity_boost": False,
110
- "inhibition": False,
111
- "retrieval_practice": False,
112
- "compress": False, # output-only summary, never mutates the store
113
- "source_consistency": False, # source-rank marking/downweight on recall
114
- # eviction extension modules (default OFF)
115
- "heat": False,
116
- "consequence": False,
117
- "tiering_exec": False,
118
- "apply_evictions": False, # tick() may really soft-delete archived entries
119
- "deletion_audit": False, # derived-data coverage audit after forget()
120
- "adaptive_evict": False, # adaptive_score replaces the tick eviction score
121
-
122
- # write-path extensions (default OFF)
123
- "consistency": False, # old/new fact conflict annotation on remember
124
- "rate_limit": False,
125
- "audit": False,
126
- "permissions": False,
127
- "notes": False,
128
- "media": False,
129
- "notes_link": False,
130
- "ledger": False,
131
- # index / graph
132
- "graph": False,
133
- "cue_writeback": True, # store cue_index fields on each new entry (index-only, no recall change)
134
- # consolidation modules (default OFF)
135
- "consolidate_auto": False, # after-turn auto consolidate every CONSOLIDATE_AUTO_TURNS remembers
136
- "consolidate_gated": False,
137
- "consolidate_tree": False,
138
- "consolidate_reflection": False,
139
- "consolidate_neighbors": False,
140
- "consolidate_writeback": False,
141
- "narrative": False, # identity narrative update at consolidate end
142
- }
1
+ # -*- coding: utf-8 -*-
2
+ """All memory-layer thresholds/defaults in one place."""
3
+ from __future__ import annotations
4
+
5
+ SCHEMA_VERSION = 1
6
+ MAX_VERSIONS = 8
7
+ TOMBSTONE_LIMIT = 100
8
+ DEFAULT_BUDGET = 3
9
+ MAX_BUDGET = 5
10
+
11
+ # recall fusion / tiers (M2). [engineering] no fitting source; .50/.30/.10/.10
12
+ # is the single口径 now (the old "0.6/0.4" comment and the task's .4/.3/.2/.1
13
+ # are retired, code unchanged).
14
+ CUE_WEIGHT = 0.50
15
+ SEM_WEIGHT = 0.30
16
+ IMPORTANCE_WEIGHT = 0.10
17
+ TIME_BONUS = 0.10
18
+ HIGH_TIER = 0.55
19
+ MID_TIER = 0.35
20
+
21
+ # source credibility gate (separate from importance)
22
+ SOURCE_MIN_CONFIDENCE = 0.55
23
+ SOURCE_CONFIDENCE_DEFAULT = 0.70
24
+
25
+ # memory value formula (deterministic; trust is NOT part of value)
26
+ # [engineering] product definition, no behavioural data behind the weights.
27
+ VALUE_BASE = 0.20
28
+ VALUE_W_INTENSITY = 0.30
29
+ VALUE_W_VALENCE = 0.20
30
+ VALUE_W_SELF = 0.15
31
+ VALUE_W_MAINLINE = 0.15
32
+ VALUE_W_ROUTINE = 0.20
33
+
34
+ # eviction weights (read-only score) [engineering]
35
+ EVICT_W_SALIENCE = 0.30
36
+ EVICT_W_POSITION = 0.20
37
+ EVICT_W_REDUNDANCY = 0.20
38
+ EVICT_W_CONFIDENCE = 0.15
39
+ EVICT_W_STALENESS = 0.15
40
+
41
+ # identity write-back gate
42
+ SAME_DIRECTION_MIN = 3
43
+ MAX_STEP = 0.02
44
+ MAJOR_EVENT_STEP = 0.02
45
+
46
+ # thread card
47
+ THREAD_TTL = 21600.0
48
+ THREAD_LIMIT = 3
49
+
50
+ # memory-point gate (OR): value >= MIN_VALUE or importance >= MIN_IMPORTANCE or self >= MIN_SELF
51
+ # (event centrality / emotional intensity; self-reference effect; engineering thresholds)
52
+ MEMORY_POINT_MIN_VALUE = 0.60 # [engineering]
53
+ MEMORY_POINT_MIN_SELF = 0.45
54
+ MEMORY_POINT_MIN_IMPORTANCE = 0.75
55
+
56
+ # engine wiring knobs (all read by MemoryEngine only)
57
+ RATE_LIMIT_PER_MIN = 30
58
+ COMPRESS_MAX_CHARS = 200
59
+ AUDIT_TAIL = 50
60
+ COOC_MAX_ENTRIES = 400
61
+ # after-turn auto consolidation: every N successful remember() calls
62
+ CONSOLIDATE_AUTO_TURNS = 10
63
+
64
+ # recall -> affect feedback (task-218): a recalled memory nudges the live
65
+ # affect a little. Engine owns the state; recall/feedback.py owns the guards.
66
+ # [engineering] gain / step / cooldown / floor are hand-set (see PAPER-MAP.md).
67
+ FEEDBACK_MAX_STEP = 0.02 # per-turn cap on |delta valence| and |delta arousal|
68
+ FEEDBACK_GAIN = 0.50 # share of (recalled - current) that flows back
69
+ FEEDBACK_COOLDOWN = 1800.0 # same entry: no second feedback inside 30 minutes
70
+ FEEDBACK_NEG_FLOOR = -0.40 # at/below this valence a further negative pull is dropped
71
+
72
+
73
+ # ---------------------------------------------------------------- spatial ranking
74
+ # distance = sum(w_axis * d_axis) over the five memory axes.
75
+ # Equal weights are a NEUTRAL engineering default: no axis is privileged and
76
+ # nothing here was fitted to data. A store overrides them with
77
+ # flags["spatial_weights"] or BIOCORE_SPATIAL_WEIGHTS (JSON).
78
+ SPATIAL_WEIGHTS = {"semantic": 0.20, "time": 0.20, "affect": 0.20,
79
+ "social": 0.20, "activation": 0.20}
80
+
81
+ # Time is numeric only: ts and query_ts are compared, text is never scanned
82
+ # for date or cue words. There is no temporal word list anywhere in the core.
83
+
84
+ # spatial_select (default OFF) is the candidate stage in front of the ordinary
85
+ # scoring fusion: the WHOLE store is ranked by weighted five-axis distance and
86
+ # only the nearest SPATIAL_SELECT_DEPTH entries are handed to the existing
87
+ # scorer. This is the usual two-stage shape of approximate/exact hybrid search
88
+ # (Malkov & Yashunin 2018, HNSW: a bounded candidate list, then exact scoring;
89
+ # VLDB 2025 hybrid querying on vectors: the vector stage proposes candidates,
90
+ # the structured conditions still decide). 20 is an engineering candidate cap,
91
+ # not a fitted constant; a store can override it with flags["spatial_depth"]
92
+ # or BIOCORE_SPATIAL_DEPTH.
93
+ SPATIAL_SELECT_DEPTH = 20
94
+
95
+ # spatial_index (default ON): above SPATIAL_INDEX_THRESHOLD entries the semantic
96
+ # axis is bucketed by the sign pattern of the first SPATIAL_INDEX_PREFIX dims
97
+ # (LSH, Indyk & Motwani 1998). The bucket is a PRUNING structure, not an
98
+ # approximation: every bucket keeps a unit centroid and a radius, and
99
+ # |x - t| >= |c - t| - |x - c| with 1 - cos = |x - t|^2 / 2 for unit vectors
100
+ # lower-bounds the semantic distance of every member, so a bucket whose bound
101
+ # cannot beat the k-th best is skipped safely and the bucketed answer stays
102
+ # identical to the exact one. Below the threshold the exact traversal runs.
103
+ SPATIAL_INDEX_THRESHOLD = 5000
104
+ SPATIAL_INDEX_PREFIX = 8
105
+
106
+ # spatial_standardize (default ON): each axis distance is divided by the
107
+ # store's own standard deviation for that axis (Mahalanobis 1936), so an axis
108
+ # with a wide spread cannot outvote a narrow one just because of its units.
109
+ # An axis whose distances do not vary (std < SPATIAL_DEAD_AXIS_STD) is dead
110
+ # and gets weight 0 -- only dimensions that actually vary carry information
111
+ # (Kriegeskorte & Kievit 2013). Below SPATIAL_STANDARDIZE_MIN_SAMPLE entries
112
+ # the statistics are not trusted and the equal-weight raw sum is kept.
113
+ SPATIAL_STANDARDIZE_MIN_SAMPLE = 30
114
+ SPATIAL_DEAD_AXIS_STD = 0.01
115
+
116
+ # spatial_event_expand (default OFF): event segmentation (Zacks 2007) cuts a
117
+ # session into segments at change points -- a gap longer than the window, a
118
+ # different topic, or a different set of people. The coordinates stay per
119
+ # entry; the segment is only an extra dimension a recall can widen by.
120
+ EVENT_WINDOW_SECONDS = 600
121
+
122
+ # near_dup_time (default ON): a changed fact arrives as a near duplicate of the
123
+ # stored memory. Plus topic/entity overlap, plus different numbers/dates, marks
124
+ # the older one superseded. No keyword list, no version key.
125
+ # The threshold belongs to the MEASURE, not to the mechanism: a cosine of 0.9
126
+ # and a Jaccard of 0.75 are not the same test, so one number cannot serve both.
127
+ # Cosine: 0.90 (AGM-conservative -- a missed mark is cheaper than a wrong one).
128
+ # Jaccard: 0.75 (a Chinese paraphrase pair measures ~0.79; 0.85 would miss it).
129
+ # A store overrides each with flags["near_dup_cosine"] / ["near_dup_jaccard"]
130
+ # or BIOCORE_NEAR_DUP_COSINE / BIOCORE_NEAR_DUP_JACCARD.
131
+ NEAR_DUP_COSINE = 0.90
132
+ NEAR_DUP_JACCARD = 0.75
133
+
134
+ # activation_rank (default OFF): one retrieval score built from quantities the
135
+ # core already has. ACT-R base-level activation (Anderson 2004):
136
+ # B_i = ln(sum_k (now - t_k)^(-d))
137
+ # d = 0.5 is the classic ACT-R decay (paper); the PPR weight and the
138
+ # specificity weight are engineering defaults (no paper fixes them).
139
+ ACTIVATION_DECAY = 0.5 # paper: ACT-R, Anderson 2004
140
+ ACTIVATION_PPR_LAMBDA = 0.2 # engineering
141
+ ACTIVATION_SPEC_MU = 0.2 # engineering
142
+ ACTIVATION_SEEDS = 5 # engineering: seeds = current top-5
143
+ ACTIVATION_NEIGHBOURS = 5 # engineering: nearest neighbours for rho
144
+
145
+ # recall_depth (default 5 = the current behaviour, byte for byte). Above 5 the
146
+ # recall carries a wider pool through activation / rerank and only then cuts to
147
+ # top_k and runs MMR, so the sorting stages see more than the final k.
148
+ # 5 is the historical budget; 40 is the engineering cap the lead set.
149
+ RECALL_DEPTH_DEFAULT = 5 # engineering: current behaviour
150
+ RECALL_DEPTH_MAX = 40 # engineering
151
+
152
+ # point_expand (default OFF): hits first, then the neighbours of each hit
153
+ # inside its own event segment. POINT_EXPAND_RADIUS is how far +/- the hit
154
+ # grows (1 = one memory either side); POINT_EXPAND_TOKENS is the block budget.
155
+ POINT_EXPAND_RADIUS = 1
156
+ POINT_EXPAND_TOKENS = 1500
157
+
158
+ # spatial_cover_select (default OFF): choose k from the pool by spread, not by
159
+ # rank. MMR's redundancy term is the five-axis space distance; lambda 0.3
160
+ # balances relevance against coverage. The pool is the existing top-N.
161
+ SPATIAL_COVER_LAMBDA = 0.3
162
+ SPATIAL_COVER_POOL = 20
163
+
164
+
165
+
166
+ # Per-mechanism flags: safety/read-path filters default ON; every optional
167
+ # mechanism defaults OFF and must keep the old code path when disabled.
168
+ # A flags.json in the data directory overrides these booleans at engine start
169
+ # (and MemoryEngine.set_flags(..., persist=True) rewrites it).
170
+ FLAGS = {
171
+ # safety / read-path (default ON)
172
+ # GA-03: keep engine default ON. DSH private mode disables it per-store via
173
+ # <dsh store>/flags.json; the shared engine must not be relaxed globally.
174
+ "security": True, # store/security.should_reject before write
175
+ "provenance": True, # provenance hash tag + chained tombstones
176
+ "source_filter": True, # low-confidence candidates are counted/dropped
177
+ "temporal_filter": True, # honour valid_at/invalid_at on recall
178
+ "dedupe": True, # remember-side L0-L3 dedupe
179
+ # arXiv 2610.36308: same-key version resolution (default ON; the old
180
+ # behaviour is "nothing extracted, nothing marked, nothing filtered").
181
+ "memory_versioning": True,
182
+ # Howard & Kahana 2002: rank by the weighted sum of the five axes
183
+ # (default ON; OFF falls back to the old lexicographic order_key).
184
+ "spatial_weighted": True,
185
+ # Full-store candidate selection before the scoring fusion (default OFF;
186
+ # OFF keeps the old recall path byte for byte -- nothing is pre-selected).
187
+ "spatial_select": False,
188
+ # Semantic sign-pattern bucketing above SPATIAL_INDEX_THRESHOLD entries
189
+ # (default ON: it is exact, so it can only save work, never change a row).
190
+ "spatial_index": True,
191
+ # Per-axis standardisation + dead-axis removal (default ON; OFF is the
192
+ # equal-weight raw sum, byte for byte the old ordering).
193
+ "spatial_standardize": True,
194
+ # Usage feedback + axis-weight learning (both default ON; OFF keeps the
195
+ # equal 0.2 weights and writes no feedback rows).
196
+ "spatial_feedback": True,
197
+ "spatial_learn": True,
198
+ # Event-expanded recall: a hit also brings its segment neighbours.
199
+ "spatial_event_expand": False,
200
+ # activation_rank: B_i + semantic + PPR + specificity (default OFF).
201
+ "activation_rank": False,
202
+ # activation_update: a returned hit bumps hits / last_hit (default ON).
203
+ "activation_update": True,
204
+ # Near-duplicate, newer wins (default ON; OFF marks nothing at all).
205
+ "near_dup_time": True,
206
+ # Date prefix on injected memories (default ON; OFF is the old text).
207
+ "memory_date_prefix": True,
208
+ # Recall by event segment (default OFF; OFF is the per-entry path).
209
+ "segment_recall": False,
210
+ # Point-expand: hits first, then their neighbours (default OFF).
211
+ "point_expand": False,
212
+ # point_expand_rerank: expand, then rerank the pool (ON) / inject after (OFF).
213
+ "point_expand_rerank": True,
214
+ # Coverage select: pick k by five-axis spread instead of rank (default OFF).
215
+ "spatial_cover_select": False,
216
+
217
+
218
+ "relay": True, # relay card
219
+ "thread": True, # thread card / TTL expiry
220
+ "embedding": True, # optional embedding provider
221
+ # attention / model features (default OFF)
222
+ "slots": False,
223
+ "boundary": False, # slots/boundary.py event-boundary switching
224
+ "three_channel": False,
225
+ "eviction_readonly": False,
226
+ "identity": False,
227
+ "identity_writeback": False,
228
+ "due_hints": False,
229
+ # recall extensions (default OFF)
230
+ "bm25": False,
231
+ "bm25_multi": False,
232
+ "ppr": False,
233
+ "mmr": False,
234
+ "mood_recall": False,
235
+ "affect_encoding": False,
236
+ "memory_feedback": False, # task-218: recalled affect nudges the live affect
237
+ "preference_drift": False, # task-219: repeated topics drift value_order weights
238
+ "complexity": False,
239
+ "constraints": False,
240
+ "tiering": False,
241
+ "entity_boost": False,
242
+ "inhibition": False,
243
+ "retrieval_practice": False,
244
+ "compress": False, # output-only summary, never mutates the store
245
+ "source_consistency": False, # source-rank marking/downweight on recall
246
+ # eviction extension modules (default OFF)
247
+ "heat": False,
248
+ "consequence": False,
249
+ "tiering_exec": False,
250
+ "apply_evictions": False, # tick() may really soft-delete archived entries
251
+ "deletion_audit": False, # derived-data coverage audit after forget()
252
+ "adaptive_evict": False, # adaptive_score replaces the tick eviction score
253
+
254
+ # write-path extensions (default OFF)
255
+ "consistency": False, # old/new fact conflict annotation on remember
256
+ "rate_limit": False,
257
+ "audit": False,
258
+ "permissions": False,
259
+ "notes": False,
260
+ "media": False,
261
+ "notes_link": False,
262
+ "ledger": False,
263
+ # index / graph
264
+ "graph": False,
265
+ "cue_writeback": True, # store cue_index fields on each new entry (index-only, no recall change)
266
+ # consolidation modules (default OFF)
267
+ "consolidate_auto": False, # after-turn auto consolidate every CONSOLIDATE_AUTO_TURNS remembers
268
+ "consolidate_gated": False,
269
+ "consolidate_tree": False,
270
+ "consolidate_reflection": False,
271
+ "consolidate_neighbors": False,
272
+ "consolidate_writeback": False,
273
+ "narrative": False, # identity narrative update at consolidate end
274
+ }