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.
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/PKG-INFO +36 -19
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/README.md +35 -18
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/pyproject.toml +7 -1
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/__init__.py +1 -1
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/cli.py +174 -2
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/help_summary.py +30 -1
- dos_kernel-0.24.1/src/dos/hook_observation.py +338 -0
- dos_kernel-0.24.1/src/dos/override_facts.py +215 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/pretool_sensor.py +55 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/EXAMPLES.md +1 -1
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-dispatch/SKILL.md +33 -1
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-dispatch-loop/SKILL.md +1 -1
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-next-up/SKILL.md +1 -1
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-replan/SKILL.md +18 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-self-improve/SKILL.md +1 -1
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/PKG-INFO +36 -19
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/SOURCES.txt +5 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/entry_points.txt +1 -0
- dos_kernel-0.24.1/tests/test_gitignore_hygiene.py +116 -0
- dos_kernel-0.24.1/tests/test_hook_observation.py +392 -0
- dos_kernel-0.24.1/tests/test_override_window.py +273 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/LICENSE +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/setup.cfg +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/_demo_story.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/_filelock.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/_job_policy.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/_tree.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/admission.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/answer_shape.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/arbiter.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/archive_lock.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/arg_provenance.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/attest.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/breaker.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/churn.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/claim_extract.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/claim_ttl.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/commit_audit.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/completion.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/concurrency_class.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/config.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/config_lint.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/cooldown.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/coverage.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/dangling_intent.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/data_class.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/decisions.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/decisions_tui.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/dispatch_top.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/dispatch_top_tui.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/__init__.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/ci_status.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/citation_resolve.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/decision_stop.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/design_doc_plan.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/export_file.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/export_otlp.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/export_statsd.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/hook_dialects.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/job.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/llm_judge.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/memory_recall.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/notify_slack.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/notify_webhook.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/operator_judge.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/os_acceptance.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/paste_log.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/plan_scope.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/self_improve.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/similarity_judge.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/state_diff.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/supervisor.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/watchdog.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/drivers/workshop.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/durable_schema.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/effect_witness.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/efficiency.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/enforce.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/enumerate.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/env_print.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/event_severity.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/evidence.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/exec_capability.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/export_cursor.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/exporter.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/firing_label.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/fleet_roll.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/gate_classify.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/gh4_coverage.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/git_delta.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/guard.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/health.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/home.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/hook_binary.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/hook_dialect.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/hook_exit.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/hook_install.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/id_alloc.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/improve.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/intent_ledger.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/interpret.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/intervention.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/intervention_eval.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/journal_delta.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/judge_eval.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/judges.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lane_infer.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lane_journal.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lane_lease.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lane_overlap.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lease_health.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lifecycle.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/liveness.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/lock_modes.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/log_source.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/loop_decide.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/marker_gate.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/marker_sensor.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/noop_streak.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/notify.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/observe.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/oracle.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/overlap_eval.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/overlap_policy.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/packet_sidecar.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/phase_shipped.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/pick_priority.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/pickable.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/picker_oracle.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/plan_board.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/plan_board_tui.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/plan_source.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/posttool_sensor.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/precursor_gate.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/precursor_gate_eval.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/preflight.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/proc_delta.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/productivity.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/provider_limit.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/py.typed +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/reason_morphology.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/reasons.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/reconcile.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/recurring_wedge.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/render.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/result_state.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/resume.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/resume_evidence.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/retention.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/reward.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/rewind.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/rewind_evidence.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/rewind_tokens.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/run_id.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/scope.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/scope_source.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/scout.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/self_modify.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/sibling_scan.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-class-cycle/SKILL.md +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-goal-gate/SKILL.md +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-promote/SKILL.md +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-replan-loop/SKILL.md +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-supervise-loop/SKILL.md +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-unstick/SKILL.md +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/skills/dos-witness-claim/SKILL.md +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/stamp.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/state_health.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/status.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/stop_policy.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/supervise.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/testwitness.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/timeline.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/tokens.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/tool_stream.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/tool_stream_eval.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/trace.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/verdict.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/verdict_cli.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/verdict_journal.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/verdict_rollup.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/verdicts.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos/wedge_reason.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/dependency_links.txt +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/requires.txt +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_kernel.egg-info/top_level.txt +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_mcp/__init__.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_mcp/py.typed +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/src/dos_mcp/server.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_admission.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_agent_surface.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_agenthallu_replay.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_agentprocessbench_replay.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_answer_shape.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_arbiter.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_archive_lock.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_arg_provenance.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_attest.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_backflow_ledger.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_bench_layering.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_breaker.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_build_wheels_binary_format.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_canonical_example_lockstep.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_central_index.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_churn.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_ci_status.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_citation_resolve.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_claim_extract.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_claim_ttl.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_claims_lint.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_cli_ergonomics.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_cli_loop.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_cli_pickable_enumerate.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_cmd_status.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_commit_audit.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_completion.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_concurrency_class.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_config_lint.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_cooldown.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_coverage.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_dangling_intent.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_data_class.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_decisions.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_design_doc_plan_source.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_dispatch_loop_substrate.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_dispatch_top.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_docs_version_drift.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_doctor_json.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_dos_react_terminal_error.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_drivers_self_improve.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_drivers_supervisor.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_drivers_watchdog.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_drivers_workshop.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_durable_schema.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_effect_witness.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_efficiency.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_enforce.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_ensure_home.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_enterpriseops_harness.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_enumerate.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_env_print.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_event_severity.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_evidence.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_exec_capability.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_export_cli.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_export_cursor.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_export_otlp.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_export_statsd.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_exporter.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_feasibility_split.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_filelock.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_filepath_backstop_batch.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_firing_label.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_fleet_framework_examples.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_fleet_roll.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_gate_cli.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_gh4_coverage.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_git_hygiene.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_go_hook_parity.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_guard.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_health.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_help_summary.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hermes_integration_example.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_home_layering.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_home_no_temp_pollution.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_binaries_bundled.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_binary_locator.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_dialect.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_exit.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_pretool.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_hook_stop.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_id_alloc.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_improve.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_init_hooks.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_init_hooks_crossvendor.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_init_skills.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_install_drift.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_install_levels.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_intent_ledger.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_interpret_parity.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_intervention.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_intervention_cli.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_intervention_eval.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_journal_delta.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_judge.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_judge_eval.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_judges.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_adopt.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_halt.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_infer.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_journal.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_lease.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_lease_expiry.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_lease_mutex.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lane_overlap.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_leak_scan.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lease_health.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lifecycle.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_liveness.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_llm_judge_vendor_seam.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_lock_modes.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_log_source.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_marker_gate.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_marker_sensor.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_mcp_server.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_memory_recall.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_noop_streak.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_notify.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_notify_cli.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_notify_slack.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_notify_webhook.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_observe.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_operator_judge.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_oracle_and_loop.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_oracle_forgeability_provenance.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_oracle_grep_in_process.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_overlap_policy.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_packet_sidecar.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_phase_labels.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_pick_priority.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_pickable.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_plan_board.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_plan_source.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_plugin_manifest.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_posttool_sensor.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_precursor_gate.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_precursor_gate_eval.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_preflight_sidecar.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_proc_delta.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_productivity.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_breaker.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_cooldown.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_efficiency.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_install_wrappers.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_overlap_soundness.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_productivity.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_reconcile.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_reward_nonforgeability.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_prop_tree.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_provider_limit.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_readme_assembly.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_reconcile.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_recurring_wedge.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_refusal_and_tokens.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_reindex.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_release_bump.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_render.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_replan_skip.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_result_state.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_resume_cli.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_resume_evidence.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_resume_reachability.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_retention.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_reward.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_rewind.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_rewind_cli.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_scope.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_scope_gate.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_scope_gate_cli.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_scope_source.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_scout.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_selfmodify_hook_probe.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_sibling_scan.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_similarity_judge.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_skill_pack_dispatch.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_skill_pack_generic.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_skill_pack_litmus.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_skill_pack_operator_tier.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_skill_pack_replan.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stall_sim.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stamp_convention.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stamp_doctor.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stamp_filepath_rung.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stamp_trailer.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_state_diff.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_state_health.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_state_health_doctor.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_state_home.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_status_digest.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_stop_policy.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_subprocess_stdin_hygiene.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_supervise.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_testwitness.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_timeline_timing.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_tool_stream.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_tool_stream_cli.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_toolathlon_live_adapter.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_toolathlon_replay.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_toolathlon_rewind_ceiling.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_trace.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_trajectory_audit.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_vendor_agnostic_kernel.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verdict_cli.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verdict_contract.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verdict_journal.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verdict_rollup.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verdicts.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verify_color.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verify_demo_contract.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verify_no_plan.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verify_non_git_rung.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_verify_plugin_install.py +0 -0
- {dos_kernel-0.23.4 → dos_kernel-0.24.1}/tests/test_workflow_yaml_parses.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
213
|
-
dos verify --workspace . AUTH AUTH2 # → NOT_SHIPPED AUTH AUTH2
|
|
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
|
|
597
|
-
events, no deny/allow stdout
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
`
|
|
601
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
713
|
-
|
|
714
|
-
the
|
|
715
|
-
|
|
722
|
+
`pip install dos-kernel` is the whole install — if 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.
|
|
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
|
|
164
|
-
dos verify --workspace . AUTH AUTH2 # → NOT_SHIPPED AUTH AUTH2
|
|
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
|
|
548
|
-
events, no deny/allow stdout
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
`
|
|
552
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
664
|
-
|
|
665
|
-
the
|
|
666
|
-
|
|
673
|
+
`pip install dos-kernel` is the whole install — if 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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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")
|