ithrl 0.2.0__tar.gz → 0.4.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 (182) hide show
  1. {ithrl-0.2.0 → ithrl-0.4.0}/.gitignore +1 -0
  2. ithrl-0.4.0/CHANGELOG.md +82 -0
  3. {ithrl-0.2.0 → ithrl-0.4.0}/CONTRIBUTING.md +144 -49
  4. {ithrl-0.2.0 → ithrl-0.4.0}/PKG-INFO +48 -19
  5. {ithrl-0.2.0 → ithrl-0.4.0}/README.md +47 -18
  6. ithrl-0.4.0/ROADMAP.md +204 -0
  7. ithrl-0.4.0/docs/architecture.md +309 -0
  8. ithrl-0.4.0/docs/branding/branding.css +39 -0
  9. ithrl-0.4.0/docs/branding/ithrl-favicon.svg +16 -0
  10. ithrl-0.4.0/docs/branding/ithrl-icon.svg +12 -0
  11. ithrl-0.4.0/docs/branding/ithrl-logo-dark.svg +21 -0
  12. ithrl-0.4.0/docs/branding/ithrl-logo-light.svg +21 -0
  13. ithrl-0.4.0/docs/branding/ithrl-logo.png +0 -0
  14. ithrl-0.4.0/docs/branding/ithrl-social.png +0 -0
  15. {ithrl-0.2.0 → ithrl-0.4.0}/docs/cli.md +117 -0
  16. {ithrl-0.2.0 → ithrl-0.4.0}/docs/decisions/0003-strict-fresh-baselines.md +4 -3
  17. ithrl-0.4.0/docs/fuzzing.md +185 -0
  18. ithrl-0.4.0/docs/index.md +51 -0
  19. {ithrl-0.2.0 → ithrl-0.4.0}/docs/measurements.md +119 -26
  20. ithrl-0.4.0/docs/native-runs.md +140 -0
  21. ithrl-0.4.0/docs/reduction.md +259 -0
  22. {ithrl-0.2.0 → ithrl-0.4.0}/docs/research/context-fuzzing.md +36 -41
  23. {ithrl-0.2.0 → ithrl-0.4.0}/docs/research/feasibility.md +7 -7
  24. {ithrl-0.2.0 → ithrl-0.4.0}/docs/research/index.md +2 -0
  25. ithrl-0.4.0/docs/research/ordinary-session-investigation.md +105 -0
  26. ithrl-0.4.0/docs/research/passive-compaction-investigation.md +91 -0
  27. {ithrl-0.2.0 → ithrl-0.4.0}/docs/research/reduction-design.md +118 -1
  28. ithrl-0.4.0/docs/results.md +304 -0
  29. {ithrl-0.2.0 → ithrl-0.4.0}/docs/third-party-notices.txt +5 -0
  30. {ithrl-0.2.0 → ithrl-0.4.0}/docs/troubleshooting.md +69 -51
  31. {ithrl-0.2.0 → ithrl-0.4.0}/pyproject.toml +33 -7
  32. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/codex/context.py +16 -34
  33. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/codex/decisions.py +0 -2
  34. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/codex/parser.py +0 -2
  35. ithrl-0.4.0/src/ithrl/adapters/codex/reacquisition.py +332 -0
  36. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/contracts.py +39 -2
  37. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/copilot/context.py +31 -39
  38. ithrl-0.4.0/src/ithrl/adapters/copilot/reacquisition.py +293 -0
  39. ithrl-0.4.0/src/ithrl/adapters/reacquisition.py +56 -0
  40. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/registry.py +55 -2
  41. ithrl-0.4.0/src/ithrl/case/evidence.py +346 -0
  42. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/case/source_storage.py +10 -17
  43. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/__init__.py +44 -3
  44. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/fuzz_output.py +3 -10
  45. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/fuzz_run.py +5 -1
  46. ithrl-0.4.0/src/ithrl/cli/inspect.py +339 -0
  47. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/native.py +28 -9
  48. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/output.py +13 -7
  49. ithrl-0.4.0/src/ithrl/cli/paths.py +51 -0
  50. ithrl-0.4.0/src/ithrl/cli/preparation.py +265 -0
  51. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/sampled.py +12 -11
  52. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/sampled_output.py +58 -0
  53. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/sampled_reduction.py +132 -106
  54. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/sampled_session.py +22 -69
  55. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/shrink.py +2 -30
  56. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/context.py +34 -12
  57. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/execution/budget.py +136 -1
  58. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/execution/contracts.py +6 -2
  59. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/experiment.py +68 -0
  60. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/fuzz/contracts.py +10 -0
  61. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/fuzz/deterministic.py +2 -0
  62. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/fuzz/generation.py +2 -1
  63. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/fuzz/sampling.py +2 -1
  64. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/fuzz/simplify.py +3 -3
  65. ithrl-0.4.0/src/ithrl/inspection.py +778 -0
  66. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/mutation.py +30 -13
  67. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/observations.py +18 -15
  68. ithrl-0.4.0/src/ithrl/preparation.py +255 -0
  69. ithrl-0.4.0/src/ithrl/reacquisition.py +313 -0
  70. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/reduce/__init__.py +2 -0
  71. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/reduce/contracts.py +362 -29
  72. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/reduce/engine.py +243 -23
  73. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/reduce/search.py +63 -56
  74. ithrl-0.4.0/src/ithrl/results/inspection.py +382 -0
  75. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/results/models.py +6 -13
  76. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/results/storage.py +22 -36
  77. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/results/summary.py +3 -9
  78. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/results/validation.py +31 -1
  79. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/run_state.py +54 -8
  80. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/capability.py +7 -46
  81. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/configuration.py +23 -0
  82. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/isolation.py +9 -53
  83. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/materialize.py +122 -55
  84. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/policy.py +2 -2
  85. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/protocol.py +10 -4
  86. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/runner.py +4 -1
  87. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/runtime_configuration.py +26 -15
  88. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/schema.py +1 -13
  89. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/contracts.py +16 -6
  90. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/capability.py +7 -44
  91. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/isolation.py +14 -60
  92. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/materialize.py +64 -34
  93. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/policy.py +1 -1
  94. ithrl-0.4.0/src/ithrl/runner/runtime/probes.py +49 -0
  95. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/runtime/process.py +4 -13
  96. ithrl-0.4.0/src/ithrl/runner/runtime/programs.py +75 -0
  97. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/validation.py +14 -21
  98. ithrl-0.4.0/src/ithrl/sampled_run_metadata.py +87 -0
  99. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/sampling.py +38 -6
  100. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/statistics.py +0 -3
  101. ithrl-0.4.0/src/ithrl/text_sections.py +218 -0
  102. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/workflow.py +59 -4
  103. ithrl-0.2.0/CHANGELOG.md +0 -128
  104. ithrl-0.2.0/ROADMAP.md +0 -126
  105. ithrl-0.2.0/docs/architecture.md +0 -221
  106. ithrl-0.2.0/docs/index.md +0 -32
  107. ithrl-0.2.0/docs/native-runs.md +0 -427
  108. ithrl-0.2.0/docs/results.md +0 -166
  109. ithrl-0.2.0/src/ithrl/case/evidence.py +0 -210
  110. ithrl-0.2.0/src/ithrl/cli/paths.py +0 -24
  111. {ithrl-0.2.0 → ithrl-0.4.0}/LICENSE +0 -0
  112. {ithrl-0.2.0 → ithrl-0.4.0}/docs/decisions/0001-native-evidence-and-controlled-runners.md +0 -0
  113. {ithrl-0.2.0 → ithrl-0.4.0}/docs/decisions/0002-fixed-samples-and-durable-dispatch.md +0 -0
  114. {ithrl-0.2.0 → ithrl-0.4.0}/docs/decisions/0004-single-finding-fuzz-confirmation.md +0 -0
  115. {ithrl-0.2.0 → ithrl-0.4.0}/docs/decisions/index.md +0 -0
  116. {ithrl-0.2.0 → ithrl-0.4.0}/examples/fuzz/campaign.toml +0 -0
  117. {ithrl-0.2.0 → ithrl-0.4.0}/examples/fuzz/codex.jsonl +0 -0
  118. {ithrl-0.2.0 → ithrl-0.4.0}/examples/fuzz/copilot.jsonl +0 -0
  119. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/__init__.py +0 -0
  120. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/__main__.py +0 -0
  121. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/__init__.py +0 -0
  122. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/_jsonl.py +0 -0
  123. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/codex/__init__.py +0 -0
  124. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/codex/discovery.py +0 -0
  125. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/copilot/__init__.py +0 -0
  126. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/copilot/decisions.py +0 -0
  127. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/copilot/discovery.py +0 -0
  128. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/copilot/parser.py +0 -0
  129. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/discovery.py +0 -0
  130. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/adapters/errors.py +0 -0
  131. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/behavior.py +0 -0
  132. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/calibration.py +0 -0
  133. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/case/__init__.py +0 -0
  134. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/case/contracts.py +0 -0
  135. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/case/filesystem.py +0 -0
  136. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/case/source.py +0 -0
  137. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/case/source_context.py +0 -0
  138. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/case/storage.py +0 -0
  139. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/extract.py +0 -0
  140. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/fuzz.py +0 -0
  141. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/fuzz_session.py +0 -0
  142. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/cli/progress.py +0 -0
  143. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/decisions.py +0 -0
  144. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/examples/synthetic-trace.json +0 -0
  145. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/execution/__init__.py +0 -0
  146. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/execution/preflight.py +0 -0
  147. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/extraction.py +0 -0
  148. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/fuzz/__init__.py +0 -0
  149. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/fuzz/campaign.py +0 -0
  150. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/fuzz/configuration.py +0 -0
  151. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/fuzz/progress.py +0 -0
  152. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/fuzz/statistics.py +0 -0
  153. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/measurement.py +0 -0
  154. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/path_safety.py +0 -0
  155. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/results/__init__.py +0 -0
  156. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/__init__.py +0 -0
  157. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/__init__.py +0 -0
  158. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/protocol_contracts.py +0 -0
  159. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/relay.py +0 -0
  160. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/transcript.py +0 -0
  161. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/codex/worker.py +0 -0
  162. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/__init__.py +0 -0
  163. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/configuration.py +0 -0
  164. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/protocol/__init__.py +0 -0
  165. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/protocol/contracts.py +0 -0
  166. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/protocol/decoding.py +0 -0
  167. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/protocol/parser.py +0 -0
  168. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/protocol/state.py +0 -0
  169. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/runner.py +0 -0
  170. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/sdk_runtime.py +0 -0
  171. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/copilot/worker.py +0 -0
  172. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/evidence.py +0 -0
  173. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/fake.py +0 -0
  174. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/registry.py +0 -0
  175. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/runtime/__init__.py +0 -0
  176. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/runtime/certificates.py +0 -0
  177. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/runtime/contracts.py +0 -0
  178. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/runtime/output.py +0 -0
  179. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/runtime/protection.py +0 -0
  180. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/runner/runtime/state.py +0 -0
  181. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/synthetic.py +0 -0
  182. {ithrl-0.2.0 → ithrl-0.4.0}/src/ithrl/timestamps.py +0 -0
@@ -10,6 +10,7 @@ __pycache__/
10
10
  .coverage
11
11
  .coverage.*
12
12
  htmlcov/
13
+ /.benchmarks/
13
14
 
14
15
  # Build artifacts
15
16
  build/
@@ -0,0 +1,82 @@
1
+ # CHANGELOG
2
+
3
+ ## v0.4.0 (2026-11-14)
4
+
5
+ ### Features
6
+
7
+ - Inspect recorded operations across compaction ([#69](https://github.com/eberkut/ithrl/pull/69), [`3594d32`](https://github.com/eberkut/ithrl/commit/3594d3212b6dbc92276223f373908529e95a5e9e))
8
+ - Prepare native reduction experiments offline ([#66](https://github.com/eberkut/ithrl/pull/66), [`13c9626`](https://github.com/eberkut/ithrl/commit/13c96260335982a3a3ce52ea9c73b327f649efce))
9
+ - Qualify passive compaction inspection ([#70](https://github.com/eberkut/ithrl/pull/70), [`3b43a1b`](https://github.com/eberkut/ithrl/commit/3b43a1b8ef0c02bfd0182650460e4efed1c13076))
10
+
11
+ ### Performance Improvements
12
+
13
+ - Reduce workflow overhead and track performance ([#71](https://github.com/eberkut/ithrl/pull/71), [`ae0c8cd`](https://github.com/eberkut/ithrl/commit/ae0c8cd238eff742ec51076a1054007580c9c0db))
14
+
15
+ ## v0.3.0 (2026-11-10)
16
+
17
+ ### Features
18
+
19
+ - Add finer final-response reduction ([#52](https://github.com/eberkut/ithrl/pull/52), [`562124a`](https://github.com/eberkut/ithrl/commit/562124ab071788a52e0d50dd538048ee67de464b))
20
+ - Define source-bound text-section removal ([#51](https://github.com/eberkut/ithrl/pull/51), [`56c9e6c`](https://github.com/eberkut/ithrl/commit/56c9e6cfb24a83dc32573232b447e574cb0f616f))
21
+ - Inspect retained context without provider calls ([#49](https://github.com/eberkut/ithrl/pull/49), [`5604688`](https://github.com/eberkut/ithrl/commit/5604688e269543305fe4b7b253a703dc404c1139))
22
+ - **reduce**: Qualify paragraph removal on ordinary sessions ([#58](https://github.com/eberkut/ithrl/pull/58), [`5c6ae26`](https://github.com/eberkut/ithrl/commit/5c6ae26760ea7bd94b406ebf9ba3214e5c4ce64c))
23
+
24
+ ### Refactoring
25
+
26
+ - Simplify experiment workflows and test fixtures ([#50](https://github.com/eberkut/ithrl/pull/50), [`782bfa2`](https://github.com/eberkut/ithrl/commit/782bfa2692a49a5bb2a4f555801abda23cde6fda))
27
+
28
+ ## v0.2.0 (2026-11-02)
29
+
30
+ ### Bug Fixes
31
+
32
+ - **codex**: Bound and account for physical provider requests ([#33](https://github.com/eberkut/ithrl/pull/33), [`88529d6`](https://github.com/eberkut/ithrl/commit/88529d6f8b930dbcc546a0011f085c67d0bef1ac))
33
+ - **copilot**: Recover catalogue connections and qualify fuzzing ([#37](https://github.com/eberkut/ithrl/pull/37), [`ff6cf63`](https://github.com/eberkut/ithrl/commit/ff6cf6324325f7f6dad8f8c9c80ea58bfe4e249a))
34
+ - **copilot**: Restore native session prefixes through the CLI ([#34](https://github.com/eberkut/ithrl/pull/34), [`36845dd`](https://github.com/eberkut/ithrl/commit/36845ddb8239c0a488552297aaa70e6211979e59))
35
+ - **fuzz**: Preserve accounting and validate campaign recovery ([#25](https://github.com/eberkut/ithrl/pull/25), [`f1f4793`](https://github.com/eberkut/ithrl/commit/f1f479318fe914f3033667b65381f7101bd3aaea))
36
+ - **sampling**: Enforce calibration budgets and report durable progress ([#32](https://github.com/eberkut/ithrl/pull/32), [`bd40577`](https://github.com/eberkut/ithrl/commit/bd40577c734d70b36e59a9e6d3babafa1502bfd3))
37
+
38
+ ### Features
39
+
40
+ - **extract**: Support literal predicates for native decisions ([#31](https://github.com/eberkut/ithrl/pull/31), [`3b18c2b`](https://github.com/eberkut/ithrl/commit/3b18c2bdd814c4e4c3bf79825a8cab77eb433661))
41
+ - **fuzz**: Add mutation and sampled comparison services ([`56ee8b8`](https://github.com/eberkut/ithrl/commit/56ee8b8c5e1370b91db6c9c952eb8ceec19c95ae))
42
+ - **fuzz**: Expose inspectable campaigns and saved results ([#24](https://github.com/eberkut/ithrl/pull/24), [`e60e472`](https://github.com/eberkut/ithrl/commit/e60e47230b99e50ff42de7cd8fb89b3769e6d6e2))
43
+ - **fuzz**: Persist campaigns and recover interrupted execution ([#22](https://github.com/eberkut/ithrl/pull/22), [`806667f`](https://github.com/eberkut/ithrl/commit/806667f47e8bae1ccbf9b32fadc511ca559675d0))
44
+ - **fuzz**: Qualify native Codex text appends ([#28](https://github.com/eberkut/ithrl/pull/28), [`a5b880b`](https://github.com/eberkut/ithrl/commit/a5b880b60ef9834bb57b2c4950e18cd17ff0b275))
45
+
46
+ ### Performance Improvements
47
+
48
+ - Streamline local workflows and harden result publication ([#36](https://github.com/eberkut/ithrl/pull/36), [`43b9d81`](https://github.com/eberkut/ithrl/commit/43b9d81d0dcff85708da5c914986a68bbe8141db))
49
+
50
+ ## v0.1.0 (2026-10-23)
51
+
52
+ ### Bug Fixes
53
+
54
+ - **adapters**: Detect saved session formats structurally ([`c8256b9`](https://github.com/eberkut/ithrl/commit/c8256b93ce79fb9c3f025e2b92a970f336497218))
55
+ - **reduce**: Validate native candidates before sampled dispatch ([`90d4c0d`](https://github.com/eberkut/ithrl/commit/90d4c0d11a206389d44c6a59991df53c19802514))
56
+ - **runner**: Clarify Codex isolation prerequisites ([`4a409c1`](https://github.com/eberkut/ithrl/commit/4a409c1f37caf301a00cfbd20d3a95cf15844eb9))
57
+
58
+ ### Features
59
+
60
+ - Establish credential-free context reduction core ([`c517409`](https://github.com/eberkut/ithrl/commit/c517409c06e40c92b24a8b990685abd4acc9a9ba))
61
+ - **adapters**: Parse Codex and Copilot session evidence ([`3b81c26`](https://github.com/eberkut/ithrl/commit/3b81c2607397d884bcfb1b19dbf995f66ccb0107))
62
+ - **calibration**: Add bounded sampled runner calibration ([`f9db180`](https://github.com/eberkut/ithrl/commit/f9db18012565badc2cf2a3a4a6158487d4c5fb70))
63
+ - **case**: Preserve immutable native source evidence ([`d108b96`](https://github.com/eberkut/ithrl/commit/d108b96487ccb69f6b36642ae331d36272038722))
64
+ - **cli**: Add an installed example and focused public guides ([`1efc2ff`](https://github.com/eberkut/ithrl/commit/1efc2ffb03c734b666b1d1da9b5610ad62970267))
65
+ - **cli**: Add guarded native calibration ([`06d2bfb`](https://github.com/eberkut/ithrl/commit/06d2bfb3f4d34f4dc845d9d6877257e4e79f9120))
66
+ - **cli**: Integrate sampled reduction and exact resume ([`40be766`](https://github.com/eberkut/ithrl/commit/40be7664ba90ac5341d93fb5a725dbfa0efd48d3))
67
+ - **extract**: Support ordinary Codex and Copilot sessions ([`3cd0c10`](https://github.com/eberkut/ithrl/commit/3cd0c1092aeb3669b86fdae07e887d28ba9d685f))
68
+ - **reduce**: Add sampled contracts and durable progress ([`650252d`](https://github.com/eberkut/ithrl/commit/650252d76e8d7d72f3f5715ecaf488e752dc18b1))
69
+ - **reduce**: Integrate sampled candidate search ([`72958d8`](https://github.com/eberkut/ithrl/commit/72958d8d6ae0307ca2d090a2a10d02606bafdea6))
70
+ - **runner**: Add Codex final-response execution ([`ad30a9a`](https://github.com/eberkut/ithrl/commit/ad30a9a17b0e665056eca9b415cbf4e2770a7bf7))
71
+ - **runner**: Add controlled Copilot execution ([`c9d1bb2`](https://github.com/eberkut/ithrl/commit/c9d1bb23bfdd98bb022fd0b62ca9b8a81021fe4b))
72
+ - **runner**: Add isolated execution runtime ([`17d2224`](https://github.com/eberkut/ithrl/commit/17d22240414cdb32d4464f16e7b2621d99729ca0))
73
+ - **runner**: Add shared execution foundation ([`89536e9`](https://github.com/eberkut/ithrl/commit/89536e919730fc0abf680a2928a89761c78339f5))
74
+ - **runner**: Validate isolated native calibration ([`b0cd438`](https://github.com/eberkut/ithrl/commit/b0cd438d1fa280f0ddafa39d23653a7ac926da1b))
75
+ - **sampling**: Collect bounded fresh-baseline blocks ([`16abf30`](https://github.com/eberkut/ithrl/commit/16abf30b964eae299177d1e1dade6f545ffbda31))
76
+ - **sampling**: Support paced execution and safe overload replacement ([`5d70fbd`](https://github.com/eberkut/ithrl/commit/5d70fbd26901a0574883e07fd4055644c8515e80))
77
+ - **statistics**: Add fixed-sample candidate classification ([`fb26fca`](https://github.com/eberkut/ithrl/commit/fb26fcaf7c064f49ac7d63b4e2ceb1ab3d6dcdb5))
78
+ - **workflow**: Confirm sampled reductions with fresh evidence ([`ee291e4`](https://github.com/eberkut/ithrl/commit/ee291e4d906394452da61640989cef594f62caf7))
79
+
80
+ ### Refactoring
81
+
82
+ - Simplify execution paths and avoid redundant context copies ([`34ab361`](https://github.com/eberkut/ithrl/commit/34ab36165fed08678a80679b3f1753e6f26f63f8))
@@ -26,8 +26,9 @@ For task-specific instructions, see [documentation](#documentation),
26
26
 
27
27
  ## Development setup
28
28
 
29
- Use [uv](https://docs.astral.sh/uv/) and Python 3.12, 3.13 or 3.14. Python 3.14 is the primary
30
- development version. From the repository root:
29
+ Use [uv](https://docs.astral.sh/uv/) at the version required by `tool.uv.required-version` in
30
+ `pyproject.toml`, and Python 3.12, 3.13 or 3.14. CI reads the same uv pin through `setup-uv`'s
31
+ `version-file` input. Python 3.14 is the primary development version. From the repository root:
31
32
 
32
33
  ```bash
33
34
  uv sync --locked --all-groups --all-extras
@@ -71,16 +72,73 @@ Install the local hooks with `uv run pre-commit install`; run them on the whole
71
72
  `uv run pre-commit run --all-files`. Ruff and rumdl format files in place. CI checks formatting
72
73
  without modifying files.
73
74
 
74
- Recognized Markdown-only PRs skip Python linting, typing, unit-test matrices and dependency audits.
75
- They retain Markdown formatting/linting, documentation tests, the strict site build, workflow and
76
- dependency review, and all package build/install checks. Mixed changes, unknown paths, configuration
77
- changes and PRs with 3,000 or more changed files run full validation. Rename detection considers
78
- both paths; deletions participate. Failed path detection fails the required Workflows check.
79
- Main-branch, scheduled, manual and release runs always perform full validation.
75
+ Markdown-only PRs skip Python linting, typing, unit tests and dependency audits. They still run
76
+ Markdown, documentation, strict site, workflow, dependency-review and package checks. Mixed changes,
77
+ unknown paths, configuration changes or 3,000 or more changed files require full validation;
78
+ classification includes deleted files and both sides of renames. Failed detection fails Workflows.
79
+ Main, scheduled, manual and release runs always validate fully. The required `Python tests` summary
80
+ accepts a skipped matrix only after successful Markdown-only classification; missing decisions,
81
+ failures and unexpected skips fail it.
82
+
83
+ The logo sources, usage rules and regeneration commands are in [branding](docs/branding/README.md).
84
+
85
+ ## Performance and maintainability
86
+
87
+ Measure the affected workflow before optimizing it. Keep sanitized input generation and setup
88
+ outside timings; record the revision, locked environment, input size, repeats and noise. Measure
89
+ allocations separately from elapsed time. Include index/cache construction and retained memory,
90
+ then repeat the same workload after the change. Provider latency and local implementation overhead
91
+ are separate measurements.
92
+
93
+ - Choose collections for their operations: a set for repeated membership, a dictionary for keyed
94
+ lookup, and a sequence for authoritative order. For example, fuzz proposal membership can use a
95
+ local set while seeded traversal retains the original sequence. Measure scaling near admitted
96
+ limits as well as small inputs; Radon scores alone do not justify a refactor.
97
+ - Keep reusable derived facts with the owner of their immutable inputs. Define copy/invalidation
98
+ behavior and memory bounds before adding a cache. A frozen model can still copy stale derived
99
+ state. Do not expose mutable internal indexes or borrow mutable native records across owners.
100
+ - Bound both output and examined work. Count rejected and duplicate proposals where the work cap
101
+ requires it. Avoid repeated whole-input scans when the required operation is a keyed lookup.
102
+ Release large temporary buffers before processing the next item.
103
+ - Batch fresh persistence reads where their consistency contract permits it. Preserve schema,
104
+ identity, chronology and corruption checks, locks, durable dispatch and accounting. Persisted
105
+ files and external state need fresh validation; an in-memory cache is not their authority. Reuse
106
+ validated facts within one synchronous operation; refresh after callbacks, waits or execution.
107
+ - Test configurable limits with small inputs at the exact boundary and one beyond; assert policy
108
+ defaults separately when needed. Use sparse files for size-only filesystem checks. Share completed
109
+ immutable fixture data, not mutable cases or stores. Retain real process, SQLite and distribution
110
+ checks when they establish lifecycle, recovery or artifact behavior.
111
+ - Share an existing mechanism only when its ownership, errors and side effects fit. Require a
112
+ concrete maintenance benefit from abstractions; keep different harness and statistical rules
113
+ explicit. Compare behavior, failure paths and recovery as well as performance.
114
+
115
+ ### Benchmarks
116
+
117
+ The permanent [pytest-benchmark](https://pytest-benchmark.readthedocs.io/en/latest/) workloads
118
+ live in `tests/benchmarks/`. They use sanitized inputs and no native harness or provider.
119
+ Ordinary test runs skip them. From the repository root, save a baseline before changing code:
80
120
 
81
- The required `Python tests` check summarizes the test matrix. It accepts a skipped matrix only
82
- after successful Markdown-only classification. Failed classification, missing decisions, test
83
- failures and unexpected skips fail this check.
121
+ ```bash
122
+ uv run pytest tests/benchmarks --benchmark-only --no-cov --benchmark-save=before
123
+ ```
124
+
125
+ After the change, compare against that saved run:
126
+
127
+ ```bash
128
+ uv run pytest tests/benchmarks --benchmark-only --no-cov --benchmark-compare=0001 --benchmark-save=after
129
+ ```
130
+
131
+ Replace `0001` with the baseline ID printed by the first command. The plugin keeps saved runs
132
+ under the ignored `.benchmarks/` directory. Compare identical workloads on the same interpreter
133
+ and machine with low competing load. Check the distributions and memory tradeoffs; do not infer
134
+ a regression from a small noisy difference. Keep setup outside the measured call and assert
135
+ outcomes. Stateful workloads need equivalent starting state for every round.
136
+
137
+ CI runs the benchmarks on Python 3.14 in the existing Quality job. Non-PR runs retain the generated
138
+ JSON as `benchmarks-python-3.14` artifacts for 90 days. Download comparable runs and inspect them
139
+ with `uv run pytest-benchmark compare FIRST.json SECOND.json`. There is no elapsed-time failure
140
+ threshold; benchmark assertions still fail on incorrect behavior. Saved JSON contains machine and
141
+ commit metadata; raw profiles and private-workflow inputs do not belong in these artifacts.
84
142
 
85
143
  ## Workflow and dependency checks
86
144
 
@@ -103,14 +161,11 @@ uv export --locked --all-groups --all-extras --no-emit-project --format requirem
103
161
  uv run --locked --group audit pip-audit --strict --disable-pip --require-hashes -r /dev/stdin
104
162
  ```
105
163
 
106
- The hashed export is temporary pipeline input. The audit queries PyPI's vulnerability service for
107
- package names and versions without installing those packages, resolving alternatives or applying
108
- fixes. CI evaluates markers on each supported Python version. This covers locked versions rather
109
- than every version permitted by package dependency ranges.
110
-
111
- For dependency changes, run the lockfile audit above on each supported Python version. GitHub's
112
- dependency graph may omit packages from `uv.lock`, so Dependabot and Dependency Review cannot
113
- replace that audit.
164
+ The audit sends locked package names and versions to PyPI's vulnerability service. It installs
165
+ nothing, resolves no alternatives and applies no fixes. It covers locked versions, not entire
166
+ dependency ranges. For dependency changes, run it on each supported Python version to evaluate
167
+ markers. Dependabot and Dependency Review cannot replace it: GitHub's dependency graph may omit
168
+ lockfile packages.
114
169
 
115
170
  The PR dependency-review job rejects newly introduced known vulnerabilities at any severity across
116
171
  runtime, development and unknown scopes. It uses a read-only token and does not check out or execute
@@ -128,13 +183,49 @@ Use `uv run rumdl fmt .` to format Markdown, then `uv run rumdl check .` to lint
128
183
  version and `pyproject.toml` configuration apply to pre-commit and CI. Prose wraps at 100
129
184
  characters; commands and tables retain their layout. MkDocs syntax is recognized within `docs/`. The
130
185
  generated CLI reference has narrow exceptions for Typer's prompts, option alignment and wrapping;
131
- its byte-for-byte generation check remains enforced. The generated changelog is checked under the
132
- shared rules.
186
+ its byte-for-byte generation check remains enforced. The generated changelog keeps each entry on
187
+ one source line, with a line-length exception.
133
188
 
134
189
  Keep installation and first-use instructions in README, and detailed user guides and reference in
135
190
  `docs/`. Support, security and conduct policies live at the repository root. Keep private sessions,
136
191
  cases and credentials out of documentation and generated output.
137
192
 
193
+ ### Writing and review
194
+
195
+ Start with the reader's task. Use [Diátaxis](https://diataxis.fr/start-here/) to distinguish a
196
+ guided learning example, a task-specific how-to, reference facts and explanation. A README can
197
+ combine orientation and first use; do not split pages just to fill those categories.
198
+
199
+ - Put prerequisites before commands, conditions before dependent actions and the expected result
200
+ after a step that needs verification. Use numbered steps for a sequence and tables for
201
+ comparisons.
202
+ - State what the reader can do or conclude. Prefer concrete verbs and established terms; remove
203
+ filler, promotional claims, rhetorical contrasts and sentences that repeat their heading.
204
+ For example, replace “It is important to note that execution requires explicit acknowledgement”
205
+ with “After reviewing the plan, pass `--acknowledge-model-execution` to allow provider calls.”
206
+ - Give each topic one owner. Keep options in the generated CLI reference, procedures in user guides,
207
+ measurements in `docs/measurements.md`, rationale in decisions and methods in research. Link to
208
+ detail instead of repeating it. Keep essential safety conditions beside the affected action.
209
+ - Shorten without widening claims. Preserve tested profiles, statistical conditions, costs,
210
+ uncertainty, failed outcomes and historical context. “The screen passed” does not mean
211
+ “preservation is confirmed.” Check commands against the current CLI and qualify future work.
212
+ - Follow [W3C's writing guidance](https://www.w3.org/WAI/tips/writing/): use descriptive link text,
213
+ ordered headings and useful image alternatives. Do not rely on color alone. Keep code blocks
214
+ executable or identify placeholders before the command.
215
+
216
+ Before review, check: can the intended reader find the task, run its steps and interpret the
217
+ result? Does each paragraph add information? Are terms, claims, links and generated content current?
218
+ Check the [documentation commands](#building-and-checking-documentation) below after edits.
219
+
220
+ For additional guidance, consult the
221
+ [Google developer documentation style guide](https://developers.google.com/style) and
222
+ [Microsoft Writing Style Guide](https://learn.microsoft.com/en-us/style-guide/welcome/).
223
+ Follow this project's conventions where they differ.
224
+ Use judgment rather than word-count targets; explanations and research need enough detail to support
225
+ their conclusions.
226
+
227
+ ### Documentation ownership
228
+
138
229
  [ROADMAP.md](ROADMAP.md) describes future direction. GitHub issues own actionable scope,
139
230
  dependencies, acceptance criteria and status; release milestones group scope and the public
140
231
  [Project](https://github.com/users/eberkut/projects/1/views/4) provides views of those same issues.
@@ -151,12 +242,12 @@ Before evaluating a new study, declare its tested domain, criteria, seeds, budge
151
242
  claims. Report costs across complete workflows, including failed and incomplete work, and document
152
243
  the alternatives and limitations needed to interpret the results.
153
244
 
154
- The optional `docs` dependency group pins MkDocs and the shadcn theme. Search runs in the browser;
155
- fonts and scripts are served with the site. GitHub star-count requests and raw Markdown copying
156
- are disabled. A local hook admits only the packaged theme assets used by this configuration.
157
- When changing the theme or enabled extensions, check that asset list and the
158
- [third-party notices](docs/third-party-notices.txt) alongside the rendered site.
159
- To preview the site locally:
245
+ ### Building and checking documentation
246
+
247
+ The `docs` group pins MkDocs and the shadcn theme. Search runs in the browser; the site bundles
248
+ fonts and scripts. GitHub star-count requests and raw Markdown copying are disabled. When changing
249
+ the theme or extensions, review the asset allowlist in `scripts/docs_theme.py`, the
250
+ [third-party notices](docs/third-party-notices.txt) and the rendered site. To preview:
160
251
 
161
252
  ```bash
162
253
  uv sync --locked --all-groups --all-extras
@@ -292,16 +383,18 @@ CodeRabbit's optional planning and code-generation features are configured in
292
383
 
293
384
  ## Preparing a release
294
385
 
295
- The release procedures below are for maintainers with repository and package-publishing access.
296
-
297
- For every feature, aim for parity across supported harnesses. Any exception must be clearly
298
- justified and documented before release.
386
+ Maintainers need repository and package-publishing access. Before release, justify and document
387
+ any feature-parity exception between supported harnesses.
299
388
 
300
389
  Python Semantic Release, pinned in the `release` dependency group, calculates versions from
301
390
  Conventional Commits. `pyproject.toml` is the version source; installed CLI and Codex client
302
391
  metadata read that distribution version. The tool generates `CHANGELOG.md` from the full release
303
- history, omitting routine build, CI, documentation, style and test commits. Do not edit the
304
- generated changelog by hand; review its contents before approving a release.
392
+ history, omitting routine build, CI, documentation, style and test commits. Its
393
+ [template](.github/changelog/CHANGELOG.md.j2) keeps lists compact, with one entry per source line.
394
+ Change the template to adjust formatting; do not edit generated entries by hand.
395
+
396
+ Review and merge generated version/notes changes through a PR. CI tests the prepared version;
397
+ publication builds that committed version.
305
398
 
306
399
  Use `main` with complete history and all existing release tags available. Preview the next version
307
400
  without changing files, the index, commits, tags or remote state:
@@ -339,9 +432,9 @@ ownership and the following repository/index settings:
339
432
 
340
433
  - PyPI and TestPyPI Trusted Publishers bind `eberkut/ithrl`, `release.yml` and their respective
341
434
  `pypi` / `testpypi` environments. Publishing uses OIDC, without a stored PyPI API token.
342
- - Both environments admit only `main`. `pypi` requires the maintainer's approval, permits
343
- self-review and disallows administrative approval bypass. Environment declarations in YAML
344
- do not configure these protections; verify the actual settings before dispatch.
435
+ - Both environments admit only `main`, require the maintainer's approval, permit self-review and
436
+ disallow administrative approval bypass. Environment declarations in YAML do not configure these
437
+ protections; verify the actual settings before dispatch.
345
438
  - Release-tag rules permit the maintainer's signed-tag creation and prevent unapproved tag
346
439
  replacement or deletion. The workflow never creates a tag.
347
440
 
@@ -353,10 +446,12 @@ gh workflow run release.yml --repo eberkut/ithrl --ref main \
353
446
  -f version=X.Y.Z -f source-sha=FULL_APPROVED_COMMIT_SHA
354
447
  ```
355
448
 
356
- 1. Inspect that run's checks and successful **Publish TestPyPI rehearsal** job. Its summary records
449
+ 1. After source verification and validation pass, approve the `testpypi` deployment on the run's
450
+ GitHub page. This authorizes the public TestPyPI upload.
451
+ 2. Inspect the successful **Publish TestPyPI rehearsal** job. Its summary records
357
452
  the source, version, immutable artifact ID and checksum-manifest digest. The production job
358
453
  waits at the `pypi` environment. TestPyPI files, logs and artifacts are public.
359
- 2. Download that run's `release-distributions` artifact into a new review directory. For example:
454
+ 3. Download that run's `release-distributions` artifact into a new review directory. For example:
360
455
 
361
456
  ```bash
362
457
  gh run download RUN_ID --repo eberkut/ithrl \
@@ -367,7 +462,7 @@ gh workflow run release.yml --repo eberkut/ithrl --ref main \
367
462
  from the review directory. Inspect the release notes and confirm TestPyPI serves the same
368
463
  distribution hashes. Complete a clean TestPyPI installation/example rehearsal before approval;
369
464
  resolve dependencies only from the normal PyPI index, without mixing indexes.
370
- 3. After the rehearsal passes and tag creation is approved, create and verify the signed tag at
465
+ 4. After the rehearsal passes and tag creation is approved, create and verify the signed tag at
371
466
  the frozen source commit, then push only that tag through the permitted tag-rules path:
372
467
 
373
468
  ```bash
@@ -376,19 +471,19 @@ gh workflow run release.yml --repo eberkut/ithrl --ref main \
376
471
  git push origin refs/tags/vX.Y.Z
377
472
  ```
378
473
 
379
- 4. Review and approve the `pypi` deployment on the run's GitHub page. The job verifies the existing
474
+ 5. Review and approve the `pypi` deployment on the run's GitHub page. The job verifies the existing
380
475
  annotated tag targets the frozen source, rechecks the files, and uploads to PyPI. The final job
381
476
  rechecks the tag/files and creates the GitHub Release with those distributions, notes and
382
477
  checksums. Signature verification belongs to the preceding maintainer tag check; the workflow
383
478
  checks the tag object and target commit.
384
- 5. Verify the published versions, hashes, attestations and installed example. A successful upload
479
+ 6. Verify the published versions, hashes, attestations and installed example. A successful upload
385
480
  alone does not complete release acceptance.
386
481
 
387
- Complete review within 30 days: release artifacts are retained for 30 days, and GitHub limits the
388
- total workflow lifetime, including approval waits. Start only one release at a time; concurrency
389
- preserves the active run but GitHub may replace an older pending run when another is queued.
390
- Do not rerun the whole workflow to promote a completed rehearsal or cancel a run during upload.
391
- For failure or partial publication, inspect the index and existing release first; preserve the
392
- original files and hashes. Any recovery upload needs explicit approval and must use identical
393
- missing files. Never rebuild and overwrite a published version or suppress conflicts with
394
- `skip-existing`.
482
+ Complete review within the 30-day artifact retention and GitHub workflow lifetime, including
483
+ approval waits. Start one release at a time: a new queued run may replace an older pending run,
484
+ though the active run is preserved. Do not rerun the workflow to promote a completed rehearsal or
485
+ cancel during upload.
486
+
487
+ After failure or partial publication, inspect the index and release before recovery. Preserve
488
+ the original files and hashes; uploading identical missing files requires explicit approval.
489
+ Never overwrite a published version with rebuilt files or suppress conflicts with `skip-existing`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ithrl
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: Find smaller agent contexts that preserve a selected model behavior
5
5
  Project-URL: Source, https://github.com/eberkut/ithrl
6
6
  Project-URL: Issues, https://github.com/eberkut/ithrl/issues
@@ -31,7 +31,15 @@ Provides-Extra: fuzz
31
31
  Requires-Dist: scipy>=1.18; extra == 'fuzz'
32
32
  Description-Content-Type: text/markdown
33
33
 
34
- # ithrl
34
+ <!-- rumdl-disable MD033 -->
35
+ <h1>
36
+ <picture>
37
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/eberkut/ithrl/main/docs/branding/ithrl-logo-dark.svg">
38
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/eberkut/ithrl/main/docs/branding/ithrl-logo-light.svg">
39
+ <img src="https://raw.githubusercontent.com/eberkut/ithrl/main/docs/branding/ithrl-logo.png" alt="ithrl" width="320" height="158">
40
+ </picture>
41
+ </h1>
42
+ <!-- rumdl-enable MD033 -->
35
43
 
36
44
  [![PyPI](https://img.shields.io/pypi/v/ithrl.svg)](https://pypi.org/project/ithrl/)
37
45
  [![CI](https://github.com/eberkut/ithrl/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/eberkut/ithrl/actions/workflows/ci.yml)
@@ -87,7 +95,18 @@ Use a new directory to repeat the example; extraction refuses to overwrite an ex
87
95
  ## Commands
88
96
 
89
97
  - `ithrl extract` browses saved sessions and creates a case from a selected decision.
98
+ - `ithrl prepare CASE` generates a private reduction configuration from a preflight receipt and
99
+ statistical settings. Follow the
100
+ [preparation procedure](https://github.com/eberkut/ithrl/blob/main/docs/reduction.md).
90
101
  - `ithrl shrink CASE` searches for context removals that preserve the selected behavior.
102
+ - `ithrl inspect sections CASE` lists editable text fields and paragraph boundaries without
103
+ displaying text or requiring a reduction result.
104
+ - `ithrl inspect reacquire SESSION` compares recorded operations and captured results across
105
+ compaction. See
106
+ [passive inspection](https://github.com/eberkut/ithrl/blob/main/docs/results.md#inspect-recorded-compaction).
107
+ - `ithrl inspect retained CASE --result RESULT` explains retained units and recorded removal trials
108
+ from a saved reduction without model access. See
109
+ [results and privacy](https://github.com/eberkut/ithrl/blob/main/docs/results.md#inspect-retained-context).
91
110
  - `ithrl fuzz CASE --config PRIVATE_TOML` searches for and simplifies text appends that decrease how
92
111
  often the selected behavior occurs, with independent confirmation.
93
112
 
@@ -104,30 +123,40 @@ Returned actions are observed and denied. Cases contain copied session content;
104
123
 
105
124
  ## Supported inputs
106
125
 
107
- | Input | Extracted decisions | Reduction | Fuzzing |
108
- | --- | --- | --- | --- |
109
- | Bundled synthetic example | Synthetic tool request | Deterministic local runner | Local fake runner |
110
- | Codex CLI rollouts | Final responses | Experimental native runner | Experimental prior-user text appends |
111
- | Copilot CLI session events | Final responses and shell requests | Experimental final-response and denied `bash` runner | Experimental prior-user text appends for final-response targets |
112
-
113
- Native Codex and Copilot final-response fuzzing supports appending text to eligible prior user
114
- input while preserving the fixed triggering input. The
115
- [fuzzing walkthrough](https://github.com/eberkut/ithrl/blob/main/docs/native-runs.md#context-fuzzing)
116
- starts with a local example and covers native execution.
117
-
118
- [Saved-session measurements](https://github.com/eberkut/ithrl/blob/main/docs/measurements.md#saved-session-experiments)
119
- include a confirmed reduction for one Codex session and its chosen predicate: 50.17% lower mean
120
- input tokens per confirmation observation, using a 20-percentage-point preservation margin.
121
- The measurements report resource usage and unsuccessful outcomes alongside completed runs. Check
126
+ | Input | Extracted decisions | Reduction | Fuzzing | Passive inspection |
127
+ | --- | --- | --- | --- | --- |
128
+ | Bundled synthetic example | Synthetic tool request | Deterministic local runner | Local fake runner | — |
129
+ | Codex CLI rollouts | Final responses | Experimental native runner; [paragraph-removal measurements](https://github.com/eberkut/ithrl/blob/main/docs/measurements.md#ordinary-session-paragraph-removal) | Experimental prior-user text appends | Exact recorded-operation and captured-result comparisons across compaction |
130
+ | Copilot CLI session events | Final responses and shell requests | Experimental final-response paragraph removal and denied `bash` runner | Experimental prior-user text appends for final-response targets | Exact recorded-operation and captured-result comparisons across compaction |
131
+
132
+ Passive inspection reads saved evidence without a harness or model access. The
133
+ [worked investigation](https://github.com/eberkut/ithrl/blob/main/docs/research/passive-compaction-investigation.md)
134
+ records the qualified native profiles, ordinary examples and interpretation limits.
135
+
136
+ Native fuzzing appends text to eligible prior user input while preserving the fixed triggering
137
+ input. The
138
+ [fuzzing walkthrough](https://github.com/eberkut/ithrl/blob/main/docs/fuzzing.md)
139
+ covers a local example and native execution.
140
+
141
+ Ordinary Codex and Copilot paragraph-removal experiments passed fresh confirmation at a
142
+ 20-percentage-point preservation margin. See the
143
+ [measurements](https://github.com/eberkut/ithrl/blob/main/docs/measurements.md#saved-session-experiments)
144
+ for completed and unsuccessful outcomes, costs and qualification limits, and the
145
+ [worked investigation](https://github.com/eberkut/ithrl/blob/main/docs/research/ordinary-session-investigation.md)
146
+ for a developer's interpretation. Check
122
147
  [native compatibility](https://github.com/eberkut/ithrl/blob/main/docs/native-runs.md#compatibility-and-measurements)
123
- for the installed harness's requirements.
148
+ before using an installed harness.
124
149
 
125
150
  ## Documentation
126
151
 
127
152
  Read the [documentation site](https://eberkut.github.io/ithrl/) or browse the guides below.
128
153
 
129
154
  - [Native runs](https://github.com/eberkut/ithrl/blob/main/docs/native-runs.md): session selection,
130
- experiment configuration, preflight, model execution and measured resource usage.
155
+ shared prerequisites and compatibility.
156
+ - [Native reduction](https://github.com/eberkut/ithrl/blob/main/docs/reduction.md): prepare,
157
+ inspect and execute a context-removal experiment.
158
+ - [Context fuzzing](https://github.com/eberkut/ithrl/blob/main/docs/fuzzing.md): try the local
159
+ example and run a native text-append campaign.
131
160
  - [Results and privacy](https://github.com/eberkut/ithrl/blob/main/docs/results.md): saved files,
132
161
  result interpretation, budgets, resume and sensitive data.
133
162
  - [Contributing](https://github.com/eberkut/ithrl/blob/main/CONTRIBUTING.md): issue-first
@@ -1,4 +1,12 @@
1
- # ithrl
1
+ <!-- rumdl-disable MD033 -->
2
+ <h1>
3
+ <picture>
4
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/eberkut/ithrl/main/docs/branding/ithrl-logo-dark.svg">
5
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/eberkut/ithrl/main/docs/branding/ithrl-logo-light.svg">
6
+ <img src="https://raw.githubusercontent.com/eberkut/ithrl/main/docs/branding/ithrl-logo.png" alt="ithrl" width="320" height="158">
7
+ </picture>
8
+ </h1>
9
+ <!-- rumdl-enable MD033 -->
2
10
 
3
11
  [![PyPI](https://img.shields.io/pypi/v/ithrl.svg)](https://pypi.org/project/ithrl/)
4
12
  [![CI](https://github.com/eberkut/ithrl/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/eberkut/ithrl/actions/workflows/ci.yml)
@@ -54,7 +62,18 @@ Use a new directory to repeat the example; extraction refuses to overwrite an ex
54
62
  ## Commands
55
63
 
56
64
  - `ithrl extract` browses saved sessions and creates a case from a selected decision.
65
+ - `ithrl prepare CASE` generates a private reduction configuration from a preflight receipt and
66
+ statistical settings. Follow the
67
+ [preparation procedure](https://github.com/eberkut/ithrl/blob/main/docs/reduction.md).
57
68
  - `ithrl shrink CASE` searches for context removals that preserve the selected behavior.
69
+ - `ithrl inspect sections CASE` lists editable text fields and paragraph boundaries without
70
+ displaying text or requiring a reduction result.
71
+ - `ithrl inspect reacquire SESSION` compares recorded operations and captured results across
72
+ compaction. See
73
+ [passive inspection](https://github.com/eberkut/ithrl/blob/main/docs/results.md#inspect-recorded-compaction).
74
+ - `ithrl inspect retained CASE --result RESULT` explains retained units and recorded removal trials
75
+ from a saved reduction without model access. See
76
+ [results and privacy](https://github.com/eberkut/ithrl/blob/main/docs/results.md#inspect-retained-context).
58
77
  - `ithrl fuzz CASE --config PRIVATE_TOML` searches for and simplifies text appends that decrease how
59
78
  often the selected behavior occurs, with independent confirmation.
60
79
 
@@ -71,30 +90,40 @@ Returned actions are observed and denied. Cases contain copied session content;
71
90
 
72
91
  ## Supported inputs
73
92
 
74
- | Input | Extracted decisions | Reduction | Fuzzing |
75
- | --- | --- | --- | --- |
76
- | Bundled synthetic example | Synthetic tool request | Deterministic local runner | Local fake runner |
77
- | Codex CLI rollouts | Final responses | Experimental native runner | Experimental prior-user text appends |
78
- | Copilot CLI session events | Final responses and shell requests | Experimental final-response and denied `bash` runner | Experimental prior-user text appends for final-response targets |
79
-
80
- Native Codex and Copilot final-response fuzzing supports appending text to eligible prior user
81
- input while preserving the fixed triggering input. The
82
- [fuzzing walkthrough](https://github.com/eberkut/ithrl/blob/main/docs/native-runs.md#context-fuzzing)
83
- starts with a local example and covers native execution.
84
-
85
- [Saved-session measurements](https://github.com/eberkut/ithrl/blob/main/docs/measurements.md#saved-session-experiments)
86
- include a confirmed reduction for one Codex session and its chosen predicate: 50.17% lower mean
87
- input tokens per confirmation observation, using a 20-percentage-point preservation margin.
88
- The measurements report resource usage and unsuccessful outcomes alongside completed runs. Check
93
+ | Input | Extracted decisions | Reduction | Fuzzing | Passive inspection |
94
+ | --- | --- | --- | --- | --- |
95
+ | Bundled synthetic example | Synthetic tool request | Deterministic local runner | Local fake runner | — |
96
+ | Codex CLI rollouts | Final responses | Experimental native runner; [paragraph-removal measurements](https://github.com/eberkut/ithrl/blob/main/docs/measurements.md#ordinary-session-paragraph-removal) | Experimental prior-user text appends | Exact recorded-operation and captured-result comparisons across compaction |
97
+ | Copilot CLI session events | Final responses and shell requests | Experimental final-response paragraph removal and denied `bash` runner | Experimental prior-user text appends for final-response targets | Exact recorded-operation and captured-result comparisons across compaction |
98
+
99
+ Passive inspection reads saved evidence without a harness or model access. The
100
+ [worked investigation](https://github.com/eberkut/ithrl/blob/main/docs/research/passive-compaction-investigation.md)
101
+ records the qualified native profiles, ordinary examples and interpretation limits.
102
+
103
+ Native fuzzing appends text to eligible prior user input while preserving the fixed triggering
104
+ input. The
105
+ [fuzzing walkthrough](https://github.com/eberkut/ithrl/blob/main/docs/fuzzing.md)
106
+ covers a local example and native execution.
107
+
108
+ Ordinary Codex and Copilot paragraph-removal experiments passed fresh confirmation at a
109
+ 20-percentage-point preservation margin. See the
110
+ [measurements](https://github.com/eberkut/ithrl/blob/main/docs/measurements.md#saved-session-experiments)
111
+ for completed and unsuccessful outcomes, costs and qualification limits, and the
112
+ [worked investigation](https://github.com/eberkut/ithrl/blob/main/docs/research/ordinary-session-investigation.md)
113
+ for a developer's interpretation. Check
89
114
  [native compatibility](https://github.com/eberkut/ithrl/blob/main/docs/native-runs.md#compatibility-and-measurements)
90
- for the installed harness's requirements.
115
+ before using an installed harness.
91
116
 
92
117
  ## Documentation
93
118
 
94
119
  Read the [documentation site](https://eberkut.github.io/ithrl/) or browse the guides below.
95
120
 
96
121
  - [Native runs](https://github.com/eberkut/ithrl/blob/main/docs/native-runs.md): session selection,
97
- experiment configuration, preflight, model execution and measured resource usage.
122
+ shared prerequisites and compatibility.
123
+ - [Native reduction](https://github.com/eberkut/ithrl/blob/main/docs/reduction.md): prepare,
124
+ inspect and execute a context-removal experiment.
125
+ - [Context fuzzing](https://github.com/eberkut/ithrl/blob/main/docs/fuzzing.md): try the local
126
+ example and run a native text-append campaign.
98
127
  - [Results and privacy](https://github.com/eberkut/ithrl/blob/main/docs/results.md): saved files,
99
128
  result interpretation, budgets, resume and sensitive data.
100
129
  - [Contributing](https://github.com/eberkut/ithrl/blob/main/CONTRIBUTING.md): issue-first