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 | declinedPOST /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
- question: 10 KB
- context: 100 KB
- 5 questions per hour, per client
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.