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:
+29
-31
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user