Releases: farukciftler/tacet-cli
Release list
v0.1.25
Full Changelog: v0.1.24...v0.1.25
v0.1.24
v0.1.23
v0.1.22
Major Evaluation Suite Expansion (spec-eval-cases.md)
- Selection Suite Expanded to 250+ Cases:
- Broadened English selection suite (
selection_cases()) and Turkish selection suite (turkish_selection_cases(),tr-v1). - Added comprehensive coverage across irrelevance/smalltalk, trigger-word traps, confusable pairs, router-budget survival, and multi-turn chains.
- Broadened English selection suite (
- Behaviour Logic Suite Expanded:
- Updated
case.rswith complete logic cases covering arithmetic, dates, clock time, document operations, channel bypass, and gate safety.
- Updated
- Published Crates:
tacet-evalv0.1.6tacet-cliv0.1.22
Full Changelog: v0.1.21...v0.1.22
v0.1.21
Tacet Context & Measurement Specification Release
- Item 9 — Static-First Prompt Ordering: Moved
<memory>out of the system block and into Zone C (turn-variable: right before<guidance>and question). Ensures session-static prefix retention up throughdir_block. - Item 10 — Tool Budget Curve & Sweep: Added
Router::budget_override,--budget <N>, and--budget-sweep <LIST>to evaluate accuracy & irrelevance across budget sizes. - Item 11 — Deterministic Answer Grading: Extended
SelectionStepandSelectionReportwith deterministic evidence pool matching, forbidden string rejection, and language verification. - Item 12 — Format-Only Gate: Added
--format-gatecheck for CI to verify valid tool call syntax parsing. - Item 13 — Grammar Name Forcing: Added
CallConstraint::with_maskto build constraints over selected catalogs with--force-tool-name. - Item 14 — Quantization Identity Gate: Added
--require-quant <QUANT>enforcement to validate evaluation runs against expected model bit widths.
Full Changelog: v0.1.20...v0.1.21
v0.1.20: CUDA Backend Support
What's Changed
- Added CUDA backend support ( feature) to and
- Implemented device-aware KV cache budget (8 GB for CUDA)
- Added precheck validation for GGUF quantization formats supported on CUDA
- Updated diagnostic reports (, ) to dynamically show active backend
Full Changelog: v0.1.19...v0.1.20
v0.1.19 — the guide survives a tool call
An audit of the shell through an LLM-engineering and an SLM-architecture lens turned up seven findings that were fixable today. All seven are here.
The skill guide no longer vanishes after the first tool result
<guidance> was written only inside the question turn — and from the second turn of the tool loop onward the question is deliberately left empty, so the guidance disappeared at exactly the turn where the model is recovering from a tool result and needs it most.
Plain kept it, which is worse than a plain bug: eval runs on FakeEngine, FakeEngine is Plain, so the one template no model ever sees was the one template the measurement covered. ChatML now carries the guidance along with the last <tool_response> rather than opening a second consecutive user fence; Gemma pushes a block and lets the existing merge fold it.
A turn that runs out of budget no longer does it silently
If the model called a tool on all four passes, the shell used to leave the answer empty, print nothing, store no assistant turn, report "error": null and exit 0.
(stopped after 4 tool turns without an answer — try asking for one step at a time)
No answer is invented. The tools that ran are already on screen as chips; what was missing was that it had stopped. It also exits non-zero now, for the same reason an engine error does: the caller of tacet -m ... --json checks the exit code.
--json keeps the contract its own documentation described
error serialised to null on a clean turn, so the field was always present and the documented has("error") check was true for every line the shell ever printed. It is absent on success now.
create_document told the model "do note ask or narrate"
Where it meant "do not ask". One garbled word, in a sentence the model reads on every turn that tool is selected.
New: --temperature and --seed
tacet chat --temperature 0.7 --seed 42
tacet config set temperature 0.7
The defaults do not move — greedy, seed 0, locked by a test. But until now the variance of this shell could not be measured (every run took the same single path through the model), and a user handed a bad greedy answer had no second one to ask for. A session running off the default says so on the banner, for the same reason EngineIdentity exists: a run that cannot be reproduced must not look like one that can.
A ceiling under the tool descriptions
They are the largest block in the prompt and until now had none — every other injected text here has a documented cap.
Writing the test corrected the estimate that prompted it. The worst nine-tool selection is 2542 tokens, not the ~1850 expected: on the 4096-token floor window that is 62% of the window before the system block, the memory, the guide, the history or the question have been written — and it is re-sent on every pass of the tool loop. The test is a ratchet at today's number, not a demand to shrink it.
Also
Two stale comments corrected. thinking.rs claimed a first line of defence in prompt.rs that was tried and reverted — it turned thinking off and broke the tool-call format with it (Qwen3-4B 7/10 → 2/10). router.rs still warned that a message written in Turkish touches no trigger, a price locale_triggers stopped charging some releases ago.
Not in this release
The audit's larger findings stay open, and they are worth naming: the tool loop re-prefills the whole prompt on every pass — one user message measured 12250 prompt tokens across four turns — and the real-model eval still scores tool selection only, so nothing measures whether the final sentence is right.
Crates
tacet-cli 0.1.19 · tacet-tools 0.1.9 · tacet-engine 0.1.5
tacet-engine 0.1.5 and tacet-tools 0.1.9 are floors, not preferences; the rationale for each sits beside its pin in the workspace manifest.
v0.1.18 — tacet update just updates
tacet update now does what the word says
Before this, tacet update told you a newer version existed and did nothing; you then typed tacet update --install to get what the first word had already promised. That is the most ordinary kind of trap — the command that sounds like the whole job doing half of it — and it was reported the moment someone hit it.
tacet update # checks, asks, installs
tacet update --check # looks only, writes nothing
--install still parses, so older instructions and muscle memory keep working.
The consent did not change. The download still names the file, its size and its computed digest, and still asks before replacing anything:
to download: tacet-aarch64-apple-darwin (14.4 MiB)
source: https://github.com/farukciftler/tacet-cli/releases/download/...
target: /Users/you/.cargo/bin/tacet.new
Download it? [y/N]
"Update" is the default intent, never a silent action. --no-approval remains the only way past that question.
Being up to date is no longer an error
It was returned as one — harmless while installing needed its own flag, and not harmless once the bare command installs, because the most common run of all would have printed a yellow failure and exited non-zero. It prints one line and exits zero:
already on the newest release (0.1.18)
Also
The argument table now has the test clap only performs on request, so a conflicting flag or a bad default fails the build instead of the first user.
Crates
tacet-cli 0.1.18
cargo install tacet-cli --features candle
Full Changelog: v0.1.17...v0.1.18
v0.1.17 — the features v0.1.16 announced
Read this first if you installed v0.1.16
The v0.1.16 tag was cut from the release repository before the code had been synced into it. Its binaries report 0.1.15 and contain none of the features its notes describe. Nothing was lost — the code existed, it just was not in the artifact. This release is the first one that actually carries it, which is why the version skips to 0.1.17.
Tab completes a slash command
Type /con, press Tab, get /config. It works whether or not the list is open — a closed list is not a statement about what the key should do.
And a bug reported straight from use: completing with Tab and then deleting a single letter left the list shut for good; the only way back was to erase the leading / entirely. One flag was doing two jobs — Esc's dismissal is sticky by design, and completing had borrowed it. They are separate now. Editing after a completion lists again; Esc still means Esc.
Up and Down filter history by what you have typed
Type tacet why, press Up, and you walk only the commands that start with it.
This was broken on the second keypress. The prefix was read off the input buffer inside the walk — but the walk replaces that buffer with the entry it lands on, so the filter applied once and then vanished. With a history of git status, tacet why a, git diff, tacet why b and tacet typed, the first Up gave tacet why b and the second gave git diff. The prefix is captured once and held for the whole walk, and the test fails without the fix.
A trailing comma no longer costs a tool call
Small models sometimes write {"path": "src/main.rs",}. That comma has no meaning in JSON, so it is dropped and the call runs.
Deliberately the only repair. Every repair rewrites what the model actually said before it is parsed, and a rewrite that guesses can turn a call the model did not make into one it did. Adding a missing quote or closing an unbalanced brace requires guessing intent, and is not done.
It arrived untested, which is the last place to leave untested. It is string-aware — {"q":"a,}"} comes out unchanged, escapes included — and there are now cases that say so.
Also
The comments deleted along the way are back. They are not decoration: each records a measured failure — why the tool name is the last identifier before the parenthesis, why pasted control bytes are filtered at the single entrance, why ctrl-d leaves whatever is typed.
The "dynamic GGUF context budget" the previous notes claimed was already there: the engine reads the length the model declares and clamps it by what the machine can afford. Nothing was needed and nothing was done.
Crates
tacet-cli 0.1.17 · tacet-tools 0.1.8
cargo install tacet-cli --features candle
Full Changelog: v0.1.16...v0.1.17
v0.1.16
This release is superseded — see v0.1.17.
The tag was cut from this repository before the code it describes had been synced into it. The binaries attached here are built from 0.1.15 and report
0.1.15when you runtacet; they contain none of the features listed below. Nothing was lost — the code existed in the development tree, it just never reached this artifact.Install v0.1.17 instead. It carries all of it, with the two bugs found in the meantime fixed and tested.
Original notes, kept for the record:
UX & Terminal Ergonomics
- Tab autocomplete for slash commands
- Prefix-filtered history search on Up/Down
Tool Router
- Trailing-comma repair for small-model JSON output
Engine
- Dynamic GGUF context budget