ennodia 0.1.1 → 0.3.0-rc.2

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 (73) hide show
  1. package/CONTRIBUTING.md +60 -36
  2. package/README.md +72 -100
  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/evidence/building-ennodia.md +66 -0
  22. package/docs/evidence/docs-drift.md +73 -0
  23. package/docs/evidence/index.md +18 -0
  24. package/docs/evidence/measurement.md +40 -0
  25. package/docs/evidence/skill-trial.md +68 -0
  26. package/docs/getting-started.md +87 -36
  27. package/docs/guides/agent-skills.md +32 -15
  28. package/docs/guides/budgets-and-limits.md +30 -20
  29. package/docs/guides/pragmatic-mode.md +85 -0
  30. package/docs/guides/recipes.md +56 -0
  31. package/docs/guides/running-better-audits.md +50 -44
  32. package/docs/guides/troubleshooting.md +48 -0
  33. package/docs/guides/understand-results.md +41 -0
  34. package/docs/index.md +27 -67
  35. package/docs/install.md +82 -40
  36. package/docs/reference/benchmarks.md +6 -4
  37. package/docs/reference/controlled-english.md +129 -0
  38. package/docs/reference/ennodia-io.md +56 -27
  39. package/docs/reference/mcp-tools.md +301 -91
  40. package/docs/reference/supported-harnesses.md +49 -10
  41. package/docs/roadmap.md +25 -0
  42. package/examples/docs-drift/README.md +8 -0
  43. package/examples/docs-drift/archive/migration.md +4 -0
  44. package/examples/docs-drift/check.ts +7 -0
  45. package/examples/docs-drift/config.ts +8 -0
  46. package/examples/docs-drift/demo.ts +54 -0
  47. package/examples/docs-drift/recorded-run.json +16 -0
  48. package/examples/skill-trial/README.md +8 -0
  49. package/examples/skill-trial/check.ts +15 -0
  50. package/examples/skill-trial/contract.md +7 -0
  51. package/examples/skill-trial/recorded-trial.json +42 -0
  52. package/examples/skill-trial/retry.ts +4 -0
  53. package/package.json +10 -5
  54. package/skills/pragmatic/SKILL.md +23 -0
  55. package/src/advisor.ts +689 -0
  56. package/src/budget.ts +37 -14
  57. package/src/cli.ts +4 -1
  58. package/src/compare.ts +261 -64
  59. package/src/compositional.ts +28 -4
  60. package/src/core.ts +587 -50
  61. package/src/diagnosis.ts +17 -3
  62. package/src/harnesses.ts +121 -31
  63. package/src/history.ts +4 -1
  64. package/src/index.ts +39 -0
  65. package/src/plan-advice.ts +604 -0
  66. package/src/planner.ts +24 -1
  67. package/src/pragmatic.ts +59 -0
  68. package/src/process.ts +18 -0
  69. package/src/runs.ts +93 -10
  70. package/src/server.ts +329 -59
  71. package/src/skills.ts +131 -11
  72. package/src/tasks.ts +297 -39
  73. 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,140 +1,112 @@
1
- <div align="center">
2
-
3
- <a href="https://ennodia.cherninlab.com">
4
1
  <picture>
5
2
  <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
3
  <img alt="Ennodia" src="docs/assets/logo.svg" width="235" height="50">
8
4
  </picture>
9
- </a>
10
5
 
11
- <p><strong>MCP server for multi-agent review with Compare and traceable receipts</strong></p>
6
+ **Keep your agent. Get another way forward.**
12
7
 
13
- <p>
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" />
16
- <a href="https://smithery.ai/servers/cherninlab/ennodia"><img alt="Smithery: Ennodia" src="https://img.shields.io/badge/Smithery-Ennodia-FF5601"></a>
17
- </p>
8
+ When a task stalls, Ennodia lets your primary artificial intelligence (AI) agent try another agent, model, or skill.
9
+ The findings come back to the same conversation.
10
+ You keep your familiar interface and decide what to try next.
18
11
 
19
- <p align="center">
20
- <img alt="Ennodia terminal comparing three completed AI reviews" src="docs/assets/terminal.png" width="600">
21
- </p>
12
+ ```text
13
+ Use Ennodia MCP to get a second opinion on this bug.
14
+ Give one available agent the failing test and our attempted fixes.
15
+ Request a different explanation and a way to test it.
16
+ Bring the findings back here.
17
+ ```
22
18
 
23
- </div>
19
+ ## When it helps
24
20
 
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.
21
+ - A task is stuck and you want to check another approach.
22
+ - A skill looks useful, but you want to try it in a separate task first.
23
+ - Two answers disagree and you need to identify the next check.
24
+ - An unsuccessful attempt can help you avoid repeating the same approach under the same conditions.
29
25
 
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.
26
+ Your main agent checks the findings and integrates useful work.
27
+ Additional attempts consume time and resources. General time or token savings have not been established.
35
28
 
36
29
  ## Install
37
30
 
38
- Send this to your primary agent and let it handle setup:
31
+ Send this address to your primary agent:
39
32
 
40
33
  ```text
41
34
  try-ennodia.cherninlab.com
42
35
  ```
43
- Or run it directly as a stdio MCP server from npm:
44
36
 
45
- ```sh
46
- npx -y ennodia
37
+ For manual setup, add this Model Context Protocol (MCP) server to your client:
38
+
39
+ ```json
40
+ {
41
+ "mcpServers": {
42
+ "ennodia": {
43
+ "command": "npx",
44
+ "args": ["-y", "ennodia"]
45
+ }
46
+ }
47
+ }
47
48
  ```
48
49
 
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.
53
-
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
57
- [Quickstart](https://ennodia.cherninlab.com/docs/getting-started/).
50
+ Requirements: Bun `1.3.14` or newer, a compatible MCP client, and a supported agent with working provider access.
51
+ `npx` downloads Ennodia. Bun runs it. You can also use `bunx ennodia`.
58
52
 
59
- ## What Ennodia does
53
+ [Get your first result](https://ennodia.cherninlab.com/docs/getting-started/) ·
54
+ [Installation for agents](https://ennodia.cherninlab.com/docs/install/)
60
55
 
61
- - Discovers available local AI tools
62
- - Plans a route with a caller-provided category or keyword fallback
63
- - Estimates preflight input tokens and enforces local caps on that estimate
64
- - Starts and monitors child tasks
65
- - Shows status, timing, logs, and failures
66
- - Cancels tasks and runs explicitly
67
- - Compares multiple completed outputs
68
- - Synthesizes one answer from the comparison
56
+ ## Use your installed agents and skills
69
57
 
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.
58
+ Supported agents: Codex CLI, Claude Code, OpenCode, Kilo Code, Kiro CLI, Cline, Hermes Agent, and Antigravity.
59
+ Model availability and tool permissions depend on the installed agent and its provider configuration.
60
+ Discovery finds executable commands. It does not verify authentication or model access.
61
+ Codex workers use a read-only sandbox by default.
74
62
 
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.
63
+ Ennodia discovers native Agent Skills and can request them for specific tasks.
64
+ A separate task keeps the trial outside the main conversation.
65
+ Native agents can also select unrequested skills from their own environment.
77
66
 
78
- ## Ennodia IO
67
+ [Recipes](https://ennodia.cherninlab.com/docs/guides/recipes/) ·
68
+ [Using skills](https://ennodia.cherninlab.com/docs/guides/agent-skills/) ·
69
+ [Understand results](https://ennodia.cherninlab.com/docs/guides/understand-results/)
79
70
 
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:
71
+ ## See it in practice
81
72
 
82
- ```sh
83
- npx -y @cherninlab/ennodia-io
84
- ```
85
-
86
- See [Ennodia IO](https://ennodia.cherninlab.com/docs/reference/ennodia-io/) for
87
- supported fields, auth behavior, CORS posture, and current limits.
73
+ - [Building Ennodia with Ennodia](https://ennodia.cherninlab.com/docs/evidence/building-ennodia/): a worker patch, a failed login, and primary-agent corrections.
74
+ - [Find stale documentation](https://ennodia.cherninlab.com/docs/evidence/docs-drift/): a small review with known answers.
75
+ - [Try a skill separately](https://ennodia.cherninlab.com/docs/evidence/skill-trial/): two attempts against the same contract.
88
76
 
89
- ## Supported harnesses
77
+ The existing saved-answer benchmark is a regression check, not a live speed or cost comparison.
78
+ [Measurement plan](https://ennodia.cherninlab.com/docs/evidence/measurement/)
90
79
 
91
- - Codex CLI
92
- - Claude Code
93
- - OpenCode
94
- - Kilo Code
95
- - Kiro CLI
96
- - Cline CLI
97
- - Hermes Agent
98
- - Antigravity
80
+ ## Data and limits
99
81
 
100
- Adapters stay thin — shared routing, tracing, task state, recovery, and
101
- Compare logic live in core modules.
82
+ Ennodia runs locally without an Ennodia-hosted service.
83
+ Selected agents can send material to their configured model providers.
84
+ Terminal run history is stored locally and can be disabled with `ENNODIA_HISTORY=0`.
102
85
 
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.
86
+ Ennodia can limit child tasks and estimated input tokens.
87
+ Those estimates exclude internal harness work and are not provider bills.
88
+ Automatic agent updates and recommendations learned from past results remain future work.
107
89
 
108
- ## Documentation
90
+ [Data governance](https://ennodia.cherninlab.com/docs/concepts/data-governance/) ·
91
+ [Budgets](https://ennodia.cherninlab.com/docs/guides/budgets-and-limits/) ·
92
+ [Roadmap](https://ennodia.cherninlab.com/docs/roadmap/)
109
93
 
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
94
+ ## Technical reference and contribution
119
95
 
120
- ## Benchmarks
96
+ The main entrypoint is `ennodia_run`. The optional Plan Advisor proposes explicit tasks before execution.
97
+ Compare examines completed answers and returns advice with its evidence and limitations.
121
98
 
122
- The current benchmark is `multi-model-bug-recall`: small TypeScript review
123
- fixtures scored against committed bug oracles. Run the deterministic suite with:
99
+ [MCP tools](https://ennodia.cherninlab.com/docs/reference/mcp-tools/) ·
100
+ [Experimental Ennodia IO](https://ennodia.cherninlab.com/docs/reference/ennodia-io/) ·
101
+ [Contributing](CONTRIBUTING.md) · [MIT license](LICENSE)
124
102
 
125
103
  ```sh
126
- bun run bench:bug-recall
104
+ bun install
105
+ bun run verify
127
106
  ```
128
107
 
129
- Live harness runs are available through `bun run bench:bug-recall:live` and are
130
- kept out of `bun run verify`.
131
-
132
- The current dated fixture snapshot is published in
133
- [Benchmarks](https://ennodia.cherninlab.com/docs/reference/benchmarks/): 4
134
- cases, with `ennodia-parallel-compare` at 100% recall and 100% precision.
135
-
136
- ## Contributing
108
+ ### Experimental Pragmatic mode
137
109
 
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.
110
+ In `ennodia@next`, delegate bounded investigation or patch proposals to an explicitly selected model.
111
+ [Pragmatic mode](docs/guides/pragmatic-mode.md) keeps bulky evidence outside the main conversation and returns findings for verification.
112
+ Savings are not yet validated.
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.