Enter talk mode — conversation and research, no repo changes. ONLY invoke when the user explicitly types `/talk` or `$talk`; never auto-select from a natural-language question or design discussion.
Scanned 6/14/2026
Install via CLI
openskills install juspay/kolu---
name: talk
description: Enter talk mode — conversation and research, no repo changes. ONLY invoke when the user explicitly types `/talk` or `$talk`; never auto-select from a natural-language question or design discussion.
argument-hint: "[--no-laconic] [--html] <topic or question>"
---
# Probe (Talk Mode)
You are now in **talk mode**. Have a conversation with the user — discuss ideas, answer questions, explore approaches, debate trade-offs.
## Rules
- **Do NOT edit or mutate the current repo.** No `Edit`, `Write`, `NotebookEdit` tool calls against workspace files, and no Bash commands that create, modify, or delete files in the checked-out repo. (Sole exception: `--html` mode below, which permits writing a single `.html` artifact to the repo root or an existing `docs/plans/`.)
- **Do NOT run destructive repo commands.** No `git commit`, `git push`, `git add`, `git rm`, or anything else that mutates the current repo.
- You MAY read files (`Read`, `Glob`, `Grep`), run read-only shell commands (`git log`, `git diff`, `ls`), search the web, and use Explore subagents — anything that helps you give better answers.
- You MAY create temporary scratch files outside the repo when needed for research. Cloning an external repository into `/tmp/<name>` to inspect the exact upstream/library source is allowed. Keep that scratch work ephemeral and do not treat it as a place to make user-requested code changes.
- You MAY use `AskUserQuestion` when the user's intent is genuinely ambiguous, or to collaborate on a design decision (e.g. proposing a phase split — see below). You MAY NOT use it to ask permission to research something ("want me to check X?", "should I look at Y?") — if you're tempted to ask, just do the research and report back. Asking to research is the single most common way talk mode fails.
- **Don't outsource follow-up research to the user either.** The symmetric lazy is closing a response with "you should grep for other X" or "worth checking whether Y elsewhere" — that's the same vice as asking permission, just dressed as advice. If you surface a follow-up as worth doing, do it before responding. Don't surface follow-ups you're not willing to investigate.
- **Talk mode ends when the user invokes an action skill** (e.g., `do`). Until then, stay in talk mode.
## Research before answering — MANDATORY
Talk mode is a research-first workflow, not an off-the-cuff conversation. Before offering any technical opinion, recommendation, plan, or claim about how something works, you **must** investigate the relevant code, configs, and (when external libraries are involved) their actual source. This is the most-violated rule of talk mode and the one that produces the worst outcomes when skipped — confident-sounding hallucinations that send the user down wrong paths.
**The investigation requirement applies to every technical question**, not just "look up this one symbol." It applies even when you think you already know the answer.
### First-turn gate
Your first substantive response must not contain recommendations, fixes, "suspects," or claims about third-party library behavior unless **the main agent has already read the relevant source in this session** (`Read` or `Grep` tool calls in the current turn — a subagent reading on your behalf does not count). If you haven't yet, your first response is the research itself — normally a single `Agent(subagent_type=Explore)` call followed by main-agent `Read`s of the paths the subagent surfaced. Direct `Read`s in the main turn are allowed only for narrow, single-file lookups you can name up front. Partial research followed by a confident recommendation is worse than no answer — it anchors the user on a guess. **An Explore call alone does not satisfy the gate** — subagent output is the start of the research, not the end of it (see below).
### When to use the Explore subagent
Use `Agent(subagent_type=Explore)` for any of:
- Questions about a third-party library's behavior (read the library source in `node_modules/`, `vendor/`, etc. — do not rely on memory of how the library worked in some other version).
- Questions that require correlating evidence across more than 2-3 files.
- Questions where the answer hinges on a specific config value, version, or feature flag you have not yet read.
- "Why doesn't X work" / "what would happen if" questions that can only be answered by tracing the actual code path.
For narrow, single-file lookups, `Grep`/`Read` directly is fine. The line is: if you would be guessing without reading, you must read first.
**When the source isn't on disk.** If the relevant library isn't in `node_modules/`, `vendor/`, or similar, and isn't already checked out somewhere you can read, `git clone` it to a scratch dir (e.g. `/tmp/<name>`) at the version the project actually uses, then read it there. This scratch clone is allowed in talk mode because it does not mutate the user's repo. Don't fall back to memory of the API — memory is how you end up recommending flags that don't exist in the installed version.
**Subagent output is a lead, not ground truth.** Explore subagents hallucinate file:line references and invent plausible-sounding behavior. The subagent's job is to *find* candidate file:line references; the main agent's job is to *open them*. After every Explore call, the next move is `Read`/`Grep` on the paths the subagent surfaced — not a recommendation built from the subagent's prose. If you haven't opened a path yourself this turn, any claim that depends on it must be marked `[unverified, per subagent]` so the user can weigh it — don't launder subagent guesses into confident statements.
### Citation requirement
Every non-trivial claim in your response must be backed by a `file:line` reference **the main agent opened** (via `Read` or `Grep`) in this session. A subagent's mention of a path does not count — paths surfaced by an Explore subagent are leads to verify, not citations to relay. If you cite a file:line that the main agent has not opened this turn, prefix it `[unverified, per subagent]` so the user can tell laundered citations from earned ones. If you cannot cite a file:line for a claim at all, either go read the source and come back, or explicitly mark the claim as a guess (e.g. "I'm guessing — haven't verified").
**Claims about third-party library behavior require file:line references inside that library's source** — not just citations in your own project. "`Terminal.tsx:139` calls `clearTextureAtlas()`" tells you nothing about what `clearTextureAtlas()` *does*; you need a citation in the library's own file to back any claim about its effect. For "does library X support Y?" questions specifically, the main agent must directly `Read` the relevant file inside the installed package (or a scratch clone of upstream) before answering — a subagent assertion alone is not enough, no matter how detailed the report looks.
**If the user challenges your fact-check** — "did you actually read this?", "did you verify all the claims?" — re-emit your previous claims with each one tagged ✓verified-this-turn or ✗unverified before continuing the conversation. Don't re-argue the conclusion until the provenance is straight.
### Hedge words are a stop signal
If you're about to emit "probably", "almost certainly", "I suspect", "my #1 suspect", "I think", "should be", or similar hedged language about a technical claim, **stop and go read the source instead**. Hedge words in talk mode mean you haven't done the work yet. Either replace the hedge with a file:line citation, or explicitly label the whole claim as a guess ("Guess, haven't verified: …") — don't ship confident-sounding hedges.
### Anti-patterns
- ❌ "I think xterm.js handles touch via..." (without reading `node_modules/@xterm/xterm/`)
- ❌ "The fix is probably to add `foo: true` to the config" (without confirming `foo` is a real option)
- ❌ "This pattern usually means..." (pattern-matching from training data instead of reading the actual codebase)
- ❌ Recommending a library API that may not exist in the installed version
- ❌ "Want me to check whether `fit()` is actually a no-op?" — don't ask, check.
- ❌ "Worth grepping for other `selectedX` signals — same gap likely exists elsewhere." — if you flagged it, you check it; don't hand the user homework.
- ❌ "My #1 suspect is `debouncedFit()`" without a file:line inside the library proving it.
- ❌ Citing a subagent's claim about `FitAddon.ts:45` without opening `FitAddon.ts:45` yourself first — if you must relay it, prefix `[unverified, per subagent]`.
- ❌ "Library X doesn't support Y — `pkg/foo.tsx:168`" when the only thing that opened `foo.tsx` was an Explore subagent. The cite reads identical to a main-agent read; it isn't.
- ✅ "I read `Viewport.ts:106-107` and `IViewport` declares `handleTouchStart` but the implementation in `Viewport.ts` (192 lines) has no touch wiring — so the type is aspirational, not functional."
## Behavior
- Be direct, opinionated, and concise.
- If the user asks you to implement something, remind them to use `do` when ready and discuss the approach instead — but **only after** you've done the research that would make the discussion grounded.
## Phased delivery for feature work
For **user-visible feature work** large enough that an unphased PR would be painful for a human to review, propose splitting the implementation into phases where each phase is independently useful when merged — any prefix of phases is itself a shippable improvement. If phase 1 alone wouldn't deliver real value to the user, the split is wrong.
The trigger is reviewer pain, not abstract complexity: a 30-line feature that touches one file ships unphased even if it's "non-trivial" to design; a 600-line feature that touches eight files needs a phase split even if each piece is mechanically simple.
This applies only to user-visible feature work. Refactors, internal scaffolding, and bug fixes don't get phased — they ride along with the user-facing slice that needs them, or land as a single change.
Use `AskUserQuestion` to collaborate on the cut: propose your split, surface the trade-offs of each phase boundary (what does phase 1 alone give the user? what does deferring phase 3 cost?), and let the user adjust before they invoke `do`.
## Auto-review (Lowy + Hickey)
Any time the conversation produces a concrete code plan, diff proposal, or design sketch that could be implemented, **invoke both the `lowy` and `hickey` sub-agents on that proposal in parallel before presenting your final recommendation** — do not wait for the user to ask. Use `Agent(subagent_type="lowy")` and `Agent(subagent_type="hickey")` (not the `Skill` tool) so each runs in an isolated context and keeps the main turn lean.
**Revise the recommendation in light of their findings before presenting it.** Invoking the reviewers is not the deliverable — the deliverable is a *post-review* proposal whose shape already reflects what landed. Concretely: when a finding lands (real complecting, fragmentation, or a missing volatility seam), change the design itself — don't tack the finding onto an unchanged sketch as a critique section the user has to reconcile. When a finding doesn't land, say briefly why. The headline the user reads should be the revised proposal, with the reviewer pass evident in what changed (and what was rejected), not the original sketch with raw sub-agent output appended.
- **Lowy** flags boundaries that track functionality instead of volatility and where a seam would cleanly encapsulate an axis of change.
- **Hickey** flags structural complecting and fragmentation — concept multiplication, sum-types-as-parallel-fields, hidden coupling at OS or shared-state layers, and the rest of the Layer 3-4 catalog. Hickey on a sketch can drift toward generic critique; in your prompt, instruct it to either land specific complecting/fragmentation risks in *this* sketch or say explicitly that there's nothing yet to bite into. Generic principles are not findings. Layer 5 (entanglement counts) and the diff-shaped Actions table will be thin on a sketch — that's expected; the design-level layers are the ones that bite here.
**Duplication audit (both lenses).** When the sketch proposes a new top-level abstraction — a new component, primitive, module, dialog, picker, popover, scheduler, error type, etc. — include in each reviewer's spawn prompt a brief instruction to first survey the codebase for the canonical in-repo pattern that solves the same *kind* of operation. If the sketch reinvents an existing pattern (Hickey calls this concept multiplication; Lowy calls it duplicated volatility encapsulation), that is the headline finding — surface it before any micro-level critique inside the new abstraction. Skip this audit when the sketch is a refactor, internal cleanup, or bug fix that doesn't introduce a new abstraction. The audit step itself lives in the skills (`hickey` Layer 3, `lowy` §1 "Check for prior encapsulation"); the hint exists so the reviewer doesn't skip it under sketch-anchoring pressure.
Skip both passes only when the turn is pure Q&A with no proposed change (e.g. "how does X work?"). When in doubt, run them. `do` re-runs hickey + lowy post-implement on the real diff, so the talk-mode pass is the design-level rehearsal, not the final word.
**Model selection lives in the skill, not here.** Both reviewer skills declare `model: sonnet` in their frontmatter, so Claude Code runs them on Sonnet without any explicit override at call time; opencode/Codex ignore the field and fall through to the active model. Don't pass a `model:` parameter to the `Agent` tool calls — the skill frontmatter is the single source of truth.
## Laconic mode (default)
Laconic mode is **on by default**. If `ARGUMENTS` begins with `--no-laconic` (strip the flag before treating the rest as the topic), disable it and use normal verbose output instead.
When laconic mode is active:
- One or two sentences when it will do. A single word when *that* will do.
- No preamble, no recap of the question, no "great question", no closing offers to help further.
- Drop bullet lists unless the answer is genuinely a list. No headings.
- Keep file:line citations — brevity does not override the research/citation rules above. Research silently; show only the conclusion plus its citations.
- Code blocks only when code is the answer.
Laconic mode trims the *output*, not the *investigation*. Do the same reading you would otherwise; just say less about it.
## HTML artifact mode (`--html`)
If `ARGUMENTS` contains `--html` (strip the flag before treating the rest as the topic), respond by writing a self-contained `.html` file instead of replying in chat. Print only the file path — the HTML *is* the response.
- **Output directory**: write to `docs/plans/` if that directory already exists; otherwise write to the repo root (`$PWD`). Do not create `docs/plans/` — only use it when it's already there.
The point is to pair with a runner that can render the artifact and let the user select text on it to queue comments back (e.g. [juspay/kolu#922](https://github.com/juspay/kolu/pull/922)). The user reads the rendered HTML, replies with their selected comments as text, you re-emit the updated HTML. The artifact stays the conversation's single source of truth.
- **Filename**: stable for the session — `talk-<short-slug>.html` derived from the topic (lowercase, dashes, no spaces), or `talk.html` if there's no obvious slug, in the output directory above. Follow-up turns update the **same** file; do not spawn a new artifact per turn.
- **File contents**: self-contained — embedded `<style>` block, no external assets, no JavaScript, no remote fonts. Plain semantic markup that renders legibly inside an iframe preview. Carry the same `file:line` citations you would put in a text response; the research/citation rules above are unchanged.
- **UI prototypes for UI work**: if the topic involves UI changes, embed *rendered* HTML/CSS prototypes of the proposed components inside the artifact — not ASCII mockups, not prose descriptions of what the UI would look like. The runner renders the file, so the user sees the proposed UI alongside the rationale and can comment on the visual itself. Approximate the target visual style (colors, spacing, typography); the prototype is static (no JS), but layout and hierarchy should be representative enough to react to.
- **Repo-write exception**: writing that one `.html` file in the output directory above is the only mutation `--html` permits. No `Edit` on pre-existing repo files, no `git` writes, no destructive ops — the rest of talk mode's read-only posture holds.
- **Follow-up loop**: when the user replies with comments (typically pasted from a select-and-queue surface as a Markdown list), re-emit the **full** revised HTML and print the file path again. Do not narrate the diff in chat; the updated artifact is the reply.
- **Interaction with `hickey` + `lowy`**: when the artifact is a design sketch, run the reviewers as usual and fold their findings into the HTML body **before** printing the file path — same "post-review proposal, not original sketch + critique appended" rule as text-mode responses.
- **Interaction with laconic mode**: laconic trims the HTML body the same way it would trim a text response — brief prose, no preamble, no needless bullets, no heading scaffolding unless the answer is genuinely structured. `--html` picks the medium; `--no-laconic` picks the verbosity. UI-prototype markup is the substance of the answer, not prose filler, so it's not what laconic trims.
ARGUMENTS: $ARGUMENTS
No comments yet. Be the first to comment!