ennodia 0.3.0 → 0.4.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 (83) hide show
  1. package/CONTRIBUTING.md +2 -19
  2. package/README.md +4 -6
  3. package/docs/comparisons/agent-frameworks.md +5 -5
  4. package/docs/comparisons/autogen.md +4 -4
  5. package/docs/comparisons/chathub.md +4 -4
  6. package/docs/comparisons/index.md +4 -4
  7. package/docs/comparisons/langgraph.md +4 -4
  8. package/docs/comparisons/mixture-of-agents.md +5 -5
  9. package/docs/comparisons/model-merging.md +5 -5
  10. package/docs/comparisons/openrouter.md +4 -4
  11. package/docs/concepts/compositional-audits.md +8 -6
  12. package/docs/concepts/data-governance.md +5 -9
  13. package/docs/concepts/how-ennodia-works.md +2 -2
  14. package/docs/concepts/interfaces-and-core.md +1 -1
  15. package/docs/concepts/second-opinions.md +5 -5
  16. package/docs/evidence/index.md +6 -13
  17. package/docs/evidence/measurement.md +6 -5
  18. package/docs/getting-started.md +9 -6
  19. package/docs/guides/agent-skills.md +6 -5
  20. package/docs/guides/budgets-and-limits.md +8 -6
  21. package/docs/guides/pragmatic-mode.md +2 -0
  22. package/docs/guides/recipes.md +1 -4
  23. package/docs/guides/running-better-audits.md +7 -7
  24. package/docs/guides/troubleshooting.md +0 -2
  25. package/docs/guides/understand-results.md +0 -2
  26. package/docs/index.md +2 -4
  27. package/docs/install.md +11 -9
  28. package/docs/reference/controlled-english.md +1 -3
  29. package/docs/reference/ennodia-io.md +7 -7
  30. package/docs/reference/mcp-tools.md +69 -15
  31. package/docs/reference/supported-harnesses.md +9 -4
  32. package/docs/roadmap.md +0 -2
  33. package/package.json +3 -10
  34. package/skills/pragmatic/SKILL.md +2 -0
  35. package/src/cli.ts +31 -15
  36. package/src/compare.ts +37 -1
  37. package/src/core.ts +2 -4
  38. package/src/diagnosis.ts +48 -1
  39. package/src/harnesses.ts +54 -25
  40. package/src/index.ts +4 -0
  41. package/src/runs.ts +17 -8
  42. package/src/server.ts +55 -2
  43. package/src/tasks.ts +145 -37
  44. package/src/version.ts +1 -1
  45. package/bench/README.md +0 -34
  46. package/bench/bug-recall/run.ts +0 -339
  47. package/bench/bug-recall/scorer.ts +0 -424
  48. package/bench/fixtures/bug-recall/001-missing-await/input.ts +0 -33
  49. package/bench/fixtures/bug-recall/001-missing-await/oracle.json +0 -28
  50. package/bench/fixtures/bug-recall/001-missing-await/responses/claude-code-solo.md +0 -1
  51. package/bench/fixtures/bug-recall/001-missing-await/responses/codex-solo.md +0 -1
  52. package/bench/fixtures/bug-recall/001-missing-await/responses/ennodia-parallel-compare.md +0 -1
  53. package/bench/fixtures/bug-recall/002-timeout-drain/input.ts +0 -40
  54. package/bench/fixtures/bug-recall/002-timeout-drain/oracle.json +0 -28
  55. package/bench/fixtures/bug-recall/002-timeout-drain/responses/claude-code-solo.md +0 -1
  56. package/bench/fixtures/bug-recall/002-timeout-drain/responses/codex-solo.md +0 -1
  57. package/bench/fixtures/bug-recall/002-timeout-drain/responses/ennodia-parallel-compare.md +0 -1
  58. package/bench/fixtures/bug-recall/003-schema-contract/input.ts +0 -22
  59. package/bench/fixtures/bug-recall/003-schema-contract/oracle.json +0 -28
  60. package/bench/fixtures/bug-recall/003-schema-contract/responses/claude-code-solo.md +0 -1
  61. package/bench/fixtures/bug-recall/003-schema-contract/responses/codex-solo.md +0 -1
  62. package/bench/fixtures/bug-recall/003-schema-contract/responses/ennodia-parallel-compare.md +0 -1
  63. package/bench/fixtures/bug-recall/004-cancel-propagation/input.ts +0 -28
  64. package/bench/fixtures/bug-recall/004-cancel-propagation/oracle.json +0 -28
  65. package/bench/fixtures/bug-recall/004-cancel-propagation/responses/claude-code-solo.md +0 -1
  66. package/bench/fixtures/bug-recall/004-cancel-propagation/responses/codex-solo.md +0 -1
  67. package/bench/fixtures/bug-recall/004-cancel-propagation/responses/ennodia-parallel-compare.md +0 -1
  68. package/bench/results/.gitkeep +0 -1
  69. package/docs/evidence/building-ennodia.md +0 -66
  70. package/docs/evidence/docs-drift.md +0 -73
  71. package/docs/evidence/skill-trial.md +0 -68
  72. package/docs/reference/benchmarks.md +0 -64
  73. package/examples/docs-drift/README.md +0 -8
  74. package/examples/docs-drift/archive/migration.md +0 -4
  75. package/examples/docs-drift/check.ts +0 -7
  76. package/examples/docs-drift/config.ts +0 -8
  77. package/examples/docs-drift/demo.ts +0 -54
  78. package/examples/docs-drift/recorded-run.json +0 -16
  79. package/examples/skill-trial/README.md +0 -8
  80. package/examples/skill-trial/check.ts +0 -15
  81. package/examples/skill-trial/contract.md +0 -7
  82. package/examples/skill-trial/recorded-trial.json +0 -42
  83. package/examples/skill-trial/retry.ts +0 -4
@@ -3,6 +3,8 @@ title: Agent Skills
3
3
  description: Install bundled Ennodia skills in native harness locations and tell child agents to use them during a run.
4
4
  ---
5
5
 
6
+ Listing skills is in the core tool set. Installing them needs the [full tool set](/docs/reference/mcp-tools/#tool-sets).
7
+
6
8
  A new Agent Skill can help a task, add irrelevant advice, or make no difference.
7
9
  Try the skill in a separate Ennodia task and bring useful findings back to your main conversation.
8
10
 
@@ -11,9 +13,8 @@ Ennodia discovers that folder and requests the selected skill by name.
11
13
  It does not inline the full instructions into each delegated prompt.
12
14
 
13
15
  The primary agent can keep useful partial findings without adopting every recommendation.
14
- The [skill trial example](/docs/evidence/skill-trial/) shows a controlled small exercise.
15
16
 
16
- ## List Available Skills
17
+ ## List available skills
17
18
 
18
19
  ```json
19
20
  {
@@ -27,7 +28,7 @@ The [skill trial example](/docs/evidence/skill-trial/) shows a controlled small
27
28
  The response includes bundled skills, installed native skills, searched
28
29
  directories, and load warnings.
29
30
 
30
- ## Preview Installation
31
+ ## Preview installation
31
32
 
32
33
  Bundled skills use dry-run installation by default. The caller can inspect the
33
34
  planned writes before any change:
@@ -47,7 +48,7 @@ planned writes before any change:
47
48
 
48
49
  Review the planned paths. If they are correct, repeat with `dryRun: false`.
49
50
 
50
- ## Use a Skill in a Run
51
+ ## Use a skill in a run
51
52
 
52
53
  ```json
53
54
  {
@@ -81,7 +82,7 @@ Bundled skills include:
81
82
  | `release-readiness` | Public release candidate checks. |
82
83
  | `benchmark-critic` | Benchmark credibility and reproducibility review. |
83
84
 
84
- ## Native Install Locations
85
+ ## Native install locations
85
86
 
86
87
  | Harness | Project path | User path |
87
88
  | --- | --- | --- |
@@ -1,8 +1,10 @@
1
1
  ---
2
- title: Budgets and Limits
2
+ title: Budgets and limits
3
3
  description: How Ennodia estimates preflight input-token budgets and enforces local run limits before child agents start.
4
4
  ---
5
5
 
6
+ The tools on this page are in the [full tool set](/docs/reference/mcp-tools/#tool-sets). Add `--tools all` to the Ennodia server arguments to load them.
7
+
6
8
  Ennodia can estimate the input-token budget before a costly run starts. The
7
9
  estimate is a budget limit check, not a provider invoice. Child-task estimates
8
10
  are lower bounds.
@@ -13,7 +15,7 @@ not visible before the run.
13
15
  Use it before parallel work or long reviews. Also use it when the user limits
14
16
  cost, subscription use, or child-task count.
15
17
 
16
- ## What the Estimate Includes
18
+ ## What the estimate includes
17
19
 
18
20
  `ennodia_estimate_budget` reports:
19
21
 
@@ -29,7 +31,7 @@ cost, subscription use, or child-task count.
29
31
  The estimate does not claim to know provider billing, output tokens, tool-call
30
32
  cost, cache behavior, harness-internal context, or private subscription quota.
31
33
 
32
- ## Estimate Before a Run
34
+ ## Estimate before a run
33
35
 
34
36
  ```json
35
37
  {
@@ -54,7 +56,7 @@ If the estimate is too high, use one or more of these changes:
54
56
  - Decrease `maxOutputChars`.
55
57
  - Use a narrower first pass.
56
58
 
57
- ## Enforce Limits on a Run
59
+ ## Enforce limits on a run
58
60
 
59
61
  The same budget object can be passed to `ennodia_run`:
60
62
 
@@ -78,7 +80,7 @@ Ennodia checks these local limits before child tasks start. The run fails early
78
80
  if estimated input tokens or the child-task count exceed a cap. Ennodia does
79
81
  not start the excess model work.
80
82
 
81
- ## Subscription Limits
83
+ ## Subscription limits
82
84
 
83
85
  Subscription quota checks are conservative by design. Ennodia uses only
84
86
  supported local command-line interface (CLI) and application programming
@@ -93,7 +95,7 @@ supported local surface exposes a reliable account limit. An older fail-closed
93
95
  quota gate has been retired until at least one current harness exposes a real
94
96
  supported quota surface.
95
97
 
96
- ## Practical Defaults
98
+ ## Practical defaults
97
99
 
98
100
  - Start with one agent and a narrow task. Add attempts when they address a specific uncertainty.
99
101
  - Use `maxOutputChars` to keep Compare input bounded.
@@ -3,6 +3,8 @@ title: Pragmatic mode
3
3
  description: Organize independent model attempts and compare evidence against complete acceptance criteria.
4
4
  ---
5
5
 
6
+ The tools on this page are in the [full tool set](/docs/reference/mcp-tools/#tool-sets). Add `--tools all` to the Ennodia server arguments to load them.
7
+
6
8
  Pragmatic mode is an opt-in beta in `0.3.0`, available through `ennodia`.
7
9
  It helps your main agent delegate bounded work without loading entire logs or files into the main conversation.
8
10
  It does not guarantee lower costs or select the cheapest model automatically.
@@ -3,9 +3,7 @@ title: Recipes
3
3
  description: Three small ways to get useful help from Ennodia.
4
4
  ---
5
5
 
6
- # Start with one useful attempt
7
-
8
- A focused request is easier to check and integrate.
6
+ Start with one useful attempt. A focused request is easier to check and integrate.
9
7
  Give your primary agent the relevant files, attempted fixes, and the result you need.
10
8
 
11
9
  ## A task is stuck
@@ -30,7 +28,6 @@ Show which skill and model were requested and what remains unverified.
30
28
 
31
29
  Check native installation with your agent before the task starts.
32
30
  A requested skill is not proof that the worker loaded it.
33
- Use the [small skill trial](/docs/evidence/skill-trial/) to practice comparing two attempts.
34
31
 
35
32
  ## Two answers disagree
36
33
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- title: Better Audits
2
+ title: Better audits
3
3
  description: How Ennodia audits can detect product problems that users see, not only consistency issues.
4
4
  ---
5
5
 
@@ -11,7 +11,7 @@ This pass can find broken links, mismatched documentation, release metadata erro
11
11
  errors, and copy drift. It does not prove that the page is clear to a first-time
12
12
  visitor.
13
13
 
14
- ## Quick Recipe
14
+ ## Quick recipe
15
15
 
16
16
  Use a source-grounded audit for answers that depend on documentation,
17
17
  standards, package behavior, or another product's public surface:
@@ -31,7 +31,7 @@ standards, package behavior, or another product's public surface:
31
31
  Install the skill first if the harness does not have it. See
32
32
  [Agent Skills](/docs/guides/agent-skills/).
33
33
 
34
- ## Pick the Audit Mode
34
+ ## Pick the audit mode
35
35
 
36
36
  Name the failure mode you want reviewers to catch.
37
37
 
@@ -50,7 +50,7 @@ For a large review, split the work into focused slices. Do not send the entire
50
50
  prompt to each reviewer. See
51
51
  [Compositional Audits](/docs/concepts/compositional-audits/).
52
52
 
53
- ## Landing Page Rubric
53
+ ## Landing page rubric
54
54
 
55
55
  For landing pages, require each reviewer to answer these questions:
56
56
 
@@ -64,7 +64,7 @@ For landing pages, require each reviewer to answer these questions:
64
64
  For Ennodia, use `mode: "parallel"` and `compare: true` for this type of review.
65
65
  A single source-only answer is not sufficient for product pages.
66
66
 
67
- ## Include Rendered Evidence
67
+ ## Include rendered evidence
68
68
 
69
69
  Source-only review misses visual problems. Before an Ennodia website review,
70
70
  include desktop and mobile screenshots. You can also use a harness with browser
@@ -79,7 +79,7 @@ Then inspect the child outputs for access errors.
79
79
  If a harness cannot read the files, put them in an accessible location and run
80
80
  the task again. Do not treat that failure as a normal design review.
81
81
 
82
- ## Ground Standards in Sources
82
+ ## Ground standards in sources
83
83
 
84
84
  Include primary sources when an audit depends on an external standard, registry
85
85
  convention, or product behavior. Require reviewers to separate facts from
@@ -99,7 +99,7 @@ The bundled `source-grounded-audit` skill supports this case. Install it in the
99
99
  harnesses that perform standards-sensitive audits. Then tell Ennodia to use the
100
100
  skill when the answer depends on external documentation.
101
101
 
102
- ## Good Prompt Shape
102
+ ## Good prompt shape
103
103
 
104
104
  ```text
105
105
  Audit this landing page as a first-time visitor, not as a code consistency
@@ -3,8 +3,6 @@ title: Troubleshooting
3
3
  description: Resolve failed starts without confusing configuration errors with model quality.
4
4
  ---
5
5
 
6
- # When an attempt cannot finish
7
-
8
6
  Start with the task’s failure reason and captured output.
9
7
  Use `ennodia_get_task` for details and `ennodia_list_harnesses` to inspect supported commands.
10
8
 
@@ -3,8 +3,6 @@ title: Understand results
3
3
  description: Distinguish useful findings, disagreement, missing evidence, and failed execution.
4
4
  ---
5
5
 
6
- # Understand the result
7
-
8
6
  Process completion is one signal. A useful answer also needs evidence that fits your task.
9
7
 
10
8
  | Result | Meaning | Next step |
package/docs/index.md CHANGED
@@ -3,8 +3,6 @@ title: What is Ennodia?
3
3
  description: Try other agents, models, and skills while staying in your familiar conversation.
4
4
  ---
5
5
 
6
- # Keep your agent. Get another way forward.
7
-
8
6
  Ennodia lets your primary artificial intelligence (AI) agent try another agent, model, or skill on a focused task.
9
7
  The findings return to your existing conversation.
10
8
 
@@ -17,7 +15,7 @@ Even an unsuccessful attempt can show which approach was tested under the record
17
15
  - [Get your first result](/docs/getting-started/).
18
16
  - [Choose a recipe](/docs/guides/recipes/).
19
17
  - [Understand the result](/docs/guides/understand-results/).
20
- - [Read a development case](/docs/evidence/building-ennodia/).
18
+ - [Read a recorded run](/articles/can-gemini-hear-this-file/).
21
19
 
22
20
  ## Your existing tools
23
21
 
@@ -33,7 +31,7 @@ A native agent can also choose unrequested skills from its environment.
33
31
  - [Agent skills](/docs/guides/agent-skills/)
34
32
  - [Troubleshooting](/docs/guides/troubleshooting/)
35
33
  - [Data movement and history](/docs/concepts/data-governance/)
36
- - [Examples and evidence](/docs/evidence/)
34
+ - [Evidence](/docs/evidence/)
37
35
  - [Roadmap](/docs/roadmap/)
38
36
  - [Technical reference](/docs/reference/mcp-tools/)
39
37
 
package/docs/install.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- title: Installation for Agents
2
+ title: Installation for agents
3
3
  description: A copy-paste installation page for agents that install Ennodia in Codex, Claude Code, OpenCode, Antigravity, and other Model Context Protocol (MCP) clients.
4
4
  ---
5
5
 
@@ -7,7 +7,7 @@ This page gives setup instructions to the user's agent.
7
7
  Install Ennodia as a local Model Context Protocol (MCP) server.
8
8
  Then connect it to the user's preferred compatible client.
9
9
 
10
- ## Copy-Paste Prompt
10
+ ## Copy-Paste prompt
11
11
 
12
12
  ```text
13
13
  try-ennodia.cherninlab.com
@@ -16,7 +16,7 @@ try-ennodia.cherninlab.com
16
16
  The user can send this address in a new or existing agent conversation.
17
17
  The agent handles the setup steps below.
18
18
 
19
- ## Check the Environment
19
+ ## Check the environment
20
20
 
21
21
  1. Identify the user's client and the machine where Ennodia will run.
22
22
  2. Check that the client can launch a local standard input/output (stdio) MCP server.
@@ -31,7 +31,7 @@ If the current client cannot launch a local MCP server, explain the missing capa
31
31
  Use a compatible local client for Ennodia.
32
32
  See [Supported Harnesses](/docs/reference/supported-harnesses/) for the worker agents Ennodia can call.
33
33
 
34
- ## Install Command
34
+ ## Install command
35
35
 
36
36
  Use the npm package for normal MCP client installation:
37
37
 
@@ -42,7 +42,7 @@ npx -y ennodia
42
42
  Ennodia requires Bun `1.3.14` or newer. `npx` downloads Ennodia. Bun runs it.
43
43
  If the client supports Bun directly, use `bunx ennodia`.
44
44
 
45
- ## MCP Configuration
45
+ ## MCP configuration
46
46
 
47
47
  Add this server to the user's MCP client configuration:
48
48
 
@@ -70,12 +70,14 @@ For a local Ennodia checkout, use:
70
70
  }
71
71
  ```
72
72
 
73
+ Ennodia loads six core tools by default. For Plan Advisor, compositional slices, raw tasks, and skill installation, add `"--tools", "all"` to `args`. See [tool sets](/docs/reference/mcp-tools/#tool-sets).
74
+
73
75
  The configuration above shows the server command and arguments.
74
76
  Adapt its format to the client's documented configuration method.
75
77
  Reload the tools or restart the client only when its setup instructions require this step.
76
78
  Tell the user which step is needed before trying to call Ennodia.
77
79
 
78
- ## Get One Useful Result
80
+ ## Get one useful result
79
81
 
80
82
  After the client exposes Ennodia's tools, start with one small task:
81
83
 
@@ -98,7 +100,7 @@ The first run does not require separate planning, budget estimation, or Compare
98
100
  These tools remain available for larger tasks.
99
101
  See [MCP Tools](/docs/reference/mcp-tools/) for exact parameters and identifiers (IDs).
100
102
 
101
- ## Installed Components
103
+ ## Installed components
102
104
 
103
105
  Ennodia is a local MCP server. It lets the user's main agent request help from
104
106
  other installed agent CLI programs during the same task.
@@ -123,7 +125,7 @@ answer.
123
125
  Tell the user a real run can take minutes. Compare adds two serial model passes
124
126
  after the selected child agents finish.
125
127
 
126
- ## Example Requests
128
+ ## Example requests
127
129
 
128
130
  Use Ennodia when the user permits more model work to get a better answer than
129
131
  one agent usually gives.
@@ -148,7 +150,7 @@ Compare the results before you recommend the final documentation edit.
148
150
  Compare is model-led. The user does not normally need to judge the parallel
149
151
  answers. The trace remains available for inspection.
150
152
 
151
- ## Optional Next Steps
153
+ ## Optional next steps
152
154
 
153
155
  - Use [Budgets and Limits](/docs/guides/budgets-and-limits/) before costly
154
156
  parallel runs.
@@ -3,15 +3,13 @@ title: Controlled English
3
3
  description: Ennodia terminology and writing rules for ASD-STE100 Issue 9.
4
4
  ---
5
5
 
6
- # Controlled English
7
-
8
6
  Ennodia documentation uses ASD-STE100 Issue 9 as its writing standard.
9
7
  This policy applies to the README, documentation, website text, and visible asset text.
10
8
 
11
9
  Commands, API fields, status values, model IDs, and quoted interface text are data.
12
10
  Keep this data exact, even when its text does not use controlled English.
13
11
 
14
- ## Writing Rules
12
+ ## Writing rules
15
13
 
16
14
  - Use American English.
17
15
  - Use active voice when the agent is known.
@@ -57,7 +57,7 @@ Environment variables:
57
57
  | `ENNODIA_IO_MAX_REQUEST_BODY_SIZE` | Default request body byte cap. |
58
58
  | `ENNODIA_IO_MAX_CONCURRENT_CHAT_COMPLETIONS` | Default in-flight chat completion cap. |
59
59
 
60
- ## Security and Browser Access
60
+ ## Security and browser access
61
61
 
62
62
  IO binds to loopback by default and refuses non-loopback hosts unless an API key
63
63
  is configured. Bearer tokens are compared with a timing-safe comparison.
@@ -94,7 +94,7 @@ boundary.
94
94
  | `GET /v1/models` | Supported | Returns local virtual model IDs for compatible clients. |
95
95
  | `POST /v1/chat/completions` | Supported subset | Non-streaming text messages only. Requires a JSON media type. |
96
96
 
97
- ## Provider Options
97
+ ## Provider options
98
98
 
99
99
  Use provider options when building a settings screen:
100
100
 
@@ -135,7 +135,7 @@ Option statuses:
135
135
 
136
136
  Add `?includeUnavailable=false` to return only ready options.
137
137
 
138
- ## Virtual Models
138
+ ## Virtual models
139
139
 
140
140
  `GET /v1/models` returns local virtual models for OpenAI-compatible clients:
141
141
 
@@ -148,7 +148,7 @@ Add `?includeUnavailable=false` to return only ready options.
148
148
  Older aliases `ennodia-auto`, `ennodia/auto`, and `ennodia/compare` are accepted
149
149
  for compatibility. Prefer `local/*` IDs in new app integrations.
150
150
 
151
- ## Chat Completions
151
+ ## Chat completions
152
152
 
153
153
  Minimal request:
154
154
 
@@ -234,7 +234,7 @@ HTTP error response:
234
234
  - timeout, disappeared run, or start failure -> `502 ennodia_run_error`
235
235
  - failed run or run with `cancelled` status -> `502 ennodia_run_failed` plus run metadata
236
236
 
237
- ## Library Use
237
+ ## Library use
238
238
 
239
239
  Apps can import the same primitives without running the HTTP server:
240
240
 
@@ -249,7 +249,7 @@ const providerOptions = await listAppProviderOptions(core);
249
249
  The app stays in control of its settings UI, labels, persistence, and consent
250
250
  flow. Ennodia supplies local discovery and execution primitives.
251
251
 
252
- ## Smoke Test
252
+ ## Smoke test
253
253
 
254
254
  From a checkout:
255
255
 
@@ -260,7 +260,7 @@ bun run io:smoke
260
260
  The smoke test starts a local IO server and checks `/health`,
261
261
  `/v1/provider-options`, and `/v1/models` without launching child agents.
262
262
 
263
- ## Not Implemented
263
+ ## Not implemented
264
264
 
265
265
  IO deliberately rejects or omits:
266
266
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- title: Model Context Protocol (MCP) Tools
2
+ title: Model Context Protocol (MCP) tools
3
3
  description: The public Model Context Protocol (MCP) tool surface exposed by Ennodia.
4
4
  ---
5
5
 
@@ -8,20 +8,58 @@ This page describes the tools exposed by the Ennodia Model Context Protocol
8
8
  orchestration and returns a run ID. Use `ennodia_get_run` to poll status,
9
9
  events, child task IDs, Judge + Result Advisor state, and the final answer.
10
10
 
11
- ## Common Workflows
11
+ ## Tool sets
12
12
 
13
- | Goal | Tool sequence |
14
- | --- | --- |
15
- | Check local setup | `ennodia_list_harnesses` |
16
- | Preview route and cost | `ennodia_estimate_budget` |
17
- | Preview compositional shard cost | `ennodia_estimate_compositional_budget` |
18
- | Request a tailored team, inspect it, then launch it | `ennodia_start_plan_advice` -> `ennodia_get_plan_advice` -> `ennodia_start_advised_plan` |
19
- | Start a visible end-to-end run | `ennodia_run` -> `ennodia_get_run` |
20
- | Start focused review shards | `ennodia_start_compositional` -> `ennodia_get_compositional_status` |
21
- | Debug raw child tasks | `ennodia_start` -> `ennodia_get_task` |
22
- | Judge completed outputs and advise on the result | `ennodia_start_compare` -> `ennodia_get_compare` |
23
- | Install bundled skills | `ennodia_list_skills` -> `ennodia_install_skills` |
24
- | Inspect terminal receipts after restart | `ennodia_history` |
13
+ An agent loads every tool definition into each session where Ennodia is configured, even when the session never calls Ennodia.
14
+ By default, Ennodia loads six core tools, about 10,000 characters of definitions.
15
+ They cover handing work to one agent or a team, Compare, waiting, cancelling, and run history.
16
+
17
+ The full set adds 20 tools for raw tasks, compositional slices, Plan Advisor, budget estimates, separate Compare calls, and skill installation.
18
+ It loads about 46,000 characters of definitions.
19
+ Set `ENNODIA_TOOLS=all` in the server's environment, or add `--tools all` to its arguments:
20
+
21
+ ```json
22
+ {
23
+ "mcpServers": {
24
+ "ennodia": {
25
+ "command": "npx",
26
+ "args": ["-y", "ennodia", "--tools", "all"]
27
+ }
28
+ }
29
+ }
30
+ ```
31
+
32
+ An unknown `--tools` value stops the server with an error. An unknown `ENNODIA_TOOLS` value prints a warning and loads the core set.
33
+
34
+ ### Approvals
35
+
36
+ Tools that only read declare the MCP `readOnlyHint` annotation. Clients such as Codex run them without an approval prompt, so polling a run never waits for approval.
37
+ Tools that start agents declare `openWorldHint`, because their workers call model providers. Their workers can change files when the caller allows it, so they claim neither read-only nor harmless.
38
+
39
+ Headless Codex, such as `codex exec`, never asks for approval. It refuses any tool that needs one.
40
+ To let it start Ennodia runs, add this to `~/.codex/config.toml`:
41
+
42
+ ```toml
43
+ [mcp_servers.ennodia.tools.ennodia_run]
44
+ approval_mode = "approve"
45
+ ```
46
+
47
+ This setting approves Ennodia runs only. Codex's sandbox and its other tools keep their settings.
48
+
49
+ ## Common workflows
50
+
51
+ | Goal | Tool sequence | Tool set |
52
+ | --- | --- | --- |
53
+ | Check local setup | `ennodia_list_harnesses` | core |
54
+ | Start a visible end-to-end run | `ennodia_run` -> `ennodia_get_run` | core |
55
+ | Inspect terminal receipts after restart | `ennodia_history` | core |
56
+ | Preview route and cost | `ennodia_estimate_budget` | full |
57
+ | Preview compositional shard cost | `ennodia_estimate_compositional_budget` | full |
58
+ | Request a tailored team, inspect it, then launch it | `ennodia_start_plan_advice` -> `ennodia_get_plan_advice` -> `ennodia_start_advised_plan` | full |
59
+ | Start focused review shards | `ennodia_start_compositional` -> `ennodia_get_compositional_status` | full |
60
+ | Debug raw child tasks | `ennodia_start` -> `ennodia_get_task` | full |
61
+ | Judge completed outputs and advise on the result | `ennodia_start_compare` -> `ennodia_get_compare` | full |
62
+ | Install bundled skills | `ennodia_list_skills` -> `ennodia_install_skills` | full |
25
63
 
26
64
  For harness IDs and setup notes, see
27
65
  [Supported Harnesses](/docs/reference/supported-harnesses/). For budget request
@@ -84,6 +122,10 @@ For task views, `maxOutputChars` bounds each of `stdout`, `stderr`, and `finalMe
84
122
  `includeOutput: false` omits their text. `hasOutput` and `finalMessageChars` remain available in compact views.
85
123
  `hasOutput` includes captured diagnostic output. It does not establish correctness or a useful answer.
86
124
 
125
+ A worker CLI can stop at startup when another instance holds its local state, as OpenCode does with its database.
126
+ Ennodia restarts that start up to three times, records a `restart` task event, and reports `startupRestarts` in the task view.
127
+ Restarts keep the original deadline.
128
+
87
129
  On macOS and Linux, tasks own process groups. Cancellation sends TERM, then KILL after a bounded grace period.
88
130
  Cleanup also removes descendants that remain in the owned group after the parent exits.
89
131
  Processes that create a separate session can escape that group.
@@ -573,6 +615,14 @@ blind spots, and risks. The Result Advisor uses that analysis plus the original
573
615
  candidates to return a typed answer, basis, confidence, and open questions.
574
616
  This is model-led comparison, not formal voting.
575
617
 
618
+ When one candidate fully answers the prompt as it stands, such as a complete
619
+ file, the Result Advisor names it in `chosenSourceId`. A caller can then use
620
+ that candidate's own text, not a rewrite. `ennodia_run` does this for you: its
621
+ final answer is the Advisor's reason, then the chosen candidate unchanged.
622
+ Ennodia keeps the field only when it names a listed candidate that the Advisor
623
+ saw in full. Otherwise it records an `advisor-choice-ignored` event. A blank
624
+ or null value means no choice.
625
+
576
626
  ### `ennodia_get_compare`
577
627
 
578
628
  Returns comparison status, candidate inputs, Judge analysis, and typed Result
@@ -621,11 +671,15 @@ See [Pragmatic mode](/docs/guides/pragmatic-mode/) for examples, evidence retrie
621
671
 
622
672
  Task receipts include `deadlineAt` and `timeoutSource` (`caller` or
623
673
  `task-manager-default`). The deadline is the process cutoff, not a prediction
624
- of completion. Every child prompt receives its execution allowance and source.
674
+ of completion. Every child task receives its execution allowance and source.
625
675
  It asks for useful partial findings before the cutoff and reports of
626
676
  missing tools or permissions. Caller tools are not
627
677
  automatically inherited. This notice does not grant access or extend deadlines.
628
678
 
679
+ Claude Code receives the notice as operator instructions through `--append-system-prompt`.
680
+ Other agents receive it as a tagged block after the task, marked as coming from Ennodia.
681
+ The task command shows the notice as `<ennodia-notice>`.
682
+
629
683
  A timed-out task is an interrupted attempt. Review its captured
630
684
  output, events, partial changes, scope, and access before deciding how to proceed.
631
685
  A timeout does not establish model inability.
@@ -1,5 +1,5 @@
1
1
  ---
2
- title: Supported Harnesses
2
+ title: Supported harnesses
3
3
  description: Current Ennodia adapter IDs, local command-line interface (CLI) surfaces, and setup notes for each supported harness.
4
4
  ---
5
5
 
@@ -20,7 +20,7 @@ installed and runnable on the current machine.
20
20
  | `hermes-agent` | <span class="agent-logo agent-logo--hermes-agent" aria-hidden="true"></span>Hermes Agent | Uses the supported Hermes Agent CLI surface when available. |
21
21
  | `antigravity` | <span class="agent-logo agent-logo--antigravity" aria-hidden="true"></span>Antigravity | Runs through `agy` and supports browser-oriented review tasks. |
22
22
 
23
- ## First Check
23
+ ## First check
24
24
 
25
25
  ```json
26
26
  {
@@ -42,7 +42,7 @@ Discovery checks installed commands, not active authentication or model access.
42
42
  A stalled version probe stops at its deadline and adds an adapter note.
43
43
  Use a small real task to check the selected agent before sending larger work.
44
44
 
45
- ## Media Inputs
45
+ ## Media inputs
46
46
 
47
47
  Ennodia sends a text prompt through the selected CLI. Include local file paths and requested ranges in that prompt.
48
48
  The harness must read those files through its available tools and normal permissions.
@@ -54,12 +54,14 @@ For audio comparisons, match excerpts, playback level, and reference material ac
54
54
  Native audio findings need evidence of successful media ingestion and observations tied to the requested excerpt.
55
55
  Transcription, digital signal processing (DSP), and text-only judging provide distinct evidence. Label each method explicitly.
56
56
 
57
- ## Claude Code Models
57
+ ## Claude Code models
58
58
 
59
59
  Claude Code model aliases can change. When exact model selection matters, pass
60
60
  the full model ID, such as `claude-sonnet-5` or `claude-fable-5`, rather than an
61
61
  alias like `sonnet` or `fable`.
62
62
 
63
+ Ennodia passes its execution notice through `--append-system-prompt`, so workers read it as their session's limits.
64
+
63
65
  Do not add permission-bypass flags by default.
64
66
 
65
67
  ## Codex
@@ -75,6 +77,9 @@ profile. Ennodia passes the requested model through the `model` field.
75
77
  OpenCode model IDs use the provider/model format reported by `opencode models`,
76
78
  such as `opencode-go/kimi-k2.7-code`.
77
79
 
80
+ OpenCode runs that start at the same moment can fail with `database is locked`.
81
+ Ennodia restarts those starts automatically. A task that still fails reports the conflict as its likely cause.
82
+
78
83
  ## Antigravity
79
84
 
80
85
  An explicit `jetski: no output produced` error is treated as a failed task even if the command exits with code zero.
package/docs/roadmap.md CHANGED
@@ -3,8 +3,6 @@ title: Roadmap
3
3
  description: Reduce the work of choosing, trying, and maintaining agent tools.
4
4
  ---
5
5
 
6
- # Make the next useful attempt easier
7
-
8
6
  The roadmap follows the work a user wants to avoid.
9
7
  Future items are proposals, not available behavior or release dates.
10
8
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ennodia",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "mcpName": "io.github.cherninlab/ennodia",
5
5
  "description": "Try other agents, models, and skills from your familiar AI workflow through a local MCP server",
6
6
  "license": "MIT",
@@ -30,12 +30,6 @@
30
30
  "files": [
31
31
  "bin/ennodia",
32
32
  "CONTRIBUTING.md",
33
- "bench/README.md",
34
- "bench/bug-recall/run.ts",
35
- "bench/bug-recall/scorer.ts",
36
- "bench/fixtures/**/*",
37
- "bench/results/.gitkeep",
38
- "examples/**/*",
39
33
  "src/cli.ts",
40
34
  "src/advisor.ts",
41
35
  "src/budget.ts",
@@ -78,7 +72,7 @@
78
72
  "start": "bun run src/cli.ts",
79
73
  "check": "tsc --noEmit",
80
74
  "lint": "oxlint",
81
- "test": "bun test",
75
+ "test": "bun test ./src ./packages ./website/src",
82
76
  "version:sync": "bun run src/dev/sync-version.ts",
83
77
  "discover": "bun run src/dev/discover.ts",
84
78
  "smoke": "bun run src/dev/smoke.ts",
@@ -87,8 +81,7 @@
87
81
  "controlled-english:check": "bun run src/dev/check-controlled-english.ts",
88
82
  "io:smoke": "bun run --cwd packages/ennodia-io smoke",
89
83
  "task:smoke": "bun run src/dev/task-smoke.ts",
90
- "bench:bug-recall": "bun run bench/bug-recall/run.ts",
91
- "bench:bug-recall:live": "bun run bench/bug-recall/run.ts --live",
84
+ "bench:audio-routing": "bun run bench/audio-routing/run.ts",
92
85
  "pack:check": "npm pack --dry-run",
93
86
  "publish:dry-run": "npm publish --dry-run --tag next",
94
87
  "jsr:check": "npx jsr publish --dry-run --allow-dirty",
@@ -10,6 +10,8 @@ Use Ennodia MCP to finish the user's task with lower total cost per accepted res
10
10
  ## Organize the work
11
11
 
12
12
  1. Establish the complete task, acceptance evidence, permitted actions, source paths, and an explained execution allowance with time for verification. A direct command is sufficient for a simple lookup. For difficult work, ask Ennodia to organize purposeful independent attempts rather than manually inventing every specialist question.
13
+ Steps 3 and 4 and a separate Compare use Ennodia's full tool set. If `ennodia_start_plan_advice` is missing, use `ennodia_run` with `pragmatic`, or tell the user to add `--tools all` to the Ennodia server arguments.
14
+
13
15
  2. Discover `ennodia_list_harnesses` and `ennodia_list_skills` for the target cwd. Verify model IDs through supported harness configuration or CLI discovery. Read media `inputGuidance`; require a small native sample probe with file, range, tool and content-specific evidence. Caller tools may be absent in workers. Missing access, quota and deadlines require diagnosis, not a model-quality verdict.
14
16
  3. Use `ennodia_start_plan_advice` with the full objective and discovered model allowlists. Request independent approaches, tailored questions and, when useful or requested, matched trials with a discovered skill and no requested skill. Let the Advisor choose assignments within the caller's limits. Inspect the validated plan, acceptance coverage and inventory. Launch a ready plan with `ennodia_start_advised_plan` and its exact digest. An invalid plan starts no workers: preserve it, inspect the validation issues, and correct the specific problem. Do not silently treat invalid advice as executable.
15
17
  4. Use `ennodia_start_compositional` for caller-defined or revised slices with distinct models, prompts or skill lists. `skillIds: []` means no requested skills; it does not disable native skill discovery. Inspect `unrequestedSkillsPresent` and actual tool traces. A strict skill/no-skill experiment requires matching isolated environments and observed skill loading. Do not claim a skill effect when the trials also change model, prompt or fixtures.