ask
Submit a focused software-engineering question with code context to receive AI reasoning on structure, data flow, design trade-offs, and bug analysis.
Instructions
YOUR DEFAULT MOVE on anything non-trivial — use it liberally and early, don't wait to be told and don't wait until you're stuck. Reach for it BEFORE you guess at unfamiliar code, an API, or a library's behavior; whenever you weigh a design or refactor trade-off; when a bug isn't fully understood; or to have a strong reasoner sanity-check a plan or diff before you commit it. One well-framed ask with the code attached beats several bare ones. Set oracle="opus" for this same tool on Claude Opus (newest) — cheaper and faster; use it for high-volume or long back-and-forth work and keep the default Fable for the hardest calls. Ask the selected model to reason about the SOFTWARE/ENGINEERING work you're doing: code structure, functionality, data/control flow, module and function relationships, routing, architecture, and design trade-offs. For questions about EXISTING code, ALWAYS paste the real code into context — the actual function/file/snippet the question is about, plus any error or failing test. The model has NO tools and CANNOT open files, so a bare file path is useless to it. Conceptual/brainstorming questions need no context and are welcome. Frame each call as ONE specific decision ('should X or Y given constraint Z' beats 'thoughts on this code?') or ONE generative prompt ('give me 5 approaches to X, with trade-offs'). Reuse the session key to think through a problem over several follow-up turns instead of restating everything. Answers usually take 1–3 minutes. Broad and conceptual engineering questions — including brainstorming and ideas for future code — are fine. Refused only when the question itself directly asks for offensive-security work (exploit development, attack tooling) or non-software domain knowledge (biology/medicine refused; neuroscience, cognitive science, AI/ML, and CS are in-scope); questions about security-related code are normal engineering. The result carries a sidecar ({recommendation, confidence, needs_context}); when the model needs more, it returns a followup telling you exactly what to paste — paste those (or context_write them and pass context_ref) and re-ask on the SAME session, but first check followup.likely_already_pasted and RE-READ your own paste rather than resending it. A context_exhausted status means the model still can't answer after repeated tries — stop re-asking and use your own judgment.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| reset | No | Dump+clear this session before asking, starting a fresh conversation. | |
| oracle | No | Which multi-turn model answers: 'fable' (default) or the Opus family — 'opus' tracks the newest Claude Opus, and 'opus5'/'opus55'/'opus48' name the same Opus session. Opus is roughly half Fable's price and faster, so prefer it for high-volume or long back-and-forth work. For a single-turn model use `ask_model(provider=…)`. | fable |
| context | No | Optional code snippets, file paths, or structural context. | |
| session | No | Conversation key. Reuse it to ask follow-ups (the model keeps context); use a new key or reset=true to start a fresh topic. Fable and Opus sessions are namespaced separately, so the same key on each is two independent conversations. | default |
| trusted | No | Operator-authorized. When true, the prohibited-use denylist runs in log-only mode: security vocabulary in the question AND in `context` is audited but does not block. Use for legitimate security-engineering work (PoC analysis, CVE research, binary hardening review) where the ask genuinely needs security terms. Takes effect ONLY when the operator has set ASK_FABLE_ALLOW_TRUSTED (env or config); otherwise the flag is ignored and the denylist still applies. | |
| question | Yes | A specific question about concrete software code/architecture (structure, functionality, data flow, module/function relationships, routing). | |
| context_ref | No | Key(s) of context previously saved with `context(op="write", …)` to pull in and prepend to `context` — so you paste a big codebase context ONCE and reference it by key across many asks instead of re-pasting. Missing keys are reported, not fatal. |