A shared knowledge base — one file per person, not per project
This is what 1.8 is for. A pattern, a dead end, a convention used to live inside one project and die with it; the next project started from zero, and anyone working for three clients learned the same thing three times.
tausik memory add pattern "Title" "Body" --global # into the shared store
tausik search "query" # reads both--globalputs knowledge in the shared store or fails saying so — it never falls back into the project quietly.- Search and the session-start knowledge block read the shared store alongside the project's own.
- The store has a backup, and the backup stays on this machine.
- An older TAUSIK meeting a store newer than its schema refuses rather than guessing at the format.
- Rows no longer record which client they came from:
origin_projectholds abasename@fingerprintlabel instead of the originating project's absolute root.
It is written WITHOUT redaction — which is exactly why it does not leave this machine, and exactly why TAUSIK_HOME is now validated (breaking change 6).
The end of the server-side session
"Session" was two things — work continuity and agent context hygiene — and separating them closed a silent failure: an absent session no longer means unlimited capacity, so the 200-call gate stopped quietly waving work through. A handoff no longer requires an open session.
Team state travels in git
Tasks, decisions and memory export to a readable tausik/ tree, ride along in the repository, and come back with tausik sync. A teammate who clones the repo gets the project's history, not an empty database.
Six breaking changes follow, each with a migration.
Read before upgrading: What changed in 1.8 · Что изменилось в 1.8
Full changelog: CHANGELOG.md · CHANGELOG.ru.md — 165 entries.
Breaking changes
1. The classifier no longer decides what gets published: decide NEVER publishes on its own.
Before, tausik decide ran the text through a classifier, and if it judged the decision "general", the page went to Notion automatically. Now the author decides visibility, always — this project by default, --global for the local shared store, and outward only via tausik brain move --to-brain <id>. The defect was not that the heuristic sometimes chose wrong, but that it was making the publication decision at all; it had already sent six internal decisions outward, among them the decision to cancel the 2.0 plan.
Migration: nothing to do. Publish explicitly if you relied on decisions appearing by themselves. Already-published pages are untouched.
2. The shared knowledge store moved from ~/.tausik/ to ~/.tausik-knowledge/.
~/.tausik was a defect: project discovery walks UP the tree looking for exactly the name .tausik, so a store in the home directory captured discovery for everything beneath it.
Migration: none — the store is adopted from the old address on first use, copied rather than moved, and nothing in your home directory is deleted. One exception: if TAUSIK_HOME is set, adoption does not run at all and the move is yours.
3. Config trust tiers: the project tier may only TIGHTEN.
.tausik/config.json could switch enforcement OFF, and that file travels with the repository — a bypass anyone who clones it inherits without choosing it. A project-scope setting may now make enforcement stricter, never looser.
Migration: move any loosening into the user tier (TAUSIK_USER_CONFIG, or the managed tier).
4. Verify receipt schema: v1/v2 → v3 (schema v44).
A verify run can now be PRESENTED rather than searched for.
Migration: receipts are re-issued on the next run; anything parsing receipts must read v3.
5. A verify run with no declared scope no longer certifies anything.
tausik verify --task X, run before the task declared its relevant_files, recorded a green against an empty file set — and that green stayed usable for the whole cache TTL. Two properties combined into a hole: gate_runner SKIPS the scoped gates when no files are declared, and compute_files_hash([]) returns a stable empty marker no edit ever moves. So verify → edit → task done passed QG-2 on a green taken before the edit. The absence of coverage was converting itself into proof of coverage.
Migration: tausik verify --task <slug> --relevant-files <paths...>. A full-suite tausik verify without --task is unaffected.
6. TAUSIK_HOME is validated, and some locations are now refused.
A network path (UNC, or a mapped/mounted network volume) and a cloud-sync directory (OneDrive including "OneDrive - Company", Dropbox, Google Drive, iCloud, Yandex.Disk, the macOS ~/Library/CloudStorage/ tree) are REFUSED. A store git is ALREADY TRACKING is refused; a store merely inside a git work tree is not — it gets a .gitignore of its own. The store is written WITHOUT redaction, and the whole justification on record is that it never leaves this machine — a property of a DIRECTORY, which this variable names. ~/OneDrive is inside your home, so "it is in my home" stayed true while the conclusion drawn from it did not.
Migration: point TAUSIK_HOME at a local directory outside any synced tree; tausik knowledge export <dir> from the old location first, then TAUSIK_HOME=<new> tausik knowledge restore <dir>.
Also new
- Verify run handles.
tausik verify --task <slug>prints<run_id>.<nonce>;task done --verify-handlepresents it instead of the server searching for a fresh row. Single-use, one-hour lifetime, validated against the live files and the live gate config. Refusals now say what is actually wrong ("the files this receipt covers have changed") rather than "cache miss". - Notion is optional in fact, not just by flag.
- The Rule 5 checklist gate reads evidence written BELOW its heading, not only beside it. It had been reporting "no acceptance criterion names a test" over checklists that named several.
Verification
| Check | Result |
|---|---|
| Full suite, Windows, exclusive local run | 6955 passed, 0 failed |
| Full suite, Linux (development pipeline) | 6839 passed, 0 failed |
| Matrix: ubuntu / windows / macOS × Python 3.11–3.13 | green |
| Full lane including slow tests | green |
bandit -r scripts/ |
zero HIGH |
ruff check scripts/ tests/ bootstrap/ |
clean on 0.15.12 and 0.16.1 |
Four defects were found by the act of publishing and fixed before this release. Three were of one kind — code deciding the SHAPE of a path by asking which OS was reading it; the sharpest sat in the UNC refusal that the store's whole "it never leaves this machine" argument rests on, and it only worked on Windows. The fourth was the lint gate itself, which enforced a rule set it had never named, inherited from the linter's default — until that default changed.
Note on the tree: of this project's own tausik/ state projection the mirror carries only gates.json, which is shipped gate configuration the test suite reads. The task and decision history stays on the development remote.