inspect-ranges 0.2.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 (311) hide show
  1. inspect_ranges-0.2.0/.gitignore +240 -0
  2. inspect_ranges-0.2.0/LICENSE +21 -0
  3. inspect_ranges-0.2.0/PKG-INFO +29 -0
  4. inspect_ranges-0.2.0/README.md +10 -0
  5. inspect_ranges-0.2.0/pyproject.toml +147 -0
  6. inspect_ranges-0.2.0/src/inspect_ranges/__init__.py +105 -0
  7. inspect_ranges-0.2.0/src/inspect_ranges/__main__.py +6 -0
  8. inspect_ranges-0.2.0/src/inspect_ranges/_attackbox/__init__.py +48 -0
  9. inspect_ranges-0.2.0/src/inspect_ranges/_attackbox/attach.py +293 -0
  10. inspect_ranges-0.2.0/src/inspect_ranges/_attackbox/backend.py +218 -0
  11. inspect_ranges-0.2.0/src/inspect_ranges/_attackbox/conformance.py +480 -0
  12. inspect_ranges-0.2.0/src/inspect_ranges/_attackbox/record.py +90 -0
  13. inspect_ranges-0.2.0/src/inspect_ranges/_brand.py +21 -0
  14. inspect_ranges-0.2.0/src/inspect_ranges/_build/__init__.py +121 -0
  15. inspect_ranges-0.2.0/src/inspect_ranges/_build/activities.py +420 -0
  16. inspect_ranges-0.2.0/src/inspect_ranges/_build/behavioral.py +775 -0
  17. inspect_ranges-0.2.0/src/inspect_ranges/_build/capture.py +368 -0
  18. inspect_ranges-0.2.0/src/inspect_ranges/_build/errors.py +26 -0
  19. inspect_ranges-0.2.0/src/inspect_ranges/_build/guesttool.py +292 -0
  20. inspect_ranges-0.2.0/src/inspect_ranges/_build/manifest.py +658 -0
  21. inspect_ranges-0.2.0/src/inspect_ranges/_build/orchestrate.py +1943 -0
  22. inspect_ranges-0.2.0/src/inspect_ranges/_build/recipes.py +671 -0
  23. inspect_ranges-0.2.0/src/inspect_ranges/_build/verify.py +611 -0
  24. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/__init__.py +175 -0
  25. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/attach.py +202 -0
  26. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/corroborate.py +294 -0
  27. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/dataset.py +121 -0
  28. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/engine.py +362 -0
  29. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/evidenceread.py +118 -0
  30. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/goaltypes.py +275 -0
  31. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/netident.py +30 -0
  32. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/observedtypes.py +888 -0
  33. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/oracle.py +513 -0
  34. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/pcapscan.py +78 -0
  35. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/plants.py +120 -0
  36. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/poller.py +283 -0
  37. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/prober.py +197 -0
  38. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/registration.py +30 -0
  39. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/schema.py +1058 -0
  40. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/scorer.py +466 -0
  41. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/setup.py +461 -0
  42. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/submission.py +81 -0
  43. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/timings.py +58 -0
  44. inspect_ranges-0.2.0/src/inspect_ranges/_challenges/verify.py +242 -0
  45. inspect_ranges-0.2.0/src/inspect_ranges/_channel/__init__.py +95 -0
  46. inspect_ranges-0.2.0/src/inspect_ranges/_channel/bundle.py +275 -0
  47. inspect_ranges-0.2.0/src/inspect_ranges/_channel/channel.py +1775 -0
  48. inspect_ranges-0.2.0/src/inspect_ranges/_channel/codec.py +536 -0
  49. inspect_ranges-0.2.0/src/inspect_ranges/_channel/daemon/linux/README.md +44 -0
  50. inspect_ranges-0.2.0/src/inspect_ranges/_channel/daemon/windows/README.md +29 -0
  51. inspect_ranges-0.2.0/src/inspect_ranges/_channel/mocks.py +424 -0
  52. inspect_ranges-0.2.0/src/inspect_ranges/_channel/protocol.py +499 -0
  53. inspect_ranges-0.2.0/src/inspect_ranges/_channel/uds.py +154 -0
  54. inspect_ranges-0.2.0/src/inspect_ranges/_channel/vsock.py +166 -0
  55. inspect_ranges-0.2.0/src/inspect_ranges/_cli/__init__.py +0 -0
  56. inspect_ranges-0.2.0/src/inspect_ranges/_cli/appliercmd.py +91 -0
  57. inspect_ranges-0.2.0/src/inspect_ranges/_cli/attackboxcmd.py +77 -0
  58. inspect_ranges-0.2.0/src/inspect_ranges/_cli/buildcmd.py +197 -0
  59. inspect_ranges-0.2.0/src/inspect_ranges/_cli/daemonbundle.py +64 -0
  60. inspect_ranges-0.2.0/src/inspect_ranges/_cli/distcmd.py +469 -0
  61. inspect_ranges-0.2.0/src/inspect_ranges/_cli/doctor.py +29 -0
  62. inspect_ranges-0.2.0/src/inspect_ranges/_cli/evidencecmd.py +116 -0
  63. inspect_ranges-0.2.0/src/inspect_ranges/_cli/imagescmd.py +598 -0
  64. inspect_ranges-0.2.0/src/inspect_ranges/_cli/main.py +48 -0
  65. inspect_ranges-0.2.0/src/inspect_ranges/_cli/plancmd.py +213 -0
  66. inspect_ranges-0.2.0/src/inspect_ranges/_cli/reapercmd.py +54 -0
  67. inspect_ranges-0.2.0/src/inspect_ranges/_cli/schema.py +11 -0
  68. inspect_ranges-0.2.0/src/inspect_ranges/_cli/specpath.py +19 -0
  69. inspect_ranges-0.2.0/src/inspect_ranges/_cli/upcmd.py +181 -0
  70. inspect_ranges-0.2.0/src/inspect_ranges/_cli/validate.py +75 -0
  71. inspect_ranges-0.2.0/src/inspect_ranges/_compiler/__init__.py +32 -0
  72. inspect_ranges-0.2.0/src/inspect_ranges/_compiler/acl.py +168 -0
  73. inspect_ranges-0.2.0/src/inspect_ranges/_compiler/allocate.py +279 -0
  74. inspect_ranges-0.2.0/src/inspect_ranges/_compiler/dnsmasq.py +112 -0
  75. inspect_ranges-0.2.0/src/inspect_ranges/_compiler/draws.py +50 -0
  76. inspect_ranges-0.2.0/src/inspect_ranges/_compiler/egress.py +109 -0
  77. inspect_ranges-0.2.0/src/inspect_ranges/_compiler/nftables.py +104 -0
  78. inspect_ranges-0.2.0/src/inspect_ranges/_compiler/plan.py +760 -0
  79. inspect_ranges-0.2.0/src/inspect_ranges/_compiler/probe.py +135 -0
  80. inspect_ranges-0.2.0/src/inspect_ranges/_compiler/render.py +959 -0
  81. inspect_ranges-0.2.0/src/inspect_ranges/_compiler/routing.py +43 -0
  82. inspect_ranges-0.2.0/src/inspect_ranges/_devbox/__init__.py +915 -0
  83. inspect_ranges-0.2.0/src/inspect_ranges/_devbox/bootstrap.sh +149 -0
  84. inspect_ranges-0.2.0/src/inspect_ranges/_devbox/idle-check.sh +49 -0
  85. inspect_ranges-0.2.0/src/inspect_ranges/_diagnostics.py +621 -0
  86. inspect_ranges-0.2.0/src/inspect_ranges/_dist/__init__.py +54 -0
  87. inspect_ranges-0.2.0/src/inspect_ranges/_dist/catalog.py +510 -0
  88. inspect_ranges-0.2.0/src/inspect_ranges/_dist/encode.py +435 -0
  89. inspect_ranges-0.2.0/src/inspect_ranges/_dist/errors.py +12 -0
  90. inspect_ranges-0.2.0/src/inspect_ranges/_dist/gc.py +139 -0
  91. inspect_ranges-0.2.0/src/inspect_ranges/_dist/location.py +165 -0
  92. inspect_ranges-0.2.0/src/inspect_ranges/_dist/materialize.py +668 -0
  93. inspect_ranges-0.2.0/src/inspect_ranges/_dist/mirror.py +216 -0
  94. inspect_ranges-0.2.0/src/inspect_ranges/_dist/oci.py +666 -0
  95. inspect_ranges-0.2.0/src/inspect_ranges/_dist/progress.py +94 -0
  96. inspect_ranges-0.2.0/src/inspect_ranges/_dist/registry.py +775 -0
  97. inspect_ranges-0.2.0/src/inspect_ranges/_dist/resolve.py +556 -0
  98. inspect_ranges-0.2.0/src/inspect_ranges/_dist/transfer.py +87 -0
  99. inspect_ranges-0.2.0/src/inspect_ranges/_doctor/__init__.py +15 -0
  100. inspect_ranges-0.2.0/src/inspect_ranges/_doctor/checks.py +1532 -0
  101. inspect_ranges-0.2.0/src/inspect_ranges/_doctor/report.py +99 -0
  102. inspect_ranges-0.2.0/src/inspect_ranges/_doctor/result.py +28 -0
  103. inspect_ranges-0.2.0/src/inspect_ranges/_doctor/s3probe.py +55 -0
  104. inspect_ranges-0.2.0/src/inspect_ranges/_evidence/__init__.py +130 -0
  105. inspect_ranges-0.2.0/src/inspect_ranges/_evidence/capture.py +743 -0
  106. inspect_ranges-0.2.0/src/inspect_ranges/_evidence/execwitness.py +309 -0
  107. inspect_ranges-0.2.0/src/inspect_ranges/_evidence/location.py +122 -0
  108. inspect_ranges-0.2.0/src/inspect_ranges/_evidence/manifest.py +193 -0
  109. inspect_ranges-0.2.0/src/inspect_ranges/_evidence/reader.py +496 -0
  110. inspect_ranges-0.2.0/src/inspect_ranges/_evidence/s3.py +214 -0
  111. inspect_ranges-0.2.0/src/inspect_ranges/_evidence/sealer.py +149 -0
  112. inspect_ranges-0.2.0/src/inspect_ranges/_evidence/sink.py +624 -0
  113. inspect_ranges-0.2.0/src/inspect_ranges/_evidence/supervisor.py +241 -0
  114. inspect_ranges-0.2.0/src/inspect_ranges/_evidence/telemetry.py +712 -0
  115. inspect_ranges-0.2.0/src/inspect_ranges/_host/__init__.py +66 -0
  116. inspect_ranges-0.2.0/src/inspect_ranges/_host/applier.py +810 -0
  117. inspect_ranges-0.2.0/src/inspect_ranges/_host/backend.py +204 -0
  118. inspect_ranges-0.2.0/src/inspect_ranges/_host/host.py +97 -0
  119. inspect_ranges-0.2.0/src/inspect_ranges/_host/leases.py +214 -0
  120. inspect_ranges-0.2.0/src/inspect_ranges/_host/local.py +223 -0
  121. inspect_ranges-0.2.0/src/inspect_ranges/_host/reaper.py +176 -0
  122. inspect_ranges-0.2.0/src/inspect_ranges/_host/remote.py +106 -0
  123. inspect_ranges-0.2.0/src/inspect_ranges/_host/seams.py +188 -0
  124. inspect_ranges-0.2.0/src/inspect_ranges/_host/stages.py +79 -0
  125. inspect_ranges-0.2.0/src/inspect_ranges/_metadata.py +10 -0
  126. inspect_ranges-0.2.0/src/inspect_ranges/_provider/__init__.py +26 -0
  127. inspect_ranges-0.2.0/src/inspect_ranges/_provider/admission.py +150 -0
  128. inspect_ranges-0.2.0/src/inspect_ranges/_provider/errors.py +135 -0
  129. inspect_ranges-0.2.0/src/inspect_ranges/_provider/evidence.py +570 -0
  130. inspect_ranges-0.2.0/src/inspect_ranges/_provider/naming.py +148 -0
  131. inspect_ranges-0.2.0/src/inspect_ranges/_provider/ops.py +415 -0
  132. inspect_ranges-0.2.0/src/inspect_ranges/_provider/provider.py +911 -0
  133. inspect_ranges-0.2.0/src/inspect_ranges/_provider/retry.py +283 -0
  134. inspect_ranges-0.2.0/src/inspect_ranges/_provider/state.py +325 -0
  135. inspect_ranges-0.2.0/src/inspect_ranges/_registry.py +36 -0
  136. inspect_ranges-0.2.0/src/inspect_ranges/_runtime/__init__.py +35 -0
  137. inspect_ranges-0.2.0/src/inspect_ranges/_runtime/down.py +189 -0
  138. inspect_ranges-0.2.0/src/inspect_ranges/_runtime/images.py +529 -0
  139. inspect_ranges-0.2.0/src/inspect_ranges/_runtime/ownership.py +157 -0
  140. inspect_ranges-0.2.0/src/inspect_ranges/_runtime/range_image/entrypoint.sh +61 -0
  141. inspect_ranges-0.2.0/src/inspect_ranges/_runtime/rangeimage.py +130 -0
  142. inspect_ranges-0.2.0/src/inspect_ranges/_runtime/registry.py +80 -0
  143. inspect_ranges-0.2.0/src/inspect_ranges/_runtime/up.py +1094 -0
  144. inspect_ranges-0.2.0/src/inspect_ranges/_runtime/winimage.py +531 -0
  145. inspect_ranges-0.2.0/src/inspect_ranges/_scanners/__init__.py +1 -0
  146. inspect_ranges-0.2.0/src/inspect_ranges/_scanners/engine.py +773 -0
  147. inspect_ranges-0.2.0/src/inspect_ranges/_scanners/reachability.py +112 -0
  148. inspect_ranges-0.2.0/src/inspect_ranges/_terminal/__init__.py +5 -0
  149. inspect_ranges-0.2.0/src/inspect_ranges/_terminal/capture.py +280 -0
  150. inspect_ranges-0.2.0/src/inspect_ranges/_terminal/cast.py +108 -0
  151. inspect_ranges-0.2.0/src/inspect_ranges/_terminal/session.py +395 -0
  152. inspect_ranges-0.2.0/src/inspect_ranges/_terminal/tool.py +341 -0
  153. inspect_ranges-0.2.0/src/inspect_ranges/_version.py +24 -0
  154. inspect_ranges-0.2.0/src/inspect_ranges/attackbox.py +44 -0
  155. inspect_ranges-0.2.0/src/inspect_ranges/examples/__init__.py +26 -0
  156. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/README.md +132 -0
  157. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/__init__.py +1 -0
  158. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/challenges.yaml +85 -0
  159. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/cross-segment-recon/forged.sh +4 -0
  160. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/cross-segment-recon/insufficient.sh +6 -0
  161. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/cross-segment-recon/reference.sh +34 -0
  162. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/firewall-pivot/forged.sh +4 -0
  163. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/firewall-pivot/insufficient.sh +7 -0
  164. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/firewall-pivot/reference.sh +97 -0
  165. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/forensics-triage/forged.sh +6 -0
  166. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/forensics-triage/insufficient.sh +9 -0
  167. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/forensics-triage/reference.sh +16 -0
  168. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/local-privesc-flag/forged.sh +4 -0
  169. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/local-privesc-flag/insufficient.sh +6 -0
  170. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/checks/local-privesc-flag/reference.sh +62 -0
  171. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/cyris-basic-topology.svg +16 -0
  172. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/deferred.yaml +89 -0
  173. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/notes.md +51 -0
  174. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/range.yaml +87 -0
  175. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/recipes/cyris.desktop/recipe.yaml +4 -0
  176. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/recipes/cyris.desktop/run.sh +84 -0
  177. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/recipes/cyris.firewall/recipe.yaml +4 -0
  178. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/recipes/cyris.firewall/run.sh +36 -0
  179. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/recipes/cyris.webserver/recipe.yaml +4 -0
  180. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/recipes/cyris.webserver/run.sh +79 -0
  181. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/source.md +15 -0
  182. inspect_ranges-0.2.0/src/inspect_ranges/examples/_cyris_basic/task.py +28 -0
  183. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/README.md +149 -0
  184. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/__init__.py +1 -0
  185. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/challenges.yaml +47 -0
  186. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/checks/crown-jewels/forged.sh +5 -0
  187. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/checks/crown-jewels/insufficient.sh +13 -0
  188. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/checks/crown-jewels/reference.sh +100 -0
  189. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/checks/customer-data/forged.sh +5 -0
  190. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/checks/customer-data/insufficient.sh +18 -0
  191. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/checks/customer-data/reference.sh +102 -0
  192. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/checks/web-foothold/forged.sh +5 -0
  193. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/checks/web-foothold/insufficient.sh +22 -0
  194. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/checks/web-foothold/reference.sh +128 -0
  195. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/dmz-pivot-topology.svg +16 -0
  196. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/notes.md +48 -0
  197. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/range.yaml +115 -0
  198. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/recipes/dmz.db/recipe.yaml +4 -0
  199. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/recipes/dmz.db/run.sh +40 -0
  200. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/recipes/dmz.web/recipe.yaml +4 -0
  201. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/recipes/dmz.web/run.sh +51 -0
  202. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/source.md +8 -0
  203. inspect_ranges-0.2.0/src/inspect_ranges/examples/_dmz_pivot/task.py +28 -0
  204. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/README.md +131 -0
  205. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/__init__.py +1 -0
  206. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/challenges.yaml +55 -0
  207. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/checks/exfiltrate-critical-data/forged.sh +7 -0
  208. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/checks/exfiltrate-critical-data/insufficient.sh +53 -0
  209. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/checks/exfiltrate-critical-data/reference.sh +107 -0
  210. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/deferred.yaml +83 -0
  211. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/equifax-topology.svg +16 -0
  212. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/notes.md +55 -0
  213. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/range.yaml +191 -0
  214. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/recipes/mh.database/payload/pivot_key.pub +1 -0
  215. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/recipes/mh.database/recipe.yaml +7 -0
  216. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/recipes/mh.database/run.sh +34 -0
  217. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/recipes/mh.webserver/payload/pivot_key +8 -0
  218. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/recipes/mh.webserver/payload/pivot_key.pub +1 -0
  219. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/recipes/mh.webserver/payload/struts_probe.sh +14 -0
  220. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/recipes/mh.webserver/recipe.yaml +7 -0
  221. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/recipes/mh.webserver/run.sh +71 -0
  222. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/source.md +20 -0
  223. inspect_ranges-0.2.0/src/inspect_ranges/examples/_equifax/task.py +28 -0
  224. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/README.md +134 -0
  225. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/__init__.py +1 -0
  226. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/challenges.yaml +55 -0
  227. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/checks/ad-domain-dominance/forged.sh +8 -0
  228. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/checks/ad-domain-dominance/insufficient.sh +34 -0
  229. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/checks/ad-domain-dominance/reference.sh +88 -0
  230. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/deferred.yaml +59 -0
  231. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/goad-light-topology.svg +16 -0
  232. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/notes.md +90 -0
  233. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/range.yaml +182 -0
  234. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.dc01-forest/promote.ps1 +14 -0
  235. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.dc01-forest/realize.ps1 +259 -0
  236. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.dc01-forest/recipe.yaml +4 -0
  237. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.dc01-forest/run.sh +52 -0
  238. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.dc02-child/promote.ps1 +23 -0
  239. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.dc02-child/realize.ps1 +163 -0
  240. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.dc02-child/recipe.yaml +4 -0
  241. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.dc02-child/run.sh +60 -0
  242. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.srv02-member/join.ps1 +14 -0
  243. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.srv02-member/mssql.ps1 +74 -0
  244. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.srv02-member/realize.ps1 +113 -0
  245. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.srv02-member/recipe.yaml +4 -0
  246. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/recipes/goad.srv02-member/run.sh +60 -0
  247. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/source.md +17 -0
  248. inspect_ranges-0.2.0/src/inspect_ranges/examples/_goad_light/task.py +28 -0
  249. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/README.md +132 -0
  250. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/__init__.py +1 -0
  251. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/challenges.yaml +51 -0
  252. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/checks/telnet-ladder/forged.sh +8 -0
  253. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/checks/telnet-ladder/insufficient.sh +11 -0
  254. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/checks/telnet-ladder/reference.sh +126 -0
  255. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/deferred.yaml +58 -0
  256. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/kypo-demo-topology.svg +16 -0
  257. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/notes.md +47 -0
  258. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/range.yaml +95 -0
  259. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/recipes/kypo.client/recipe.yaml +4 -0
  260. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/recipes/kypo.client/run.sh +51 -0
  261. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/recipes/kypo.server/recipe.yaml +7 -0
  262. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/recipes/kypo.server/run.sh +80 -0
  263. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/source.md +17 -0
  264. inspect_ranges-0.2.0/src/inspect_ranges/examples/_kypo_demo/task.py +28 -0
  265. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/README.md +126 -0
  266. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/__init__.py +1 -0
  267. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/activities/benign-admin.ps1 +26 -0
  268. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/challenges.yaml +144 -0
  269. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/checks/evade-detection-t1003-001/forged.sh +84 -0
  270. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/checks/evade-detection-t1003-001/insufficient.sh +40 -0
  271. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/checks/evade-detection-t1003-001/reference.sh +130 -0
  272. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/checks/execute-and-confirm-t1003-001/forged.sh +47 -0
  273. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/checks/execute-and-confirm-t1003-001/insufficient.sh +31 -0
  274. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/checks/execute-and-confirm-t1003-001/reference.sh +41 -0
  275. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/collectors.yaml +21 -0
  276. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/deferred.yaml +54 -0
  277. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/notes.md +110 -0
  278. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/range.yaml +83 -0
  279. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/recipes/arw.splunk-server/recipe.yaml +4 -0
  280. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/recipes/arw.splunk-server/run.sh +125 -0
  281. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/recipes/arw.win-endpoint/endpoint.ps1 +310 -0
  282. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/recipes/arw.win-endpoint/recipe.yaml +6 -0
  283. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/recipes/arw.win-endpoint/run.sh +15 -0
  284. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/source.md +14 -0
  285. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/splunk-detection-topology.svg +16 -0
  286. inspect_ranges-0.2.0/src/inspect_ranges/examples/_splunk_detection/task.py +31 -0
  287. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/README.md +118 -0
  288. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/__init__.py +1 -0
  289. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/challenges.yaml +36 -0
  290. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/checks/zabbix-rce/forged.sh +6 -0
  291. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/checks/zabbix-rce/insufficient.sh +23 -0
  292. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/checks/zabbix-rce/reference.sh +105 -0
  293. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/deferred.yaml +29 -0
  294. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/notes.md +54 -0
  295. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/range.yaml +86 -0
  296. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/recipes/vulhub.mysql57/recipe.yaml +7 -0
  297. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/recipes/vulhub.mysql57/run.sh +73 -0
  298. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/recipes/vulhub.zabbix-agent/recipe.yaml +7 -0
  299. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/recipes/vulhub.zabbix-agent/run.sh +51 -0
  300. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/recipes/vulhub.zabbix-server/recipe.yaml +7 -0
  301. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/recipes/vulhub.zabbix-server/run.sh +64 -0
  302. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/recipes/vulhub.zabbix-web/recipe.yaml +9 -0
  303. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/recipes/vulhub.zabbix-web/run.sh +60 -0
  304. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/source.md +15 -0
  305. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/task.py +28 -0
  306. inspect_ranges-0.2.0/src/inspect_ranges/examples/_vulhub_zabbix/vulhub-zabbix-topology.svg +16 -0
  307. inspect_ranges-0.2.0/src/inspect_ranges/host.py +82 -0
  308. inspect_ranges-0.2.0/src/inspect_ranges/py.typed +0 -0
  309. inspect_ranges-0.2.0/src/inspect_ranges/scanners.py +85 -0
  310. inspect_ranges-0.2.0/src/inspect_ranges/schema.py +252 -0
  311. inspect_ranges-0.2.0/src/inspect_ranges/types.py +1790 -0
@@ -0,0 +1,240 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # Jupyter Notebook
75
+ .ipynb_checkpoints
76
+
77
+ # IPython
78
+ profile_default/
79
+ ipython_config.py
80
+
81
+ # pyenv
82
+ # For a library or package, you might want to ignore these files since the code is
83
+ # intended to run in multiple environments; otherwise, check them in:
84
+ # .python-version
85
+
86
+ # pipenv
87
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
88
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
89
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
90
+ # install all needed dependencies.
91
+ #Pipfile.lock
92
+
93
+ # UV
94
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
95
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
96
+ # commonly ignored for libraries.
97
+ #uv.lock
98
+
99
+ # poetry
100
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
101
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
102
+ # commonly ignored for libraries.
103
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
104
+ #poetry.lock
105
+ #poetry.toml
106
+
107
+ # pdm
108
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
109
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
110
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
111
+ #pdm.lock
112
+ #pdm.toml
113
+ .pdm-python
114
+ .pdm-build/
115
+
116
+ # pixi
117
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
118
+ #pixi.lock
119
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
120
+ # in the .venv directory. It is recommended not to include this directory in version control.
121
+ .pixi
122
+
123
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
124
+ __pypackages__/
125
+
126
+ # Celery stuff
127
+ celerybeat-schedule
128
+ celerybeat.pid
129
+
130
+ # SageMath parsed files
131
+ *.sage.py
132
+
133
+ # Environments
134
+ .env
135
+ .envrc
136
+ .venv*
137
+ env/
138
+ venv/
139
+ ENV/
140
+ env.bak/
141
+ venv.bak/
142
+
143
+ # Spyder project settings
144
+ .spyderproject
145
+ .spyproject
146
+
147
+ # Rope project settings
148
+ .ropeproject
149
+
150
+ # mkdocs documentation
151
+ /site
152
+
153
+ # pyright
154
+ .pyright/
155
+
156
+ # Pyre type checker
157
+ .pyre/
158
+
159
+ # pytype static type analyzer
160
+ .pytype/
161
+
162
+ # mypy type checker
163
+ .mypy_cache/
164
+
165
+ # Cython debug symbols
166
+ cython_debug/
167
+
168
+ # PyCharm
169
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
170
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
171
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
172
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
173
+ #.idea/
174
+
175
+ # Abstra
176
+ # Abstra is an AI-powered process automation framework.
177
+ # Ignore directories containing user credentials, local state, and settings.
178
+ # Learn more at https://abstra.io/docs
179
+ .abstra/
180
+
181
+ # Visual Studio Code
182
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
183
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
184
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
185
+ # you could uncomment the following to ignore the entire vscode folder
186
+ # .vscode/
187
+
188
+ # Ruff stuff:
189
+ .ruff_cache/
190
+
191
+ # PyPI configuration file
192
+ .pypirc
193
+
194
+ # Cursor
195
+ # Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
196
+ # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
197
+ # refer to https://docs.cursor.com/context/ignore-files
198
+ .cursorignore
199
+ .cursorindexingignore
200
+
201
+ # Marimo
202
+ marimo/_static/
203
+ marimo/_lsp/
204
+ __marimo__/
205
+
206
+ # Dynamic version
207
+ src/inspect_ranges/_version.py
208
+
209
+ # Inspect logs and scans
210
+ /logs/
211
+ /logs-*/
212
+ /runs/
213
+ /scans/
214
+ /transcripts/
215
+ # eval logs and evidence stores written by runs started inside a range directory
216
+ src/inspect_ranges/examples/*/logs/
217
+
218
+ # MacOS
219
+ .DS_Store
220
+
221
+ # Claude Code
222
+ **/.claude/settings.local.json
223
+ .claude
224
+
225
+ # Quarto Docs
226
+ /.luarc.json
227
+
228
+
229
+ # daemon build droppings (the artifact builder works in a temp name)
230
+ .vsockd-build
231
+
232
+ .quarto
233
+ *.pdf
234
+ /.quarto/
235
+ **/*.quarto_ipynb
236
+
237
+ # quarto preview output written in place under docs/
238
+ docs/**/*.html
239
+ docs/site_libs/
240
+ docs/**/*_files/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Meridian Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,29 @@
1
+ Metadata-Version: 2.5
2
+ Name: inspect_ranges
3
+ Version: 0.2.0
4
+ Summary: Inspect AI extension for ranges.
5
+ Project-URL: Source Code, https://github.com/meridianlabs-ai/inspect_ranges
6
+ Project-URL: Issue Tracker, https://github.com/meridianlabs-ai/inspect_ranges/issues
7
+ Author: Meridian Labs
8
+ License: MIT License
9
+ License-File: LICENSE
10
+ Requires-Python: >=3.12
11
+ Requires-Dist: boto3[crt]>=1.40
12
+ Requires-Dist: click>=8.0
13
+ Requires-Dist: inspect-ai>=0.3.285
14
+ Requires-Dist: inspect-scout>=0.6.0
15
+ Requires-Dist: pydantic>=2
16
+ Requires-Dist: pyyaml>=6
17
+ Requires-Dist: tenacity>=8.2
18
+ Description-Content-Type: text/markdown
19
+
20
+ # Inspect Ranges
21
+
22
+ Welcome to Inspect Ranges, an extension for [Inspect AI](https://inspect.aisi.org.uk).
23
+
24
+ ```bash
25
+ git clone https://github.com/meridianlabs-ai/inspect_ranges.git
26
+ cd inspect_ranges && pip install .
27
+ ```
28
+
29
+ Learn more about using Inspect Ranges at <https://meridianlabs-ai.github.io/inspect_ranges>.
@@ -0,0 +1,10 @@
1
+ # Inspect Ranges
2
+
3
+ Welcome to Inspect Ranges, an extension for [Inspect AI](https://inspect.aisi.org.uk).
4
+
5
+ ```bash
6
+ git clone https://github.com/meridianlabs-ai/inspect_ranges.git
7
+ cd inspect_ranges && pip install .
8
+ ```
9
+
10
+ Learn more about using Inspect Ranges at <https://meridianlabs-ai.github.io/inspect_ranges>.
@@ -0,0 +1,147 @@
1
+ [project]
2
+ name = "inspect_ranges"
3
+ dynamic = ["version"]
4
+ description = "Inspect AI extension for ranges."
5
+ authors = [{ name = "Meridian Labs" }]
6
+ readme = "README.md"
7
+ requires-python = ">=3.12"
8
+ license = { text = "MIT License" }
9
+ dependencies = [
10
+ "inspect-ai>=0.3.285",
11
+ "boto3[crt]>=1.40",
12
+ "click>=8.0",
13
+ "pydantic>=2",
14
+ "pyyaml>=6",
15
+ "tenacity>=8.2",
16
+ "inspect-scout>=0.6.0",
17
+ ]
18
+
19
+ [project.urls]
20
+ "Source Code" = "https://github.com/meridianlabs-ai/inspect_ranges"
21
+ "Issue Tracker" = "https://github.com/meridianlabs-ai/inspect_ranges/issues"
22
+
23
+ [build-system]
24
+ requires = ["hatchling", "hatch-vcs"]
25
+ build-backend = "hatchling.build"
26
+
27
+ [project.entry-points.inspect_ai]
28
+ inspect_ranges = "inspect_ranges._registry"
29
+
30
+ [project.scripts]
31
+ inspect-ranges = "inspect_ranges._cli.main:main"
32
+
33
+
34
+ [dependency-groups]
35
+ dev = [
36
+ "ruff",
37
+ "pytest",
38
+ "pyright",
39
+ "pytest-xdist",
40
+ "pytest-dotenv",
41
+ "pytest-timeout>=2.4.0",
42
+ "anthropic>=1.11.0",
43
+ "pytest-cov>=7.1.0",
44
+ "types-PyYAML",
45
+ ]
46
+ # Kept out of `dev` and the default groups: quarto-cli has no wheel and is
47
+ # built from its sdist. Docs builds ask for it with `--group doc`.
48
+ doc = [
49
+ "jupyter",
50
+ "panflute",
51
+ "markdown",
52
+ "griffe>=2",
53
+ "rich",
54
+ "pyyaml",
55
+ "quarto-cli>=1.9.36",
56
+ ]
57
+ dist = ["twine", "build"]
58
+
59
+ [tool.hatch.build]
60
+ only-packages = true
61
+ # the examples' vendored upstream/ trees are repo-only provenance: never
62
+ # distributed (examples-into-package slice)
63
+ exclude = ["docs/", "tests/", "src/inspect_ranges/examples/_*/upstream/"]
64
+ artifacts = [
65
+ "src/**/*.yaml",
66
+ "src/**/*.md",
67
+ "src/**/*.txt",
68
+ "src/**/*.sh",
69
+ "src/**/py.typed",
70
+ # the examples ship their full data trees (recipes/, checks/, yaml, docs);
71
+ # artifacts bypass `exclude`, so upstream/ needs the negated pattern too
72
+ "src/inspect_ranges/examples/_*/**",
73
+ "!src/inspect_ranges/examples/_*/upstream/**",
74
+ ]
75
+
76
+ [tool.hatch.version]
77
+ source = "vcs"
78
+
79
+ [tool.hatch.build.hooks.vcs]
80
+ version-file = "src/inspect_ranges/_version.py"
81
+
82
+ [tool.hatch.version.raw-options]
83
+ local_scheme = "no-local-version" # Important for PyPI compatibility
84
+
85
+ [tool.uv]
86
+ managed = true
87
+ # uv 0.12.22 is the first release that writes lock revision 5 (this uv.lock)
88
+ required-version = ">=0.12.22"
89
+
90
+ [tool.ruff]
91
+ # explicit exclude list: ruff's DEFAULT excludes contain "_build", which
92
+ # silently blinded the lint/format gate to src/inspect_ranges/_build (caught
93
+ # by the slice-5 fresh-context review)
94
+ exclude = [
95
+ ".git",
96
+ ".venv",
97
+ "docs",
98
+ "design",
99
+ # vendored upstream provenance under the examples is FROZEN: neither
100
+ # linted nor reformatted (linux-examples-v1 phase review round 1)
101
+ "src/inspect_ranges/examples/_*/upstream",
102
+ ]
103
+ src = ["."]
104
+
105
+ [tool.ruff.lint]
106
+ select = [
107
+ "E", # pycodestyle errors
108
+ "W", # pycodestyle warnings
109
+ "F", # flake8
110
+ "D", # pydocstyle
111
+ "I", # isort
112
+ "B", # flake8-bugbear
113
+ "SIM101", # duplicate isinstance
114
+ # "RET", # flake8-return
115
+ # "RUF", # ruff rules
116
+ ]
117
+ ignore = ["E203", "E501", "D10", "D212", "D415"]
118
+
119
+ [tool.ruff.lint.pydocstyle]
120
+ convention = "google"
121
+
122
+ [tool.pytest.ini_options]
123
+ pythonpath = ["src"]
124
+ testpaths = ["tests"]
125
+ addopts = "-n auto"
126
+
127
+ [tool.pyright]
128
+ include = ["src", "tests"]
129
+ # vendored upstream provenance under the examples is FROZEN: never typechecked
130
+ exclude = ["src/inspect_ranges/examples/*/upstream"]
131
+ extraPaths = ["."]
132
+ typeCheckingMode = "strict"
133
+ pythonPlatform = "All"
134
+
135
+ # tests may exercise private helpers directly
136
+ [[tool.pyright.executionEnvironments]]
137
+ root = "tests"
138
+ reportPrivateUsage = false
139
+
140
+ # the devbox CLI wraps boto3, whose responses are untyped-by-nature; its
141
+ # correctness is operational, not statically checkable
142
+ [[tool.pyright.executionEnvironments]]
143
+ root = "src/inspect_ranges/_devbox"
144
+ reportUnknownMemberType = false
145
+ reportUnknownVariableType = false
146
+ reportUnknownArgumentType = false
147
+ reportMissingTypeStubs = false
@@ -0,0 +1,105 @@
1
+ # __version__ resolves first: deep imports (the oracle's compiler/runtime
2
+ # chain) read it during package initialization
3
+ try:
4
+ from ._version import __version__
5
+ except ImportError:
6
+ __version__ = "unknown"
7
+
8
+ from ._challenges import (
9
+ PROBE_MAC_PREFIX,
10
+ AnswerGoal,
11
+ AvailabilityGoal,
12
+ Challenge,
13
+ Challenges,
14
+ ControlGoal,
15
+ DegradeGoal,
16
+ DetectionGoal,
17
+ EvadeGoal,
18
+ ExecuteGoal,
19
+ ExfiltrateGoal,
20
+ FlagGoal,
21
+ Goal,
22
+ GoalBase,
23
+ GoalResult,
24
+ GoalType,
25
+ HijackGoal,
26
+ JudgeGoal,
27
+ Observations,
28
+ ObserverKind,
29
+ OracleSetupError,
30
+ PatchGoal,
31
+ Primitive,
32
+ RangeOracle,
33
+ Scoring,
34
+ SeverityFilter,
35
+ TamperGoal,
36
+ challenge_dataset,
37
+ challenge_scorer,
38
+ challenge_setup,
39
+ guest_segment_ip,
40
+ load_challenges,
41
+ load_collectors,
42
+ range_oracle,
43
+ register_exploit,
44
+ register_goal_type,
45
+ source_bound_find,
46
+ validate_challenges,
47
+ verify_goal,
48
+ )
49
+ from ._terminal import terminal
50
+ from .schema import (
51
+ load_range,
52
+ range_json_schema,
53
+ revalidate_range,
54
+ validate_range,
55
+ )
56
+ from .types import semantic_issues
57
+
58
+ __all__ = [
59
+ "PROBE_MAC_PREFIX",
60
+ "AnswerGoal",
61
+ "AvailabilityGoal",
62
+ "Challenge",
63
+ "Challenges",
64
+ "ControlGoal",
65
+ "DegradeGoal",
66
+ "DetectionGoal",
67
+ "EvadeGoal",
68
+ "ExecuteGoal",
69
+ "ExfiltrateGoal",
70
+ "FlagGoal",
71
+ "Goal",
72
+ "GoalBase",
73
+ "GoalResult",
74
+ "GoalType",
75
+ "HijackGoal",
76
+ "JudgeGoal",
77
+ "Observations",
78
+ "ObserverKind",
79
+ "OracleSetupError",
80
+ "PatchGoal",
81
+ "Primitive",
82
+ "RangeOracle",
83
+ "Scoring",
84
+ "SeverityFilter",
85
+ "TamperGoal",
86
+ "__version__",
87
+ "challenge_dataset",
88
+ "challenge_scorer",
89
+ "challenge_setup",
90
+ "guest_segment_ip",
91
+ "load_challenges",
92
+ "load_collectors",
93
+ "load_range",
94
+ "range_json_schema",
95
+ "range_oracle",
96
+ "register_exploit",
97
+ "register_goal_type",
98
+ "revalidate_range",
99
+ "semantic_issues",
100
+ "source_bound_find",
101
+ "terminal",
102
+ "validate_challenges",
103
+ "validate_range",
104
+ "verify_goal",
105
+ ]
@@ -0,0 +1,6 @@
1
+ """`python -m inspect_ranges` — runs the CLI without needing the console script on `PATH`."""
2
+
3
+ from ._cli.main import main
4
+
5
+ if __name__ == "__main__":
6
+ main()
@@ -0,0 +1,48 @@
1
+ """The attack-box provider seam (`attack-box-v1.md`): an external supplier for one range's dedicated attack box.
2
+
3
+ The range supplies an L2 attachment point on the foothold's segment (taps built inside the range netns, fds handed over) and routes the attacker's exec to the surface the provider returns; the provider supplies the box behind both and owns its lifecycle. Registration mirrors `INSPECT_RANGES_HOST`: the `INSPECT_RANGES_ATTACK_BOX` value is the registration, persisted as the project's attack-box origin so teardown re-resolves from disk. Selection is deployment knowledge, never `range.yaml`. Scope is dedicated attack boxes only: an assumed-breach foothold is a content guest this project builds and captures, excluded by construction.
4
+ """
5
+
6
+ from .backend import (
7
+ ENV_VAR,
8
+ AttachedInterface,
9
+ AttackBoxBackend,
10
+ AttackBoxCapabilities,
11
+ AttackBoxContext,
12
+ AttackBoxFactory,
13
+ AttackBoxHandle,
14
+ AttackBoxProvider,
15
+ AttackBoxReclaimFn,
16
+ FootholdAttachment,
17
+ ParsedAttackBox,
18
+ attack_box_origin,
19
+ parse_attack_box,
20
+ resolve_attack_box,
21
+ )
22
+ from .record import (
23
+ AttackBoxRecord,
24
+ attack_box_record_path,
25
+ read_attack_box_record,
26
+ write_attack_box_record,
27
+ )
28
+
29
+ __all__ = [
30
+ "ENV_VAR",
31
+ "AttachedInterface",
32
+ "AttackBoxBackend",
33
+ "AttackBoxCapabilities",
34
+ "AttackBoxContext",
35
+ "AttackBoxFactory",
36
+ "AttackBoxHandle",
37
+ "AttackBoxProvider",
38
+ "AttackBoxReclaimFn",
39
+ "AttackBoxRecord",
40
+ "FootholdAttachment",
41
+ "ParsedAttackBox",
42
+ "attack_box_origin",
43
+ "attack_box_record_path",
44
+ "parse_attack_box",
45
+ "read_attack_box_record",
46
+ "resolve_attack_box",
47
+ "write_attack_box_record",
48
+ ]