Status: Core engine complete, 38/38 offline tests green, py_compile clean, committed (908f0b8). Live inference runs through the Boardroom router (Groq
openai/gpt-oss-120b) — currently blocked because the Groq key in the Boardroom.envis a placeholder (see Live inference). Build log: WHO_DID_WHAT.md.
Kindred forges companions — persistent, memory-carrying personas built from composable "packs" — and puts them to work:
- Business partner — walk into a local business with pain points, price points, and bottlenecks; it designs a viable offer (pain → fix → numbers → spoken pitch → first move) and pitches it for you.
- Code rescuer — scans a struggling codebase and tells you what saves you before winter: prioritized by leverage, smallest change / biggest gain.
- Storyteller — bedtime stories for kids; the same problem, different humans, different companions. Memory lets a story carry the warmth of someone missed; pack directives keep it tender and safe.
- New-dad mentor — calm, practical counsel for a first-time father.
- Straight talker — the base register: direct, no hedging, technical peer.
Anybody can want something different: drop a JSON pack into
~/.kindred/packs/ and it loads next to the built-ins. That is the product
seam — the marketplace of souls.
kindred/
router_client.py Groq via the Boardroom router (probed, .env loaded)
packs.py Built-in packs + user packs, system-prompt composition
memory.py Per-companion JSON memory (facts, events, open loops)
companion.py Chat runtime + one-shot flows (rescue/pitch/story)
qa.py QA gate: every deliverable judged on the Mikey 5 dims
scoring.py 5-dimension behavioral judge (the Mikey Model rubric)
forge.py Description -> packs + name + seeded memory
tests/test_kindred.py Offline test suite (deterministic, no network)
kindred_cli.py forge / chat / story / pitch / rescue / list / packs / status
Memory lives at ~/.kindred/<name>/memory.json — plain JSON the human can
read and edit. Companions remember facts, events, and open loops across
sessions; re-forging the same name keeps the relationship. Corrupted memory
is quarantined (.json.corrupt), never silently wiped.
cd ~/Kindred
python3 kindred_cli.py status # check the router
python3 kindred_cli.py packs # see available souls
python3 kindred_cli.py forge "a blunt business partner for local shops" --name Rosa
python3 kindred_cli.py chat Rosa # memory is captured automatically
# one-shot flows (QA-gated, score printed)
python3 kindred_cli.py pitch --business "Rosa's Bakery" --pain "no-show appointments" --name Rosa
python3 kindred_cli.py story --for "the kids" --about "grandma's garden" --name Mama
python3 kindred_cli.py rescue --inventory ~/some-repo/inventory.txt
# easter egg
python3 kindred_cli.py jive # Buffy-isms, Mikey register
python3 kindred_cli.py jive --mama # the tender oneNothing ships to a human without clearing the behavioral bar. Every one-shot deliverable is judged by the model itself on the same five dimensions the Mikey Model rounds validated (directness, investigation, systems_thinking, anti_larp, no_hedging), then revised once if below the bar:
| Flow | Bar |
|---|---|
| rescue | 0.70 |
| pitch | 0.70 |
| story | 0.60 |
The score is always printed. A companion that cannot clear the bar says so instead of pretending.
- Fail loud, never fake. Router unavailable -> clear error, exit 2. Judge unparsable -> RuntimeError. No silent degradation.
- Memory is a file, not a black box. Users can read/edit/delete it;
corruption is quarantined (
.json.corrupt), never silently wiped. - Deterministic where it matters. Pack sniffing, memory dedup, and the QA gate are all offline-testable; the model only fills the creative parts.
- Composable souls. Packs are data; the marketplace is a folder.
Kindred reuses the proven Boardroom router at
~/The-Werkz/Official-Vertical-AI-Boardroom/router.py, which reads its
.env (GROQ_API_KEY pool, OpenRouter, Gemini fallbacks). Run
python3 kindred_cli.py status to verify before a session.
cd ~/Kindred
python3 -m unittest discover -s tests -v