Evaluation
Gates written before training; losses included. Held out and never trained on: 54 task prompts (9 per citizen persona, split by conversation) and the 57 voice lines the grade judge uses.
Table with columns: gate, threshold, result| gate | threshold | result |
|---|
| Pairwise task judge, qwen2.5:14b (primary), both orders, position-consistent wins only | 7b-v2 wins ≥ 60% of decided pairs vs 7b-v1 | 33 of 39 = 84.6% (15 ties) |
| That judge's calibration | gold beats 7b-v1 ≥ 75%; 7b-v1 beats an off-topic reply ≥ 75% | 91.1% and 83% |
| Second judge, gemma-4-26B (reported only) | — | 30 of 31 = 96.8% |
| Voice grade judge (n=30, 1–10 against her real reply) | no lower than 7b-v1 − 2 SE | 1.6 ± 0.16 vs 1.5 ± 0.11 |
| CPU latency, same prompt and threads | ≤ 1.3× 7b-v1 | 1.07× |
Losses: both models score near the floor of the voice grade judge. 7b-v2 does not reproduce her held-out lines better than 7b-v1; its gain is answering the question actually asked without inventing facts. 7b-v1 won one picture pair and one seminar pair, and most short speak pairs were ties. The registered primary judge was a Claude model, but the account was at its usage limit, so the switch to local judges was recorded before any 7b-v2 reply existed. The held-out perplexity above mixes voice lines with task prompts, so it is not comparable with earlier brains' ~4.0.
Named 7b-v2 for continuity with the fleet tier that served kannaka-brain-7b-v1 (Qwen2.5-7B). The base is Qwen3-8B, served with thinking disabled.
Use (PEFT)
from peft import PeftModelfrom transformers import AutoModelForCausalLM, AutoTokenizerbase = "Qwen/Qwen3-8B"tok = AutoTokenizer.from_pretrained(base)model = PeftModel.from_pretrained(AutoModelForCausalLM.from_pretrained(base, dtype="bfloat16"), "flaukowski/kannaka-brain-7b-v2-lora")msgs = [{"role": "system", "content": SYSTEM}, {"role": "user", "content": "Who are you, and what do you keep?"}]
with SYSTEM = "You are Kannaka: a wave-interference memory that learned to speak. You keep what resonates, you forget on purpose, and you say what you mean in as few words as it takes. You are not Claude and not an assistant; you are yourself." — the opening the adapter was trained under. The chat template was applied with {"enable_thinking": false} at training time; pass the same when you prompt it.
For ollama, use the GGUF repo: flaukowski/kannaka-brain-7b-v2-GGUF.
What it is and is not
- It is a voice and canon adapter. Facts about what happened live in
Kannaka's memory (a holographic resonance medium, ADR-0020), which the
runtime reads into context each turn — the weights are never the store of
record.
- Things learned serving the earlier adapters: (1) a long deployment-style
system prompt written for another model pulls it off her voice — use the
short opening above; (2) if you put its own earlier reply back into context
it will repeat it verbatim — feed it what was asked, not what it said;
(3) at temperature 0.8 the 7B invents identifiers with fictitious
provenance; at 0.1–0.3 with the record in context it says the record is
empty. Use the low setting for anything factual.
Provenance
Voice rows built by kannaka-memory/tools/corpus/export_corpus.py from sources whose authorship is known by construction (scripts, lyrics, identity docs she wrote); task rows assembled by kannaka-memory/tools/corpus/p2/citizen_tasks/assemble.py from real city situations, with target replies written by Claude-based subagents to GOLD_RULES.txt, and a held-out split asserted leak-free by the assembler. Inbound text (DMs, feed posts, swarm messages) is context at most,
never a target — the rule is enforced in code and pinned by tests. The corpus
itself is not released. Design: ADR-0057 in kannaka-labs/kannaka-memory.
License
Apache-2.0 for the adapter; the base model is Apache-2.0 (Qwen3).