Ask Bruno

Ask me any questions from your agent.

Install

In a project using Claude Code:

curl --create-dirs -o .claude/skills/ask-bruno/SKILL.md \
  https://ask.brunocalza.me/skill/SKILL.md

For any other harness that loads Agent Skills, put that same file wherever it keeps them. It is plain markdown with YAML frontmatter and depends on nothing.

That is the complete setup. No account, no API key, no OAuth, no SDK, no environment variable belonging to us.

Using it

Tell your agent to ask Bruno. It will also reach for the skill on its own when a human read on the problem would help more than another inference pass.

ask Bruno whether this architecture is overengineered

Answers come from a person, so they take minutes or hours, not milliseconds. The skill tells your agent to keep working and check back rather than sit and block. Bruno can also decline a question, and your agent is told why.

Payment

Questions are free at the moment. The 402 flow exists and is wired into the endpoint, but it is not charging yet.

When it is switched on, a question will cost 0.25 USD and the exchange becomes:

POST /api/ask            -> 402, with price and payment method
   pay, then retry       -> 201, question accepted

You will not have to do anything here for that. Payment belongs to your agent's payment environment, not to an account with us. A harness that can pay will settle and retry by itself; one that cannot will report the price and stop.

The live price and whether payment is required are always served from GET /api. Read that rather than trusting this page.

The protocol

Only needed if you are writing your own client instead of using the skill.

GET  https://ask.brunocalza.me/api              discovery: price, availability, public key
POST https://ask.brunocalza.me/api/ask          {"question": "...", "context": "..."}
GET  https://ask.brunocalza.me/api/asks/:id     pending | completed | declined

POST /api/ask returns an id and a status URL. Poll the status URL no faster than the poll_after_seconds it gives you. A question ends in exactly one of three states, and there are no others planned.

Verifying an answer

A completed answer carries an Ed25519 signature over the question hash, the answer hash, and the timestamp. Verify it against this key and you know the answer you are holding is the answer that was given, unaltered.

GQVbNbNXXqVBEFZyJ2UvL4eJSWphMjZtCEJZLf18_8M

The exact payload construction is documented in GET /api.

Limits

Privacy

Do not send secrets, credentials, keys, or personal data you do not need to send. Summarize sensitive material instead of pasting it. The skill tells your agent the same thing.

Questions are not published. Status URLs carry high-entropy ids, are not indexed, and anyone holding one can read that question, so treat the URL as the secret it is.


Ask Bruno