ennodia 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CONTRIBUTING.md +60 -36
  2. package/README.md +74 -58
  3. package/bench/README.md +7 -5
  4. package/bench/bug-recall/run.ts +12 -4
  5. package/bin/ennodia +23 -2
  6. package/docs/assets/agents/mcp.svg +1 -1
  7. package/docs/assets/orchestration-pipeline.svg +4 -3
  8. package/docs/comparisons/agent-frameworks.md +15 -10
  9. package/docs/comparisons/autogen.md +20 -15
  10. package/docs/comparisons/chathub.md +15 -14
  11. package/docs/comparisons/index.md +30 -22
  12. package/docs/comparisons/langgraph.md +19 -12
  13. package/docs/comparisons/mixture-of-agents.md +20 -17
  14. package/docs/comparisons/model-merging.md +7 -5
  15. package/docs/comparisons/openrouter.md +30 -22
  16. package/docs/concepts/compositional-audits.md +16 -13
  17. package/docs/concepts/data-governance.md +31 -15
  18. package/docs/concepts/how-ennodia-works.md +48 -22
  19. package/docs/concepts/interfaces-and-core.md +19 -6
  20. package/docs/concepts/second-opinions.md +20 -20
  21. package/docs/getting-started.md +55 -27
  22. package/docs/guides/agent-skills.md +16 -13
  23. package/docs/guides/budgets-and-limits.md +30 -20
  24. package/docs/guides/running-better-audits.md +50 -44
  25. package/docs/index.md +60 -37
  26. package/docs/install.md +41 -32
  27. package/docs/reference/benchmarks.md +6 -4
  28. package/docs/reference/controlled-english.md +130 -0
  29. package/docs/reference/ennodia-io.md +28 -22
  30. package/docs/reference/mcp-tools.md +244 -87
  31. package/docs/reference/supported-harnesses.md +9 -9
  32. package/package.json +7 -5
  33. package/src/advisor.ts +685 -0
  34. package/src/budget.ts +25 -6
  35. package/src/cli.ts +1 -1
  36. package/src/compare.ts +248 -52
  37. package/src/compositional.ts +18 -0
  38. package/src/core.ts +547 -16
  39. package/src/harnesses.ts +33 -2
  40. package/src/index.ts +38 -0
  41. package/src/plan-advice.ts +601 -0
  42. package/src/runs.ts +74 -9
  43. package/src/server.ts +312 -46
  44. package/src/skills.ts +131 -11
  45. package/src/tasks.ts +192 -22
  46. package/src/version.ts +1 -1
package/CONTRIBUTING.md CHANGED
@@ -6,7 +6,7 @@ review.
6
6
  ## Prerequisites
7
7
 
8
8
  - Bun `1.3.14` or newer
9
- - Local AI tools only when you are changing or testing their adapters
9
+ - Local artificial intelligence (AI) tools only when you change or test their adapters
10
10
 
11
11
  ## Local workflow
12
12
 
@@ -21,8 +21,9 @@ bun run verify
21
21
  - Oxlint
22
22
  - Bun tests
23
23
  - website build
24
+ - controlled-English deterministic checks
24
25
  - task smoke test
25
- - MCP smoke test
26
+ - Model Context Protocol (MCP) smoke test
26
27
 
27
28
  Before changing release metadata, package contents, or registry config, also run:
28
29
 
@@ -35,7 +36,8 @@ bun run release:check
35
36
  - Keep adapters thin. Put shared routing, tracing, task lifecycle, recovery, and
36
37
  Compare behavior in core modules.
37
38
  - Do not add permission-bypass flags to harness commands by default.
38
- - Do not call provider-private APIs. Use supported CLI or API surfaces.
39
+ - Do not call provider-private application programming interfaces (APIs).
40
+ Use supported command-line interface (CLI) or API surfaces.
39
41
  - Keep progress and status output compact and factual.
40
42
  - Keep docs, website copy, package metadata, and MCP behavior aligned in the
41
43
  same change when public behavior changes.
@@ -46,10 +48,11 @@ bun run release:check
46
48
 
47
49
  `bin/ennodia` is the executable used by npm, `bunx`, and `npx`.
48
50
  `src/cli.ts` starts the stdio MCP server only.
49
- `src/index.ts` is the side-effect-free TypeScript export surface for JSR and
50
- imports.
51
- `packages/ennodia-io` is the experimental local HTTP package. It owns the
52
- `ennodia-io` binary and imports Core from the `ennodia` package surface; the
51
+ `src/index.ts` is the side-effect-free TypeScript export surface for the
52
+ JavaScript Registry (JSR) and imports.
53
+ `packages/ennodia-io` is the experimental local Hypertext Transfer Protocol
54
+ (HTTP) package. It owns the
55
+ `ennodia-io` binary and imports Core from the `ennodia` package surface. The
53
56
  root package must not ship the HTTP server.
54
57
 
55
58
  ## Releasing
@@ -57,13 +60,16 @@ root package must not ship the HTTP server.
57
60
  Releases are cut by a maintainer, not part of a normal contribution. This
58
61
  section exists so the process is written down.
59
62
 
60
- **Versioning.** Prerelease versions use SemVer suffixes such as `0.1.0-rc.1`;
63
+ **Versioning.** Prerelease versions use SemVer suffixes such as `0.1.0-rc.1`.
61
64
  stable versions omit the suffix, such as `0.1.0`. The source of truth is the
62
- root `package.json` version; `bun run version:sync` derives `jsr.json`,
63
- `src/version.ts`, and the IO package version/peer dependency from it. `bun test`
64
- verifies they match.
65
+ root `package.json` version.
65
66
 
66
- **Dist-tags.** Tags containing a hyphen publish to npm's `next` dist-tag;
67
+ `bun run version:sync` derives `jsr.json`,
68
+ `src/version.ts`, `server.json`, `manifest.json`, and the IO package version.
69
+ It also derives the IO dependency on the core version. `bun test` verifies
70
+ that the versions match.
71
+
72
+ **Dist-tags.** Tags containing a hyphen publish to npm's `next` dist-tag.
67
73
  tags without a hyphen publish to `latest`:
68
74
 
69
75
  ```bash
@@ -73,7 +79,7 @@ git tag v0.1.0 && git push origin v0.1.0 # publishes to latest
73
79
 
74
80
  Since `v0.1.0`, docs recommend the unqualified `ennodia` install, which npm
75
81
  resolves to the `latest` dist-tag. Prerelease work between stable releases
76
- still publishes to `next`; recommend `ennodia@next` in docs only while a fix
82
+ still publishes to `next`. Recommend `ennodia@next` in docs only while a fix
77
83
  exists solely on that channel.
78
84
 
79
85
  **Release checklist.**
@@ -89,44 +95,62 @@ exists solely on that channel.
89
95
  3. Commit the version change.
90
96
  4. Push a matching tag, for example `v0.1.0-rc.1`.
91
97
  5. The `Release` GitHub Actions workflow publishes the core `ennodia` package
92
- to npm and JSR, plus the GitHub release asset. Until the workflow is updated
93
- to publish both packages, `@cherninlab/ennodia-io` is published manually by a
94
- maintainer after the core package version it peers against is available.
95
-
96
- **Package contents.** The core npm package must include `bin/ennodia`, the source
97
- files the Bun runtime needs, README/LICENSE/CONTRIBUTING/docs, and benchmark
98
- fixtures — and must not include `.github/`, `AGENTS.md`, `CLAUDE.md`,
99
- `bun.lock`, `src/dev/`, `src/io.ts`, `*.test.ts`, `packages/`, or `website/`.
98
+ to npm and JSR, then `@cherninlab/ennodia-io` to npm, the MCP Registry
99
+ listing, and the GitHub release asset. Re-running a release is safe when a
100
+ prior attempt published one of these immutable versions.
101
+
102
+ **Package contents.** The core npm package must include these items:
103
+
104
+ - `bin/ennodia`
105
+ - source files that the Bun runtime needs
106
+ - README, LICENSE, CONTRIBUTING, and documentation files
107
+ - benchmark fixtures
108
+
109
+ The core npm package must not include these items:
110
+
111
+ - `.github/`, `AGENTS.md`, or `CLAUDE.md`
112
+ - `bun.lock`, `src/dev/`, or `src/io.ts`
113
+ - `*.test.ts`, `packages/`, or `website/`
114
+
100
115
  JSR publishes the TypeScript source and docs, but not benchmark fixtures.
101
116
  The IO npm package must include `bin/ennodia-io`, its `src/` files, and its
102
- README, and keeps `ennodia` as a peer dependency. `bun run release:check`
103
- enforces these lists.
117
+ README. It has an exact runtime dependency on the matching `ennodia` version.
118
+ The release workflow publishes the core package first. The IO package stays
119
+ outside the root Bun workspace so an unpublished next version does not block
120
+ the root install. `bun run release:check` enforces these rules.
104
121
 
105
- **Registry publishing.** Both npm and JSR publish from GitHub Actions using
106
- OIDC — there is no long-lived `NPM_TOKEN`. To reconfigure a trusted
107
- publisher: npm needs provider "GitHub Actions", org/user `cherninlab`,
108
- repository `ennodia`, workflow filename `release.yml`, allowed action
109
- `npm publish`; JSR needs scope `@cherninlab`, package `ennodia`, linked
110
- repository `cherninlab/ennodia`.
122
+ **Registry publishing.** npm publishes use the repository `NPM_TOKEN` secret.
123
+ The workflow passes it to npm as `NODE_AUTH_TOKEN`. JSR uses GitHub Actions
124
+ OpenID Connect (OIDC) without a JSR token.
125
+
126
+ Link scope `@cherninlab`, package `ennodia`, to
127
+ `cherninlab/ennodia` in JSR package settings. The workflow's `id-token: write`
128
+ permission enables that authentication. To reconfigure npm, ensure the token
129
+ can publish both `ennodia` and `@cherninlab/ennodia-io` with public access.
111
130
 
112
131
  **MCP registry listing.** The official MCP Registry
113
- (`registry.modelcontextprotocol.io`) hosts metadata only; npm remains the
132
+ (`registry.modelcontextprotocol.io`) hosts metadata only. npm remains the
114
133
  artifact source. The listing is defined by `server.json` at the repo root,
115
134
  and npm-side ownership is verified through the `mcpName` field in
116
- `package.json` (`io.github.cherninlab/ennodia`) — the two names must match.
135
+ `package.json`. Its value must match `io.github.cherninlab/ennodia` in
136
+ `server.json`.
117
137
  To publish or update the listing after the npm package is live:
118
138
 
119
139
  ```sh
120
140
  brew install mcp-publisher # or download from the registry's releases
121
- mcp-publisher login github # device-code flow; grants io.github.cherninlab/*
141
+ mcp-publisher login github # interactive local login; grants io.github.cherninlab/*
122
142
  mcp-publisher publish # validates and submits server.json
123
143
  ```
124
144
 
125
- Keep the `version` fields in `server.json` in step with releases; the
126
- listing is per-version, so re-run `mcp-publisher publish` after each stable
127
- release. Community aggregators (Glama, PulseMCP, mcp.so, Smithery) index
145
+ The release workflow uses the non-interactive GitHub Actions OIDC equivalent:
146
+ `mcp-publisher login github-oidc --registry=https://registry.modelcontextprotocol.io`.
147
+ This also requires the workflow's `id-token: write` permission.
148
+
149
+ Keep the `version` fields in `server.json` in step with releases. The
150
+ listing is per-version, so re-run `mcp-publisher publish` after each release.
151
+ Community aggregators (Glama, PulseMCP, mcp.so, Smithery) index
128
152
  GitHub and the official registry automatically or accept one-time
129
- submissions; they do not need per-release updates.
153
+ submissions. They do not need per-release updates.
130
154
 
131
155
  ## Benchmarks
132
156
 
package/README.md CHANGED
@@ -1,90 +1,103 @@
1
1
  <div align="center">
2
2
 
3
3
  <a href="https://ennodia.cherninlab.com">
4
- <picture>
5
- <source media="(prefers-color-scheme: dark)" srcset="docs/assets/logo-dark.svg">
6
- <source media="(prefers-color-scheme: light)" srcset="docs/assets/logo.svg">
7
- <img alt="Ennodia" src="docs/assets/logo.svg" width="235" height="50">
4
+ <picture>
5
+ <source media="(prefers-color-scheme: dark)" srcset="https://github.com/cherninlab/ennodia/raw/main/docs/assets/logo-dark.svg">
6
+ <source media="(prefers-color-scheme: light)" srcset="https://github.com/cherninlab/ennodia/raw/main/docs/assets/logo.svg">
7
+ <img alt="Ennodia" src="https://github.com/cherninlab/ennodia/raw/main/docs/assets/logo.svg" width="235" height="50">
8
8
  </picture>
9
9
  </a>
10
10
 
11
- <p><strong>MCP server for multi-agent review with Compare and traceable receipts</strong></p>
11
+ <p><strong>Model Context Protocol (MCP) server for multi-agent review with Compare and traceable receipts</strong></p>
12
12
 
13
13
  <p>
14
14
  <a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-informational"></a>
15
- <img alt="CI" src="https://github.com/cherninlab/ennodia/actions/workflows/ci.yml/badge.svg" />
15
+ <img alt="Continuous integration" src="https://github.com/cherninlab/ennodia/actions/workflows/ci.yml/badge.svg" />
16
16
  <a href="https://smithery.ai/servers/cherninlab/ennodia"><img alt="Smithery: Ennodia" src="https://img.shields.io/badge/Smithery-Ennodia-FF5601"></a>
17
17
  </p>
18
18
 
19
19
  <p align="center">
20
- <img alt="Ennodia terminal comparing three completed AI reviews" src="docs/assets/terminal.png" width="600">
20
+ <img alt="Ennodia terminal with three completed artificial intelligence reviews" src="https://github.com/cherninlab/ennodia/raw/main/docs/assets/terminal.png" width="600">
21
21
  </p>
22
22
 
23
23
  </div>
24
24
 
25
- No single model or agent should be the only reviewer for work that matters.
26
- Ennodia lets your primary agent ask the installed agent CLIs you already have,
27
- track every child task, and use model-led Compare to surface agreements,
28
- disagreements, blind spots, and one synthesized answer with receipts.
25
+ Ennodia gives your primary agent access to installed agent command-line
26
+ interfaces (CLIs). It tracks each child task and uses model-led Compare to show
27
+ agreements, disagreements, omissions, and one recommended answer with receipts.
29
28
 
30
- The subscription-pool idea is secondary: if you already pay for Codex, Claude
31
- Code, Antigravity, OpenCode, and other local agent tools, Ennodia gives your
32
- main agent one MCP doorway to use them as an independent review panel. The
33
- experimental IO package exposes a small local HTTP subset for apps, but the
34
- supported first-class surface is MCP.
29
+ Before work, an optional Plan Advisor can propose a bounded set of harnesses,
30
+ models, and skills. It does not start the proposed work.
35
31
 
36
32
  ## Install
37
33
 
38
- Send this to your primary agent and let it handle setup:
34
+ Send this address to your primary agent. The agent can then complete the
35
+ installation:
39
36
 
40
37
  ```text
41
38
  try-ennodia.cherninlab.com
42
39
  ```
43
- Or run it directly as a stdio MCP server from npm:
40
+ To run Ennodia directly as a standard input/output (stdio) MCP server, use:
44
41
 
45
42
  ```sh
46
43
  npx -y ennodia
47
44
  ```
45
+ To use Bun directly, run `bunx ennodia`.
48
46
 
49
- Prefer a registry or client installer? Use the
50
- [Ennodia Smithery listing](https://smithery.ai/servers/cherninlab/ennodia).
51
- It uses the same stdio command from `smithery.yaml` (`npx -y ennodia`) and
52
- does not need Ennodia-specific configuration.
47
+ For a registry or client installer, use the
48
+ [Ennodia Smithery page](https://smithery.ai/servers/cherninlab/ennodia).
53
49
 
54
- Requires Bun `1.3.14` or newer — `npx` downloads Ennodia, Bun runs it. Prefer
55
- Bun directly? Use `bunx ennodia`. For manual setup, local development,
56
- or a full walkthrough, see
50
+ For manual installation or local development, see
57
51
  [Quickstart](https://ennodia.cherninlab.com/docs/getting-started/).
58
52
 
59
53
  ## What Ennodia does
60
54
 
61
- - Discovers available local AI tools
55
+ - Discovers available local artificial intelligence (AI) tools
62
56
  - Plans a route with a caller-provided category or keyword fallback
63
57
  - Estimates preflight input tokens and enforces local caps on that estimate
64
58
  - Starts and monitors child tasks
65
- - Shows status, timing, logs, and failures
59
+ - Shows status, elapsed time, logs, and failures
66
60
  - Cancels tasks and runs explicitly
67
- - Compares multiple completed outputs
68
- - Synthesizes one answer from the comparison
61
+ - Lets a Plan Advisor propose an inert, validated work plan
62
+ - Compares multiple completed outputs with a Judge
63
+ - Lets a Result Advisor combine the Judge findings into one answer
69
64
 
70
- The main entrypoint is `ennodia_run`: it plans, executes, optionally
71
- compares, and returns a run ID to poll with `ennodia_get_run`. See
72
- [MCP tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/) for the
73
- full tool and parameter reference.
65
+ `ennodia_run` is the main entrypoint. It plans and starts tasks. It can also use
66
+ Compare. It returns a run identifier (ID) for use with `ennodia_get_run`.
74
67
 
75
- Ennodia is for deliberation-class work: a run usually takes minutes, and Compare
76
- adds two serial model passes after the child agents finish.
68
+ See [MCP tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/) for
69
+ the full tool and parameter reference.
70
+
71
+ Use Ennodia for work that needs additional model analysis. A run usually takes
72
+ minutes. Compare adds two serial model passes after the child agents finish.
73
+
74
+ ## Judge, Plan Advisor, and Result Advisor
75
+
76
+ Each role has limited responsibilities:
77
+
78
+ - **Plan Advisor** runs before work when requested. It proposes explicit
79
+ harness, model, and skill assignments as inert data. Ennodia validates the
80
+ proposal against a frozen inventory. Plan Advisor cannot execute it. The
81
+ caller must use a separate call to start the validated plan once.
82
+ - **Judge** runs during Compare and maps agreements, contradictions, unique
83
+ evidence, omissions, and risks across completed outputs.
84
+ - **Result Advisor** follows the Judge. It uses the Judge findings and original
85
+ outputs to recommend an answer. If Judge analysis is not usable, it uses
86
+ `basis: "candidates-only"`. This status makes the degradation visible.
77
87
 
78
88
  ## Ennodia IO
79
89
 
80
- The separate `@cherninlab/ennodia-io` workspace package exposes a local HTTP and TypeScript interface for apps that want BYOK-style settings over installed local agents:
90
+ The separate `@cherninlab/ennodia-io` package provides a local Hypertext
91
+ Transfer Protocol (HTTP) and TypeScript interface. Apps can use it with
92
+ user-supplied keys and installed local agents:
81
93
 
82
94
  ```sh
83
95
  npx -y @cherninlab/ennodia-io
84
96
  ```
85
97
 
86
98
  See [Ennodia IO](https://ennodia.cherninlab.com/docs/reference/ennodia-io/) for
87
- supported fields, auth behavior, CORS posture, and current limits.
99
+ supported fields, authentication behavior, cross-origin resource sharing
100
+ rules, and current limits.
88
101
 
89
102
  ## Supported harnesses
90
103
 
@@ -97,30 +110,33 @@ supported fields, auth behavior, CORS posture, and current limits.
97
110
  - Hermes Agent
98
111
  - Antigravity
99
112
 
100
- Adapters stay thin — shared routing, tracing, task state, recovery, and
101
- Compare logic live in core modules.
113
+ Adapters stay thin. Core modules contain shared routing, trace data, task state,
114
+ recovery, and Compare logic.
115
+
116
+ Evaluated candidates include Gemini CLI, GitHub Copilot CLI, Amp, Aider, Goose,
117
+ Qwen Code, and Cursor CLI. Ennodia does not include these candidates.
102
118
 
103
- Evaluated-but-not-shipped candidates include Gemini CLI, GitHub Copilot CLI,
104
- Amp, Aider, Goose, Qwen Code, and Cursor CLI. They will be added only when a
105
- supported non-interactive prompt-in/text-out surface can be verified without
106
- permission-bypass flags or provider-private APIs.
119
+ Ennodia can add a candidate after verification of a supported prompt-in and
120
+ text-out interface. Verification must not use permission-bypass flags or
121
+ provider-private APIs.
107
122
 
108
123
  ## Documentation
109
124
 
110
- - [Installation for Agents](https://ennodia.cherninlab.com/docs/install/) — the agent-driven setup path
111
- - [Quickstart](https://ennodia.cherninlab.com/docs/getting-started/) — manual setup and local development
112
- - [MCP Tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/) — full tool parameter reference
113
- - [How Ennodia Works](https://ennodia.cherninlab.com/docs/concepts/how-ennodia-works/) — the orchestration pipeline
114
- - [Second Opinions](https://ennodia.cherninlab.com/docs/concepts/second-opinions/) — replicate, decompose, and red-team patterns
115
- - [Data Governance](https://ennodia.cherninlab.com/docs/concepts/data-governance/) — local storage and data movement boundaries
116
- - [Comparisons](https://ennodia.cherninlab.com/docs/comparisons/) — how Ennodia compares to adjacent tools
117
- - [Benchmarks](https://ennodia.cherninlab.com/docs/reference/benchmarks/) — deterministic bug-recall results
118
- - [Running Better Audits](https://ennodia.cherninlab.com/docs/guides/running-better-audits/) — prompt rubrics for Compare
125
+ - [Installation for Agents](https://ennodia.cherninlab.com/docs/install/): agent-controlled installation
126
+ - [Quickstart](https://ennodia.cherninlab.com/docs/getting-started/): manual installation and local development
127
+ - [MCP Tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/): full tool parameter reference
128
+ - [How Ennodia Works](https://ennodia.cherninlab.com/docs/concepts/how-ennodia-works/): orchestration pipeline
129
+ - [Second Opinions](https://ennodia.cherninlab.com/docs/concepts/second-opinions/): replicate, decompose, and red-team patterns
130
+ - [Data Governance](https://ennodia.cherninlab.com/docs/concepts/data-governance/): local storage and data movement boundaries
131
+ - [Controlled English](https://ennodia.cherninlab.com/docs/reference/controlled-english/): ASD-STE100 rules and Ennodia technical terms
132
+ - [Comparisons](https://ennodia.cherninlab.com/docs/comparisons/): comparisons with adjacent tools
133
+ - [Benchmarks](https://ennodia.cherninlab.com/docs/reference/benchmarks/): deterministic bug-recall results
134
+ - [Better Audits](https://ennodia.cherninlab.com/docs/guides/running-better-audits/): prompt rubrics for Compare
119
135
 
120
136
  ## Benchmarks
121
137
 
122
- The current benchmark is `multi-model-bug-recall`: small TypeScript review
123
- fixtures scored against committed bug oracles. Run the deterministic suite with:
138
+ The current benchmark is `multi-model-bug-recall`. It uses small TypeScript
139
+ review fixtures and committed bug oracles. Run the deterministic suite with:
124
140
 
125
141
  ```sh
126
142
  bun run bench:bug-recall
@@ -133,8 +149,8 @@ The current dated fixture snapshot is published in
133
149
  [Benchmarks](https://ennodia.cherninlab.com/docs/reference/benchmarks/): 4
134
150
  cases, with `ennodia-parallel-compare` at 100% recall and 100% precision.
135
151
 
136
- ## Contributing
152
+ ## Contribute
137
153
 
138
- Ennodia is under active development. Bug reports and small, focused pull requests
139
- are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for the local verification
140
- workflow.
154
+ Ennodia is under active development. You can submit bug reports and small,
155
+ focused pull requests. See [CONTRIBUTING.md](CONTRIBUTING.md) for the local
156
+ verification workflow.
package/bench/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Benchmarks
2
2
 
3
3
  Ennodia's first release-candidate benchmark is `multi-model-bug-recall`: small
4
- TypeScript review fixtures with committed oracles. It measures whether
4
+ TypeScript review fixtures with committed oracles. It measures if
5
5
  parallel peer review plus Compare recovers more required findings than a solo
6
6
  harness answer.
7
7
 
@@ -11,8 +11,8 @@ The default command is deterministic and uses committed reference outputs:
11
11
  bun run bench:bug-recall
12
12
  ```
13
13
 
14
- The live command starts a fresh Ennodia MCP server and runs real harnesses. It
15
- is intentionally not part of `bun run verify`.
14
+ The live command starts a fresh Ennodia Model Context Protocol (MCP) server and
15
+ runs real harnesses. It is intentionally not part of `bun run verify`.
16
16
 
17
17
  ```sh
18
18
  bun run bench:bug-recall:live -- --fixture 001-missing-await
@@ -20,10 +20,12 @@ bun run bench:bug-recall:live -- --fixture 001-missing-await
20
20
 
21
21
  Useful flags:
22
22
 
23
- - `--fixture <id>` runs one fixture; repeat it to select several.
23
+ - `--fixture <id>` runs one fixture. Repeat it to select multiple fixtures.
24
24
  - `--harness <id>` adds a solo baseline harness in live mode. Defaults to
25
25
  `codex` and `claude-code`.
26
- - `--judge-harness <id>` and `--synthesizer-harness <id>` pin Compare roles.
26
+ - `--judge-harness <id>` and `--advisor-harness <id>` select Compare roles.
27
+ - `--synthesizer-harness <id>` is a deprecated alias for
28
+ `--advisor-harness <id>`.
27
29
  - `--timeout-ms <ms>` sets the per-run timeout for live harness calls.
28
30
  - `--out <dir>` writes results to a specific directory.
29
31
 
@@ -21,7 +21,7 @@ type CliOptions = {
21
21
  timeoutMs: number;
22
22
  outDir?: string;
23
23
  judgeHarnessId?: string;
24
- synthesizerHarnessId?: string;
24
+ advisorHarnessId?: string;
25
25
  };
26
26
 
27
27
  type McpTextContent = {
@@ -129,7 +129,7 @@ async function runLiveBenchmark(
129
129
  compare: true,
130
130
  timeoutMs: options.timeoutMs,
131
131
  judgeHarnessId: options.judgeHarnessId,
132
- synthesizerHarnessId: options.synthesizerHarnessId,
132
+ advisorHarnessId: options.advisorHarnessId,
133
133
  maxOutputChars: 16_000,
134
134
  });
135
135
  outputs.push(runToOutput(
@@ -284,8 +284,16 @@ function parseArgs(args: string[]): CliOptions {
284
284
  options.outDir = requireValue(args, ++index, arg);
285
285
  } else if (arg === "--judge-harness") {
286
286
  options.judgeHarnessId = requireValue(args, ++index, arg);
287
- } else if (arg === "--synthesizer-harness") {
288
- options.synthesizerHarnessId = requireValue(args, ++index, arg);
287
+ } else if (
288
+ arg === "--advisor-harness" || arg === "--synthesizer-harness"
289
+ ) {
290
+ const value = requireValue(args, ++index, arg);
291
+ if (options.advisorHarnessId && options.advisorHarnessId !== value) {
292
+ throw new Error(
293
+ "--advisor-harness and --synthesizer-harness must match.",
294
+ );
295
+ }
296
+ options.advisorHarnessId = value;
289
297
  } else {
290
298
  throw new Error(`Unknown option: ${arg}`);
291
299
  }
package/bin/ennodia CHANGED
@@ -1,2 +1,23 @@
1
- #!/usr/bin/env bun
2
- import "../src/cli.ts";
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from "node:child_process";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ const cliPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "src", "cli.ts");
7
+
8
+ const bunCheck = spawnSync("bun", ["--version"], { stdio: "ignore" });
9
+
10
+ if (bunCheck.error) {
11
+ process.stderr.write(
12
+ "Ennodia requires Bun (1.3.14 or newer) to run, but it wasn't found on your PATH.\n" +
13
+ "Install Bun from https://bun.sh, then try again:\n" +
14
+ " curl -fsSL https://bun.sh/install | bash\n",
15
+ );
16
+ process.exit(1);
17
+ }
18
+
19
+ const result = spawnSync("bun", ["run", cliPath, ...process.argv.slice(2)], {
20
+ stdio: "inherit",
21
+ });
22
+
23
+ process.exit(result.status ?? 1);
@@ -1 +1 @@
1
- <svg fill="currentColor" fill-rule="evenodd" height="56" viewBox="0 0 24 24" width="56" xmlns="http://www.w3.org/2000/svg" style="flex: 0 0 auto; line-height: 1;"><title>ModelContextProtocol</title><path d="M15.688 2.343a2.588 2.588 0 00-3.61 0l-9.626 9.44a.863.863 0 01-1.203 0 .823.823 0 010-1.18l9.626-9.44a4.313 4.313 0 016.016 0 4.116 4.116 0 011.204 3.54 4.3 4.3 0 013.609 1.18l.05.05a4.115 4.115 0 010 5.9l-8.706 8.537a.274.274 0 000 .393l1.788 1.754a.823.823 0 010 1.18.863.863 0 01-1.203 0l-1.788-1.753a1.92 1.92 0 010-2.754l8.706-8.538a2.47 2.47 0 000-3.54l-.05-.049a2.588 2.588 0 00-3.607-.003l-7.172 7.034-.002.002-.098.097a.863.863 0 01-1.204 0 .823.823 0 010-1.18l7.273-7.133a2.47 2.47 0 00-.003-3.537z"></path><path d="M14.485 4.703a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a4.115 4.115 0 000 5.9 4.314 4.314 0 006.016 0l7.12-6.982a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a2.588 2.588 0 01-3.61 0 2.47 2.47 0 010-3.54l7.12-6.982z"></path></svg>
1
+ <svg fill="currentColor" fill-rule="evenodd" height="56" viewBox="0 0 24 24" width="56" xmlns="http://www.w3.org/2000/svg" style="flex: 0 0 auto; line-height: 1;"><title>Model Context Protocol</title><path d="M15.688 2.343a2.588 2.588 0 00-3.61 0l-9.626 9.44a.863.863 0 01-1.203 0 .823.823 0 010-1.18l9.626-9.44a4.313 4.313 0 016.016 0 4.116 4.116 0 011.204 3.54 4.3 4.3 0 013.609 1.18l.05.05a4.115 4.115 0 010 5.9l-8.706 8.537a.274.274 0 000 .393l1.788 1.754a.823.823 0 010 1.18.863.863 0 01-1.203 0l-1.788-1.753a1.92 1.92 0 010-2.754l8.706-8.538a2.47 2.47 0 000-3.54l-.05-.049a2.588 2.588 0 00-3.607-.003l-7.172 7.034-.002.002-.098.097a.863.863 0 01-1.204 0 .823.823 0 010-1.18l7.273-7.133a2.47 2.47 0 00-.003-3.537z"></path><path d="M14.485 4.703a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a4.115 4.115 0 000 5.9 4.314 4.314 0 006.016 0l7.12-6.982a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a2.588 2.588 0 01-3.61 0 2.47 2.47 0 010-3.54l7.12-6.982z"></path></svg>
@@ -1,6 +1,6 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" width="1100" height="500" viewBox="0 0 1100 500" role="img" aria-labelledby="title desc">
2
2
  <title id="title">Ennodia orchestration pipeline</title>
3
- <desc id="desc">A code-review request is classified, routed through project rules to Claude Code and Codex CLI, compared, resolved, and returned as a final review.</desc>
3
+ <desc id="desc">Ennodia classifies a code-review request. It routes the request to Claude Code and Codex. The Judge and Result Advisor return a review.</desc>
4
4
  <defs>
5
5
  <marker id="arrow" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
6
6
  <path d="M 0 0 L 10 5 L 0 10 z" fill="#7aa7ff" />
@@ -61,7 +61,8 @@
61
61
  <g>
62
62
  <rect class="hub" x="890" y="207" width="130" height="86" rx="14" />
63
63
  <text class="label" x="955" y="242" text-anchor="middle">Compare</text>
64
- <text class="small" x="955" y="267" text-anchor="middle">judge + synth</text>
64
+ <text class="small" x="955" y="262" text-anchor="middle">Judge</text>
65
+ <text class="small" x="955" y="280" text-anchor="middle">Result Advisor</text>
65
66
  </g>
66
67
 
67
68
  <path class="line" d="M 955 293 V 342" />
@@ -70,5 +71,5 @@
70
71
  <text class="label" x="955" y="394" text-anchor="middle">Review</text>
71
72
  </g>
72
73
 
73
- <text class="small" x="550" y="454" text-anchor="middle">Every child task remains visible: status, logs, ETA, failure state, and final synthesis.</text>
74
+ <text class="small" x="550" y="454" text-anchor="middle">Every child task remains visible: status, logs, ETA, failure state, Judge findings, and recommended answer.</text>
74
75
  </svg>
@@ -7,12 +7,13 @@ General agent frameworks help developers build custom agent systems. They can
7
7
  offer roles, graphs, memory, tool routing, state, persistence, deployment
8
8
  patterns, and application-specific control.
9
9
 
10
- Ennodia is less general on purpose. It gives a primary agent a small MCP surface
11
- for asking other installed local agents for help and inspecting the result.
10
+ Ennodia is less general on purpose. Its small Model Context Protocol (MCP)
11
+ interface lets a primary agent request help from installed agent command-line
12
+ interfaces (CLIs). The primary agent can then inspect the result.
12
13
 
13
14
  ## Choose an Agent Framework When
14
15
 
15
- - You are designing the agent workflow yourself.
16
+ - You define the agent workflow.
16
17
  - You need custom roles, memory, state, routing, or persistence.
17
18
  - The agent system is part of your application or service.
18
19
  - You want code-level control over every edge in the workflow.
@@ -21,17 +22,21 @@ for asking other installed local agents for help and inspecting the result.
21
22
 
22
23
  - You do not want to build an agent system.
23
24
  - You want a local MCP tool that works with installed agent CLIs.
24
- - You want async task state, run history, failures, budget estimates, and
25
- model-led Compare.
25
+ - You want asynchronous task state, run history, failures, budget
26
+ estimates, and
27
+ Judge + Result Advisor Compare.
28
+ - You want an optional Plan Advisor to suggest a bounded team while execution
29
+ remains a separate, validated action.
26
30
  - You want the primary agent to remain in charge.
27
31
 
28
32
  ## Key Difference
29
33
 
30
- Agent frameworks are construction kits. Ennodia is an orchestration helper for
31
- an already-running agent.
34
+ Agent frameworks provide components for custom agent systems. Ennodia is an
35
+ orchestration helper for an active agent. Its Plan Advisor produces inert plan
36
+ data. It does not create a persistent autonomous team or execute the proposal.
32
37
 
33
38
  ## Common Mistake
34
39
 
35
- Do not claim Ennodia is more powerful than a framework. It is deliberately
36
- smaller. The benefit is that the user can add multi-agent review to an existing
37
- local workflow without designing an entire framework application.
40
+ Do not claim that Ennodia is more powerful than a framework. It is deliberately
41
+ smaller. A user can add multi-agent review to a current local workflow. This
42
+ does not require a complete framework application.
@@ -3,35 +3,40 @@ title: Ennodia vs AutoGen
3
3
  description: How Ennodia differs from AutoGen and programmable multi-agent application frameworks.
4
4
  ---
5
5
 
6
- [AutoGen](https://microsoft.github.io/autogen/stable/index.html) is a
7
- programming framework for building conversational single-agent and multi-agent
8
- applications, with an event-driven core for scalable multi-agent systems.
6
+ [AutoGen](https://microsoft.github.io/autogen/stable/index.html) is a programming
7
+ framework. Developers use it to create conversational single-agent and
8
+ multi-agent applications. It has an event-driven core for scalable multi-agent
9
+ systems.
9
10
 
10
- Ennodia is not a framework for authoring a new multi-agent application. It is a
11
- local MCP server that an existing agent can call.
11
+ Ennodia is not a framework for a new multi-agent application. It is a local
12
+ Model Context Protocol (MCP) server that an active agent can call.
12
13
 
13
14
  ## Choose AutoGen When
14
15
 
15
- - You want to build a multi-agent system in application code.
16
+ - You want to create a multi-agent system in application code.
16
17
  - You need programmable agent roles, event handling, message passing, and custom
17
18
  workflow control.
18
19
  - Your product needs a framework-level architecture.
19
20
 
20
21
  ## Choose Ennodia When
21
22
 
22
- - The primary workflow already happens in Codex, Claude Code, OpenCode,
23
+ - The primary workflow uses Codex, Claude Code, OpenCode,
23
24
  Antigravity, or another MCP-capable client.
24
- - You want to reuse installed local CLIs and subscriptions.
25
- - You want task traces, status, budget checks, and Compare without designing a
26
- full multi-agent runtime.
25
+ - You want to reuse installed local command-line interfaces (CLIs) and
26
+ subscriptions.
27
+ - You want task traces, status, budget checks, and Compare without a full
28
+ multi-agent runtime.
29
+ - You want a Plan Advisor to suggest explicit harness, model, and skill
30
+ assignments. Plan Advisor has no execution control.
27
31
 
28
32
  ## Key Difference
29
33
 
30
- AutoGen is for building multi-agent applications. Ennodia is for letting one
31
- agent ask other already-installed agents for help.
34
+ AutoGen helps developers create multi-agent applications. Ennodia lets one agent
35
+ request help from other installed agents. A Plan Advisor can propose a bounded
36
+ team. The proposal stays inert until the caller explicitly starts it.
32
37
 
33
38
  ## Common Mistake
34
39
 
35
- Do not compare them only by "number of agents." The important question is where
36
- the orchestration lives: inside a custom application framework, or inside a
37
- local MCP tool called by the user's existing agent.
40
+ Do not compare them only by "number of agents." The important question is the
41
+ location of the orchestration. It can be in a custom application framework or a
42
+ local MCP tool.