panopticon-mcp 1.0.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 (923) hide show
  1. panopticon_mcp-1.0.0/.editorconfig +9 -0
  2. panopticon_mcp-1.0.0/.github/PULL_REQUEST_TEMPLATE.md +17 -0
  3. panopticon_mcp-1.0.0/.github/assets/hero.svg +111 -0
  4. panopticon_mcp-1.0.0/.github/assets/logo.svg +70 -0
  5. panopticon_mcp-1.0.0/.github/assets/panopticon.png +0 -0
  6. panopticon_mcp-1.0.0/.github/workflows/audit.yml +13 -0
  7. panopticon_mcp-1.0.0/.github/workflows/ci.yml +71 -0
  8. panopticon_mcp-1.0.0/.github/workflows/images.yml +118 -0
  9. panopticon_mcp-1.0.0/.github/workflows/platform.yml +99 -0
  10. panopticon_mcp-1.0.0/.github/workflows/release.yml +219 -0
  11. panopticon_mcp-1.0.0/.gitignore +17 -0
  12. panopticon_mcp-1.0.0/.pre-commit-config.yaml +29 -0
  13. panopticon_mcp-1.0.0/.python-version +1 -0
  14. panopticon_mcp-1.0.0/AGENTS.md +153 -0
  15. panopticon_mcp-1.0.0/ARCHITECTURE.md +122 -0
  16. panopticon_mcp-1.0.0/CHANGELOG.md +12 -0
  17. panopticon_mcp-1.0.0/CLAUDE.md +1 -0
  18. panopticon_mcp-1.0.0/LICENSE +22 -0
  19. panopticon_mcp-1.0.0/Makefile +59 -0
  20. panopticon_mcp-1.0.0/PKG-INFO +146 -0
  21. panopticon_mcp-1.0.0/README.md +66 -0
  22. panopticon_mcp-1.0.0/ROADMAP.md +28 -0
  23. panopticon_mcp-1.0.0/SECURITY.md +28 -0
  24. panopticon_mcp-1.0.0/THIRD_PARTY_NOTICES.md +74 -0
  25. panopticon_mcp-1.0.0/action.yml +50 -0
  26. panopticon_mcp-1.0.0/docs/DECISIONS.md +104 -0
  27. panopticon_mcp-1.0.0/docs/PROGRESS.md +31 -0
  28. panopticon_mcp-1.0.0/docs/README.ko.md +19 -0
  29. panopticon_mcp-1.0.0/docs/contributing.md +8 -0
  30. panopticon_mcp-1.0.0/docs/disclosure.md +10 -0
  31. panopticon_mcp-1.0.0/docs/limitations.md +33 -0
  32. panopticon_mcp-1.0.0/docs/privacy.md +45 -0
  33. panopticon_mcp-1.0.0/docs/release.md +57 -0
  34. panopticon_mcp-1.0.0/docs/rules/CATALOG.md +51 -0
  35. panopticon_mcp-1.0.0/docs/rules/README.md +3 -0
  36. panopticon_mcp-1.0.0/docs/self-declaration.md +14 -0
  37. panopticon_mcp-1.0.0/panopticon-buildplan.md +911 -0
  38. panopticon_mcp-1.0.0/panopticon.toml +30 -0
  39. panopticon_mcp-1.0.0/pyproject.toml +114 -0
  40. panopticon_mcp-1.0.0/release-assets/.gitignore +1 -0
  41. panopticon_mcp-1.0.0/schemas/baseline.json +2373 -0
  42. panopticon_mcp-1.0.0/schemas/diff_result.json +149 -0
  43. panopticon_mcp-1.0.0/schemas/event.json +360 -0
  44. panopticon_mcp-1.0.0/schemas/finding.json +241 -0
  45. panopticon_mcp-1.0.0/schemas/installed_server.json +272 -0
  46. panopticon_mcp-1.0.0/schemas/observation.json +2028 -0
  47. panopticon_mcp-1.0.0/schemas/wrap_record.json +973 -0
  48. panopticon_mcp-1.0.0/scripts/assemble_release.py +26 -0
  49. panopticon_mcp-1.0.0/scripts/check_docs.py +196 -0
  50. panopticon_mcp-1.0.0/scripts/check_engine_loc.py +52 -0
  51. panopticon_mcp-1.0.0/scripts/check_i18n.py +40 -0
  52. panopticon_mcp-1.0.0/scripts/check_no_excuse_rules.py +61 -0
  53. panopticon_mcp-1.0.0/scripts/check_no_excuse_rules_exception_paths.py +151 -0
  54. panopticon_mcp-1.0.0/scripts/check_no_excuse_rules_flow.py +217 -0
  55. panopticon_mcp-1.0.0/scripts/check_no_excuse_rules_flow_visitor.py +264 -0
  56. panopticon_mcp-1.0.0/scripts/check_no_excuse_rules_scope.py +262 -0
  57. panopticon_mcp-1.0.0/scripts/check_persistence_boundary.py +16 -0
  58. panopticon_mcp-1.0.0/scripts/check_phrases.py +32 -0
  59. panopticon_mcp-1.0.0/scripts/check_rules.py +163 -0
  60. panopticon_mcp-1.0.0/scripts/gen_rule_catalog.py +34 -0
  61. panopticon_mcp-1.0.0/scripts/generate_upstream_manifest.py +194 -0
  62. panopticon_mcp-1.0.0/scripts/manual_qa.py +221 -0
  63. panopticon_mcp-1.0.0/scripts/package_binary.py +23 -0
  64. panopticon_mcp-1.0.0/scripts/performance_gate.py +258 -0
  65. panopticon_mcp-1.0.0/scripts/platform_evidence.py +221 -0
  66. panopticon_mcp-1.0.0/scripts/platform_probe.py +146 -0
  67. panopticon_mcp-1.0.0/scripts/release_evidence.py +156 -0
  68. panopticon_mcp-1.0.0/scripts/release_gate.py +225 -0
  69. panopticon_mcp-1.0.0/scripts/release_preflight.py +106 -0
  70. panopticon_mcp-1.0.0/scripts/render_homebrew_formula.py +35 -0
  71. panopticon_mcp-1.0.0/scripts/run_platform_matrix.py +227 -0
  72. panopticon_mcp-1.0.0/scripts/run_wsl2_probe.ps1 +60 -0
  73. panopticon_mcp-1.0.0/scripts/validate_schemas.py +75 -0
  74. panopticon_mcp-1.0.0/scripts/vendor_upstream.py +144 -0
  75. panopticon_mcp-1.0.0/scripts/verify_official_examples.py +209 -0
  76. panopticon_mcp-1.0.0/scripts/verify_upstream_provenance.py +178 -0
  77. panopticon_mcp-1.0.0/src/panopticon/__init__.py +13 -0
  78. panopticon_mcp-1.0.0/src/panopticon/analyzers/__init__.py +1 -0
  79. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/__init__.py +33 -0
  80. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/_rules_behavior.py +216 -0
  81. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/_rules_common.py +99 -0
  82. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/_rules_network.py +135 -0
  83. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/allow.yaml +10 -0
  84. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/allowlist.py +30 -0
  85. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/catalog.py +56 -0
  86. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/collectors.py +270 -0
  87. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/model.py +138 -0
  88. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/registry_rules.py +138 -0
  89. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/rules.py +51 -0
  90. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/spans.py +159 -0
  91. panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/thresholds.py +22 -0
  92. panopticon_mcp-1.0.0/src/panopticon/analyzers/config/__init__.py +22 -0
  93. panopticon_mcp-1.0.0/src/panopticon/analyzers/config/catalog.py +65 -0
  94. panopticon_mcp-1.0.0/src/panopticon/analyzers/config/entropy.py +43 -0
  95. panopticon_mcp-1.0.0/src/panopticon/analyzers/config/model.py +77 -0
  96. panopticon_mcp-1.0.0/src/panopticon/analyzers/config/registry_rules.py +96 -0
  97. panopticon_mcp-1.0.0/src/panopticon/analyzers/config/rules.py +234 -0
  98. panopticon_mcp-1.0.0/src/panopticon/analyzers/dependency/__init__.py +1 -0
  99. panopticon_mcp-1.0.0/src/panopticon/analyzers/dependency/model.py +39 -0
  100. panopticon_mcp-1.0.0/src/panopticon/analyzers/dependency/requirements.py +178 -0
  101. panopticon_mcp-1.0.0/src/panopticon/analyzers/dependency/scan.py +84 -0
  102. panopticon_mcp-1.0.0/src/panopticon/analyzers/history/__init__.py +31 -0
  103. panopticon_mcp-1.0.0/src/panopticon/analyzers/history/catalog.py +38 -0
  104. panopticon_mcp-1.0.0/src/panopticon/analyzers/history/model.py +66 -0
  105. panopticon_mcp-1.0.0/src/panopticon/analyzers/history/registry_rules.py +83 -0
  106. panopticon_mcp-1.0.0/src/panopticon/analyzers/history/rules.py +187 -0
  107. panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/__init__.py +19 -0
  108. panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/cache.py +26 -0
  109. panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/context.py +157 -0
  110. panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/model.py +70 -0
  111. panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/reviewer.py +250 -0
  112. panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/tools.py +150 -0
  113. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/__init__.py +3 -0
  114. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/ast_utils.py +149 -0
  115. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/catalog.py +110 -0
  116. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/engine.py +75 -0
  117. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/findings.py +55 -0
  118. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/model.py +134 -0
  119. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/__init__.py +7 -0
  120. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent001.py +93 -0
  121. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent002.py +9 -0
  122. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent003.py +102 -0
  123. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent004.py +86 -0
  124. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent005.py +104 -0
  125. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent006.py +119 -0
  126. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent007.py +116 -0
  127. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/semgrep/sent002.yaml +37 -0
  128. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/semgrep/sent005.yaml +15 -0
  129. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/semgrep_adapter.py +197 -0
  130. panopticon_mcp-1.0.0/src/panopticon/analyzers/static/traversal.py +184 -0
  131. panopticon_mcp-1.0.0/src/panopticon/badge/__init__.py +1 -0
  132. panopticon_mcp-1.0.0/src/panopticon/badge/assets/NanumGothic-Regular.ttf +0 -0
  133. panopticon_mcp-1.0.0/src/panopticon/badge/assets/OFL.txt +96 -0
  134. panopticon_mcp-1.0.0/src/panopticon/badge/eligibility.py +25 -0
  135. panopticon_mcp-1.0.0/src/panopticon/badge/font.py +40 -0
  136. panopticon_mcp-1.0.0/src/panopticon/badge/from_observation.py +136 -0
  137. panopticon_mcp-1.0.0/src/panopticon/badge/model.py +109 -0
  138. panopticon_mcp-1.0.0/src/panopticon/badge/svg.py +49 -0
  139. panopticon_mcp-1.0.0/src/panopticon/baseline/__init__.py +1 -0
  140. panopticon_mcp-1.0.0/src/panopticon/baseline/migrate.py +32 -0
  141. panopticon_mcp-1.0.0/src/panopticon/baseline/model.py +61 -0
  142. panopticon_mcp-1.0.0/src/panopticon/baseline/selection.py +30 -0
  143. panopticon_mcp-1.0.0/src/panopticon/baseline/service.py +109 -0
  144. panopticon_mcp-1.0.0/src/panopticon/checks/__init__.py +1 -0
  145. panopticon_mcp-1.0.0/src/panopticon/checks/persistence_boundary.py +259 -0
  146. panopticon_mcp-1.0.0/src/panopticon/cli/__init__.py +1 -0
  147. panopticon_mcp-1.0.0/src/panopticon/cli/analysis_commands.py +117 -0
  148. panopticon_mcp-1.0.0/src/panopticon/cli/main.py +205 -0
  149. panopticon_mcp-1.0.0/src/panopticon/cli/watch_command.py +106 -0
  150. panopticon_mcp-1.0.0/src/panopticon/declared/__init__.py +68 -0
  151. panopticon_mcp-1.0.0/src/panopticon/declared/authority.py +166 -0
  152. panopticon_mcp-1.0.0/src/panopticon/declared/extract.py +228 -0
  153. panopticon_mcp-1.0.0/src/panopticon/declared/model.py +120 -0
  154. panopticon_mcp-1.0.0/src/panopticon/declared/normalize.py +115 -0
  155. panopticon_mcp-1.0.0/src/panopticon/diff/__init__.py +1 -0
  156. panopticon_mcp-1.0.0/src/panopticon/diff/compute.py +217 -0
  157. panopticon_mcp-1.0.0/src/panopticon/diff/inventory.py +39 -0
  158. panopticon_mcp-1.0.0/src/panopticon/diff/model.py +30 -0
  159. panopticon_mcp-1.0.0/src/panopticon/discovery/__init__.py +83 -0
  160. panopticon_mcp-1.0.0/src/panopticon/discovery/_config.py +119 -0
  161. panopticon_mcp-1.0.0/src/panopticon/discovery/base.py +76 -0
  162. panopticon_mcp-1.0.0/src/panopticon/discovery/claude_code.py +113 -0
  163. panopticon_mcp-1.0.0/src/panopticon/discovery/claude_desktop.py +73 -0
  164. panopticon_mcp-1.0.0/src/panopticon/discovery/cursor.py +59 -0
  165. panopticon_mcp-1.0.0/src/panopticon/discovery/generic.py +43 -0
  166. panopticon_mcp-1.0.0/src/panopticon/discovery/vscode.py +65 -0
  167. panopticon_mcp-1.0.0/src/panopticon/discovery/windsurf.py +52 -0
  168. panopticon_mcp-1.0.0/src/panopticon/engine/__init__.py +37 -0
  169. panopticon_mcp-1.0.0/src/panopticon/engine/badge.py +21 -0
  170. panopticon_mcp-1.0.0/src/panopticon/engine/baseline.py +133 -0
  171. panopticon_mcp-1.0.0/src/panopticon/engine/ci.py +46 -0
  172. panopticon_mcp-1.0.0/src/panopticon/engine/contracts.py +234 -0
  173. panopticon_mcp-1.0.0/src/panopticon/engine/deep.py +120 -0
  174. panopticon_mcp-1.0.0/src/panopticon/engine/diff.py +96 -0
  175. panopticon_mcp-1.0.0/src/panopticon/engine/doctor.py +223 -0
  176. panopticon_mcp-1.0.0/src/panopticon/engine/doctor_grouping.py +50 -0
  177. panopticon_mcp-1.0.0/src/panopticon/engine/doctor_model.py +92 -0
  178. panopticon_mcp-1.0.0/src/panopticon/engine/doctor_render.py +103 -0
  179. panopticon_mcp-1.0.0/src/panopticon/engine/exit_codes.py +48 -0
  180. panopticon_mcp-1.0.0/src/panopticon/engine/explain.py +62 -0
  181. panopticon_mcp-1.0.0/src/panopticon/engine/fix.py +226 -0
  182. panopticon_mcp-1.0.0/src/panopticon/engine/fix_select.py +133 -0
  183. panopticon_mcp-1.0.0/src/panopticon/engine/foundation.py +122 -0
  184. panopticon_mcp-1.0.0/src/panopticon/engine/install.py +119 -0
  185. panopticon_mcp-1.0.0/src/panopticon/engine/remote.py +55 -0
  186. panopticon_mcp-1.0.0/src/panopticon/engine/scan.py +291 -0
  187. panopticon_mcp-1.0.0/src/panopticon/engine/watch.py +75 -0
  188. panopticon_mcp-1.0.0/src/panopticon/engine/watch_behavior.py +247 -0
  189. panopticon_mcp-1.0.0/src/panopticon/engine/watch_declared.py +176 -0
  190. panopticon_mcp-1.0.0/src/panopticon/engine/watch_events.py +234 -0
  191. panopticon_mcp-1.0.0/src/panopticon/engine/watch_inventory.py +219 -0
  192. panopticon_mcp-1.0.0/src/panopticon/engine/watch_leaks.py +83 -0
  193. panopticon_mcp-1.0.0/src/panopticon/engine/watch_local.py +50 -0
  194. panopticon_mcp-1.0.0/src/panopticon/engine/watch_local_collect.py +155 -0
  195. panopticon_mcp-1.0.0/src/panopticon/engine/watch_local_evidence.py +191 -0
  196. panopticon_mcp-1.0.0/src/panopticon/engine/watch_local_model.py +97 -0
  197. panopticon_mcp-1.0.0/src/panopticon/engine/watch_local_production.py +218 -0
  198. panopticon_mcp-1.0.0/src/panopticon/engine/watch_local_runtime.py +63 -0
  199. panopticon_mcp-1.0.0/src/panopticon/engine/watch_model.py +123 -0
  200. panopticon_mcp-1.0.0/src/panopticon/engine/watch_observation.py +151 -0
  201. panopticon_mcp-1.0.0/src/panopticon/engine/watch_observation_events.py +196 -0
  202. panopticon_mcp-1.0.0/src/panopticon/engine/watch_remote.py +48 -0
  203. panopticon_mcp-1.0.0/src/panopticon/engine/watch_remote_events.py +216 -0
  204. panopticon_mcp-1.0.0/src/panopticon/engine/watch_remote_observation.py +148 -0
  205. panopticon_mcp-1.0.0/src/panopticon/engine/watch_remote_production.py +166 -0
  206. panopticon_mcp-1.0.0/src/panopticon/engine/watch_self.py +51 -0
  207. panopticon_mcp-1.0.0/src/panopticon/engine/watch_self_metadata.py +116 -0
  208. panopticon_mcp-1.0.0/src/panopticon/engine/watch_service.py +128 -0
  209. panopticon_mcp-1.0.0/src/panopticon/engine/watch_service_targets.py +228 -0
  210. panopticon_mcp-1.0.0/src/panopticon/engine/watch_stages.py +216 -0
  211. panopticon_mcp-1.0.0/src/panopticon/engine/watch_state.py +191 -0
  212. panopticon_mcp-1.0.0/src/panopticon/engine/wrap.py +77 -0
  213. panopticon_mcp-1.0.0/src/panopticon/findings/__init__.py +5 -0
  214. panopticon_mcp-1.0.0/src/panopticon/findings/build.py +126 -0
  215. panopticon_mcp-1.0.0/src/panopticon/fix/__init__.py +1 -0
  216. panopticon_mcp-1.0.0/src/panopticon/fix/_executor_store.py +170 -0
  217. panopticon_mcp-1.0.0/src/panopticon/fix/backup.py +30 -0
  218. panopticon_mcp-1.0.0/src/panopticon/fix/cli_model.py +93 -0
  219. panopticon_mcp-1.0.0/src/panopticon/fix/executor.py +266 -0
  220. panopticon_mcp-1.0.0/src/panopticon/fix/https.py +133 -0
  221. panopticon_mcp-1.0.0/src/panopticon/fix/journal.py +76 -0
  222. panopticon_mcp-1.0.0/src/panopticon/fix/model.py +124 -0
  223. panopticon_mcp-1.0.0/src/panopticon/fix/plan.py +80 -0
  224. panopticon_mcp-1.0.0/src/panopticon/fix/remediations.py +118 -0
  225. panopticon_mcp-1.0.0/src/panopticon/fix/rules.py +107 -0
  226. panopticon_mcp-1.0.0/src/panopticon/fix/service.py +128 -0
  227. panopticon_mcp-1.0.0/src/panopticon/fix/transaction.py +119 -0
  228. panopticon_mcp-1.0.0/src/panopticon/i18n/RULE_TEMPLATE.md +19 -0
  229. panopticon_mcp-1.0.0/src/panopticon/i18n/__init__.py +1 -0
  230. panopticon_mcp-1.0.0/src/panopticon/i18n/catalog.py +116 -0
  231. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-001.md +19 -0
  232. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-002.md +19 -0
  233. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-003.md +19 -0
  234. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-004.md +19 -0
  235. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-005.md +19 -0
  236. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-006.md +19 -0
  237. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-007.md +19 -0
  238. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-008.md +19 -0
  239. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-009.md +19 -0
  240. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-010.md +19 -0
  241. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-011.md +19 -0
  242. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-012.md +19 -0
  243. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-001.md +19 -0
  244. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-002.md +19 -0
  245. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-004.md +19 -0
  246. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-005.md +19 -0
  247. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-008.md +19 -0
  248. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-010.md +19 -0
  249. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/HIST-001.md +19 -0
  250. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/HIST-002.md +19 -0
  251. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/HIST-003.md +19 -0
  252. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/HIST-004.md +19 -0
  253. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-001.md +19 -0
  254. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-002.md +19 -0
  255. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-003.md +19 -0
  256. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-004.md +19 -0
  257. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-005.md +19 -0
  258. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-006.md +19 -0
  259. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-007.md +19 -0
  260. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-008.md +19 -0
  261. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-009.md +19 -0
  262. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-010.md +19 -0
  263. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-011.md +19 -0
  264. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-001.md +19 -0
  265. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-002.md +19 -0
  266. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-003.md +19 -0
  267. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-004.md +19 -0
  268. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-005.md +19 -0
  269. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-006.md +19 -0
  270. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-007.md +19 -0
  271. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-008.md +19 -0
  272. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-009.md +19 -0
  273. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-010.md +19 -0
  274. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-011.md +19 -0
  275. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-012.md +19 -0
  276. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-013.md +19 -0
  277. panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-014.md +19 -0
  278. panopticon_mcp-1.0.0/src/panopticon/i18n/expected_rules.yaml +51 -0
  279. panopticon_mcp-1.0.0/src/panopticon/i18n/glossary.yaml +12 -0
  280. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-001.md +19 -0
  281. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-002.md +19 -0
  282. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-003.md +19 -0
  283. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-004.md +19 -0
  284. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-005.md +19 -0
  285. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-006.md +19 -0
  286. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-007.md +19 -0
  287. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-008.md +19 -0
  288. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-009.md +19 -0
  289. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-010.md +19 -0
  290. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-011.md +19 -0
  291. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-012.md +19 -0
  292. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-001.md +19 -0
  293. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-002.md +19 -0
  294. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-004.md +19 -0
  295. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-005.md +19 -0
  296. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-008.md +19 -0
  297. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-010.md +19 -0
  298. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/HIST-001.md +19 -0
  299. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/HIST-002.md +19 -0
  300. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/HIST-003.md +19 -0
  301. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/HIST-004.md +19 -0
  302. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-001.md +19 -0
  303. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-002.md +19 -0
  304. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-003.md +19 -0
  305. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-004.md +19 -0
  306. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-005.md +19 -0
  307. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-006.md +19 -0
  308. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-007.md +19 -0
  309. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-008.md +19 -0
  310. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-009.md +19 -0
  311. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-010.md +19 -0
  312. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-011.md +19 -0
  313. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-001.md +19 -0
  314. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-002.md +19 -0
  315. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-003.md +19 -0
  316. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-004.md +19 -0
  317. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-005.md +19 -0
  318. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-006.md +19 -0
  319. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-007.md +19 -0
  320. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-008.md +19 -0
  321. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-009.md +19 -0
  322. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-010.md +19 -0
  323. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-011.md +19 -0
  324. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-012.md +19 -0
  325. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-013.md +19 -0
  326. panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-014.md +19 -0
  327. panopticon_mcp-1.0.0/src/panopticon/i18n/loader.py +140 -0
  328. panopticon_mcp-1.0.0/src/panopticon/install/model.py +105 -0
  329. panopticon_mcp-1.0.0/src/panopticon/install/plan.py +141 -0
  330. panopticon_mcp-1.0.0/src/panopticon/install/service.py +163 -0
  331. panopticon_mcp-1.0.0/src/panopticon/inventory/__init__.py +21 -0
  332. panopticon_mcp-1.0.0/src/panopticon/inventory/model.py +23 -0
  333. panopticon_mcp-1.0.0/src/panopticon/inventory/normalize.py +122 -0
  334. panopticon_mcp-1.0.0/src/panopticon/inventory/parsers.py +242 -0
  335. panopticon_mcp-1.0.0/src/panopticon/logging.py +77 -0
  336. panopticon_mcp-1.0.0/src/panopticon/models/__init__.py +81 -0
  337. panopticon_mcp-1.0.0/src/panopticon/models/artifacts.py +79 -0
  338. panopticon_mcp-1.0.0/src/panopticon/models/common.py +93 -0
  339. panopticon_mcp-1.0.0/src/panopticon/models/event.py +90 -0
  340. panopticon_mcp-1.0.0/src/panopticon/models/finding.py +82 -0
  341. panopticon_mcp-1.0.0/src/panopticon/models/ids.py +137 -0
  342. panopticon_mcp-1.0.0/src/panopticon/models/inventory.py +94 -0
  343. panopticon_mcp-1.0.0/src/panopticon/models/observation.py +190 -0
  344. panopticon_mcp-1.0.0/src/panopticon/models/schema.py +82 -0
  345. panopticon_mcp-1.0.0/src/panopticon/models/state.py +174 -0
  346. panopticon_mcp-1.0.0/src/panopticon/probe/__init__.py +1 -0
  347. panopticon_mcp-1.0.0/src/panopticon/probe/argument_schema.py +111 -0
  348. panopticon_mcp-1.0.0/src/panopticon/probe/arguments.py +252 -0
  349. panopticon_mcp-1.0.0/src/panopticon/probe/client.py +130 -0
  350. panopticon_mcp-1.0.0/src/panopticon/probe/driver.py +263 -0
  351. panopticon_mcp-1.0.0/src/panopticon/probe/driver_tools.py +32 -0
  352. panopticon_mcp-1.0.0/src/panopticon/probe/http.py +241 -0
  353. panopticon_mcp-1.0.0/src/panopticon/probe/http_redirect.py +154 -0
  354. panopticon_mcp-1.0.0/src/panopticon/probe/http_session.py +100 -0
  355. panopticon_mcp-1.0.0/src/panopticon/probe/http_sse.py +130 -0
  356. panopticon_mcp-1.0.0/src/panopticon/probe/overrides.py +25 -0
  357. panopticon_mcp-1.0.0/src/panopticon/probe/pagination.py +59 -0
  358. panopticon_mcp-1.0.0/src/panopticon/probe/protocol.py +141 -0
  359. panopticon_mcp-1.0.0/src/panopticon/probe/remote.py +245 -0
  360. panopticon_mcp-1.0.0/src/panopticon/probe/remote_events.py +91 -0
  361. panopticon_mcp-1.0.0/src/panopticon/probe/remote_security.py +96 -0
  362. panopticon_mcp-1.0.0/src/panopticon/probe/stdio.py +231 -0
  363. panopticon_mcp-1.0.0/src/panopticon/py.typed +0 -0
  364. panopticon_mcp-1.0.0/src/panopticon/registry/__init__.py +1 -0
  365. panopticon_mcp-1.0.0/src/panopticon/registry/cache.py +200 -0
  366. panopticon_mcp-1.0.0/src/panopticon/registry/client.py +251 -0
  367. panopticon_mcp-1.0.0/src/panopticon/registry/common.py +272 -0
  368. panopticon_mcp-1.0.0/src/panopticon/registry/github.py +75 -0
  369. panopticon_mcp-1.0.0/src/panopticon/registry/history.py +99 -0
  370. panopticon_mcp-1.0.0/src/panopticon/registry/http.py +75 -0
  371. panopticon_mcp-1.0.0/src/panopticon/registry/model.py +93 -0
  372. panopticon_mcp-1.0.0/src/panopticon/registry/normalize.py +58 -0
  373. panopticon_mcp-1.0.0/src/panopticon/registry/npm.py +14 -0
  374. panopticon_mcp-1.0.0/src/panopticon/registry/provider.py +137 -0
  375. panopticon_mcp-1.0.0/src/panopticon/registry/pypi.py +14 -0
  376. panopticon_mcp-1.0.0/src/panopticon/release/__init__.py +13 -0
  377. panopticon_mcp-1.0.0/src/panopticon/release/archive.py +38 -0
  378. panopticon_mcp-1.0.0/src/panopticon/release/homebrew.py +56 -0
  379. panopticon_mcp-1.0.0/src/panopticon/release/manifest.py +54 -0
  380. panopticon_mcp-1.0.0/src/panopticon/reporters/__init__.py +1 -0
  381. panopticon_mcp-1.0.0/src/panopticon/reporters/base.py +24 -0
  382. panopticon_mcp-1.0.0/src/panopticon/reporters/baseline.py +46 -0
  383. panopticon_mcp-1.0.0/src/panopticon/reporters/diff.py +50 -0
  384. panopticon_mcp-1.0.0/src/panopticon/reporters/doctor.py +65 -0
  385. panopticon_mcp-1.0.0/src/panopticon/reporters/escaping.py +38 -0
  386. panopticon_mcp-1.0.0/src/panopticon/reporters/explain.py +61 -0
  387. panopticon_mcp-1.0.0/src/panopticon/reporters/fix.py +34 -0
  388. panopticon_mcp-1.0.0/src/panopticon/reporters/foundation.py +33 -0
  389. panopticon_mcp-1.0.0/src/panopticon/reporters/install.py +38 -0
  390. panopticon_mcp-1.0.0/src/panopticon/reporters/json.py +52 -0
  391. panopticon_mcp-1.0.0/src/panopticon/reporters/markdown.py +90 -0
  392. panopticon_mcp-1.0.0/src/panopticon/reporters/model.py +81 -0
  393. panopticon_mcp-1.0.0/src/panopticon/reporters/persist.py +56 -0
  394. panopticon_mcp-1.0.0/src/panopticon/reporters/png.py +136 -0
  395. panopticon_mcp-1.0.0/src/panopticon/reporters/report_bundle.py +95 -0
  396. panopticon_mcp-1.0.0/src/panopticon/reporters/rule_metadata.py +26 -0
  397. panopticon_mcp-1.0.0/src/panopticon/reporters/sarif.py +119 -0
  398. panopticon_mcp-1.0.0/src/panopticon/reporters/scan.py +87 -0
  399. panopticon_mcp-1.0.0/src/panopticon/reporters/terminal.py +75 -0
  400. panopticon_mcp-1.0.0/src/panopticon/reporters/visual.py +69 -0
  401. panopticon_mcp-1.0.0/src/panopticon/reporters/watch.py +152 -0
  402. panopticon_mcp-1.0.0/src/panopticon/reporters/wrap.py +22 -0
  403. panopticon_mcp-1.0.0/src/panopticon/rules/__init__.py +1 -0
  404. panopticon_mcp-1.0.0/src/panopticon/rules/context.py +56 -0
  405. panopticon_mcp-1.0.0/src/panopticon/rules/expected_scope.yaml +34 -0
  406. panopticon_mcp-1.0.0/src/panopticon/rules/registry.py +108 -0
  407. panopticon_mcp-1.0.0/src/panopticon/rules/scope.py +160 -0
  408. panopticon_mcp-1.0.0/src/panopticon/sandbox/__init__.py +19 -0
  409. panopticon_mcp-1.0.0/src/panopticon/sandbox/_docker_container.py +278 -0
  410. panopticon_mcp-1.0.0/src/panopticon/sandbox/_docker_runtime.py +166 -0
  411. panopticon_mcp-1.0.0/src/panopticon/sandbox/archive.py +45 -0
  412. panopticon_mcp-1.0.0/src/panopticon/sandbox/base.py +107 -0
  413. panopticon_mcp-1.0.0/src/panopticon/sandbox/decoy.py +221 -0
  414. panopticon_mcp-1.0.0/src/panopticon/sandbox/decoy_specs.py +103 -0
  415. panopticon_mcp-1.0.0/src/panopticon/sandbox/docker.py +19 -0
  416. panopticon_mcp-1.0.0/src/panopticon/sandbox/image_catalog.py +139 -0
  417. panopticon_mcp-1.0.0/src/panopticon/sandbox/images/base.Dockerfile +18 -0
  418. panopticon_mcp-1.0.0/src/panopticon/sandbox/images/entrypoint.sh +6 -0
  419. panopticon_mcp-1.0.0/src/panopticon/sandbox/images/node.Dockerfile +10 -0
  420. panopticon_mcp-1.0.0/src/panopticon/sandbox/images/python.Dockerfile +22 -0
  421. panopticon_mcp-1.0.0/src/panopticon/sandbox/images/tinyproxy.conf +10 -0
  422. panopticon_mcp-1.0.0/src/panopticon/sandbox/images.lock +11 -0
  423. panopticon_mcp-1.0.0/src/panopticon/sandbox/matcher.py +186 -0
  424. panopticon_mcp-1.0.0/src/panopticon/sandbox/netlog.py +250 -0
  425. panopticon_mcp-1.0.0/src/panopticon/sandbox/network.py +257 -0
  426. panopticon_mcp-1.0.0/src/panopticon/sandbox/network_collect.py +58 -0
  427. panopticon_mcp-1.0.0/src/panopticon/sandbox/noise.py +63 -0
  428. panopticon_mcp-1.0.0/src/panopticon/sandbox/noise.yaml +21 -0
  429. panopticon_mcp-1.0.0/src/panopticon/sandbox/podman.py +58 -0
  430. panopticon_mcp-1.0.0/src/panopticon/sandbox/runtime.py +24 -0
  431. panopticon_mcp-1.0.0/src/panopticon/sandbox/snapshot.py +76 -0
  432. panopticon_mcp-1.0.0/src/panopticon/sandbox/streams.py +49 -0
  433. panopticon_mcp-1.0.0/src/panopticon/sandbox/trace.py +218 -0
  434. panopticon_mcp-1.0.0/src/panopticon/sandbox/trace_model.py +175 -0
  435. panopticon_mcp-1.0.0/src/panopticon/secrets/__init__.py +98 -0
  436. panopticon_mcp-1.0.0/src/panopticon/secrets/adapters.py +171 -0
  437. panopticon_mcp-1.0.0/src/panopticon/secrets/backup.py +195 -0
  438. panopticon_mcp-1.0.0/src/panopticon/secrets/contracts.py +309 -0
  439. panopticon_mcp-1.0.0/src/panopticon/secrets/crypto.py +173 -0
  440. panopticon_mcp-1.0.0/src/panopticon/secrets/keyring_backend.py +240 -0
  441. panopticon_mcp-1.0.0/src/panopticon/secrets/memory.py +183 -0
  442. panopticon_mcp-1.0.0/src/panopticon/secrets/provision.py +32 -0
  443. panopticon_mcp-1.0.0/src/panopticon/store/__init__.py +66 -0
  444. panopticon_mcp-1.0.0/src/panopticon/store/_atomic_result.py +38 -0
  445. panopticon_mcp-1.0.0/src/panopticon/store/_atomic_windows.py +172 -0
  446. panopticon_mcp-1.0.0/src/panopticon/store/atomic.py +272 -0
  447. panopticon_mcp-1.0.0/src/panopticon/store/contracts.py +165 -0
  448. panopticon_mcp-1.0.0/src/panopticon/store/gateway.py +86 -0
  449. panopticon_mcp-1.0.0/src/panopticon/store/repository.py +256 -0
  450. panopticon_mcp-1.0.0/src/panopticon/store/serialization.py +148 -0
  451. panopticon_mcp-1.0.0/src/panopticon/store/unlink.py +135 -0
  452. panopticon_mcp-1.0.0/src/panopticon/util/__init__.py +1 -0
  453. panopticon_mcp-1.0.0/src/panopticon/util/canonicalize.py +74 -0
  454. panopticon_mcp-1.0.0/src/panopticon/util/jsonc/__init__.py +32 -0
  455. panopticon_mcp-1.0.0/src/panopticon/util/jsonc/document.py +74 -0
  456. panopticon_mcp-1.0.0/src/panopticon/util/jsonc/edit.py +203 -0
  457. panopticon_mcp-1.0.0/src/panopticon/util/jsonc/parser.py +236 -0
  458. panopticon_mcp-1.0.0/src/panopticon/util/jsonc/patch.py +216 -0
  459. panopticon_mcp-1.0.0/src/panopticon/util/jsonc/pointer.py +81 -0
  460. panopticon_mcp-1.0.0/src/panopticon/util/jsonc/tokenizer.py +152 -0
  461. panopticon_mcp-1.0.0/src/panopticon/util/jsonc/transaction.py +253 -0
  462. panopticon_mcp-1.0.0/src/panopticon/util/leak_check.py +282 -0
  463. panopticon_mcp-1.0.0/src/panopticon/util/paths.py +33 -0
  464. panopticon_mcp-1.0.0/src/panopticon/wrap/__init__.py +1 -0
  465. panopticon_mcp-1.0.0/src/panopticon/wrap/framing.py +100 -0
  466. panopticon_mcp-1.0.0/src/panopticon/wrap/model.py +78 -0
  467. panopticon_mcp-1.0.0/src/panopticon/wrap/persist.py +92 -0
  468. panopticon_mcp-1.0.0/src/panopticon/wrap/process.py +180 -0
  469. panopticon_mcp-1.0.0/src/panopticon/wrap/record.py +122 -0
  470. panopticon_mcp-1.0.0/src/panopticon/wrap/relay.py +105 -0
  471. panopticon_mcp-1.0.0/src/panopticon/wrap/retention.py +43 -0
  472. panopticon_mcp-1.0.0/tests/benchmarks/test_product_performance.py +31 -0
  473. panopticon_mcp-1.0.0/tests/benchmarks/test_wrap_latency.py +67 -0
  474. panopticon_mcp-1.0.0/tests/conftest.py +21 -0
  475. panopticon_mcp-1.0.0/tests/e2e/.gitkeep +0 -0
  476. panopticon_mcp-1.0.0/tests/e2e/test_action.py +62 -0
  477. panopticon_mcp-1.0.0/tests/e2e/test_analysis_cli.py +17 -0
  478. panopticon_mcp-1.0.0/tests/e2e/test_badge.py +78 -0
  479. panopticon_mcp-1.0.0/tests/e2e/test_baseline.py +47 -0
  480. panopticon_mcp-1.0.0/tests/e2e/test_ci.py +90 -0
  481. panopticon_mcp-1.0.0/tests/e2e/test_doctor.py +108 -0
  482. panopticon_mcp-1.0.0/tests/e2e/test_explain.py +165 -0
  483. panopticon_mcp-1.0.0/tests/e2e/test_fix_cli.py +156 -0
  484. panopticon_mcp-1.0.0/tests/e2e/test_install.py +225 -0
  485. panopticon_mcp-1.0.0/tests/e2e/test_release_gate.py +52 -0
  486. panopticon_mcp-1.0.0/tests/e2e/test_scan.py +292 -0
  487. panopticon_mcp-1.0.0/tests/e2e/test_watch.py +289 -0
  488. panopticon_mcp-1.0.0/tests/e2e/test_wrap.py +275 -0
  489. panopticon_mcp-1.0.0/tests/fixtures/README.md +12 -0
  490. panopticon_mcp-1.0.0/tests/fixtures/checker/direct_write.py +5 -0
  491. panopticon_mcp-1.0.0/tests/fixtures/discovery/.gitkeep +0 -0
  492. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/broad_fs.json +14 -0
  493. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/clean.json +10 -0
  494. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/disabled.json +30 -0
  495. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/duplicate.json +22 -0
  496. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/malformed.json +9 -0
  497. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/remote.json +28 -0
  498. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/secret.json +14 -0
  499. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/variables.json +31 -0
  500. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/broad_fs.json +8 -0
  501. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/clean.json +8 -0
  502. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/disabled.json +19 -0
  503. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/duplicate.json +12 -0
  504. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/malformed.json +13 -0
  505. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/remote.json +12 -0
  506. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/secret.json +15 -0
  507. panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/variables.json +12 -0
  508. panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/broad_fs.json +8 -0
  509. panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/clean.json +8 -0
  510. panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/disabled.json +19 -0
  511. panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/duplicate.json +12 -0
  512. panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/malformed.json +13 -0
  513. panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/remote.json +12 -0
  514. panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/secret.json +15 -0
  515. panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/variables.json +12 -0
  516. panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/broad_fs.json +14 -0
  517. panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/clean.json +14 -0
  518. panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/disabled.json +26 -0
  519. panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/duplicate.json +18 -0
  520. panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/malformed.json +9 -0
  521. panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/remote.json +20 -0
  522. panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/secret.json +21 -0
  523. panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/variables.json +20 -0
  524. panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/broad_fs.json +20 -0
  525. panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/clean.json +20 -0
  526. panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/disabled.json +23 -0
  527. panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/duplicate.json +20 -0
  528. panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/malformed.json +19 -0
  529. panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/remote.json +16 -0
  530. panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/secret.json +23 -0
  531. panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/variables.json +25 -0
  532. panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/broad_fs.json +9 -0
  533. panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/clean.json +9 -0
  534. panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/disabled.json +19 -0
  535. panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/duplicate.json +14 -0
  536. panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/malformed.json +9 -0
  537. panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/remote.json +17 -0
  538. panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/secret.json +13 -0
  539. panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/variables.json +17 -0
  540. panopticon_mcp-1.0.0/tests/fixtures/fix/client_matrix.json +19 -0
  541. panopticon_mcp-1.0.0/tests/fixtures/leak/01_github_pat.txt +1 -0
  542. panopticon_mcp-1.0.0/tests/fixtures/leak/02_openai.txt +1 -0
  543. panopticon_mcp-1.0.0/tests/fixtures/leak/03_anthropic.txt +1 -0
  544. panopticon_mcp-1.0.0/tests/fixtures/leak/04_slack.txt +1 -0
  545. panopticon_mcp-1.0.0/tests/fixtures/leak/05_aws.txt +1 -0
  546. panopticon_mcp-1.0.0/tests/fixtures/leak/06_home_path.txt +1 -0
  547. panopticon_mcp-1.0.0/tests/fixtures/leak/07_real_env.txt +1 -0
  548. panopticon_mcp-1.0.0/tests/fixtures/leak/08_jwt.txt +1 -0
  549. panopticon_mcp-1.0.0/tests/fixtures/leak/09_gitlab.txt +1 -0
  550. panopticon_mcp-1.0.0/tests/fixtures/leak/10_hf.txt +1 -0
  551. panopticon_mcp-1.0.0/tests/fixtures/leak/11_linux_home.txt +1 -0
  552. panopticon_mcp-1.0.0/tests/fixtures/leak/12_windows_home.txt +1 -0
  553. panopticon_mcp-1.0.0/tests/fixtures/leak/13_unc_home.txt +1 -0
  554. panopticon_mcp-1.0.0/tests/fixtures/leak/14_wsl_home.txt +1 -0
  555. panopticon_mcp-1.0.0/tests/fixtures/leak/15_url_secret.txt +1 -0
  556. panopticon_mcp-1.0.0/tests/fixtures/leak/16_form_secret.txt +1 -0
  557. panopticon_mcp-1.0.0/tests/fixtures/leak/17_base64_secret.txt +1 -0
  558. panopticon_mcp-1.0.0/tests/fixtures/leak/18_base64url_secret.txt +1 -0
  559. panopticon_mcp-1.0.0/tests/fixtures/leak/19_chunk_secret.txt +1 -0
  560. panopticon_mcp-1.0.0/tests/fixtures/leak/20_shell_secret.txt +1 -0
  561. panopticon_mcp-1.0.0/tests/fixtures/leak/21_nested_render.txt +1 -0
  562. panopticon_mcp-1.0.0/tests/fixtures/leak/22_json_windows_home.txt +1 -0
  563. panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/.gitkeep +0 -0
  564. panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/decoy_leak.py +7 -0
  565. panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/file_read.py +7 -0
  566. panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/host_connect.py +7 -0
  567. panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/idle_beacon.py +7 -0
  568. panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/proc_exec.py +7 -0
  569. panopticon_mcp-1.0.0/tests/fixtures/mcp/compatible_examples.py +146 -0
  570. panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/.gitkeep +0 -0
  571. panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/decoy_leak.py +7 -0
  572. panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/file_read.py +7 -0
  573. panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/host_connect.py +7 -0
  574. panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/idle_beacon.py +7 -0
  575. panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/proc_exec.py +7 -0
  576. panopticon_mcp-1.0.0/tests/fixtures/mcp/fixture_manifest.json +31 -0
  577. panopticon_mcp-1.0.0/tests/fixtures/mcp/node_server.mjs +90 -0
  578. panopticon_mcp-1.0.0/tests/fixtures/mcp/official/LICENSE +216 -0
  579. panopticon_mcp-1.0.0/tests/fixtures/mcp/official/github_fetch_mock.mjs +77 -0
  580. panopticon_mcp-1.0.0/tests/fixtures/mcp/official/manifest.json +62 -0
  581. panopticon_mcp-1.0.0/tests/fixtures/mcp/official/server-everything-2026.8.18.tgz +0 -0
  582. panopticon_mcp-1.0.0/tests/fixtures/mcp/python_server.py +234 -0
  583. panopticon_mcp-1.0.0/tests/fixtures/netlog/.gitkeep +0 -0
  584. panopticon_mcp-1.0.0/tests/fixtures/reporters/mixed_report.json +56 -0
  585. panopticon_mcp-1.0.0/tests/fixtures/rules/.gitkeep +0 -0
  586. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-001/negative_case.json +1 -0
  587. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-001/positive_case.json +1 -0
  588. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-002/negative_case.json +1 -0
  589. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-002/positive_case.json +1 -0
  590. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-003/negative_case.json +1 -0
  591. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-003/positive_case.json +1 -0
  592. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-004/negative_case.json +1 -0
  593. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-004/positive_case.json +1 -0
  594. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-005/negative_case.json +1 -0
  595. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-005/positive_case.json +1 -0
  596. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-006/negative_case.json +1 -0
  597. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-006/positive_case.json +1 -0
  598. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-007/negative_case.json +1 -0
  599. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-007/positive_case.json +1 -0
  600. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-008/negative_case.json +1 -0
  601. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-008/positive_case.json +1 -0
  602. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-009/negative_case.json +1 -0
  603. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-009/positive_case.json +1 -0
  604. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-010/negative_case.json +1 -0
  605. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-010/positive_case.json +1 -0
  606. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-011/negative_case.json +1 -0
  607. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-011/positive_case.json +1 -0
  608. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-012/negative_case.json +1 -0
  609. panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-012/positive_case.json +1 -0
  610. panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-001/negative_case.json +1 -0
  611. panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-001/positive_case.json +1 -0
  612. panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-002/negative_case.json +1 -0
  613. panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-002/positive_case.json +1 -0
  614. panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-003/negative_case.json +1 -0
  615. panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-003/positive_case.json +1 -0
  616. panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-004/negative_case.json +1 -0
  617. panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-004/positive_case.json +1 -0
  618. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-001/negative_case.json +1 -0
  619. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-001/positive_case.json +1 -0
  620. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-002/negative_case.json +1 -0
  621. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-002/positive_case.json +1 -0
  622. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-003/negative_case.json +1 -0
  623. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-003/positive_case.json +1 -0
  624. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-004/negative_case.json +1 -0
  625. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-004/positive_case.json +1 -0
  626. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-005/negative_case.json +1 -0
  627. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-005/positive_case.json +1 -0
  628. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-006/negative_case.json +1 -0
  629. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-006/positive_case.json +1 -0
  630. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-007/negative_case.json +1 -0
  631. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-007/positive_case.json +1 -0
  632. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-008/negative_case.json +1 -0
  633. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-008/positive_case.json +1 -0
  634. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-009/negative_case.json +1 -0
  635. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-009/positive_case.json +1 -0
  636. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-010/negative_case.json +1 -0
  637. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-010/positive_case.json +1 -0
  638. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-011/negative_case.json +1 -0
  639. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-011/positive_case.json +1 -0
  640. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-012/negative_case.json +1 -0
  641. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-012/positive_case.json +1 -0
  642. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-013/negative_case.json +1 -0
  643. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-013/positive_case.json +1 -0
  644. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-014/negative_case.json +1 -0
  645. panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-014/positive_case.json +1 -0
  646. panopticon_mcp-1.0.0/tests/fixtures/rules/behavior/cases.json +68 -0
  647. panopticon_mcp-1.0.0/tests/fixtures/rules/behavior/expected_sets.json +16 -0
  648. panopticon_mcp-1.0.0/tests/fixtures/rules/config/cases.json +37 -0
  649. panopticon_mcp-1.0.0/tests/fixtures/rules/history/cases.json +16 -0
  650. panopticon_mcp-1.0.0/tests/fixtures/schemas/baseline-0.0-dev.json +9 -0
  651. panopticon_mcp-1.0.0/tests/fixtures/schemas/baseline.json +10 -0
  652. panopticon_mcp-1.0.0/tests/fixtures/schemas/diff_result.json +16 -0
  653. panopticon_mcp-1.0.0/tests/fixtures/schemas/event.json +9 -0
  654. panopticon_mcp-1.0.0/tests/fixtures/schemas/finding.json +26 -0
  655. panopticon_mcp-1.0.0/tests/fixtures/schemas/installed_server.json +29 -0
  656. panopticon_mcp-1.0.0/tests/fixtures/schemas/observation.json +79 -0
  657. panopticon_mcp-1.0.0/tests/fixtures/schemas/observation_remote.json +58 -0
  658. panopticon_mcp-1.0.0/tests/fixtures/schemas/wrap_record.json +22 -0
  659. panopticon_mcp-1.0.0/tests/fixtures/strace/.gitkeep +0 -0
  660. panopticon_mcp-1.0.0/tests/fixtures/upstream/.gitkeep +0 -0
  661. panopticon_mcp-1.0.0/tests/integration/.gitkeep +0 -0
  662. panopticon_mcp-1.0.0/tests/integration/baseline/test_diff.py +225 -0
  663. panopticon_mcp-1.0.0/tests/integration/baseline/test_repository.py +76 -0
  664. panopticon_mcp-1.0.0/tests/integration/discovery/test_claude_discovery_integration.py +88 -0
  665. panopticon_mcp-1.0.0/tests/integration/discovery/test_remaining_client_fixtures.py +91 -0
  666. panopticon_mcp-1.0.0/tests/integration/events/test_attribution.py +54 -0
  667. panopticon_mcp-1.0.0/tests/integration/events/test_finding_sets.py +127 -0
  668. panopticon_mcp-1.0.0/tests/integration/fix/test_client_matrix.py +154 -0
  669. panopticon_mcp-1.0.0/tests/integration/fix/test_transaction.py +167 -0
  670. panopticon_mcp-1.0.0/tests/integration/probe/test_call_driver.py +86 -0
  671. panopticon_mcp-1.0.0/tests/integration/probe/test_compatible_examples.py +86 -0
  672. panopticon_mcp-1.0.0/tests/integration/probe/test_official_servers.py +48 -0
  673. panopticon_mcp-1.0.0/tests/integration/probe/test_protocol_eras.py +122 -0
  674. panopticon_mcp-1.0.0/tests/integration/probe/test_remote_http.py +103 -0
  675. panopticon_mcp-1.0.0/tests/integration/test_docker_environment.py +54 -0
  676. panopticon_mcp-1.0.0/tests/integration/test_fixture_matrix.py +252 -0
  677. panopticon_mcp-1.0.0/tests/integration/test_network_isolation.py +141 -0
  678. panopticon_mcp-1.0.0/tests/integration/test_runtime_isolation.py +88 -0
  679. panopticon_mcp-1.0.0/tests/integration/test_watch_local_integration.py +349 -0
  680. panopticon_mcp-1.0.0/tests/integration/test_watch_remote_integration.py +145 -0
  681. panopticon_mcp-1.0.0/tests/security/test_decoy_confidentiality.py +43 -0
  682. panopticon_mcp-1.0.0/tests/security/test_image_lock.py +40 -0
  683. panopticon_mcp-1.0.0/tests/security/test_persist_leaks.py +105 -0
  684. panopticon_mcp-1.0.0/tests/security/test_release_matrix.py +147 -0
  685. panopticon_mcp-1.0.0/tests/security/test_remote_ssrf.py +128 -0
  686. panopticon_mcp-1.0.0/tests/unit/analyzers/behavior/test_collectors.py +138 -0
  687. panopticon_mcp-1.0.0/tests/unit/analyzers/behavior/test_spans.py +76 -0
  688. panopticon_mcp-1.0.0/tests/unit/analyzers/dependency/test_advisory_scan.py +60 -0
  689. panopticon_mcp-1.0.0/tests/unit/analyzers/dependency/test_requirements.py +60 -0
  690. panopticon_mcp-1.0.0/tests/unit/analyzers/semantic/test_disclosure.py +157 -0
  691. panopticon_mcp-1.0.0/tests/unit/analyzers/semantic/test_semantic_adapted.py +83 -0
  692. panopticon_mcp-1.0.0/tests/unit/analyzers/static/test_rules_complete.py +222 -0
  693. panopticon_mcp-1.0.0/tests/unit/analyzers/static/test_semgrep_adapter.py +137 -0
  694. panopticon_mcp-1.0.0/tests/unit/analyzers/static/test_static_adapted.py +45 -0
  695. panopticon_mcp-1.0.0/tests/unit/baseline/test_migrate.py +48 -0
  696. panopticon_mcp-1.0.0/tests/unit/baseline/test_selection.py +73 -0
  697. panopticon_mcp-1.0.0/tests/unit/declared/test_authority.py +210 -0
  698. panopticon_mcp-1.0.0/tests/unit/declared/test_labeled_corpus.py +88 -0
  699. panopticon_mcp-1.0.0/tests/unit/discovery/test_claude_clients.py +80 -0
  700. panopticon_mcp-1.0.0/tests/unit/discovery/test_contract.py +106 -0
  701. panopticon_mcp-1.0.0/tests/unit/discovery/test_remaining_clients.py +37 -0
  702. panopticon_mcp-1.0.0/tests/unit/engine/test_ci_make_contract.py +92 -0
  703. panopticon_mcp-1.0.0/tests/unit/engine/test_cli_architecture.py +197 -0
  704. panopticon_mcp-1.0.0/tests/unit/engine/test_contracts.py +233 -0
  705. panopticon_mcp-1.0.0/tests/unit/engine/test_deep_adapter.py +76 -0
  706. panopticon_mcp-1.0.0/tests/unit/engine/test_engine_loc_checker.py +124 -0
  707. panopticon_mcp-1.0.0/tests/unit/engine/test_exit_codes.py +164 -0
  708. panopticon_mcp-1.0.0/tests/unit/engine/test_logging_boundary.py +176 -0
  709. panopticon_mcp-1.0.0/tests/unit/engine/test_module_boundaries.py +96 -0
  710. panopticon_mcp-1.0.0/tests/unit/engine/test_protocol_seams.py +86 -0
  711. panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker.py +259 -0
  712. panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_exception_boundaries.py +210 -0
  713. panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_exception_definition_time.py +125 -0
  714. panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_exception_paths.py +233 -0
  715. panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_exception_scopes.py +122 -0
  716. panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_finally.py +275 -0
  717. panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_handler_finally.py +263 -0
  718. panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_nested_finally.py +250 -0
  719. panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_reachability.py +325 -0
  720. panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_scope_semantics.py +287 -0
  721. panopticon_mcp-1.0.0/tests/unit/engine/test_rule_i18n_physical_scope.py +81 -0
  722. panopticon_mcp-1.0.0/tests/unit/engine/test_rule_i18n_reserved_scope.py +311 -0
  723. panopticon_mcp-1.0.0/tests/unit/engine/test_rule_i18n_scope.py +332 -0
  724. panopticon_mcp-1.0.0/tests/unit/engine/test_watch_inventory.py +149 -0
  725. panopticon_mcp-1.0.0/tests/unit/engine/test_watch_local_production.py +197 -0
  726. panopticon_mcp-1.0.0/tests/unit/engine/test_watch_observation.py +319 -0
  727. panopticon_mcp-1.0.0/tests/unit/engine/test_watch_remote_production.py +131 -0
  728. panopticon_mcp-1.0.0/tests/unit/engine/test_watch_self.py +33 -0
  729. panopticon_mcp-1.0.0/tests/unit/engine/test_watch_self_metadata.py +136 -0
  730. panopticon_mcp-1.0.0/tests/unit/engine/test_watch_service.py +245 -0
  731. panopticon_mcp-1.0.0/tests/unit/engine/test_watch_stages_complete.py +279 -0
  732. panopticon_mcp-1.0.0/tests/unit/events/test_strace_parser.py +36 -0
  733. panopticon_mcp-1.0.0/tests/unit/findings/test_build.py +71 -0
  734. panopticon_mcp-1.0.0/tests/unit/fix/test_plan.py +54 -0
  735. panopticon_mcp-1.0.0/tests/unit/fix/test_rules.py +110 -0
  736. panopticon_mcp-1.0.0/tests/unit/i18n/test_manifest.py +64 -0
  737. panopticon_mcp-1.0.0/tests/unit/install/test_install_plan.py +129 -0
  738. panopticon_mcp-1.0.0/tests/unit/inventory/test_normalize.py +193 -0
  739. panopticon_mcp-1.0.0/tests/unit/models/test_invalid.py +141 -0
  740. panopticon_mcp-1.0.0/tests/unit/models/test_roundtrip.py +29 -0
  741. panopticon_mcp-1.0.0/tests/unit/probe/test_arguments.py +142 -0
  742. panopticon_mcp-1.0.0/tests/unit/probe/test_client.py +254 -0
  743. panopticon_mcp-1.0.0/tests/unit/probe/test_driver.py +190 -0
  744. panopticon_mcp-1.0.0/tests/unit/probe/test_http.py +520 -0
  745. panopticon_mcp-1.0.0/tests/unit/registry/test_cache.py +135 -0
  746. panopticon_mcp-1.0.0/tests/unit/registry/test_history.py +171 -0
  747. panopticon_mcp-1.0.0/tests/unit/registry/test_offline.py +70 -0
  748. panopticon_mcp-1.0.0/tests/unit/registry/test_provider.py +136 -0
  749. panopticon_mcp-1.0.0/tests/unit/registry/test_registry_client.py +139 -0
  750. panopticon_mcp-1.0.0/tests/unit/reporters/test_sarif_markdown.py +117 -0
  751. panopticon_mcp-1.0.0/tests/unit/reporters/test_terminal_json.py +105 -0
  752. panopticon_mcp-1.0.0/tests/unit/reporters/test_watch_reporter.py +159 -0
  753. panopticon_mcp-1.0.0/tests/unit/rules/behavior/test_catalog.py +184 -0
  754. panopticon_mcp-1.0.0/tests/unit/rules/config/__init__.py +1 -0
  755. panopticon_mcp-1.0.0/tests/unit/rules/config/test_catalog.py +126 -0
  756. panopticon_mcp-1.0.0/tests/unit/rules/history/__init__.py +1 -0
  757. panopticon_mcp-1.0.0/tests/unit/rules/history/test_catalog.py +150 -0
  758. panopticon_mcp-1.0.0/tests/unit/rules/test_registry.py +50 -0
  759. panopticon_mcp-1.0.0/tests/unit/sandbox/test_archive.py +35 -0
  760. panopticon_mcp-1.0.0/tests/unit/sandbox/test_container_complete.py +83 -0
  761. panopticon_mcp-1.0.0/tests/unit/sandbox/test_decoy.py +77 -0
  762. panopticon_mcp-1.0.0/tests/unit/sandbox/test_decoys.py +47 -0
  763. panopticon_mcp-1.0.0/tests/unit/sandbox/test_docker.py +171 -0
  764. panopticon_mcp-1.0.0/tests/unit/sandbox/test_docker_runtime_complete.py +94 -0
  765. panopticon_mcp-1.0.0/tests/unit/sandbox/test_image_catalog.py +50 -0
  766. panopticon_mcp-1.0.0/tests/unit/sandbox/test_matcher.py +83 -0
  767. panopticon_mcp-1.0.0/tests/unit/sandbox/test_netlog.py +73 -0
  768. panopticon_mcp-1.0.0/tests/unit/sandbox/test_network.py +50 -0
  769. panopticon_mcp-1.0.0/tests/unit/sandbox/test_network_complete.py +209 -0
  770. panopticon_mcp-1.0.0/tests/unit/sandbox/test_podman.py +145 -0
  771. panopticon_mcp-1.0.0/tests/unit/sandbox/test_runtime.py +15 -0
  772. panopticon_mcp-1.0.0/tests/unit/sandbox/test_sandbox_contract.py +28 -0
  773. panopticon_mcp-1.0.0/tests/unit/sandbox/test_snapshot.py +105 -0
  774. panopticon_mcp-1.0.0/tests/unit/sandbox/test_streams.py +58 -0
  775. panopticon_mcp-1.0.0/tests/unit/sandbox/test_trace.py +149 -0
  776. panopticon_mcp-1.0.0/tests/unit/secrets/__init__.py +0 -0
  777. panopticon_mcp-1.0.0/tests/unit/secrets/_support.py +328 -0
  778. panopticon_mcp-1.0.0/tests/unit/secrets/test_atomicity.py +169 -0
  779. panopticon_mcp-1.0.0/tests/unit/secrets/test_contracts.py +102 -0
  780. panopticon_mcp-1.0.0/tests/unit/secrets/test_controls.py +37 -0
  781. panopticon_mcp-1.0.0/tests/unit/secrets/test_encrypted_backup.py +263 -0
  782. panopticon_mcp-1.0.0/tests/unit/secrets/test_keyring_api_injection.py +125 -0
  783. panopticon_mcp-1.0.0/tests/unit/secrets/test_no_plaintext.py +277 -0
  784. panopticon_mcp-1.0.0/tests/unit/secrets/test_platforms.py +189 -0
  785. panopticon_mcp-1.0.0/tests/unit/secrets/test_task5_corrections.py +268 -0
  786. panopticon_mcp-1.0.0/tests/unit/store/__init__.py +0 -0
  787. panopticon_mcp-1.0.0/tests/unit/store/test_atomic.py +279 -0
  788. panopticon_mcp-1.0.0/tests/unit/store/test_canonicalize.py +68 -0
  789. panopticon_mcp-1.0.0/tests/unit/store/test_direct_write_checker.py +147 -0
  790. panopticon_mcp-1.0.0/tests/unit/store/test_hashes.py +55 -0
  791. panopticon_mcp-1.0.0/tests/unit/store/test_persistence.py +195 -0
  792. panopticon_mcp-1.0.0/tests/unit/store/test_render_scan.py +74 -0
  793. panopticon_mcp-1.0.0/tests/unit/store/test_repository_complete.py +142 -0
  794. panopticon_mcp-1.0.0/tests/unit/test_assemble_release.py +36 -0
  795. panopticon_mcp-1.0.0/tests/unit/test_cli.py +24 -0
  796. panopticon_mcp-1.0.0/tests/unit/test_docs_contract.py +264 -0
  797. panopticon_mcp-1.0.0/tests/unit/test_homebrew_formula.py +42 -0
  798. panopticon_mcp-1.0.0/tests/unit/test_identity.py +113 -0
  799. panopticon_mcp-1.0.0/tests/unit/test_leak_check.py +33 -0
  800. panopticon_mcp-1.0.0/tests/unit/test_leak_variants.py +236 -0
  801. panopticon_mcp-1.0.0/tests/unit/test_package_binary.py +44 -0
  802. panopticon_mcp-1.0.0/tests/unit/test_release_preflight.py +77 -0
  803. panopticon_mcp-1.0.0/tests/unit/test_schema_generation.py +21 -0
  804. panopticon_mcp-1.0.0/tests/unit/test_schema_invalid.py +172 -0
  805. panopticon_mcp-1.0.0/tests/unit/test_schema_roundtrip.py +64 -0
  806. panopticon_mcp-1.0.0/tests/unit/test_state_semantics.py +76 -0
  807. panopticon_mcp-1.0.0/tests/unit/test_typing_marker.py +13 -0
  808. panopticon_mcp-1.0.0/tests/unit/test_upstream_provenance.py +156 -0
  809. panopticon_mcp-1.0.0/tests/unit/test_workflow_syntax.py +108 -0
  810. panopticon_mcp-1.0.0/tests/unit/util/jsonc/__init__.py +0 -0
  811. panopticon_mcp-1.0.0/tests/unit/util/jsonc/_assertions.py +50 -0
  812. panopticon_mcp-1.0.0/tests/unit/util/jsonc/_fixtures.py +63 -0
  813. panopticon_mcp-1.0.0/tests/unit/util/jsonc/_injectors.py +63 -0
  814. panopticon_mcp-1.0.0/tests/unit/util/jsonc/_loaders.py +112 -0
  815. panopticon_mcp-1.0.0/tests/unit/util/jsonc/_protocols.py +136 -0
  816. panopticon_mcp-1.0.0/tests/unit/util/jsonc/_support.py +86 -0
  817. panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_document.py +128 -0
  818. panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_parser.py +194 -0
  819. panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_parser_diagnostics.py +64 -0
  820. panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_patch.py +275 -0
  821. panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_patch_edges.py +113 -0
  822. panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_patch_multiple_add.py +278 -0
  823. panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_transaction.py +255 -0
  824. panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_transaction_race.py +45 -0
  825. panopticon_mcp-1.0.0/tests/unit/wrap/test_framing.py +44 -0
  826. panopticon_mcp-1.0.0/tests/unit/wrap/test_process_complete.py +153 -0
  827. panopticon_mcp-1.0.0/tests/upstream/LICENSE +21 -0
  828. panopticon_mcp-1.0.0/tests/upstream/action.yml +85 -0
  829. panopticon_mcp-1.0.0/tests/upstream/conftest.py +12 -0
  830. panopticon_mcp-1.0.0/tests/upstream/pytest.ini +3 -0
  831. panopticon_mcp-1.0.0/tests/upstream/schemas/finding.schema.json +1365 -0
  832. panopticon_mcp-1.0.0/tests/upstream/schemas/gpt-review.schema.json +214 -0
  833. panopticon_mcp-1.0.0/tests/upstream/schemas/report.schema.json +1934 -0
  834. panopticon_mcp-1.0.0/tests/upstream/schemas/sarif-2.1.0.schema.json +3389 -0
  835. panopticon_mcp-1.0.0/tests/upstream/scripts/__init__.py +1 -0
  836. panopticon_mcp-1.0.0/tests/upstream/scripts/capture_gpt_reviews.py +547 -0
  837. panopticon_mcp-1.0.0/tests/upstream/scripts/run_github_action.py +426 -0
  838. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/__init__.py +10 -0
  839. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/1d9fb0acc9cf64f746d01d57845fb73028d8c3930d3b6279ec5941880a417118.json +344 -0
  840. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/52e691ed64ffa15f877a2b0b5654250109324d5c2819449f657f62907b1c1f39.json +344 -0
  841. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/99a008e1be20cfca0897fb0791f692013f04dc910f9e3e8cae395614110721ab.json +344 -0
  842. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/bf1c7a0f5ef6334341ecbf14f307b44e01b8bdf5ec298a10a77aedc5dfb083ba.json +345 -0
  843. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/c9738662d82b105023701144342c342f8bc8fe8e68ebd816c2bc6998a96eb79b.json +344 -0
  844. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/manifest.json +83 -0
  845. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/cli.py +359 -0
  846. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/config.py +708 -0
  847. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/dynamic/__init__.py +1 -0
  848. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/dynamic/catalog.py +67 -0
  849. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/dynamic/merge.py +69 -0
  850. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/dynamic/prober.py +527 -0
  851. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/dynamic/sandbox.py +527 -0
  852. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/errors.py +21 -0
  853. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/finding.py +428 -0
  854. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/__init__.py +1 -0
  855. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/cache.py +67 -0
  856. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/context.py +191 -0
  857. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/schema.py +72 -0
  858. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/semantic_reviewer.py +1243 -0
  859. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/tools.py +311 -0
  860. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/orchestrator.py +485 -0
  861. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/owasp_mapping.py +42 -0
  862. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/permissions.py +94 -0
  863. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/__init__.py +1 -0
  864. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/console.py +215 -0
  865. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/json_report.py +12 -0
  866. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/model.py +259 -0
  867. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/sarif.py +276 -0
  868. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/validate_json.py +47 -0
  869. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/validate_sarif.py +59 -0
  870. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/schema.py +113 -0
  871. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/__init__.py +1 -0
  872. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/ast_utils.py +167 -0
  873. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/catalog.py +111 -0
  874. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/engine.py +244 -0
  875. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/model.py +80 -0
  876. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/__init__.py +1 -0
  877. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent001.py +110 -0
  878. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent002.py +7 -0
  879. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent003.py +108 -0
  880. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent004.py +101 -0
  881. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent005.py +111 -0
  882. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent006.py +134 -0
  883. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent007.py +122 -0
  884. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/semgrep/sent002.yaml +37 -0
  885. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/semgrep/sent005.yaml +15 -0
  886. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/semgrep_adapter.py +203 -0
  887. panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/traversal.py +200 -0
  888. panopticon_mcp-1.0.0/tests/upstream/tests/__init__.py +1 -0
  889. panopticon_mcp-1.0.0/tests/upstream/tests/conftest.py +129 -0
  890. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/pyproject.toml +9 -0
  891. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/sentinel.integrity.yaml +4 -0
  892. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/sentinel.permissions.yaml +21 -0
  893. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/sentinel.target.yaml +7 -0
  894. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/sentinel.toml +5 -0
  895. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/server.py +132 -0
  896. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/tools.yaml +15 -0
  897. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/pyproject.toml +5 -0
  898. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/sentinel.permissions.yaml +22 -0
  899. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/sentinel.target.yaml +6 -0
  900. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/server.py +37 -0
  901. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/storage.py +3 -0
  902. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/tools.yaml +34 -0
  903. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/vulnerable_server/pyproject.toml +9 -0
  904. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/vulnerable_server/sentinel.permissions.yaml +20 -0
  905. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/vulnerable_server/sentinel.target.yaml +7 -0
  906. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/vulnerable_server/server.py +104 -0
  907. panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/vulnerable_server/tools.yaml +15 -0
  908. panopticon_mcp-1.0.0/tests/upstream/tests/test_cli.py +285 -0
  909. panopticon_mcp-1.0.0/tests/upstream/tests/test_config.py +242 -0
  910. panopticon_mcp-1.0.0/tests/upstream/tests/test_dynamic_prober.py +314 -0
  911. panopticon_mcp-1.0.0/tests/upstream/tests/test_dynamic_sandbox.py +224 -0
  912. panopticon_mcp-1.0.0/tests/upstream/tests/test_finding.py +141 -0
  913. panopticon_mcp-1.0.0/tests/upstream/tests/test_github_action.py +330 -0
  914. panopticon_mcp-1.0.0/tests/upstream/tests/test_gpt_review.py +588 -0
  915. panopticon_mcp-1.0.0/tests/upstream/tests/test_orchestrator.py +277 -0
  916. panopticon_mcp-1.0.0/tests/upstream/tests/test_phase3_capture.py +29 -0
  917. panopticon_mcp-1.0.0/tests/upstream/tests/test_report.py +208 -0
  918. panopticon_mcp-1.0.0/tests/upstream/tests/test_sarif.py +84 -0
  919. panopticon_mcp-1.0.0/tests/upstream/tests/test_static_engine.py +208 -0
  920. panopticon_mcp-1.0.0/tests/visual/__init__.py +1 -0
  921. panopticon_mcp-1.0.0/tests/visual/test_evidence_card.py +187 -0
  922. panopticon_mcp-1.0.0/uv.lock +2869 -0
  923. panopticon_mcp-1.0.0/vendor/mcp-sentinel-e717e955.json +1694 -0
@@ -0,0 +1,9 @@
1
+ root = true
2
+ [*]
3
+ charset = utf-8
4
+ end_of_line = lf
5
+ insert_final_newline = true
6
+ indent_style = space
7
+ indent_size = 4
8
+ [*.{json,yaml,yml,toml,md}]
9
+ indent_size = 2
@@ -0,0 +1,17 @@
1
+ ## Epic
2
+ E__ — <name>
3
+
4
+ ## What changed
5
+
6
+ ## Definition-of-done items closed
7
+ - [ ] ...
8
+
9
+ ## Plan / schema / rule changes
10
+ - [ ] panopticon-buildplan.md updated (or N/A)
11
+ - [ ] schemas/ updated + migrator (or N/A)
12
+ - [ ] i18n ko+en docs added for new rules (or N/A)
13
+ - [ ] docs/PROGRESS.md updated
14
+
15
+ ## Leak & privacy
16
+ - [ ] No new persist path bypasses `util.leak_check`
17
+ - [ ] No new network call outside `registry/` and the sandbox
@@ -0,0 +1,111 @@
1
+ <svg width="1200" height="420" viewBox="0 0 1200 420" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <radialGradient id="bg" cx="50%" cy="42%" r="80%">
4
+ <stop offset="0%" stop-color="#111931"/>
5
+ <stop offset="55%" stop-color="#0B101F"/>
6
+ <stop offset="100%" stop-color="#070A13"/>
7
+ </radialGradient>
8
+ <linearGradient id="beam" x1="0" y1="0" x2="1" y2="0">
9
+ <stop offset="0%" stop-color="#FF7A1A" stop-opacity="0"/>
10
+ <stop offset="100%" stop-color="#FF7A1A" stop-opacity="0.25"/>
11
+ </linearGradient>
12
+ <filter id="glow" x="-60%" y="-60%" width="220%" height="220%">
13
+ <feGaussianBlur stdDeviation="5" result="b"/>
14
+ <feMerge>
15
+ <feMergeNode in="b"/>
16
+ <feMergeNode in="SourceGraphic"/>
17
+ </feMerge>
18
+ </filter>
19
+ <filter id="dotglow" x="-140%" y="-140%" width="380%" height="380%">
20
+ <feGaussianBlur stdDeviation="3" result="b"/>
21
+ <feMerge>
22
+ <feMergeNode in="b"/>
23
+ <feMergeNode in="SourceGraphic"/>
24
+ </feMerge>
25
+ </filter>
26
+ <filter id="softglow" x="-60%" y="-60%" width="220%" height="220%">
27
+ <feGaussianBlur stdDeviation="10" result="b"/>
28
+ <feMerge>
29
+ <feMergeNode in="b"/>
30
+ <feMergeNode in="SourceGraphic"/>
31
+ </feMerge>
32
+ </filter>
33
+ </defs>
34
+
35
+ <rect width="1200" height="420" fill="url(#bg)"/>
36
+
37
+ <!-- faint panopticon floor plan spanning the banner -->
38
+ <g transform="translate(600 210)">
39
+ <circle r="320" stroke="#2E3D63" stroke-width="1" fill="none"/>
40
+ <circle r="250" stroke="#2E3D63" stroke-width="1" fill="none"/>
41
+ <circle r="185" stroke="#35486F" stroke-width="1" fill="none" stroke-dasharray="3 14"/>
42
+ <!-- radial spokes -->
43
+ <g stroke="#26345A" stroke-width="1">
44
+ <path d="M0 -320 L0 -185"/><path d="M0 320 L0 185"/>
45
+ <path d="M-320 0 L-185 0"/><path d="M320 0 L185 0"/>
46
+ <path d="M-226 -226 L-131 -131"/><path d="M226 -226 L131 -131"/>
47
+ <path d="M-226 226 L-131 131"/><path d="M226 226 L131 131"/>
48
+ </g>
49
+ <!-- outer cell ticks -->
50
+ <g stroke="#46588A" stroke-width="10" stroke-linecap="round">
51
+ <g id="tick"><path d="M-14 -285 A285 285 0 0 1 42 -282" fill="none"/></g>
52
+ <use href="#tick" transform="rotate(24)"/>
53
+ <use href="#tick" transform="rotate(72)"/>
54
+ <use href="#tick" transform="rotate(144)"/>
55
+ <use href="#tick" transform="rotate(168)"/>
56
+ <use href="#tick" transform="rotate(192)"/>
57
+ <use href="#tick" transform="rotate(216)"/>
58
+ <use href="#tick" transform="rotate(240)"/>
59
+ <use href="#tick" transform="rotate(264)"/>
60
+ <use href="#tick" transform="rotate(288)"/>
61
+ <use href="#tick" transform="rotate(336)"/>
62
+ </g>
63
+ <!-- caught cells: primary + secondary detection lights -->
64
+ <path d="M-14 -285 A285 285 0 0 1 42 -282" transform="rotate(96)"
65
+ fill="none" stroke="#FF7A1A" stroke-width="10" stroke-linecap="round" filter="url(#glow)"/>
66
+ <path d="M-14 -285 A285 285 0 0 1 42 -282" transform="rotate(312)"
67
+ fill="none" stroke="#FF7A1A" stroke-width="10" stroke-linecap="round" opacity="0.8" filter="url(#glow)"/>
68
+ <path d="M-14 -285 A285 285 0 0 1 42 -282" transform="rotate(48)"
69
+ fill="none" stroke="#FFB020" stroke-width="10" stroke-linecap="round" opacity="0.75" filter="url(#glow)"/>
70
+ <!-- detection dots on the rings -->
71
+ <g filter="url(#dotglow)">
72
+ <circle cx="161" cy="-191" r="4.5" fill="#FF7A1A"/>
73
+ <circle cx="-235" cy="-85" r="3.5" fill="#FFB020" opacity="0.85"/>
74
+ <circle cx="-296" cy="120" r="3" fill="#FF7A1A" opacity="0.7"/>
75
+ <circle cx="304" cy="98" r="3.5" fill="#FF7A1A" opacity="0.75"/>
76
+ <circle cx="-90" cy="-244" r="2.8" fill="#FFB020" opacity="0.6"/>
77
+ </g>
78
+ </g>
79
+
80
+ <!-- central emblem -->
81
+ <g transform="translate(600 148)">
82
+ <circle r="54" stroke="#6B7EB0" stroke-width="2" fill="none" stroke-dasharray="2 9" stroke-linecap="round"/>
83
+ <circle r="38" stroke="#E8EDF7" stroke-width="4" fill="#0A0E1A"/>
84
+ <rect x="-12" y="-18" width="24" height="36" rx="3.5" fill="#FF7A1A" filter="url(#softglow)"/>
85
+ </g>
86
+
87
+ <!-- wordmark -->
88
+ <text x="600" y="268" text-anchor="middle" fill="#E8EDF7"
89
+ font-family="Futura, 'Avenir Next', 'Helvetica Neue', Arial, sans-serif"
90
+ font-size="52" font-weight="700" letter-spacing="22">PANOPTICON</text>
91
+
92
+ <!-- tagline -->
93
+ <text x="600" y="316" text-anchor="middle" fill="#8B98B8"
94
+ font-family="SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace"
95
+ font-size="19" letter-spacing="1">We don't watch you. We watch your MCPs.</text>
96
+
97
+ <!-- sub line -->
98
+ <text x="600" y="352" text-anchor="middle" fill="#4E5C7E"
99
+ font-family="SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace"
100
+ font-size="14" letter-spacing="4">LOCAL-FIRST MCP BEHAVIOR OBSERVATORY</text>
101
+
102
+ <!-- corner terminal hints -->
103
+ <g font-family="SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace" font-size="13">
104
+ <text x="48" y="52" fill="#3E4C6E">$ pano watch github</text>
105
+ <text x="48" y="76" fill="#8B98B8">READ ~/.ssh/config</text>
106
+ <text x="238" y="76" fill="#FFB020">not declared</text>
107
+ <text x="48" y="100" fill="#FF6B4A">LEAK AWS_ACCESS_KEY_ID</text>
108
+ <text x="268" y="100" fill="#5E6C8E">&lt;- decoy value</text>
109
+ <text x="1152" y="388" text-anchor="end" fill="#2E3A58">UNKNOWN stays visible - unobserved behavior stays UNKNOWN</text>
110
+ </g>
111
+ </svg>
@@ -0,0 +1,70 @@
1
+ <svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Panopticon eye: concentric floor-plan rings, terminal-cursor pupil -->
3
+ <defs>
4
+ <radialGradient id="bgGlow" cx="50%" cy="50%" r="60%">
5
+ <stop offset="0%" stop-color="#131A2E"/>
6
+ <stop offset="100%" stop-color="#0A0E1A"/>
7
+ </radialGradient>
8
+ <filter id="glow" x="-40%" y="-40%" width="180%" height="180%">
9
+ <feGaussianBlur stdDeviation="4" result="b"/>
10
+ <feMerge>
11
+ <feMergeNode in="b"/>
12
+ <feMergeNode in="SourceGraphic"/>
13
+ </feMerge>
14
+ </filter>
15
+ <linearGradient id="beamL" x1="118" y1="128" x2="38" y2="128" gradientUnits="userSpaceOnUse">
16
+ <stop offset="0%" stop-color="#FF7A1A" stop-opacity="0.02"/>
17
+ <stop offset="100%" stop-color="#FF7A1A" stop-opacity="0.2"/>
18
+ </linearGradient>
19
+ <filter id="dotglow" x="-120%" y="-120%" width="340%" height="340%">
20
+ <feGaussianBlur stdDeviation="2.5" result="b"/>
21
+ <feMerge>
22
+ <feMergeNode in="b"/>
23
+ <feMergeNode in="SourceGraphic"/>
24
+ </feMerge>
25
+ </filter>
26
+ </defs>
27
+
28
+ <rect width="256" height="256" rx="56" fill="url(#bgGlow)"/>
29
+
30
+ <!-- outer cell ring: brighter arcs -->
31
+ <g stroke="#4A5D8C" stroke-width="6" stroke-linecap="round">
32
+ <g id="cells">
33
+ <path d="M128 24 A104 104 0 0 1 154.9 27.5" fill="none"/>
34
+ </g>
35
+ <use href="#cells" transform="rotate(30 128 128)"/>
36
+ <use href="#cells" transform="rotate(60 128 128)"/>
37
+ <use href="#cells" transform="rotate(90 128 128)"/>
38
+ <use href="#cells" transform="rotate(150 128 128)"/>
39
+ <use href="#cells" transform="rotate(180 128 128)"/>
40
+ <use href="#cells" transform="rotate(240 128 128)"/>
41
+ <use href="#cells" transform="rotate(300 128 128)"/>
42
+ <use href="#cells" transform="rotate(330 128 128)"/>
43
+ </g>
44
+ <!-- caught cells: primary + secondary detection lights -->
45
+ <path d="M128 24 A104 104 0 0 1 154.9 27.5" transform="rotate(270 128 128)"
46
+ fill="none" stroke="#FF7A1A" stroke-width="6" stroke-linecap="round" filter="url(#glow)"/>
47
+ <path d="M128 24 A104 104 0 0 1 154.9 27.5" transform="rotate(120 128 128)"
48
+ fill="none" stroke="#FF7A1A" stroke-width="6" stroke-linecap="round" opacity="0.7" filter="url(#glow)"/>
49
+ <path d="M128 24 A104 104 0 0 1 154.9 27.5" transform="rotate(210 128 128)"
50
+ fill="none" stroke="#FFB020" stroke-width="6" stroke-linecap="round" opacity="0.55" filter="url(#glow)"/>
51
+
52
+ <!-- middle ring, brighter -->
53
+ <circle cx="128" cy="128" r="74" stroke="#6B7EB0" stroke-width="3" fill="none" stroke-dasharray="2 10" stroke-linecap="round"/>
54
+
55
+ <!-- detection dots on the middle ring -->
56
+ <g filter="url(#dotglow)">
57
+ <circle cx="182" cy="77.5" r="4" fill="#FF7A1A"/>
58
+ <circle cx="63" cy="171" r="3.2" fill="#FFB020" opacity="0.85"/>
59
+ <circle cx="128" cy="202" r="2.6" fill="#FF7A1A" opacity="0.7"/>
60
+ </g>
61
+
62
+ <!-- scan beam toward the caught cell (pointing left) -->
63
+ <path d="M118 128 L38 108 L38 148 Z" fill="url(#beamL)"/>
64
+
65
+ <!-- iris -->
66
+ <circle cx="128" cy="128" r="46" stroke="#E8EDF7" stroke-width="5" fill="#0A0E1A"/>
67
+
68
+ <!-- terminal cursor pupil -->
69
+ <rect x="113" y="106" width="30" height="44" rx="4" fill="#FF7A1A" filter="url(#glow)"/>
70
+ </svg>
@@ -0,0 +1,13 @@
1
+ name: dependency-audit
2
+ on:
3
+ schedule: [{ cron: "0 3 * * 1" }]
4
+ workflow_dispatch:
5
+ permissions:
6
+ contents: read
7
+ jobs:
8
+ osv:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803
12
+ - uses: google/osv-scanner-action/osv-scanner-action@6e4298ebc4db23e847df9b2e2de2939d6f066c67
13
+ with: { scan-args: "--lockfile=uv.lock" }
@@ -0,0 +1,71 @@
1
+ name: ci
2
+ on:
3
+ push: { branches: [main] }
4
+ pull_request:
5
+ schedule:
6
+ - cron: "17 3 * * *"
7
+ permissions:
8
+ contents: read
9
+ jobs:
10
+ lint-type:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
14
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
15
+ - run: uv sync --all-extras
16
+ - run: uv run ruff check . && uv run ruff format --check .
17
+ - run: uv run mypy
18
+ - run: uv run mypy --strict tests/unit/engine
19
+ - run: uv run mypy --strict scripts/check_rules.py
20
+ - run: uv run mypy --strict scripts/check_engine_loc.py scripts/check_no_excuse_rules.py
21
+ - run: uv run python scripts/check_no_excuse_rules.py tests/unit/engine scripts/check_rules.py
22
+ - run: uv run python scripts/check_engine_loc.py # 250 pure LOC maximum
23
+ - run: uv run python scripts/validate_schemas.py
24
+ - run: uv run python scripts/check_i18n.py
25
+ - run: uv run python scripts/check_phrases.py
26
+ - run: uv run python scripts/check_rules.py
27
+ - run: uv run python scripts/check_persistence_boundary.py
28
+ test:
29
+ strategy:
30
+ matrix:
31
+ os: [ubuntu-latest, macos-latest]
32
+ py: ["3.11", "3.12"]
33
+ runs-on: ${{ matrix.os }}
34
+ steps:
35
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
36
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
37
+ with: { python-version: "${{ matrix.py }}" }
38
+ - run: uv sync --all-extras
39
+ - run: uv run pytest -m "not docker and not network" --cov --cov-report=xml
40
+ - uses: codecov/codecov-action@0fb7174895f61a3b6b78fc075e0cd60383518dac # v5
41
+ if: matrix.os == 'ubuntu-latest' && matrix.py == '3.12'
42
+ with: { files: coverage.xml }
43
+ test-docker:
44
+ runs-on: ubuntu-latest
45
+ steps:
46
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
47
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
48
+ - run: uv sync --all-extras
49
+ - run: make images images-podman
50
+ - run: uv run pytest -m docker
51
+ self-scan:
52
+ # E16: run our own analyze line on this repository.
53
+ runs-on: ubuntu-latest
54
+ if: github.event_name != 'pull_request'
55
+ permissions:
56
+ contents: read
57
+ security-events: write
58
+ steps:
59
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
60
+ - id: scan
61
+ uses: ./
62
+ with:
63
+ path: .
64
+ mode: quick
65
+ sarif: pano.sarif
66
+ fail-on: never
67
+ - uses: github/codeql-action/upload-sarif@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4
68
+ if: always()
69
+ with:
70
+ sarif_file: pano.sarif
71
+ category: panopticon-self-scan
@@ -0,0 +1,118 @@
1
+ name: publish-sandbox-images
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ permissions:
7
+ contents: read
8
+
9
+ jobs:
10
+ publish:
11
+ runs-on: ubuntu-24.04
12
+ permissions:
13
+ contents: read
14
+ packages: write
15
+ steps:
16
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803
17
+ - uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130
18
+ - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f
19
+ - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9
20
+ with:
21
+ registry: ghcr.io
22
+ username: ${{ github.actor }}
23
+ password: ${{ secrets.GITHUB_TOKEN }}
24
+ - name: Publish base image
25
+ id: base
26
+ uses: docker/build-push-action@1104d471370f9806843c095c1db02b5a90c5f8b6
27
+ with:
28
+ context: src/panopticon/sandbox/images
29
+ file: src/panopticon/sandbox/images/base.Dockerfile
30
+ platforms: linux/amd64,linux/arm64
31
+ push: true
32
+ tags: ghcr.io/brnyxx/pano-sandbox-base:0.1
33
+ provenance: mode=max
34
+ sbom: true
35
+ - name: Publish Node 20 image
36
+ id: node20
37
+ uses: docker/build-push-action@1104d471370f9806843c095c1db02b5a90c5f8b6
38
+ with:
39
+ context: src/panopticon/sandbox/images
40
+ file: src/panopticon/sandbox/images/node.Dockerfile
41
+ platforms: linux/amd64,linux/arm64
42
+ push: true
43
+ tags: ghcr.io/brnyxx/pano-sandbox-node:20
44
+ build-args: BASE_IMAGE=ghcr.io/brnyxx/pano-sandbox-base@${{ steps.base.outputs.digest }}
45
+ provenance: mode=max
46
+ sbom: true
47
+ - name: Publish Node 22 image
48
+ id: node22
49
+ uses: docker/build-push-action@1104d471370f9806843c095c1db02b5a90c5f8b6
50
+ with:
51
+ context: src/panopticon/sandbox/images
52
+ file: src/panopticon/sandbox/images/node.Dockerfile
53
+ platforms: linux/amd64,linux/arm64
54
+ push: true
55
+ tags: ghcr.io/brnyxx/pano-sandbox-node:22
56
+ build-args: |
57
+ BASE_IMAGE=ghcr.io/brnyxx/pano-sandbox-base@${{ steps.base.outputs.digest }}
58
+ NODE_IMAGE=node:22-bookworm-slim@sha256:83f487e0a63425e5b4d146fb5e5be574bcbe1b7b843d3ebafdd95eaf7767a7e5
59
+ provenance: mode=max
60
+ sbom: true
61
+ - name: Publish Python 3.12 image
62
+ id: python312
63
+ uses: docker/build-push-action@1104d471370f9806843c095c1db02b5a90c5f8b6
64
+ with:
65
+ context: src/panopticon/sandbox/images
66
+ file: src/panopticon/sandbox/images/python.Dockerfile
67
+ platforms: linux/amd64,linux/arm64
68
+ push: true
69
+ tags: ghcr.io/brnyxx/pano-sandbox-python:3.12
70
+ provenance: mode=max
71
+ sbom: true
72
+ - name: Verify immutable manifests and tool versions
73
+ shell: bash
74
+ env:
75
+ BASE_DIGEST: ${{ steps.base.outputs.digest }}
76
+ NODE20_DIGEST: ${{ steps.node20.outputs.digest }}
77
+ NODE22_DIGEST: ${{ steps.node22.outputs.digest }}
78
+ PYTHON312_DIGEST: ${{ steps.python312.outputs.digest }}
79
+ run: |
80
+ set -euo pipefail
81
+ docker buildx imagetools inspect "ghcr.io/brnyxx/pano-sandbox-base@$BASE_DIGEST"
82
+ docker buildx imagetools inspect "ghcr.io/brnyxx/pano-sandbox-node@$NODE20_DIGEST"
83
+ docker buildx imagetools inspect "ghcr.io/brnyxx/pano-sandbox-node@$NODE22_DIGEST"
84
+ docker buildx imagetools inspect "ghcr.io/brnyxx/pano-sandbox-python@$PYTHON312_DIGEST"
85
+ docker run --rm --platform linux/amd64 --entrypoint node "ghcr.io/brnyxx/pano-sandbox-node@$NODE20_DIGEST" --version
86
+ docker run --rm --platform linux/arm64 --entrypoint node "ghcr.io/brnyxx/pano-sandbox-node@$NODE22_DIGEST" --version
87
+ docker run --rm --platform linux/amd64 --entrypoint python "ghcr.io/brnyxx/pano-sandbox-python@$PYTHON312_DIGEST" --version
88
+ docker run --rm --platform linux/amd64 --entrypoint uv "ghcr.io/brnyxx/pano-sandbox-python@$PYTHON312_DIGEST" --version
89
+ - name: Record immutable publication digests
90
+ shell: bash
91
+ env:
92
+ BASE_DIGEST: ${{ steps.base.outputs.digest }}
93
+ NODE20_DIGEST: ${{ steps.node20.outputs.digest }}
94
+ NODE22_DIGEST: ${{ steps.node22.outputs.digest }}
95
+ PYTHON312_DIGEST: ${{ steps.python312.outputs.digest }}
96
+ PANO_COMMIT: ${{ github.sha }}
97
+ run: |
98
+ python - <<'PY'
99
+ import json
100
+ import os
101
+ from pathlib import Path
102
+
103
+ payload = {
104
+ "commit": os.environ["PANO_COMMIT"],
105
+ "ghcr.io/brnyxx/pano-sandbox-base:0.1": os.environ["BASE_DIGEST"],
106
+ "ghcr.io/brnyxx/pano-sandbox-node:20": os.environ["NODE20_DIGEST"],
107
+ "ghcr.io/brnyxx/pano-sandbox-node:22": os.environ["NODE22_DIGEST"],
108
+ "ghcr.io/brnyxx/pano-sandbox-python:3.12": os.environ["PYTHON312_DIGEST"],
109
+ }
110
+ Path("image-digests.json").write_text(
111
+ json.dumps(payload, sort_keys=True, separators=(",", ":")) + "\n",
112
+ encoding="utf-8",
113
+ )
114
+ PY
115
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
116
+ with:
117
+ name: sandbox-image-digests
118
+ path: image-digests.json
@@ -0,0 +1,99 @@
1
+ name: platform-evidence
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ branches: [main]
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ probe:
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ include:
17
+ - label: darwin-arm64
18
+ runs-on: macos-14
19
+ - label: darwin-x86_64
20
+ runs-on: macos-15-intel
21
+ - label: linux-amd64
22
+ runs-on: ubuntu-24.04
23
+ - label: linux-arm64
24
+ runs-on: ubuntu-24.04-arm
25
+ - label: windows-x64
26
+ runs-on: windows-2025
27
+ runs-on: ${{ matrix.runs-on }}
28
+ name: probe-${{ matrix.label }}
29
+ permissions:
30
+ contents: read
31
+ id-token: write
32
+ attestations: write
33
+ steps:
34
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803
35
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78
36
+ - name: Install test dependencies
37
+ run: uv sync --all-extras
38
+ - name: Build local sandbox image
39
+ if: startsWith(matrix.label, 'linux-')
40
+ run: make images
41
+ - name: Probe platform
42
+ shell: bash
43
+ env:
44
+ PANO_PLATFORM_LABEL: ${{ matrix.label }}
45
+ PANO_COMMIT: ${{ github.sha }}
46
+ run: uv run python scripts/platform_probe.py --label "$PANO_PLATFORM_LABEL" --commit "$PANO_COMMIT" --output "evidence/$PANO_PLATFORM_LABEL.json"
47
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
48
+ if: always()
49
+ with:
50
+ name: platform-${{ matrix.label }}
51
+ path: evidence/${{ matrix.label }}.json
52
+ - uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
53
+ with:
54
+ subject-path: evidence/${{ matrix.label }}.json
55
+
56
+ probe-wsl2:
57
+ runs-on: windows-2025
58
+ permissions:
59
+ contents: read
60
+ id-token: write
61
+ attestations: write
62
+ steps:
63
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803
64
+ - name: Probe hosted WSL2
65
+ shell: pwsh
66
+ env:
67
+ PANO_COMMIT: ${{ github.sha }}
68
+ PANO_WORKSPACE: ${{ github.workspace }}
69
+ run: ./scripts/run_wsl2_probe.ps1 -Commit "$env:PANO_COMMIT" -Workspace "$env:PANO_WORKSPACE"
70
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
71
+ if: always()
72
+ with:
73
+ name: platform-wsl2-x64
74
+ path: evidence/wsl2-x64.json
75
+ - uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
76
+ with:
77
+ subject-path: evidence/wsl2-x64.json
78
+
79
+ validate:
80
+ needs: [probe, probe-wsl2]
81
+ if: always()
82
+ runs-on: ubuntu-24.04
83
+ permissions:
84
+ contents: read
85
+ attestations: read
86
+ steps:
87
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803
88
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78
89
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
90
+ with:
91
+ pattern: platform-*
92
+ path: evidence
93
+ merge-multiple: true
94
+ - name: Validate exact platform matrix
95
+ env:
96
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
97
+ PANO_COMMIT: ${{ github.sha }}
98
+ PANO_REPOSITORY: ${{ github.repository }}
99
+ run: uv run --no-project python scripts/run_platform_matrix.py --require darwin-arm64,darwin-x86_64,linux-amd64,linux-arm64,windows-x64,wsl2-x64 --evidence-dir evidence --commit "$PANO_COMMIT" --github-repo "$PANO_REPOSITORY"