refactor(agents): remove interrogator, merge design Q&A into conductor

Confirmed via official Copilot CLI docs: there is no ask_user/elicitation
tool available to custom agents (only execute/read/edit/search/agent/web/
todo aliases exist). Subagent calls made through the 'agent' tool are
stateless — they run to completion and return one final result, with no
mechanism to pause mid-task for a live human reply.

This means conductor invoking interrogator via the agent tool could never
work: interrogator would run as a subagent regardless of whether conductor
itself was foreground or backgrounded, and subagents can't get real user
answers. That's why it was silently writing fabricated decisions.md/
questionnaire.md content instead of actually asking anything.

Fix: delete the interrogator agent entirely and fold its full Q&A
procedure directly into conductor's own DESIGN PHASE, run inline in
conductor's own foreground turn — never delegated. Updated the design
skill/prompt, AGENTS.md, README, QUICKSTART, and role-tier config to
match. Single entry point, no subagent path for anything that needs a
live human answer.
This commit is contained in:
2026-09-10 02:40:07 +02:00
parent 099001728c
commit 154e456d4c
9 changed files with 108 additions and 151 deletions
+29 -31
View File
@@ -103,47 +103,45 @@ This creates a per-repo `.agents/` footprint:
Open Copilot CLI or VS Code Copilot in the project and pick the entry point that matches the
size of the change.
**Full pipeline** (new feature, non-trivial change):
**Full pipeline** (new feature, non-trivial change). `conductor` is the **single entry
point** — it asks every design question itself, directly, in its own turn:
```
Use the conductor agent to build a rate limiter for the public API
```
> **How agent invocation actually works** (per the [official docs](https://docs.github.com/en/copilot/how-tos/copilot-cli/use-copilot-cli/invoke-custom-agents)):
> `@` in Copilot CLI **only mentions files**, never agents. There are three real ways to invoke
> a custom agent:
> 1. `/agent` — opens an interactive picker to browse and select.
If `.agents/specs/<slug>/decisions.md` is missing or incomplete, `conductor` asks its own
numbered questions right there (each with a recommended answer, a `Why:`, and a freeform
`Other:` option), then stops and waits for your real reply. It never guesses, infers, or
delegates the question to a subagent — subagent calls in Copilot CLI are stateless (they run
to completion and return one final result; they cannot pause mid-task for a live human reply)
— so you must answer before the pipeline proceeds.
> **How to invoke a custom agent** (per the [official docs](https://docs.github.com/en/copilot/how-tos/copilot-cli/use-copilot-cli/invoke-custom-agents)):
> `@` in Copilot CLI **only mentions files**, never agents. There are three ways:
> 1. `/agent` → pick `conductor` from the list, then press **Enter to confirm the selection**
> before typing your build prompt (selecting and prompting are two separate steps).
> 2. Name it in your prompt — `Use the conductor agent to ...` — Copilot infers which agent you mean.
> 3. `copilot --agent=NAME -p "..."` — force a specific agent non-interactively.
>
> **Agent name note:** inside this repo (or any repo where the harness lives natively in
> `.github/agents`), the bare name `conductor` resolves. Once installed as a *plugin* into
> another project, Copilot CLI namespaces **agents only** — the resolvable name becomes
> `redsen-lean-harness:conductor`, `redsen-lean-harness:architect`, etc. (confirmed via
> `copilot --agent <bad-name>`, whose error message lists every real agent name it knows,
> always namespaced for plugin-sourced agents). **Skills are never namespaced** —
> `/fast-track`, `/design`, `/build`, `/verify`, `/onboard`, etc. work as plain slash commands
> regardless of install method (confirmed via `copilot plugins list --kind skill --json`, whose
> `name` fields carry no prefix).
> `redsen-lean-harness:conductor`, `redsen-lean-harness:architect`, etc. **Skills are never
> namespaced** — `/fast-track`, `/design`, `/build`, `/verify`, `/onboard`, etc. work as plain
> slash commands regardless of install method.
>
> **Known limitation:** a plugin-sourced agent can be launched (by full name in a prompt, or
> via `--agent=plugin-name:agent-name`) even when it isn't proactively *suggested*. Copilot's
> own `copilot plugins list` command documents that "custom agents ... require a live session
> and will be added in a follow-up" — i.e. the CLI's own agent-introspection tooling doesn't
> yet fully cover plugin-contributed agents, which likely also affects what the `/agent` picker
> surfaces and what the model volunteers unprompted. Naming the agent explicitly
> (`Use the conductor agent to ...`) reliably works around this today.
>
> If naming the agent explicitly still fails: the plugin was likely loaded before a fix landed.
> Run `copilot plugin marketplace update redsen && copilot plugin update redsen-lean-harness`,
> then start a **new** `copilot` session — an already-running session keeps the plugin
> snapshot it loaded at startup and won't pick up the update until restarted.
> **If `/agent` doesn't list it, or invoking it reports "not found":** the plugin is stale. Run
> `copilot plugin update redsen-lean-harness` (or `copilot plugin marketplace update redsen &&
> copilot plugin update redsen-lean-harness` if that alone doesn't refresh it), then start a
> **brand-new** `copilot` session — an already-running session keeps the plugin snapshot it
> loaded at startup and won't pick up the update until restarted.
This runs the whole pipeline: `interrogator` asks clarifying questions with recommended
answers (you must answer before it proceeds — this is a deliberate gate), `architect` writes
the spec and acceptance criteria, `splitter` breaks it into lanes, `builder`/`verifier` run the
Ralph loop per lane (in parallel git worktrees when lanes don't overlap), `integrator` merges
sequentially, and `scribe` journals everything as it happens.
This runs the whole pipeline: `conductor` asks clarifying questions itself with recommended
answers (you must answer before it proceeds — this is a deliberate gate), then `architect`
writes the spec and acceptance criteria, `splitter` breaks it into lanes, `builder`/`verifier`
run the Ralph loop per lane (in parallel git worktrees when lanes don't overlap), `integrator`
merges sequentially, and `scribe` journals everything as it happens.
**Small brownfield fix** (skip spec + DAG ceremony):
@@ -166,11 +164,11 @@ subcommand, who calls it, and when.
| Command | Who runs it | When |
| --- | --- | --- |
| `lh index` | `interrogator`, `scout`, `architect`, `splitter` | Automatically, before reading files, to build token-budgeted context |
| `lh index` | `conductor`, `scout`, `architect`, `splitter` | Automatically, before reading files, to build token-budgeted context |
| `lh host` | `conductor` | Automatically, first thing, to pick parallel-vs-sequential strategy |
| `lh run start/event/end` | `conductor` (start/end), every agent (event) | Automatically, for every phase transition — never skipped |
| `lh lane create/status/merge` | `conductor`, `builder`, `integrator` | Automatically, before a write lane starts and when it merges |
| `lh memory get/put/scan` | `interrogator`, `architect`, `builder`, `scribe` | Automatically, to pull relevant shards before work and record facts/failures after |
| `lh memory get/put/scan` | `conductor`, `architect`, `builder`, `scribe` | Automatically, to pull relevant shards before work and record facts/failures after |
| `lh graph` | `verifier` (always), plus `architect`/`splitter`/`conductor`/`reviewer`/`scout`/`integrator` at their own checkpoints | Automatically — it's exit criterion #3, never skipped |
| `lh doctor` | `conductor` (first thing, before `lh host`), also you whenever you want to check the environment yourself | Automatically at the start of every pipeline run — `conductor`'s step 1 |
| `lh init --yes` | `conductor`, automatically, only if `lh doctor` reports `config not initialised` | Self-heals a missing `.agents/` baseline with non-interactive defaults, then re-runs `lh doctor` |
@@ -225,7 +223,7 @@ Everything the harness does is self-documenting — nothing lives only in a chat
| `copilot plugin install owner/repo` prints a deprecation warning | Expected for direct-source installs. Use `copilot plugin marketplace add` + `copilot plugin install name@marketplace` instead (path A) |
| `npm install -g @redsentech/lean-harness` gives `404`/`403` | `.npmrc` isn't pointed at GitHub Packages, or the token lacks `read:packages`. Run `node scripts/setup-npm-registry.mjs` — see [Generating a GitHub token](../README.md#generating-a-github-token) if you don't have one yet |
| `setup-npm-registry.mjs` doesn't open a browser (SSH/headless) | Expected — it falls back to printing the token creation URL. Pass `--no-open` to skip the attempt entirely |
| Pipeline stuck at design gate | `interrogator` is waiting on your answers — this is intentional, answer the questions |
| Pipeline stuck at design gate | `conductor` is waiting on your answers — this is intentional, answer the questions |
## Next steps