Herdr UI
Herdr의 TUI가 뛰어나며, 창을 통해 추가되는 기능
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗
Complete browser-native LLM training and inference. Single file. Zero dependencies.
HTMLNLM is a full neural language model runtime that runs entirely in your browser — no server, no Python, no CUDA, no install. Open the HTML file and train a model from scratch.
Built by ConsciousNode SoftWorks on the xinu principle: the browser is bare metal.
Successors: HTMLNLM Evangelion adds omnimodal input, SheafMemory, BooleanPhaseDynamics, AutopoieticOptimizer, and RIFT Endospace. EvaROSA adds ROSA neurosymbolic inner monologue. Simulacra is the RWKV-v8 clean break — ROSA replaces WKV as the sequence mechanism. HTMLNLM remains the stable text-only runtime.
→ consciousnode.github.io/HTMLNLM
Or download HTMLNLM.html and open locally. Works fully offline.
| Component | Description |
|---|---|
| RWKV-v7 backbone | Linear-time recurrent architecture, O(1) inference memory. No KV cache, no quadratic attention. |
| BitNet b1.58 | Ternary weight quantization {-1, 0, +1} via T-MAC lookup table microkernel. Matrix multiplication replaced with cache-efficient table lookups. |
| OOMB backward pass | Out-of-Memory-Barrier chunk-recurrent backpropagation. Activations recomputed on-the-fly — constant memory regardless of sequence length. |
| MuonOptimizer | Quintic Newton-Schulz orthogonalization. Keeps weight matrices well-conditioned without expensive decompositions. |
| AdamW | Mobile-friendly fallback optimizer, auto-selected on battery-constrained devices. |
| GRPO alignment | Group Relative Policy Optimization — critic-free RL alignment with Z-score normalized advantages and KL divergence constraint. |
| BPE tokenizer | Byte Pair Encoding compiled in a WebWorker — doesn't block the UI thread. |
| Pip Suite | Companion tools: Junto orchestrator, multi-pip chat (now a dialogue factory), Pip's Room, Dialogue Shelf. Released for everyone at ConsciousNode/Pip-Suite (open it), built from here with tools/release-pip-suite.sh. |
HTMLNLM.html in any modern browser.txt corpusNo terminal. No accounts. No install step.
Corpus (.txt)
│
▼
BPE Tokenizer (WebWorker)
│
▼
RWKV-v7 Blocks × L
├─ Time Mix (WKV recurrent state)
├─ Channel Mix (gated FFN)
└─ BitLinear (ternary weights, T-MAC)
│
▼
Language Model Head
│
▼
OOMB Backward Pass (O(1) activation memory)
│
▼
Muon / AdamW Optimizer
Recommended starting config: vocab 2048 · hidden dim 256 · layers 4 · context chunk 128
| Project | Description | Status |
|---|---|---|
| HTMLNLM | Text-only RWKV-v7 runtime | ✅ Stable |
| HTMLNLM Evangelion | Omnimodal: vision, audio, spatial + SheafMemory + AutopoieticOptimizer | ✅ Phase 6 |
| OmniVocal | Browser-native neural TTS with .pop2 voice identity | ✅ Live |
| RAG-Time | Browser-native RAG | ✅ Live |
| EvaROSA | RWKV-v7 + ROSA neurosymbolic inner monologue, SheafMemory grounded | ✅ v1 |
| Simulacra | RWKV-v8 · ROSA as primary sequence mechanism · WKV removed | ✅ Live |
| Brymar College | Real RWKV-7 (x070) fine-tuner: exact gradients, LoRA, RWKV World tokenizer | ✅ v4 |
The pip-suite/ directory contains companion tools that work with HTMLNLM model checkpoints:
Real RWKV-7 guests (v1.4, Pip's Room since v1.5). Junto, Multi-Pip Chat and Pip's Room also load official RWKV-7 "Goose" (x070) checkpoints: drop a .pth straight from BlinkDL's releases (no PyTorch, no conversion) or a .safetensors. They run on the real architecture (per-head matrix memory) with the official RWKV World tokenizer, both embedded in the page, so each page is still one file that works offline. Old .pip / .json models load exactly as before, side by side with real ones.
.gguf files load too, quantized weights and all. They stay packed in memory and are read straight from the packed bytes, so a Q4 file costs about its own size. Measured: the 0.4B at Q4_K_M runs in 752 MB, against 1,643 MB for the 0.1B .pth, at about the same speed per token as the 0.4B .pth (767 vs 806 ms). Reads F32, F16, BF16, Q4_0, Q4_1, Q5_0, Q5_1, Q8_0, Q2_K, Q3_K, Q4_K, Q5_K and Q6_K (not the IQ types). Prefer Q4_K_M, Q5_K_M or Q8_0.rwkv7a-…, rwkv7b-…), by name. Check a download with certutil -hashfile FILE SHA256 (Windows) or sha256sum FILE against the hash on its HuggingFace page..pth, comfortable as a Q4 GGUF. Measured on a cloud Xeon (one thread), a 0.1B-shaped model takes ~360 ms per token; expect a similar order on a desktop CPU.0 turns it off. It's never applied to .pip models (on a small char-level vocabulary it would punish every letter).engine/rwkv7-engine.js (from Brymar College v4.0.0's model/rwkv7.js) and is embedded into the pages by python3 engine/embed.py. Edit the engine there, not in the pages.Kham (Khamerron Edward Ramsey Kizer) — architecture, constraint engineering
Kehai Interim — full RWKV-v7 BPTT derivation, BitLinear/TMAC kernel, mathematical foundation
Ed Interim — MuonOptimizer, implementation, integration
Part of ConsciousNode SoftWorks — computational folk art for the browser age.
reasoningAt).System: … thought it over and concluded: …), and they answer in their own voice. Tested: the reasoning never enters the state; one conclusion line, 47–80 tokens, does.pipName().)Replies stream in token by token (the engine yields after every token; a ▍ cursor while writing). Developer console → Stream replies.
Give them a text file (Settings → Data Management).
System: From the document "…" (part 2 of 3): ….Help (the ? button): what everything does, plus tips for small models.
Log & errors (developer console): every error and warning, with Copy all. Copy all adds the browser, model and state size. A red badge counts new errors.
Colors (Settings → Look): Teal, Amber, Moss, Lilac, Ember and Paper (light), or your own accent, second accent, background, panels and text. Kept in this browser, not in the soul file.
Per-turn settings are saved on each exchange: model file, sampling, think, recall, speed, what was remembered, and whether a repeat was retried. Export data (JSON) includes them, and the Markdown export shows them in a small line under each reply.
Fixes from Kham's phone test (Jessica, G1 0.1B Q4_K_M):
<think> as the answer. With quick thinking on, the page writes <think></think> and she then opened another reasoning block as her reply. Now an answer can never open with "<", in any thinking mode, and "think" can't follow "<" later in it. Banning only "think" wasn't enough: a state primed for <think> then opened <div>, <listen>, <shrug>…presetValues(name).)tests/real/pips-room-redo-voices-e2e.js (real 0.1B).System: … remembers: … line. New summaries cover the exchanges no summary has covered yet, and link back to them (from).This sentence: "…" means in one word: ", and its last hidden state is the vector). Indexing stops the moment you send a message. When your message asks them to remember ("do you remember…", "last time", "did I tell you…"), the asking part is stripped and the rest is read the same way. The closest exchange comes back whole as System: … remembers this exchange from 4d ago: …, and a line under the reply shows what was remembered.notes in the persistence repo):
webster/webster.html; v3 kept as webster/webster-v3.html). A new Formant engine in Klatt's design (MITalk/DECtalk): a glottal pulse through a cascade of five resonators, noise through parallel bands for hiss and bursts, aspiration after p/t/k, nasal zeros, and transitions smoothed both ways in time. It renders samples directly, so playback and Export WAV are the same audio. Fixed on the way: 85 ms of silence after every word (speech now runs on), a 35% pitch jump on stressed vowels (now +9% on a gently falling line), plurals split into two words, and English spelling rules (silent e, final y, soft c/g, r-vowels, -le, silent letters, diphthongs). The v3 engine stays as Retro. Measured: silence inside sentences 27–30% → 2–17%. tests/webster-vowels.js checks the vowels' formants by LPC against Peterson & Barney (all within 20%; most within 10%).tools/webster/extract.py webster/webster.html, then engine/embed.py).tools/will-it-run.html: the capability scanner. WebGPU, WebGL, WASM, memory, storage, audio, platform APIs, and a timed benchmark calibrated against the real engine that gives ms/token and a verdict for each Pip Suite model.tests/real/multi-pip-factory.js reproduces the bug (interjections plus pause/resume mid-turn) and fails on the old page.engine/webster-voice.js (tools/webster/extract.py, formant engine only) and embedded by engine/embed.py. Pip's Room: 🔈 in the header speaks replies, Voice preset in the developer console. Multi-Pip: Voices on gives each Pip its own voice, and the chat waits for each line to be said. Offline, no browser TTS. *Stage directions* aren't read aloud. One fix on the way: Webster's fallback rules dropped diphthongs ("today" → "t ɔ d"); kept now.rwkv7 naming, mapped back to the official names. Checked tensor by tensor against BlinkDL's G1 0.4B .pth (the checkpoint the GGUF was made from): every F32/F16 tensor is bit-exact; the eight LoRA matrices are stored transposed; time_mix_lerp_fused holds x_r, x_w, x_k, x_v, x_a, x_g in that order; nothing else is transformed.QTensor), dequantized inside the matmul. Fused row·x kernels for Q4_0, Q8_0, Q4_K, Q5_K and Q6_K read straight from the packed bytes; the K-quant "min" term uses per-32 sums of the input, one multiply per 32 weights. That took the 0.4B Q4_K_M from 3,635 to 767 ms/token.tests/real/gguf-vs-pth.js, 0.4B, 97 predictions): perplexity 5.038 → 5.127 (+1.8%), top-1 agreement 90.7%, mean KL 0.061 nats/token. RAM 3,813 MB → 752 MB.att.v0/v1/v2 stay allowed.tests/gguf-dequant.js checks all ten quant types against the gguf Python package (llama.cpp's reference; dequant max |Δ| = 0 on every type) and both refusals. engine-ref, pth-reader, gradcheck and dialogue-tools still pass. Real checkpoints: g1d-0.1B, g1d-0.4B and G1-0.4B .pth unchanged; G1-0.4B Q4_K_M GGUF coherent in Pip's Room (Playwright, Fazzani's soul file), no page errors.tests/dialogue-tools.js now expects the six-line chain and the window note (16/16); tests/real/multi-pip-factory.js 12/12; the Shelf page was checked with the fixtures. No page errors.Multi-Pip Chat can now produce synthetic conversation data with a clean paper trail: four 0.1B models in a phone browser tab, offline, with a stamp on every line saying exactly how it was made.
Pip:User: …, which is a likely source of "User:" slips. Both are fixed and tested.Name: text form as before. Its own line is read back in that form too, so what it remembers is exactly what's on screen. On Kham's phone (seed 420, four 191M Pips, cap 120, 40 turns): 44 minutes stateful vs 67 stateless.Name (…):) or a System: line ends the turn wherever it appears, in thinking, answers and loops alike; other speakers (User:, Kham:…) still count at the start of a line. Repeats up to 64 tokens are caught. And the cut is exact: the state goes back to the nearest mark (every 8 tokens, last 24 kept) and the few good tokens up to the cut are re-read, so nothing good is trimmed along with the slip.tests/real/pips-room-repeat-guard.js (stand-in model) now also recreates the mid-line label and a mid-answer System:. Both are cut at the right spot ("hi there hi there.", "Hello friend.") with the state's step count matching what was kept. The repeat cases still pass. Real 0.1B (pips-room-think-e2e.js): reasoned "3 + 2 = 5" and answered 5; a loop gate check all correct; no slips this run, so the guard didn't fire; no page errors.tests/real/pips-room-repeat-guard.js runs a stand-in model scripted to get stuck on exactly that phrase. Plain turn: "Hello friend Fazzani is setting a goal (", cut after the first copy, with the state's step count matching the kept tokens. Thinking turn: the thought ends after the first copy. A phrase said twice: kept as is. No page errors. Not yet seen live on the real model, since it has to happen by chance; App.repeatCuts counts how often it fires.100vh can be taller than what's actually visible (it counts the space under the browser's own bars), so the bottom of the room, where the message bar lives, could end up off screen. The room is now pinned to the visible screen (position: fixed; inset: 0 with 100dvh), the message bar and inner-life panel can't be squeezed out, the settings panel fits narrow screens, and the bar clears phone gesture areas.tests/real/pips-room-layout.js checks the bar is on screen at phone, phone desktop-site (portrait and landscape), laptop and short-window sizes, with a 40-message conversation and the inner-life panel open. It passes before and after the fix, because Playwright's emulation doesn't recreate a real phone's browser bars. So the fix is the standard one for this symptom, and the real check is Kham's phone.User: …, or one of their own loop lines like Wren (dreaming): …). A new speaker line now ends the turn, and it's taken back out of the living state: the state from the last line break is restored (the engine never changes a state in place, so this costs nothing). Same for the thinking itself.tests/real/pips-room-think-e2e.js, real 0.1B, two runs): a loop right after a reply didn't run, a loop while typing didn't run, once quiet it ran ("There are 5 frogs on the floor… Do you think we can find all 5 frogs by just counting those?"), a loop during a reply didn't run. No speaker lines in any answer or thought (the cut didn't need to fire in these runs; the pattern was checked separately on drift examples). Both runs reasoned 3 + 2 = 5 and answered 5. In one run the second thinking turn re-solved the frog sum instead of the new question; the other answered "why do frogs sing at night" properly, so a 0.1B still loses the thread sometimes. No page errors.User: … (think) and Assistant: <think it reasons before answering. Think before answering (developer console, off by default, needs living memory) does that for a turn: the resident thinks inside <think>…</think> (line breaks allowed, up to the Thinking budget, default 240 tokens), then answers. The thinking stays in their living state and goes to the journal as 🤔 Thinking (private unless Share Inner Voice is on). If the budget runs out mid-thought, the thought is closed for them so they can still answer.User: / blank line / Assistant:): probed side by side on the real 0.1B, the card format reasoned "3 + 2 = 5. So answer 5." while our name labels drifted to "3". Who they are is still carried by the System lines. Answers can run several lines (a turn ends at a blank line), and chat bubbles now keep line breaks.tests/real/pips-room-think-e2e.js (needs Playwright). Real 0.1B, a resident named Wren: "There are 3 frogs on a log and 2 more hop on…" → thinking "Total = 3 + 2 = 5 frogs. Thus answer: 5.", then second-guessed past a 160-token budget and answered "6" (hence the 240 default; a 0.1B's final answer still wobbles). "Why do frogs sing at night?" → thinking "frogs are nocturnal, they sing at night because they are active during the night", answered the same. Both thoughts in the journal; no page errors.RWKV is recurrent: everything it has read lives in a fixed-size state (≈2.4 MB for the 0.1B), so there's no length limit, but older things blur into gist rather than being recalled word for word. Until now Pip's Room ignored that and re-read the last few exchanges from a blank state every turn.
Name (dreaming): …), so what accumulates is what makes them them rather than the base model. Waking from scratch reads the system prompt and the last few exchanges once ("Settling in…"). On by default; switch off or Start fresh in the developer console, which also shows how many tokens the state has lived (and flags going past the model's training length).tests/real/pips-room-living-memory-e2e.js (needs Playwright), real 0.1B with a real exported soul: settled in once (133 tokens, 36 s headless); after that each reply took 5–9 s instead of re-reading. Told a secret ("my favorite color is orange"), talked about three other things, then asked: in one run "It's orange." (beyond the old 3-exchange window), in another "Yes, I remember!" (0.1B recall is hit and miss). A thought flowed into the state; a mood change arrived as System: Right now Pip feels playful. A new thread showed an empty chat and didn't know the color ("Black."); going back restored thread 1 with all 40 bubbles. The real Export button saved both threads (6.5 MB); a fresh page restored the state bit-identical and woke in 1 s. A state labelled for a different model was refused and re-settled (115 tokens). No page errors.rwkv7-g1d-0.1b-20260129-ctx8192 #2 (history follows the rename).tests/real/suite-prompts-e2e.js (needs Playwright), real 0.1B. Multi-Pip: renamed Goose and Gander, a ✎ note, your name and top-K 40 through the console, a 4-turn chat, prompt checked. Junto: renamed to Frogbert; raw "Frogs are" continued as prose; with the role "You are the frog expert…", asked "What do frogs eat?": "…They eat insects and other small creatures." No page errors. (It caught a bug before it shipped: the new ✎ button first borrowed the remove button's class and would have removed the Pip.) Engine copies still MATCH (6.66e-15).tests/real/pips-room-soul-e2e.js (needs Playwright) with the real 0.1B and a real exported soul: sets name / About / temperature 0.7 / top-K 40 through the page's own inputs, chats twice, runs two loops, prints the prompt and the trait changes (curiosity 0.7167 → 0.7246, empathy 0.6010 → 0.6207, agency 0.5941 → 0.6040, …), then exports with the real button and re-imports in a fresh page: everything came back, no page errors. Her first reply with a soul: "Oh, I'm so happy to be back at home with my family and friends. I really love you!"Kham noticed none of Pip's Room's autonomous loops did anything. Why: Inner Voice and Dreams only ran when their Share toggles were on, and both start off; Consolidate read a conversation list that doesn't exist and crashed every five minutes; Reflection (as a loop), Goals, Self-Prompt and Memory had no code behind them at all.
soul.goals really change, newest 8 kept), and consolidation (a summary of recent chats; sets Last Consolidated).tests/real/pips-room-loops-e2e.js (needs Playwright) runs all seven loops on the real 0.1B (inner voice private), exports her, reloads, imports the soul before the model: she wakes as herself with 8 memories, 2 chat messages and 7 inner-life entries back, no page errors. Her consolidation of a chat about frogs: "I do not like them. You are right. I love them.".pip models..pth / .safetensors), with the same embedded engine and World tokenizer as the other pages. With a real model she replies one line at a time, sees the last three exchanges (so she can follow a conversation), and has anti-repeat seeded with her own replies. Her info panel shows the checkpoint's real parameter count. .pip souls behave exactly as before.tests/engine-ref.js now also checks the copy embedded in Pip's Room: max |Δlogit| 6.66e-15, MATCH.tests/real/repetition.js: the Multi-Pip chat loop on a real checkpoint with the sampler taken straight from the page source, seeded, anti-repeat off vs on, scored by repeated 4-word phrases. On rwkv7-g1d-0.1b, 8 turns, opening "Good evening, you two. What do frogs say at night?": seed 7 32% → 0% (off, both got stuck on "a pond with plenty of water to keep you cool" for five turns), seed 23 3% → 0%, seed 11 0% → 0% (with it off, that one collapsed into ever-shorter lines instead: "They sleep." "They're asleep." "Oh." "And I'm asleep.", which a phrase count can't see).tests/real/pips-room-e2e.js (needs Playwright): headless Chromium wakes Pip's Room from the real .pth (awake in 1.3 s, 191.03M params, vocab 65536), holds a 3-message conversation with the earlier turns in her prompt, no page errors. Asked her name, she said "I'm Cleo, the frog-eating robot.".pth, .safetensors; F32 / F16 / BF16) next to HTMLNLM .pip models. Engine: Brymar College v4.0.0's real RWKV-7 (per-head matrix memory, official tensor names), with two constructor options added for the browser: adopt loaded weights without copying, and skip gradient buffers for inference..pth reader: zip + a minimal unpickler for torch state dicts, no PyTorch needed..pip models' replies.node tests/engine-ref.js: the canonical engine and both embedded copies vs a numpy transcription of the official RWKV-7 math: max |Δlogit| 6.7e-15 (float64), and the embedded copies must equal engine/rwkv7-engine.js.node tests/pth-reader.js: a PyTorch-layout archive (BF16 + F32, shared storages, offsets) read back bit-exact, 102/102 tensors; also cross-checked against Brymar's convert_pth.py.python3 tests/tokenizer-ref.py (needs pip install rwkv --no-deps): the embedded tokenizer matches BlinkDL's official TRIE_TOKENIZER on 8/8 test texts (Unicode, emoji, code), in both pages..pip plus a World-vocab RWKV-7 from .pth and .safetensors, generated text in all of them, shared one base for the same file, completed a 3-turn Multi-Pip chat, no page errors. In-browser float32 logits matched the official reference to 1.3e-6.rwkv7-g1d-0.1b (.pth, 382 MB, BF16), dropped in unchanged. Load report: 191.0M params, 399/402 tensors; the 3 unused are layer 0's v0/v1/v2, which the official code doesn't use either (layer 0 is where comes from). Logits vs the official-math reference on the real weights: max |Δ| , argmax 14/14 (). Speed: ~300 ms/token in Node, ~400 ms/token in headless Chromium (cloud Xeon, one thread). Junto, asked : . Two copies in Multi-Pip shared one base and held a 4-line chat. It's a 0.1B model, so expect confident nonsense too (it also said frogs are "the only vertebrates that have a backbone").BitLinear passed back Wᵀg using the float master weights, while the forward multiplies by the ternary γ·Q(W). They differ by the whole quantization error, so every layer sent back the gradient of a network that wasn't the one running. It came in with the Tier 0 fused backward. The input gradient is now γ·Q(W)ᵀg, and the weight gradient stays straight-through. Measured in Evangelion (same backbone), memorizing 8 repeating sentences at the default LR: 2.66 nats/byte before (stuck at unigram), 0.33 after (float-weight reference: 0.88). New check: TERNARY=1 node tests/gradcheck.js runs the real ternary forward and requires everything upstream to be exact.
Measured with the new node tests/bench.js (dim 256, 4 layers, 64 tokens, one CPU thread):
| before | after | |
|---|---|---|
| Backward, per sequence | 1.92 s | 1.54 s |
| Muon optimizer step | 91.8 s | 43.7 s |
| Full training step at default settings (4 sequences + optimizer) | ~104 s (Muon was the default) | ~11 s (AdamW is now the default) |
The v7 BPTT derivation was right; three lines of plumbing around it were not. Found with a finite-difference gradient check and fixed against it.
ln1, dropping the residual path (h = x + tmix_out). Every lower layer saw less signal, down to 11–45% of the true gradient size in layer 0.ln2.backward() was computed and thrown away, so the FFN's gradient never flowed into W_o, the WKV path or anything below.ln_in.backward, so it received ~2% of its true gradient and barely trained.prevX/prevX2 now pass gradient to the previous timestep, alongside the existing num/den state gradients.Result: every weight, every mu and the embedding match finite differences (cosine 1.0000, float64 check) over a 3-step sequence. Same 30 training steps in the browser on a repeating pattern: loss 5.80 → 3.49 (was 5.75 → 4.22).
A numerical note. wkv = num / (|den| + 1e-8), and den can approach zero (the removal term can push it there). When it does, gradients spike. That curvature is also why the gradient check runs the model in float64 with a tiny step: in float32 with a coarse step it mistakes curvature for a wrong gradient. Worth watching if training ever goes unstable.
Tests (new): node tests/gradcheck.js, zero dependencies, runs on the classes in HTMLNLM.html.
Unchanged: W_x_rx2 / W_x_kx2 are allocated and optimized but never used by the forward pass (Simulacra wires them in).
MIT. Take it, break it, build on it.
meaningful() now also rejects absurdly long non-words ("SomehowSoftanorilarkindíciamente…").tests/real/pips-room-clean-room-e2e.js (0.4B), and the redo/streaming test is updated.Measured (gguf-vs-pth.js, same 98-token text):
| Comparison | Perplexity | KL |
|---|---|---|
| G1 0.1B: Q4_K_M vs its Q8_0 | 7.00 → 7.20 | 0.079 |
| G1d 0.1B: "better_quantization" Q4_K_M vs .pth | 6.97 → 7.57 | 0.10 |
| G1 vs G1d 0.1B (Q8 vs .pth) | 7.00 vs 6.97 | — |
For a 0.1B, Q8_0 (~210 MB) is the GGUF to use.
tests/real/pips-room-readable-export.js, no model needed).tests/real/pips-room-recall-e2e.js covers this with the real 0.1B:
pip-suite/dialogue-shelf.html, one file, offline): pick several exports and see distinct-1/2/3, pairwise overlap, replayed openings, recurring four-word phrases (after any replayed opening), recurring invented names and each run's filter flags. Download the report. The same filter and diversity check run from the command line in tools/dialogue/.tests/real/multi-pip-factory.js (stand-in models, Playwright) checks that the topic reaches the prompt, an interjection appears once, a seed replays exactly, stateful and stateless match while the chat fits the window (6 lines), how each line ended is recorded, provenance and flags are in the export, and deck naming, opener and turn order work. tests/dialogue-tools.js (no dependencies) runs every flag type on made-up lines, and runs the filter and diversity check on the two real seed-420 twins in tests/fixtures/ (6 replayed lines, then a single shared phrase: "i don't think so"). The Pip's Room repeat-guard and layout tests still pass; the bridge was checked in the page (3 × 200, 2 × 30, 0 = none). The engine block is byte-identical. No page errors.v_firsttests/real/