simpleaudit-studio 0.5.2__tar.gz → 0.5.4__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.

Potentially problematic release.


This version of simpleaudit-studio might be problematic. Click here for more details.

Files changed (359) hide show
  1. simpleaudit_studio-0.5.4/.env.dev.example +90 -0
  2. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/.env.example +35 -2
  3. simpleaudit_studio-0.5.4/.github/agents/orchestrator.agent.md +47 -0
  4. simpleaudit_studio-0.5.4/.github/agents/regression-reviewer.agent.md +21 -0
  5. simpleaudit_studio-0.5.4/.github/agents/researcher.agent.md +13 -0
  6. simpleaudit_studio-0.5.4/.github/agents/test-reviewer.agent.md +21 -0
  7. simpleaudit_studio-0.5.4/.github/agents/verifier.agent.md +25 -0
  8. simpleaudit_studio-0.5.4/.github/prompts/parallel-orchestrate.prompt.md +21 -0
  9. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/.github/workflows/ci.yml +11 -4
  10. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/.gitignore +1 -0
  11. simpleaudit_studio-0.5.4/AGENTS.md +109 -0
  12. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/Dockerfile +23 -10
  13. simpleaudit_studio-0.5.4/PKG-INFO +102 -0
  14. simpleaudit_studio-0.5.4/README.md +64 -0
  15. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/apps.py +3 -0
  16. simpleaudit_studio-0.5.4/accounts/migrations/0003_project_created_by_projectmembership_created_by.py +36 -0
  17. simpleaudit_studio-0.5.4/accounts/migrations/0004_project_openwebui_admin_group_id_and_more.py +27 -0
  18. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/models.py +18 -1
  19. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/serializers.py +5 -1
  20. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/services.py +31 -5
  21. simpleaudit_studio-0.5.4/accounts/signals.py +20 -0
  22. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/views.py +7 -2
  23. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/comparison.py +40 -1
  24. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/experiments.py +66 -2
  25. simpleaudit_studio-0.5.4/audits/migrations/0005_auditrun_trace_config.py +17 -0
  26. simpleaudit_studio-0.5.4/audits/migrations/0006_alter_monitor_next_run_at.py +19 -0
  27. simpleaudit_studio-0.5.4/audits/migrations/0007_agent_target.py +30 -0
  28. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/models.py +18 -1
  29. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/monitors.py +34 -24
  30. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/serializers.py +9 -0
  31. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/services.py +67 -0
  32. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/views.py +7 -2
  33. simpleaudit_studio-0.5.4/chat/__init__.py +6 -0
  34. simpleaudit_studio-0.5.4/chat/access_sync.py +159 -0
  35. simpleaudit_studio-0.5.4/chat/api.py +529 -0
  36. simpleaudit_studio-0.5.4/chat/apps.py +28 -0
  37. simpleaudit_studio-0.5.4/chat/config.py +183 -0
  38. simpleaudit_studio-0.5.4/chat/embed.css +106 -0
  39. simpleaudit_studio-0.5.4/chat/embed_admin.css +68 -0
  40. simpleaudit_studio-0.5.4/chat/embed_admin.js +201 -0
  41. simpleaudit_studio-0.5.4/chat/management/commands/chat_knowledge.py +59 -0
  42. simpleaudit_studio-0.5.4/chat/management/commands/sync_chat_models.py +54 -0
  43. simpleaudit_studio-0.5.4/chat/proxy.py +805 -0
  44. simpleaudit_studio-0.5.4/chat/signals.py +33 -0
  45. simpleaudit_studio-0.5.4/chat/sync.py +149 -0
  46. simpleaudit_studio-0.5.4/chat/templates/chat/chat.html +333 -0
  47. simpleaudit_studio-0.5.4/chat/tests/__init__.py +8 -0
  48. simpleaudit_studio-0.5.4/chat/tests/test_access_sync.py +54 -0
  49. simpleaudit_studio-0.5.4/chat/tests/test_api.py +312 -0
  50. simpleaudit_studio-0.5.4/chat/tests/test_chat.py +591 -0
  51. simpleaudit_studio-0.5.4/chat/tests/test_proxy.py +395 -0
  52. simpleaudit_studio-0.5.4/chat/tests/test_sync.py +228 -0
  53. simpleaudit_studio-0.5.4/chat/urls.py +14 -0
  54. simpleaudit_studio-0.5.4/chat/views.py +295 -0
  55. simpleaudit_studio-0.5.4/config/runtime.py +193 -0
  56. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/config/settings.py +52 -1
  57. simpleaudit_studio-0.5.4/config/tests/test_runtime.py +223 -0
  58. simpleaudit_studio-0.5.4/config/tests/test_settings_sqlite_path.py +59 -0
  59. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/config/urls.py +74 -1
  60. simpleaudit_studio-0.5.4/conftest.py +31 -0
  61. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/deploy/compose/Dockerfile +4 -1
  62. simpleaudit_studio-0.5.4/deploy/openwebui-subpath/0002-node-build-heap.patch +14 -0
  63. simpleaudit_studio-0.5.4/deploy/openwebui-subpath/Caddyfile.subpath +138 -0
  64. simpleaudit_studio-0.5.4/deploy/openwebui-subpath/DESIGN.md +147 -0
  65. simpleaudit_studio-0.5.4/deploy/openwebui-subpath/README.md +139 -0
  66. simpleaudit_studio-0.5.4/deploy/openwebui-subpath/UPGRADE.md +126 -0
  67. simpleaudit_studio-0.5.4/deploy/openwebui-subpath/build.sh +65 -0
  68. simpleaudit_studio-0.5.4/deploy/openwebui-subpath/subpath-v0.9.6.patch +3808 -0
  69. simpleaudit_studio-0.5.4/deploy/openwebui-subpath/subpath.patch +4711 -0
  70. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/docker-compose.yml +84 -2
  71. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/docs/architecture.md +1 -1
  72. simpleaudit_studio-0.5.4/docs/chat.md +373 -0
  73. simpleaudit_studio-0.5.4/docs/deployment.md +214 -0
  74. simpleaudit_studio-0.5.4/docs/superpowers/plans/2026-10-03-openwebui-resource-management.md +586 -0
  75. simpleaudit_studio-0.5.4/docs/superpowers/specs/2026-10-03-openwebui-resource-management-design.md +267 -0
  76. simpleaudit_studio-0.5.4/docs/superpowers/specs/2026-10-03-run-modes-design.md +241 -0
  77. simpleaudit_studio-0.5.4/infra/chat_feature.py +18 -0
  78. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/context_processors.py +36 -12
  79. simpleaudit_studio-0.5.4/infra/demo_audit.py +457 -0
  80. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/engine.py +269 -30
  81. simpleaudit_studio-0.5.4/infra/fixtures/sample_docs/refunds_and_returns_policy.md +93 -0
  82. simpleaudit_studio-0.5.4/infra/fixtures/sample_docs/shipping_and_delivery_guide.md +100 -0
  83. simpleaudit_studio-0.5.4/infra/fixtures/sample_tools/order_lookup.py +75 -0
  84. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/health.py +1 -1
  85. simpleaudit_studio-0.5.4/infra/management/commands/dev.py +68 -0
  86. simpleaudit_studio-0.5.4/infra/management/commands/dev_server.py +422 -0
  87. simpleaudit_studio-0.5.4/infra/management/commands/mode.py +69 -0
  88. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/management/commands/seed_platform.py +20 -0
  89. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/management/commands/setup_local.py +1 -1
  90. simpleaudit_studio-0.5.4/infra/management/commands/wire_demo_audit.py +31 -0
  91. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/middleware.py +47 -3
  92. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/minimal_config.py +44 -3
  93. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/runs_table.py +16 -2
  94. simpleaudit_studio-0.5.4/infra/seed.py +535 -0
  95. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/seo.py +2 -2
  96. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/templatetags/json_filters.py +8 -0
  97. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/factories.py +41 -1
  98. simpleaudit_studio-0.5.4/infra/tests/test_admin_page.py +202 -0
  99. simpleaudit_studio-0.5.4/infra/tests/test_agent_resources.py +226 -0
  100. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_api_e2e.py +2 -0
  101. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_audit_results_live.py +20 -0
  102. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_audit_run_freeze.py +77 -0
  103. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_comparison.py +28 -0
  104. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_connection_sharing.py +52 -0
  105. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_embedded_cleanup.py +41 -0
  106. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_engine_integration.py +75 -1
  107. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_experiments.py +17 -1
  108. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_judges.py +2 -1
  109. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_minimal_config.py +89 -1
  110. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_monitors.py +38 -2
  111. simpleaudit_studio-0.5.4/infra/tests/test_seed_demo_agent.py +342 -0
  112. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_smoke_all_pages.py +19 -0
  113. simpleaudit_studio-0.5.4/infra/tests/test_trace_card_view.py +97 -0
  114. simpleaudit_studio-0.5.4/infra/tests/test_tracing.py +533 -0
  115. simpleaudit_studio-0.5.4/infra/tests/test_user_project_assignment.py +112 -0
  116. simpleaudit_studio-0.5.4/infra/tests/test_visualizer.py +216 -0
  117. simpleaudit_studio-0.5.4/infra/tracing.py +307 -0
  118. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/ui.py +1158 -26
  119. simpleaudit_studio-0.5.4/infra/visualizer.py +486 -0
  120. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/worker.py +19 -0
  121. simpleaudit_studio-0.5.4/integrations/openwebui/client.py +403 -0
  122. simpleaudit_studio-0.5.4/judges/migrations/__init__.py +0 -0
  123. simpleaudit_studio-0.5.4/manage.py +63 -0
  124. simpleaudit_studio-0.5.4/model_registry/__init__.py +0 -0
  125. simpleaudit_studio-0.5.4/model_registry/agent_serializers.py +123 -0
  126. simpleaudit_studio-0.5.4/model_registry/agent_views.py +222 -0
  127. simpleaudit_studio-0.5.4/model_registry/migrations/0004_otlpcredential.py +39 -0
  128. simpleaudit_studio-0.5.4/model_registry/migrations/0005_alter_otlpcredential_auth_mode_and_more.py +35 -0
  129. simpleaudit_studio-0.5.4/model_registry/migrations/0006_otlpcredential_token_prefix.py +19 -0
  130. simpleaudit_studio-0.5.4/model_registry/migrations/0007_otlpspan.py +50 -0
  131. simpleaudit_studio-0.5.4/model_registry/migrations/0008_agent_domain.py +371 -0
  132. simpleaudit_studio-0.5.4/model_registry/migrations/0009_add_kb_external_id_unique.py +21 -0
  133. simpleaudit_studio-0.5.4/model_registry/migrations/0010_remove_mcp.py +35 -0
  134. simpleaudit_studio-0.5.4/model_registry/migrations/0011_knowledgebase_created_by_registeredmodel_created_by_and_more.py +64 -0
  135. simpleaudit_studio-0.5.4/model_registry/migrations/0012_agent_external_id.py +20 -0
  136. simpleaudit_studio-0.5.4/model_registry/migrations/0013_remove_agent_retrieval_profile_and_more.py +58 -0
  137. simpleaudit_studio-0.5.4/model_registry/migrations/0014_alter_tool_type.py +25 -0
  138. simpleaudit_studio-0.5.4/model_registry/migrations/0015_knowledgereindex.py +67 -0
  139. simpleaudit_studio-0.5.4/model_registry/migrations/__init__.py +0 -0
  140. simpleaudit_studio-0.5.4/model_registry/models.py +481 -0
  141. simpleaudit_studio-0.5.4/model_registry/otlp_config.py +30 -0
  142. simpleaudit_studio-0.5.4/model_registry/otlp_services.py +200 -0
  143. simpleaudit_studio-0.5.4/model_registry/otlp_views.py +373 -0
  144. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/model_registry/services.py +201 -0
  145. simpleaudit_studio-0.5.4/model_registry/tests/__init__.py +0 -0
  146. simpleaudit_studio-0.5.4/model_registry/tests/test_agent_domain.py +676 -0
  147. simpleaudit_studio-0.5.4/model_registry/tests/test_agent_owui_sync.py +400 -0
  148. simpleaudit_studio-0.5.4/model_registry/tests/test_otlp_receiver.py +476 -0
  149. simpleaudit_studio-0.5.4/model_registry/urls.py +15 -0
  150. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/model_registry/views.py +4 -2
  151. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/pyproject.toml +24 -4
  152. simpleaudit_studio-0.5.4/pytest.ini +20 -0
  153. simpleaudit_studio-0.5.4/scenarios/__init__.py +0 -0
  154. simpleaudit_studio-0.5.4/scenarios/migrations/__init__.py +0 -0
  155. simpleaudit_studio-0.5.4/simpleaudit_studio/cli.py +567 -0
  156. simpleaudit_studio-0.5.4/simpleaudit_studio/ports.py +280 -0
  157. simpleaudit_studio-0.5.4/simpleaudit_studio/process_guard.py +67 -0
  158. simpleaudit_studio-0.5.4/simpleaudit_studio/tests/__init__.py +0 -0
  159. simpleaudit_studio-0.5.4/simpleaudit_studio/tests/test_ports.py +243 -0
  160. simpleaudit_studio-0.5.4/static/scenario_viewer.html +1187 -0
  161. simpleaudit_studio-0.5.4/static/visualizer.html +2264 -0
  162. simpleaudit_studio-0.5.4/templates/admin/_rag_checkbox.html +4 -0
  163. simpleaudit_studio-0.5.4/templates/admin/_rag_number.html +3 -0
  164. simpleaudit_studio-0.5.4/templates/admin/_rag_text.html +3 -0
  165. simpleaudit_studio-0.5.4/templates/admin/_tabs.html +5 -0
  166. simpleaudit_studio-0.5.4/templates/admin/rag_settings.html +144 -0
  167. simpleaudit_studio-0.5.4/templates/admin/sub_agents.html +39 -0
  168. simpleaudit_studio-0.5.4/templates/admin/web_search.html +34 -0
  169. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/admin.html +1 -5
  170. simpleaudit_studio-0.5.4/templates/agents/agent_detail.html +309 -0
  171. simpleaudit_studio-0.5.4/templates/agents/agents.html +59 -0
  172. simpleaudit_studio-0.5.4/templates/agents/resources.html +36 -0
  173. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/base.html +102 -15
  174. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/compare.html +12 -0
  175. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/connections.html +98 -0
  176. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/experiment_new.html +9 -4
  177. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/footer.html +2 -2
  178. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/model_pickers.html +39 -2
  179. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/need_help.html +1 -1
  180. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/result_rep_panel.html +55 -0
  181. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/sidebar.html +6 -4
  182. simpleaudit_studio-0.5.4/templates/partials/visualizer_sidebar.html +52 -0
  183. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/public/landing.html +3 -3
  184. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/run_detail.html +23 -0
  185. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/run_result.html +81 -3
  186. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/uv.lock +283 -6
  187. simpleaudit_studio-0.5.2/.env.local.example +0 -69
  188. simpleaudit_studio-0.5.2/PKG-INFO +0 -171
  189. simpleaudit_studio-0.5.2/README.md +0 -141
  190. simpleaudit_studio-0.5.2/docs/deployment.md +0 -127
  191. simpleaudit_studio-0.5.2/infra/management/commands/dev_server.py +0 -166
  192. simpleaudit_studio-0.5.2/infra/seed.py +0 -186
  193. simpleaudit_studio-0.5.2/infra/tests/test_admin_page.py +0 -88
  194. simpleaudit_studio-0.5.2/manage.py +0 -38
  195. simpleaudit_studio-0.5.2/model_registry/models.py +0 -100
  196. simpleaudit_studio-0.5.2/model_registry/urls.py +0 -7
  197. simpleaudit_studio-0.5.2/simpleaudit_studio/cli.py +0 -284
  198. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/.dockerignore +0 -0
  199. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/.github/workflows/docker.yml +0 -0
  200. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/.github/workflows/publish.yml +0 -0
  201. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/LICENSE +0 -0
  202. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/__init__.py +0 -0
  203. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/admin.py +0 -0
  204. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/admin_urls.py +0 -0
  205. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/auth_urls.py +0 -0
  206. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/migrations/0001_initial.py +0 -0
  207. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/migrations/0002_user_preferences.py +0 -0
  208. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/migrations/__init__.py +0 -0
  209. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/project_urls.py +0 -0
  210. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/accounts/workos_auth.py +0 -0
  211. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/__init__.py +0 -0
  212. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/admin.py +0 -0
  213. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/apps.py +0 -0
  214. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/events.py +0 -0
  215. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/migrations/0001_initial.py +0 -0
  216. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/migrations/0002_strip_api_keys_from_snapshots.py +0 -0
  217. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/migrations/0003_judges.py +0 -0
  218. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/migrations/0004_judge_model_per_run.py +0 -0
  219. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/migrations/__init__.py +0 -0
  220. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/audits/urls.py +0 -0
  221. {simpleaudit_studio-0.5.2/infra → simpleaudit_studio-0.5.4/chat/management}/__init__.py +0 -0
  222. {simpleaudit_studio-0.5.2/infra/management → simpleaudit_studio-0.5.4/chat/management/commands}/__init__.py +0 -0
  223. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/config/__init__.py +0 -0
  224. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/config/asgi.py +0 -0
  225. {simpleaudit_studio-0.5.2/infra/management/commands → simpleaudit_studio-0.5.4/config/tests}/__init__.py +0 -0
  226. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/config/wsgi.py +0 -0
  227. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/deploy/mock_openai_server.py +0 -0
  228. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/deploy/postgres-init.sql +0 -0
  229. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/docs/domain-model.md +0 -0
  230. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/e2e/test_ui.py +0 -0
  231. {simpleaudit_studio-0.5.2/infra/templatetags → simpleaudit_studio-0.5.4/infra}/__init__.py +0 -0
  232. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/admin.py +0 -0
  233. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/apps.py +0 -0
  234. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/codegen.py +0 -0
  235. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/db.py +0 -0
  236. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/exceptions.py +0 -0
  237. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/fixtures/demo_audit_results.json +0 -0
  238. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/hashing.py +0 -0
  239. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/health_api.py +0 -0
  240. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/logging.py +0 -0
  241. {simpleaudit_studio-0.5.2/judges → simpleaudit_studio-0.5.4/infra/management}/__init__.py +0 -0
  242. {simpleaudit_studio-0.5.2/judges/migrations → simpleaudit_studio-0.5.4/infra/management/commands}/__init__.py +0 -0
  243. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/management/commands/bootstrap_platform.py +0 -0
  244. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/management/commands/purge_test_data.py +0 -0
  245. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/management/commands/run_monitors.py +0 -0
  246. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/management/commands/run_worker.py +0 -0
  247. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/management/commands/seed_demo_audits.py +0 -0
  248. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/readiness.py +0 -0
  249. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/simpleaudit_package.py +0 -0
  250. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/startup_checks.py +0 -0
  251. {simpleaudit_studio-0.5.2/model_registry → simpleaudit_studio-0.5.4/infra/templatetags}/__init__.py +0 -0
  252. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/__init__.py +0 -0
  253. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_admin_api.py +0 -0
  254. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_audit_archive.py +0 -0
  255. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_audit_clone.py +0 -0
  256. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_audit_events.py +0 -0
  257. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_audit_poll_results.py +0 -0
  258. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_audit_rename.py +0 -0
  259. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_audit_sse.py +0 -0
  260. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_audit_submission.py +0 -0
  261. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_audit_timing.py +0 -0
  262. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_auth_projects.py +0 -0
  263. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_bootstrap.py +0 -0
  264. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_codegen.py +0 -0
  265. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_connection_delete.py +0 -0
  266. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_data_dir.py +0 -0
  267. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_db_resilience.py +0 -0
  268. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_health.py +0 -0
  269. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_health_panel.py +0 -0
  270. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_middleware.py +0 -0
  271. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_model_registry.py +0 -0
  272. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_profile.py +0 -0
  273. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_profile_ui.py +0 -0
  274. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_purge_test_data.py +0 -0
  275. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_runs_table.py +0 -0
  276. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_scenario_import_export.py +0 -0
  277. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_scenarios.py +0 -0
  278. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_seed_demo.py +0 -0
  279. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_seed_platform.py +0 -0
  280. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_snapshot_secrets.py +0 -0
  281. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_workspace_archive.py +0 -0
  282. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_workspaces.py +0 -0
  283. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_workspaces_ui.py +0 -0
  284. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/test_write_guard.py +0 -0
  285. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/infra/tests/utils.py +0 -0
  286. {simpleaudit_studio-0.5.2/model_registry/migrations → simpleaudit_studio-0.5.4/integrations}/__init__.py +0 -0
  287. {simpleaudit_studio-0.5.2/scenarios → simpleaudit_studio-0.5.4/integrations/openwebui}/__init__.py +0 -0
  288. {simpleaudit_studio-0.5.2/scenarios/migrations → simpleaudit_studio-0.5.4/judges}/__init__.py +0 -0
  289. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/judges/admin.py +0 -0
  290. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/judges/apps.py +0 -0
  291. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/judges/migrations/0001_judges.py +0 -0
  292. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/judges/migrations/0002_judge_model_per_run.py +0 -0
  293. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/judges/migrations/0003_composable_judges.py +0 -0
  294. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/judges/models.py +0 -0
  295. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/judges/services.py +0 -0
  296. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/judges/views.py +0 -0
  297. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/model_registry/admin.py +0 -0
  298. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/model_registry/apps.py +0 -0
  299. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/model_registry/migrations/0001_initial.py +0 -0
  300. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/model_registry/migrations/0002_descriptions.py +0 -0
  301. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/model_registry/migrations/0003_modelconnection_shared_with_and_more.py +0 -0
  302. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/model_registry/serializers.py +0 -0
  303. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/scenarios/admin.py +0 -0
  304. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/scenarios/apps.py +0 -0
  305. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/scenarios/migrations/0001_initial.py +0 -0
  306. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/scenarios/migrations/0002_add_severity_ceiling_documents_file_uri.py +0 -0
  307. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/scenarios/models.py +0 -0
  308. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/scenarios/serializers.py +0 -0
  309. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/scenarios/services.py +0 -0
  310. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/scenarios/urls.py +0 -0
  311. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/scenarios/views.py +0 -0
  312. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/simpleaudit_studio/__init__.py +0 -0
  313. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/simpleaudit_studio/paths.py +0 -0
  314. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/static/favicon-16x16.svg +0 -0
  315. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/static/favicon-32x32.svg +0 -0
  316. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/static/favicon.svg +0 -0
  317. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/static/js/diff.min.js +0 -0
  318. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/static/js/version-diff.js +0 -0
  319. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/static/logo.png +0 -0
  320. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/static/logo.svg +0 -0
  321. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/static/og-image.png +0 -0
  322. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/404.html +0 -0
  323. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/auth/login.html +0 -0
  324. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/auth/register.html +0 -0
  325. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/auth/workos_login.html +0 -0
  326. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/auth/workos_verify.html +0 -0
  327. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/dashboard.html +0 -0
  328. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/experiment_detail.html +0 -0
  329. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/experiment_review.html +0 -0
  330. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/experiments.html +0 -0
  331. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/health.html +0 -0
  332. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/judge_detail.html +0 -0
  333. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/judges.html +0 -0
  334. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/monitor_detail.html +0 -0
  335. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/monitors.html +0 -0
  336. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/auth_header.html +0 -0
  337. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/chip_input.html +0 -0
  338. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/compare_run_header.html +0 -0
  339. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/judge_picker.html +0 -0
  340. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/local_time_js.html +0 -0
  341. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/multi_filter.html +0 -0
  342. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/not_found.html +0 -0
  343. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/pinned_version.html +0 -0
  344. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/rename_title.html +0 -0
  345. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/run_results.html +0 -0
  346. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/run_settings.html +0 -0
  347. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/run_settings_js.html +0 -0
  348. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/severity_badge.html +0 -0
  349. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/text_file_modal.html +0 -0
  350. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/tooltips.html +0 -0
  351. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/ui_js.html +0 -0
  352. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/version_badge.html +0 -0
  353. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/version_diff_js.html +0 -0
  354. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/partials/version_diff_modal.html +0 -0
  355. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/profile.html +0 -0
  356. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/public/base_public.html +0 -0
  357. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/scenarios.html +0 -0
  358. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/seo/head.html +0 -0
  359. {simpleaudit_studio-0.5.2 → simpleaudit_studio-0.5.4}/templates/workspaces.html +0 -0
@@ -0,0 +1,90 @@
1
+ # =============================================================================
2
+ # SimpleAudit Studio — local development
3
+ #
4
+ # Copy to `.env` (manage.py loads it automatically), then:
5
+ #
6
+ # uv sync --extra dev
7
+ # uv run manage.py setup_local # first time: + seed data
8
+ # uv run manage.py dev # daily
9
+ #
10
+ # SQLite holds the app data and `dev` starts its own embedded Hatchet queue,
11
+ # so no Docker is needed. For production use Docker Compose with `.env.example`.
12
+ #
13
+ # Only what the dev flow actually reads is uncommented below. Settings the dev
14
+ # server does not use are kept as documented examples at the bottom.
15
+ # =============================================================================
16
+
17
+ # --- Django -----------------------------------------------------------------
18
+ DJANGO_SECRET_KEY=local-dev-key-not-for-prod
19
+ DJANGO_DEBUG=true
20
+ DJANGO_ALLOWED_HOSTS=*
21
+ LOG_LEVEL=DEBUG
22
+
23
+ # --- Bootstrap (read by setup_local / bootstrap_platform) ----------------------
24
+ BOOTSTRAP_USERNAME=studio
25
+ BOOTSTRAP_EMAIL=admin@example.local
26
+ BOOTSTRAP_PASSWORD=localdevpass123
27
+ BOOTSTRAP_PROJECT_NAME=Default
28
+
29
+ # --- Database -----------------------------------------------------------------
30
+ # `manage.py dev` is SQLite-first by design (zero setup) and force-enables
31
+ # SQLite; Postgres is the Compose/deployment engine (see `.env.example` +
32
+ # docker-compose.yml).
33
+ SIMPLEAUDIT_LOCAL_SQLITE=1
34
+ # Where the SQLite file lives. Relative paths resolve from the repo root;
35
+ # absolute paths are used as-is. Unset/commented = `<repo>/dev.sqlite3`.
36
+ SIMPLEAUDIT_SQLITE_PATH=dev.sqlite3
37
+
38
+ # JSON result files shown by /visualizer/. The folder is created on demand;
39
+ # set an absolute path when results live elsewhere.
40
+ VISUALIZER_RESULTS_DIR=./results
41
+
42
+ # --- Chat (Open WebUI) ----------------------------------------------------------
43
+ # On by default in dev; no line needed. To force it off:
44
+ # SIMPLEAUDIT_CHAT=off (env)
45
+ # manage.py dev --disable-chat (flag; wins over the env value)
46
+
47
+ # =============================================================================
48
+ # OPTIONAL — commented out because `manage.py dev` does not read these.
49
+ # Un-comment only for the stated use case.
50
+ # =============================================================================
51
+
52
+ # Label for the in-process audit worker pool (default: cpu).
53
+ # WORKER_POOL=cpu
54
+
55
+ # Domain DB on a running local Postgres instead of SQLite. Requires
56
+ # SIMPLEAUDIT_LOCAL_SQLITE=0 above (dev is SQLite-first and force-enables it)
57
+ # plus a Postgres server on these coordinates. Niche — most people stay on
58
+ # SQLite. The embedded Hatchet always uses its own bundled Postgres, not
59
+ # these. (Also set SIMPLEAUDIT_MODE=dev so `manage.py mode` can resolve —
60
+ # without the SQLite flag, mode inference has no unambiguous signal left.)
61
+ # POSTGRES_DB=simpleaudit
62
+ # POSTGRES_USER=simpleaudit
63
+ # POSTGRES_PASSWORD=localdevpass123
64
+ # POSTGRES_HOST=localhost
65
+ # POSTGRES_PORT=5432
66
+
67
+ # External Hatchet server — Compose mode only (dev starts an embedded engine).
68
+ # HATCHET_SERVER_URL=http://localhost:8888
69
+ # HATCHET_GRPC_URL=localhost:7077
70
+ # HATCHET_API_KEY=
71
+ # HATCHET_TOKEN_FILE=./hatchet-token
72
+ # HATCHET_TLS_STRATEGY=none
73
+
74
+ # Sentry error reporting — add a DSN to enable; commented out = disabled.
75
+ # SENTRY_DSN=
76
+ # SENTRY_ENVIRONMENT=development
77
+
78
+ # --- SimpleAudit engine ---------------------------------------------------------
79
+ # No configuration needed: the engine is a pip dependency pinned in
80
+ # pyproject.toml. To develop against an unmerged engine revision, create a
81
+ # gitignored simpleaudit-dependency.yaml at the project root containing ONLY:
82
+ # git_ref: <full-40-char-sha>
83
+ # That value is recorded as the run's git_commit provenance. Do NOT edit
84
+ # pyproject.toml for a dev override.
85
+
86
+ # --- Model API keys (optional) ---------------------------------------------------
87
+ # Keys can be stored on a connection in the Models page. For connections set
88
+ # to "Environment variable", add that variable here (read when a run starts),
89
+ # e.g.:
90
+ # SIMULACHAT_API_KEY=sk-...
@@ -5,7 +5,7 @@
5
5
  # values already present in the real environment always win.
6
6
  #
7
7
  # This file documents the DOCKER COMPOSE deployment (the canonical one).
8
- # For a local (non-Docker) development setup, copy `.env.local.example` instead.
8
+ # For a local (non-Docker) development setup, copy `.env.dev.example` instead.
9
9
  #
10
10
  # NOTE: docker-compose.yml overrides a few values per service (POSTGRES_HOST,
11
11
  # HATCHET_*) so the container-internal hostnames are used
@@ -13,6 +13,8 @@
13
13
  # =============================================================================
14
14
 
15
15
  # --- Django -----------------------------------------------------------------
16
+ # REQUIRED: startup refuses to boot while this is empty or still `change-me`.
17
+ # Generate one with: openssl rand -hex 32
16
18
  DJANGO_SECRET_KEY=change-me
17
19
  DJANGO_DEBUG=false
18
20
  DJANGO_ALLOWED_HOSTS=*
@@ -50,7 +52,7 @@ POSTGRES_PORT=5432
50
52
  # Docker Compose: the compose service name `hatchet-server` resolves inside the
51
53
  # compose network. HTTP API on :8888, gRPC on :7077 (see docker-compose.yml).
52
54
  # Local dev (Hatchet running on the host): use http://localhost:8888 and
53
- # localhost:7077 — see `.env.local.example`.
55
+ # localhost:7077 — see `.env.dev.example`.
54
56
  HATCHET_SERVER_URL=http://hatchet-server:8888
55
57
  HATCHET_GRPC_URL=hatchet-server:7077
56
58
  # Explicit worker API token. Leave empty with the default auth-disabled
@@ -88,6 +90,37 @@ WORKER_POOL=cpu
88
90
  # skips if demo runs already exist. Set to false to opt out.
89
91
  SEED_DEMO_AUDITS=true
90
92
 
93
+ # --- Chat (Open WebUI) ---------------------------------------------------------
94
+ # Single-origin model: Open WebUI (the subpath fork) serves its whole app at
95
+ # /chat/ on Studio's own origin, and Studio's wrapper page (model-picker bar +
96
+ # iframe) lives at /ai/. Caddy is the only published port and does the
97
+ # forward-auth (/chat/authz). Signed in as the Studio user (workspace admins
98
+ # become Open WebUI admins). ON by default: the first line makes the web
99
+ # container serve /ai/ + /chat/authz, the second makes `docker compose up -d`
100
+ # start the open-webui container. To run Compose WITHOUT chat, comment both
101
+ # out (or set SIMPLEAUDIT_CHAT=off). See docs/chat.md.
102
+ SIMPLEAUDIT_CHAT=docker
103
+ COMPOSE_PROFILES=chat
104
+ # Base path the browser loads the chat from. Same origin as Studio, so a plain
105
+ # base path is the default (leave unset). Set a FULL URL only if a deployment
106
+ # keeps Open WebUI on its own origin (legacy cross-origin shape).
107
+ #SIMPLEAUDIT_CHAT_URL=http://localhost:8000/chat
108
+ # The public Studio origin (login redirect target, OTLP endpoint, ...).
109
+ # Use your own hostname behind TLS; on a separate subdomain also set
110
+ # SESSION_COOKIE_DOMAIN.
111
+ SIMPLEAUDIT_STUDIO_URL=http://localhost:8000
112
+ # Optional: export Open WebUI's spans to Studio's OTLP listener. Off by default.
113
+ # Exports unauthenticated (matches an enabled "none" credential). For a
114
+ # basic/bearer credential, set OTEL_BASIC_AUTH_* to match it. See docs/chat.md.
115
+ #SIMPLEAUDIT_CHAT_OTLP=true
116
+ #SIMPLEAUDIT_CHAT_OTLP_ENDPOINT=http://web:8000
117
+ #OTEL_BASIC_AUTH_USERNAME=
118
+ #OTEL_BASIC_AUTH_PASSWORD=
119
+ # Optional: switch Studio's OTLP listener (POST /otlp/v1/traces + credential
120
+ # management) on or off. ON by default (preserves existing behavior). Set to
121
+ # "off" to 404 the /otlp/* and /api/otlp/* routes and hide the OTLP button.
122
+ #SIMPLEAUDIT_OTLP=off
123
+
91
124
  # --- Optional observability -----------------------------------------------------
92
125
 
93
126
  # --- Sentry error tracking & tracing (leave empty to disable) -------------------
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: Orchestrator
3
+ description: Parallel-first coding orchestrator
4
+ tools: ['agent', 'edit', 'read', 'search', 'execute']
5
+ agents: ['Researcher', 'Verifier', 'Test Reviewer', 'Regression Reviewer']
6
+ ---
7
+
8
+ You are the main engineering orchestrator.
9
+
10
+ Default behavior:
11
+ - Decompose non-trivial tasks into independent workstreams.
12
+ - Run independent research/review tasks in parallel whenever possible.
13
+ - Prefer parallel subagents over doing sequential investigation yourself.
14
+ - Keep the main context focused on decisions and integration.
15
+ - Do not delegate trivial tasks where coordination overhead exceeds the work.
16
+
17
+ For implementation:
18
+ 1. First identify independent components.
19
+ 2. Launch parallel subagents for codebase research, dependency analysis,
20
+ test discovery, and alternative implementation approaches.
21
+ 3. Integrate the best findings yourself.
22
+ 4. After editing, launch independent reviewers in parallel:
23
+ - correctness
24
+ - test coverage
25
+ - regression risk
26
+ - hallucinated APIs / assumptions
27
+ 5. Run tests and inspect actual outputs.
28
+ 6. Fix issues found by reviewers.
29
+ 7. Repeat verification until there are no actionable failures.
30
+
31
+ Never trust another agent's factual claim about the repository unless it
32
+ provides file references or you verify it yourself.
33
+
34
+ Prefer evidence from:
35
+ - repository contents
36
+ - compiler/type checker
37
+ - test output
38
+ - runtime output
39
+ - official documentation
40
+
41
+ If uncertain, investigate rather than guessing.
42
+
43
+ Keep working autonomously until:
44
+ - the requested result is implemented,
45
+ - tests/checks have been run,
46
+ - significant reviewer findings have been addressed,
47
+ - or a genuine blocker requires user input.
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: Regression Reviewer
3
+ description: Assess regression risk of proposed changes
4
+ user-invocable: false
5
+ tools: ['read', 'search', 'execute']
6
+ ---
7
+
8
+ Assess the regression risk of the proposed changes.
9
+
10
+ Check:
11
+ - existing behavior that depends on the changed code
12
+ - callers and consumers that may break
13
+ - shared state, configuration, or schema changes
14
+ - edge cases the change may have disturbed
15
+
16
+ Use repository evidence and executable checks whenever possible.
17
+
18
+ Return only:
19
+ 1. confirmed regression risks
20
+ 2. evidence
21
+ 3. concrete mitigations
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: Researcher
3
+ description: Fast codebase reconnaissance
4
+ user-invocable: false
5
+ tools: ['read', 'search']
6
+ ---
7
+
8
+ Investigate the assigned question deeply but do not edit files.
9
+
10
+ Search broadly, identify relevant files and existing patterns,
11
+ and return concise findings with exact file references.
12
+
13
+ Do not speculate when repository evidence is available.
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: Test Reviewer
3
+ description: Review test coverage for changed behavior
4
+ user-invocable: false
5
+ tools: ['read', 'search', 'execute']
6
+ ---
7
+
8
+ Review the tests for the changed behavior.
9
+
10
+ Check:
11
+ - tests exist for the new or changed behavior
12
+ - tests assert the right outcomes, not just that code runs
13
+ - edge cases and failure paths are covered
14
+ - the test suite actually passes when run
15
+
16
+ Run the relevant tests and report actual output.
17
+
18
+ Return only:
19
+ 1. confirmed gaps or failures
20
+ 2. evidence
21
+ 3. concrete fixes
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: Verifier
3
+ description: Verify implementation claims and detect hallucinations
4
+ user-invocable: false
5
+ tools: ['read', 'search', 'execute']
6
+ ---
7
+
8
+ Independently verify the proposed solution.
9
+
10
+ Do not assume another agent's claims are correct.
11
+
12
+ Check:
13
+ - referenced files and symbols actually exist
14
+ - APIs and function signatures are real
15
+ - dependencies actually expose the claimed features
16
+ - tests exercise the changed behavior
17
+ - implementation matches the original request
18
+ - no placeholder or speculative code remains
19
+
20
+ Use repository evidence and executable checks whenever possible.
21
+
22
+ Return only:
23
+ 1. confirmed problems
24
+ 2. evidence
25
+ 3. concrete fixes
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: parallel-orchestrate
3
+ description: Parallel-first orchestration convention for substantial tasks
4
+ ---
5
+
6
+ Use parallel subagents aggressively for independent work. Optimize for
7
+ wall-clock time, not token count. Treat model calls as cheap. Keep yourself
8
+ as the coordinator and integrator. Verify claims with repository evidence
9
+ and executable checks before concluding.
10
+
11
+ For every substantial task:
12
+ 1. Launch 2-3 Researcher subagents in parallel for independent angles
13
+ (simplest implementation, architecture-compatible implementation,
14
+ hidden risks).
15
+ 2. Integrate the best findings and implement.
16
+ 3. Launch Verifier, Test Reviewer, and Regression Reviewer in parallel.
17
+ 4. Fix confirmed findings and re-verify until there are no actionable
18
+ failures.
19
+
20
+ Keep the delegation tree wide, not deep: orchestrator -> workers/reviewers.
21
+ Do not nest subagents more than one level.
@@ -32,13 +32,20 @@ jobs:
32
32
  run: uv sync --frozen --extra dev
33
33
  - name: Lint (ruff)
34
34
  run: uv run ruff check .
35
- - name: Run tests (parallel)
36
- run: uv run python manage.py test infra --parallel auto --exclude-tag embedded_hatchet
35
+ - name: Cache testmon dependency data
36
+ uses: actions/cache@v4
37
+ with:
38
+ path: .testmondata
39
+ key: testmon-${{ github.sha }}
40
+ restore-keys: |
41
+ testmon-
42
+ - name: Run tests (parallel, affected-only via testmon)
43
+ run: uv run pytest --testmon -n auto -m "not embedded_hatchet"
37
44
  - name: Check if embedded Hatchet files changed
38
45
  id: hatchet-changed
39
46
  run: |
40
47
  CHANGED=$(git diff --name-only origin/main...HEAD -- infra/minimal_config.py infra/worker.py 2>/dev/null || true)
41
- if [ -n "$CHANGED" ]; then echo "changed=true" >> "$GITHUB_OUTPUT"; else echo "changed=false" >> "$GITHUB_OUTPUT"; fi
48
+ if [ -n "$CHANGED"]; then echo "changed=true" >> "$GITHUB_OUTPUT"; else echo "changed=false" >> "$GITHUB_OUTPUT"; fi
42
49
  - name: Run tests (embedded Hatchet, serial)
43
50
  if: steps.hatchet-changed.outputs.changed == 'true'
44
- run: uv run python manage.py test infra.tests.test_minimal_config.TestEmbeddedHatchetLifecycle
51
+ run: uv run pytest -m "embedded_hatchet"
@@ -44,3 +44,4 @@ app.pid
44
44
 
45
45
  # Data artifacts (prototype)
46
46
  data/
47
+ .testmondata*
@@ -0,0 +1,109 @@
1
+ # AGENTS.md
2
+
3
+ SimpleAudit Studio — an audit platform for LLM systems. It wraps the external
4
+ SimpleAudit engine (Target → Auditor → Judge runs over versioned scenario sets)
5
+ with a Django web UI, a durable worker, and an optional Open WebUI chat module.
6
+
7
+ ## Stack
8
+
9
+ - Python ≥3.11 (CI runs 3.12), Django 5.2, DRF + drf-spectacular
10
+ - PostgreSQL (canonical), SQLite (local dev + embedded mode)
11
+ - Hatchet durable job queue (embedded engine for single-process modes)
12
+ - uv for dependency management (see `uv.lock`)
13
+ - ruff (line length 88), pytest + pytest-django
14
+
15
+ ## Run modes (read `config/runtime.py` before touching mode logic)
16
+
17
+ | mode | command | db | queue |
18
+ |---|---|---|---|
19
+ | dev | `manage.py dev` | SQLite (repo root, `dev.sqlite3`) | embedded |
20
+ | embedded | `spin` / `uvx simpleaudit-studio` | SQLite (`~/.simpleaudit-studio/`) | embedded |
21
+ | compose | `docker compose up -d` | Postgres | external Hatchet |
22
+ | single-docker | `docker run <image>` (HF Space) | SQLite (`/data`) | embedded |
23
+
24
+ Mode selection is env-flag driven and happens in `manage.py` / `simpleaudit_studio/cli.py`
25
+ **before** `django.setup()`. `config/runtime.py::resolve_mode()` is the single lens over
26
+ those flags; `config/settings.py` selects the DB engine from the same flags. Entry points
27
+ force flags (e.g. dev forces `SIMPLEAUDIT_LOCAL_SQLITE=1`) — don't fight that in `.env`.
28
+
29
+ ## Development
30
+
31
+ ```bash
32
+ cp .env.dev.example .env
33
+ uv sync --extra dev
34
+ uv run manage.py setup_local # migrate + bootstrap admin + seed (idempotent)
35
+ uv run manage.py dev # web + worker + embedded queue + chat
36
+ ```
37
+
38
+ Login `studio` / `localdevpass123` (from `.env`). Migrations: `uv run manage.py makemigrations`.
39
+
40
+ ## Tests
41
+
42
+ ```bash
43
+ uv run pytest -m "not embedded_hatchet" # full suite (parallel in CI via -n auto --testmon)
44
+ uv run pytest path/to/test_file.py -k "name" # affected tests first
45
+ uv run pytest -m "embedded_hatchet" # only if infra/worker.py or infra/minimal_config.py changed; serial only
46
+ uv run ruff check .
47
+ ```
48
+
49
+ The suite runs on SQLite (`pytest.ini` sets the env). `@tag("slow")` and `@tag("embedded_hatchet")`
50
+ are mirrored to pytest markers by `conftest.py`. `e2e/test_ui.py` is a standalone Playwright
51
+ script, not collected by pytest.
52
+
53
+ ## Repository layout
54
+
55
+ - `accounts/` — users, projects, auth (Django is the only authority on identity)
56
+ - `scenarios/`, `model_registry/`, `judges/`, `audits/` — domain apps; each keeps business
57
+ logic in its `services.py`; models live in `<app>/models.py`, migrations in `<app>/migrations/`
58
+ - `infra/` — platform plumbing: `worker.py` (Hatchet tasks), `engine.py` (engine bridge),
59
+ `tracing.py` (OTLP/Tempo/studio trace acquisition), `ui.py` (web views), `startup_checks.py`,
60
+ `seed.py`; `infra/management/commands/` holds the run modes
61
+ - `chat/` — optional Open WebUI module; inert unless `SIMPLEAUDIT_CHAT` is set (`chat/config.py`)
62
+ - `simpleaudit_studio/` — the `spin` CLI entry point (`uvx` mode)
63
+ - `docs/` — `architecture.md`, `domain-model.md`, `deployment.md`, `chat.md`; link to these,
64
+ don't duplicate them
65
+
66
+ ## Hard boundaries (things that break subtly if violated)
67
+
68
+ - `infra/engine.py` is the **only** file that imports the `simpleaudit` engine, and it imports
69
+ lazily inside functions. Never import the engine at module level elsewhere.
70
+ - The **web/API process never executes model calls** — only the worker (`infra/worker.py`).
71
+ Audit progress is durable `AuditEvent` rows; SSE replays from them. Cancellation is a
72
+ durable flag, not process memory.
73
+ - Scenarios execute from the **frozen endpoint snapshots** on the AuditRun, never from live
74
+ registry rows. Do not "fix" a run by reading current model/agent configuration.
75
+ - Model secrets are stored as `secret_reference` identifiers and resolved from the environment
76
+ at execution time. Raw credentials are never persisted.
77
+ - `infra/simpleaudit_package.py` resolves engine provenance from installed package metadata.
78
+ Never hardcode engine versions/commits; to develop against an unmerged engine revision use the
79
+ gitignored `simpleaudit-dependency.yaml` (`git_ref:`), not a `pyproject.toml` edit.
80
+ - Chat SSO is forward-auth: a proxy calls `GET /chat/authz` and injects `X-Studio-*` headers.
81
+ Do not make anything read Django sessions/user tables outside Django.
82
+ - `config/settings.py` DB engine selection and `manage.py`/CLI flag pre-setting are load-order
83
+ sensitive. Keep mode decisions before `django.setup()`.
84
+
85
+ ## Coding conventions
86
+
87
+ - Thin views; business logic in the owning app's `services.py` (search for an existing helper
88
+ before writing a new one).
89
+ - Type hints on new public functions; keep functions focused.
90
+ - Multi-row related writes: wrap in a transaction. Avoid N+1 (`select_related`/`prefetch_related`).
91
+ - Migrations: create per app, inspect the generated file, never edit already-applied migrations.
92
+ Consider existing production (Postgres) data; avoid destructive changes.
93
+ - `RUF012` is intentionally ignored (Django Meta / factory-boy idioms) — don't "fix" those.
94
+
95
+ ## Configuration files
96
+
97
+ - `.env.dev.example` → local dev only (`.env.example` → compose; the root `Dockerfile` bakes its
98
+ own `ENV` for HF/single-container). `manage.py` auto-loads `.env`; real environment wins.
99
+ - `SIMPLEAUDIT_SQLITE_PATH` (dev-mode only) overrides the SQLite file location.
100
+ - Updating a setting means updating the relevant `.env*.example` **and** `docs/deployment.md`'s
101
+ settings table.
102
+
103
+ ## Definition of done
104
+
105
+ - Affected tests pass, then `uv run pytest -m "not embedded_hatchet"` and `uv run ruff check .`
106
+ - Migrations created/inspected if models changed
107
+ - Docs/env examples updated if configuration or externally visible behavior changed
108
+ - No unrelated reformatting or cleanup in the diff
109
+ - Summarize: what changed, design decisions, checks run, anything unresolved
@@ -1,14 +1,18 @@
1
1
  # =============================================================================
2
- # SimpleAudit Studio — Minimal Config (Hugging Face Space + local docker run)
2
+ # SimpleAudit Studio — single-container image (local `docker run` + HF Space)
3
3
  #
4
4
  # Single-process image: Django web + embedded Hatchet + worker in one Python
5
5
  # process. No Postgres, no supervisord, no external services. SQLite for the
6
6
  # domain DB, embedded Postgres (sidecar binary) for Hatchet's queue.
7
7
  #
8
- # HF Spaces only build the root Dockerfile (no compose), so this IS the Space.
8
+ # The container listens on 7860 (Hugging Face Spaces expect that port).
9
9
  #
10
10
  # Build: docker build -t simpleaudit-studio .
11
- # Run: docker run -p 7860:7860 simpleaudit-studio
11
+ # Run: docker run -d -p 8000:7860 -v sa-data:/data --name simpleaudit-studio simpleaudit-studio
12
+ # (web → http://localhost:8000, login studio / admin123 — override with
13
+ # -e BOOTSTRAP_PASSWORD=<strong> for anything shared)
14
+ # All data (SQLite database, embedded queue, chat) lives in /data: mount a
15
+ # named volume there to keep it across restarts and image updates.
12
16
  # =============================================================================
13
17
 
14
18
  FROM python:3.12-slim AS base
@@ -25,23 +29,30 @@ WORKDIR /app
25
29
  RUN apt-get update \
26
30
  && apt-get install -y --no-install-recommends \
27
31
  curl \
32
+ git \
28
33
  && rm -rf /var/lib/apt/lists/*
29
34
 
30
35
  # --- Python dependencies -----------------------------------------------------
31
36
  # pyproject.toml is the single source of truth; uv.lock pins exact versions.
32
37
  # uv sync creates /app/.venv; the PATH update keeps the `python` entrypoint.
38
+ # The core (simpleaudit) is a PyPI dependency; uv sync pulls it from the
39
+ # registry (no local checkout needed).
33
40
  COPY pyproject.toml uv.lock README.md ./
34
41
  RUN pip install uv \
35
42
  && uv sync --frozen --no-install-project --no-dev
36
43
  ENV PATH="/app/.venv/bin:$PATH"
37
44
 
38
- # --- Environment defaults for the Space --------------------------------------
39
- # SIMPLEAUDIT_MINIMAL=1 enables the minimal config path (SQLite + embedded Hatchet).
40
- # Override via HF Space Secrets for anything sensitive.
41
- # Must be set BEFORE collectstatic: Django settings select the DB engine from it,
42
- # and the postgres driver is an optional extra not installed in this image.
45
+ # --- Environment defaults -----------------------------------------------------
46
+ # SIMPLEAUDIT_MINIMAL=1 enables the single-process path (SQLite + embedded
47
+ # Hatchet); SIMPLEAUDIT_DATA_DIR points everything (database, embedded queue,
48
+ # chat) at /data so a mounted volume persists it. PORT=7860 is what Hugging
49
+ # Face Spaces expect. Override via `docker run -e ...` or HF Space environment
50
+ # variables for anything sensitive.
51
+ # Must be set BEFORE collectstatic: Django settings select the DB engine from
52
+ # it, and the postgres driver is an optional extra not installed in this image.
43
53
  ENV SIMPLEAUDIT_MINIMAL=1 \
44
54
  PORT=7860 \
55
+ SIMPLEAUDIT_DATA_DIR=/data \
45
56
  DJANGO_SECRET_KEY=hf-space-demo-secret-key-change-in-production \
46
57
  DJANGO_DEBUG=false \
47
58
  DJANGO_ALLOWED_HOSTS=* \
@@ -60,9 +71,11 @@ COPY . .
60
71
  RUN python manage.py collectstatic --noinput
61
72
 
62
73
  # --- Non-root user ------------------------------------------------------------
74
+ # /data is where a mounted named volume persists all app data; it must exist
75
+ # and be writable by appuser before the user switch.
63
76
  RUN useradd --create-home appuser \
64
- && mkdir -p /app/staticfiles \
65
- && chown -R appuser:appuser /app
77
+ && mkdir -p /app/staticfiles /data \
78
+ && chown -R appuser:appuser /app /data
66
79
  USER appuser
67
80
 
68
81
  EXPOSE 7860
@@ -0,0 +1,102 @@
1
+ Metadata-Version: 2.5
2
+ Name: simpleaudit-studio
3
+ Version: 0.5.4
4
+ Summary: Production AI model audit platform — one-liner demo mode via uvx
5
+ License: MIT
6
+ License-File: LICENSE
7
+ Requires-Python: >=3.11
8
+ Requires-Dist: caddyserver>=2.11.7
9
+ Requires-Dist: cronsim==2.7
10
+ Requires-Dist: django==5.2.4
11
+ Requires-Dist: djangorestframework==3.16.0
12
+ Requires-Dist: drf-spectacular==0.28.0
13
+ Requires-Dist: hatchet-sdk==1.41.0
14
+ Requires-Dist: httpx>=0.27
15
+ Requires-Dist: opentelemetry-proto>=1.45.0
16
+ Requires-Dist: psutil>=7.2.2
17
+ Requires-Dist: pydantic<3,>=2.7
18
+ Requires-Dist: python-dotenv==1.1.1
19
+ Requires-Dist: requests==2.32.5
20
+ Requires-Dist: sentry-sdk[django]>=2.0
21
+ Requires-Dist: simpleaudit==0.3.1
22
+ Requires-Dist: workos==10.4.0
23
+ Provides-Extra: dev
24
+ Requires-Dist: factory-boy==3.3.2; extra == 'dev'
25
+ Requires-Dist: pytest-django<5,>=4.8; extra == 'dev'
26
+ Requires-Dist: pytest-env<2,>=1; extra == 'dev'
27
+ Requires-Dist: pytest-testmon<3,>=2; extra == 'dev'
28
+ Requires-Dist: pytest-xdist<3.8,>=3.6; extra == 'dev'
29
+ Requires-Dist: pytest<9,>=8; extra == 'dev'
30
+ Requires-Dist: ruff; extra == 'dev'
31
+ Provides-Extra: e2e
32
+ Requires-Dist: playwright>=1.45; extra == 'e2e'
33
+ Provides-Extra: postgres
34
+ Requires-Dist: psycopg[binary]==3.2.13; extra == 'postgres'
35
+ Provides-Extra: server
36
+ Requires-Dist: gunicorn==23.0.0; extra == 'server'
37
+ Description-Content-Type: text/markdown
38
+
39
+ ---
40
+ title: SimpleAudit Studio
41
+ emoji: 🔍
42
+ colorFrom: blue
43
+ colorTo: indigo
44
+ sdk: docker
45
+ app_port: 7860
46
+ pinned: false
47
+ ---
48
+
49
+ # SimpleAudit Studio
50
+
51
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
52
+ [![Python](https://img.shields.io/badge/Python-3.11%2B-blue.svg)](https://www.python.org/)
53
+ [![PyPI](https://img.shields.io/pypi/v/simpleaudit-studio)](https://pypi.org/project/simpleaudit-studio/)
54
+
55
+ A self-hostable platform for reproducible AI model audits using the [SimpleAudit](https://github.com/SimulaMet/simpleaudit) engine.
56
+
57
+ ## Quick run
58
+
59
+ Needs [uv](https://docs.astral.sh/uv/):
60
+
61
+ ```bash
62
+ uvx simpleaudit-studio@latest
63
+ ```
64
+
65
+ To run the latest code from GitHub instead of the published package:
66
+
67
+ ```bash
68
+ uvx --from "git+https://github.com/SimulaMet/SimpleAuditStudio@main" spin
69
+ ```
70
+
71
+ Open <http://localhost:8000>. Try the [live demo](https://sushantgautam-simpleaudit-studio.hf.space) if you do not want to install anything.
72
+
73
+ ## Development
74
+
75
+ ```bash
76
+ git clone https://github.com/SimulaMet/SimpleAuditStudio
77
+ cd SimpleAuditStudio
78
+ cp .env.dev.example .env
79
+ uv sync --extra dev
80
+ uv run manage.py setup_local
81
+ uv run manage.py dev
82
+ ```
83
+
84
+ The app opens at <http://localhost:8000> with live reload. Use `--no-browser` to skip opening a browser.
85
+
86
+ ## What it does
87
+
88
+ - Build versioned scenario sets and register OpenAI-compatible models.
89
+ - Define judges and run audits across models, scenarios, and settings.
90
+ - Review runs live and compare results in the dashboard.
91
+ - Monitor models for drift on a schedule.
92
+
93
+ ## Documentation
94
+
95
+ - [Deployment](docs/deployment.md) — all run commands, settings, chat, upgrades, backups, and production notes
96
+ - [Chat](docs/chat.md) — chat setup and privacy details
97
+ - [Architecture](docs/architecture.md) — system design and service boundaries
98
+ - [Domain model](docs/domain-model.md) — core data and invariants
99
+
100
+ ## Contributing
101
+
102
+ Architecture decisions are documented in [docs/architecture.md](docs/architecture.md).