Run Engineering Council
Trigger
Use proactively before starting an enormous, irreversible, or cross-cutting change, and whenever the user asks for a council review. The user-prompt intake flags high-stakes signals (new plugin/subsystem, architecture, external provider/integration, migration, security, AI-system, build-vs-buy) and suggests this skill — act on that suggestion rather than waiting to be asked.
When To Use
- Major architecture decisions.
- New plugin, subsystem, or platform-shaping work.
- Build-vs-buy choices.
- Risky or irreversible migrations.
- Security-sensitive or external-integration designs.
- Scaling or AI-system design tradeoffs.
Inputs Inspected
- Council question.
- Relevant lifecycle artifacts.
- Repo evidence and external constraints supplied by the user.
Workflow
- Confirm the decision is high-stakes enough for council review (see When To Use). If a normal implementation plan is sufficient, use that instead.
- Collect the explicit question and context files or directories. Do not broaden scope silently.
- Subagent council (default — real multi-perspective analysis). Spawn the five advisor subagents IN PARALLEL, each with the same question and context:
council-contrarian, council-first-principles, council-expansionist, council-outsider, council-executor. Each returns a Markdown draft with the sections Position, Evidence Reviewed, Analysis, Evidence Gaps, Recommendation. Write each to .project/.engineering/council/<run-id>/advisor-drafts/<role>.md.
- Anonymize the drafts (strip role labels) into
anonymized-drafts/advisor-N.md, run a blind peer-review pass over the anonymized set, and write peer-reviews/.
- Spawn
council-chairperson with the advisor drafts and peer reviews to synthesize synthesis.md, preserving meaningful dissent. Enforce quorum: require at least three advisor drafts; if fewer, write artifacts with quorum-failed status and do not present the recommendation as final.
- Deterministic / CI fallback. When subagents are unavailable (headless, offline, or fixture/CI runs), use
python "${CLAUDE_PLUGIN_ROOT}/scripts/council.py" ask --question "<question>" --context <path> (deterministic local) or ... --mode live-model --adapter command|anthropic|openai ... (external adapters). Same artifact boundary as the subagent path.
- Validate the synthesis with
python "${CLAUDE_PLUGIN_ROOT}/scripts/validate-artifact.py" .project/.engineering/council/<run-id>/synthesis.md.
Outputs
.project/.engineering/council/<run-id>/input.json
.project/.engineering/council/<run-id>/advisor-drafts/
.project/.engineering/council/<run-id>/anonymized-drafts/
.project/.engineering/council/<run-id>/peer-reviews/
.project/.engineering/council/<run-id>/synthesis.md
.project/.engineering/council/<run-id>/events.jsonl
Live Adapter Configuration
--adapter command requires ENGINEERING_COUNCIL_ADAPTER_COMMAND. The command receives JSON on stdin and returns either plain Markdown or JSON with content, text, markdown, or response.
--adapter anthropic requires ANTHROPIC_API_KEY and ENGINEERING_COUNCIL_MODEL.
--adapter openai requires OPENAI_API_KEY and ENGINEERING_COUNCIL_MODEL.
- Optional controls:
ENGINEERING_COUNCIL_TIMEOUT_SECONDS, ENGINEERING_COUNCIL_MAX_CONTEXT_CHARS, ENGINEERING_COUNCIL_MAX_TOKENS, provider-specific URL overrides, and --fallback-on-error.
Data Boundary
--mode live-model is the only thing in this plugin that sends anything off the
machine. Everything under --context goes into the POST body.
- Credential-bearing files are withheld —
.env*, .pem/.key/.p12,
id_rsa*, .netrc, .pgpass, anything named secret/credential — along
with .git/, node_modules/ and build output. The run reports what it
withheld, in input.json under context_withheld and on stdout. If an advisor
seems to be missing evidence, look there first.
- Credential values are redacted from what does go — API keys, tokens, JWTs,
private key blocks and passwords inside connection strings. Names and structure
survive so the file still reads.
ENGINEERING_COUNCIL_MAX_CONTEXT_CHARS is a cost control, not a privacy
one. It bounds how much is sent, and never decided what.
- Endpoints are allowlisted to
api.anthropic.com and api.openai.com, over
HTTPS only. The URL overrides still work for a proxy, but an unlisted host
now needs ENGINEERING_COUNCIL_ALLOW_ANY_HOST=1, and plaintext HTTP is refused
outright — the override carries the live API key as well as the context.
- Still your call: the redaction is a backstop, not a review. Point
--context at the files the question actually needs rather than at a directory.
Required Front Matter
initiative_id
skill
created_at
status
confidence
source_artifacts
Quorum Rules
- Minimum quorum is three advisor drafts.
- If quorum fails, write artifacts anyway with
quorum-failed status and do not present a recommendation as final.
- Chair synthesis must preserve meaningful dissent.
Safety Constraints
- Do not use council for routine bug fixes or simple docs changes.
- Keep advisor positions evidence-bound.
- Chair synthesis must preserve meaningful dissent.
Enforcement
Suggestion strength is configurable via .project/.engineering/council/council-config.json
{"enforcement": "off | remind | ask"} (default remind). The user-prompt intake surfaces
the suggestion at this level: off stays silent, remind suggests the council, and ask
strengthens the wording. It never hard-blocks — the council is always suggested, never
auto-run.
Related Agents
council-contrarian
council-first-principles
council-expansionist
council-outsider
council-executor
council-chairperson
1---2name: run-engineering-council3description: Convene an independent multi-perspective engineering council before high-stakes or hard-to-reverse work — major architecture, a new plugin or subsystem, external integrations, risky migrations, security-sensitive or AI-system design, or build-vs-buy. Invoke proactively when a change is large, cross-cutting, or costly to undo, not only when explicitly asked; skip it for routine bug fixes and simple docs.4---56# Run Engineering Council78## Trigger910Use proactively before starting an enormous, irreversible, or cross-cutting change, and whenever the user asks for a council review. The user-prompt intake flags high-stakes signals (new plugin/subsystem, architecture, external provider/integration, migration, security, AI-system, build-vs-buy) and suggests this skill — act on that suggestion rather than waiting to be asked.1112## When To Use1314- Major architecture decisions.15- New plugin, subsystem, or platform-shaping work.16- Build-vs-buy choices.17- Risky or irreversible migrations.18- Security-sensitive or external-integration designs.19- Scaling or AI-system design tradeoffs.2021## Inputs Inspected2223- Council question.24- Relevant lifecycle artifacts.25- Repo evidence and external constraints supplied by the user.2627## Workflow28291. Confirm the decision is high-stakes enough for council review (see When To Use). If a normal implementation plan is sufficient, use that instead.302. Collect the explicit question and context files or directories. Do not broaden scope silently.313. **Subagent council (default — real multi-perspective analysis).** Spawn the five advisor subagents IN PARALLEL, each with the same question and context: `council-contrarian`, `council-first-principles`, `council-expansionist`, `council-outsider`, `council-executor`. Each returns a Markdown draft with the sections `Position`, `Evidence Reviewed`, `Analysis`, `Evidence Gaps`, `Recommendation`. Write each to `.project/.engineering/council/<run-id>/advisor-drafts/<role>.md`.324. Anonymize the drafts (strip role labels) into `anonymized-drafts/advisor-N.md`, run a blind peer-review pass over the anonymized set, and write `peer-reviews/`.335. Spawn `council-chairperson` with the advisor drafts and peer reviews to synthesize `synthesis.md`, preserving meaningful dissent. Enforce quorum: require at least three advisor drafts; if fewer, write artifacts with `quorum-failed` status and do not present the recommendation as final.346. **Deterministic / CI fallback.** When subagents are unavailable (headless, offline, or fixture/CI runs), use `python "${CLAUDE_PLUGIN_ROOT}/scripts/council.py" ask --question "<question>" --context <path>` (deterministic local) or `... --mode live-model --adapter command|anthropic|openai ...` (external adapters). Same artifact boundary as the subagent path.357. Validate the synthesis with `python "${CLAUDE_PLUGIN_ROOT}/scripts/validate-artifact.py" .project/.engineering/council/<run-id>/synthesis.md`.3637## Outputs3839- `.project/.engineering/council/<run-id>/input.json`40- `.project/.engineering/council/<run-id>/advisor-drafts/`41- `.project/.engineering/council/<run-id>/anonymized-drafts/`42- `.project/.engineering/council/<run-id>/peer-reviews/`43- `.project/.engineering/council/<run-id>/synthesis.md`44- `.project/.engineering/council/<run-id>/events.jsonl`4546## Live Adapter Configuration4748- `--adapter command` requires `ENGINEERING_COUNCIL_ADAPTER_COMMAND`. The command receives JSON on stdin and returns either plain Markdown or JSON with `content`, `text`, `markdown`, or `response`.49- `--adapter anthropic` requires `ANTHROPIC_API_KEY` and `ENGINEERING_COUNCIL_MODEL`.50- `--adapter openai` requires `OPENAI_API_KEY` and `ENGINEERING_COUNCIL_MODEL`.51- Optional controls: `ENGINEERING_COUNCIL_TIMEOUT_SECONDS`, `ENGINEERING_COUNCIL_MAX_CONTEXT_CHARS`, `ENGINEERING_COUNCIL_MAX_TOKENS`, provider-specific URL overrides, and `--fallback-on-error`.5253## Data Boundary5455`--mode live-model` is the only thing in this plugin that sends anything off the56machine. Everything under `--context` goes into the POST body.5758- **Credential-bearing files are withheld** — `.env*`, `.pem`/`.key`/`.p12`,59 `id_rsa*`, `.netrc`, `.pgpass`, anything named `secret`/`credential` — along60 with `.git/`, `node_modules/` and build output. The run reports what it61 withheld, in `input.json` under `context_withheld` and on stdout. If an advisor62 seems to be missing evidence, look there first.63- **Credential values are redacted from what does go** — API keys, tokens, JWTs,64 private key blocks and passwords inside connection strings. Names and structure65 survive so the file still reads.66- **`ENGINEERING_COUNCIL_MAX_CONTEXT_CHARS` is a cost control, not a privacy67 one.** It bounds how much is sent, and never decided what.68- **Endpoints are allowlisted to `api.anthropic.com` and `api.openai.com`, over69 HTTPS only.** The URL overrides still work for a proxy, but an unlisted host70 now needs `ENGINEERING_COUNCIL_ALLOW_ANY_HOST=1`, and plaintext HTTP is refused71 outright — the override carries the live API key as well as the context.72- Still your call: **the redaction is a backstop, not a review.** Point73 `--context` at the files the question actually needs rather than at a directory.7475## Required Front Matter7677- `initiative_id`78- `skill`79- `created_at`80- `status`81- `confidence`82- `source_artifacts`8384## Quorum Rules8586- Minimum quorum is three advisor drafts.87- If quorum fails, write artifacts anyway with `quorum-failed` status and do not present a recommendation as final.88- Chair synthesis must preserve meaningful dissent.8990## Safety Constraints9192- Do not use council for routine bug fixes or simple docs changes.93- Keep advisor positions evidence-bound.94- Chair synthesis must preserve meaningful dissent.9596## Enforcement9798Suggestion strength is configurable via `.project/.engineering/council/council-config.json`99`{"enforcement": "off | remind | ask"}` (default `remind`). The user-prompt intake surfaces100the suggestion at this level: `off` stays silent, `remind` suggests the council, and `ask`101strengthens the wording. It never hard-blocks — the council is always suggested, never102auto-run.103104## Related Agents105106- `council-contrarian`107- `council-first-principles`108- `council-expansionist`109- `council-outsider`110- `council-executor`111- `council-chairperson`