SkyIsNotGreen commited on
Commit
98fbf56
·
verified ·
1 Parent(s): 14514c2

Update SkyIsNotGreen/splinter-memory from the HiveBench Studio

Browse files
Files changed (1) hide show
  1. README.md +238 -8
README.md CHANGED
@@ -74,13 +74,53 @@ milliseconds.
74
  | Retrieval precision (sentence proxy) | near-chance past the window | ≥70% / ≥85% | **10.7%** - *the encoder ceiling* (§7) |
75
  | Context sufficiency vs. an equal-size FIFO window | — | ≥80% of turns | **85.1%** of the fact-retrievable turns (4.4:1) |
76
  | Routing accuracy | — | ≥80% / ≥92% | **100%** |
77
- | Added per-turn latency | 0 ms | <50 / <30 ms | **≈18 ms** (3.4 ms assembly + ~15 ms scoring) |
78
  | Peak RSS over 500 turns | — | small | **34.7 MB** |
79
  | Pipeline Efficiency Score | ~30 | ≥65 / ≥80 | **80.0 (GREEN)** live, 73.1 on the 20-conversation evidence run |
80
 
81
  Full protocol, per-hypothesis logic chains and falsification conditions:
82
  §5 of the canonical paper.
83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  ## Use it
85
 
86
  Three ways, in increasing order of control:
@@ -140,13 +180,66 @@ generates → the reply is observed back into the store.
140
  the time, which is enough to drive parameter tuning without a human
141
  labelling pass.
142
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  ## The evidence, hypothesis by hypothesis
144
 
145
  | | Hypothesis | Verdict |
146
  |---|---|---|
147
  | P1 | Constant throughput over 500 turns | **PASS** |
148
  | P2 | Retrieval precision ≥85% at ≥90% recall | **SPLIT** - recall PASS (90.3%), precision FAIL (the encoder ceiling) |
149
- | P3 | Context sufficiency ≥80% of turns vs. an equal-size FIFO window | **PASS** (85.1%) |
150
  | P4 | Domain-dependent decay curve (code vs. prose separate) | **PASS** (code m90 1.8 vs. prose 1.2) |
151
  | P5 | Targeted masking | **PASS** |
152
  | P6 | Confidence escalation | **FAIL** |
@@ -195,11 +288,118 @@ not re-derived.
195
  | drift at the shipped threshold (0.6) | precision 0.08, **recall 0.96** - the topic-change test fires on almost every turn |
196
  | drift as a *ranking* signal | **AUC 0.945** - the signal is strong; the threshold is wrong |
197
 
198
- The encoder is not the bottleneck. The **operating points** are - and they
199
- are per-encoder, so they have to travel with the model. The full sweep
200
- (model families, sizes, dimensions, CPU cost per chunk) is in
201
- `docs/ENCODER-NOTES.md` in the harness repository, and the evaluation sets
202
- are published as a dataset next to this card.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
 
204
  ## Limits, honestly
205
 
@@ -217,6 +417,20 @@ are published as a dataset next to this card.
217
  isolate conversations per store and filter refusals out of the store.
218
  - **The decay curve is an engineering heuristic** with cognitive-science
219
  inspiration, not a validated model of human forgetting.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
 
221
  ## Reproduce
222
 
@@ -225,7 +439,10 @@ are published as a dataset next to this card.
225
  pytest tests/unit tests/integration -q
226
 
227
  # the encoder sweep on your own traffic
228
- python -m experiments.encoder_suite --encoders l3 l6 bge-small
 
 
 
229
 
230
  # the cascade pilot (local model, deterministic verifiers)
231
  open http://127.0.0.1:8765/cascade
@@ -234,6 +451,19 @@ open http://127.0.0.1:8765/cascade
234
  The repository ships the run bundles, the event logs and the label files, so
235
  a verdict can be traced back to the bytes that produced it.
236
 
 
 
 
 
 
 
 
 
 
 
 
 
 
237
  ## License and citation
238
 
239
  MIT. See `LICENSE` and `CITATION.cff` in this repository.
 
74
  | Retrieval precision (sentence proxy) | near-chance past the window | ≥70% / ≥85% | **10.7%** - *the encoder ceiling* (§7) |
75
  | Context sufficiency vs. an equal-size FIFO window | — | ≥80% of turns | **85.1%** of the fact-retrievable turns (4.4:1) |
76
  | Routing accuracy | — | ≥80% / ≥92% | **100%** |
77
+ | Added per-turn latency | 0 ms | <50 / <30 ms | **≈18 ms** on a small store (3.4 ms assembly + ~15 ms scoring) - **and it grows with the store**: 22.8 ms at 212 chunks, 156.8 ms at 1,612 (§7.4) |
78
  | Peak RSS over 500 turns | — | small | **34.7 MB** |
79
  | Pipeline Efficiency Score | ~30 | ≥65 / ≥80 | **80.0 (GREEN)** live, 73.1 on the 20-conversation evidence run |
80
 
81
  Full protocol, per-hypothesis logic chains and falsification conditions:
82
  §5 of the canonical paper.
83
 
84
+ ### The whole protocol, refreshed on the 35B-A3B
85
+
86
+ The P1-P11 protocol re-run live against the **35B-A3B ternary** (a
87
+ 12-conversation fixture subset), to ask whether the verdict set is a
88
+ property of the architecture or of the generator it was measured on:
89
+
90
+ | | verdict | the evidence |
91
+ |---|---|---|
92
+ | P1 constant throughput | **PASS** | the throughput does not decay |
93
+ | P2 retrieval precision | **FAIL** | the precision clause (the known encoder ceiling, §7) |
94
+ | P3 context sufficiency | **PASS** | the curated context against an equal-size FIFO window |
95
+ | P4 domain-dependent decay | **PASS** | code m90 1.8 vs prose m90 1.2 - a gap of 0.6, beyond the 0.2 band |
96
+ | P5 targeted masking | SKIP | a training experiment |
97
+ | P6 confidence escalation | **FAIL** | the escalated recall is worse (0.174 vs 0.565) |
98
+ | P7 auditor-human agreement | SKIP | it needs human raters (90.25% measured 2026-08-23) |
99
+ | P8 routing accuracy | **PASS** | 200/200 |
100
+ | P9 densest-duplicate retention | **PASS** | the densest chunk wins 100% of the turns |
101
+ | P10 drift reset | **FAIL** | the reset changes the recall by 0.0 points |
102
+ | P11 comb resurrection | **PASS** | the pressure regime: 100% topic-return recall against 20% without the comb |
103
+
104
+ **PASS 6/11, 2 skipped - the published verdict set, exactly.** The
105
+ published run (2026-08-23/24, on a 27B, on the full corpus) reported
106
+ P1/P3/P4/P8/P9/P11 PASS, P2/P6/P10 FAIL, P5/P7 SKIP. The same set
107
+ reproduces on a different model and a smaller corpus, which says the
108
+ protocol measures the architecture rather than the generator.
109
+
110
+ **One of the failures now has a candidate mechanism.** P10 (the drift
111
+ reset) measures a detector whose threshold was calibrated for a different
112
+ encoder (§7): forced on, it fires on 571 of 628 turns, so "the reset has
113
+ no effect" may be measuring a detector that fires on almost everything
114
+ rather than a reset that does not work. The verdict stands as measured;
115
+ the mechanism is now in question, which is a different claim.
116
+
117
+ **And the one result that does not carry over is P3's margin.** On the
118
+ 27B the curated context won 115 turns outright to 26; on the 35B it is a
119
+ tie (§7.3). The *verdict* holds (the curated context is sufficient, and
120
+ at least as good on 88.4% of the turns); the *margin* does not. The
121
+ curation's accuracy advantage is a function of the generator - what
122
+ survives for a strong one is the bounded context and the cost.
123
+
124
  ## Use it
125
 
126
  Three ways, in increasing order of control:
 
180
  the time, which is enough to drive parameter tuning without a human
181
  labelling pass.
182
 
183
+ ## The harness that runs it, and the pipeline that manages it
184
+
185
+ The memory system is a library; the **HiveBench Studio** is the harness
186
+ that runs it, and it is where the management pipeline lives.
187
+
188
+ ### The management pipeline
189
+
190
+ A long-horizon memory has to be *managed*: every knob that decides what
191
+ the model sees used to live in three different menus, and a wrong setting
192
+ was invisible. The Studio has one place for all of it - the **Global
193
+ harness controls** - and every block of it is a *baseline* that the more
194
+ specific thing beats:
195
+
196
+ | block | what it decides |
197
+ |---|---|
198
+ | **the encoder** | which small model does the retrieval and the memory management - you choose it, and the next conversation runs on it (no restart) |
199
+ | **Memory & RAG** | the curation baseline: the context window, the stale wall, the dedup and drift thresholds, the comb, the medium drone |
200
+ | **Quality** | the cascade's judge, repair, gate and escalation - the defaults every run starts from |
201
+ | **MCP** | what an external client may read and write of the memory |
202
+ | **Runtime** | the sampling a reply is drawn with, and the context, GPU layers and threads an engine is launched with |
203
+
204
+ The point is not tidiness. It is that **a setting which is not consulted
205
+ is indistinguishable from a setting which does not work**, and the only
206
+ way to know which one you have is to wire them and then measure.
207
+
208
+ ### The harness itself
209
+
210
+ | | |
211
+ |---|---|
212
+ | the console | Home, Settings, Global, Cascade, and a "More tools" group (Agent, Engines, Local library, Providers, Hub, Inspector, Training) |
213
+ | the chat | Splinter mode (one curated reply) or Agent mode (the tool loop); the reply says who produced it |
214
+ | the launch panel | llama.cpp or Strata, per engine, from the profiles; stop closes the connection so the *engine* stops; unload gives the VRAM back and retires the orphans |
215
+ | the cascade console | every runner knob in one form, with the Global tab's Quality block as its starting values |
216
+ | the harvest | every turn (the query, the reply, the curation that was used) written to a jsonl, off by default - this is the data the encoder is trained on |
217
+
218
+ ### Answer quality reporting and API escalation
219
+
220
+ The curation's effect is not only felt, it is reported. Every cascade run
221
+ writes a per-item report (the verdict, the detector findings, the repair
222
+ attempt, the ladder's resolution), a provenance manifest (the model
223
+ sha256, the stack, the git commit, the task-set sha, the decode
224
+ settings) and a generated model card; and the escalation lane harvests
225
+ every ladder-resolved item to `escalation.jsonl` next to the report -
226
+ training-side only, and read by nothing in the runtime.
227
+
228
+ The escalation ladder itself is the last stage: an answer the local
229
+ verifiers still flag can go to a human gate (verbose on the first
230
+ trigger, compact afterwards) and then to an API tier, with the served
231
+ answer, the cost and the reason recorded. The companion paper
232
+ (*The Hive Cascade*) documents the loop, the gold-free runtime contract
233
+ and the measured verdicts; the benchmark and the run reports are
234
+ published next to this card.
235
+
236
  ## The evidence, hypothesis by hypothesis
237
 
238
  | | Hypothesis | Verdict |
239
  |---|---|---|
240
  | P1 | Constant throughput over 500 turns | **PASS** |
241
  | P2 | Retrieval precision ≥85% at ≥90% recall | **SPLIT** - recall PASS (90.3%), precision FAIL (the encoder ceiling) |
242
+ | P3 | Context sufficiency ≥80% of turns vs. an equal-size FIFO window | **PASS** (85.1% on the 27B); on the 35B-A3B the answer-level result is a tie (88.4% at-least-as-good, 13 strict wins to 17) - see §7.3 |
243
  | P4 | Domain-dependent decay curve (code vs. prose separate) | **PASS** (code m90 1.8 vs. prose 1.2) |
244
  | P5 | Targeted masking | **PASS** |
245
  | P6 | Confidence escalation | **FAIL** |
 
288
  | drift at the shipped threshold (0.6) | precision 0.08, **recall 0.96** - the topic-change test fires on almost every turn |
289
  | drift as a *ranking* signal | **AUC 0.945** - the signal is strong; the threshold is wrong |
290
 
291
+ ### 7.1 The F1 is the wrong target, and the threshold is not the lever
292
+
293
+ The obvious conclusion - "move the thresholds to the encoder's optimum" -
294
+ is **falsified** by a deterministic replay of the corpus through the real
295
+ pipeline (50 conversations, 493 measurable turns, the P2 diagnostic's own
296
+ notion of a fact; `experiments/threshold_ab.py`):
297
+
298
+ | arm | dedup / drift | fact recall | context | verdict |
299
+ |---|---|---|---|---|
300
+ | shipped | 0.92 / 0.6 | **50.6%** | 159 tok | - |
301
+ | the dedup alone | 0.57 / 0.6 | **39.7%** | 90 tok | **falsified** |
302
+ | the drift alone | 0.92 / 0.77 | **50.6%** | 159 tok | **survives** |
303
+
304
+ **The duplicate test's two errors are not interchangeable.** A duplicate
305
+ test that fires wrongly *deletes* a chunk, and the fact inside it is gone
306
+ irreversibly; a duplicate test that fails to fire only leaves a redundant
307
+ chunk in the context, which costs budget and nothing else. F1 weights
308
+ them equally, so F1 points at the wrong threshold: at 0.57 the encoder
309
+ merges chunks that are *about* the same thing but carry *different* facts,
310
+ and the fact recall falls by a fifth. The shipped 0.92 is conservative
311
+ **for a reason** - its precision is 1.00, so it never deletes a fact - at
312
+ the price of catching only 5% of the redundancy.
313
+
314
+ The topic-drift test is the opposite case: it only *penalises* the
315
+ off-topic chunks, it never deletes them, so its recalibration is free.
316
+
317
+ **The model is the lever, not the threshold.** A small encoder tuned on
318
+ the harness's own traffic (17M parameters, one epoch, the dedup task
319
+ only, labelled with the same lexical rule) merges **six times more true
320
+ duplicates** at the *same* precision - and the fact recall goes *up*
321
+ slightly, not down:
322
+
323
+ | encoder | fact recall | the dedup's recall at 0.92 | the dedup's precision |
324
+ |---|---|---|---|
325
+ | the stock L3-v2 | 50.55% | 0.046 | 1.00 |
326
+ | the tuned encoder | **50.93%** | **0.292** | 1.00 |
327
+
328
+ The encoder can be improved because it improves the *ranking* of what is a
329
+ duplicate. The threshold cannot be lowered because lowering it moves the
330
+ *boundary*, and the boundary is where the distinct facts get caught.
331
+
332
+ ### 7.4 The curation's cost grows with the conversation it curates
333
+
334
+ The stability run - 2,000 turns of a growing conversation, the real drone,
335
+ no model (`experiments.stability_500.py`):
336
+
337
+ | turns | the store | the assembled context | the curation's cost (p50) | the peak RSS |
338
+ |---|---|---|---|---|
339
+ | 250 | 212 chunks | 322 tok | 22.8 ms | 519 MB |
340
+ | 500 | 412 chunks | 320 tok | 37.3 ms | 564 MB |
341
+ | 1,000 | 812 chunks | 335 tok | 89.7 ms | 594 MB |
342
+ | 2,000 | 1,612 chunks | 332 tok | 156.8 ms | 667 MB |
343
+
344
+ **The context is flat and the cost is not.** The assembled context moves
345
+ by 10 tokens across a 7.6x range of store - the curation's promise holds
346
+ ✓✓ - and nothing is OOM-killed over 2,000 turns ✓. But the curation's
347
+ per-turn cost is **linear in the store**: about 7x for 7.6x the chunks,
348
+ because every chunk is scored every turn.
349
+
350
+ So the memory's trade is explicit, and the published "≈18 ms added per
351
+ turn" is the *small-store* number: the prompt stays bounded (the
352
+ expensive part for the model) while the curation gets more expensive as
353
+ the conversation grows. The two costs trade against each other, and the
354
+ crossover - the point where curating costs more than the tokens it saves
355
+ - is a measurement the system does not yet make.
356
+
357
+ ### 7.3 The curation's advantage is generator-dependent
358
+
359
+ The paired A/B - the same model, the same turns, the curated context
360
+ against the last-4k-token window of the same history - is the memory
361
+ system's headline measurement (P3). It was measured on a 27B, and it has
362
+ now been measured on the **35B-A3B ternary** (180 measurable turns):
363
+
364
+ | | the curated arm | the FIFO arm |
365
+ |---|---|---|
366
+ | the answer's fact recall | 81.1% | 81.7% |
367
+ | the context fidelity (the answer's terms sourced from its own context) | **0.241** | 0.208 |
368
+ | the turns where the answer is at least as good | **88.4%** (the bar: 80%) | - |
369
+ | the strictly-better turns | 13 | 17 |
370
+ | the context sufficiency (P3-style) | **97.5%** >= FIFO | - |
371
+
372
+ **On the 27B the curated arm won 115 turns outright to 26 (4.4:1). On the
373
+ 35B it is 13 to 17** - a tie - and the answers are equal (81.1% against
374
+ 81.7%). The "neither" bucket collapses too (145 of 175 on the 27B, 34 of
375
+ 180 here): the 35B answers from *whatever* context it is given.
376
+
377
+ **The scoping result: the better the generator is at long context, the
378
+ less the curation has to add.** The FIFO window is the most recent turns
379
+ verbatim, and a model that uses them well does not need a curation to find
380
+ them. This is what Postulate 3 (the separation) implies - the curation is
381
+ a substitute for a *weaker* reader - and it is the first thing the
382
+ measurements had not tested.
383
+
384
+ **What survives.** The curated context is still sufficient on 97.5% of the
385
+ turns, its fidelity is ahead, and - the part the numbers above do not
386
+ touch - the curation is what keeps the context **bounded**: the FIFO arm
387
+ is 4k tokens of pure recency, and the two arms are equal *at that
388
+ budget*. The honest claim for a strong generator is the bounded context
389
+ and the cost, not the better answers.
390
+
391
+ ### 7.2 What we changed, and what we did not
392
+
393
+ - The shipped configuration stays: the stock encoder at the shipped
394
+ thresholds, because that is the configuration the published evidence was
395
+ produced with.
396
+ - The next fine-tune weights a false merge above a missed merge
397
+ (precision-weighted at the operating point) instead of optimising F1 -
398
+ the asymmetry makes F1 the wrong target - and is measured on a held-out
399
+ split, because the current one was trained and measured on the same
400
+ traffic (a fit, not a generalisation).
401
+ - The full sweep, the fine-tune runs and the replay are in
402
+ `docs/ENCODER-NOTES.md` in the harness repository.
403
 
404
  ## Limits, honestly
405
 
 
417
  isolate conversations per store and filter refusals out of the store.
418
  - **The decay curve is an engineering heuristic** with cognitive-science
419
  inspiration, not a validated model of human forgetting.
420
+ - **The large tier is a state, not a model.** The 176B-A6B answers at
421
+ 60-73 tok/s warm and 3 tok/s cold, on the same engine and the same
422
+ request: a fresh prompt read costs 5 tok/s and a reused prefix 71, and
423
+ the cold phase is the OS pulling 60 GB of expert weights off the NVMe
424
+ (the file is 20.8% page-cached on a 30 GB box). Warm and alone it
425
+ answers the cascade's 28 tasks in 26.9 s an item; co-sited with the
426
+ small tier, in 229.7 s. A deployment that measures the large tier
427
+ cold, or with another engine resident, measures the box and not the
428
+ model. Two levers pay and the rest do not: keep it warm, and run it
429
+ alone. A whole-file prefetch does not - a 13 GB page cache cannot hold
430
+ a 60 GB file, and the kernel's `WILLNEED` left it at 0% cached for
431
+ 80 s. The engine's resident tier (`--resident-budget-gib`) does: it
432
+ keeps what the VRAM cache cannot hold in ordinary RAM, and the storage
433
+ read on the second request falls from 1.4 GB to 146 MB.
434
 
435
  ## Reproduce
436
 
 
439
  pytest tests/unit tests/integration -q
440
 
441
  # the encoder sweep on your own traffic
442
+ python -m experiments.encoder_suite --encoders l3 l6 bge-small e5-small gte-small
443
+
444
+ # the threshold replay (deterministic: no model, no generation)
445
+ python -m experiments.threshold_ab
446
 
447
  # the cascade pilot (local model, deterministic verifiers)
448
  open http://127.0.0.1:8765/cascade
 
451
  The repository ships the run bundles, the event logs and the label files, so
452
  a verdict can be traced back to the bytes that produced it.
453
 
454
+ ### The artifacts
455
+
456
+ | artifact | what it is |
457
+ |---|---|
458
+ | `SkyIsNotGreen/splinter-memory` | this paper, the figures, the license and the citation |
459
+ | `SkyIsNotGreen/splinter-encoder` | the tuned drone encoder, its card, its configuration and its gate results |
460
+ | `SkyIsNotGreen/hive-cascade` | the cascade's benchmark (a 70/30 split) and two full run reports |
461
+ | `SkyIsNotGreen/Scion-35B-A3B` | the ternary 35B-A3B model and its decision head |
462
+ | `SkyIsNotGreen/Scion-FlashNext-176B-A6B` | the ternary 176B-A6B model |
463
+
464
+ The releases are private while the results are being refreshed; they open
465
+ when the refreshed numbers are in.
466
+
467
  ## License and citation
468
 
469
  MIT. See `LICENSE` and `CITATION.cff` in this repository.