dos-kernel 0.23.4__tar.gz → 0.24.1__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 (404) hide show
  1. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/PKG-INFO +36 -19
  2. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/README.md +35 -18
  3. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/pyproject.toml +7 -1
  4. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/__init__.py +1 -1
  5. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/cli.py +174 -2
  6. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/help_summary.py +30 -1
  7. dos_kernel-0.24.1/src/dos/hook_observation.py +338 -0
  8. dos_kernel-0.24.1/src/dos/override_facts.py +215 -0
  9. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/pretool_sensor.py +55 -0
  10. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/EXAMPLES.md +1 -1
  11. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-dispatch/SKILL.md +33 -1
  12. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-dispatch-loop/SKILL.md +1 -1
  13. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-next-up/SKILL.md +1 -1
  14. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-replan/SKILL.md +18 -0
  15. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-self-improve/SKILL.md +1 -1
  16. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/PKG-INFO +36 -19
  17. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/SOURCES.txt +5 -0
  18. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/entry_points.txt +1 -0
  19. dos_kernel-0.24.1/tests/test_gitignore_hygiene.py +116 -0
  20. dos_kernel-0.24.1/tests/test_hook_observation.py +392 -0
  21. dos_kernel-0.24.1/tests/test_override_window.py +273 -0
  22. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/LICENSE +0 -0
  23. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/setup.cfg +0 -0
  24. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/_demo_story.py +0 -0
  25. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/_filelock.py +0 -0
  26. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/_job_policy.py +0 -0
  27. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/_tree.py +0 -0
  28. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/admission.py +0 -0
  29. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/answer_shape.py +0 -0
  30. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/arbiter.py +0 -0
  31. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/archive_lock.py +0 -0
  32. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/arg_provenance.py +0 -0
  33. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/attest.py +0 -0
  34. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/breaker.py +0 -0
  35. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/churn.py +0 -0
  36. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/claim_extract.py +0 -0
  37. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/claim_ttl.py +0 -0
  38. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/commit_audit.py +0 -0
  39. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/completion.py +0 -0
  40. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/concurrency_class.py +0 -0
  41. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/config.py +0 -0
  42. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/config_lint.py +0 -0
  43. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/cooldown.py +0 -0
  44. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/coverage.py +0 -0
  45. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/dangling_intent.py +0 -0
  46. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/data_class.py +0 -0
  47. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/decisions.py +0 -0
  48. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/decisions_tui.py +0 -0
  49. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/dispatch_top.py +0 -0
  50. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/dispatch_top_tui.py +0 -0
  51. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/__init__.py +0 -0
  52. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/ci_status.py +0 -0
  53. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/citation_resolve.py +0 -0
  54. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/decision_stop.py +0 -0
  55. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/design_doc_plan.py +0 -0
  56. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/export_file.py +0 -0
  57. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/export_otlp.py +0 -0
  58. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/export_statsd.py +0 -0
  59. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/hook_dialects.py +0 -0
  60. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/job.py +0 -0
  61. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/llm_judge.py +0 -0
  62. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/memory_recall.py +0 -0
  63. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/notify_slack.py +0 -0
  64. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/notify_webhook.py +0 -0
  65. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/operator_judge.py +0 -0
  66. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/os_acceptance.py +0 -0
  67. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/paste_log.py +0 -0
  68. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/plan_scope.py +0 -0
  69. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/self_improve.py +0 -0
  70. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/similarity_judge.py +0 -0
  71. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/state_diff.py +0 -0
  72. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/supervisor.py +0 -0
  73. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/watchdog.py +0 -0
  74. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/workshop.py +0 -0
  75. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/durable_schema.py +0 -0
  76. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/effect_witness.py +0 -0
  77. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/efficiency.py +0 -0
  78. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/enforce.py +0 -0
  79. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/enumerate.py +0 -0
  80. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/env_print.py +0 -0
  81. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/event_severity.py +0 -0
  82. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/evidence.py +0 -0
  83. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/exec_capability.py +0 -0
  84. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/export_cursor.py +0 -0
  85. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/exporter.py +0 -0
  86. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/firing_label.py +0 -0
  87. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/fleet_roll.py +0 -0
  88. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/gate_classify.py +0 -0
  89. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/gh4_coverage.py +0 -0
  90. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/git_delta.py +0 -0
  91. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/guard.py +0 -0
  92. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/health.py +0 -0
  93. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/home.py +0 -0
  94. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/hook_binary.py +0 -0
  95. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/hook_dialect.py +0 -0
  96. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/hook_exit.py +0 -0
  97. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/hook_install.py +0 -0
  98. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/id_alloc.py +0 -0
  99. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/improve.py +0 -0
  100. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/intent_ledger.py +0 -0
  101. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/interpret.py +0 -0
  102. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/intervention.py +0 -0
  103. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/intervention_eval.py +0 -0
  104. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/journal_delta.py +0 -0
  105. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/judge_eval.py +0 -0
  106. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/judges.py +0 -0
  107. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lane_infer.py +0 -0
  108. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lane_journal.py +0 -0
  109. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lane_lease.py +0 -0
  110. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lane_overlap.py +0 -0
  111. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lease_health.py +0 -0
  112. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lifecycle.py +0 -0
  113. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/liveness.py +0 -0
  114. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lock_modes.py +0 -0
  115. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/log_source.py +0 -0
  116. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/loop_decide.py +0 -0
  117. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/marker_gate.py +0 -0
  118. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/marker_sensor.py +0 -0
  119. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/noop_streak.py +0 -0
  120. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/notify.py +0 -0
  121. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/observe.py +0 -0
  122. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/oracle.py +0 -0
  123. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/overlap_eval.py +0 -0
  124. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/overlap_policy.py +0 -0
  125. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/packet_sidecar.py +0 -0
  126. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/phase_shipped.py +0 -0
  127. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/pick_priority.py +0 -0
  128. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/pickable.py +0 -0
  129. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/picker_oracle.py +0 -0
  130. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/plan_board.py +0 -0
  131. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/plan_board_tui.py +0 -0
  132. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/plan_source.py +0 -0
  133. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/posttool_sensor.py +0 -0
  134. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/precursor_gate.py +0 -0
  135. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/precursor_gate_eval.py +0 -0
  136. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/preflight.py +0 -0
  137. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/proc_delta.py +0 -0
  138. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/productivity.py +0 -0
  139. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/provider_limit.py +0 -0
  140. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/py.typed +0 -0
  141. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/reason_morphology.py +0 -0
  142. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/reasons.py +0 -0
  143. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/reconcile.py +0 -0
  144. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/recurring_wedge.py +0 -0
  145. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/render.py +0 -0
  146. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/result_state.py +0 -0
  147. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/resume.py +0 -0
  148. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/resume_evidence.py +0 -0
  149. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/retention.py +0 -0
  150. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/reward.py +0 -0
  151. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/rewind.py +0 -0
  152. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/rewind_evidence.py +0 -0
  153. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/rewind_tokens.py +0 -0
  154. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/run_id.py +0 -0
  155. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/scope.py +0 -0
  156. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/scope_source.py +0 -0
  157. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/scout.py +0 -0
  158. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/self_modify.py +0 -0
  159. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/sibling_scan.py +0 -0
  160. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-class-cycle/SKILL.md +0 -0
  161. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-goal-gate/SKILL.md +0 -0
  162. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-promote/SKILL.md +0 -0
  163. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-replan-loop/SKILL.md +0 -0
  164. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-supervise-loop/SKILL.md +0 -0
  165. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-unstick/SKILL.md +0 -0
  166. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-witness-claim/SKILL.md +0 -0
  167. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/stamp.py +0 -0
  168. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/state_health.py +0 -0
  169. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/status.py +0 -0
  170. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/stop_policy.py +0 -0
  171. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/supervise.py +0 -0
  172. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/testwitness.py +0 -0
  173. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/timeline.py +0 -0
  174. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/tokens.py +0 -0
  175. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/tool_stream.py +0 -0
  176. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/tool_stream_eval.py +0 -0
  177. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/trace.py +0 -0
  178. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/verdict.py +0 -0
  179. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/verdict_cli.py +0 -0
  180. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/verdict_journal.py +0 -0
  181. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/verdict_rollup.py +0 -0
  182. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/verdicts.py +0 -0
  183. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/wedge_reason.py +0 -0
  184. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/dependency_links.txt +0 -0
  185. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/requires.txt +0 -0
  186. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/top_level.txt +0 -0
  187. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_mcp/__init__.py +0 -0
  188. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_mcp/py.typed +0 -0
  189. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_mcp/server.py +0 -0
  190. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_admission.py +0 -0
  191. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_agent_surface.py +0 -0
  192. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_agenthallu_replay.py +0 -0
  193. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_agentprocessbench_replay.py +0 -0
  194. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_answer_shape.py +0 -0
  195. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_arbiter.py +0 -0
  196. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_archive_lock.py +0 -0
  197. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_arg_provenance.py +0 -0
  198. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_attest.py +0 -0
  199. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_backflow_ledger.py +0 -0
  200. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_bench_layering.py +0 -0
  201. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_breaker.py +0 -0
  202. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_build_wheels_binary_format.py +0 -0
  203. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_canonical_example_lockstep.py +0 -0
  204. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_central_index.py +0 -0
  205. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_churn.py +0 -0
  206. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_ci_status.py +0 -0
  207. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_citation_resolve.py +0 -0
  208. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_claim_extract.py +0 -0
  209. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_claim_ttl.py +0 -0
  210. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_claims_lint.py +0 -0
  211. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_cli_ergonomics.py +0 -0
  212. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_cli_loop.py +0 -0
  213. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_cli_pickable_enumerate.py +0 -0
  214. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_cmd_status.py +0 -0
  215. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_commit_audit.py +0 -0
  216. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_completion.py +0 -0
  217. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_concurrency_class.py +0 -0
  218. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_config_lint.py +0 -0
  219. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_cooldown.py +0 -0
  220. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_coverage.py +0 -0
  221. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_dangling_intent.py +0 -0
  222. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_data_class.py +0 -0
  223. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_decisions.py +0 -0
  224. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_design_doc_plan_source.py +0 -0
  225. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_dispatch_loop_substrate.py +0 -0
  226. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_dispatch_top.py +0 -0
  227. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_docs_version_drift.py +0 -0
  228. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_doctor_json.py +0 -0
  229. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_dos_react_terminal_error.py +0 -0
  230. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_drivers_self_improve.py +0 -0
  231. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_drivers_supervisor.py +0 -0
  232. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_drivers_watchdog.py +0 -0
  233. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_drivers_workshop.py +0 -0
  234. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_durable_schema.py +0 -0
  235. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_effect_witness.py +0 -0
  236. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_efficiency.py +0 -0
  237. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_enforce.py +0 -0
  238. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_ensure_home.py +0 -0
  239. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_enterpriseops_harness.py +0 -0
  240. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_enumerate.py +0 -0
  241. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_env_print.py +0 -0
  242. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_event_severity.py +0 -0
  243. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_evidence.py +0 -0
  244. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_exec_capability.py +0 -0
  245. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_export_cli.py +0 -0
  246. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_export_cursor.py +0 -0
  247. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_export_otlp.py +0 -0
  248. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_export_statsd.py +0 -0
  249. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_exporter.py +0 -0
  250. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_feasibility_split.py +0 -0
  251. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_filelock.py +0 -0
  252. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_filepath_backstop_batch.py +0 -0
  253. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_firing_label.py +0 -0
  254. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_fleet_framework_examples.py +0 -0
  255. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_fleet_roll.py +0 -0
  256. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_gate_cli.py +0 -0
  257. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_gh4_coverage.py +0 -0
  258. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_git_hygiene.py +0 -0
  259. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_go_hook_parity.py +0 -0
  260. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_guard.py +0 -0
  261. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_health.py +0 -0
  262. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_help_summary.py +0 -0
  263. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hermes_integration_example.py +0 -0
  264. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_home_layering.py +0 -0
  265. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_home_no_temp_pollution.py +0 -0
  266. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_binaries_bundled.py +0 -0
  267. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_binary_locator.py +0 -0
  268. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_dialect.py +0 -0
  269. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_exit.py +0 -0
  270. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_pretool.py +0 -0
  271. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_stop.py +0 -0
  272. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_id_alloc.py +0 -0
  273. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_improve.py +0 -0
  274. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_init_hooks.py +0 -0
  275. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_init_hooks_crossvendor.py +0 -0
  276. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_init_skills.py +0 -0
  277. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_install_drift.py +0 -0
  278. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_install_levels.py +0 -0
  279. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_intent_ledger.py +0 -0
  280. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_interpret_parity.py +0 -0
  281. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_intervention.py +0 -0
  282. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_intervention_cli.py +0 -0
  283. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_intervention_eval.py +0 -0
  284. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_journal_delta.py +0 -0
  285. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_judge.py +0 -0
  286. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_judge_eval.py +0 -0
  287. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_judges.py +0 -0
  288. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_adopt.py +0 -0
  289. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_halt.py +0 -0
  290. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_infer.py +0 -0
  291. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_journal.py +0 -0
  292. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_lease.py +0 -0
  293. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_lease_expiry.py +0 -0
  294. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_lease_mutex.py +0 -0
  295. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_overlap.py +0 -0
  296. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_leak_scan.py +0 -0
  297. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lease_health.py +0 -0
  298. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lifecycle.py +0 -0
  299. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_liveness.py +0 -0
  300. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_llm_judge_vendor_seam.py +0 -0
  301. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lock_modes.py +0 -0
  302. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_log_source.py +0 -0
  303. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_marker_gate.py +0 -0
  304. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_marker_sensor.py +0 -0
  305. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_mcp_server.py +0 -0
  306. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_memory_recall.py +0 -0
  307. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_noop_streak.py +0 -0
  308. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_notify.py +0 -0
  309. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_notify_cli.py +0 -0
  310. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_notify_slack.py +0 -0
  311. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_notify_webhook.py +0 -0
  312. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_observe.py +0 -0
  313. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_operator_judge.py +0 -0
  314. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_oracle_and_loop.py +0 -0
  315. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_oracle_forgeability_provenance.py +0 -0
  316. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_oracle_grep_in_process.py +0 -0
  317. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_overlap_policy.py +0 -0
  318. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_packet_sidecar.py +0 -0
  319. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_phase_labels.py +0 -0
  320. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_pick_priority.py +0 -0
  321. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_pickable.py +0 -0
  322. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_plan_board.py +0 -0
  323. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_plan_source.py +0 -0
  324. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_plugin_manifest.py +0 -0
  325. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_posttool_sensor.py +0 -0
  326. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_precursor_gate.py +0 -0
  327. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_precursor_gate_eval.py +0 -0
  328. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_preflight_sidecar.py +0 -0
  329. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_proc_delta.py +0 -0
  330. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_productivity.py +0 -0
  331. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_breaker.py +0 -0
  332. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_cooldown.py +0 -0
  333. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_efficiency.py +0 -0
  334. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_install_wrappers.py +0 -0
  335. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_overlap_soundness.py +0 -0
  336. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_productivity.py +0 -0
  337. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_reconcile.py +0 -0
  338. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_reward_nonforgeability.py +0 -0
  339. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_tree.py +0 -0
  340. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_provider_limit.py +0 -0
  341. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_readme_assembly.py +0 -0
  342. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_reconcile.py +0 -0
  343. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_recurring_wedge.py +0 -0
  344. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_refusal_and_tokens.py +0 -0
  345. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_reindex.py +0 -0
  346. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_release_bump.py +0 -0
  347. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_render.py +0 -0
  348. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_replan_skip.py +0 -0
  349. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_result_state.py +0 -0
  350. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_resume_cli.py +0 -0
  351. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_resume_evidence.py +0 -0
  352. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_resume_reachability.py +0 -0
  353. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_retention.py +0 -0
  354. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_reward.py +0 -0
  355. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_rewind.py +0 -0
  356. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_rewind_cli.py +0 -0
  357. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_scope.py +0 -0
  358. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_scope_gate.py +0 -0
  359. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_scope_gate_cli.py +0 -0
  360. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_scope_source.py +0 -0
  361. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_scout.py +0 -0
  362. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_selfmodify_hook_probe.py +0 -0
  363. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_sibling_scan.py +0 -0
  364. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_similarity_judge.py +0 -0
  365. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_skill_pack_dispatch.py +0 -0
  366. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_skill_pack_generic.py +0 -0
  367. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_skill_pack_litmus.py +0 -0
  368. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_skill_pack_operator_tier.py +0 -0
  369. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_skill_pack_replan.py +0 -0
  370. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stall_sim.py +0 -0
  371. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stamp_convention.py +0 -0
  372. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stamp_doctor.py +0 -0
  373. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stamp_filepath_rung.py +0 -0
  374. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stamp_trailer.py +0 -0
  375. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_state_diff.py +0 -0
  376. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_state_health.py +0 -0
  377. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_state_health_doctor.py +0 -0
  378. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_state_home.py +0 -0
  379. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_status_digest.py +0 -0
  380. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stop_policy.py +0 -0
  381. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_subprocess_stdin_hygiene.py +0 -0
  382. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_supervise.py +0 -0
  383. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_testwitness.py +0 -0
  384. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_timeline_timing.py +0 -0
  385. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_tool_stream.py +0 -0
  386. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_tool_stream_cli.py +0 -0
  387. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_toolathlon_live_adapter.py +0 -0
  388. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_toolathlon_replay.py +0 -0
  389. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_toolathlon_rewind_ceiling.py +0 -0
  390. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_trace.py +0 -0
  391. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_trajectory_audit.py +0 -0
  392. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_vendor_agnostic_kernel.py +0 -0
  393. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verdict_cli.py +0 -0
  394. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verdict_contract.py +0 -0
  395. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verdict_journal.py +0 -0
  396. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verdict_rollup.py +0 -0
  397. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verdicts.py +0 -0
  398. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verify_color.py +0 -0
  399. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verify_demo_contract.py +0 -0
  400. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verify_no_plan.py +0 -0
  401. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verify_non_git_rung.py +0 -0
  402. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verify_plugin_install.py +0 -0
  403. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_workflow_yaml_parses.py +0 -0
  404. {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_workspace_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dos-kernel
3
- Version: 0.23.4
3
+ Version: 0.24.1
4
4
  Summary: Dispatch Operating System — the domain-free trust substrate for fleets of autonomous agents (verdict spine, ship oracle, structured refusal, lane arbiter, correlation spine).
5
5
  Author: Anthony Chaudhary
6
6
  License: MIT
@@ -96,7 +96,7 @@ zero config, and the only thing you ever install is one small Python package.
96
96
  > ⏱️ **Want to try it right now?** Jump to **[Try it in 60 seconds](#try-it-in-60-seconds)**
97
97
  > — one command, real output, then come back for the why.
98
98
 
99
- <sub>**v0.23.4** · 3900+ tests · CI: Python 3.11–3.13 on Linux + a Windows 3.13
99
+ <sub>**v0.24.1** · 3900+ tests · CI: Python 3.11–3.13 on Linux + a Windows 3.13
100
100
  smoke run · the only runtime dependency is **PyYAML** · **MIT**.</sub>
101
101
 
102
102
  > 🧭 **Want it in plain words first?** What DOS is, what it catches, and what
@@ -111,6 +111,13 @@ smoke run · the only runtime dependency is **PyYAML** · **MIT**.</sub>
111
111
  > your work, the ~5 files actually worth reading, and the architecture rules a
112
112
  > change must satisfy.
113
113
 
114
+ > 🔤 **Five words the rest of this page leans on.** A **plan** is a named goal
115
+ > (`AUTH`); a **phase** is one shippable step of it (`AUTH1`); a **lane** is the
116
+ > slice of the file tree one agent may touch; the **oracle** is the part of DOS
117
+ > that reads the evidence and rules; a **stamp** is the mark a shipped phase
118
+ > leaves in a commit subject (`AUTH1: …`) — the thing the oracle greps for.
119
+ > That's the whole vocabulary.
120
+
114
121
  <a id="who-this-is-for"></a>
115
122
 
116
123
  ## Who this is for
@@ -209,8 +216,8 @@ echo 'def login(): ...' > login.py
209
216
  git add -A
210
217
  git commit -m "AUTH1: ship the login endpoint" # stamp AUTH1 shipped: <PHASE-ID>: <message>
211
218
 
212
- dos verify --workspace . AUTH AUTH1 # → SHIPPED AUTH AUTH1 e389e8b (via grep-subject) exit 0
213
- dos verify --workspace . AUTH AUTH2 # → NOT_SHIPPED AUTH AUTH2 (via none) exit 1
219
+ dos verify --workspace . AUTH AUTH1 # → SHIPPED AUTH AUTH1 <your-sha> (via grep-subject) exit 0
220
+ dos verify --workspace . AUTH AUTH2 # → NOT_SHIPPED AUTH AUTH2 (via none) exit 1
214
221
  ```
215
222
 
216
223
  An agent can claim `AUTH2` is done all day long; `verify` just reports what the
@@ -593,12 +600,15 @@ reads (wire it in `cli-config.yaml`). A new host's dialect is a driver, never a
593
600
  kernel edit.
594
601
 
595
602
  The flip side of that honesty: a host with **no** hook seam gets **no** dialect.
596
- ByteDance's **Trae** was proved out and has no hook system at all (no lifecycle
597
- events, no deny/allow stdout contract), so DOS binds to it advisory-only — the
598
- MCP server in `.trae/mcp.json`, a verify-before-"done" rule in
599
- `.trae/rules/project_rules.md`, the generic skills in `.trae/skills/`and
600
- `dos init --hooks trae` fails loud rather than writing config Trae would never
601
- read ([docs/294](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/294_trae-advisory-only-the-host-with-no-hook-seam.md)).
603
+ ByteDance's **Trae** was proved out and ships no user-scriptable hook system in
604
+ its personal/international editions (no lifecycle events, no deny/allow stdout
605
+ contract; its CN-enterprise edition announced one on 2026-06-09 with no
606
+ published grammar yet), so DOS binds to it advisory-only the MCP server in
607
+ `.trae/mcp.json` (read alike by IDE-mode Agent, SOLO mode, and TRAE CLI), a
608
+ verify-before-"done" rule in `.trae/rules/project_rules.md`, the generic
609
+ skills in `.trae/skills/` — and `dos init --hooks trae` fails loud rather than
610
+ writing config Trae would never read
611
+ ([docs/294](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/294_trae-advisory-only-the-host-with-no-hook-seam.md)).
602
612
  An invented envelope would be fake enforcement, which is the exact failure the
603
613
  dialect seam exists to prevent.
604
614
 
@@ -688,14 +698,14 @@ channel, upgrade/uninstall, WSL, troubleshooting) is in
688
698
  **[docs/INSTALL.md](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/INSTALL.md)**:
689
699
 
690
700
  ```bash
691
- # uv — the modern, fast, isolated CLI install (recommended):
692
- uv tool install dos-kernel # `dos` + `dos-mcp` on PATH
693
- uvx --from dos-kernel dos doctor # or run it once, ephemerally
694
-
695
- # pip — the library-consumer path (a host pins dos-kernel in its own venv):
701
+ # pip — the default (the line the 60-second demo ran; also how a host pins it):
696
702
  pip install dos-kernel # core kernel (PyYAML only)
697
703
  pip install "dos-kernel[mcp]" # + the MCP server (dos-mcp)
698
704
 
705
+ # uv — the isolated CLI install (keeps `dos` + `dos-mcp` off your project venv):
706
+ uv tool install dos-kernel # `dos` + `dos-mcp` on PATH
707
+ uvx --from dos-kernel dos doctor # or run it once, ephemerally
708
+
699
709
  # from a clone — editable, the contributor path (tracking unreleased master:
700
710
  # pip install "dos-kernel @ git+https://github.com/anthony-chaudhary/dos-kernel", no clone needed):
701
711
  git clone https://github.com/anthony-chaudhary/dos-kernel.git && cd dos-kernel
@@ -709,10 +719,12 @@ pip install -e . # editable: your edits are live in the install
709
719
  > `[mcp]` extra adds the MCP framework; `[tui]` adds the live `dos top` screens).
710
720
  > See [SECURITY.md](https://github.com/anthony-chaudhary/dos-kernel/blob/master/SECURITY.md), "Supply chain."
711
721
 
712
- Prefer a package manager? **uv** is the 2026 defaultfaster than `pipx`,
713
- isolates the tool, and manages Python versions; `pipx install dos-kernel` works
714
- the same way if your team already uses it. Homebrew / WinGet / Scoop one-liners
715
- are next on the release runway (see [docs/INSTALL.md](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/INSTALL.md)).
722
+ `pip install dos-kernel` is the whole installif it worked in the demo,
723
+ you're done here. The other rows exist for how *your* team works: **uv** if you
724
+ want the CLI isolated from your project venv (faster than `pipx`, manages
725
+ Python versions; `pipx install dos-kernel` works the same way), the clone if
726
+ you're contributing. Homebrew / WinGet / Scoop one-liners are next on the
727
+ release runway (see [docs/INSTALL.md](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/INSTALL.md)).
716
728
 
717
729
  A host repo adds DOS as a pinned dependency and points it at its own tree — never
718
730
  by vendoring the code in. DOS is stateless about which repo it serves: it
@@ -1095,3 +1107,8 @@ preparation. Until the arXiv ID lands, cite the repository:
1095
1107
  ## License
1096
1108
 
1097
1109
  MIT — see [LICENSE](https://github.com/anthony-chaudhary/dos-kernel/blob/master/LICENSE).
1110
+
1111
+ <!-- The marker below is the official MCP Registry's PyPI ownership proof: the
1112
+ registry only accepts a server.json naming the `dos-kernel` PyPI package if
1113
+ this exact token appears in the published package README. Keep it intact. -->
1114
+ <!-- mcp-name: io.github.anthony-chaudhary/dos-kernel -->
@@ -47,7 +47,7 @@ zero config, and the only thing you ever install is one small Python package.
47
47
  > ⏱️ **Want to try it right now?** Jump to **[Try it in 60 seconds](#try-it-in-60-seconds)**
48
48
  > — one command, real output, then come back for the why.
49
49
 
50
- <sub>**v0.23.4** · 3900+ tests · CI: Python 3.11–3.13 on Linux + a Windows 3.13
50
+ <sub>**v0.24.1** · 3900+ tests · CI: Python 3.11–3.13 on Linux + a Windows 3.13
51
51
  smoke run · the only runtime dependency is **PyYAML** · **MIT**.</sub>
52
52
 
53
53
  > 🧭 **Want it in plain words first?** What DOS is, what it catches, and what
@@ -62,6 +62,13 @@ smoke run · the only runtime dependency is **PyYAML** · **MIT**.</sub>
62
62
  > your work, the ~5 files actually worth reading, and the architecture rules a
63
63
  > change must satisfy.
64
64
 
65
+ > 🔤 **Five words the rest of this page leans on.** A **plan** is a named goal
66
+ > (`AUTH`); a **phase** is one shippable step of it (`AUTH1`); a **lane** is the
67
+ > slice of the file tree one agent may touch; the **oracle** is the part of DOS
68
+ > that reads the evidence and rules; a **stamp** is the mark a shipped phase
69
+ > leaves in a commit subject (`AUTH1: …`) — the thing the oracle greps for.
70
+ > That's the whole vocabulary.
71
+
65
72
  <a id="who-this-is-for"></a>
66
73
 
67
74
  ## Who this is for
@@ -160,8 +167,8 @@ echo 'def login(): ...' > login.py
160
167
  git add -A
161
168
  git commit -m "AUTH1: ship the login endpoint" # stamp AUTH1 shipped: <PHASE-ID>: <message>
162
169
 
163
- dos verify --workspace . AUTH AUTH1 # → SHIPPED AUTH AUTH1 e389e8b (via grep-subject) exit 0
164
- dos verify --workspace . AUTH AUTH2 # → NOT_SHIPPED AUTH AUTH2 (via none) exit 1
170
+ dos verify --workspace . AUTH AUTH1 # → SHIPPED AUTH AUTH1 <your-sha> (via grep-subject) exit 0
171
+ dos verify --workspace . AUTH AUTH2 # → NOT_SHIPPED AUTH AUTH2 (via none) exit 1
165
172
  ```
166
173
 
167
174
  An agent can claim `AUTH2` is done all day long; `verify` just reports what the
@@ -544,12 +551,15 @@ reads (wire it in `cli-config.yaml`). A new host's dialect is a driver, never a
544
551
  kernel edit.
545
552
 
546
553
  The flip side of that honesty: a host with **no** hook seam gets **no** dialect.
547
- ByteDance's **Trae** was proved out and has no hook system at all (no lifecycle
548
- events, no deny/allow stdout contract), so DOS binds to it advisory-only — the
549
- MCP server in `.trae/mcp.json`, a verify-before-"done" rule in
550
- `.trae/rules/project_rules.md`, the generic skills in `.trae/skills/`and
551
- `dos init --hooks trae` fails loud rather than writing config Trae would never
552
- read ([docs/294](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/294_trae-advisory-only-the-host-with-no-hook-seam.md)).
554
+ ByteDance's **Trae** was proved out and ships no user-scriptable hook system in
555
+ its personal/international editions (no lifecycle events, no deny/allow stdout
556
+ contract; its CN-enterprise edition announced one on 2026-06-09 with no
557
+ published grammar yet), so DOS binds to it advisory-only the MCP server in
558
+ `.trae/mcp.json` (read alike by IDE-mode Agent, SOLO mode, and TRAE CLI), a
559
+ verify-before-"done" rule in `.trae/rules/project_rules.md`, the generic
560
+ skills in `.trae/skills/` — and `dos init --hooks trae` fails loud rather than
561
+ writing config Trae would never read
562
+ ([docs/294](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/294_trae-advisory-only-the-host-with-no-hook-seam.md)).
553
563
  An invented envelope would be fake enforcement, which is the exact failure the
554
564
  dialect seam exists to prevent.
555
565
 
@@ -639,14 +649,14 @@ channel, upgrade/uninstall, WSL, troubleshooting) is in
639
649
  **[docs/INSTALL.md](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/INSTALL.md)**:
640
650
 
641
651
  ```bash
642
- # uv — the modern, fast, isolated CLI install (recommended):
643
- uv tool install dos-kernel # `dos` + `dos-mcp` on PATH
644
- uvx --from dos-kernel dos doctor # or run it once, ephemerally
645
-
646
- # pip — the library-consumer path (a host pins dos-kernel in its own venv):
652
+ # pip — the default (the line the 60-second demo ran; also how a host pins it):
647
653
  pip install dos-kernel # core kernel (PyYAML only)
648
654
  pip install "dos-kernel[mcp]" # + the MCP server (dos-mcp)
649
655
 
656
+ # uv — the isolated CLI install (keeps `dos` + `dos-mcp` off your project venv):
657
+ uv tool install dos-kernel # `dos` + `dos-mcp` on PATH
658
+ uvx --from dos-kernel dos doctor # or run it once, ephemerally
659
+
650
660
  # from a clone — editable, the contributor path (tracking unreleased master:
651
661
  # pip install "dos-kernel @ git+https://github.com/anthony-chaudhary/dos-kernel", no clone needed):
652
662
  git clone https://github.com/anthony-chaudhary/dos-kernel.git && cd dos-kernel
@@ -660,10 +670,12 @@ pip install -e . # editable: your edits are live in the install
660
670
  > `[mcp]` extra adds the MCP framework; `[tui]` adds the live `dos top` screens).
661
671
  > See [SECURITY.md](https://github.com/anthony-chaudhary/dos-kernel/blob/master/SECURITY.md), "Supply chain."
662
672
 
663
- Prefer a package manager? **uv** is the 2026 defaultfaster than `pipx`,
664
- isolates the tool, and manages Python versions; `pipx install dos-kernel` works
665
- the same way if your team already uses it. Homebrew / WinGet / Scoop one-liners
666
- are next on the release runway (see [docs/INSTALL.md](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/INSTALL.md)).
673
+ `pip install dos-kernel` is the whole installif it worked in the demo,
674
+ you're done here. The other rows exist for how *your* team works: **uv** if you
675
+ want the CLI isolated from your project venv (faster than `pipx`, manages
676
+ Python versions; `pipx install dos-kernel` works the same way), the clone if
677
+ you're contributing. Homebrew / WinGet / Scoop one-liners are next on the
678
+ release runway (see [docs/INSTALL.md](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/INSTALL.md)).
667
679
 
668
680
  A host repo adds DOS as a pinned dependency and points it at its own tree — never
669
681
  by vendoring the code in. DOS is stateless about which repo it serves: it
@@ -1046,3 +1058,8 @@ preparation. Until the arXiv ID lands, cite the repository:
1046
1058
  ## License
1047
1059
 
1048
1060
  MIT — see [LICENSE](https://github.com/anthony-chaudhary/dos-kernel/blob/master/LICENSE).
1061
+
1062
+ <!-- The marker below is the official MCP Registry's PyPI ownership proof: the
1063
+ registry only accepts a server.json naming the `dos-kernel` PyPI package if
1064
+ this exact token appears in the published package README. Keep it intact. -->
1065
+ <!-- mcp-name: io.github.anthony-chaudhary/dos-kernel -->
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
9
9
  # src/), and the console scripts stay `dos` / `dos-mcp` — only the pip-install /
10
10
  # dependency-pin name is `dos-kernel`. See SECURITY.md "Supply chain".
11
11
  name = "dos-kernel"
12
- version = "0.23.4"
12
+ version = "0.24.1"
13
13
  description = "Dispatch Operating System — the domain-free trust substrate for fleets of autonomous agents (verdict spine, ship oracle, structured refusal, lane arbiter, correlation spine)."
14
14
  # The PyPI project page renders this. Point it at the README so the page isn't
15
15
  # blank below the metadata (twine warns when it's missing). PyPI resolves
@@ -136,6 +136,12 @@ dos = "dos.cli:main"
136
136
  # launches. Requires the `mcp` extra (`pip install dos-kernel[mcp]`); the import
137
137
  # of `mcp.server.fastmcp` fails loudly with an install hint if the extra is absent.
138
138
  dos-mcp = "dos_mcp.server:main"
139
+ # A dist-name alias for the SAME server, so the uvx convention works: `uvx
140
+ # "dos-kernel[mcp]"` runs the script named after the package (and the MCP
141
+ # Registry's `uvx --from "dos-kernel[mcp]==X.Y.Z" dos-kernel` launch composes to
142
+ # a real command — see server.json). Without the [mcp] extra it fails loudly
143
+ # with the same install hint as `dos-mcp`. The umbrella CLI stays `dos`.
144
+ dos-kernel = "dos_mcp.server:main"
139
145
 
140
146
  # The shipped LLM judge — the reference occupant of the JUDGE rung (`dos.judges`,
141
147
  # Axis 6). Registered as a discoverable judge (NOT a built-in: only `abstain` is
@@ -46,7 +46,7 @@ try:
46
46
 
47
47
  __version__ = _pkg_version("dos-kernel")
48
48
  except Exception: # pragma: no cover - source-tree / not-installed fallback
49
- __version__ = "0.23.4"
49
+ __version__ = "0.24.1"
50
50
 
51
51
  from dos import config # noqa: F401 (re-export the seam as the package entry)
52
52
  from dos.config import ( # noqa: F401
@@ -59,6 +59,7 @@ import dataclasses
59
59
  import json
60
60
  import os
61
61
  import sys
62
+ import time
62
63
  from pathlib import Path
63
64
  from typing import Any
64
65
 
@@ -3152,6 +3153,53 @@ def cmd_lease_lane(args: argparse.Namespace) -> int:
3152
3153
  return 0 if d.outcome == "acquire" else 1
3153
3154
 
3154
3155
 
3156
+ # ---------------------------------------------------------------------------
3157
+ # override (docs/296 — the operator's SELF_MODIFY override window: report or
3158
+ # disarm, NEVER arm. Arming is the operator's hand on the arm file by design —
3159
+ # any verb an agent's shell can call is an arming path an agent can take, so
3160
+ # the asymmetry IS the security property: anyone may disarm, only the human
3161
+ # arms. `status` exit code is the state: 0 armed / 1 disarmed-or-expired.)
3162
+ # ---------------------------------------------------------------------------
3163
+ def cmd_override(args: argparse.Namespace) -> int:
3164
+ _apply_workspace(args)
3165
+ from dos import override_facts as _ovr
3166
+ import datetime as _dt
3167
+ cfg = _config.active()
3168
+ p = _ovr.arm_path(cfg.paths.root)
3169
+
3170
+ if args.override_cmd == "disarm":
3171
+ # Always safe, for anyone — lowering the window can only restore the deny.
3172
+ existed = p.exists()
3173
+ if existed:
3174
+ try:
3175
+ p.unlink()
3176
+ except OSError as e:
3177
+ print(f"error: could not remove the arm file ({e})", file=sys.stderr)
3178
+ return 2
3179
+ print(json.dumps({"disarmed": existed, "path": str(p)}, sort_keys=True))
3180
+ return 0
3181
+
3182
+ # status
3183
+ facts = _ovr.read_override(cfg.paths.root)
3184
+ now = _dt.datetime.now(_dt.timezone.utc)
3185
+ if facts is None:
3186
+ print(json.dumps({"armed": False, "path": str(p),
3187
+ "note": "no valid arm file — the SELF_MODIFY deny "
3188
+ "stands (docs/296; arming is by hand)"},
3189
+ sort_keys=True))
3190
+ return 1
3191
+ armed = now <= facts.until
3192
+ print(json.dumps({
3193
+ "armed": armed,
3194
+ "expired": not armed,
3195
+ "until": facts.until.isoformat(),
3196
+ "reason": facts.reason,
3197
+ "scope": list(facts.scope),
3198
+ "path": str(p),
3199
+ }, sort_keys=True))
3200
+ return 0 if armed else 1
3201
+
3202
+
3155
3203
  # ---------------------------------------------------------------------------
3156
3204
  # halt (docs/99 — record a STOP DECISION for an in-flight run + propose the
3157
3205
  # (full prose: docs/CLI.md § "halt (docs/99 — record a STOP DECISION for an in-flight run")
@@ -3290,6 +3338,33 @@ def cmd_guard(args: argparse.Namespace) -> int:
3290
3338
  # ---------------------------------------------------------------------------
3291
3339
  # hook stop (the verify-on-stop binding — docs/134 §2/§2.2)
3292
3340
  # ---------------------------------------------------------------------------
3341
+ def _record_hook_observation(cfg, *, verb: str, outcome: str, started: float,
3342
+ debug: bool = False, **fields) -> None:
3343
+ """Append one `hook-observation` record for a DECIDED hook call (docs/297 P3).
3344
+
3345
+ The Python hook verbs' half of the kernel-owned observation contract
3346
+ (`dos.hook_observation`) — the second conforming writer beside the native
3347
+ binary. Called only AFTER a verb has decided + emitted, with the
3348
+ `time.monotonic()` the verb captured at entry, so telemetry stays strictly
3349
+ downstream of the decision (docs/99). The native-served path never reaches
3350
+ this (the binary already recorded its own observation); a DELEGATED call
3351
+ does — its record is the call's real verdict, which is exactly what the
3352
+ docs/297 denominator rule pairs with the binary's `delegate` handoff row.
3353
+ Fail-soft by construction: any fault is swallowed, so a telemetry write can
3354
+ never change a verdict, a dialect, or an exit code.
3355
+ """
3356
+ try:
3357
+ from dos import hook_observation as _hobs
3358
+ entry = _hobs.observation_entry(
3359
+ verb, outcome,
3360
+ latency_ms=round((time.monotonic() - started) * 1000.0, 3),
3361
+ run_id=os.environ.get("CID_RUN_ID", "") or "",
3362
+ **fields)
3363
+ _hobs.append(entry, cfg=cfg, debug=debug)
3364
+ except Exception: # noqa: BLE001 — telemetry is advisory, never load-bearing
3365
+ return
3366
+
3367
+
3293
3368
  def cmd_hook_stop(args: argparse.Namespace) -> int:
3294
3369
  """A `Stop`/`SubagentStop` hook: refuse to let an agent stop on a false done.
3295
3370
 
@@ -3297,6 +3372,8 @@ def cmd_hook_stop(args: argparse.Namespace) -> int:
3297
3372
  """
3298
3373
  from dos import claim_extract
3299
3374
 
3375
+ started = time.monotonic()
3376
+
3300
3377
  # 1. Read the hook event from stdin (the host's contract). Any failure → let
3301
3378
  # the agent stop (we never block on our own inability to read).
3302
3379
  event: dict = {}
@@ -3380,6 +3457,8 @@ def cmd_hook_stop(args: argparse.Namespace) -> int:
3380
3457
  # Nothing the agent confidently claimed → nothing to check. Let it stop.
3381
3458
  _emit_help_digest(event, cfg=_config.active(), args=args)
3382
3459
  _emit(blocked=False, results=[], checked=0)
3460
+ _record_hook_observation(_config.active(), verb="stop", outcome="no-claims",
3461
+ started=started, debug=bool(getattr(args, "debug", False)))
3383
3462
  return 0
3384
3463
 
3385
3464
  # 5. Verify each claim against git (the truth syscall). Block on a NOT_SHIPPED
@@ -3410,11 +3489,20 @@ def cmd_hook_stop(args: argparse.Namespace) -> int:
3410
3489
  f"(with the ship-stamp grammar) or correct the claim before stopping."
3411
3490
  )
3412
3491
  _emit(blocked=True, reason=reason, results=results)
3492
+ _record_hook_observation(cfg, verb="stop", outcome="block", started=started,
3493
+ debug=bool(getattr(args, "debug", False)),
3494
+ claims_seen=len(claims),
3495
+ verify_source=str(failures[0].get("source") or ""),
3496
+ blocked_plan=str(failures[0].get("plan") or ""),
3497
+ blocked_phase=str(failures[0].get("phase") or ""))
3413
3498
  return 0 # exit 0 + {"decision":"block"} is CC's "keep working" signal
3414
3499
 
3415
3500
  # Every actionable claim verified. Let the agent stop.
3416
3501
  _emit_help_digest(event, cfg=cfg, args=args)
3417
3502
  _emit(blocked=False, results=results, checked=len(results))
3503
+ _record_hook_observation(cfg, verb="stop", outcome="all-verified", started=started,
3504
+ debug=bool(getattr(args, "debug", False)),
3505
+ claims_seen=len(claims))
3418
3506
  return 0
3419
3507
 
3420
3508
 
@@ -3462,6 +3550,7 @@ def cmd_hook_marker(args: argparse.Namespace) -> int:
3462
3550
  from dos import marker_gate as _mg
3463
3551
  from dos import marker_sensor as _ms
3464
3552
 
3553
+ started = time.monotonic()
3465
3554
  debug = bool(getattr(args, "debug", False))
3466
3555
 
3467
3556
  def _dbg(msg: str) -> None:
@@ -3549,6 +3638,14 @@ def cmd_hook_marker(args: argparse.Namespace) -> int:
3549
3638
  _dbg(f"emitted={emitted} max={cap} allow={decision.allow} "
3550
3639
  f"reason={budget_reason} ({arm.reason})")
3551
3640
 
3641
+ # docs/297 P3: one observation per ARMED budget decision (an unarmed ordinary
3642
+ # turn reached no verdict — nothing to record). Downstream of the classify;
3643
+ # the emission below follows deterministically from `decision.allow`.
3644
+ _record_hook_observation(cfg, verb="marker",
3645
+ outcome="allow" if decision.allow else "refuse",
3646
+ started=started, debug=debug,
3647
+ marker_count=decision.noop_turns, max_markers=cap)
3648
+
3552
3649
  if args.json:
3553
3650
  # A machine-readable surface for tooling / non-CC hosts — never the bytes CC
3554
3651
  # reads. Mirrors `cmd_hook_stop --json`.
@@ -3598,6 +3695,7 @@ def cmd_hook_posttool(args: argparse.Namespace) -> int:
3598
3695
  """
3599
3696
  from dos import posttool_sensor as _pts
3600
3697
 
3698
+ started = time.monotonic()
3601
3699
  debug = bool(getattr(args, "debug", False))
3602
3700
 
3603
3701
  def _dbg(msg: str) -> None:
@@ -3688,6 +3786,7 @@ def cmd_hook_posttool(args: argparse.Namespace) -> int:
3688
3786
  _dbg(f"verdict={verdict.state} repeat_run={verdict.repeat_run} "
3689
3787
  f"step_index={step_index} run_id={firing_run_id or '-'} "
3690
3788
  f"warn={'yes' if payload else 'no'}")
3789
+ warn_emitted = False
3691
3790
  if payload is not None:
3692
3791
  # The ONLY thing on stdout: the host's PostToolUse dialect. `warn_payload`
3693
3792
  # (full prose: docs/CLI.md § "The ONLY thing on stdout: the host's PostToolUse dialect. `w")
@@ -3700,6 +3799,11 @@ def cmd_hook_posttool(args: argparse.Namespace) -> int:
3700
3799
  host_dialect = None
3701
3800
  if host_dialect is not None:
3702
3801
  print(json.dumps(host_dialect, sort_keys=True))
3802
+ warn_emitted = True
3803
+ _record_hook_observation(cfg, verb="posttool",
3804
+ outcome="warn" if warn_emitted else "passthrough",
3805
+ started=started, debug=debug,
3806
+ stream_state=verdict.state.value)
3703
3807
  return 0
3704
3808
 
3705
3809
 
@@ -3710,6 +3814,7 @@ def cmd_hook_pretool(args: argparse.Namespace) -> int:
3710
3814
  """
3711
3815
  from dos import pretool_sensor as _prt
3712
3816
 
3817
+ started = time.monotonic()
3713
3818
  debug = bool(getattr(args, "debug", False))
3714
3819
 
3715
3820
  def _dbg(msg: str) -> None:
@@ -3810,6 +3915,20 @@ def cmd_hook_pretool(args: argparse.Namespace) -> int:
3810
3915
  host_dialect = None
3811
3916
  if host_dialect is not None:
3812
3917
  print(json.dumps(host_dialect, sort_keys=True))
3918
+
3919
+ # 7. docs/297 P3: one observation per decided call — THE denominator record
3920
+ # (one pretool record = one tool call adjudicated). On the native fast path
3921
+ # the binary recorded its own; this is the Python-decided record, including
3922
+ # the call a binary DELEGATED here (the docs/297 pairing). Fail-soft,
3923
+ # strictly downstream of the emitted dialect.
3924
+ from dos.hook_dialect import DEFAULT_DIALECT as _default_dialect
3925
+ _record_hook_observation(cfg, verb="pretool", outcome=str(decision),
3926
+ started=started, debug=debug,
3927
+ rung=str(outcome.get("rung") or ""),
3928
+ reason_class=str(outcome.get("reason_class") or ""),
3929
+ dialect=str(getattr(args, "dialect", None) or _default_dialect),
3930
+ tree_known=(bool(outcome["tree_known"])
3931
+ if "tree_known" in outcome else None))
3813
3932
  return 0
3814
3933
 
3815
3934
 
@@ -4915,8 +5034,29 @@ def cmd_helped(args: argparse.Namespace) -> int:
4915
5034
  summary = _help.summarize(records, holder=holder, since=since,
4916
5035
  with_examples=explain or bool(getattr(args, "json", False)))
4917
5036
 
5037
+ # The denominator (docs/297 P2, issue #24): the per-call hook-observation log,
5038
+ # read ONCE at this boundary. Like-for-like only — BOTH sides of the rate come
5039
+ # from that one log; the lane-journal counts above never enter it. Graceful
5040
+ # absence: no log / nothing adjudicated / an unreadable file → rate stays None
5041
+ # and every output below is byte-identical to the rate-less form. A --session
5042
+ # scope also suppresses it (observation records carry no session key, so a
5043
+ # session-scoped rate would silently widen to the whole fleet — dishonest).
5044
+ rate = None
5045
+ if not holder:
5046
+ from dos import hook_observation as _hobs
5047
+ try:
5048
+ folded = _hobs.intervention_rate(
5049
+ _hobs.read_observations(cfg=cfg), since=since)
5050
+ if folded.adjudicated > 0:
5051
+ rate = folded
5052
+ except Exception: # noqa: BLE001 — a rate fold fault degrades to "no rate line"
5053
+ rate = None
5054
+
4918
5055
  if getattr(args, "json", False):
4919
- print(json.dumps(summary.to_dict(), indent=2, default=str))
5056
+ payload = summary.to_dict()
5057
+ if rate is not None:
5058
+ payload["tool_calls"] = rate.to_dict()
5059
+ print(json.dumps(payload, indent=2, default=str))
4920
5060
  return 0
4921
5061
 
4922
5062
  scope = ""
@@ -4927,7 +5067,7 @@ def cmd_helped(args: argparse.Namespace) -> int:
4927
5067
  if explain:
4928
5068
  print(_help.render_explain_text(summary, scope=scope))
4929
5069
  else:
4930
- print(_help.render_summary_text(summary, scope=scope))
5070
+ print(_help.render_summary_text(summary, scope=scope, rate=rate))
4931
5071
  return 0
4932
5072
 
4933
5073
 
@@ -5364,6 +5504,21 @@ def cmd_doctor(args: argparse.Namespace) -> int:
5364
5504
  bound = ", ".join(wired_bits) if wired_bits else "none wired"
5365
5505
  print(f"runtime hooks {bound}"
5366
5506
  + ("" if wired_bits else " (run `dos init --hooks <runtime>` to bind)"))
5507
+ # docs/296 — the operator's SELF_MODIFY override window, made visible: an
5508
+ # armed window changes what the PRE hook will admit, so the report that
5509
+ # answers "what am I configured as?" must show it. Read-only, fail-soft.
5510
+ try:
5511
+ from dos import override_facts as _ovr
5512
+ import datetime as _dt
5513
+ _facts = _ovr.read_override(cfg.paths.root)
5514
+ if _facts is not None and _dt.datetime.now(_dt.timezone.utc) <= _facts.until:
5515
+ _scope = ", ".join(_facts.scope) if _facts.scope else "the whole runtime set"
5516
+ print(f"self-mod override ARMED until {_facts.until.isoformat()} "
5517
+ f"({_facts.reason}) — scope: {_scope}")
5518
+ else:
5519
+ print("self-mod override disarmed")
5520
+ except Exception: # noqa: BLE001 — a report row must never break doctor
5521
+ print("self-mod override disarmed")
5367
5522
  print(f"layout style {cfg.paths.style}")
5368
5523
  # The environment print (docs/115): *under what* this kernel adjudicates. The
5369
5524
  # (full prose: docs/CLI.md § "The environment print (docs/115): *under what* this kernel a")
@@ -7985,6 +8140,23 @@ def build_parser() -> argparse.ArgumentParser:
7985
8140
  lll.add_argument("--pretty", action="store_true")
7986
8141
  pll.set_defaults(func=cmd_lease_lane)
7987
8142
 
8143
+ # override — the operator's SELF_MODIFY override window (docs/296): report
8144
+ # or disarm. Deliberately NO `arm` subcommand — arming is the operator's
8145
+ # hand on `.dos/override/self-modify.toml`, never a verb an agent can call.
8146
+ pov = sub.add_parser(
8147
+ "override",
8148
+ help="the operator's SELF_MODIFY override window: status / disarm "
8149
+ "(arming is by hand — docs/296)")
8150
+ _add_workspace_flags(pov)
8151
+ ovsub = pov.add_subparsers(dest="override_cmd", required=True)
8152
+ ovsub.add_parser(
8153
+ "status",
8154
+ help="report the armed window (exit 0 armed / 1 disarmed-or-expired)")
8155
+ ovsub.add_parser(
8156
+ "disarm",
8157
+ help="delete the arm file — always safe, for anyone (restores the deny)")
8158
+ pov.set_defaults(func=cmd_override)
8159
+
7988
8160
  # halt — record a STOP DECISION for an in-flight run + propose the command
7989
8161
  # (full prose: docs/CLI.md § "halt — record a STOP DECISION for an in-flight run + propose")
7990
8162
  phl = sub.add_parser(
@@ -433,12 +433,39 @@ def nudge_line(summary: HelpSummary) -> str:
433
433
  )
434
434
 
435
435
 
436
- def render_summary_text(summary: HelpSummary, *, scope: str = "") -> str:
436
+ def _rate_lines(rate) -> list[str]:
437
+ """The "of N adjudicated calls" block for an `InterventionRate`, or []. Pure.
438
+
439
+ The docs/297 denominator line. `rate` is a `dos.hook_observation
440
+ .InterventionRate` (duck-typed: `adjudicated`/`passed`/`intervened` + the
441
+ `*_pct` properties) — every number in it came from ONE observation log, by
442
+ construction of that fold. None, or zero adjudicated calls, renders nothing
443
+ at all, so a workspace without an observation log keeps today's bytes. The
444
+ trailing note is the honesty caveat: the rate's log and the catch counts'
445
+ journal have different windows and scopes, so the two never share a number.
446
+ """
447
+ if rate is None or rate.adjudicated <= 0:
448
+ return []
449
+ return [
450
+ "",
451
+ (f" of {rate.adjudicated} tool calls adjudicated by the hooks, "
452
+ f"{rate.passed} passed untouched ({rate.passed_pct:.1f}%) and "
453
+ f"{rate.intervened} were intervened on ({rate.intervened_pct:.1f}%)"),
454
+ (" (from the per-call hook observation log — its window and scope "
455
+ "differ from the catch counts above)"),
456
+ ]
457
+
458
+
459
+ def render_summary_text(summary: HelpSummary, *, scope: str = "",
460
+ rate=None) -> str:
437
461
  """The full `dos helped` operator rollup — headline + breakdowns. Pure.
438
462
 
439
463
  Leads with the headline count, then the by-reason-class and by-tool tables (the
440
464
  "what kind of help, on which tool" an operator wants), and an honest footer
441
465
  noting how many firings were observe-only (recorded but not a behavior-change).
466
+ `rate` (docs/297) is an optional `hook_observation.InterventionRate` — when
467
+ present it adds the self-contained "of N adjudicated calls" block; when None
468
+ (no observation log) the output is byte-identical to the rate-less form.
442
469
  """
443
470
  out: list[str] = []
444
471
  title = "# dos helped"
@@ -465,7 +492,9 @@ def render_summary_text(summary: HelpSummary, *, scope: str = "") -> str:
465
492
  if summary.enforced:
466
493
  out.append(f" ({summary.enforced} enforcement record(s) seen, "
467
494
  f"all observe-only)")
495
+ out.extend(_rate_lines(rate))
468
496
  return "\n".join(out)
497
+ out.extend(_rate_lines(rate))
469
498
  if summary.by_reason:
470
499
  out.append("")
471
500
  out.append(" by reason")