xorcise 0.1.0__tar.gz

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 (803) hide show
  1. xorcise-0.1.0/.env.example +34 -0
  2. xorcise-0.1.0/.github/CODEOWNERS +26 -0
  3. xorcise-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +126 -0
  4. xorcise-0.1.0/.github/ISSUE_TEMPLATE/config.yml +26 -0
  5. xorcise-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +85 -0
  6. xorcise-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +90 -0
  7. xorcise-0.1.0/.github/codeql/codeql-config.yml +11 -0
  8. xorcise-0.1.0/.github/dependabot.yml +101 -0
  9. xorcise-0.1.0/.github/release.yml +56 -0
  10. xorcise-0.1.0/.github/workflows/ci.yml +470 -0
  11. xorcise-0.1.0/.github/workflows/codeql.yml +58 -0
  12. xorcise-0.1.0/.github/workflows/nightly.yml +231 -0
  13. xorcise-0.1.0/.github/workflows/release.yml +300 -0
  14. xorcise-0.1.0/.gitignore +51 -0
  15. xorcise-0.1.0/.importlinter +91 -0
  16. xorcise-0.1.0/.pre-commit-config.yaml +32 -0
  17. xorcise-0.1.0/.python-version +1 -0
  18. xorcise-0.1.0/CHANGELOG.md +50 -0
  19. xorcise-0.1.0/CLAUDE.md +55 -0
  20. xorcise-0.1.0/CODE_OF_CONDUCT.md +132 -0
  21. xorcise-0.1.0/CONTRIBUTING.md +234 -0
  22. xorcise-0.1.0/Dockerfile +24 -0
  23. xorcise-0.1.0/LICENSE +196 -0
  24. xorcise-0.1.0/MAINTAINERS.md +43 -0
  25. xorcise-0.1.0/PKG-INFO +177 -0
  26. xorcise-0.1.0/README.md +129 -0
  27. xorcise-0.1.0/ROLE_MANIFEST.toml +60 -0
  28. xorcise-0.1.0/SECURITY.md +129 -0
  29. xorcise-0.1.0/alembic.ini +11 -0
  30. xorcise-0.1.0/assets/lockup-horizontal-amber.svg +20 -0
  31. xorcise-0.1.0/assets/mark-amber.svg +4 -0
  32. xorcise-0.1.0/assets/readme-banner.svg +51 -0
  33. xorcise-0.1.0/containers/README.md +11 -0
  34. xorcise-0.1.0/containers/mission-base/Dockerfile +19 -0
  35. xorcise-0.1.0/containers/mission-base/entrypoint.sh +48 -0
  36. xorcise-0.1.0/deploy/README.md +13 -0
  37. xorcise-0.1.0/deploy/compose/profiles/README.md +20 -0
  38. xorcise-0.1.0/deploy/compose/profiles/all.yaml +5 -0
  39. xorcise-0.1.0/deploy/compose/profiles/collector.yaml +5 -0
  40. xorcise-0.1.0/deploy/compose/profiles/control.yaml +5 -0
  41. xorcise-0.1.0/deploy/compose/profiles/headscale.yaml +5 -0
  42. xorcise-0.1.0/deploy/compose/profiles/runner.yaml +5 -0
  43. xorcise-0.1.0/frontend/.gitignore +6 -0
  44. xorcise-0.1.0/frontend/.nvmrc +1 -0
  45. xorcise-0.1.0/frontend/.typeaudit.mjs +61 -0
  46. xorcise-0.1.0/frontend/README.md +44 -0
  47. xorcise-0.1.0/frontend/e2e/.gitkeep +0 -0
  48. xorcise-0.1.0/frontend/e2e/core-flow.spec.ts +72 -0
  49. xorcise-0.1.0/frontend/e2e/server-unreachable.spec.ts +29 -0
  50. xorcise-0.1.0/frontend/next-env.d.ts +6 -0
  51. xorcise-0.1.0/frontend/next.config.ts +10 -0
  52. xorcise-0.1.0/frontend/openapi.json +6175 -0
  53. xorcise-0.1.0/frontend/package-lock.json +5716 -0
  54. xorcise-0.1.0/frontend/package.json +46 -0
  55. xorcise-0.1.0/frontend/playwright.config.ts +22 -0
  56. xorcise-0.1.0/frontend/postcss.config.mjs +7 -0
  57. xorcise-0.1.0/frontend/scripts/dump_openapi.py +27 -0
  58. xorcise-0.1.0/frontend/src/app/README.md +18 -0
  59. xorcise-0.1.0/frontend/src/app/agents/detail/agent-detail-from-query.tsx +11 -0
  60. xorcise-0.1.0/frontend/src/app/agents/detail/page.tsx +13 -0
  61. xorcise-0.1.0/frontend/src/app/agents/new/page.tsx +13 -0
  62. xorcise-0.1.0/frontend/src/app/agents/new/register-from-query.tsx +11 -0
  63. xorcise-0.1.0/frontend/src/app/agents/page.tsx +8 -0
  64. xorcise-0.1.0/frontend/src/app/dashboard.test.tsx +108 -0
  65. xorcise-0.1.0/frontend/src/app/globals.css +490 -0
  66. xorcise-0.1.0/frontend/src/app/home-router.tsx +34 -0
  67. xorcise-0.1.0/frontend/src/app/home-routing.test.tsx +84 -0
  68. xorcise-0.1.0/frontend/src/app/icon.svg +8 -0
  69. xorcise-0.1.0/frontend/src/app/layout.tsx +36 -0
  70. xorcise-0.1.0/frontend/src/app/missions/detail/mission-detail-from-query.tsx +11 -0
  71. xorcise-0.1.0/frontend/src/app/missions/detail/page.tsx +13 -0
  72. xorcise-0.1.0/frontend/src/app/missions/page.tsx +8 -0
  73. xorcise-0.1.0/frontend/src/app/not-found.tsx +7 -0
  74. xorcise-0.1.0/frontend/src/app/page.tsx +14 -0
  75. xorcise-0.1.0/frontend/src/app/providers.tsx +11 -0
  76. xorcise-0.1.0/frontend/src/app/results/page.tsx +10 -0
  77. xorcise-0.1.0/frontend/src/app/runs/live/page.tsx +13 -0
  78. xorcise-0.1.0/frontend/src/app/runs/live/run-live-from-query.tsx +11 -0
  79. xorcise-0.1.0/frontend/src/app/runs/new/new-run-from-query.tsx +18 -0
  80. xorcise-0.1.0/frontend/src/app/runs/new/page.tsx +13 -0
  81. xorcise-0.1.0/frontend/src/app/runs/page.tsx +8 -0
  82. xorcise-0.1.0/frontend/src/app/runs/result/page.tsx +13 -0
  83. xorcise-0.1.0/frontend/src/app/runs/result/result-from-query.tsx +11 -0
  84. xorcise-0.1.0/frontend/src/app/settings/page.tsx +8 -0
  85. xorcise-0.1.0/frontend/src/app/setup/page.tsx +10 -0
  86. xorcise-0.1.0/frontend/src/components/README.md +10 -0
  87. xorcise-0.1.0/frontend/src/components/layout/app-shell.test.tsx +73 -0
  88. xorcise-0.1.0/frontend/src/components/layout/app-shell.tsx +48 -0
  89. xorcise-0.1.0/frontend/src/components/layout/header.tsx +45 -0
  90. xorcise-0.1.0/frontend/src/components/layout/nav-items.ts +31 -0
  91. xorcise-0.1.0/frontend/src/components/layout/not-found-state.test.tsx +41 -0
  92. xorcise-0.1.0/frontend/src/components/layout/not-found-state.tsx +32 -0
  93. xorcise-0.1.0/frontend/src/components/layout/page.tsx +101 -0
  94. xorcise-0.1.0/frontend/src/components/layout/server-unreachable.tsx +19 -0
  95. xorcise-0.1.0/frontend/src/components/layout/sidebar.tsx +107 -0
  96. xorcise-0.1.0/frontend/src/components/layout/status-bar.tsx +70 -0
  97. xorcise-0.1.0/frontend/src/components/ui/badge.tsx +43 -0
  98. xorcise-0.1.0/frontend/src/components/ui/button.tsx +56 -0
  99. xorcise-0.1.0/frontend/src/components/ui/card.tsx +45 -0
  100. xorcise-0.1.0/frontend/src/components/ui/cn.test.ts +51 -0
  101. xorcise-0.1.0/frontend/src/components/ui/cn.ts +30 -0
  102. xorcise-0.1.0/frontend/src/components/ui/coming-soon.tsx +98 -0
  103. xorcise-0.1.0/frontend/src/components/ui/copy-button.test.tsx +21 -0
  104. xorcise-0.1.0/frontend/src/components/ui/copy-button.tsx +60 -0
  105. xorcise-0.1.0/frontend/src/components/ui/dialog.test.tsx +50 -0
  106. xorcise-0.1.0/frontend/src/components/ui/dialog.tsx +65 -0
  107. xorcise-0.1.0/frontend/src/components/ui/input.tsx +23 -0
  108. xorcise-0.1.0/frontend/src/components/ui/loading.tsx +23 -0
  109. xorcise-0.1.0/frontend/src/components/ui/new-primitives.test.tsx +45 -0
  110. xorcise-0.1.0/frontend/src/components/ui/primitives.test.tsx +38 -0
  111. xorcise-0.1.0/frontend/src/components/ui/progress.tsx +40 -0
  112. xorcise-0.1.0/frontend/src/components/ui/reveal.test.tsx +34 -0
  113. xorcise-0.1.0/frontend/src/components/ui/reveal.tsx +31 -0
  114. xorcise-0.1.0/frontend/src/components/ui/separator.tsx +25 -0
  115. xorcise-0.1.0/frontend/src/components/ui/skeleton.test.tsx +32 -0
  116. xorcise-0.1.0/frontend/src/components/ui/skeleton.tsx +70 -0
  117. xorcise-0.1.0/frontend/src/components/ui/slider.test.tsx +24 -0
  118. xorcise-0.1.0/frontend/src/components/ui/slider.tsx +41 -0
  119. xorcise-0.1.0/frontend/src/components/ui/switch.test.tsx +29 -0
  120. xorcise-0.1.0/frontend/src/components/ui/switch.tsx +41 -0
  121. xorcise-0.1.0/frontend/src/components/ui/table.tsx +38 -0
  122. xorcise-0.1.0/frontend/src/components/ui/tabs.tsx +121 -0
  123. xorcise-0.1.0/frontend/src/components/ui/toast.tsx +67 -0
  124. xorcise-0.1.0/frontend/src/components/ui/use-exit-transition.test.tsx +52 -0
  125. xorcise-0.1.0/frontend/src/components/ui/use-exit-transition.ts +32 -0
  126. xorcise-0.1.0/frontend/src/features/README.md +17 -0
  127. xorcise-0.1.0/frontend/src/features/agents/agent-detail.tsx +157 -0
  128. xorcise-0.1.0/frontend/src/features/agents/agent-list.tsx +340 -0
  129. xorcise-0.1.0/frontend/src/features/agents/agent-performance.test.ts +81 -0
  130. xorcise-0.1.0/frontend/src/features/agents/agent-performance.tsx +261 -0
  131. xorcise-0.1.0/frontend/src/features/agents/agent-run-history.test.tsx +130 -0
  132. xorcise-0.1.0/frontend/src/features/agents/agent-run-history.tsx +214 -0
  133. xorcise-0.1.0/frontend/src/features/agents/agents.test.tsx +368 -0
  134. xorcise-0.1.0/frontend/src/features/agents/delete-agent-dialog.tsx +50 -0
  135. xorcise-0.1.0/frontend/src/features/agents/delete-agent.test.tsx +28 -0
  136. xorcise-0.1.0/frontend/src/features/agents/harness-profile.tsx +382 -0
  137. xorcise-0.1.0/frontend/src/features/agents/harness-selector.test.tsx +88 -0
  138. xorcise-0.1.0/frontend/src/features/agents/harness-selector.tsx +128 -0
  139. xorcise-0.1.0/frontend/src/features/agents/harnesses.test.ts +30 -0
  140. xorcise-0.1.0/frontend/src/features/agents/harnesses.tsx +150 -0
  141. xorcise-0.1.0/frontend/src/features/agents/queries.test.tsx +157 -0
  142. xorcise-0.1.0/frontend/src/features/agents/queries.ts +89 -0
  143. xorcise-0.1.0/frontend/src/features/agents/register-agent-page.test.tsx +535 -0
  144. xorcise-0.1.0/frontend/src/features/agents/register-agent-page.tsx +791 -0
  145. xorcise-0.1.0/frontend/src/features/agents/use-harnesses.ts +16 -0
  146. xorcise-0.1.0/frontend/src/features/capabilities/capabilities.test.tsx +116 -0
  147. xorcise-0.1.0/frontend/src/features/capabilities/capability-dot.tsx +107 -0
  148. xorcise-0.1.0/frontend/src/features/capabilities/capability-gap-notes.test.tsx +72 -0
  149. xorcise-0.1.0/frontend/src/features/capabilities/capability-gap-notes.tsx +73 -0
  150. xorcise-0.1.0/frontend/src/features/capabilities/capability-groups.ts +59 -0
  151. xorcise-0.1.0/frontend/src/features/capabilities/capability-matrix.test.tsx +45 -0
  152. xorcise-0.1.0/frontend/src/features/capabilities/capability-matrix.tsx +154 -0
  153. xorcise-0.1.0/frontend/src/features/capabilities/use-capabilities.ts +25 -0
  154. xorcise-0.1.0/frontend/src/features/dashboard/charts.tsx +79 -0
  155. xorcise-0.1.0/frontend/src/features/dashboard/dashboard-fleet.test.tsx +150 -0
  156. xorcise-0.1.0/frontend/src/features/dashboard/dashboard-view.tsx +63 -0
  157. xorcise-0.1.0/frontend/src/features/dashboard/fleet-metrics.tsx +93 -0
  158. xorcise-0.1.0/frontend/src/features/dashboard/leaderboards.tsx +188 -0
  159. xorcise-0.1.0/frontend/src/features/dashboard/overview.test.tsx +58 -0
  160. xorcise-0.1.0/frontend/src/features/dashboard/overview.tsx +159 -0
  161. xorcise-0.1.0/frontend/src/features/dashboard/recent-runs.tsx +146 -0
  162. xorcise-0.1.0/frontend/src/features/dashboard/use-fleet-performance.ts +137 -0
  163. xorcise-0.1.0/frontend/src/features/file-browser/file-browser.test.tsx +157 -0
  164. xorcise-0.1.0/frontend/src/features/file-browser/file-browser.tsx +220 -0
  165. xorcise-0.1.0/frontend/src/features/file-browser/queries.ts +18 -0
  166. xorcise-0.1.0/frontend/src/features/live-trace/environment-chip.test.tsx +59 -0
  167. xorcise-0.1.0/frontend/src/features/live-trace/live.test.tsx +455 -0
  168. xorcise-0.1.0/frontend/src/features/live-trace/run-agent-name.test.tsx +48 -0
  169. xorcise-0.1.0/frontend/src/features/live-trace/run-live.tsx +607 -0
  170. xorcise-0.1.0/frontend/src/features/live-trace/run-phase.test.ts +128 -0
  171. xorcise-0.1.0/frontend/src/features/live-trace/run-phase.ts +139 -0
  172. xorcise-0.1.0/frontend/src/features/live-trace/run-prompt-card.test.tsx +286 -0
  173. xorcise-0.1.0/frontend/src/features/live-trace/run-prompt-card.tsx +337 -0
  174. xorcise-0.1.0/frontend/src/features/live-trace/run-status.test.tsx +80 -0
  175. xorcise-0.1.0/frontend/src/features/live-trace/run-status.tsx +190 -0
  176. xorcise-0.1.0/frontend/src/features/live-trace/terminate-run.test.tsx +67 -0
  177. xorcise-0.1.0/frontend/src/features/live-trace/terrain-colors.test.ts +96 -0
  178. xorcise-0.1.0/frontend/src/features/live-trace/terrain-colors.ts +85 -0
  179. xorcise-0.1.0/frontend/src/features/live-trace/terrain-fold.test.ts +336 -0
  180. xorcise-0.1.0/frontend/src/features/live-trace/terrain-fold.ts +333 -0
  181. xorcise-0.1.0/frontend/src/features/live-trace/terrain-layout.test.ts +272 -0
  182. xorcise-0.1.0/frontend/src/features/live-trace/terrain-layout.ts +175 -0
  183. xorcise-0.1.0/frontend/src/features/live-trace/terrain-map.test.tsx +1059 -0
  184. xorcise-0.1.0/frontend/src/features/live-trace/terrain-map.tsx +961 -0
  185. xorcise-0.1.0/frontend/src/features/live-trace/timeline-waterfall.test.tsx +352 -0
  186. xorcise-0.1.0/frontend/src/features/live-trace/timeline-waterfall.tsx +285 -0
  187. xorcise-0.1.0/frontend/src/features/live-trace/use-run-terrain.test.ts +67 -0
  188. xorcise-0.1.0/frontend/src/features/live-trace/use-run-terrain.ts +35 -0
  189. xorcise-0.1.0/frontend/src/features/missions/catalog.tsx +343 -0
  190. xorcise-0.1.0/frontend/src/features/missions/difficulty-badge.tsx +44 -0
  191. xorcise-0.1.0/frontend/src/features/missions/facet-select.tsx +143 -0
  192. xorcise-0.1.0/frontend/src/features/missions/filter-bar.test.tsx +141 -0
  193. xorcise-0.1.0/frontend/src/features/missions/filter-bar.tsx +132 -0
  194. xorcise-0.1.0/frontend/src/features/missions/filter-missions.test.ts +142 -0
  195. xorcise-0.1.0/frontend/src/features/missions/filter-missions.ts +125 -0
  196. xorcise-0.1.0/frontend/src/features/missions/ingest-button.tsx +57 -0
  197. xorcise-0.1.0/frontend/src/features/missions/ingest.test.tsx +43 -0
  198. xorcise-0.1.0/frontend/src/features/missions/labels.test.ts +77 -0
  199. xorcise-0.1.0/frontend/src/features/missions/labels.ts +101 -0
  200. xorcise-0.1.0/frontend/src/features/missions/library-stats.tsx +208 -0
  201. xorcise-0.1.0/frontend/src/features/missions/mission-card.tsx +290 -0
  202. xorcise-0.1.0/frontend/src/features/missions/mission-detail.test.tsx +165 -0
  203. xorcise-0.1.0/frontend/src/features/missions/mission-detail.tsx +825 -0
  204. xorcise-0.1.0/frontend/src/features/missions/mission-picker.test.tsx +100 -0
  205. xorcise-0.1.0/frontend/src/features/missions/mission-picker.tsx +161 -0
  206. xorcise-0.1.0/frontend/src/features/missions/missions.test.tsx +265 -0
  207. xorcise-0.1.0/frontend/src/features/missions/pull-mission.test.tsx +185 -0
  208. xorcise-0.1.0/frontend/src/features/missions/queries.ts +278 -0
  209. xorcise-0.1.0/frontend/src/features/replay/event-card.test.tsx +262 -0
  210. xorcise-0.1.0/frontend/src/features/replay/event-card.tsx +493 -0
  211. xorcise-0.1.0/frontend/src/features/replay/kind-meta.test.ts +82 -0
  212. xorcise-0.1.0/frontend/src/features/replay/kind-meta.ts +300 -0
  213. xorcise-0.1.0/frontend/src/features/replay/raw-drilldown-modal.test.tsx +134 -0
  214. xorcise-0.1.0/frontend/src/features/replay/raw-drilldown-modal.tsx +78 -0
  215. xorcise-0.1.0/frontend/src/features/replay/replay-timeline.test.tsx +716 -0
  216. xorcise-0.1.0/frontend/src/features/replay/replay-timeline.tsx +600 -0
  217. xorcise-0.1.0/frontend/src/features/replay/syntax.test.tsx +99 -0
  218. xorcise-0.1.0/frontend/src/features/replay/syntax.tsx +275 -0
  219. xorcise-0.1.0/frontend/src/features/replay/use-run-events.test.tsx +210 -0
  220. xorcise-0.1.0/frontend/src/features/replay/use-run-events.ts +92 -0
  221. xorcise-0.1.0/frontend/src/features/results/artifacts-section.tsx +56 -0
  222. xorcise-0.1.0/frontend/src/features/results/completed-runs.test.tsx +119 -0
  223. xorcise-0.1.0/frontend/src/features/results/completed-runs.tsx +182 -0
  224. xorcise-0.1.0/frontend/src/features/results/conditions-card.test.tsx +49 -0
  225. xorcise-0.1.0/frontend/src/features/results/conditions-card.tsx +50 -0
  226. xorcise-0.1.0/frontend/src/features/results/cross-run-context.test.tsx +42 -0
  227. xorcise-0.1.0/frontend/src/features/results/cross-run-context.tsx +121 -0
  228. xorcise-0.1.0/frontend/src/features/results/download-report.test.tsx +36 -0
  229. xorcise-0.1.0/frontend/src/features/results/download-report.tsx +47 -0
  230. xorcise-0.1.0/frontend/src/features/results/grading-detail.test.tsx +234 -0
  231. xorcise-0.1.0/frontend/src/features/results/grading-detail.tsx +399 -0
  232. xorcise-0.1.0/frontend/src/features/results/judge-deeplink.test.tsx +60 -0
  233. xorcise-0.1.0/frontend/src/features/results/kpi-strip.test.tsx +124 -0
  234. xorcise-0.1.0/frontend/src/features/results/kpi-strip.tsx +89 -0
  235. xorcise-0.1.0/frontend/src/features/results/loading-cards.tsx +27 -0
  236. xorcise-0.1.0/frontend/src/features/results/performance-summary.test.tsx +113 -0
  237. xorcise-0.1.0/frontend/src/features/results/performance-summary.tsx +188 -0
  238. xorcise-0.1.0/frontend/src/features/results/queries.test.ts +22 -0
  239. xorcise-0.1.0/frontend/src/features/results/queries.ts +109 -0
  240. xorcise-0.1.0/frontend/src/features/results/results-all-runs.tsx +256 -0
  241. xorcise-0.1.0/frontend/src/features/results/results-missions.tsx +136 -0
  242. xorcise-0.1.0/frontend/src/features/results/results-tabs.test.tsx +145 -0
  243. xorcise-0.1.0/frontend/src/features/results/results-tabs.tsx +61 -0
  244. xorcise-0.1.0/frontend/src/features/results/results-view.tsx +337 -0
  245. xorcise-0.1.0/frontend/src/features/results/results.test.tsx +409 -0
  246. xorcise-0.1.0/frontend/src/features/results/run-activity.test.tsx +70 -0
  247. xorcise-0.1.0/frontend/src/features/results/run-activity.tsx +94 -0
  248. xorcise-0.1.0/frontend/src/features/results/scorecard.test.tsx +36 -0
  249. xorcise-0.1.0/frontend/src/features/results/scorecard.tsx +152 -0
  250. xorcise-0.1.0/frontend/src/features/results/summarize-assist.test.ts +47 -0
  251. xorcise-0.1.0/frontend/src/features/results/summarize-assist.ts +50 -0
  252. xorcise-0.1.0/frontend/src/features/results/summarize-missions.ts +79 -0
  253. xorcise-0.1.0/frontend/src/features/results/summarize-runs.ts +115 -0
  254. xorcise-0.1.0/frontend/src/features/results/verdict.tsx +86 -0
  255. xorcise-0.1.0/frontend/src/features/runs/budget-slider.tsx +67 -0
  256. xorcise-0.1.0/frontend/src/features/runs/delete-run-dialog.tsx +92 -0
  257. xorcise-0.1.0/frontend/src/features/runs/delete-run-inline.tsx +110 -0
  258. xorcise-0.1.0/frontend/src/features/runs/delete-run.test.tsx +65 -0
  259. xorcise-0.1.0/frontend/src/features/runs/graceful.test.tsx +52 -0
  260. xorcise-0.1.0/frontend/src/features/runs/new-run-form.tsx +926 -0
  261. xorcise-0.1.0/frontend/src/features/runs/new-run-preselect.test.tsx +148 -0
  262. xorcise-0.1.0/frontend/src/features/runs/new-run-pull.test.tsx +372 -0
  263. xorcise-0.1.0/frontend/src/features/runs/queries.ts +149 -0
  264. xorcise-0.1.0/frontend/src/features/runs/run-card.test.tsx +155 -0
  265. xorcise-0.1.0/frontend/src/features/runs/run-card.tsx +223 -0
  266. xorcise-0.1.0/frontend/src/features/runs/run-filters.tsx +197 -0
  267. xorcise-0.1.0/frontend/src/features/runs/run-list.tsx +140 -0
  268. xorcise-0.1.0/frontend/src/features/runs/run-notifications.test.tsx +268 -0
  269. xorcise-0.1.0/frontend/src/features/runs/run-notifications.tsx +122 -0
  270. xorcise-0.1.0/frontend/src/features/runs/run-state.test.ts +62 -0
  271. xorcise-0.1.0/frontend/src/features/runs/run-state.ts +111 -0
  272. xorcise-0.1.0/frontend/src/features/runs/runs.test.tsx +538 -0
  273. xorcise-0.1.0/frontend/src/features/runs/stall.test.ts +21 -0
  274. xorcise-0.1.0/frontend/src/features/runs/stall.ts +31 -0
  275. xorcise-0.1.0/frontend/src/features/settings/catalog-switch.test.tsx +63 -0
  276. xorcise-0.1.0/frontend/src/features/settings/connection-status.tsx +62 -0
  277. xorcise-0.1.0/frontend/src/features/settings/module-groups.ts +156 -0
  278. xorcise-0.1.0/frontend/src/features/settings/module-roles.test.tsx +260 -0
  279. xorcise-0.1.0/frontend/src/features/settings/queries.ts +178 -0
  280. xorcise-0.1.0/frontend/src/features/settings/settings-view.tsx +966 -0
  281. xorcise-0.1.0/frontend/src/features/settings/settings.test.tsx +624 -0
  282. xorcise-0.1.0/frontend/src/features/settings/system-modules.test.tsx +115 -0
  283. xorcise-0.1.0/frontend/src/features/settings/token-limit-slider.tsx +52 -0
  284. xorcise-0.1.0/frontend/src/features/setup/checklist.test.tsx +103 -0
  285. xorcise-0.1.0/frontend/src/features/setup/checklist.tsx +306 -0
  286. xorcise-0.1.0/frontend/src/features/setup/queries.test.tsx +28 -0
  287. xorcise-0.1.0/frontend/src/features/setup/queries.ts +16 -0
  288. xorcise-0.1.0/frontend/src/features/setup/quick-start.test.tsx +38 -0
  289. xorcise-0.1.0/frontend/src/features/setup/quick-start.tsx +105 -0
  290. xorcise-0.1.0/frontend/src/features/setup/readiness.test.tsx +111 -0
  291. xorcise-0.1.0/frontend/src/features/setup/readiness.ts +58 -0
  292. xorcise-0.1.0/frontend/src/features/setup/welcome.test.tsx +105 -0
  293. xorcise-0.1.0/frontend/src/features/setup/welcome.tsx +156 -0
  294. xorcise-0.1.0/frontend/src/hooks/.gitkeep +0 -0
  295. xorcise-0.1.0/frontend/src/lib/README.md +18 -0
  296. xorcise-0.1.0/frontend/src/lib/api/client.test.ts +50 -0
  297. xorcise-0.1.0/frontend/src/lib/api/client.ts +67 -0
  298. xorcise-0.1.0/frontend/src/lib/api/format.test.ts +27 -0
  299. xorcise-0.1.0/frontend/src/lib/api/format.ts +41 -0
  300. xorcise-0.1.0/frontend/src/lib/api/location-transparency.test.ts +21 -0
  301. xorcise-0.1.0/frontend/src/lib/api/query-client.ts +14 -0
  302. xorcise-0.1.0/frontend/src/lib/api/runtime-config.test.ts +23 -0
  303. xorcise-0.1.0/frontend/src/lib/api/runtime-config.ts +27 -0
  304. xorcise-0.1.0/frontend/src/lib/api/schema.ts +4380 -0
  305. xorcise-0.1.0/frontend/src/lib/api/types.ts +63 -0
  306. xorcise-0.1.0/frontend/src/stores/.gitkeep +0 -0
  307. xorcise-0.1.0/frontend/src/stores/toasts.test.ts +35 -0
  308. xorcise-0.1.0/frontend/src/stores/toasts.ts +72 -0
  309. xorcise-0.1.0/frontend/src/stores/ui.test.ts +24 -0
  310. xorcise-0.1.0/frontend/src/stores/ui.ts +31 -0
  311. xorcise-0.1.0/frontend/src/styles/.gitkeep +0 -0
  312. xorcise-0.1.0/frontend/src/test/.gitkeep +0 -0
  313. xorcise-0.1.0/frontend/src/test/fixtures.ts +52 -0
  314. xorcise-0.1.0/frontend/src/test/msw/handlers.ts +276 -0
  315. xorcise-0.1.0/frontend/src/test/msw/server.ts +4 -0
  316. xorcise-0.1.0/frontend/src/test/render.tsx +37 -0
  317. xorcise-0.1.0/frontend/src/test/setup.ts +35 -0
  318. xorcise-0.1.0/frontend/tsconfig.json +40 -0
  319. xorcise-0.1.0/frontend/vitest.config.ts +21 -0
  320. xorcise-0.1.0/hatch_build.py +74 -0
  321. xorcise-0.1.0/pyproject.toml +157 -0
  322. xorcise-0.1.0/scripts/check_release_metadata.py +143 -0
  323. xorcise-0.1.0/scripts/check_single_distribution.py +43 -0
  324. xorcise-0.1.0/scripts/check_wheel_contents.py +138 -0
  325. xorcise-0.1.0/scripts/reset.py +12 -0
  326. xorcise-0.1.0/src/xorcise/__init__.py +17 -0
  327. xorcise-0.1.0/src/xorcise/__main__.py +6 -0
  328. xorcise-0.1.0/src/xorcise/core/__init__.py +6 -0
  329. xorcise-0.1.0/src/xorcise/core/agents/__init__.py +28 -0
  330. xorcise-0.1.0/src/xorcise/core/agents/models.py +33 -0
  331. xorcise-0.1.0/src/xorcise/core/agents/registry.py +148 -0
  332. xorcise-0.1.0/src/xorcise/core/catalog/__init__.py +25 -0
  333. xorcise-0.1.0/src/xorcise/core/catalog/_fixture.py +75 -0
  334. xorcise-0.1.0/src/xorcise/core/catalog/http.py +117 -0
  335. xorcise-0.1.0/src/xorcise/core/catalog/source.py +116 -0
  336. xorcise-0.1.0/src/xorcise/core/cli/__init__.py +5 -0
  337. xorcise-0.1.0/src/xorcise/core/cli/_diagnostics.py +285 -0
  338. xorcise-0.1.0/src/xorcise/core/cli/_errors.py +318 -0
  339. xorcise-0.1.0/src/xorcise/core/cli/_frontend.py +245 -0
  340. xorcise-0.1.0/src/xorcise/core/cli/_preflight.py +105 -0
  341. xorcise-0.1.0/src/xorcise/core/cli/_resolve.py +142 -0
  342. xorcise-0.1.0/src/xorcise/core/cli/_shared.py +81 -0
  343. xorcise-0.1.0/src/xorcise/core/cli/_update.py +133 -0
  344. xorcise-0.1.0/src/xorcise/core/cli/_ux.py +367 -0
  345. xorcise-0.1.0/src/xorcise/core/cli/app.py +115 -0
  346. xorcise-0.1.0/src/xorcise/core/cli/commands/__init__.py +1 -0
  347. xorcise-0.1.0/src/xorcise/core/cli/commands/agent.py +278 -0
  348. xorcise-0.1.0/src/xorcise/core/cli/commands/auth.py +18 -0
  349. xorcise-0.1.0/src/xorcise/core/cli/commands/catalog.py +156 -0
  350. xorcise-0.1.0/src/xorcise/core/cli/commands/config.py +350 -0
  351. xorcise-0.1.0/src/xorcise/core/cli/commands/db.py +30 -0
  352. xorcise-0.1.0/src/xorcise/core/cli/commands/lifecycle.py +890 -0
  353. xorcise-0.1.0/src/xorcise/core/cli/commands/mission.py +392 -0
  354. xorcise-0.1.0/src/xorcise/core/cli/commands/remote.py +27 -0
  355. xorcise-0.1.0/src/xorcise/core/cli/commands/results.py +148 -0
  356. xorcise-0.1.0/src/xorcise/core/cli/commands/role.py +160 -0
  357. xorcise-0.1.0/src/xorcise/core/cli/commands/run.py +573 -0
  358. xorcise-0.1.0/src/xorcise/core/cli/commands/serve.py +164 -0
  359. xorcise-0.1.0/src/xorcise/core/cli/commands/system.py +84 -0
  360. xorcise-0.1.0/src/xorcise/core/cli/rest_client.py +224 -0
  361. xorcise-0.1.0/src/xorcise/core/code/__init__.py +4 -0
  362. xorcise-0.1.0/src/xorcise/core/config/__init__.py +228 -0
  363. xorcise-0.1.0/src/xorcise/core/contracts/__init__.py +5 -0
  364. xorcise-0.1.0/src/xorcise/core/contracts/agent.py +61 -0
  365. xorcise-0.1.0/src/xorcise/core/contracts/agent_event.py +183 -0
  366. xorcise-0.1.0/src/xorcise/core/contracts/catalog.py +40 -0
  367. xorcise-0.1.0/src/xorcise/core/contracts/catalog_v1.py +3 -0
  368. xorcise-0.1.0/src/xorcise/core/contracts/config.py +170 -0
  369. xorcise-0.1.0/src/xorcise/core/contracts/connect.py +114 -0
  370. xorcise-0.1.0/src/xorcise/core/contracts/control.py +98 -0
  371. xorcise-0.1.0/src/xorcise/core/contracts/errors.py +46 -0
  372. xorcise-0.1.0/src/xorcise/core/contracts/evidence.py +33 -0
  373. xorcise-0.1.0/src/xorcise/core/contracts/fs.py +21 -0
  374. xorcise-0.1.0/src/xorcise/core/contracts/grading.py +104 -0
  375. xorcise-0.1.0/src/xorcise/core/contracts/mission.py +256 -0
  376. xorcise-0.1.0/src/xorcise/core/contracts/otlp.py +31 -0
  377. xorcise-0.1.0/src/xorcise/core/contracts/premium_v1.py +3 -0
  378. xorcise-0.1.0/src/xorcise/core/contracts/reporting.py +87 -0
  379. xorcise-0.1.0/src/xorcise/core/contracts/rest.py +3 -0
  380. xorcise-0.1.0/src/xorcise/core/contracts/roles.py +3 -0
  381. xorcise-0.1.0/src/xorcise/core/contracts/run.py +81 -0
  382. xorcise-0.1.0/src/xorcise/core/contracts/runcontrol.py +59 -0
  383. xorcise-0.1.0/src/xorcise/core/contracts/telemetry.py +44 -0
  384. xorcise-0.1.0/src/xorcise/core/contracts/terrain.py +113 -0
  385. xorcise-0.1.0/src/xorcise/core/db/__init__.py +20 -0
  386. xorcise-0.1.0/src/xorcise/core/db/base.py +9 -0
  387. xorcise-0.1.0/src/xorcise/core/db/engine.py +34 -0
  388. xorcise-0.1.0/src/xorcise/core/db/migrate.py +60 -0
  389. xorcise-0.1.0/src/xorcise/core/db/migrations/__init__.py +1 -0
  390. xorcise-0.1.0/src/xorcise/core/db/migrations/env.py +39 -0
  391. xorcise-0.1.0/src/xorcise/core/db/migrations/script.py.mako +24 -0
  392. xorcise-0.1.0/src/xorcise/core/db/migrations/versions/0001_initial.py +320 -0
  393. xorcise-0.1.0/src/xorcise/core/eval/__init__.py +7 -0
  394. xorcise-0.1.0/src/xorcise/core/eval/checks.py +63 -0
  395. xorcise-0.1.0/src/xorcise/core/eval/deterministic.py +68 -0
  396. xorcise-0.1.0/src/xorcise/core/eval/grade.py +62 -0
  397. xorcise-0.1.0/src/xorcise/core/eval/judge.py +409 -0
  398. xorcise-0.1.0/src/xorcise/core/eval/operations.py +43 -0
  399. xorcise-0.1.0/src/xorcise/core/eval/resolvers.py +30 -0
  400. xorcise-0.1.0/src/xorcise/core/frontend/__init__.py +4 -0
  401. xorcise-0.1.0/src/xorcise/core/harness_adapters/__init__.py +50 -0
  402. xorcise-0.1.0/src/xorcise/core/harness_adapters/claude_code/__init__.py +0 -0
  403. xorcise-0.1.0/src/xorcise/core/harness_adapters/claude_code/launch.py +58 -0
  404. xorcise-0.1.0/src/xorcise/core/harness_adapters/claude_code/otel.py +496 -0
  405. xorcise-0.1.0/src/xorcise/core/harness_adapters/claude_code/telemetry.py +59 -0
  406. xorcise-0.1.0/src/xorcise/core/harness_adapters/codex/__init__.py +0 -0
  407. xorcise-0.1.0/src/xorcise/core/harness_adapters/codex/launch.py +71 -0
  408. xorcise-0.1.0/src/xorcise/core/harness_adapters/codex/otel.py +468 -0
  409. xorcise-0.1.0/src/xorcise/core/harness_adapters/codex/telemetry.py +43 -0
  410. xorcise-0.1.0/src/xorcise/core/harness_adapters/openhands/__init__.py +0 -0
  411. xorcise-0.1.0/src/xorcise/core/harness_adapters/openhands/launch.py +42 -0
  412. xorcise-0.1.0/src/xorcise/core/harness_adapters/openhands/otel.py +336 -0
  413. xorcise-0.1.0/src/xorcise/core/headscale/__init__.py +32 -0
  414. xorcise-0.1.0/src/xorcise/core/headscale/cidr.py +59 -0
  415. xorcise-0.1.0/src/xorcise/core/headscale/cli.py +301 -0
  416. xorcise-0.1.0/src/xorcise/core/headscale/controller.py +167 -0
  417. xorcise-0.1.0/src/xorcise/core/headscale/policy.py +112 -0
  418. xorcise-0.1.0/src/xorcise/core/headscale/provision.py +621 -0
  419. xorcise-0.1.0/src/xorcise/core/home/__init__.py +149 -0
  420. xorcise-0.1.0/src/xorcise/core/missions/__init__.py +32 -0
  421. xorcise-0.1.0/src/xorcise/core/missions/builder.py +34 -0
  422. xorcise-0.1.0/src/xorcise/core/missions/errors.py +18 -0
  423. xorcise-0.1.0/src/xorcise/core/missions/ingest.py +160 -0
  424. xorcise-0.1.0/src/xorcise/core/missions/preflight.py +64 -0
  425. xorcise-0.1.0/src/xorcise/core/missions/runtime.py +144 -0
  426. xorcise-0.1.0/src/xorcise/core/observability/__init__.py +4 -0
  427. xorcise-0.1.0/src/xorcise/core/orchestration/__init__.py +5 -0
  428. xorcise-0.1.0/src/xorcise/core/orchestration/clients/__init__.py +1 -0
  429. xorcise-0.1.0/src/xorcise/core/orchestration/clients/control.py +104 -0
  430. xorcise-0.1.0/src/xorcise/core/orchestration/clients/grading.py +70 -0
  431. xorcise-0.1.0/src/xorcise/core/orchestration/clients/headscale_client.py +27 -0
  432. xorcise-0.1.0/src/xorcise/core/orchestration/clients/judge_model.py +131 -0
  433. xorcise-0.1.0/src/xorcise/core/orchestration/clients/token_counter.py +36 -0
  434. xorcise-0.1.0/src/xorcise/core/orchestration/ports.py +90 -0
  435. xorcise-0.1.0/src/xorcise/core/otel/__init__.py +5 -0
  436. xorcise-0.1.0/src/xorcise/core/otel/adapters/__init__.py +208 -0
  437. xorcise-0.1.0/src/xorcise/core/otel/adapters/base.py +67 -0
  438. xorcise-0.1.0/src/xorcise/core/otel/adapters/genai.py +209 -0
  439. xorcise-0.1.0/src/xorcise/core/otel/adapters/generic.py +142 -0
  440. xorcise-0.1.0/src/xorcise/core/otel/adapters/registry.py +67 -0
  441. xorcise-0.1.0/src/xorcise/core/otel/decode.py +170 -0
  442. xorcise-0.1.0/src/xorcise/core/otel/distill.py +219 -0
  443. xorcise-0.1.0/src/xorcise/core/otel/flatten.py +204 -0
  444. xorcise-0.1.0/src/xorcise/core/otel/ingest/__init__.py +29 -0
  445. xorcise-0.1.0/src/xorcise/core/otel/ingest/embedded.py +164 -0
  446. xorcise-0.1.0/src/xorcise/core/otel/mirror.py +36 -0
  447. xorcise-0.1.0/src/xorcise/core/otel/ports.py +53 -0
  448. xorcise-0.1.0/src/xorcise/core/otel/run_stats.py +110 -0
  449. xorcise-0.1.0/src/xorcise/core/otel/stats.py +17 -0
  450. xorcise-0.1.0/src/xorcise/core/otel/store/__init__.py +40 -0
  451. xorcise-0.1.0/src/xorcise/core/otel/store/agent_events.py +224 -0
  452. xorcise-0.1.0/src/xorcise/core/otel/store/models.py +116 -0
  453. xorcise-0.1.0/src/xorcise/core/otel/store/seal.py +44 -0
  454. xorcise-0.1.0/src/xorcise/core/otel/store/sqlite.py +146 -0
  455. xorcise-0.1.0/src/xorcise/core/premium/__init__.py +4 -0
  456. xorcise-0.1.0/src/xorcise/core/reporting/__init__.py +41 -0
  457. xorcise-0.1.0/src/xorcise/core/reporting/models.py +52 -0
  458. xorcise-0.1.0/src/xorcise/core/reporting/render.py +981 -0
  459. xorcise-0.1.0/src/xorcise/core/reporting/repository.py +160 -0
  460. xorcise-0.1.0/src/xorcise/core/rest/__init__.py +4 -0
  461. xorcise-0.1.0/src/xorcise/core/rest/app.py +84 -0
  462. xorcise-0.1.0/src/xorcise/core/rest/budget_watchdog.py +53 -0
  463. xorcise-0.1.0/src/xorcise/core/rest/catalog_view.py +126 -0
  464. xorcise-0.1.0/src/xorcise/core/rest/config_view.py +227 -0
  465. xorcise-0.1.0/src/xorcise/core/rest/events_export.py +59 -0
  466. xorcise-0.1.0/src/xorcise/core/rest/events_view.py +196 -0
  467. xorcise-0.1.0/src/xorcise/core/rest/fs_browse.py +53 -0
  468. xorcise-0.1.0/src/xorcise/core/rest/grade_assembly.py +161 -0
  469. xorcise-0.1.0/src/xorcise/core/rest/ingest.py +97 -0
  470. xorcise-0.1.0/src/xorcise/core/rest/ingest_jobs.py +139 -0
  471. xorcise-0.1.0/src/xorcise/core/rest/join_reconcile.py +184 -0
  472. xorcise-0.1.0/src/xorcise/core/rest/mission_pull.py +299 -0
  473. xorcise-0.1.0/src/xorcise/core/rest/pull_jobs.py +212 -0
  474. xorcise-0.1.0/src/xorcise/core/rest/reap.py +31 -0
  475. xorcise-0.1.0/src/xorcise/core/rest/reconcile.py +196 -0
  476. xorcise-0.1.0/src/xorcise/core/rest/report_assembly.py +212 -0
  477. xorcise-0.1.0/src/xorcise/core/rest/routers/__init__.py +1 -0
  478. xorcise-0.1.0/src/xorcise/core/rest/routers/agents.py +92 -0
  479. xorcise-0.1.0/src/xorcise/core/rest/routers/catalog.py +17 -0
  480. xorcise-0.1.0/src/xorcise/core/rest/routers/config.py +82 -0
  481. xorcise-0.1.0/src/xorcise/core/rest/routers/fs.py +19 -0
  482. xorcise-0.1.0/src/xorcise/core/rest/routers/harnesses.py +73 -0
  483. xorcise-0.1.0/src/xorcise/core/rest/routers/health.py +12 -0
  484. xorcise-0.1.0/src/xorcise/core/rest/routers/missions.py +347 -0
  485. xorcise-0.1.0/src/xorcise/core/rest/routers/runcontrol.py +391 -0
  486. xorcise-0.1.0/src/xorcise/core/rest/routers/runs.py +694 -0
  487. xorcise-0.1.0/src/xorcise/core/rest/routers/system.py +16 -0
  488. xorcise-0.1.0/src/xorcise/core/rest/run_create.py +834 -0
  489. xorcise-0.1.0/src/xorcise/core/rest/run_readiness.py +221 -0
  490. xorcise-0.1.0/src/xorcise/core/rest/run_teardown.py +29 -0
  491. xorcise-0.1.0/src/xorcise/core/rest/run_terminate.py +287 -0
  492. xorcise-0.1.0/src/xorcise/core/rest/system_view.py +259 -0
  493. xorcise-0.1.0/src/xorcise/core/rest/terrain_catchup_v2.py +207 -0
  494. xorcise-0.1.0/src/xorcise/core/roles/__init__.py +4 -0
  495. xorcise-0.1.0/src/xorcise/core/roles/activate.py +40 -0
  496. xorcise-0.1.0/src/xorcise/core/roles/boot/__init__.py +20 -0
  497. xorcise-0.1.0/src/xorcise/core/roles/boot/role_all.py +239 -0
  498. xorcise-0.1.0/src/xorcise/core/roles/boot/role_collector.py +17 -0
  499. xorcise-0.1.0/src/xorcise/core/roles/boot/role_control.py +17 -0
  500. xorcise-0.1.0/src/xorcise/core/roles/boot/role_headscale.py +23 -0
  501. xorcise-0.1.0/src/xorcise/core/roles/boot/role_runner.py +27 -0
  502. xorcise-0.1.0/src/xorcise/core/roles/compose.py +17 -0
  503. xorcise-0.1.0/src/xorcise/core/roles/registry.py +93 -0
  504. xorcise-0.1.0/src/xorcise/core/runcontrol/__init__.py +7 -0
  505. xorcise-0.1.0/src/xorcise/core/runcontrol/errors.py +15 -0
  506. xorcise-0.1.0/src/xorcise/core/runcontrol/intel_policy.py +31 -0
  507. xorcise-0.1.0/src/xorcise/core/runcontrol/models.py +23 -0
  508. xorcise-0.1.0/src/xorcise/core/runcontrol/service.py +123 -0
  509. xorcise-0.1.0/src/xorcise/core/runcontrol/signing.py +30 -0
  510. xorcise-0.1.0/src/xorcise/core/runcontrol/store.py +103 -0
  511. xorcise-0.1.0/src/xorcise/core/runner/__init__.py +4 -0
  512. xorcise-0.1.0/src/xorcise/core/runner/docker/__init__.py +256 -0
  513. xorcise-0.1.0/src/xorcise/core/runner/docker/build.py +156 -0
  514. xorcise-0.1.0/src/xorcise/core/runner/docker/driver.py +326 -0
  515. xorcise-0.1.0/src/xorcise/core/runner/netoverride.py +147 -0
  516. xorcise-0.1.0/src/xorcise/core/runner/service.py +182 -0
  517. xorcise-0.1.0/src/xorcise/core/runs/__init__.py +55 -0
  518. xorcise-0.1.0/src/xorcise/core/runs/join.py +438 -0
  519. xorcise-0.1.0/src/xorcise/core/runs/launch/__init__.py +1 -0
  520. xorcise-0.1.0/src/xorcise/core/runs/launch/base.py +70 -0
  521. xorcise-0.1.0/src/xorcise/core/runs/launch/generic.py +12 -0
  522. xorcise-0.1.0/src/xorcise/core/runs/launch/registry.py +32 -0
  523. xorcise-0.1.0/src/xorcise/core/runs/models.py +129 -0
  524. xorcise-0.1.0/src/xorcise/core/runs/observed.py +114 -0
  525. xorcise-0.1.0/src/xorcise/core/runs/prompt.py +246 -0
  526. xorcise-0.1.0/src/xorcise/core/runs/repository.py +331 -0
  527. xorcise-0.1.0/src/xorcise/core/runs/tailscale_dist.py +76 -0
  528. xorcise-0.1.0/src/xorcise/core/runs/telemetry/__init__.py +9 -0
  529. xorcise-0.1.0/src/xorcise/core/runs/telemetry/base.py +35 -0
  530. xorcise-0.1.0/src/xorcise/core/runs/telemetry/generic.py +23 -0
  531. xorcise-0.1.0/src/xorcise/core/runs/telemetry/registry.py +40 -0
  532. xorcise-0.1.0/src/xorcise/core/runs/terrain_attribution.py +25 -0
  533. xorcise-0.1.0/src/xorcise/core/runs/terrain_attribution_v2.py +376 -0
  534. xorcise-0.1.0/src/xorcise/core/runs/terrain_timeline.py +52 -0
  535. xorcise-0.1.0/src/xorcise/core/runs/terrain_update_store.py +188 -0
  536. xorcise-0.1.0/src/xorcise/core/runs/terrain_updates_infra.py +198 -0
  537. xorcise-0.1.0/src/xorcise/core/runs/terrain_v2.py +356 -0
  538. xorcise-0.1.0/src/xorcise/core/seams.py +7 -0
  539. xorcise-0.1.0/src/xorcise/core/targets/__init__.py +4 -0
  540. xorcise-0.1.0/src/xorcise/py.typed +0 -0
  541. xorcise-0.1.0/tests/__init__.py +0 -0
  542. xorcise-0.1.0/tests/_helpers.py +67 -0
  543. xorcise-0.1.0/tests/adapters/__init__.py +0 -0
  544. xorcise-0.1.0/tests/adapters/_contracts.py +148 -0
  545. xorcise-0.1.0/tests/adapters/test_agent_contract.py +38 -0
  546. xorcise-0.1.0/tests/adapters/test_control_real.py +13 -0
  547. xorcise-0.1.0/tests/adapters/test_control_stub.py +13 -0
  548. xorcise-0.1.0/tests/adapters/test_docker_driver_by_name.py +92 -0
  549. xorcise-0.1.0/tests/adapters/test_docker_driver_networks.py +67 -0
  550. xorcise-0.1.0/tests/adapters/test_docker_driver_pull_auth.py +170 -0
  551. xorcise-0.1.0/tests/adapters/test_docker_driver_real.py +83 -0
  552. xorcise-0.1.0/tests/adapters/test_docker_driver_state.py +97 -0
  553. xorcise-0.1.0/tests/adapters/test_docker_driver_teardown.py +154 -0
  554. xorcise-0.1.0/tests/adapters/test_docker_stub.py +29 -0
  555. xorcise-0.1.0/tests/adapters/test_eval_judge.py +78 -0
  556. xorcise-0.1.0/tests/adapters/test_grade_assembly.py +239 -0
  557. xorcise-0.1.0/tests/adapters/test_grading_stub.py +13 -0
  558. xorcise-0.1.0/tests/adapters/test_headscale_cli_parse.py +17 -0
  559. xorcise-0.1.0/tests/adapters/test_judge_model_client.py +196 -0
  560. xorcise-0.1.0/tests/adapters/test_observed_facts_store.py +41 -0
  561. xorcise-0.1.0/tests/adapters/test_otel_receiver.py +272 -0
  562. xorcise-0.1.0/tests/adapters/test_otel_seal_store_sqlite.py +16 -0
  563. xorcise-0.1.0/tests/adapters/test_otel_sqlite_store.py +37 -0
  564. xorcise-0.1.0/tests/adapters/test_otel_stub.py +20 -0
  565. xorcise-0.1.0/tests/adapters/test_reporting_contract.py +20 -0
  566. xorcise-0.1.0/tests/adapters/test_run_contract.py +22 -0
  567. xorcise-0.1.0/tests/adapters/test_runcontrol_attachments.py +114 -0
  568. xorcise-0.1.0/tests/adapters/test_runcontrol_rest.py +65 -0
  569. xorcise-0.1.0/tests/adapters/test_runcontrol_store_sqlite.py +28 -0
  570. xorcise-0.1.0/tests/adapters/test_runcontrol_terminal.py +43 -0
  571. xorcise-0.1.0/tests/conftest.py +233 -0
  572. xorcise-0.1.0/tests/e2e/__init__.py +0 -0
  573. xorcise-0.1.0/tests/e2e/test_run_isolation.py +355 -0
  574. xorcise-0.1.0/tests/e2e/test_run_real.py +85 -0
  575. xorcise-0.1.0/tests/e2e/test_scripted_agent.py +89 -0
  576. xorcise-0.1.0/tests/e2e/test_up_provisions_headscale.py +69 -0
  577. xorcise-0.1.0/tests/e2e/test_walking_skeleton.py +57 -0
  578. xorcise-0.1.0/tests/fixtures/__init__.py +1 -0
  579. xorcise-0.1.0/tests/fixtures/otlp/claude_code_events_golden.json +38 -0
  580. xorcise-0.1.0/tests/fixtures/otlp/claude_code_real_run.json +898 -0
  581. xorcise-0.1.0/tests/fixtures/otlp/codex_events_golden.json +74 -0
  582. xorcise-0.1.0/tests/fixtures/otlp/codex_real_run.json +3972 -0
  583. xorcise-0.1.0/tests/fixtures/otlp/openhands_events_golden.json +353 -0
  584. xorcise-0.1.0/tests/fixtures/otlp/openhands_real_run.json +4641 -0
  585. xorcise-0.1.0/tests/fixtures/scripted_agent.py +145 -0
  586. xorcise-0.1.0/tests/integration/__init__.py +0 -0
  587. xorcise-0.1.0/tests/integration/test_agent_history_compare.py +84 -0
  588. xorcise-0.1.0/tests/integration/test_config_live_update.py +40 -0
  589. xorcise-0.1.0/tests/integration/test_deterministic_grade.py +70 -0
  590. xorcise-0.1.0/tests/integration/test_fused_build.py +50 -0
  591. xorcise-0.1.0/tests/integration/test_observed_facts_stream.py +129 -0
  592. xorcise-0.1.0/tests/integration/test_otel_fanout_seal.py +108 -0
  593. xorcise-0.1.0/tests/integration/test_placeholder.py +11 -0
  594. xorcise-0.1.0/tests/integration/test_prompt_runcontrol_recipe.py +60 -0
  595. xorcise-0.1.0/tests/integration/test_run_create_loop.py +82 -0
  596. xorcise-0.1.0/tests/integration/test_run_terminate_grades.py +349 -0
  597. xorcise-0.1.0/tests/integration/test_runcontrol_e2e.py +115 -0
  598. xorcise-0.1.0/tests/integration/test_scripted_agent_runscope.py +34 -0
  599. xorcise-0.1.0/tests/integration/test_terminal_seal_e2e.py +62 -0
  600. xorcise-0.1.0/tests/topology/__init__.py +0 -0
  601. xorcise-0.1.0/tests/topology/test_parity.py +151 -0
  602. xorcise-0.1.0/tests/unit/__init__.py +0 -0
  603. xorcise-0.1.0/tests/unit/test_agent_events_cache.py +151 -0
  604. xorcise-0.1.0/tests/unit/test_agent_events_store.py +135 -0
  605. xorcise-0.1.0/tests/unit/test_agent_history_rest.py +60 -0
  606. xorcise-0.1.0/tests/unit/test_agents_registry.py +151 -0
  607. xorcise-0.1.0/tests/unit/test_agents_rest.py +140 -0
  608. xorcise-0.1.0/tests/unit/test_budget_watchdog.py +32 -0
  609. xorcise-0.1.0/tests/unit/test_build_pull_deps.py +21 -0
  610. xorcise-0.1.0/tests/unit/test_capability_profile.py +56 -0
  611. xorcise-0.1.0/tests/unit/test_capability_profiles_adapters.py +178 -0
  612. xorcise-0.1.0/tests/unit/test_catalog_config_rest.py +53 -0
  613. xorcise-0.1.0/tests/unit/test_catalog_contract.py +57 -0
  614. xorcise-0.1.0/tests/unit/test_catalog_source.py +46 -0
  615. xorcise-0.1.0/tests/unit/test_catalog_status_rest.py +49 -0
  616. xorcise-0.1.0/tests/unit/test_catalog_view.py +97 -0
  617. xorcise-0.1.0/tests/unit/test_check_contract_weights.py +174 -0
  618. xorcise-0.1.0/tests/unit/test_check_op_ingest_validation.py +134 -0
  619. xorcise-0.1.0/tests/unit/test_check_verdict_shape.py +34 -0
  620. xorcise-0.1.0/tests/unit/test_claude_code_adapter.py +486 -0
  621. xorcise-0.1.0/tests/unit/test_claude_code_launch_provider.py +60 -0
  622. xorcise-0.1.0/tests/unit/test_cli_catalog_ux.py +264 -0
  623. xorcise-0.1.0/tests/unit/test_cli_commands.py +1290 -0
  624. xorcise-0.1.0/tests/unit/test_cli_config.py +233 -0
  625. xorcise-0.1.0/tests/unit/test_cli_json_parity.py +72 -0
  626. xorcise-0.1.0/tests/unit/test_cli_parity.py +537 -0
  627. xorcise-0.1.0/tests/unit/test_cli_role_experimental.py +73 -0
  628. xorcise-0.1.0/tests/unit/test_cli_run.py +736 -0
  629. xorcise-0.1.0/tests/unit/test_cli_shell.py +30 -0
  630. xorcise-0.1.0/tests/unit/test_cli_ux.py +1339 -0
  631. xorcise-0.1.0/tests/unit/test_codex_adapter.py +252 -0
  632. xorcise-0.1.0/tests/unit/test_codex_launch_provider.py +91 -0
  633. xorcise-0.1.0/tests/unit/test_codex_telemetry_provider.py +52 -0
  634. xorcise-0.1.0/tests/unit/test_config.py +176 -0
  635. xorcise-0.1.0/tests/unit/test_config_headscale.py +19 -0
  636. xorcise-0.1.0/tests/unit/test_config_rest.py +99 -0
  637. xorcise-0.1.0/tests/unit/test_config_view.py +100 -0
  638. xorcise-0.1.0/tests/unit/test_connect_prompt.py +514 -0
  639. xorcise-0.1.0/tests/unit/test_container_reap.py +35 -0
  640. xorcise-0.1.0/tests/unit/test_containers_mission_base.py +31 -0
  641. xorcise-0.1.0/tests/unit/test_contracts_agent_event.py +69 -0
  642. xorcise-0.1.0/tests/unit/test_contracts_control.py +38 -0
  643. xorcise-0.1.0/tests/unit/test_contracts_errors.py +17 -0
  644. xorcise-0.1.0/tests/unit/test_contracts_grading.py +25 -0
  645. xorcise-0.1.0/tests/unit/test_contracts_leaf.py +30 -0
  646. xorcise-0.1.0/tests/unit/test_contracts_otlp.py +21 -0
  647. xorcise-0.1.0/tests/unit/test_contracts_runcontrol.py +51 -0
  648. xorcise-0.1.0/tests/unit/test_core_no_launch_provider_import.py +72 -0
  649. xorcise-0.1.0/tests/unit/test_core_no_openhands_import.py +79 -0
  650. xorcise-0.1.0/tests/unit/test_core_no_telemetry_provider_import.py +76 -0
  651. xorcise-0.1.0/tests/unit/test_criterion_score_shape.py +44 -0
  652. xorcise-0.1.0/tests/unit/test_db_engine.py +22 -0
  653. xorcise-0.1.0/tests/unit/test_db_migrate.py +107 -0
  654. xorcise-0.1.0/tests/unit/test_diagnostics.py +159 -0
  655. xorcise-0.1.0/tests/unit/test_distill_transcript.py +342 -0
  656. xorcise-0.1.0/tests/unit/test_endpoint_config_guard.py +37 -0
  657. xorcise-0.1.0/tests/unit/test_eval_checks.py +102 -0
  658. xorcise-0.1.0/tests/unit/test_eval_operations.py +43 -0
  659. xorcise-0.1.0/tests/unit/test_eval_resolvers.py +30 -0
  660. xorcise-0.1.0/tests/unit/test_events_export.py +127 -0
  661. xorcise-0.1.0/tests/unit/test_events_view.py +201 -0
  662. xorcise-0.1.0/tests/unit/test_favicon_rest.py +55 -0
  663. xorcise-0.1.0/tests/unit/test_flatten.py +190 -0
  664. xorcise-0.1.0/tests/unit/test_flatten_span_events.py +62 -0
  665. xorcise-0.1.0/tests/unit/test_frontend_build_status.py +130 -0
  666. xorcise-0.1.0/tests/unit/test_frontend_ensure.py +117 -0
  667. xorcise-0.1.0/tests/unit/test_frontend_progress.py +139 -0
  668. xorcise-0.1.0/tests/unit/test_fs_browse.py +69 -0
  669. xorcise-0.1.0/tests/unit/test_fused_builder_plan.py +85 -0
  670. xorcise-0.1.0/tests/unit/test_genai_extractor.py +191 -0
  671. xorcise-0.1.0/tests/unit/test_grade_assembly_telemetry_gaps.py +32 -0
  672. xorcise-0.1.0/tests/unit/test_grade_combine.py +114 -0
  673. xorcise-0.1.0/tests/unit/test_grade_deterministic.py +229 -0
  674. xorcise-0.1.0/tests/unit/test_grade_judge.py +569 -0
  675. xorcise-0.1.0/tests/unit/test_grader_isolation.py +81 -0
  676. xorcise-0.1.0/tests/unit/test_guards.py +17 -0
  677. xorcise-0.1.0/tests/unit/test_headscale_cidr.py +51 -0
  678. xorcise-0.1.0/tests/unit/test_headscale_cli_stub.py +53 -0
  679. xorcise-0.1.0/tests/unit/test_headscale_controller.py +277 -0
  680. xorcise-0.1.0/tests/unit/test_headscale_node_online.py +76 -0
  681. xorcise-0.1.0/tests/unit/test_headscale_policy.py +167 -0
  682. xorcise-0.1.0/tests/unit/test_headscale_provision.py +427 -0
  683. xorcise-0.1.0/tests/unit/test_headscale_public_api.py +17 -0
  684. xorcise-0.1.0/tests/unit/test_headscale_router_online.py +60 -0
  685. xorcise-0.1.0/tests/unit/test_home.py +76 -0
  686. xorcise-0.1.0/tests/unit/test_home_env_upsert.py +61 -0
  687. xorcise-0.1.0/tests/unit/test_http_catalog_source.py +226 -0
  688. xorcise-0.1.0/tests/unit/test_ingest_bundle.py +37 -0
  689. xorcise-0.1.0/tests/unit/test_ingest_jobs.py +96 -0
  690. xorcise-0.1.0/tests/unit/test_install_pulled.py +149 -0
  691. xorcise-0.1.0/tests/unit/test_installed_rubric_checks.py +34 -0
  692. xorcise-0.1.0/tests/unit/test_intel_policy.py +40 -0
  693. xorcise-0.1.0/tests/unit/test_join_reconcile.py +144 -0
  694. xorcise-0.1.0/tests/unit/test_join_script.py +283 -0
  695. xorcise-0.1.0/tests/unit/test_judge_live_test.py +51 -0
  696. xorcise-0.1.0/tests/unit/test_judge_timeout_config.py +54 -0
  697. xorcise-0.1.0/tests/unit/test_judge_transcript_config.py +152 -0
  698. xorcise-0.1.0/tests/unit/test_launch_registry.py +36 -0
  699. xorcise-0.1.0/tests/unit/test_lifecycle_await_exit.py +26 -0
  700. xorcise-0.1.0/tests/unit/test_lifecycle_bind_hosts.py +38 -0
  701. xorcise-0.1.0/tests/unit/test_lifecycle_headscale_plan.py +222 -0
  702. xorcise-0.1.0/tests/unit/test_lifecycle_polish.py +103 -0
  703. xorcise-0.1.0/tests/unit/test_mission_collision.py +176 -0
  704. xorcise-0.1.0/tests/unit/test_mission_contract.py +238 -0
  705. xorcise-0.1.0/tests/unit/test_mission_manifest_rest.py +62 -0
  706. xorcise-0.1.0/tests/unit/test_mission_pull.py +437 -0
  707. xorcise-0.1.0/tests/unit/test_missions_ingestion.py +341 -0
  708. xorcise-0.1.0/tests/unit/test_missions_rest.py +208 -0
  709. xorcise-0.1.0/tests/unit/test_network_config_rest.py +52 -0
  710. xorcise-0.1.0/tests/unit/test_network_facts.py +27 -0
  711. xorcise-0.1.0/tests/unit/test_network_fence_port.py +24 -0
  712. xorcise-0.1.0/tests/unit/test_no_hardcoded_localhost.py +24 -0
  713. xorcise-0.1.0/tests/unit/test_observed_fact_shape.py +42 -0
  714. xorcise-0.1.0/tests/unit/test_openhands_adapter.py +317 -0
  715. xorcise-0.1.0/tests/unit/test_openhands_launch_provider.py +51 -0
  716. xorcise-0.1.0/tests/unit/test_otel_adapters.py +469 -0
  717. xorcise-0.1.0/tests/unit/test_otel_boot_wiring.py +103 -0
  718. xorcise-0.1.0/tests/unit/test_otel_decode.py +199 -0
  719. xorcise-0.1.0/tests/unit/test_otel_mirror.py +30 -0
  720. xorcise-0.1.0/tests/unit/test_otel_seal_store.py +25 -0
  721. xorcise-0.1.0/tests/unit/test_otel_stats_projection.py +19 -0
  722. xorcise-0.1.0/tests/unit/test_otel_store_read_since.py +30 -0
  723. xorcise-0.1.0/tests/unit/test_otel_traces_migration.py +65 -0
  724. xorcise-0.1.0/tests/unit/test_package_root.py +25 -0
  725. xorcise-0.1.0/tests/unit/test_preflight.py +154 -0
  726. xorcise-0.1.0/tests/unit/test_pull_errors_location.py +22 -0
  727. xorcise-0.1.0/tests/unit/test_pull_jobs.py +302 -0
  728. xorcise-0.1.0/tests/unit/test_pull_jobs_rest.py +218 -0
  729. xorcise-0.1.0/tests/unit/test_real_by_default.py +344 -0
  730. xorcise-0.1.0/tests/unit/test_real_headscale_guard.py +41 -0
  731. xorcise-0.1.0/tests/unit/test_reconcile_on_startup.py +247 -0
  732. xorcise-0.1.0/tests/unit/test_ref_split.py +28 -0
  733. xorcise-0.1.0/tests/unit/test_report_terrain_objective_grade.py +104 -0
  734. xorcise-0.1.0/tests/unit/test_reporting_render.py +506 -0
  735. xorcise-0.1.0/tests/unit/test_reporting_repository.py +202 -0
  736. xorcise-0.1.0/tests/unit/test_rest_canned.py +52 -0
  737. xorcise-0.1.0/tests/unit/test_rest_harness_capabilities.py +57 -0
  738. xorcise-0.1.0/tests/unit/test_role_boot_bind.py +109 -0
  739. xorcise-0.1.0/tests/unit/test_roles_activate.py +62 -0
  740. xorcise-0.1.0/tests/unit/test_roles_boot.py +31 -0
  741. xorcise-0.1.0/tests/unit/test_roles_compose.py +13 -0
  742. xorcise-0.1.0/tests/unit/test_roles_registry.py +50 -0
  743. xorcise-0.1.0/tests/unit/test_run_budget.py +34 -0
  744. xorcise-0.1.0/tests/unit/test_run_control_facts.py +29 -0
  745. xorcise-0.1.0/tests/unit/test_run_create_preamble.py +112 -0
  746. xorcise-0.1.0/tests/unit/test_run_create_runcontrol_url.py +49 -0
  747. xorcise-0.1.0/tests/unit/test_run_create_spine.py +628 -0
  748. xorcise-0.1.0/tests/unit/test_run_create_static.py +133 -0
  749. xorcise-0.1.0/tests/unit/test_run_environment_rest.py +89 -0
  750. xorcise-0.1.0/tests/unit/test_run_readiness.py +176 -0
  751. xorcise-0.1.0/tests/unit/test_run_stats_fold.py +143 -0
  752. xorcise-0.1.0/tests/unit/test_run_teardown.py +67 -0
  753. xorcise-0.1.0/tests/unit/test_run_terminate.py +256 -0
  754. xorcise-0.1.0/tests/unit/test_runcontrol_attachment_fact.py +47 -0
  755. xorcise-0.1.0/tests/unit/test_runcontrol_connect.py +254 -0
  756. xorcise-0.1.0/tests/unit/test_runcontrol_mission_fact.py +40 -0
  757. xorcise-0.1.0/tests/unit/test_runcontrol_service.py +198 -0
  758. xorcise-0.1.0/tests/unit/test_runcontrol_signing.py +28 -0
  759. xorcise-0.1.0/tests/unit/test_runcontrol_store.py +40 -0
  760. xorcise-0.1.0/tests/unit/test_runner_netoverride.py +132 -0
  761. xorcise-0.1.0/tests/unit/test_runner_reap_orphans.py +49 -0
  762. xorcise-0.1.0/tests/unit/test_runner_service_readiness.py +104 -0
  763. xorcise-0.1.0/tests/unit/test_runner_service_stub.py +188 -0
  764. xorcise-0.1.0/tests/unit/test_runs_authenticate.py +25 -0
  765. xorcise-0.1.0/tests/unit/test_runs_events_rest.py +252 -0
  766. xorcise-0.1.0/tests/unit/test_runs_launch_profile_rest.py +128 -0
  767. xorcise-0.1.0/tests/unit/test_runs_repository.py +289 -0
  768. xorcise-0.1.0/tests/unit/test_runs_rest.py +711 -0
  769. xorcise-0.1.0/tests/unit/test_runs_stats_rest.py +78 -0
  770. xorcise-0.1.0/tests/unit/test_runs_terminal.py +54 -0
  771. xorcise-0.1.0/tests/unit/test_runs_terminate_rest.py +50 -0
  772. xorcise-0.1.0/tests/unit/test_runs_traces_rest.py +28 -0
  773. xorcise-0.1.0/tests/unit/test_scripted_agent_not_packaged.py +16 -0
  774. xorcise-0.1.0/tests/unit/test_scripted_agent_unit.py +29 -0
  775. xorcise-0.1.0/tests/unit/test_sealed_context_shape.py +26 -0
  776. xorcise-0.1.0/tests/unit/test_startup_tips.py +72 -0
  777. xorcise-0.1.0/tests/unit/test_startup_tips_and_preamble.py +36 -0
  778. xorcise-0.1.0/tests/unit/test_static_mission_contract.py +87 -0
  779. xorcise-0.1.0/tests/unit/test_static_mission_preflight_ingest.py +99 -0
  780. xorcise-0.1.0/tests/unit/test_stub_tree.py +60 -0
  781. xorcise-0.1.0/tests/unit/test_system_modules.py +196 -0
  782. xorcise-0.1.0/tests/unit/test_system_rest.py +25 -0
  783. xorcise-0.1.0/tests/unit/test_tailscale_dist.py +73 -0
  784. xorcise-0.1.0/tests/unit/test_telemetry_providers.py +111 -0
  785. xorcise-0.1.0/tests/unit/test_terrain_attribution.py +34 -0
  786. xorcise-0.1.0/tests/unit/test_terrain_attribution_v2.py +714 -0
  787. xorcise-0.1.0/tests/unit/test_terrain_catchup_v2.py +338 -0
  788. xorcise-0.1.0/tests/unit/test_terrain_live_test.py +74 -0
  789. xorcise-0.1.0/tests/unit/test_terrain_timeline.py +65 -0
  790. xorcise-0.1.0/tests/unit/test_terrain_update_store.py +126 -0
  791. xorcise-0.1.0/tests/unit/test_terrain_updates_infra.py +375 -0
  792. xorcise-0.1.0/tests/unit/test_terrain_v2_authored_graph.py +84 -0
  793. xorcise-0.1.0/tests/unit/test_terrain_v2_contract.py +60 -0
  794. xorcise-0.1.0/tests/unit/test_terrain_v2_known_ids.py +166 -0
  795. xorcise-0.1.0/tests/unit/test_terrain_v2_objective_reconcile.py +324 -0
  796. xorcise-0.1.0/tests/unit/test_terrain_v2_projector.py +123 -0
  797. xorcise-0.1.0/tests/unit/test_terrain_v2_rest.py +193 -0
  798. xorcise-0.1.0/tests/unit/test_token_counter.py +40 -0
  799. xorcise-0.1.0/tests/unit/test_trace_receipt_times.py +49 -0
  800. xorcise-0.1.0/tests/unit/test_up_builds_frontend.py +154 -0
  801. xorcise-0.1.0/tests/unit/test_up_prints_ui_url.py +31 -0
  802. xorcise-0.1.0/tests/unit/test_update_check.py +185 -0
  803. xorcise-0.1.0/uv.lock +2008 -0
@@ -0,0 +1,34 @@
1
+ # Copy to ~/.xorcise/.env (chmod 0600). Real values are never committed.
2
+ #
3
+ # Every setting is the field name from xorcise.core.config.Settings prefixed with
4
+ # XORCISE_. Anything left unset falls back to the documented default, so the shortest
5
+ # working file is just the three model_* lines below.
6
+
7
+ # --- BYOM model (required for grading) ---------------------------------------
8
+ # XORCISE bundles no model. Point these at any OpenAI-compatible endpoint — a hosted
9
+ # provider, or something you serve yourself (vLLM, Ollama, LM Studio).
10
+ XORCISE_MODEL_KEY=
11
+ XORCISE_MODEL_BASE_URL=
12
+ XORCISE_MODEL_NAME=
13
+ # Raise this for slow or reasoning models — they can spend a while thinking before
14
+ # emitting a verdict. Seconds; default 120.
15
+ # XORCISE_MODEL_TIMEOUT_SECONDS=120
16
+
17
+ # --- Persistence -------------------------------------------------------------
18
+ # Defaults to sqlite:///<home>/xorcise.db, where <home> is ~/.xorcise unless
19
+ # XORCISE_HOME says otherwise. Set this only to move the database elsewhere; a
20
+ # server dialect additionally needs the matching extra (pip install "xorcise[postgres]").
21
+ # XORCISE_DATABASE_URL=sqlite:////absolute/path/to/xorcise.db
22
+
23
+ # --- Mission catalog ---------------------------------------------------------
24
+ # Defaults to the XORCISE.AI catalog, which is what a fresh install browses and pulls
25
+ # missions from. Point a dev build somewhere else here, or clear it to run fully
26
+ # offline — the bundled missions/ bundles need no catalog at all. The UI's
27
+ # connect/disconnect switch toggles access without discarding the endpoint.
28
+ # XORCISE_CATALOG_URL=
29
+ # XORCISE_CATALOG_KEY=
30
+
31
+ # --- Attachment link signing -------------------------------------------------
32
+ # A fresh random secret is generated per process when unset. Pin it only if you need
33
+ # signed attachment URLs to survive a restart or to be shared between processes.
34
+ # XORCISE_RUN_CONTROL_SIGNING_SECRET=
@@ -0,0 +1,26 @@
1
+ # Code owners. With "Require review from Code Owners" in the branch ruleset, these paths
2
+ # cannot merge without a maintainer's approval. See MAINTAINERS.md.
3
+ #
4
+ # @guru-xorciseai Guru Hariharaun — author and maintainer
5
+ # @christo-xorciseai Christo Joby Antony — maintainer
6
+ #
7
+ # Both are on every rule so either can approve; a single owner would deadlock reviews.
8
+ #
9
+ # Two silent failure modes — neither reports an error at merge time:
10
+ # 1. an owner without WRITE access to the repo is ignored;
11
+ # 2. a handle that does not resolve is skipped, and the rule then protects nothing.
12
+ # Check for GitHub's warning banner on this file after pushing.
13
+
14
+ * @guru-xorciseai @christo-xorciseai
15
+
16
+ # Supply-chain critical: a bad change here compromises every release, not just one feature.
17
+ /.github/ @guru-xorciseai @christo-xorciseai
18
+ /.github/workflows/ @guru-xorciseai @christo-xorciseai
19
+ /.github/workflows/release.yml @guru-xorciseai @christo-xorciseai
20
+ /pyproject.toml @guru-xorciseai @christo-xorciseai
21
+ /hatch_build.py @guru-xorciseai @christo-xorciseai
22
+ /uv.lock @guru-xorciseai @christo-xorciseai
23
+ /scripts/ @guru-xorciseai @christo-xorciseai
24
+ /SECURITY.md @guru-xorciseai @christo-xorciseai
25
+ /CODE_OF_CONDUCT.md @guru-xorciseai @christo-xorciseai
26
+ /LICENSE @guru-xorciseai @christo-xorciseai
@@ -0,0 +1,126 @@
1
+ name: Bug report
2
+ description: Something in XORCISE does not work the way it should.
3
+ title: "[Bug]: "
4
+ labels:
5
+ - bug
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Thanks for taking the time to file a bug.
11
+
12
+ **Security vulnerabilities do not belong here.** If you have found a security issue,
13
+ please report it privately — see [SECURITY.md](../blob/main/SECURITY.md). Public
14
+ issues are visible to everyone, including people who would exploit the flaw.
15
+
16
+ Note that missions are **deliberately vulnerable**; that is their purpose.
17
+ Vulnerabilities inside a mission bundle are not XORCISE bugs.
18
+
19
+ - type: checkboxes
20
+ id: preflight
21
+ attributes:
22
+ label: Before you file
23
+ options:
24
+ - label: I searched existing issues and this is not a duplicate.
25
+ required: true
26
+ - label: This is not a security vulnerability (those go to SECURITY.md).
27
+ required: true
28
+
29
+ - type: input
30
+ id: version
31
+ attributes:
32
+ label: XORCISE version
33
+ description: Output of `xorcise --version`.
34
+ placeholder: "0.1.0"
35
+ validations:
36
+ required: true
37
+
38
+ - type: dropdown
39
+ id: install-method
40
+ attributes:
41
+ label: How did you install XORCISE?
42
+ options:
43
+ - pip / uv from PyPI
44
+ - From a git checkout (editable install)
45
+ - From a built wheel
46
+ - Other (describe below)
47
+ validations:
48
+ required: true
49
+
50
+ - type: input
51
+ id: os
52
+ attributes:
53
+ label: Operating system
54
+ description: Include the version. On Linux, the distribution too.
55
+ placeholder: "Ubuntu 24.04 / macOS 15.1 / Windows 11 + WSL2"
56
+ validations:
57
+ required: true
58
+
59
+ - type: input
60
+ id: python-version
61
+ attributes:
62
+ label: Python version
63
+ description: Output of `python --version`. XORCISE requires 3.12 or newer.
64
+ placeholder: "3.12.3"
65
+ validations:
66
+ required: true
67
+
68
+ - type: input
69
+ id: docker-version
70
+ attributes:
71
+ label: Docker version
72
+ description: >-
73
+ Output of `docker --version`. Required if the bug involves running a mission,
74
+ `xorcise up`, the runner, or the control plane. Write "n/a" if unrelated.
75
+ placeholder: "Docker version 27.3.1"
76
+ validations:
77
+ required: true
78
+
79
+ - type: textarea
80
+ id: reproduction
81
+ attributes:
82
+ label: Steps to reproduce
83
+ description: >-
84
+ Exact commands, in order. A bug someone else can reproduce gets fixed; one that only
85
+ happens on your machine usually does not.
86
+ placeholder: |
87
+ 1. xorcise up
88
+ 2. xorcise mission pull <name>
89
+ 3. xorcise run create --mission <name> --agent <agent>
90
+ 4. ...
91
+ validations:
92
+ required: true
93
+
94
+ - type: textarea
95
+ id: expected
96
+ attributes:
97
+ label: Expected behaviour
98
+ validations:
99
+ required: true
100
+
101
+ - type: textarea
102
+ id: actual
103
+ attributes:
104
+ label: What actually happened
105
+ description: Include the full error message if there is one.
106
+ validations:
107
+ required: true
108
+
109
+ - type: textarea
110
+ id: logs
111
+ attributes:
112
+ label: Logs / output
113
+ description: >-
114
+ Relevant output. **Remove secrets first** — API keys, tokens, tailnet auth keys,
115
+ certificates, internal hostnames. This box renders as a code block automatically.
116
+ render: shell
117
+ validations:
118
+ required: false
119
+
120
+ - type: textarea
121
+ id: context
122
+ attributes:
123
+ label: Anything else
124
+ description: Screenshots, related issues, workarounds you have found.
125
+ validations:
126
+ required: false
@@ -0,0 +1,26 @@
1
+ # Issue-template chooser configuration.
2
+ #
3
+ # `blank_issues_enabled: false` forces every report through one of the structured forms. That
4
+ # is not bureaucracy: the single biggest cost in triage is going back and forth asking for a
5
+ # version number and a reproduction, and the forms collect both up front.
6
+ #
7
+ # The security link is the important one. It routes vulnerability reports to GitHub's private
8
+ # advisory flow BEFORE someone posts an exploitable flaw in a public issue.
9
+ blank_issues_enabled: false
10
+
11
+ contact_links:
12
+ - name: 🔒 Report a security vulnerability (private)
13
+ # PLACEHOLDER: xorcise-ai/xorcise — substitute the real GitHub org/repo.
14
+ # Requires "Private vulnerability reporting" to be enabled in repository settings.
15
+ url: https://github.com/xorcise-ai/xorcise/security/advisories/new
16
+ about: >-
17
+ Never report a vulnerability in a public issue. Use GitHub's private advisory form so the
18
+ problem can be fixed before it is disclosed. See SECURITY.md for scope and what to include.
19
+
20
+ - name: 💬 Questions and general discussion
21
+ # PLACEHOLDER: xorcise-ai/xorcise. If GitHub Discussions is not enabled, remove this entry
22
+ # rather than leaving a link that 404s.
23
+ url: https://github.com/xorcise-ai/xorcise/discussions
24
+ about: >-
25
+ Usage questions, ideas that are not yet a concrete feature request, and "am I doing this
26
+ right?" — these get better answers in Discussions than in the issue tracker.
@@ -0,0 +1,85 @@
1
+ name: Feature request
2
+ description: Suggest a capability or improvement for XORCISE.
3
+ title: "[Feature]: "
4
+ labels:
5
+ - feature
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Thanks for the suggestion. The most useful feature requests describe a **problem you
11
+ hit**, not just a solution you have in mind — that leaves room for a better design than
12
+ either of us had first.
13
+
14
+ - type: checkboxes
15
+ id: preflight
16
+ attributes:
17
+ label: Before you file
18
+ options:
19
+ - label: I searched existing issues and discussions and this is not a duplicate.
20
+ required: true
21
+
22
+ - type: textarea
23
+ id: problem
24
+ attributes:
25
+ label: What problem are you trying to solve?
26
+ description: >-
27
+ What are you trying to do, and what stops you today? Concrete beats abstract:
28
+ "I cannot compare two agents across the same mission set without exporting to CSV
29
+ by hand" is far more useful than "reporting should be better".
30
+ validations:
31
+ required: true
32
+
33
+ - type: textarea
34
+ id: proposal
35
+ attributes:
36
+ label: What would you like to happen?
37
+ description: Your proposed solution, if you have one. Sketch the CLI or UI if it helps.
38
+ validations:
39
+ required: true
40
+
41
+ - type: textarea
42
+ id: alternatives
43
+ attributes:
44
+ label: Alternatives you have considered
45
+ description: Including workarounds you are using now.
46
+ validations:
47
+ required: false
48
+
49
+ - type: dropdown
50
+ id: area
51
+ attributes:
52
+ label: Which part of XORCISE does this affect?
53
+ multiple: true
54
+ options:
55
+ - CLI
56
+ - Web UI / frontend
57
+ - Runner / mission execution
58
+ - Control plane / networking
59
+ - Agent harness adapters
60
+ - Mission format or schema
61
+ - Grading / evaluation
62
+ - Reporting
63
+ - Packaging / installation
64
+ - Documentation
65
+ - Not sure
66
+ validations:
67
+ required: false
68
+
69
+ - type: checkboxes
70
+ id: breaking
71
+ attributes:
72
+ label: Compatibility
73
+ options:
74
+ - label: >-
75
+ As far as I can tell, this would require a breaking change to an existing
76
+ interface (CLI options, config, mission schema, adapter contract, output format).
77
+ required: false
78
+
79
+ - type: checkboxes
80
+ id: contribution
81
+ attributes:
82
+ label: Contribution
83
+ options:
84
+ - label: I would be willing to work on this myself.
85
+ required: false
@@ -0,0 +1,90 @@
1
+ <!--
2
+ Thanks for contributing to XORCISE.
3
+
4
+ Nothing here is busywork: each item below maps to a check a reviewer would otherwise have to
5
+ run by hand. Delete any section that genuinely does not apply, and say why.
6
+ -->
7
+
8
+ ## What changed
9
+
10
+ <!-- The change itself, in a sentence or two. -->
11
+
12
+ ## Why
13
+
14
+ <!-- The problem this solves. Link an issue with "Closes #123" if there is one. If this is a
15
+ behaviour change, say what a user could not do before and can do now. -->
16
+
17
+ ## Testing
18
+
19
+ <!-- What you actually ran, and what it printed. "Tests pass" is not evidence; a command and
20
+ its result is. -->
21
+
22
+ ```
23
+ # e.g. uv run pytest -m unit -n auto
24
+ ```
25
+
26
+ **Test lanes affected** (tick every lane your change could plausibly break):
27
+
28
+ - [ ] `unit` — no Docker, fast
29
+ - [ ] `adapters` — port/adapter contracts
30
+ - [ ] `topology` — manifest / compose / import / extras parity
31
+ - [ ] `integration` — needs Docker or a live server process
32
+ - [ ] `e2e` — full `xorcise up` + scripted agent
33
+ - [ ] `frontend` — Next.js typecheck / vitest
34
+
35
+ > The `integration` and `e2e` lanes do **not** run on pull requests by default — they need a
36
+ > Docker daemon and bind fixed ports. If your change touches the runner, the control plane,
37
+ > networking, or `xorcise up`, ask a maintainer to add the **`full-ci`** label so those lanes
38
+ > run on this PR before it merges.
39
+
40
+ ## User-facing impact
41
+
42
+ - [ ] No user-visible change (internal refactor, tests, docs only)
43
+ - [ ] Backwards-compatible addition (new command, new optional flag, new field)
44
+ - [ ] **Breaking change** — describe the break and the migration path below
45
+
46
+ <!-- Public interfaces include: CLI commands and options, configuration files, environment
47
+ variables, mission manifests and schema, agent/adapter contracts, documented Python
48
+ APIs, REST contracts, and machine-readable output formats. Changing any of these affects
49
+ the next version number — see CONTRIBUTING.md. -->
50
+
51
+ ## Documentation
52
+
53
+ - [ ] No documentation change needed
54
+ - [ ] Documentation updated in this PR
55
+ - [ ] Documentation needed and tracked in a follow-up issue (link it)
56
+
57
+ ## Dependencies
58
+
59
+ - [ ] No dependency changes
60
+ - [ ] Dependencies changed **and** the lockfile is committed
61
+ (`uv lock` for Python, `npm install` for `frontend/` — CI runs `uv sync --locked` and
62
+ `npm ci`, which fail if a manifest and its lockfile disagree)
63
+
64
+ ## Checklist
65
+
66
+ - [ ] `uv run ruff check .` and `uv run ruff format --check .` pass
67
+ - [ ] `uv run mypy` passes (strict)
68
+ - [ ] `uv run lint-imports` passes (architecture layer rules)
69
+ - [ ] Relevant test lanes pass locally
70
+ - [ ] **No secrets, credentials, tokens, keys, internal hostnames or customer data** appear in
71
+ the diff — including in test fixtures, logs and comments
72
+ - [ ] No references to internal-only systems (private trackers, internal URLs, internal
73
+ process names) in code or documentation
74
+
75
+ ## Release notes
76
+
77
+ <!-- Maintainers: apply ONE of these labels so this PR lands in the right section of the
78
+ generated release notes (.github/release.yml):
79
+ breaking-change · feature · enhancement · bug · security · documentation ·
80
+ dependencies · internal · skip-release-notes
81
+ -->
82
+
83
+ ---
84
+
85
+ By opening this pull request you agree that your contribution is licensed under the
86
+ [Apache License 2.0](../LICENSE), and that you have read the
87
+ [Code of Conduct](../CODE_OF_CONDUCT.md).
88
+
89
+ **Found a security vulnerability?** Do not open a pull request or a public issue — follow
90
+ [SECURITY.md](../SECURITY.md) instead.
@@ -0,0 +1,11 @@
1
+ # CodeQL analysis config. Note this is not the workflow's `paths-ignore`, which only decides
2
+ # whether the workflow runs — this is what removes code from the database.
3
+ name: "XORCISE CodeQL config"
4
+
5
+ paths-ignore:
6
+ # Mission bundles are deliberately vulnerable: SQL injection, weak crypto and hardcoded flags
7
+ # are the content, not defects. Scanning them buries real findings under intentional ones.
8
+ # Harmless to keep if missions/ is later removed — an exclusion for a missing path is a no-op.
9
+ - missions
10
+ # Generated Next.js bundle. The authored sources under frontend/ are analysed instead.
11
+ - src/xorcise/core/frontend/_static
@@ -0,0 +1,101 @@
1
+ # Dependency updates.
2
+ #
3
+ # The `github-actions` ecosystem is the security-critical one: every `uses:` is pinned to a
4
+ # commit SHA, and Dependabot is what stops those pins going stale. `ignore` only suppresses
5
+ # version-bump PRs — security alerts and fixes still arrive.
6
+ version: 2
7
+
8
+ updates:
9
+ - package-ecosystem: uv
10
+ directory: /
11
+ schedule:
12
+ interval: weekly
13
+ day: monday
14
+ time: "06:00"
15
+ timezone: Etc/UTC
16
+ # Supply-chain maturity window: never adopt a release in its first 7 days.
17
+ #
18
+ # The attack this blocks is a compromised or hijacked package publishing a malicious
19
+ # version. Those are typically caught and yanked within hours-to-days, so the danger
20
+ # window is the release's infancy — precisely when an eager auto-bump would take it.
21
+ # Waiting lets the ecosystem find the problem for us; a version still standing after a
22
+ # week has been exercised by thousands of other installs.
23
+ #
24
+ # This deliberately applies to VERSION updates only. GitHub does not apply cooldown to
25
+ # Dependabot SECURITY updates, which is the behaviour we want: a fix for a known CVE
26
+ # must not sit in a queue for a week. Fast for fixes, patient for features.
27
+ cooldown:
28
+ default-days: 7
29
+ open-pull-requests-limit: 5
30
+ labels:
31
+ - dependencies
32
+ groups:
33
+ python-minor-patch:
34
+ update-types:
35
+ - minor
36
+ - patch
37
+ ignore:
38
+ # opentelemetry-proto is pinned exactly: it decodes the OTLP wire format, so a mismatch
39
+ # corrupts traces rather than raising an import error. Majors only — minor/patch still flow.
40
+ - dependency-name: opentelemetry-*
41
+ update-types: ["version-update:semver-major"]
42
+
43
+ - package-ecosystem: npm
44
+ directory: /frontend
45
+ schedule:
46
+ interval: weekly
47
+ day: monday
48
+ time: "06:00"
49
+ timezone: Etc/UTC
50
+ # Supply-chain maturity window: never adopt a release in its first 7 days.
51
+ #
52
+ # The attack this blocks is a compromised or hijacked package publishing a malicious
53
+ # version. Those are typically caught and yanked within hours-to-days, so the danger
54
+ # window is the release's infancy — precisely when an eager auto-bump would take it.
55
+ # Waiting lets the ecosystem find the problem for us; a version still standing after a
56
+ # week has been exercised by thousands of other installs.
57
+ #
58
+ # This deliberately applies to VERSION updates only. GitHub does not apply cooldown to
59
+ # Dependabot SECURITY updates, which is the behaviour we want: a fix for a known CVE
60
+ # must not sit in a queue for a week. Fast for fixes, patient for features.
61
+ cooldown:
62
+ default-days: 7
63
+ open-pull-requests-limit: 5
64
+ labels:
65
+ - dependencies
66
+ groups:
67
+ frontend-minor-patch:
68
+ update-types:
69
+ - minor
70
+ - patch
71
+
72
+ # Grouped into one PR: a single reviewable PR actually gets merged, which is what keeps the
73
+ # SHA pins current.
74
+ - package-ecosystem: github-actions
75
+ directory: /
76
+ schedule:
77
+ interval: weekly
78
+ day: monday
79
+ time: "06:00"
80
+ timezone: Etc/UTC
81
+ # Supply-chain maturity window: never adopt a release in its first 7 days.
82
+ #
83
+ # The attack this blocks is a compromised or hijacked package publishing a malicious
84
+ # version. Those are typically caught and yanked within hours-to-days, so the danger
85
+ # window is the release's infancy — precisely when an eager auto-bump would take it.
86
+ # Waiting lets the ecosystem find the problem for us; a version still standing after a
87
+ # week has been exercised by thousands of other installs.
88
+ #
89
+ # This deliberately applies to VERSION updates only. GitHub does not apply cooldown to
90
+ # Dependabot SECURITY updates, which is the behaviour we want: a fix for a known CVE
91
+ # must not sit in a queue for a week. Fast for fixes, patient for features.
92
+ cooldown:
93
+ default-days: 7
94
+ open-pull-requests-limit: 5
95
+ labels:
96
+ - dependencies
97
+ - internal
98
+ groups:
99
+ github-actions:
100
+ patterns:
101
+ - "*"
@@ -0,0 +1,56 @@
1
+ # Generated release-notes configuration.
2
+ #
3
+ # NOT a workflow. GitHub reads this file when `gh release create --generate-notes` runs (see
4
+ # .github/workflows/release.yml) and uses it to group merged pull requests into sections.
5
+ #
6
+ # This is what makes "merge ten PRs, release once" produce a readable changelog: each PR is
7
+ # filed by its label, so the notes for v0.2.0 arrive already sorted into breaking changes,
8
+ # features, fixes and so on — rather than a flat list of commit subjects.
9
+ #
10
+ # Labelling a PR is therefore part of reviewing it. An unlabelled PR still appears, under
11
+ # "Other changes".
12
+ changelog:
13
+ exclude:
14
+ labels:
15
+ # Routine noise that should not appear in user-facing notes.
16
+ - skip-release-notes
17
+ categories:
18
+ # Order matters — this is the order sections appear in the notes. Breaking changes go
19
+ # first because they are the only thing a user MUST read before upgrading.
20
+ - title: ⚠️ Breaking changes
21
+ labels:
22
+ - breaking-change
23
+
24
+ - title: 🚀 New features
25
+ labels:
26
+ - feature
27
+
28
+ - title: ✨ Enhancements
29
+ labels:
30
+ - enhancement
31
+
32
+ - title: 🐛 Bug fixes
33
+ labels:
34
+ - bug
35
+
36
+ - title: 🔒 Security
37
+ labels:
38
+ - security
39
+
40
+ - title: 📚 Documentation
41
+ labels:
42
+ - documentation
43
+
44
+ - title: 📦 Dependencies
45
+ labels:
46
+ - dependencies
47
+
48
+ - title: 🔧 Internal
49
+ labels:
50
+ - internal
51
+
52
+ # Catch-all. `*` matches any PR not already claimed by a category above, so nothing is
53
+ # ever silently dropped from the notes.
54
+ - title: Other changes
55
+ labels:
56
+ - "*"