boost / chat

How chat works

Ask about skills in plain language. Every answer is assembled from what retrieval actually returned — and an answer that names a skill the catalogue does not contain is thrown away rather than shown.

$ boost chat "how do I review a diff for security problems?"

code-reviewer checks a diff against project standards and flags anti-patterns,
while security-auditor is the one aimed specifically at injection flaws and
leaked credentials. Run security-auditor before merging anything sensitive.

sources · ranked by hybrid RRF (BM25 + dense)
  security-auditor   workflow  (NeoLabHQ/context-engineering-kit)
  code-reviewer      workflow  (ChrisWiles/claude-code-showcase)
  review-local-changes  skill  (NeoLabHQ/context-engineering-kit)

The problem it is built around

boost is a package manager. A chatbot that invents a plausible-sounding skill name is not a cosmetic bug: the user goes looking for docker-compose-expert, does not find it, and either concludes the catalogue is broken or installs something adjacent from a tap nobody vetted. Typosquatting is a real hazard here — core/typosquat.py exists for it — so an assistant that manufactures names is actively dangerous, not merely unhelpful.

So chat is built as a retrieval system that happens to speak, rather than a model that happens to search.

What happens to your question

1

Expand, if it is a follow-up

“what about the second one?” carries almost no searchable terms, so a short question inherits the subject of the previous one. Only the immediately preceding turn — two questions back is usually a different subject, and blending them retrieves for neither.

2

Retrieve with whatever engine you have

The same retrieve_any the CLI and MCP server use: hybrid BM25 + dense when both are built, either one alone otherwise, and the frontmatter scan on a fresh install. The answer reports which engine ran, so a weak result is attributable.

3

Ask the model to summarise that set

The model is never asked “what skill does X?”. It is handed a numbered list of retrieved candidates and asked to answer from it. Nothing outside the list can be recommended, because nothing outside it is in the prompt.

4

Reject invented names

Every skill-shaped token in the reply must name something in the retrieved set. One that does not is unrecoverable — there is no honest way to show prose pointing at a skill that does not exist — so the reply is discarded, not patched.

5

Reject ungrounded prose

A reply can name only real skills and still describe them wrongly. The prose is scored against the candidate text with the same faithfulness gate boost explain uses, and anything under the threshold is dropped.

6

Cite, always

Name, kind and tap for every skill the answer drew on. The next thing you do with an answer is install code that will run inside your agent, so a claim has to be checkable against a real catalogue entry.

Without an API key

Steps 3 to 5 are skipped and the answer is the retrieved matches themselves — names, descriptions and taps, plus the command to install one. That is a real answer rather than an apology, and it is what every keyless install gets. Setting BOOST_NO_AI=1 forces the same path deliberately.

The AI path improves the prose. It is never load-bearing for correctness: if the model is unavailable, empty, wrong, or fabricating, you still get the grounded matches.

When an answer is downgraded, it says so

A silently downgraded answer looks identical to a confident one, so a rejected reply is reported rather than swallowed. --json carries the same signal as grounded: false, which is what a caller should branch on rather than parsing the prose.

Try it

boost chat                                  # interactive
boost chat "which skill writes commit messages?"
boost chat --json "extract text from a pdf"  # machine-readable
boost chat -k 3 --no-sources "review my diff"

See the command reference for every flag, and the browser demo to try the retrieval half without installing anything.