ennodia 0.1.0-rc.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 (53) hide show
  1. package/CONTRIBUTING.md +21 -0
  2. package/LICENSE +21 -0
  3. package/README.md +99 -0
  4. package/bench/README.md +32 -0
  5. package/bench/bug-recall/run.ts +331 -0
  6. package/bench/bug-recall/scorer.ts +424 -0
  7. package/bench/fixtures/bug-recall/001-missing-await/input.ts +33 -0
  8. package/bench/fixtures/bug-recall/001-missing-await/oracle.json +28 -0
  9. package/bench/fixtures/bug-recall/001-missing-await/responses/claude-code-solo.md +1 -0
  10. package/bench/fixtures/bug-recall/001-missing-await/responses/codex-solo.md +1 -0
  11. package/bench/fixtures/bug-recall/001-missing-await/responses/ennodia-parallel-compare.md +1 -0
  12. package/bench/fixtures/bug-recall/002-timeout-drain/input.ts +40 -0
  13. package/bench/fixtures/bug-recall/002-timeout-drain/oracle.json +28 -0
  14. package/bench/fixtures/bug-recall/002-timeout-drain/responses/claude-code-solo.md +1 -0
  15. package/bench/fixtures/bug-recall/002-timeout-drain/responses/codex-solo.md +1 -0
  16. package/bench/fixtures/bug-recall/002-timeout-drain/responses/ennodia-parallel-compare.md +1 -0
  17. package/bench/fixtures/bug-recall/003-schema-contract/input.ts +22 -0
  18. package/bench/fixtures/bug-recall/003-schema-contract/oracle.json +28 -0
  19. package/bench/fixtures/bug-recall/003-schema-contract/responses/claude-code-solo.md +1 -0
  20. package/bench/fixtures/bug-recall/003-schema-contract/responses/codex-solo.md +1 -0
  21. package/bench/fixtures/bug-recall/003-schema-contract/responses/ennodia-parallel-compare.md +1 -0
  22. package/bench/fixtures/bug-recall/004-cancel-propagation/input.ts +28 -0
  23. package/bench/fixtures/bug-recall/004-cancel-propagation/oracle.json +28 -0
  24. package/bench/fixtures/bug-recall/004-cancel-propagation/responses/claude-code-solo.md +1 -0
  25. package/bench/fixtures/bug-recall/004-cancel-propagation/responses/codex-solo.md +1 -0
  26. package/bench/fixtures/bug-recall/004-cancel-propagation/responses/ennodia-parallel-compare.md +1 -0
  27. package/bench/results/.gitkeep +1 -0
  28. package/docs/assets/agents/antigravity-color.svg +1 -0
  29. package/docs/assets/agents/claudecode-color.svg +1 -0
  30. package/docs/assets/agents/codex-color.svg +1 -0
  31. package/docs/assets/agents/opencode-dark.svg +1 -0
  32. package/docs/assets/agents/opencode-light.svg +1 -0
  33. package/docs/assets/icons/arrow.svg +1 -0
  34. package/docs/assets/icons/github.svg +1 -0
  35. package/docs/assets/icons/link.svg +1 -0
  36. package/docs/assets/logo-dark.svg +1 -0
  37. package/docs/assets/logo.svg +1 -0
  38. package/docs/assets/orchestration-pipeline.svg +74 -0
  39. package/docs/getting-started.md +107 -0
  40. package/docs/in-depth/architecture.md +53 -0
  41. package/docs/in-depth/releasing.md +120 -0
  42. package/docs/index.md +16 -0
  43. package/docs/reference/mcp-tools.md +104 -0
  44. package/package.json +87 -0
  45. package/src/compare.ts +777 -0
  46. package/src/diagnosis.ts +161 -0
  47. package/src/harnesses.ts +302 -0
  48. package/src/index.ts +52 -0
  49. package/src/planner.ts +106 -0
  50. package/src/runs.ts +777 -0
  51. package/src/server.ts +747 -0
  52. package/src/tasks.ts +602 -0
  53. package/src/version.ts +1 -0
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "004-cancel-propagation",
3
+ "title": "Run cancellation does not cancel child tasks",
4
+ "prompt": "Review the TypeScript fixture and list correctness bugs.",
5
+ "requiredFindings": [
6
+ {
7
+ "id": "missing-task-cancel-call",
8
+ "severity": "high",
9
+ "line": 20,
10
+ "description": "The loop finds running child tasks but never calls task.cancel(), leaving them running after the run is cancelled.",
11
+ "keywords": ["task.cancel", "running"]
12
+ },
13
+ {
14
+ "id": "mutates-run-in-place",
15
+ "severity": "medium",
16
+ "line": 17,
17
+ "description": "The function mutates the Run object in place before child task cancellation has succeeded, so callers can observe cancelled state while children continue running.",
18
+ "keywords": ["mutates", "cancelled", "children"]
19
+ }
20
+ ],
21
+ "knownFalsePositives": [
22
+ {
23
+ "id": "task-id-order",
24
+ "description": "Claims task ID order causes the cancellation bug.",
25
+ "terms": ["taskIds", "order"]
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1 @@
1
+ {"findings":[{"line":20,"summary":"The loop checks each running task but never calls task.cancel, so children keep running after cancellation."}]}
@@ -0,0 +1 @@
1
+ {"findings":[{"line":17,"summary":"The run is mutated to cancelled before children are cancelled, so callers can observe cancelled while children still run."}]}
@@ -0,0 +1 @@
1
+ {"findings":[{"line":20,"summary":"The loop finds running child tasks but never calls task.cancel, leaving running tasks alive."},{"line":17,"summary":"cancelRun mutates the run to cancelled before child cancellation succeeds, so children can continue running under a cancelled run."}]}
@@ -0,0 +1 @@
1
+
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24"><title>Antigravity</title><mask id="lobe-icons-antigravity-0-_R_0_" width="24" height="23" x="0" y="1" maskUnits="userSpaceOnUse"><path fill="#fff" d="M21.751 22.607c1.34 1.005 3.35.335 1.508-1.508C17.73 15.74 18.904 1 12.037 1S6.342 15.74.815 21.1c-2.01 2.009.167 2.511 1.507 1.506 5.192-3.517 4.857-9.714 9.715-9.714s4.522 6.197 9.714 9.715"/></mask><g mask="url(#lobe-icons-antigravity-0-_R_0_)"><g filter="url(#lobe-icons-antigravity-1-_R_0_)"><path fill="#ffe432" d="M-1.018-3.992c-.408 3.591 2.686 6.89 6.91 7.37s7.98-2.043 8.387-5.633-2.686-6.89-6.91-7.37c-4.225-.479-7.98 2.043-8.387 5.633"/></g><g filter="url(#lobe-icons-antigravity-2-_R_0_)"><path fill="#fc413d" d="M15.269 7.747c1.058 4.557 5.691 7.374 10.348 6.293 4.657-1.082 7.575-5.653 6.516-10.21-1.058-4.556-5.691-7.374-10.348-6.292s-7.575 5.653-6.516 10.21z"/></g><g filter="url(#lobe-icons-antigravity-3-_R_0_)"><path fill="#00b95c" d="M-12.443 10.804c1.338 4.703 7.36 7.11 13.453 5.378s9.947-6.95 8.61-11.652C8.282-.173 2.26-2.58-3.833-.848s-9.947 6.948-8.61 11.652"/></g><g filter="url(#lobe-icons-antigravity-4-_R_0_)"><path fill="#00b95c" d="M-12.443 10.804c1.338 4.703 7.36 7.11 13.453 5.378s9.947-6.95 8.61-11.652C8.282-.173 2.26-2.58-3.833-.848s-9.947 6.948-8.61 11.652"/></g><g filter="url(#lobe-icons-antigravity-5-_R_0_)"><path fill="#00b95c" d="M-7.608 14.703c3.352 3.424 9.126 3.208 12.896-.483 3.77-3.69 4.108-9.459.756-12.883C2.69-2.087-3.083-1.871-6.853 1.82c-3.77 3.69-4.108 9.458-.755 12.883"/></g><g filter="url(#lobe-icons-antigravity-6-_R_0_)"><path fill="#3186ff" d="M9.932 27.617c1.04 4.482 5.384 7.303 9.7 6.3 4.316-1.002 6.971-5.448 5.93-9.93-1.04-4.483-5.384-7.304-9.7-6.301-4.316 1.002-6.971 5.448-5.93 9.93z"/></g><g filter="url(#lobe-icons-antigravity-7-_R_0_)"><path fill="#fbbc04" d="M2.572-8.185C.392-3.329 2.778 2.472 7.9 4.771c5.122 2.3 11.042.227 13.222-4.63 2.18-4.855-.205-10.656-5.327-12.955-5.122-2.3-11.042-.227-13.222 4.63z"/></g><g filter="url(#lobe-icons-antigravity-8-_R_0_)"><path fill="#3186ff" d="M-3.267 38.686c-5.277-2.072 3.742-19.117 5.984-24.83s8.34-8.664 13.616-6.592c5.278 2.071 11.533 13.482 9.29 19.195-2.242 5.713-23.613 14.298-28.89 12.227"/></g><g filter="url(#lobe-icons-antigravity-9-_R_0_)"><path fill="#749bff" d="M28.71 17.471c-1.413 1.649-5.1.808-8.236-1.878-3.135-2.687-4.531-6.201-3.118-7.85s5.1-.808 8.235 1.878 4.532 6.2 3.119 7.85"/></g><g filter="url(#lobe-icons-antigravity-10-_R_0_)"><path fill="#fc413d" d="M18.163 9.077c5.81 3.93 12.502 4.19 14.946.577 2.443-3.612-.287-9.727-6.098-13.658-5.81-3.931-12.502-4.19-14.946-.577-2.443 3.612.287 9.727 6.098 13.658"/></g><g filter="url(#lobe-icons-antigravity-11-_R_0_)"><path fill="#ffee48" d="M-.915 2.684c-1.44 3.473-.97 6.967 1.05 7.804s4.824-1.3 6.264-4.772.97-6.967-1.05-7.804S.525-.788-.915 2.684"/></g></g><defs><filter id="lobe-icons-antigravity-1-_R_0_" width="19.838" height="17.587" x="-3.288" y="-11.917" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="1.117"/></filter><filter id="lobe-icons-antigravity-2-_R_0_" width="38.9" height="38.565" x="4.251" y="-13.493" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="5.4"/></filter><filter id="lobe-icons-antigravity-3-_R_0_" width="40.955" height="36.517" x="-21.889" y="-10.592" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.591"/></filter><filter id="lobe-icons-antigravity-4-_R_0_" width="40.955" height="36.517" x="-21.889" y="-10.592" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.591"/></filter><filter id="lobe-icons-antigravity-5-_R_0_" width="36.632" height="36.595" x="-19.099" y="-10.278" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.591"/></filter><filter id="lobe-icons-antigravity-6-_R_0_" width="33.533" height="34.087" x=".981" y="8.758" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.363"/></filter><filter id="lobe-icons-antigravity-7-_R_0_" width="35.978" height="35.276" x="-6.143" y="-21.659" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.954"/></filter><filter id="lobe-icons-antigravity-8-_R_0_" width="45.114" height="46.523" x="-11.96" y="-.46" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.531"/></filter><filter id="lobe-icons-antigravity-9-_R_0_" width="25.094" height="24.054" x="10.485" y=".58" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.159"/></filter><filter id="lobe-icons-antigravity-10-_R_0_" width="33.508" height="30.007" x="5.833" y="-12.467" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="2.669"/></filter><filter id="lobe-icons-antigravity-11-_R_0_" width="22.194" height="26.151" x="-8.355" y="-8.876" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.303"/></filter></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24"><title>Claude Code</title><path fill="#d97757" fill-rule="evenodd" d="M20.998 10.949H24v3.102h-3v3.028h-1.487V20H18v-2.921h-1.487V20H15v-2.921H9V20H7.488v-2.921H6V20H4.487v-2.921H3V14.05H0v-3.1h3V5h17.998zM6 10.949h1.488V8.102H6zm10.51 0H18V8.102h-1.49z" clip-rule="evenodd"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24"><title>Codex</title><path fill="#fff" d="M19.503 0H4.496A4.496 4.496 0 0 0 0 4.496v15.007A4.496 4.496 0 0 0 4.496 24h15.007A4.496 4.496 0 0 0 24 19.503V4.496A4.496 4.496 0 0 0 19.503 0"/><path fill="url(#lobe-icons-codex-_R_0_)" d="M9.064 3.344a4.6 4.6 0 0 1 2.285-.312q1.5.173 2.673 1.275.016.015.037.021a.1.1 0 0 0 .043 0 4.55 4.55 0 0 1 3.046.275l.047.022.116.057a4.58 4.58 0 0 1 2.188 2.399q.313.765.315 1.595a4.2 4.2 0 0 1-.134 1.223.12.12 0 0 0 .03.115q.89.91 1.183 2.17.433 2.138-.887 3.854l-.136.166a4.55 4.55 0 0 1-2.201 1.388.12.12 0 0 0-.081.076c-.191.551-.383 1.023-.74 1.494-.9 1.187-2.222 1.846-3.711 1.838q-1.78-.009-3.157-1.302a.11.11 0 0 0-.105-.024c-.388.125-.78.143-1.204.138a4.44 4.44 0 0 1-1.945-.466 4.54 4.54 0 0 1-1.61-1.335c-.152-.202-.303-.392-.414-.617a6 6 0 0 1-.37-.961 4.6 4.6 0 0 1-.014-2.298.1.1 0 0 0 .006-.056.1.1 0 0 0-.027-.048 4.5 4.5 0 0 1-1.034-1.651 3.9 3.9 0 0 1-.251-1.192 5.2 5.2 0 0 1 .141-1.6Q3.659 7.92 5.086 6.97q.318-.212.601-.33a6 6 0 0 1 .646-.227.1.1 0 0 0 .065-.066 4.5 4.5 0 0 1 .829-1.615 4.54 4.54 0 0 1 1.837-1.388m3.482 10.565a.637.637 0 0 0 0 1.272h3.636a.637.637 0 1 0 0-1.272zM8.462 9.23a.637.637 0 0 0-1.106.631l1.272 2.224-1.266 2.136a.636.636 0 1 0 1.095.649l1.454-2.455a.64.64 0 0 0 .005-.64z"/><defs><linearGradient id="lobe-icons-codex-_R_0_" x1="12" x2="12" y1="3" y2="21" gradientUnits="userSpaceOnUse"><stop stop-color="#b1a7ff"/><stop offset=".5" stop-color="#7a9dff"/><stop offset="1" stop-color="#3941ff"/></linearGradient></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="240" height="300" fill="none" viewBox="0 0 240 300"><g clip-path="url(#clip0_1401_86283)"><mask id="mask0_1401_86283" width="240" height="300" x="0" y="0" maskUnits="userSpaceOnUse" style="mask-type:luminance"><path fill="#fff" d="M240 0H0v300h240z"/></mask><g mask="url(#mask0_1401_86283)"><path fill="#4b4646" d="M180 240H60V120h120z"/><path fill="#f1ecec" d="M180 60H60v180h120zm60 240H0V0h240z"/></g></g><defs><clipPath id="clip0_1401_86283"><path fill="#fff" d="M0 0h240v300H0z"/></clipPath></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="240" height="300" fill="none" viewBox="0 0 240 300"><g clip-path="url(#clip0_1401_86274)"><mask id="mask0_1401_86274" width="240" height="300" x="0" y="0" maskUnits="userSpaceOnUse" style="mask-type:luminance"><path fill="#fff" d="M240 0H0v300h240z"/></mask><g mask="url(#mask0_1401_86274)"><path fill="#cfcecd" d="M180 240H60V120h120z"/><path fill="#211e1e" d="M180 60H60v180h120zm60 240H0V0h240z"/></g></g><defs><clipPath id="clip0_1401_86274"><path fill="#fff" d="M0 0h240v300H0z"/></clipPath></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none"><path d="M14 5.75L20.25 12L14 18.25M19.5 12H3.75" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" viewBox="0 0 24 24"><path fill="currentColor" d="M12 1.95c5.525 0 10 4.476 10 10a10.02 10.02 0 0 1-6.812 9.488c-.5.1-.688-.212-.688-.475 0-.337.012-1.412.012-2.75 0-.937-.312-1.537-.675-1.85 2.226-.25 4.563-1.1 4.563-4.937 0-1.1-.387-1.988-1.025-2.688.1-.25.45-1.275-.1-2.65 0 0-.837-.275-2.75 1.025a9.3 9.3 0 0 0-2.5-.337c-.85 0-1.7.112-2.5.337-1.913-1.287-2.75-1.025-2.75-1.025-.55 1.375-.2 2.4-.1 2.65-.638.7-1.025 1.6-1.025 2.688 0 3.825 2.325 4.687 4.55 4.937-.287.25-.55.688-.637 1.338-.575.262-2.013.687-2.913-.825-.187-.3-.75-1.038-1.538-1.025-.837.012-.337.475.013.662.425.238.912 1.125 1.025 1.413.2.562.85 1.637 3.362 1.175 0 .837.013 1.625.013 1.862 0 .263-.187.563-.687.475A9.99 9.99 0 0 1 2 11.951c0-5.525 4.475-10 10-10"/></svg>
@@ -0,0 +1 @@
1
+ <div data-framer-component-type="SVG" data-framer-name="icon" parentsize="0" _constraints="[object Object]" rotation="0" shadows="" class="framer-kj98oh" aria-hidden="true" style="image-rendering: pixelated; flex-shrink: 0; background-size: 100% 100%; background-image: url(&quot;data:image/svg+xml,&lt;svg xmlns=%22http://www.w3.org/2000/svg%22 xmlns:xlink=%22http://www.w3.org/1999/xlink%22 viewBox=%220 0 10 9.993%22 overflow=%22visible%22&gt;&lt;g opacity=%220.5%22&gt;&lt;path d=%22M 4.293 0 C 4.526 0 4.715 0.189 4.715 0.422 C 4.715 0.655 4.526 0.845 4.293 0.845 L 1.83 0.845 C 1.286 0.845 0.845 1.286 0.845 1.83 L 0.845 8.164 C 0.845 8.708 1.286 9.149 1.83 9.149 L 8.164 9.149 C 8.708 9.149 9.149 8.708 9.149 8.164 L 9.149 5.7 C 9.149 5.467 9.338 5.278 9.571 5.278 C 9.804 5.278 9.993 5.467 9.993 5.7 L 9.993 8.164 C 9.993 9.174 9.174 9.993 8.164 9.993 L 1.83 9.993 C 0.819 9.993 0 9.174 0 8.164 L 0 1.83 C 0 0.819 0.819 0 1.83 0 Z%22 fill=%22rgb(38,41,48)%22&gt;&lt;/path&gt;&lt;path d=%22M 6.34 0.422 C 6.34 0.655 6.53 0.845 6.763 0.845 L 8.558 0.845 L 5.76 3.643 C 5.65 3.749 5.605 3.906 5.644 4.054 C 5.682 4.202 5.798 4.318 5.946 4.356 C 6.094 4.395 6.252 4.35 6.357 4.239 L 9.155 1.442 L 9.155 3.237 C 9.155 3.47 9.345 3.66 9.578 3.66 C 9.811 3.66 10 3.47 10 3.237 L 10 0.422 C 10 0.189 9.811 0 9.578 0 L 6.763 0 C 6.53 0 6.34 0.189 6.34 0.422 Z%22 fill=%22rgb(38,41,48)%22&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&quot;); opacity: 0.5;"></div>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="47" height="10" fill="none" viewBox="0 0 47 10"><path fill="#fff" d="M42.857 9.511a2.55 2.55 0 0 1-1.453-.443q-.626-.434-.98-1.202-.354-.767-.354-1.764 0-.993.371-1.747.37-.758 1.01-1.185a2.55 2.55 0 0 1 1.445-.426q.553 0 .988.205.435.2.746.566.31.363.503.848h.494l.354 1.722.818 3.29h-1.244l-.767-3.29a5 5 0 0 0-.188-.678 3.3 3.3 0 0 0-.32-.677 1.7 1.7 0 0 0-.49-.52 1.2 1.2 0 0 0-.694-.2q-.465 0-.805.268-.337.264-.525.737a3 3 0 0 0-.183 1.083q0 .609.18 1.095.182.481.51.759.33.272.759.272.388 0 .686-.204.299-.21.511-.533.213-.328.35-.69a5 5 0 0 0 .209-.678l.694-3.29h1.232l-.733 3.29-.354 1.713h-.464a3.1 3.1 0 0 1-.503.87q-.311.378-.759.596a2.3 2.3 0 0 1-1.044.213M36.773 2.83h1.509l-.013 4.64q.005.414.2.546.196.127.508.127.157 0 .29-.017.131-.015.217-.034v1.206a3 3 0 0 1-.444.107 3 3 0 0 1-.558.047q-.77 0-1.24-.422-.469-.421-.469-1.42zm.269-.814L37.438 0h1.445l-.9 2.016zM31.576 9.49q-.771 0-1.38-.396-.61-.396-.963-1.15-.354-.755-.354-1.833 0-1.09.358-1.84.362-.755.976-1.139.613-.387 1.368-.387.574 0 .946.196.37.19.588.464.218.268.336.507h.064V.648h1.547v8.727h-1.517V8.344h-.094q-.12.24-.345.507a1.9 1.9 0 0 1-.596.452q-.372.187-.934.187m.43-1.265q.492 0 .836-.265.345-.268.524-.745a3.2 3.2 0 0 0 .18-1.112q0-.636-.18-1.104a1.57 1.57 0 0 0-.52-.729q-.34-.26-.84-.26-.515 0-.86.269-.346.269-.52.741a3.1 3.1 0 0 0-.175 1.083q0 .614.175 1.095.18.478.524.754.35.273.857.273m-7.305 1.278q-.96 0-1.662-.422a2.86 2.86 0 0 1-1.091-1.18q-.384-.759-.384-1.773 0-1.015.384-1.777a2.86 2.86 0 0 1 1.09-1.185q.705-.422 1.663-.422t1.662.422a2.83 2.83 0 0 1 1.086 1.185q.388.762.388 1.777T27.45 7.9q-.383.76-1.086 1.18-.703.423-1.662.423m.008-1.236q.52 0 .87-.286a1.7 1.7 0 0 0 .52-.775 3.2 3.2 0 0 0 .174-1.083q0-.6-.175-1.086a1.7 1.7 0 0 0-.52-.78q-.348-.29-.869-.29-.532 0-.886.29a1.75 1.75 0 0 0-.524.78q-.17.486-.17 1.086 0 .597.17 1.083.174.486.524.775.354.286.886.286M16.077 5.54v3.835h-1.543V2.829h1.475v1.113h.076q.225-.55.72-.874.499-.324 1.232-.324.678 0 1.18.29.507.29.785.84.281.549.277 1.333v4.168h-1.543v-3.93q0-.655-.341-1.026-.336-.37-.933-.37-.405 0-.72.178a1.24 1.24 0 0 0-.49.507q-.175.333-.175.806m-7.313 0v3.835H7.222V2.829h1.474v1.113h.077q.225-.55.72-.874.498-.324 1.232-.324.677 0 1.18.29.507.29.784.84.282.549.277 1.333v4.168h-1.543v-3.93q0-.655-.34-1.026-.337-.37-.934-.37-.405 0-.72.178a1.24 1.24 0 0 0-.49.507q-.175.333-.175.806M0 9.375V.648h5.676v1.325H1.581v2.37h3.801v1.325H1.581V8.05h4.13v1.325z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="47" height="10" fill="none" viewBox="0 0 47 10"><path fill="#000" d="M42.857 9.511a2.55 2.55 0 0 1-1.453-.443q-.626-.434-.98-1.202-.354-.767-.354-1.764 0-.993.371-1.747.37-.758 1.01-1.185a2.55 2.55 0 0 1 1.445-.426q.553 0 .988.205.435.2.746.566.31.363.503.848h.494l.354 1.722.818 3.29h-1.244l-.767-3.29a5 5 0 0 0-.188-.678 3.3 3.3 0 0 0-.32-.677 1.7 1.7 0 0 0-.49-.52 1.2 1.2 0 0 0-.694-.2q-.465 0-.805.268-.337.264-.525.737a3 3 0 0 0-.183 1.083q0 .609.18 1.095.182.481.51.759.33.272.759.272.388 0 .686-.204.299-.21.511-.533.213-.328.35-.69a5 5 0 0 0 .209-.678l.694-3.29h1.232l-.733 3.29-.354 1.713h-.464a3.1 3.1 0 0 1-.503.87q-.311.378-.759.596a2.3 2.3 0 0 1-1.044.213M36.773 2.83h1.509l-.013 4.64q.005.414.2.546.196.127.508.127.157 0 .29-.017.131-.015.217-.034v1.206a3 3 0 0 1-.444.107 3 3 0 0 1-.558.047q-.77 0-1.24-.422-.469-.421-.469-1.42zm.269-.814L37.438 0h1.445l-.9 2.016zM31.576 9.49q-.771 0-1.38-.396-.61-.396-.963-1.15-.354-.755-.354-1.833 0-1.09.358-1.84.362-.755.976-1.139.613-.387 1.368-.387.574 0 .946.196.37.19.588.464.218.268.336.507h.064V.648h1.547v8.727h-1.517V8.344h-.094q-.12.24-.345.507a1.9 1.9 0 0 1-.596.452q-.372.187-.934.187m.43-1.265q.492 0 .836-.265.345-.268.524-.745a3.2 3.2 0 0 0 .18-1.112q0-.636-.18-1.104a1.57 1.57 0 0 0-.52-.729q-.34-.26-.84-.26-.515 0-.86.269-.346.269-.52.741a3.1 3.1 0 0 0-.175 1.083q0 .614.175 1.095.18.478.524.754.35.273.857.273m-7.305 1.278q-.96 0-1.662-.422a2.86 2.86 0 0 1-1.091-1.18q-.384-.759-.384-1.773 0-1.015.384-1.777a2.86 2.86 0 0 1 1.09-1.185q.705-.422 1.663-.422t1.662.422a2.83 2.83 0 0 1 1.086 1.185q.388.762.388 1.777T27.45 7.9q-.383.76-1.086 1.18-.703.423-1.662.423m.008-1.236q.52 0 .87-.286a1.7 1.7 0 0 0 .52-.775 3.2 3.2 0 0 0 .174-1.083q0-.6-.175-1.086a1.7 1.7 0 0 0-.52-.78q-.348-.29-.869-.29-.532 0-.886.29a1.75 1.75 0 0 0-.524.78q-.17.486-.17 1.086 0 .597.17 1.083.174.486.524.775.354.286.886.286M16.077 5.54v3.835h-1.543V2.829h1.475v1.113h.076q.225-.55.72-.874.499-.324 1.232-.324.678 0 1.18.29.507.29.785.84.281.549.277 1.333v4.168h-1.543v-3.93q0-.655-.341-1.026-.336-.37-.933-.37-.405 0-.72.178a1.24 1.24 0 0 0-.49.507q-.175.333-.175.806m-7.313 0v3.835H7.222V2.829h1.474v1.113h.077q.225-.55.72-.874.498-.324 1.232-.324.677 0 1.18.29.507.29.784.84.282.549.277 1.333v4.168h-1.543v-3.93q0-.655-.34-1.026-.337-.37-.934-.37-.405 0-.72.178a1.24 1.24 0 0 0-.49.507q-.175.333-.175.806M0 9.375V.648h5.676v1.325H1.581v2.37h3.801v1.325H1.581V8.05h4.13v1.325z"/></svg>
@@ -0,0 +1,74 @@
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
+ <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>
4
+ <defs>
5
+ <marker id="arrow" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
6
+ <path d="M 0 0 L 10 5 L 0 10 z" fill="#7aa7ff" />
7
+ </marker>
8
+ <style>
9
+ .canvas { fill: #0d1117; }
10
+ .node { fill: #172131; stroke: #314157; stroke-width: 2; }
11
+ .hub { fill: #10251f; stroke: #65d0b6; stroke-width: 2; }
12
+ .label { fill: #f3f6fb; font: 700 21px system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
13
+ .small { fill: #a9b4c2; font: 500 15px system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
14
+ .line { stroke: #7aa7ff; stroke-width: 3; fill: none; marker-end: url(#arrow); }
15
+ .accent { fill: #65d0b6; }
16
+ .gold { fill: #ffd166; }
17
+ </style>
18
+ </defs>
19
+ <rect class="canvas" width="1100" height="500" rx="24" />
20
+
21
+ <g>
22
+ <rect class="node" x="42" y="207" width="130" height="86" rx="14" />
23
+ <text class="label" x="107" y="242" text-anchor="middle">Request</text>
24
+ <text class="small" x="107" y="267" text-anchor="middle">code review</text>
25
+ </g>
26
+ <path class="line" d="M 172 250 H 226" />
27
+
28
+ <g>
29
+ <rect class="node" x="236" y="207" width="130" height="86" rx="14" />
30
+ <text class="label" x="301" y="242" text-anchor="middle">Classify</text>
31
+ <text class="small" x="301" y="267" text-anchor="middle">task shape</text>
32
+ </g>
33
+ <path class="line" d="M 366 250 H 420" />
34
+
35
+ <g>
36
+ <rect class="hub" x="430" y="207" width="130" height="86" rx="14" />
37
+ <text class="label" x="495" y="242" text-anchor="middle">Rules</text>
38
+ <text class="small" x="495" y="267" text-anchor="middle">route tools</text>
39
+ </g>
40
+
41
+ <path class="line" d="M 560 231 C 602 175, 629 150, 680 140" />
42
+ <path class="line" d="M 560 269 C 602 325, 629 350, 680 360" />
43
+
44
+ <g>
45
+ <rect class="node" x="690" y="97" width="130" height="86" rx="14" />
46
+ <circle class="accent" cx="716" cy="140" r="8" />
47
+ <text class="label" x="765" y="135" text-anchor="middle">Claude</text>
48
+ <text class="small" x="765" y="160" text-anchor="middle">Code</text>
49
+ </g>
50
+
51
+ <g>
52
+ <rect class="node" x="690" y="317" width="130" height="86" rx="14" />
53
+ <circle class="gold" cx="716" cy="360" r="8" />
54
+ <text class="label" x="765" y="355" text-anchor="middle">Codex</text>
55
+ <text class="small" x="765" y="380" text-anchor="middle">CLI</text>
56
+ </g>
57
+
58
+ <path class="line" d="M 820 140 C 856 159, 872 185, 884 217" />
59
+ <path class="line" d="M 820 360 C 856 341, 872 315, 884 283" />
60
+
61
+ <g>
62
+ <rect class="hub" x="890" y="207" width="130" height="86" rx="14" />
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>
65
+ </g>
66
+
67
+ <path class="line" d="M 955 293 V 342" />
68
+ <g>
69
+ <rect class="node" x="890" y="352" width="130" height="70" rx="14" />
70
+ <text class="label" x="955" y="394" text-anchor="middle">Review</text>
71
+ </g>
72
+
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
+ </svg>
@@ -0,0 +1,107 @@
1
+ ---
2
+ title: Getting started
3
+ description: Install Ennodia, connect it to an MCP client, and run the first checks.
4
+ ---
5
+
6
+ Ennodia runs locally as a stdio MCP server. The MCP client starts Ennodia, then
7
+ calls tools such as `ennodia_list_harnesses`, `ennodia_plan`, and `ennodia_run`.
8
+
9
+ ## Requirements
10
+
11
+ - Bun `1.3.14` or newer
12
+ - At least one supported AI command line tool if you want real agent execution
13
+ - An MCP client that can launch a stdio server
14
+
15
+ The current adapters detect:
16
+
17
+ - Codex CLI
18
+ - Claude Code
19
+ - OpenCode
20
+ - Antigravity
21
+
22
+ ## Local checkout
23
+
24
+ Use the repository directly until the npm package is published:
25
+
26
+ ```sh
27
+ git clone https://github.com/cherninlab/ennodia
28
+ cd ennodia
29
+ bun install
30
+ bun run verify
31
+ ```
32
+
33
+ ## Install from npm
34
+
35
+ After the first package publish, prerelease builds use the `next` dist-tag:
36
+
37
+ ```sh
38
+ bunx ennodia@next
39
+ ```
40
+
41
+ `npx ennodia@next` can also launch Ennodia when `bun` is already available on
42
+ `PATH`.
43
+
44
+ ## MCP client config
45
+
46
+ Use this after the npm package is published:
47
+
48
+ ```json
49
+ {
50
+ "mcpServers": {
51
+ "ennodia": {
52
+ "command": "bunx",
53
+ "args": ["ennodia@next"]
54
+ }
55
+ }
56
+ }
57
+ ```
58
+
59
+ For local development from a checkout:
60
+
61
+ ```json
62
+ {
63
+ "mcpServers": {
64
+ "ennodia": {
65
+ "command": "bun",
66
+ "args": ["run", "/absolute/path/to/ennodia/src/index.ts"]
67
+ }
68
+ }
69
+ }
70
+ ```
71
+
72
+ Replace `/absolute/path/to/ennodia` with your local repo path.
73
+
74
+ ## First checks
75
+
76
+ From the repo:
77
+
78
+ ```bash
79
+ bun install
80
+ bun run mcp:smoke
81
+ bun run verify
82
+ ```
83
+
84
+ From an MCP client, start with:
85
+
86
+ 1. `ennodia_list_harnesses`
87
+ 2. `ennodia_plan`
88
+ 3. `ennodia_run`
89
+
90
+ `ennodia_run` is the main end-to-end entrypoint. It plans the route, starts the
91
+ selected task or tasks, optionally compares successful outputs, and returns one
92
+ final answer.
93
+
94
+ ## Expected behavior
95
+
96
+ An Ennodia run is meant to be visible. You should be able to inspect:
97
+
98
+ - selected harnesses
99
+ - child task IDs
100
+ - task status
101
+ - stdout and stderr previews
102
+ - elapsed time and timeout budget
103
+ - Compare state, if Compare was used
104
+ - final answer or explicit failure reason
105
+
106
+ If a child tool times out or fails, Ennodia should report that state instead of
107
+ hiding it.
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: How Ennodia works
3
+ description: A visible orchestration pipeline for routing, task watching, recovery, Compare, and final synthesis.
4
+ ---
5
+
6
+ When an MCP client submits a high-level run, Ennodia processes it through a
7
+ visible orchestration pipeline. The `ennodia_run` tool is the current end-to-end
8
+ entrypoint. Lower-level task and Compare tools stay available for debugging and
9
+ manual control.
10
+
11
+ ### 1. Discover
12
+
13
+ Ennodia maintains a registry of execution backends. The current adapters cover
14
+ Claude Code, Codex CLI, OpenCode, and Antigravity. Each adapter is intentionally
15
+ thin: it reports whether the tool is available, identifies the installed
16
+ version, and starts the tool through its supported command-line surface.
17
+
18
+ ### 2. Plan
19
+
20
+ The router combines task classification, available harnesses, and simple project
21
+ rules to decide where work should go.
22
+
23
+ For example:
24
+
25
+ ![A code-review request is classified, routed through project rules to Claude Code and Codex CLI, compared, resolved, and returned as a final review.](../assets/orchestration-pipeline.svg)
26
+
27
+ ### 3. Execute
28
+
29
+ Each node in the graph is dispatched through a thin adapter. Ennodia keeps the
30
+ shared task lifecycle outside the adapter: process start, output capture,
31
+ timeout handling, cancellation, and terminal status all live in core modules.
32
+
33
+ ### 4. Watch
34
+
35
+ Every external command becomes a tracked child task. A task is not terminal until
36
+ the child process exits and captured output has drained.
37
+
38
+ ### 5. Recover
39
+
40
+ Failure handling is part of the execution plan. Nodes can time out, fail, be
41
+ cancelled, or return partial output without hiding what happened.
42
+
43
+
44
+ ### 6. Compare
45
+
46
+ When several agents produce answers, Ennodia does not concatenate them. A judge
47
+ can produce a structured comparison: consensus, contradictions, unique insights,
48
+ blind spots, and risks. A synthesizer then uses that comparison and the original
49
+ outputs to create the final result.
50
+
51
+ ### 7. Return
52
+
53
+ The MCP client receives the final output, while Ennodia retains the complete execution record.
@@ -0,0 +1,120 @@
1
+ ---
2
+ title: Releasing Ennodia
3
+ description: Release gates and first-RC publishing steps for Ennodia.
4
+ ---
5
+
6
+ Ennodia releases are intentionally conservative. A release should prove that the
7
+ MCP server starts through the packaged CLI, reports the correct version, and does
8
+ not publish private repo scaffolding.
9
+
10
+ ## Versioning
11
+
12
+ The first release candidate is `0.1.0-rc.0`.
13
+
14
+ Prerelease versions are published under npm's `next` dist-tag. Stable versions
15
+ will use `latest`. The same version is also published to JSR as
16
+ `@cherninlab/ennodia`.
17
+
18
+ The package version is tracked in `package.json`, `jsr.json`, and
19
+ `src/version.ts`. `bun test` verifies that they match.
20
+
21
+ ## Local gates
22
+
23
+ Run the full gate before tagging or publishing:
24
+
25
+ ```bash
26
+ bun run release:check
27
+ ```
28
+
29
+ That runs:
30
+
31
+ - `bun run verify`
32
+ - `npm pack --dry-run`
33
+ - `npx jsr publish --dry-run --allow-dirty`
34
+ - `bun run src/dev/package-smoke.ts`
35
+
36
+ The package smoke creates a temporary tarball, checks the packed file list, and
37
+ performs an MCP initialize handshake through `bunx`, `npm exec`, and `npx`.
38
+ The JSR dry-run validates the TypeScript source package without publishing it.
39
+
40
+ ## Public repo gate
41
+
42
+ Before changing the GitHub repository to public, run a history scan:
43
+
44
+ ```bash
45
+ git log --all -p | grep -iE '(token|secret|api.key|password)' | head -40
46
+ git log --all --full-history -- ".env*"
47
+ ```
48
+
49
+ Every hit must be a false positive or removed from history before publication.
50
+
51
+ ## First RC publish
52
+
53
+ 1. Confirm the npm name is still available:
54
+
55
+ ```bash
56
+ npm info ennodia
57
+ ```
58
+
59
+ `E404` means the name is not currently published.
60
+
61
+ 2. Run the release gate:
62
+
63
+ ```bash
64
+ bun run release:check
65
+ ```
66
+
67
+ 3. Make the GitHub repository public. npm provenance for public packages requires
68
+ a public source repository.
69
+
70
+ 4. Create the JSR scope/package if needed:
71
+
72
+ - Scope: `@cherninlab`
73
+ - Package: `ennodia`
74
+ - Linked GitHub repository: `cherninlab/ennodia`
75
+
76
+ JSR publishing from GitHub Actions uses OIDC, so it does not require a
77
+ registry token. The package must be linked to this GitHub repository in JSR
78
+ before the workflow can publish it.
79
+
80
+ 5. For the first publish, use the `Release` GitHub Actions workflow with
81
+ `dry_run` disabled. Because npm trusted publishing requires the package to
82
+ already exist, the first publish can use a granular `NPM_TOKEN` secret with
83
+ publish permission. JSR uses the workflow's `id-token: write` permission
84
+ instead of a long-lived secret.
85
+
86
+ 6. After the first publish, configure npm trusted publishing for this package:
87
+
88
+ - Provider: GitHub Actions
89
+ - Organization or user: `cherninlab`
90
+ - Repository: `ennodia`
91
+ - Workflow filename: `release.yml`
92
+ - Allowed action: `npm publish`
93
+
94
+ 7. After a trusted-publishing release succeeds, delete or rotate the first-publish
95
+ `NPM_TOKEN`.
96
+
97
+ ## Tagging
98
+
99
+ For the first RC:
100
+
101
+ ```bash
102
+ git tag v0.1.0-rc.0
103
+ git push origin v0.1.0-rc.0
104
+ ```
105
+
106
+ Tags containing a hyphen publish to `next`. Tags without a hyphen publish to
107
+ `latest`. JSR uses the exact SemVer version from `jsr.json`; it does not use
108
+ npm dist-tags.
109
+
110
+ ## Do not include in the package
111
+
112
+ The published tarball must not contain:
113
+
114
+ - `.github/`
115
+ - `AGENTS.md`
116
+ - `CLAUDE.md`
117
+ - `bun.lock`
118
+ - `src/dev/`
119
+ - `*.test.ts`
120
+ - `website/`
package/docs/index.md ADDED
@@ -0,0 +1,16 @@
1
+ ---
2
+ title: Documentation
3
+ description: Start here for Ennodia setup, tools, architecture, and release notes.
4
+ ---
5
+
6
+ Ennodia is a Bun-first MCP server for mid-task peer review between AI agents.
7
+
8
+ Use these pages first:
9
+
10
+ - [Getting started](./getting-started/)
11
+ - [MCP tools](./reference/mcp-tools/)
12
+ - [How Ennodia works](./in-depth/architecture/)
13
+ - [Releasing Ennodia](./in-depth/releasing/)
14
+
15
+ The short version: connect Ennodia as a stdio MCP server, ask it to route work
16
+ to available local AI tools, then inspect the run trace and final synthesis.
@@ -0,0 +1,104 @@
1
+ ---
2
+ title: MCP tools
3
+ description: The public MCP tool surface exposed by Ennodia.
4
+ ---
5
+
6
+ This page describes the MCP tools exposed by the Ennodia server.
7
+
8
+ ## Shared behavior
9
+
10
+ `ennodia_plan`, `ennodia_start`, and `ennodia_run` use a lightweight keyword
11
+ classifier to choose a route. Call `ennodia_plan` first when you want to inspect
12
+ that decision without starting a child process. Pass `harnessId` to
13
+ `ennodia_start` or `ennodia_run` when you want to override routing.
14
+
15
+ Harness discovery is cached briefly. Tools that accept `refresh` can set it to
16
+ `true` to re-scan local command paths and versions before planning or starting
17
+ work.
18
+
19
+ Fields named `maxOutputChars`, `maxAnswerChars`, or `maxCandidateChars` bound
20
+ returned text. A value of `0` omits that text while still returning status,
21
+ IDs, timing, and counts.
22
+
23
+ ## Discovery and planning
24
+
25
+ ### `ennodia_list_harnesses`
26
+
27
+ Detects supported local AI tools and reports whether each one is runnable.
28
+
29
+ Use this first when debugging a client setup.
30
+
31
+ ### `ennodia_plan`
32
+
33
+ Classifies a prompt and previews the route Ennodia would take with the currently
34
+ available harnesses.
35
+
36
+ This does not start a child process.
37
+
38
+ ## End-to-end runs
39
+
40
+ ### `ennodia_run`
41
+
42
+ Plans a request, starts selected child tasks, optionally compares successful
43
+ outputs, and returns a monitorable run ID.
44
+
45
+ This is the main high-level tool.
46
+
47
+ ### `ennodia_get_run`
48
+
49
+ Returns run status, selected harnesses, child task IDs, Compare ID, events,
50
+ timing, ETA, and the final answer when available.
51
+
52
+ ### `ennodia_cancel_run`
53
+
54
+ Cancels a high-level run and any active child task or Compare.
55
+
56
+ Cancellation is explicit: a cancelled run should not be reported as a normal
57
+ model failure.
58
+
59
+ ### `ennodia_list_runs`
60
+
61
+ Lists runs started by the current Ennodia MCP server process.
62
+
63
+ ## Direct tasks
64
+
65
+ ### `ennodia_start`
66
+
67
+ Starts one or more local AI tool tasks and returns task IDs for monitoring.
68
+
69
+ Use this when you want direct task control instead of the full run orchestration.
70
+ Use `ennodia_run` for the normal end-to-end path.
71
+
72
+ ### `ennodia_get_task`
73
+
74
+ Returns task status, captured output, events, timing, and ETA.
75
+
76
+ ### `ennodia_cancel_task`
77
+
78
+ Cancels a running task by task ID.
79
+
80
+ ### `ennodia_list_tasks`
81
+
82
+ Lists tasks started by the current Ennodia MCP server process.
83
+
84
+ ## Compare
85
+
86
+ ### `ennodia_start_compare`
87
+
88
+ Runs a judge and synthesizer over completed task outputs or supplied responses.
89
+
90
+ Compare is useful when you already have several answers and want a structured
91
+ review of agreement, disagreement, unique insights, blind spots, and risks.
92
+
93
+ ### `ennodia_get_compare`
94
+
95
+ Returns Compare status, candidate inputs, judge analysis, synthesis, child task
96
+ IDs, timing, and ETA.
97
+
98
+ ### `ennodia_cancel_compare`
99
+
100
+ Cancels a running Compare and its active child task.
101
+
102
+ ### `ennodia_list_compares`
103
+
104
+ Lists Compare runs started by the current Ennodia MCP server process.