ennodia 0.4.1 → 0.5.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.
package/CONTRIBUTING.md CHANGED
@@ -122,6 +122,12 @@ the root install. `bun run release:check` enforces these rules.
122
122
  The workflow passes it to npm as `NODE_AUTH_TOKEN`. JSR uses GitHub Actions
123
123
  OpenID Connect (OIDC) without a JSR token.
124
124
 
125
+ Both npm packages publish with `--provenance` from the GitHub-hosted runner.
126
+ The existing `id-token: write` permission lets npm attach a signed record of
127
+ the source and build. This requires a public repository matching each
128
+ package's `repository.url`. Previously published versions keep their
129
+ original metadata. Provenance takes effect on the next new version.
130
+
125
131
  Link scope `@cherninlab`, package `ennodia`, to
126
132
  `cherninlab/ennodia` in JSR package settings. The workflow's `id-token: write`
127
133
  permission enables that authentication. To reconfigure npm, ensure the token
package/README.md CHANGED
@@ -57,7 +57,7 @@ For manual setup, add this Model Context Protocol (MCP) server to your client:
57
57
  }
58
58
  ```
59
59
 
60
- Ennodia loads six core tools by default: about 10,000 characters of tool definitions in each session.
60
+ Ennodia loads eight core tools by default: about 13,000 characters of tool definitions in each session.
61
61
  Add `"--tools", "all"` to `args` for the [full tool set](https://ennodia.cherninlab.com/docs/reference/mcp-tools/#tool-sets).
62
62
 
63
63
  Requirements: Bun `1.3.14` or newer, a compatible MCP client, and a supported agent with working provider access.
@@ -69,18 +69,23 @@ Requirements: Bun `1.3.14` or newer, a compatible MCP client, and a supported ag
69
69
  ## How a handoff works
70
70
 
71
71
  1. Your agent calls `ennodia_run` with the task, the agent or model to use, and a time limit.
72
- 2. Ennodia starts that agent's own command-line tool in a fresh session, with its own tools and your account for it.
72
+ 2. Ennodia checks the selected route, then starts that agent's own command-line tool in a fresh session, with its own tools and your account for it.
73
73
  3. The answer comes back to your conversation, with its status and a receipt saved on your computer.
74
74
 
75
75
  Your conversation history stays in your agent.
76
76
  For two or more answers, Compare maps agreements, contradictions, and gaps.
77
77
  When one answer is complete as it stands, Compare can choose it, and `ennodia_run` returns it unchanged.
78
78
 
79
+ Include relevant constraints and prior decisions in your task prompt under **Keep in mind**.
80
+ Ennodia asks workers and Compare to return useful reminders with reasons and evidence.
81
+ Your agent verifies them before carrying them into the next task.
82
+ See [how to read these notes](https://ennodia.cherninlab.com/docs/guides/understand-results/#keep-in-mind).
83
+
79
84
  ## Supported agents
80
85
 
81
86
  Codex CLI, Claude Code, OpenCode, Kilo Code, Kiro CLI, Cline, Hermes Agent, and Antigravity.
82
87
  Model availability and tool permissions depend on the installed agent and its provider configuration.
83
- Discovery finds executable commands. It does not verify authentication or model access.
88
+ Discovery reports native login checks and recovery actions. Before execution, Ennodia verifies each selected model route with a small request when recent success is unavailable.
84
89
  Codex workers use a read-only sandbox by default.
85
90
 
86
91
  Ennodia discovers native Agent Skills and can request them for specific tasks.
@@ -131,3 +136,26 @@ bun run verify
131
136
  [Pragmatic mode](docs/guides/pragmatic-mode.md) runs independent model attempts, tailored plans, and skill trials, then compares the evidence.
132
137
  It keeps bulky evidence outside the main conversation and returns findings for your agent to verify.
133
138
  Savings are not yet validated.
139
+
140
+ ## Login recovery and updates
141
+
142
+ Ennodia checks selected workers, Judge, and Advisor routes before execution.
143
+ Blocked routes return a native recovery action before reviewers start.
144
+ Ennodia says nothing about its own status unless an agent you asked for is blocked.
145
+ Rechecks, setup, and blocked starts include a setup panel with the exact fix.
146
+
147
+ Your agent calls `ennodia_setup` to show each agent's status and fix in your current session.
148
+ Hosts that render MCP Apps, such as Claude Desktop and Visual Studio Code, can show it as a card with check buttons.
149
+ Other hosts, such as Codex and Claude Code, show the Markdown panel.
150
+
151
+ Run that action in an interactive terminal, then call `ennodia_check_harnesses` with the same harness and model and `refresh: true, verify: true`.
152
+ Run receipts keep missing reviewer coverage visible, including in compact responses.
153
+
154
+ Supported harness upgrades run once per day on use while Ennodia has no active tasks.
155
+ Set `ENNODIA_AUTO_UPDATE=false` to disable them.
156
+ Use `ennodia_check_harnesses` with `upgrade: true` to update and recheck immediately.
157
+
158
+ Ennodia also checks its own installation automatically. Run results report the loaded code location, version, runtime, and installation scope. The report checks required files, bundled skills, and storage access. The recheck tool refreshes this report. MCP startup instructions carry only installation problems.
159
+
160
+ Mention installation limitations when they affect the request. Cache installs can change on a future unpinned launch. These local checks do not verify the latest registry version or provider access.
161
+ See [recovery and updates](https://ennodia.cherninlab.com/docs/reference/supported-harnesses/#recovery-and-updates).
package/bin/ennodia CHANGED
@@ -5,19 +5,30 @@ import { fileURLToPath } from "node:url";
5
5
 
6
6
  const cliPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "src", "cli.ts");
7
7
 
8
- const bunCheck = spawnSync("bun", ["--version"], { stdio: "ignore" });
8
+ const bunCheck = spawnSync("bun", ["--version"], { encoding: "utf8", timeout: 5_000 });
9
9
 
10
- if (bunCheck.error) {
10
+ if (bunCheck.error || bunCheck.status !== 0) {
11
11
  process.stderr.write(
12
- "Ennodia requires Bun (1.3.14 or newer) to run, but it wasn't found on your PATH.\n" +
12
+ "Ennodia requires Bun (1.3.14 or newer). Bun wasn't available on PATH or failed its version check.\n" +
13
13
  "Install Bun from https://bun.sh, then try again:\n" +
14
14
  " curl -fsSL https://bun.sh/install | bash\n",
15
15
  );
16
16
  process.exit(1);
17
17
  }
18
18
 
19
+ const bunVersion = bunCheck.stdout.trim();
20
+ const minimum = [1, 3, 14];
21
+ const parsed = /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:[-+].*)?$/.exec(bunVersion);
22
+ const parts = parsed?.slice(1, 4).map(Number);
23
+ const firstDifference = parts?.findIndex((part, index) => part !== minimum[index]);
24
+ if (!parts || (firstDifference !== -1 && parts[firstDifference] < minimum[firstDifference]) || (firstDifference === -1 && bunVersion.split("+")[0].includes("-"))) {
25
+ process.stderr.write(`Ennodia requires Bun >=1.3.14; found ${bunVersion}. Upgrade Bun with bun upgrade, then restart Ennodia.\n`);
26
+ process.exit(1);
27
+ }
28
+
19
29
  const result = spawnSync("bun", ["run", cliPath, ...process.argv.slice(2)], {
20
30
  stdio: "inherit",
31
+ env: { ...process.env, ENNODIA_LAUNCHER_PATH: fileURLToPath(import.meta.url) },
21
32
  });
22
33
 
23
34
  process.exit(result.status ?? 1);
@@ -31,8 +31,20 @@ Bring the findings back to this conversation.
31
31
  ```
32
32
 
33
33
  Start with one worker and a small set of files.
34
- Discovery checks installed commands, not authentication, model access, or provider quota.
35
- A live task establishes which configuration works in your environment.
34
+ Ennodia checks each selected agent before execution. Your agent hears nothing about Ennodia's status unless an agent you requested is blocked.
35
+ A blocked agent comes with its exact fix, such as a sign-in command.
36
+
37
+ For setup or recovery, give your agent this request:
38
+
39
+ ```text
40
+ Show Ennodia setup in this session. Help me fix the agent I choose.
41
+ After I complete native sign-in or configuration, recheck that agent and continue my task.
42
+ ```
43
+
44
+ Your agent calls `ennodia_setup` and shows you each agent's status, with the exact fix for blocked agents.
45
+ Hosts that render MCP Apps can show it as a card with check buttons. A check sends at most one small model request.
46
+
47
+ Complete sign-in and credential changes in the native tool. Keep credentials out of chat.
36
48
 
37
49
  Your agent can call `ennodia_list_harnesses`, then `ennodia_run` with a selected `harnessId`, `mode: "single"`, and `compare: false`.
38
50
  Poll `ennodia_get_run` with the returned run identifier (ID).
@@ -111,7 +123,7 @@ For a local checkout, use the source file:
111
123
 
112
124
  Replace `/absolute/path/to/ennodia` with your local repository path.
113
125
 
114
- 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).
126
+ Ennodia loads eight 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).
115
127
 
116
128
  Use your client's supported configuration method.
117
129
  Preserve existing server entries.
@@ -27,6 +27,51 @@ When Judge output is unusable, the result exposes `analysisAvailable: false`.
27
27
  The Result Advisor can continue with `basis: "candidates-only"`.
28
28
  That result has less analysis behind it and needs corresponding scrutiny.
29
29
 
30
+ ## Keep in mind
31
+
32
+ One agent can notice a constraint or gap that another agent misses.
33
+ Put relevant known constraints and prior decisions in the normal task prompt under **Keep in mind**.
34
+ For a task where the same function serves a web route and a command-line tool, a prompt could include:
35
+
36
+ ```text
37
+ Review the proposed retry change.
38
+
39
+ Keep in mind:
40
+ - This function also serves the command-line tool. Preserve that behavior and check both callers.
41
+ ```
42
+
43
+ Ennodia asks workers to return up to three concise, task-specific notes when useful and compatible with the requested answer format.
44
+ Each note states what matters, why it matters, and what evidence supports it.
45
+ This is prompt guidance. A worker can miss a useful note.
46
+
47
+ Compare returns structured notes in `advisor.keepInMind`, for example:
48
+
49
+ ```json
50
+ {
51
+ "keepInMind": [
52
+ {
53
+ "note": "Reviewer B reports running only the web-route test.",
54
+ "whyItMatters": "A passing web-route test does not cover that caller.",
55
+ "evidence": "Reviewer B reports running only the web-route test.",
56
+ "sourceIds": ["review-b"],
57
+ "status": "reported"
58
+ }
59
+ ]
60
+ }
61
+ ```
62
+
63
+ `reported` attributes a point to a candidate. It does not prove the point.
64
+ `inferred` marks a conclusion drawn from the available answers.
65
+ `unverified` marks a point that still needs evidence.
66
+ Source IDs identify the candidates behind a note.
67
+ An empty list can identify coverage that no candidate supplied.
68
+
69
+ The list is empty when Compare has no useful notes.
70
+ Run results also expose nonempty notes as `keepInMind`, including in compact output.
71
+ This field stays separate from `finalAnswer` so a chosen file or patch stays unchanged.
72
+ The primary agent checks each note and carries only relevant ones into the next assignment.
73
+ Notes do not grant permissions, trigger another run, or create memory across runs.
74
+
30
75
  ## Read the attempt record
31
76
 
32
77
  Task records include the selected agent, requested skills, status, elapsed time, and bounded output.
package/docs/install.md CHANGED
@@ -70,7 +70,7 @@ 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).
73
+ Ennodia loads eight 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
74
 
75
75
  The configuration above shows the server command and arguments.
76
76
  Adapt its format to the client's documented configuration method.
@@ -79,10 +79,16 @@ Tell the user which step is needed before trying to call Ennodia.
79
79
 
80
80
  ## Get one useful result
81
81
 
82
+ Ennodia includes an installation self-check in run results and rechecks. Its MCP startup instructions carry only installation problems. It uses the loaded code location to identify a source checkout, project-local dependency, global installation, package cache, or unknown scope. It checks the Bun version, package version, core files, bundled skills, and filesystem access for temporary workspaces, history, and harness update receipts. Development files are not required for a packaged install. The npm launcher stops before startup if Bun is too old.
83
+
84
+ Tell the user about reported installation problems before the first run. Call `ennodia_check_harnesses` with `refresh: true` to refresh the installation report and native harness status after a repair. Filesystem access checks do not prove free disk space or future writes. They do not verify provider access or the latest published package version. A global install gives no extra permissions. The user's normal permissions still apply.
85
+
86
+ The report also identifies compiled code. A compiled executable does not need separate source entrypoints. Missing bundled skills remain a reported limitation. Compilation is currently an experimental build path.
87
+
82
88
  After the client exposes Ennodia's tools, start with one small task:
83
89
 
84
- 1. Call `ennodia_list_harnesses` with `refresh: true`.
85
- 2. Choose one available worker for a focused, read-only check from the user's current task.
90
+ 1. Call `ennodia_setup`. Show the user its panel: which agents are ready, and the exact fix for each blocked agent.
91
+ 2. Choose one ready or unchecked worker for a focused, read-only check from the user's current task.
86
92
  3. Call `ennodia_run` with `prompt`, `harnessId`, `mode: "single"`, `compare: false`, and the relevant `cwd`.
87
93
  4. Poll `ennodia_get_run` with the returned `id` as `runId`.
88
94
  5. Stop when the status is `succeeded`, `failed`, or `cancelled`.
package/docs/questions.md CHANGED
@@ -28,7 +28,7 @@ Each agent you call runs through its own command-line tool, with the plan or API
28
28
  ## Will it use more tokens?
29
29
 
30
30
  It can. Each agent you call reads its own prompt, and Compare reads every answer.
31
- Ennodia's six core tools add about 2,600 tokens to each session.
31
+ Ennodia's eight core tools add about 3,250 tokens to each session.
32
32
  You can cap agent runs and estimated input tokens for every run. [Set limits](/docs/guides/budgets-and-limits/).
33
33
 
34
34
  ## Is it slower?
@@ -11,8 +11,8 @@ events, child task IDs, Judge + Result Advisor state, and the final answer.
11
11
  ## Tool sets
12
12
 
13
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.
14
+ By default, Ennodia loads eight core tools, about 13,000 characters of definitions.
15
+ They cover handing work to one agent or a team, Compare, waiting, cancelling, run history, and harness recovery.
16
16
 
17
17
  The full set adds 20 tools for raw tasks, compositional slices, Plan Advisor, budget estimates, separate Compare calls, and skill installation.
18
18
  It loads about 46,000 characters of definitions.
@@ -50,7 +50,9 @@ This setting approves Ennodia runs only. Codex's sandbox and its other tools kee
50
50
 
51
51
  | Goal | Tool sequence | Tool set |
52
52
  | --- | --- | --- |
53
- | Check local setup | `ennodia_list_harnesses` | core |
53
+ | Show agent status and fixes in this session | `ennodia_setup` | core |
54
+ | Recheck an agent after a fix | `ennodia_check_harnesses` | core |
55
+ | List agents for routing | `ennodia_list_harnesses` | core |
54
56
  | Start a visible end-to-end run | `ennodia_run` -> `ennodia_get_run` | core |
55
57
  | Inspect terminal receipts after restart | `ennodia_history` | core |
56
58
  | Preview route and cost | `ennodia_estimate_budget` | full |
@@ -172,6 +174,9 @@ Version probes have bounded deadlines. A failed probe appears in adapter notes w
172
174
  | --- | --- | --- |
173
175
  | `refresh` | `false` | Ignore the short discovery cache and re-scan. |
174
176
 
177
+ The result is JSON only. Agents call this tool for routing, so it carries no setup panel.
178
+ Use `ennodia_setup` to show the user each agent's status and fix.
179
+
175
180
  Use this first when a client setup, command path, or adapter is not behaving as
176
181
  expected.
177
182
 
@@ -238,6 +243,8 @@ arguments, permissions, isolation, timeouts, retries, or budgets.
238
243
  Harness inventory entries preserve optional `inputGuidance: string[]` from discovery.
239
244
  Plan Advisor treats this bounded guidance as observations, not proof of native media support.
240
245
  Slices execute concurrently. For unverified native access, its instructions request a probe-only plan, followed by a new plan after the probe.
246
+ Plan Advisor also asks each slice prompt to carry relevant constraints and prior decisions from the original task under **Keep in mind**.
247
+ This guidance does not pass one independent candidate's findings to another.
241
248
 
242
249
  The lifecycle is deliberately two-phase: request and inspect advice first, then
243
250
  launch the exact validated plan in a separate call. Ennodia rejects invalid
@@ -419,6 +426,12 @@ It also returns the final answer when available. The important value is `id`.
419
426
  Poll it with
420
427
  `ennodia_get_run`.
421
428
 
429
+ Include relevant constraints and prior decisions under **Keep in mind** in the normal `prompt`.
430
+ There is no separate input field.
431
+ Workers are asked to return up to three useful notes with reasons and evidence when the requested answer format permits.
432
+ For compared runs, nonempty Result Advisor notes appear in `keepInMind`, separate from `finalAnswer`.
433
+ Normal and compact run views preserve this field.
434
+
422
435
  ### `ennodia_get_run`
423
436
 
424
437
  Returns the current run state. Set `waitMs` to wait for completion without repeated immediate polls. A wait timeout leaves the run running.
@@ -615,6 +628,23 @@ blind spots, and risks. The Result Advisor uses that analysis plus the original
615
628
  candidates to return a typed answer, basis, confidence, and open questions.
616
629
  This is model-led comparison, not formal voting.
617
630
 
631
+ The Result Advisor also returns `keepInMind`: up to three task-specific notes that the receiving agent could overlook.
632
+ The field defaults to `[]` when omitted or when no useful notes are available.
633
+ Each note has these fields:
634
+
635
+ | Field | Meaning |
636
+ | --- | --- |
637
+ | `note` | Constraint, connection, assumption, or gap to carry forward (at most 1000 characters). |
638
+ | `whyItMatters` | Effect on the task or next decision (at most 1000 characters). |
639
+ | `evidence` | Supporting observation or explicit evidence gap (at most 2000 characters). |
640
+ | `sourceIds` | Up to 64 listed candidate IDs supporting the note. A `reported` note requires a source. Use `[]` for inferred or unverified missing coverage. |
641
+ | `status` | `reported` for an attributed candidate report, `inferred` for a conclusion from available answers, or `unverified` for a point that needs evidence. |
642
+
643
+ A `reported` note is not independent proof.
644
+ Invalid optional notes are omitted with an `advisor-notes-ignored` event. The valid answer and candidate choice are preserved.
645
+ The primary agent verifies notes and carries only relevant ones into later prompts.
646
+ These notes do not change permissions, start another run, or create memory across runs.
647
+
618
648
  When one candidate fully answers the prompt as it stands, such as a complete
619
649
  file, the Result Advisor names it in `chosenSourceId`. A caller can then use
620
650
  that candidate's own text, not a rewrite. `ennodia_run` does this for you: its
@@ -768,3 +798,62 @@ Preserve full patch artifacts and verify them before application.
768
798
  A later Compare call and its Judge and Result Advisor have separate limits.
769
799
  `includeCompareEstimate` includes an estimate, not a reserved spending balance.
770
800
  Count these stages, retries and verification when reporting whole-task cost.
801
+
802
+ ### `ennodia_setup`
803
+
804
+ Show the user each agent's status and the exact fix for blocked agents.
805
+ The tool takes no input. It refreshes native sign-in status without a model request.
806
+ It declares `readOnlyHint`, so clients such as Codex run it without an approval prompt.
807
+
808
+ The result has the same JSON shape as `ennodia_check_harnesses`, plus the `ennodia://setup` panel.
809
+ Hosts that render MCP Apps show the [setup card](#setup-card) in place of the panel.
810
+ Sign-in and credential changes stay in each agent's own CLI.
811
+
812
+ #### Setup card
813
+
814
+ `ennodia_setup` and `ennodia_check_harnesses` name the `ui://ennodia/setup.html` resource in `_meta.ui.resourceUri`.
815
+ The resource uses the MCP Apps type `text/html;profile=mcp-app`.
816
+ Hosts that render MCP Apps show the card inside the conversation. Other hosts ignore it and keep the Markdown panel.
817
+
818
+ The card lists agents that need the user first, with the next step for each.
819
+ A login blocker shows its sign-in command with a copy button.
820
+ Each check button calls `ennodia_check_harnesses` for that agent and model with `verify: true`.
821
+ A check sends at most one small model request.
822
+ When an agent becomes ready, the card can send a short note to the chat.
823
+
824
+ The card loads no external code and makes no network requests.
825
+ It never collects credentials.
826
+
827
+ ### `ennodia_check_harnesses`
828
+
829
+ `ennodia_check_harnesses` is part of the default tool set.
830
+
831
+ The result includes `installation`, a local self-check of Ennodia's loaded code root, version, installation scope, Bun runtime, core files, bundled skills, and storage access. MCP initialization sends only its problems to the host, and a healthy installation adds nothing. `ennodia_run` and `ennodia_get_run` include the full report even in compact results. Mention its limitations when they affect the request.
832
+
833
+ `refresh: true` refreshes installation evidence as well as harness readiness. Scope remains `unknown` when filesystem evidence is insufficient. The report does not verify registry freshness, provider access, disk capacity, or future writes.
834
+
835
+ It accepts `harnessIds`, `model`, `cwd`, `refresh`, `verify`, and `upgrade`.
836
+ Native status checks are the default. `verify: true` makes a bounded real model request.
837
+
838
+ `unverified` means unchecked. `ennodia_run` verifies its selected routes automatically.
839
+ Use targeted `harnessIds` for recovery checks. Unrelated blockers do not prevent work on usable requested routes.
840
+
841
+ Rechecks, `ennodia_setup`, and blocked preflight responses include an embedded `ennodia://setup` resource with `text/markdown` content.
842
+ The JSON text response keeps its existing shape.
843
+
844
+ The panel is a table of agents, with agents that need the user first. Each row gives the status in plain words and the next step.
845
+ Sign-in commands follow the table, for login blockers only. Key expiry and quota blockers name their own recovery.
846
+ Show the panel when the host displays no setup card. Recheck the same harness and model after recovery, then resume the original task.
847
+
848
+ `upgrade: true` runs supported updaters before rediscovery and recheck.
849
+ This tool can change installed software and call providers, so it does not declare `readOnlyHint`.
850
+
851
+ Present `actionRequired` immediately, including on partial success.
852
+ Do not wait for an explicit user question about missing reviewers.
853
+ Run preflight errors return `isError`, recovery actions, and zero started reviewers.
854
+ Run receipts retain `preflight`, `coverage`, and `actionRequired` in compact responses.
855
+ Use the matching native recovery action, then recheck the same route.
856
+
857
+ An expired provider API key returns `credentials-expired` and requires key replacement.
858
+ Depleted credits return `quota-exhausted` and require capacity recovery.
859
+ See [Recovery and updates](/docs/reference/supported-harnesses/#recovery-and-updates).
@@ -7,6 +7,12 @@ Ennodia coordinates local agents through thin adapters. Each harness uses a
7
7
  local command-line interface (CLI). Use `ennodia_list_harnesses` to see what is
8
8
  installed and runnable on the current machine.
9
9
 
10
+ On macOS, discovery checks the existing `PATH` first, then `/opt/homebrew/bin`,
11
+ `/usr/local/bin`, and `~/.local/bin`. This covers restricted GUI and MCP launch
12
+ paths without changing the selected account, model, or child process environment.
13
+ Explicit command paths and routes with no command candidates stay unchanged.
14
+ Restart the MCP server after updating Ennodia to load discovery changes.
15
+
10
16
  ## Adapter IDs
11
17
 
12
18
  | ID | Tool | Notes |
@@ -32,15 +38,18 @@ installed and runnable on the current machine.
32
38
  ```
33
39
 
34
40
  The response reports availability, runnable state, command path, version,
35
- capabilities, adapter notes, and optional `inputGuidance`.
41
+ capabilities, adapter notes, optional `inputGuidance`, and `readiness`.
36
42
 
37
43
  `inputGuidance` is a bounded `string[]` of adapter observations and input advice.
38
44
  It does not guarantee media support, authentication, or access to a requested model.
39
45
  Plan Advisor receives this guidance in its harness inventory.
40
46
 
41
- Discovery checks installed commands, not active authentication or model access.
42
- A stalled version probe stops at its deadline and adds an adapter note.
43
- Use a small real task to check the selected agent before sending larger work.
47
+ Discovery checks installation and native login status through supported commands.
48
+ Model access remains unverified until a small real request or a recent successful task returns an answer.
49
+ A stalled check stops at its deadline and reports a blocker.
50
+ Ennodia checks selected worker, Judge, and Advisor routes before execution.
51
+ Known blockers prevent requested work from starting.
52
+ Automatic routing excludes blocked routes and reports missing coverage.
44
53
 
45
54
  ## Media inputs
46
55
 
@@ -110,6 +119,75 @@ agy --version
110
119
  agy models
111
120
  ```
112
121
 
113
- If the shell cannot find `agy` at all, open Antigravity and use its supported
114
- CLI install or shell-integration flow first. Then restart the Model Context
122
+ If neither `PATH` nor the native install roots contain `agy`, open Antigravity
123
+ and use its supported CLI install or shell-integration flow first. Then restart the Model Context
115
124
  Protocol (MCP) client and call `ennodia_list_harnesses` again.
125
+
126
+ ## Recovery and updates
127
+
128
+ Run the native command returned in `readiness.recovery` in an interactive terminal.
129
+ Keep the intended account, provider, and model.
130
+ Call `ennodia_check_harnesses` after sign-in:
131
+
132
+ ```json
133
+ {
134
+ "harnessIds": ["codex"],
135
+ "refresh": true,
136
+ "verify": true
137
+ }
138
+ ```
139
+
140
+ Pass the same `model` and `cwd` when rechecking an explicit route.
141
+ The check returns `actionRequired` for login, setup, model, capacity, and connectivity blockers.
142
+ A missing CLI requires installation. A capacity failure requires capacity recovery.
143
+ Neither is fixed by repeated sign-in.
144
+
145
+ `credentials-expired` means the configured provider API key has expired.
146
+ Replace the key through the native credential flow for the intended provider.
147
+ Signing in again does not renew an expired API key.
148
+ `quota-exhausted` includes depleted credits.
149
+ Restore credits or quota through the intended provider before rechecking.
150
+ Ennodia reads terminal-formatted native errors and returns the matching recovery action.
151
+
152
+ Hermes uses the full `hermes chat` CLI. The legacy `hermes-agent` executable is not compatible.
153
+
154
+ Native checks cache for 30 seconds. Verified routes cache for five minutes.
155
+ A native authentication failure invalidates the route immediately.
156
+ Concurrent checks of the same route share one request.
157
+
158
+ `unverified` means unchecked. It does not mean a failed harness.
159
+ `ennodia_run` verifies its selected routes before launching workers.
160
+ Checking every supported harness is not a prerequisite for a run.
161
+
162
+ Unrelated harness blockers do not prevent work on a usable requested route.
163
+ A verified default route does not prove access to other models.
164
+ Use the existing user authorization and the host approval policy.
165
+ Ennodia does not require an additional approval step.
166
+
167
+ Model probes run in an empty temporary directory with normal native permissions.
168
+ A temporary directory is not a security sandbox.
169
+
170
+ Probes use provider capacity and reserve 256 input tokens per route for budget checks.
171
+ The reserve is an estimate, not a measurement of provider usage.
172
+ Probe calls count toward `maxChildTasks`. Usage remains unknown when the provider reports no measurement.
173
+
174
+ Before ordinary execution, Ennodia attempts supported upgrades once per day while no Ennodia task is active.
175
+ Homebrew installations use their installed formula or cask.
176
+ An npm Codex installation uses its supported npm update command.
177
+ Other supported installations use native updaters.
178
+
179
+ Updates preserve the installed distribution and channel and use no force flags.
180
+ Pinned or unsupported installations and failed updates require native maintenance.
181
+ Updater success is not proof of model readiness.
182
+ Ennodia rediscovers the version and rechecks the route.
183
+
184
+ Set `ENNODIA_AUTO_UPDATE=false` in the MCP server environment to disable automatic upgrades.
185
+ Call `ennodia_check_harnesses` with `upgrade: true` for an immediate update attempt and recheck.
186
+ The response includes `readiness.upgrade` with the update result and native command.
187
+ Approved Advisor plans do not upgrade during execution, so their frozen inventory remains stable.
188
+ Automatic updates run on use.
189
+ Ennodia does not install a background daemon.
190
+
191
+ Report `actionRequired` and reduced `coverage` to the user on the first response that contains them.
192
+ Compact run responses retain these fields.
193
+ MCP clients control how those responses appear in the conversation.
@@ -0,0 +1,43 @@
1
+ ---
2
+ title: Ennodia 0.5.0
3
+ description: Readiness, recovery, setup cards, and attributed comparison notes.
4
+ ---
5
+
6
+ # Ennodia 0.5.0
7
+
8
+ Release scope for 9 November 2026.
9
+
10
+ ## Core
11
+
12
+ - Installation evidence identifies runtime, package, and storage limitations.
13
+ - Readiness preflight checks selected routes before orchestration. Native
14
+ recovery distinguishes sign-in, expired keys, unavailable models, and quota.
15
+ - `ennodia_setup` shows agent status and recovery steps. Compatible hosts show
16
+ a setup card. Other hosts receive the Markdown panel.
17
+ - Comparison results and history carry attributed “Keep in mind” notes,
18
+ with evidence and uncertainty kept separate from the chosen answer.
19
+ - The npm launcher rejects unsupported Bun runtimes. Packaged installation
20
+ checks cover the new runtime files.
21
+
22
+ ## Website and publishing
23
+
24
+ The website includes conversation examples and refined landing-page controls.
25
+ New npm releases include provenance. GitHub Actions use updated pinned versions.
26
+ The Astro and Starlight major migration is tracked separately in
27
+ [issue 24](https://github.com/cherninlab/ennodia/issues/24).
28
+
29
+ ## Validation and limits
30
+
31
+ The release gates are `bun run release:check`, including the full verification
32
+ suite, npm and JSR dry-runs, and real packed-package MCP handshakes through
33
+ `bunx`, `npm exec`, and `npx`. Registry publication and website deployment must
34
+ also succeed in their separate GitHub Actions workflows.
35
+
36
+ Mobile source is included in `apps/mobile` as the separate `0.1.0+1` development
37
+ project. Analysis and all 18 Flutter tests passed on 9 November. Native builds,
38
+ assistant connections, and store releases remain unavailable or unverified.
39
+ Mobile is excluded from the npm and JSR packages.
40
+
41
+ Private benchmark material remains local. No new benchmark-quality or savings
42
+ claim is part of this release. Release checks do not prove access to every
43
+ provider account or model.
package/docs/roadmap.md CHANGED
@@ -9,7 +9,8 @@ Future items are proposals, not available behavior or release dates.
9
9
  | Stage | User outcome | Product work |
10
10
  | --- | --- | --- |
11
11
  | Current | Try another agent or skill from the same conversation. | Discovery, focused tasks, explicit choices, optional team advice, Compare, and local history. |
12
- | Next release candidate | Trust the reported outcome and recover from failed attempts. | Process cleanup, valid comparison evidence, safer local server requests, clearer errors, and task-based guides. |
12
+ | 0.5.0 release candidate | Find setup problems before work starts and retain useful advice. | Harness readiness, recovery, installation checks, and attributed result notes. |
13
+ | Mobile foundation | Start using Ennodia on Android and iOS. | Flutter app, permitted discovery, setup journal, cancellation, and verified undo. Assistant connections are not available yet. |
13
14
  | Next | Avoid repeating unsuccessful attempts. | Local outcome notes with task, model, version, skill, and relevant conditions. |
14
15
  | Later | Spend less time inspecting tool configuration. | Supported version and capability checks, clearer execution settings, and useful progress checkpoints. |
15
16
  | Later | Get useful suggestions for the next attempt. | Recommendations grounded in recorded outcomes, with reasons and uncertainty. |
@@ -21,3 +22,6 @@ Recorded outcomes need a way to inspect, correct, and delete them.
21
22
 
22
23
  The [measurement plan](/docs/evidence/measurement/) covers task correctness, time, resources, and human work.
23
24
  General savings claims will need comparative evidence.
25
+
26
+ Ennodia Mobile has a separate development version. The implementation and device
27
+ validation plan live in `apps/mobile/README.md` in the repository.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ennodia",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "mcpName": "io.github.cherninlab/ennodia",
5
5
  "description": "Connects the AI agents you use: your agent hands a task to another and gets the answer back",
6
6
  "license": "MIT",
@@ -38,7 +38,9 @@
38
38
  "src/core.ts",
39
39
  "src/diagnosis.ts",
40
40
  "src/harnesses.ts",
41
+ "src/readiness.ts",
41
42
  "src/history.ts",
43
+ "src/installation.ts",
42
44
  "src/index.ts",
43
45
  "src/internal.ts",
44
46
  "src/pragmatic.ts",
@@ -48,6 +50,7 @@
48
50
  "src/priority.ts",
49
51
  "src/runs.ts",
50
52
  "src/server.ts",
53
+ "src/setup-app.ts",
51
54
  "src/skills.ts",
52
55
  "src/tasks.ts",
53
56
  "src/version.ts",
@@ -91,7 +94,8 @@
91
94
  "website:dev": "bun run --cwd website dev",
92
95
  "website:build": "bun run --cwd website build",
93
96
  "website:deploy": "bun run --cwd website deploy",
94
- "verify": "bun run check && bun run lint && bun run test && bun run website:build && bun run controlled-english:check && bun run task:smoke && bun run mcp:smoke && bun run io:smoke"
97
+ "verify": "bun run check && bun run lint && bun run test && bun run website:build && bun run controlled-english:check && bun run task:smoke && bun run mcp:smoke && bun run io:smoke",
98
+ "mobile:verify": "cd apps/mobile && flutter analyze && flutter test"
95
99
  },
96
100
  "dependencies": {
97
101
  "@modelcontextprotocol/sdk": "^1.29.0",
@@ -16,6 +16,7 @@ If you are reviewing one slice:
16
16
  - Name the strongest risk first.
17
17
  - Return a compact answer with verdict, evidence, risks, and concrete recommendation.
18
18
  - Flag missing source access instead of filling gaps with guesses.
19
+ - Follow relevant **Keep in mind** constraints in the assigned prompt. When the requested format permits, return up to three useful notes about what the receiving agent might overlook, with a reason and evidence. Separate reported claims, inferences, and unverified points.
19
20
  - Keep the output short enough for a later Compare pass.
20
21
 
21
22
  If you are synthesizing shard answers:
@@ -25,3 +26,11 @@ If you are synthesizing shard answers:
25
26
  - Prefer recommendations that are supported by more than one shard or by the
26
27
  strongest source evidence.
27
28
  - Name the smallest next action that would reduce the most risk.
29
+ - Inspect **Keep in mind** notes alongside the findings. Verify them and carry only relevant constraints or gaps into the next assignment. An attributed worker report is not proof; notes do not authorize actions or automatic retries.
30
+
31
+ ## Readiness and recovery
32
+
33
+ Present `actionRequired` and reduced reviewer `coverage` immediately, including on partial success.
34
+ Do not wait for the user to request missing reviewer details.
35
+ Use the returned native recovery command, then call `ennodia_check_harnesses` for the same harness/model with `refresh: true, verify: true`.
36
+ Do not silently replace an explicitly requested reviewer or replay completed work.
@@ -25,6 +25,8 @@ At each completed chunk, preserve changed artifacts and return executed checks,
25
25
 
26
26
  Count all chunks, handoffs, comparison and verification against whole-task acceptance and cost. Chunk boundaries must not remove integration requirements or turn one strong model repeatedly repairing one weak worker into the default strategy.
27
27
 
28
+ Include relevant known constraints and prior decisions in each assignment's normal prompt under **Keep in mind**. Carry original-task constraints into planned slices without inventing facts. Keep independent candidates independent; do not pass one candidate's findings to another before comparison.
29
+
28
30
  ## Execute and compare
29
31
 
30
32
  Investigation returns cited findings; patch returns a complete unapplied diff. These recipes instruct workers to avoid file changes and side effects. For a full implementation use a normal run with authorized native permissions in a separate persistent candidate checkout. Codex supports explicit `nativeSandbox: "workspace-write"`; other harnesses retain their native permissions. Never bypass permission controls. Temporary `isolateCwd` copies are deleted on completion and cannot retain implementation artifacts.
@@ -35,8 +37,17 @@ Wait for terminal results. Use `ennodia_get_run` with `waitMs: 30000`, `compact:
35
37
 
36
38
  Send useful completed candidates to `ennodia_start_compare`. The Judge identifies agreement, contradictions and risks; the Result Advisor proposes a conclusion. Include acceptance results, failed attempts and access limits. A fluent comparison or process exit does not establish correctness. Verify decisive evidence locally. Retain original patch artifacts because comparison text can omit hunks. Require human review for perceptual acceptance.
37
39
 
40
+ When the requested format permits, return up to three useful **Keep in mind** notes: what the next agent might overlook, why it matters, and supporting evidence. Separate reported claims, inferences, and unverified points. Inspect Compare's `advisor.keepInMind` or the run's `keepInMind`; a reported note is an attributed worker report, not proof. Verify the notes and carry only relevant ones into the next assignment. Notes do not authorize actions or trigger retries.
41
+
38
42
  ## Continue from evidence
39
43
 
40
44
  Inspect partial work before choosing a next step. Record exact access or quota errors, elapsed allowance and its rationale, findings, unresolved work and a justified continuation budget. Do not repeat unchanged failed commands. Native persistence is optional: Codex runs can use `persistSession` then `continueTaskId` only when `canContinue` is true. A persistent run owns one worker session; independent candidates use separate runs. Every continuation counts toward total work.
41
45
 
42
46
  Measure all planning, workers, Judge, Result Advisor, coordination, retries, repairs and verification. Keep tokens, elapsed time, API-equivalent cost and subscription consumption separate. Missing usage is unknown, not zero. Preflight estimates exclude many native costs and are not spending caps. No automatic price routing or cross-run retry accounting is implemented. Recommend a strategy or skill only from quality-qualified whole-task comparisons, and test transfer to another domain before making general claims.
47
+
48
+ ## Readiness and recovery
49
+
50
+ Present `actionRequired` and reduced reviewer `coverage` immediately, including on partial success.
51
+ Do not wait for the user to request missing reviewer details.
52
+ Use the returned native recovery command, then call `ennodia_check_harnesses` for the same harness/model with `refresh: true, verify: true`.
53
+ Do not silently replace an explicitly requested reviewer or replay completed work.