ithrl 0.2.0__tar.gz → 0.3.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 (166) hide show
  1. ithrl-0.3.0/CHANGELOG.md +70 -0
  2. {ithrl-0.2.0 → ithrl-0.3.0}/CONTRIBUTING.md +32 -14
  3. {ithrl-0.2.0 → ithrl-0.3.0}/PKG-INFO +21 -7
  4. {ithrl-0.2.0 → ithrl-0.3.0}/README.md +20 -6
  5. {ithrl-0.2.0 → ithrl-0.3.0}/ROADMAP.md +26 -10
  6. {ithrl-0.2.0 → ithrl-0.3.0}/docs/architecture.md +93 -8
  7. ithrl-0.3.0/docs/branding/branding.css +39 -0
  8. ithrl-0.3.0/docs/branding/ithrl-favicon.svg +16 -0
  9. ithrl-0.3.0/docs/branding/ithrl-icon.svg +12 -0
  10. ithrl-0.3.0/docs/branding/ithrl-logo-dark.svg +21 -0
  11. ithrl-0.3.0/docs/branding/ithrl-logo-light.svg +21 -0
  12. ithrl-0.3.0/docs/branding/ithrl-logo.png +0 -0
  13. ithrl-0.3.0/docs/branding/ithrl-social.png +0 -0
  14. {ithrl-0.2.0 → ithrl-0.3.0}/docs/cli.md +42 -0
  15. {ithrl-0.2.0 → ithrl-0.3.0}/docs/index.md +23 -8
  16. {ithrl-0.2.0 → ithrl-0.3.0}/docs/measurements.md +107 -7
  17. {ithrl-0.2.0 → ithrl-0.3.0}/docs/native-runs.md +89 -1
  18. {ithrl-0.2.0 → ithrl-0.3.0}/docs/research/index.md +1 -0
  19. ithrl-0.3.0/docs/research/ordinary-session-investigation.md +112 -0
  20. {ithrl-0.2.0 → ithrl-0.3.0}/docs/research/reduction-design.md +120 -0
  21. {ithrl-0.2.0 → ithrl-0.3.0}/docs/results.md +86 -1
  22. {ithrl-0.2.0 → ithrl-0.3.0}/docs/third-party-notices.txt +5 -0
  23. {ithrl-0.2.0 → ithrl-0.3.0}/pyproject.toml +24 -6
  24. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/codex/context.py +16 -34
  25. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/contracts.py +39 -2
  26. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/copilot/context.py +31 -39
  27. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/registry.py +35 -1
  28. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/case/evidence.py +114 -15
  29. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/__init__.py +4 -2
  30. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/fuzz_output.py +3 -10
  31. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/fuzz_run.py +5 -1
  32. ithrl-0.3.0/src/ithrl/cli/inspect.py +179 -0
  33. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/output.py +11 -7
  34. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/sampled_output.py +58 -0
  35. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/sampled_reduction.py +95 -35
  36. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/sampled_session.py +22 -69
  37. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/shrink.py +2 -30
  38. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/execution/contracts.py +6 -2
  39. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/experiment.py +68 -0
  40. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/fuzz/contracts.py +10 -0
  41. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/fuzz/deterministic.py +2 -0
  42. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/fuzz/sampling.py +2 -1
  43. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/fuzz/simplify.py +3 -3
  44. ithrl-0.3.0/src/ithrl/inspection.py +778 -0
  45. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/mutation.py +29 -8
  46. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/observations.py +18 -15
  47. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/reduce/__init__.py +2 -0
  48. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/reduce/contracts.py +362 -29
  49. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/reduce/engine.py +243 -23
  50. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/reduce/search.py +52 -50
  51. ithrl-0.3.0/src/ithrl/results/inspection.py +382 -0
  52. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/results/models.py +2 -2
  53. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/results/storage.py +22 -36
  54. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/results/summary.py +3 -9
  55. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/results/validation.py +31 -1
  56. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/run_state.py +14 -0
  57. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/capability.py +7 -46
  58. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/configuration.py +23 -0
  59. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/isolation.py +9 -53
  60. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/materialize.py +122 -55
  61. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/policy.py +2 -2
  62. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/protocol.py +10 -4
  63. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/runner.py +4 -1
  64. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/runtime_configuration.py +24 -11
  65. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/schema.py +1 -13
  66. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/contracts.py +16 -6
  67. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/capability.py +7 -44
  68. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/isolation.py +8 -51
  69. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/materialize.py +64 -34
  70. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/policy.py +1 -1
  71. ithrl-0.3.0/src/ithrl/runner/runtime/probes.py +49 -0
  72. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/runtime/process.py +4 -13
  73. ithrl-0.3.0/src/ithrl/runner/runtime/programs.py +75 -0
  74. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/validation.py +14 -21
  75. ithrl-0.3.0/src/ithrl/sampled_run_metadata.py +87 -0
  76. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/sampling.py +23 -1
  77. ithrl-0.3.0/src/ithrl/text_sections.py +218 -0
  78. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/workflow.py +55 -2
  79. ithrl-0.2.0/CHANGELOG.md +0 -128
  80. {ithrl-0.2.0 → ithrl-0.3.0}/.gitignore +0 -0
  81. {ithrl-0.2.0 → ithrl-0.3.0}/LICENSE +0 -0
  82. {ithrl-0.2.0 → ithrl-0.3.0}/docs/decisions/0001-native-evidence-and-controlled-runners.md +0 -0
  83. {ithrl-0.2.0 → ithrl-0.3.0}/docs/decisions/0002-fixed-samples-and-durable-dispatch.md +0 -0
  84. {ithrl-0.2.0 → ithrl-0.3.0}/docs/decisions/0003-strict-fresh-baselines.md +0 -0
  85. {ithrl-0.2.0 → ithrl-0.3.0}/docs/decisions/0004-single-finding-fuzz-confirmation.md +0 -0
  86. {ithrl-0.2.0 → ithrl-0.3.0}/docs/decisions/index.md +0 -0
  87. {ithrl-0.2.0 → ithrl-0.3.0}/docs/research/context-fuzzing.md +0 -0
  88. {ithrl-0.2.0 → ithrl-0.3.0}/docs/research/feasibility.md +0 -0
  89. {ithrl-0.2.0 → ithrl-0.3.0}/docs/troubleshooting.md +0 -0
  90. {ithrl-0.2.0 → ithrl-0.3.0}/examples/fuzz/campaign.toml +0 -0
  91. {ithrl-0.2.0 → ithrl-0.3.0}/examples/fuzz/codex.jsonl +0 -0
  92. {ithrl-0.2.0 → ithrl-0.3.0}/examples/fuzz/copilot.jsonl +0 -0
  93. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/__init__.py +0 -0
  94. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/__main__.py +0 -0
  95. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/__init__.py +0 -0
  96. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/_jsonl.py +0 -0
  97. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/codex/__init__.py +0 -0
  98. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/codex/decisions.py +0 -0
  99. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/codex/discovery.py +0 -0
  100. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/codex/parser.py +0 -0
  101. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/copilot/__init__.py +0 -0
  102. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/copilot/decisions.py +0 -0
  103. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/copilot/discovery.py +0 -0
  104. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/copilot/parser.py +0 -0
  105. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/discovery.py +0 -0
  106. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/adapters/errors.py +0 -0
  107. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/behavior.py +0 -0
  108. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/calibration.py +0 -0
  109. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/case/__init__.py +0 -0
  110. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/case/contracts.py +0 -0
  111. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/case/filesystem.py +0 -0
  112. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/case/source.py +0 -0
  113. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/case/source_context.py +0 -0
  114. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/case/source_storage.py +0 -0
  115. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/case/storage.py +0 -0
  116. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/extract.py +0 -0
  117. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/fuzz.py +0 -0
  118. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/fuzz_session.py +0 -0
  119. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/native.py +0 -0
  120. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/paths.py +0 -0
  121. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/progress.py +0 -0
  122. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/cli/sampled.py +0 -0
  123. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/context.py +0 -0
  124. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/decisions.py +0 -0
  125. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/examples/synthetic-trace.json +0 -0
  126. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/execution/__init__.py +0 -0
  127. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/execution/budget.py +0 -0
  128. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/execution/preflight.py +0 -0
  129. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/extraction.py +0 -0
  130. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/fuzz/__init__.py +0 -0
  131. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/fuzz/campaign.py +0 -0
  132. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/fuzz/configuration.py +0 -0
  133. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/fuzz/generation.py +0 -0
  134. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/fuzz/progress.py +0 -0
  135. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/fuzz/statistics.py +0 -0
  136. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/measurement.py +0 -0
  137. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/path_safety.py +0 -0
  138. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/results/__init__.py +0 -0
  139. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/__init__.py +0 -0
  140. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/__init__.py +0 -0
  141. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/protocol_contracts.py +0 -0
  142. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/relay.py +0 -0
  143. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/transcript.py +0 -0
  144. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/codex/worker.py +0 -0
  145. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/__init__.py +0 -0
  146. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/configuration.py +0 -0
  147. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/protocol/__init__.py +0 -0
  148. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/protocol/contracts.py +0 -0
  149. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/protocol/decoding.py +0 -0
  150. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/protocol/parser.py +0 -0
  151. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/protocol/state.py +0 -0
  152. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/runner.py +0 -0
  153. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/sdk_runtime.py +0 -0
  154. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/copilot/worker.py +0 -0
  155. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/evidence.py +0 -0
  156. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/fake.py +0 -0
  157. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/registry.py +0 -0
  158. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/runtime/__init__.py +0 -0
  159. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/runtime/certificates.py +0 -0
  160. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/runtime/contracts.py +0 -0
  161. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/runtime/output.py +0 -0
  162. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/runtime/protection.py +0 -0
  163. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/runner/runtime/state.py +0 -0
  164. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/statistics.py +0 -0
  165. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/synthetic.py +0 -0
  166. {ithrl-0.2.0 → ithrl-0.3.0}/src/ithrl/timestamps.py +0 -0
@@ -0,0 +1,70 @@
1
+ # CHANGELOG
2
+
3
+ ## v0.3.0 (2026-11-10)
4
+
5
+ ### Features
6
+
7
+ - Add finer final-response reduction ([#52](https://github.com/eberkut/ithrl/pull/52), [`562124a`](https://github.com/eberkut/ithrl/commit/562124ab071788a52e0d50dd538048ee67de464b))
8
+ - Define source-bound text-section removal ([#51](https://github.com/eberkut/ithrl/pull/51), [`56c9e6c`](https://github.com/eberkut/ithrl/commit/56c9e6cfb24a83dc32573232b447e574cb0f616f))
9
+ - Inspect retained context without provider calls ([#49](https://github.com/eberkut/ithrl/pull/49), [`5604688`](https://github.com/eberkut/ithrl/commit/5604688e269543305fe4b7b253a703dc404c1139))
10
+ - **reduce**: Qualify paragraph removal on ordinary sessions ([#58](https://github.com/eberkut/ithrl/pull/58), [`5c6ae26`](https://github.com/eberkut/ithrl/commit/5c6ae26760ea7bd94b406ebf9ba3214e5c4ce64c))
11
+
12
+ ### Refactoring
13
+
14
+ - Simplify experiment workflows and test fixtures ([#50](https://github.com/eberkut/ithrl/pull/50), [`782bfa2`](https://github.com/eberkut/ithrl/commit/782bfa2692a49a5bb2a4f555801abda23cde6fda))
15
+
16
+ ## v0.2.0 (2026-11-02)
17
+
18
+ ### Bug Fixes
19
+
20
+ - **codex**: Bound and account for physical provider requests ([#33](https://github.com/eberkut/ithrl/pull/33), [`88529d6`](https://github.com/eberkut/ithrl/commit/88529d6f8b930dbcc546a0011f085c67d0bef1ac))
21
+ - **copilot**: Recover catalogue connections and qualify fuzzing ([#37](https://github.com/eberkut/ithrl/pull/37), [`ff6cf63`](https://github.com/eberkut/ithrl/commit/ff6cf6324325f7f6dad8f8c9c80ea58bfe4e249a))
22
+ - **copilot**: Restore native session prefixes through the CLI ([#34](https://github.com/eberkut/ithrl/pull/34), [`36845dd`](https://github.com/eberkut/ithrl/commit/36845ddb8239c0a488552297aaa70e6211979e59))
23
+ - **fuzz**: Preserve accounting and validate campaign recovery ([#25](https://github.com/eberkut/ithrl/pull/25), [`f1f4793`](https://github.com/eberkut/ithrl/commit/f1f479318fe914f3033667b65381f7101bd3aaea))
24
+ - **sampling**: Enforce calibration budgets and report durable progress ([#32](https://github.com/eberkut/ithrl/pull/32), [`bd40577`](https://github.com/eberkut/ithrl/commit/bd40577c734d70b36e59a9e6d3babafa1502bfd3))
25
+
26
+ ### Features
27
+
28
+ - **extract**: Support literal predicates for native decisions ([#31](https://github.com/eberkut/ithrl/pull/31), [`3b18c2b`](https://github.com/eberkut/ithrl/commit/3b18c2bdd814c4e4c3bf79825a8cab77eb433661))
29
+ - **fuzz**: Add mutation and sampled comparison services ([`56ee8b8`](https://github.com/eberkut/ithrl/commit/56ee8b8c5e1370b91db6c9c952eb8ceec19c95ae))
30
+ - **fuzz**: Expose inspectable campaigns and saved results ([#24](https://github.com/eberkut/ithrl/pull/24), [`e60e472`](https://github.com/eberkut/ithrl/commit/e60e47230b99e50ff42de7cd8fb89b3769e6d6e2))
31
+ - **fuzz**: Persist campaigns and recover interrupted execution ([#22](https://github.com/eberkut/ithrl/pull/22), [`806667f`](https://github.com/eberkut/ithrl/commit/806667f47e8bae1ccbf9b32fadc511ca559675d0))
32
+ - **fuzz**: Qualify native Codex text appends ([#28](https://github.com/eberkut/ithrl/pull/28), [`a5b880b`](https://github.com/eberkut/ithrl/commit/a5b880b60ef9834bb57b2c4950e18cd17ff0b275))
33
+
34
+ ### Performance Improvements
35
+
36
+ - Streamline local workflows and harden result publication ([#36](https://github.com/eberkut/ithrl/pull/36), [`43b9d81`](https://github.com/eberkut/ithrl/commit/43b9d81d0dcff85708da5c914986a68bbe8141db))
37
+
38
+ ## v0.1.0 (2026-10-23)
39
+
40
+ ### Bug Fixes
41
+
42
+ - **adapters**: Detect saved session formats structurally ([`c8256b9`](https://github.com/eberkut/ithrl/commit/c8256b93ce79fb9c3f025e2b92a970f336497218))
43
+ - **reduce**: Validate native candidates before sampled dispatch ([`90d4c0d`](https://github.com/eberkut/ithrl/commit/90d4c0d11a206389d44c6a59991df53c19802514))
44
+ - **runner**: Clarify Codex isolation prerequisites ([`4a409c1`](https://github.com/eberkut/ithrl/commit/4a409c1f37caf301a00cfbd20d3a95cf15844eb9))
45
+
46
+ ### Features
47
+
48
+ - Establish credential-free context reduction core ([`c517409`](https://github.com/eberkut/ithrl/commit/c517409c06e40c92b24a8b990685abd4acc9a9ba))
49
+ - **adapters**: Parse Codex and Copilot session evidence ([`3b81c26`](https://github.com/eberkut/ithrl/commit/3b81c2607397d884bcfb1b19dbf995f66ccb0107))
50
+ - **calibration**: Add bounded sampled runner calibration ([`f9db180`](https://github.com/eberkut/ithrl/commit/f9db18012565badc2cf2a3a4a6158487d4c5fb70))
51
+ - **case**: Preserve immutable native source evidence ([`d108b96`](https://github.com/eberkut/ithrl/commit/d108b96487ccb69f6b36642ae331d36272038722))
52
+ - **cli**: Add an installed example and focused public guides ([`1efc2ff`](https://github.com/eberkut/ithrl/commit/1efc2ffb03c734b666b1d1da9b5610ad62970267))
53
+ - **cli**: Add guarded native calibration ([`06d2bfb`](https://github.com/eberkut/ithrl/commit/06d2bfb3f4d34f4dc845d9d6877257e4e79f9120))
54
+ - **cli**: Integrate sampled reduction and exact resume ([`40be766`](https://github.com/eberkut/ithrl/commit/40be7664ba90ac5341d93fb5a725dbfa0efd48d3))
55
+ - **extract**: Support ordinary Codex and Copilot sessions ([`3cd0c10`](https://github.com/eberkut/ithrl/commit/3cd0c1092aeb3669b86fdae07e887d28ba9d685f))
56
+ - **reduce**: Add sampled contracts and durable progress ([`650252d`](https://github.com/eberkut/ithrl/commit/650252d76e8d7d72f3f5715ecaf488e752dc18b1))
57
+ - **reduce**: Integrate sampled candidate search ([`72958d8`](https://github.com/eberkut/ithrl/commit/72958d8d6ae0307ca2d090a2a10d02606bafdea6))
58
+ - **runner**: Add Codex final-response execution ([`ad30a9a`](https://github.com/eberkut/ithrl/commit/ad30a9a17b0e665056eca9b415cbf4e2770a7bf7))
59
+ - **runner**: Add controlled Copilot execution ([`c9d1bb2`](https://github.com/eberkut/ithrl/commit/c9d1bb23bfdd98bb022fd0b62ca9b8a81021fe4b))
60
+ - **runner**: Add isolated execution runtime ([`17d2224`](https://github.com/eberkut/ithrl/commit/17d22240414cdb32d4464f16e7b2621d99729ca0))
61
+ - **runner**: Add shared execution foundation ([`89536e9`](https://github.com/eberkut/ithrl/commit/89536e919730fc0abf680a2928a89761c78339f5))
62
+ - **runner**: Validate isolated native calibration ([`b0cd438`](https://github.com/eberkut/ithrl/commit/b0cd438d1fa280f0ddafa39d23653a7ac926da1b))
63
+ - **sampling**: Collect bounded fresh-baseline blocks ([`16abf30`](https://github.com/eberkut/ithrl/commit/16abf30b964eae299177d1e1dade6f545ffbda31))
64
+ - **sampling**: Support paced execution and safe overload replacement ([`5d70fbd`](https://github.com/eberkut/ithrl/commit/5d70fbd26901a0574883e07fd4055644c8515e80))
65
+ - **statistics**: Add fixed-sample candidate classification ([`fb26fca`](https://github.com/eberkut/ithrl/commit/fb26fcaf7c064f49ac7d63b4e2ceb1ab3d6dcdb5))
66
+ - **workflow**: Confirm sampled reductions with fresh evidence ([`ee291e4`](https://github.com/eberkut/ithrl/commit/ee291e4d906394452da61640989cef594f62caf7))
67
+
68
+ ### Refactoring
69
+
70
+ - 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
@@ -82,6 +83,8 @@ The required `Python tests` check summarizes the test matrix. It accepts a skipp
82
83
  after successful Markdown-only classification. Failed classification, missing decisions, test
83
84
  failures and unexpected skips fail this check.
84
85
 
86
+ The logo sources, usage rules and regeneration commands are in [branding](docs/branding/README.md).
87
+
85
88
  ## Workflow and dependency checks
86
89
 
87
90
  For GitHub Actions or Dependabot changes, use the jactionlint release pinned in
@@ -128,13 +131,21 @@ Use `uv run rumdl fmt .` to format Markdown, then `uv run rumdl check .` to lint
128
131
  version and `pyproject.toml` configuration apply to pre-commit and CI. Prose wraps at 100
129
132
  characters; commands and tables retain their layout. MkDocs syntax is recognized within `docs/`. The
130
133
  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.
134
+ its byte-for-byte generation check remains enforced. The generated changelog keeps each entry on
135
+ one source line, with a line-length exception.
133
136
 
134
137
  Keep installation and first-use instructions in README, and detailed user guides and reference in
135
138
  `docs/`. Support, security and conduct policies live at the repository root. Keep private sessions,
136
139
  cases and credentials out of documentation and generated output.
137
140
 
141
+ Use [Diátaxis](https://diataxis.fr/) to match a section to the reader's need. A tutorial guides
142
+ learning through a reproducible example with expected results. A how-to gives prerequisites,
143
+ actions and a success check for a specific task. Reference describes commands and contracts;
144
+ explanation covers rationale, evidence and limits. Link between these when the reader needs more
145
+ detail. Apply the distinction within existing pages; add a page when it has a separate purpose.
146
+ Use concrete instructions and claims supported by evidence. Remove filler, promotional language
147
+ and repeated explanations.
148
+
138
149
  [ROADMAP.md](ROADMAP.md) describes future direction. GitHub issues own actionable scope,
139
150
  dependencies, acceptance criteria and status; release milestones group scope and the public
140
151
  [Project](https://github.com/users/eberkut/projects/1/views/4) provides views of those same issues.
@@ -300,8 +311,13 @@ justified and documented before release.
300
311
  Python Semantic Release, pinned in the `release` dependency group, calculates versions from
301
312
  Conventional Commits. `pyproject.toml` is the version source; installed CLI and Codex client
302
313
  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.
314
+ history, omitting routine build, CI, documentation, style and test commits. Its
315
+ [template](.github/changelog/CHANGELOG.md.j2) keeps lists compact, with one entry per source line.
316
+ Change the template to adjust formatting; do not edit generated entries by hand.
317
+
318
+ A maintainer starts preparation; Semantic Release chooses the version and writes the notes.
319
+ Review and merge the generated files through a PR so CI tests the prepared version before the
320
+ publication workflow builds it. The publication workflow uses that committed version.
305
321
 
306
322
  Use `main` with complete history and all existing release tags available. Preview the next version
307
323
  without changing files, the index, commits, tags or remote state:
@@ -339,9 +355,9 @@ ownership and the following repository/index settings:
339
355
 
340
356
  - PyPI and TestPyPI Trusted Publishers bind `eberkut/ithrl`, `release.yml` and their respective
341
357
  `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.
358
+ - Both environments admit only `main`, require the maintainer's approval, permit self-review and
359
+ disallow administrative approval bypass. Environment declarations in YAML do not configure these
360
+ protections; verify the actual settings before dispatch.
345
361
  - Release-tag rules permit the maintainer's signed-tag creation and prevent unapproved tag
346
362
  replacement or deletion. The workflow never creates a tag.
347
363
 
@@ -353,10 +369,12 @@ gh workflow run release.yml --repo eberkut/ithrl --ref main \
353
369
  -f version=X.Y.Z -f source-sha=FULL_APPROVED_COMMIT_SHA
354
370
  ```
355
371
 
356
- 1. Inspect that run's checks and successful **Publish TestPyPI rehearsal** job. Its summary records
372
+ 1. After source verification and validation pass, approve the `testpypi` deployment on the run's
373
+ GitHub page. This authorizes the public TestPyPI upload.
374
+ 2. Inspect the successful **Publish TestPyPI rehearsal** job. Its summary records
357
375
  the source, version, immutable artifact ID and checksum-manifest digest. The production job
358
376
  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:
377
+ 3. Download that run's `release-distributions` artifact into a new review directory. For example:
360
378
 
361
379
  ```bash
362
380
  gh run download RUN_ID --repo eberkut/ithrl \
@@ -367,7 +385,7 @@ gh workflow run release.yml --repo eberkut/ithrl --ref main \
367
385
  from the review directory. Inspect the release notes and confirm TestPyPI serves the same
368
386
  distribution hashes. Complete a clean TestPyPI installation/example rehearsal before approval;
369
387
  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
388
+ 4. After the rehearsal passes and tag creation is approved, create and verify the signed tag at
371
389
  the frozen source commit, then push only that tag through the permitted tag-rules path:
372
390
 
373
391
  ```bash
@@ -376,12 +394,12 @@ gh workflow run release.yml --repo eberkut/ithrl --ref main \
376
394
  git push origin refs/tags/vX.Y.Z
377
395
  ```
378
396
 
379
- 4. Review and approve the `pypi` deployment on the run's GitHub page. The job verifies the existing
397
+ 5. Review and approve the `pypi` deployment on the run's GitHub page. The job verifies the existing
380
398
  annotated tag targets the frozen source, rechecks the files, and uploads to PyPI. The final job
381
399
  rechecks the tag/files and creates the GitHub Release with those distributions, notes and
382
400
  checksums. Signature verification belongs to the preceding maintainer tag check; the workflow
383
401
  checks the tag object and target commit.
384
- 5. Verify the published versions, hashes, attestations and installed example. A successful upload
402
+ 6. Verify the published versions, hashes, attestations and installed example. A successful upload
385
403
  alone does not complete release acceptance.
386
404
 
387
405
  Complete review within 30 days: release artifacts are retained for 30 days, and GitHub limits the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ithrl
3
- Version: 0.2.0
3
+ Version: 0.3.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)
@@ -88,6 +96,9 @@ Use a new directory to repeat the example; extraction refuses to overwrite an ex
88
96
 
89
97
  - `ithrl extract` browses saved sessions and creates a case from a selected decision.
90
98
  - `ithrl shrink CASE` searches for context removals that preserve the selected behavior.
99
+ - `ithrl inspect retained CASE --result RESULT` explains retained units and recorded removal trials
100
+ from a saved reduction without model access. See
101
+ [results and privacy](https://github.com/eberkut/ithrl/blob/main/docs/results.md#inspect-retained-context).
91
102
  - `ithrl fuzz CASE --config PRIVATE_TOML` searches for and simplifies text appends that decrease how
92
103
  often the selected behavior occurs, with independent confirmation.
93
104
 
@@ -107,8 +118,8 @@ Returned actions are observed and denied. Cases contain copied session content;
107
118
  | Input | Extracted decisions | Reduction | Fuzzing |
108
119
  | --- | --- | --- | --- |
109
120
  | 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 |
121
+ | 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 |
122
+ | 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 |
112
123
 
113
124
  Native Codex and Copilot final-response fuzzing supports appending text to eligible prior user
114
125
  input while preserving the fixed triggering input. The
@@ -116,9 +127,12 @@ input while preserving the fixed triggering input. The
116
127
  starts with a local example and covers native execution.
117
128
 
118
129
  [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
130
+ include ordinary Codex and Copilot final-response experiments that removed paragraphs from retained
131
+ prior-user text and passed fresh confirmation at a 20-percentage-point preservation margin. The
132
+ [worked investigation](https://github.com/eberkut/ithrl/blob/main/docs/research/ordinary-session-investigation.md)
133
+ explains what the smaller Codex context helped a developer inspect and what remains unresolved.
134
+ The measurements distinguish private runtime qualification from integrated support and report
135
+ resource usage and unsuccessful outcomes alongside completed runs. Check
122
136
  [native compatibility](https://github.com/eberkut/ithrl/blob/main/docs/native-runs.md#compatibility-and-measurements)
123
137
  for the installed harness's requirements.
124
138
 
@@ -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)
@@ -55,6 +63,9 @@ Use a new directory to repeat the example; extraction refuses to overwrite an ex
55
63
 
56
64
  - `ithrl extract` browses saved sessions and creates a case from a selected decision.
57
65
  - `ithrl shrink CASE` searches for context removals that preserve the selected behavior.
66
+ - `ithrl inspect retained CASE --result RESULT` explains retained units and recorded removal trials
67
+ from a saved reduction without model access. See
68
+ [results and privacy](https://github.com/eberkut/ithrl/blob/main/docs/results.md#inspect-retained-context).
58
69
  - `ithrl fuzz CASE --config PRIVATE_TOML` searches for and simplifies text appends that decrease how
59
70
  often the selected behavior occurs, with independent confirmation.
60
71
 
@@ -74,8 +85,8 @@ Returned actions are observed and denied. Cases contain copied session content;
74
85
  | Input | Extracted decisions | Reduction | Fuzzing |
75
86
  | --- | --- | --- | --- |
76
87
  | 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 |
88
+ | 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 |
89
+ | 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 |
79
90
 
80
91
  Native Codex and Copilot final-response fuzzing supports appending text to eligible prior user
81
92
  input while preserving the fixed triggering input. The
@@ -83,9 +94,12 @@ input while preserving the fixed triggering input. The
83
94
  starts with a local example and covers native execution.
84
95
 
85
96
  [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
97
+ include ordinary Codex and Copilot final-response experiments that removed paragraphs from retained
98
+ prior-user text and passed fresh confirmation at a 20-percentage-point preservation margin. The
99
+ [worked investigation](https://github.com/eberkut/ithrl/blob/main/docs/research/ordinary-session-investigation.md)
100
+ explains what the smaller Codex context helped a developer inspect and what remains unresolved.
101
+ The measurements distinguish private runtime qualification from integrated support and report
102
+ resource usage and unsuccessful outcomes alongside completed runs. Check
89
103
  [native compatibility](https://github.com/eberkut/ithrl/blob/main/docs/native-runs.md#compatibility-and-measurements)
90
104
  for the installed harness's requirements.
91
105
 
@@ -12,12 +12,12 @@ with scope and release dates decided from evidence.
12
12
  Codex and GitHub Copilot are the primary harness integrations. Closing feature gaps between them
13
13
  is the current priority.
14
14
 
15
- ## Current work: context fuzzing
15
+ ## Completed: v0.2 context fuzzing
16
16
 
17
17
  The `ithrl fuzz` command explores bounded context changes, simplifies interventions and
18
18
  independently confirms their effects.
19
19
 
20
- The first fuzzing milestone supports **one confirmed finding per campaign**: a declared decrease
20
+ The released fuzzing capability supports **one confirmed finding per campaign**: a declared decrease
21
21
  in the existing target's match probability among valid observations. A finding describes the
22
22
  selected experiment, including execution reliability and assumptions. It does not establish a
23
23
  model defect, a unique cause or semantic equivalence of the original and changed context.
@@ -36,27 +36,43 @@ See the [fuzzing capability issue](https://github.com/eberkut/ithrl/issues/5) an
36
36
  [`v0.2.0` milestone](https://github.com/eberkut/ithrl/milestone/1) for scope and acceptance
37
37
  criteria.
38
38
 
39
- [Release preparation and publication](https://github.com/eberkut/ithrl/issues/11) follow acceptance
40
- for both Codex and Copilot.
41
- They remain separate from implementing the capability. Broader mutation families and multiple-
42
- finding campaigns need their own evidence and prospective error allocation.
39
+ [Version 0.2.0](https://github.com/eberkut/ithrl/releases/tag/v0.2.0) is published, with
40
+ [release preparation and publication](https://github.com/eberkut/ithrl/issues/11) complete.
41
+ Broader mutation families and multiple-finding campaigns need their own evidence and prospective
42
+ error allocation.
43
+
44
+ ## Current work: v0.3 deeper reduction
45
+
46
+ Provider-free retained-context inspection and finer removal within supported prior-user text are
47
+ implemented, with Codex and Copilot final-response workflows. Ordinary saved-session qualification
48
+ and a [worked investigation](docs/research/ordinary-session-investigation.md) are complete; the
49
+ [measurements](docs/measurements.md#ordinary-session-paragraph-removal) record outcomes, costs and
50
+ limits. Version 0.3 is not yet released.
51
+ [Issue #12](https://github.com/eberkut/ithrl/issues/12) owns the milestone's acceptance and scope.
52
+
53
+ Choose section boundaries, workload-specific usefulness criteria and execution budgets before
54
+ provider-backed evaluation. Finer native removal needs its own reconstruction, safety and live-use
55
+ evidence. Ablation, alternative reproducers, interaction analysis and statistically confirmed
56
+ single-removal minimality are deferred; they are not v0.3 release requirements.
43
57
 
44
58
  ## Direction by version
45
59
 
46
60
  | Stage | Outcome | Candidate features |
47
61
  | --- | --- | --- |
48
62
  | **[v0.2: context fuzzing](https://github.com/eberkut/ithrl/issues/5)** | Find small context changes that alter a selected behavior | Bounded seeded mutations, discovery and mutation simplification, one fresh confirmed finding, exact recovery and explicit cost/reliability reporting |
49
- | **[v0.3: deeper reduction](https://github.com/eberkut/ithrl/issues/12)** | Examine how small and robust a reproducer is | Supported content-block/section removal, retained-context inspection, ablation, alternative reproducers, interactions and optional confirmed 1-minimality |
63
+ | **[v0.3: deeper reduction](https://github.com/eberkut/ithrl/issues/12)** | Inspect retained context and reduce within supported prior-user text | Provider-free inspection, text-section removal and qualified Codex/Copilot final-response workflows |
50
64
  | **[v0.4: comparative debugging](https://github.com/eberkut/ithrl/issues/13)** | Isolate behavior-changing differences between compatible cases | `compare`, context-version delta debugging and another qualified harness integration |
51
65
  | **[v0.5: trace forensics](https://github.com/eberkut/ithrl/issues/15)** | Explain what information was acquired again | Passive reacquisition analysis around compaction, resume, forks and handoffs |
52
66
 
53
67
  ### Deeper reduction
54
68
 
55
69
  Reduction within a message must preserve its native structure and protocol dependencies. Retained
56
- context inspection should distinguish dependencies retained for validity, unremovable state and
57
- items whose removal changed the measured behavior.
70
+ context inspection should distinguish protected or frozen material, dependency constraints,
71
+ rejected removal trials, incomplete evidence and untested work. Trial explanations must identify
72
+ the tested context; a rejected sampled screen does not establish behavioral necessity.
58
73
 
59
- Retained-item and full-original ablation answer different questions and must report their baseline.
74
+ Deferred retained-item and full-original ablation answer different questions and must report their
75
+ baseline.
60
76
  Alternative reproducer search can expose several preserving contexts and interactions; none is
61
77
  automatically a unique explanation. Deterministic single-removal minimality and statistically
62
78
  confirmed minimality are distinct claims. The latter requires additional complete comparisons,
@@ -8,7 +8,9 @@ runtime.
8
8
 
9
9
  The
10
10
  [README supported-inputs table](https://github.com/eberkut/ithrl/blob/main/README.md#supported-inputs)
11
- defines the public capability claim. The public commands are `extract`, `shrink` and `fuzz`. Fuzzing
11
+ defines the public capability claim. The public commands are `extract`, `shrink`, `inspect retained`
12
+ and `fuzz`. Retained-context inspection reads saved evidence without resolving runners or opening
13
+ an observation store. Fuzzing
12
14
  has a credential-free local walkthrough and qualified Codex and Copilot append-text profiles for
13
15
  eligible prior user input. See [native runs](native-runs.md) for the operator
14
16
  procedure, [measurements](measurements.md#native-context-fuzzing) for qualification evidence and
@@ -79,6 +81,82 @@ run allowance leaves sample targets, freshness, effective policy and per-attempt
79
81
  Observation reuse requires compatible identities and roles; a matching candidate digest alone
80
82
  is insufficient.
81
83
 
84
+ ## Source-bound text sections
85
+
86
+ The shared `text_sections.py` contract describes removal from one eligible prior-user text field.
87
+ It is separate from native reconstruction and from search. Field discovery uses the existing
88
+ adapter-owned editable-text surface: fixed decision input, instructions, protected nodes and opaque
89
+ records remain outside it. A content block is a field; sections never cross block boundaries.
90
+
91
+ `paragraph-v1` partitions the original string using physical LF, CRLF or CR line endings. A blank
92
+ line contains only ASCII spaces or tabs before its ending. Each run of nonblank lines owns its
93
+ following blank lines; leading blank lines form their own section. A whitespace-only field has one
94
+ section, and an empty field has none. Other Unicode line separators are ordinary text. Offsets are
95
+ half-open Python Unicode code-point positions; UTF-8 byte counts are reported separately. No
96
+ trimming, newline conversion, separator insertion or Markdown interpretation occurs. Removing all
97
+ sections leaves the existing field empty and preserves its enclosing record and content block.
98
+
99
+ Catalogs contain metadata, not the original text. Section identities bind the immutable case,
100
+ context node, content-block index, original-text digest, policy and exact range. A removal stores
101
+ ordered section IDs rather than caller-supplied ranges. Validation re-derives the catalog from the
102
+ immutable eligible field, refusing stale or foreign IDs, duplicates and noncanonical order. Fields
103
+ are limited to 1 MiB of UTF-8 text and 1,024 sections; a field exceeding either limit is unavailable
104
+ under this policy rather than partially catalogued.
105
+ Case-level discovery omits fields beyond these limits while preserving complete catalogs for
106
+ other eligible fields. Explicit validation still refuses an edit to an unavailable field.
107
+
108
+ The candidate's existing mutation envelope distinguishes `append-text` from `remove-text-sections`.
109
+ Empty and append-only candidates retain their existing serialization and identities. A section edit
110
+ can accompany dependency-closed whole-record removal only when its parent survives; removing the
111
+ same field through its parent or dependencies is refused. Appending still requires unchanged
112
+ context. Exact-request materialization addresses the immutable original message before accounting
113
+ for removed input positions and changes a defensive copy. A combined section edit refuses any
114
+ dependency-closed removal intersecting the original last input, including a nested field, even
115
+ when graph flags would allow coarse removal. The fixed input remains unchanged.
116
+ Loading `Candidate` JSON validates its shape. Binding it to a `PreparedAttempt` invokes
117
+ `prepare_candidate`, which re-derives its source bindings against immutable case evidence;
118
+ well-formed JSON and digests alone do not authorize an edit. Project-owned schema tags remain `1`
119
+ during pre-1.0 development.
120
+
121
+ Retained-context inspection exposes metadata-only catalogs with a 4,096-unit report allowance;
122
+ over-budget fields have no partial catalog. [Results](results.md#inspect-retained-context) explains
123
+ availability, byte measures and interpretation. Original text remains behind the existing bounded
124
+ opt-in.
125
+
126
+ Codex and Copilot final-response materializers apply section removals to copied native input.
127
+ Codex changes only the selected prior-user text block. Copilot changes the effective
128
+ `transformedContent` when present, otherwise `content`, preserving the surrounding event and
129
+ unedited prefix records. Copilot shell targets and fuzzing refuse section removal.
130
+
131
+ Sampled reduction opts in through `reduction.section_search`. Its ordered field descriptors list
132
+ eligible original section IDs; omitted sections remain protected during fine search. Separate coarse
133
+ and fine comparison ceilings do not transfer unused capacity. The checkpoint freezes the exact
134
+ coarse candidate and stopping state before independent per-field searches. Each fine candidate
135
+ combines that same coarse removal with one field's cumulative section selection. It never combines
136
+ edits across fields. The largest admitted editable-byte removal wins, with the first candidate
137
+ retained on a tie; the usefulness threshold is reported separately from selection and confirmation.
138
+ Fine search first tests removal of all declared eligible sections in a field. If that candidate
139
+ is refused or rejected, search partitions that same selection into smaller removals. Protected
140
+ sections remain untouched, and whole-record candidate order is unchanged.
141
+ An optional frozen `require_criterion_for_confirmation` gate stops before durable selection and
142
+ confirmation when the additional-byte criterion is unmet. Run-state validation also rejects a
143
+ selection that violates that gate; disabling it preserves independent threshold reporting.
144
+ The frozen `stop_when_no_retained_fields` setting additionally ends coarse search at a completed
145
+ comparison boundary if all selected fields have been removed. It requires the confirmation gate,
146
+ preserves the accepted coarse edit and makes no new sampling reservation.
147
+
148
+ Candidate, experiment and algorithm identities bind the source, policy and traversal. Resume
149
+ reconstructs the recorded coarse and fine decisions without executing attempts. One final durable
150
+ selection precedes fresh confirmation against the full immutable original, including when either
151
+ search stage has incomplete coverage. Results retain both stages and the selected mutation;
152
+ inspection revalidates its source bindings without loading a runner or observation database.
153
+
154
+ Provider-free tests cover these implementation contracts. The
155
+ [ordinary-session measurements](measurements.md#ordinary-session-paragraph-removal) record completed
156
+ qualification for the tested native profiles and their integration limits. The
157
+ [workload criteria](research/reduction-design.md#text-section-workload-preparation) preserve the
158
+ original preparation proposal separately from those measurements.
159
+
82
160
  ## Measurement, search and confirmation
83
161
 
84
162
  `measurement.py` invokes one prepared attempt, validates its returned evidence, evaluates the
@@ -141,13 +219,19 @@ before sampling resources are committed. An original reconstruction refusal is t
141
219
  candidate-local refusal during search consumes no provider calls. Admission starts no process or
142
220
  provider request; execution still validates the reconstructed candidate.
143
221
 
144
- Codex reconstructs copied history through the installed CLI's app-server protocol. A bounded
145
- Responses relay forwards to the fixed configured destination and records physical request counts.
146
- Native request and stream retries are disabled; a completed turn can still require several
147
- Responses requests. The caller selects a per-attempt cap from 1 to 16 (default 16). Capability,
148
- plan and saved-run identities retain this administrative limit. The relay rejects requests beyond
149
- the cap and records a `provider-call-limit` error. A completed HTTP response alone does not
150
- establish model acceptance or a completed native turn.
222
+ Codex reconstructs copied history through the installed CLI's app-server protocol. A tool-output
223
+ checkpoint includes the original output record and its captured call identity in the injected
224
+ history, then continues with empty new input. User-message triggers remain new user input. The
225
+ `codex-app-server-inject-checkpoint-v1` method binds this reconstruction contract; older
226
+ reconstruction identities cannot resume under it. Compacted source prefixes remain unsupported. An
227
+ explicit configuration-bound tool-output limit and conservative text-output admission prevent
228
+ reliance on a model-specific truncation default. Non-text tool-output content remains unsupported. A
229
+ bounded Responses relay forwards to the fixed configured destination and records physical request
230
+ counts. Native request and stream retries are disabled; a completed turn can still require several
231
+ Responses requests. The caller selects a per-attempt cap from 1 to 16 (default 16). Capability, plan
232
+ and saved-run identities retain this administrative limit. The relay rejects requests beyond the cap
233
+ and records a `provider-call-limit` error. A completed HTTP response alone does not establish model
234
+ acceptance or a completed native turn.
151
235
 
152
236
  Copilot's Python SDK drives the installed CLI over stdio. It resumes the copied native prefix at
153
237
  the selected model-turn boundary without injecting a user message, including decisions after tool
@@ -212,6 +296,7 @@ Python module names are not public API commitments.
212
296
  | `fuzz/configuration.py` | Private operator policy and command limits, bound to an immutable original |
213
297
  | `fuzz/progress.py`, `fuzz/campaign.py` | Frozen mutation order, authoritative traversal recovery, durable selection and terminal campaign evidence over shared sampled state |
214
298
  | `workflow.py`, `results/` | Application phase composition and validated result models, summaries and snapshots |
299
+ | `inspection.py`, `results/inspection.py`, `cli/inspect.py` | Offline result/case binding, retained-context interpretation and CLI presentation |
215
300
  | `cli/` | Public command selection, native setup, progress, continuation and presentation |
216
301
  | `path_safety.py`, `timestamps.py` | Shared private-path/lock primitives and timestamp validation |
217
302
 
@@ -0,0 +1,39 @@
1
+ .ithrl-mark {
2
+ width: 2rem;
3
+ height: 2rem;
4
+ flex-shrink: 0;
5
+ }
6
+
7
+ .ithrl-mark .ink {
8
+ fill: #202427;
9
+ }
10
+
11
+ .ithrl-mark .accent {
12
+ fill: #00a58f;
13
+ }
14
+
15
+ .dark .ithrl-mark .ink {
16
+ fill: #fff;
17
+ }
18
+
19
+ .dark .ithrl-mark .accent {
20
+ fill: #24cdb5;
21
+ }
22
+
23
+ .ithrl-wordmark {
24
+ margin: 1rem 0 1.5rem;
25
+ }
26
+
27
+ .ithrl-wordmark img {
28
+ max-width: 100%;
29
+ height: auto;
30
+ }
31
+
32
+ .ithrl-logo-dark,
33
+ .dark .ithrl-logo-light {
34
+ display: none;
35
+ }
36
+
37
+ .dark .ithrl-logo-dark {
38
+ display: block;
39
+ }
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-labelledby="title description">
3
+ <title id="title">ithrl</title>
4
+ <desc id="description">ithrl spear; adapts to light and dark themes.</desc>
5
+ <metadata>ithrl logo 1.0. Hand-refined spear geometry; Geist Bold outlined wordmark with ss08 i and ss03 l. See source/OFL-Geist.txt for font provenance.</metadata>
6
+ <style>
7
+ .ink{fill:#202427}.accent{fill:#00A58F}
8
+ @media (prefers-color-scheme:dark){.ink{fill:#FFFFFF}.accent{fill:#24CDB5}}
9
+ </style>
10
+ <path id="context-upper-left" class="ink" fill="#202427" d="M136 184H286L225.62 256H75.62Z"/>
11
+ <path id="context-upper-right" class="ink" fill="#202427" d="M356.06 214H470L412.94 282H299Z"/>
12
+ <path id="context-lower-left-and-tail" class="ink" fill="#202427" d="M119 290H220L240 310L72.23 487L152 362H58.58Z"/>
13
+ <path id="context-lower-right" class="ink" fill="#202427" d="M264 312H414L361.98 374H211.98Z"/>
14
+ <path id="spear-tip" class="ink" fill="#202427" d="M266.60 227.32L294.18 250.46L456 29.65Z"/>
15
+ <path id="revealed-diamond" class="accent" fill="#00A58F" d="M256 237L287 268L256 299L225 268Z"/>
16
+ </svg>
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" class="ithrl-mark size-8" viewBox="0 0 512 512" aria-hidden="true" focusable="false">
3
+ <title id="title">ithrl</title>
4
+ <desc id="description">ithrl spear.</desc>
5
+ <metadata>ithrl logo 1.0. Hand-refined spear geometry; Geist Bold outlined wordmark with ss08 i and ss03 l. See source/OFL-Geist.txt for font provenance.</metadata>
6
+ <path id="context-upper-left" class="ink" fill="#202427" d="M136 184H286L225.62 256H75.62Z"/>
7
+ <path id="context-upper-right" class="ink" fill="#202427" d="M356.06 214H470L412.94 282H299Z"/>
8
+ <path id="context-lower-left-and-tail" class="ink" fill="#202427" d="M119 290H220L240 310L72.23 487L152 362H58.58Z"/>
9
+ <path id="context-lower-right" class="ink" fill="#202427" d="M264 312H414L361.98 374H211.98Z"/>
10
+ <path id="spear-tip" class="ink" fill="#202427" d="M266.60 227.32L294.18 250.46L456 29.65Z"/>
11
+ <path id="revealed-diamond" class="accent" fill="#00A58F" d="M256 237L287 268L256 299L225 268Z"/>
12
+ </svg>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="1040" height="512" viewBox="0 0 1040 512" role="img" aria-labelledby="title description">
3
+ <title id="title">ithrl</title>
4
+ <desc id="description">ithrl spear and lowercase wordmark for dark backgrounds.</desc>
5
+ <metadata>ithrl logo 1.0. Hand-refined spear geometry; Geist Bold outlined wordmark with ss08 i and ss03 l. See source/OFL-Geist.txt for font provenance.</metadata>
6
+ <g id="emblem">
7
+ <path id="context-upper-left" fill="#FFFFFF" d="M136 184H286L225.62 256H75.62Z"/>
8
+ <path id="context-upper-right" fill="#FFFFFF" d="M356.06 214H470L412.94 282H299Z"/>
9
+ <path id="context-lower-left-and-tail" fill="#FFFFFF" d="M119 290H220L240 310L72.23 487L152 362H58.58Z"/>
10
+ <path id="context-lower-right" fill="#FFFFFF" d="M264 312H414L361.98 374H211.98Z"/>
11
+ <path id="spear-tip" fill="#FFFFFF" d="M266.60 227.32L294.18 250.46L456 29.65Z"/>
12
+ <path id="revealed-diamond" fill="#24CDB5" d="M256 237L287 268L256 299L225 268Z"/>
13
+ </g>
14
+ <g id="wordmark" fill="#FFFFFF" aria-hidden="true">
15
+ <path id="letter-i" d="M534 375V228.951H574.872V375ZM554.436 213.965Q545.444 213.965 539.722 208.787Q534 203.61 534 194.619Q534 185.627 539.722 180.313Q545.444 175 554.436 175Q563.7 175 569.422 180.313Q575.144 185.627 575.144 194.619Q575.144 203.61 569.422 208.787Q563.7 213.965 554.436 213.965Z"/>
16
+ <path id="letter-t" d="M657.447 375Q634.831 375 624.204 364.51Q613.578 354.019 613.578 331.131V259.469H590.144V228.951H613.578V194.619H654.45V228.951H692.869V259.469H654.45V326.226Q654.45 336.853 658.946 340.668Q663.441 344.482 672.433 344.482H692.869V375Z"/>
17
+ <path id="letter-h" d="M714.869 375V181.54H755.741V246.935Q761.736 236.035 772.362 230.858Q782.989 225.681 796.068 225.681Q820.591 225.681 832.989 241.213Q845.387 256.744 845.387 280.995V375H804.515V290.804Q804.515 274.455 799.338 266.281Q794.161 258.106 782.444 258.106Q769.91 258.106 762.826 266.689Q755.741 275.272 755.741 291.894V375Z"/>
18
+ <path id="letter-r" d="M861.387 375V228.951H900.079L901.169 258.106Q905.529 242.847 913.975 235.899Q922.422 228.951 935.774 228.951H949.125V262.738H935.774Q918.608 262.738 910.433 269.687Q902.259 276.635 902.259 292.984V375Z"/>
19
+ <path id="letter-l" d="M965.125 375V181.54H1005.997V375Z"/>
20
+ </g>
21
+ </svg>