dos-kernel 0.28.0__tar.gz → 0.30.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/PKG-INFO +17 -2
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/README.md +16 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/pyproject.toml +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/__init__.py +1 -1
- dos_kernel-0.30.0/src/dos/_tomlcache.py +101 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/account_auth.py +30 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/admission.py +27 -20
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/answer_shape.py +100 -5
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/arbiter.py +41 -30
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/cli.py +1401 -231
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/commit_audit.py +29 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/config.py +55 -54
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/cooldown.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/data_class.py +6 -10
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/decisions.py +116 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/account_switcher.py +210 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/hook_dialects.py +13 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/notify_slack.py +22 -3
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/notify_webhook.py +7 -0
- dos_kernel-0.30.0/src/dos/drivers/sealed_acceptance.py +307 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/supervisor.py +79 -20
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/effect_kind.py +90 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/efficiency.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/efficiency_trend.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/enumerate.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/freshness.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/hook_install.py +49 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/hook_observation.py +6 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/improve.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/intervention.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/lane_lease.py +8 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/lane_overlap.py +7 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/lifecycle.py +6 -8
- dos_kernel-0.30.0/src/dos/live_rotation.py +426 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/lock_modes.py +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/marker_gate.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/native_canonical.py +12 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/noop_streak.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/notify.py +83 -3
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/overlap_policy.py +104 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/phase_shipped.py +37 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/plan_source.py +6 -10
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/precursor_gate.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/productivity.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/queue_saturation.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/reason_morphology.py +6 -8
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/reasons.py +6 -11
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/residual_review.py +44 -76
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/retention.py +6 -10
- dos_kernel-0.30.0/src/dos/rotation_handoff.py +233 -0
- dos_kernel-0.30.0/src/dos/salience.py +537 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/EXAMPLES.md +2 -2
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-class-cycle/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-dispatch/SKILL.md +2 -2
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-dispatch-loop/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-enforce-tune/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-goal-fleet/SKILL.md +37 -18
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-goal-gate/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-next-up/SKILL.md +2 -2
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-plan-price/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-promote/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-replan/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-replan-loop/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-self-improve/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-skillify/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-supervise-loop/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-unstick/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skills/dos-witness-claim/SKILL.md +1 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/stamp.py +163 -12
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/supervise.py +73 -33
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/tool_stream.py +6 -8
- dos_kernel-0.30.0/src/dos/usage_probe.py +214 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos_kernel.egg-info/PKG-INFO +17 -2
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos_kernel.egg-info/SOURCES.txt +23 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos_mcp/answers.py +28 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos_mcp/server.py +94 -12
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_account_auth.py +36 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_account_ledger.py +39 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_account_switcher.py +139 -0
- dos_kernel-0.30.0/tests/test_accounts_rehome.py +161 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_agent_surface.py +56 -5
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_answer_shape.py +211 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_arbiter.py +51 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_burn_in_farm_playbook.py +6 -3
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_cleanup_sweep.py +41 -2
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_cli_ergonomics.py +11 -5
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_cli_loop.py +122 -4
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_commit_audit.py +26 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_decisions.py +79 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_doctor_json.py +7 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_drivers_supervisor.py +108 -20
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_effect_kind_axis.py +30 -0
- dos_kernel-0.30.0/tests/test_external_repo_probe.py +241 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_git_hygiene.py +100 -2
- dos_kernel-0.30.0/tests/test_go_account_parity.py +43 -0
- dos_kernel-0.30.0/tests/test_go_liveness_parity.py +56 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_hook_binaries_bundled.py +72 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_hook_binary_locator.py +12 -8
- dos_kernel-0.30.0/tests/test_hook_live_rotate.py +188 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_hook_observation.py +28 -1
- dos_kernel-0.30.0/tests/test_init_default_on.py +186 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_init_hooks_auto.py +25 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_init_hooks_crossvendor.py +40 -4
- dos_kernel-0.30.0/tests/test_live_rehome_stress.py +226 -0
- dos_kernel-0.30.0/tests/test_live_rotation.py +229 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_mcp_server.py +15 -3
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_native_canonical.py +30 -11
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_notify.py +57 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_notify_cli.py +78 -2
- dos_kernel-0.30.0/tests/test_notify_decisions_cadence.py +114 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_notify_slack.py +22 -2
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_notify_webhook.py +20 -1
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_overlap_policy.py +42 -17
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_plugin_manifest.py +143 -17
- dos_kernel-0.30.0/tests/test_proc_reaper.py +219 -0
- dos_kernel-0.28.0/tests/test_residual_review.py → dos_kernel-0.30.0/tests/test_residual_review_surface.py +9 -5
- dos_kernel-0.30.0/tests/test_rotation_handoff.py +127 -0
- dos_kernel-0.30.0/tests/test_salience.py +445 -0
- dos_kernel-0.30.0/tests/test_sealed_acceptance.py +276 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_session_digest.py +36 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_stamp_doctor.py +176 -0
- dos_kernel-0.30.0/tests/test_stamp_issue_leaf.py +295 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_supervise.py +36 -2
- dos_kernel-0.30.0/tests/test_toml_cache.py +214 -0
- dos_kernel-0.30.0/tests/test_usage_probe.py +162 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_vendor_agnostic_kernel.py +4 -4
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_workspace_config.py +31 -2
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/LICENSE +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/setup.cfg +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/_demo_story.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/_filelock.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/_job_policy.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/_tree.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/account_ledger.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/apply_gate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/archive_lock.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/arg_provenance.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/attest.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/breaker.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/call_shape.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/chat_control.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/child_refusals.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/churn.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/claim_extract.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/claim_ttl.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/completion.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/concurrency_class.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/config_lint.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/coverage.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/dangling_intent.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/decisions_tui.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/deprecation.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/dispatch_top.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/dispatch_top_tui.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/__init__.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/_effect_gate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/agent_auth/__init__.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/agent_auth/claude.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/agent_auth/codex.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/agent_auth/gemini.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/agt_backend.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/ci_status.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/citation_resolve.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/content_diff.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/crewai_guardrail.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/decision_stop.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/design_doc_plan.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/enforce_tune.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/export_file.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/export_otlp.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/export_statsd.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/fs_artifact.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/http_probe.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/job.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/llm_judge.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/memory_mem0.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/memory_recall.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/merge_gate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/model_reroute.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/nemo_action.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/notify_whatsapp.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/openai_agents_guardrail.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/operator_judge.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/os_acceptance.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/os_process.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/paste_log.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/plan_scope.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/pre_commit.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/provider_ledger.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/self_improve.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/similarity_judge.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/slack_approval.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/state_diff.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/visual_witness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/watchdog.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/whatsapp_bridge.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/witnessed_leak_test.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers/workshop.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/drivers_seam.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/durable_schema.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/effect_witness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/efficiency_advice.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/enforce.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/enforce_outcomes.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/env_print.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/event_severity.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/evidence.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/exec_capability.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/export_cursor.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/exporter.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/firing_label.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/fleet_roll.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/gate_classify.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/gh4_coverage.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/git_delta.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/guard.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/health.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/help_summary.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/home.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/hook_binary.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/hook_dialect.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/hook_exit.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/id_alloc.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/intent_ledger.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/interpret.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/intervention_eval.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/journal_delta.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/judge_eval.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/judges.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/lane_infer.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/lane_journal.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/lease_health.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/liveness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/log_source.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/loop_decide.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/loop_trace.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/marker_sensor.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/memory_stores.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/mergegate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/model_call.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/model_health.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/named_lock.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/observe.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/oracle.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/overlap_eval.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/override_facts.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/packet_sidecar.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/pick_priority.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/pickable.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/picker_oracle.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/plan_board.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/plan_board_tui.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/plugins.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/posttool_sensor.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/precursor_gate_eval.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/preflight.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/pretool_sensor.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/proc_delta.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/provider_limit.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/pulse.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/py.typed +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/reconcile.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/recurring_wedge.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/render.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/result_state.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/resume.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/resume_evidence.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/retire.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/reward.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/rewind.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/rewind_evidence.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/rewind_tokens.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/run_id.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/rung_occupancy.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/scope.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/scope_source.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/scout.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/self_modify.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/session_digest.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/sibling_scan.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/skill_grade.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/spend.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/state_health.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/status.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/stop_failure_sensor.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/stop_policy.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/testing/__init__.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/testing/doubles.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/testing/suite.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/testing/tester.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/testwitness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/timeline.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/tokens.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/tool_stream_eval.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/tool_trace.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/trace.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/transcript_view.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/vcs.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/verdict.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/verdict_census.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/verdict_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/verdict_journal.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/verdict_rollup.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/verdicts.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/verified.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/wedge_reason.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos/work_account.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos_kernel.egg-info/dependency_links.txt +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos_kernel.egg-info/entry_points.txt +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos_kernel.egg-info/requires.txt +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos_kernel.egg-info/top_level.txt +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos_mcp/__init__.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/src/dos_mcp/py.typed +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_accounts_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_admission.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_aeo_tracker.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_agent_kind_config.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_agenthallu_replay.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_agentprocessbench_replay.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_agt_backend.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_answers.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_answers_index.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_apply_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_apply_gate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_apply_gate_fence.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_archive_lock.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_arg_provenance.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_attest.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_backflow_ledger.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_backlog_triage.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_beat_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_bench_layering.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_braintrust_scorer_example.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_breaker.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_build_scoreboard_pages.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_build_skill_dos_page.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_build_wheels_binary_format.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_call_shape.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_canonical_example_lockstep.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_caught_lie_cast.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_central_index.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_chat_control.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_check_published_site.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_child_refusals.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_churn.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_ci_status.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_citation_resolve.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_claim_extract.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_claim_ttl.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_claims_lint.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_cli_completion_verb.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_cli_enforce_tune.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_cli_pickable_enumerate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_cli_witness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_clobber_demo_contract.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_cmd_status.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_completion.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_concurrency_class.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_config_lint.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_conformance_plugin_examples.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_conformance_suite.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_content_diff.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_cooldown.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_coverage.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_crewai_guardrail.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_cross_host_continuity.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_dangling_intent.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_data_class.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_deprecation.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_design_doc_plan_source.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_dev_runner.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_discoverability_inventory.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_dispatch_loop_substrate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_dispatch_top.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_docs_links.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_docs_version_drift.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_dogfood_goal_gate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_dos_market.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_dos_react_terminal_error.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_drift_scoreboard.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_drivers_merge_gate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_drivers_seam.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_drivers_self_improve.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_drivers_watchdog.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_drivers_workshop.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_duplicate_plan_numbers.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_durable_schema.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_effect_gate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_effect_witness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_efficiency.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_efficiency_advice.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_efficiency_trend.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_efficiency_trend_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_enforce.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_enforce_outcomes.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_enforce_tune_driver.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_ensure_home.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_enterpriseops_harness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_enumerate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_env_print.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_event_severity.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_evidence.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_exec_capability.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_export_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_export_cursor.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_export_otlp.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_export_statsd.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_exporter.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_fault_injection_journal.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_feasibility_split.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_filelock.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_filepath_backstop_batch.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_firing_label.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_fleet_framework_examples.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_fleet_roll.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_forge_arena_bench.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_forge_page.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_freshness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_fs_artifact.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_gate_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_gemini_extension.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_gh4_coverage.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_git_cleanup.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_gitignore_hygiene.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_gitlab_ci_template.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_gitlab_component.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_go_hook_parity.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_guard.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_health.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_heartbeats_config.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_help_summary.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_hermes_integration_example.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_home_layering.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_home_no_temp_pollution.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_hook_ask_posture.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_hook_assist_posture.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_hook_dialect.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_hook_exit.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_hook_pretool.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_hook_stop.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_hosts_verb.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_http_probe.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_id_alloc.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_improve.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_init_hooks.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_init_posture.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_init_skills.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_install_drift.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_install_levels.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_intent_ledger.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_interpret_parity.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_intervention.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_intervention_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_intervention_eval.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_journal_delta.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_judge.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_judge_eval.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_judges.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_kernel_charts.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_kernel_keep_gate_example.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_kernel_keep_gate_real_kernelbench.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_lane_adopt.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_lane_halt.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_lane_infer.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_lane_journal.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_lane_lease.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_lane_lease_expiry.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_lane_lease_mutex.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_lane_overlap.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_leak_scan.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_lease_health.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_legalcite_live.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_lifecycle.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_liveness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_llm_judge_vendor_seam.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_llms_full.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_llms_txt.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_lock_modes.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_log_source.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_loop_economics_toml.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_loop_trace.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_marker_gate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_marker_sensor.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_mcp_answer.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_mcp_tools_plugin.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_memory_admit.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_memory_fossils.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_memory_integrity_bench.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_memory_mem0.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_memory_recall.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_memory_stores.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_mergegate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_model_call.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_model_health.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_model_reroute.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_named_lock.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_nemo_action.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_noop_streak.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_notify_whatsapp.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_observe.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_openai_agents_guardrail.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_operator_judge.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_oracle.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_oracle_and_loop.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_oracle_forgeability_provenance.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_oracle_grep_in_process.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_os_acceptance.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_os_process.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_override_window.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_packet_sidecar.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_phase_labels.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_pick_priority.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_pickable.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_plan_board.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_plan_source.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_plugins_verb.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_poisoned_pool_bench.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_poisoned_pool_lineage.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_poisoned_pool_p2.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_poisoned_pool_policies.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_posttool_sensor.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_posture_observation.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_pre_commit_hook.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_precursor_gate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_precursor_gate_eval.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_preflight_sidecar.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_proc_delta.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_productivity.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_prop_arbiter_wal.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_prop_breaker.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_prop_cooldown.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_prop_efficiency.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_prop_install_wrappers.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_prop_overlap_soundness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_prop_productivity.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_prop_reconcile.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_prop_reward_nonforgeability.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_prop_tree.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_provider_ledger.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_provider_limit.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_pulse.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_queue_saturation.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_readme_assembly.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_readme_test_count_band.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_reconcile.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_recurring_wedge.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_refusal_and_tokens.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_reindex.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_release_bump.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_release_cadence_workflow.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_release_cut.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_release_decide.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_render.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_replan_skip.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_result_state.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_resume.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_resume_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_resume_evidence.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_resume_reachability.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_retention.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_retire.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_reward.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_rewind.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_rewind_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_root_index_lane.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_rung_occupancy.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_rung_occupancy_backtest.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_scope.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_scope_gate.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_scope_gate_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_scope_source.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_scoreboard_charts.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_scoreboard_copy.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_scoreboard_index.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_scoreboard_rollup.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_scoreboard_surfaces.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_scout.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_seed_scoreboard_index.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_selfmodify_hook_probe.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_server_json_version.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_serverless_rl_example.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_si_cov_cycle1.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_si_cov_cycle2.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_si_cov_cycle3.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_sibling_scan.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_similarity_judge.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_single_filesystem_lease_boundary.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_skill_grade.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_skill_grounding_rail.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_skill_pack_dispatch.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_skill_pack_generic.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_skill_pack_litmus.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_skill_pack_operator_tier.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_skill_pack_replan.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_slack_approval.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_smartphone_tier_bench.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_smithery_yaml.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_social_card.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_sota_scan.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_source_census.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_spend.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_spend_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_spend_evidence.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_stability_policy.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_stall_sim.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_stamp_convention.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_stamp_filepath_rung.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_stamp_trailer.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_state_diff.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_state_health.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_state_health_doctor.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_state_home.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_status_digest.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_stop_failure_sensor.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_stop_policy.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_subprocess_stdin_hygiene.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_testwitness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_timeline_timing.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_tool_stream.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_tool_stream_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_tool_trace.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_toolathlon_live_adapter.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_toolathlon_replay.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_toolathlon_rewind_ceiling.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_trace.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_trajectory_audit.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_transcript_view.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_tree_question_mark_soundness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_troubleshooting_doc.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_two_hosts_one_gate_playbook.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_vcs.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_vcs_config.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_vcs_layering.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verdict_census.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verdict_cli.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verdict_contract.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verdict_journal.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verdict_rollup.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verdicts.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verified.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verify_color.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verify_demo_contract.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verify_no_plan.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verify_non_git_rung.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_verify_plugin_install.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_visual_witness.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_whatsapp_bridge.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_wiring_drift.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_witnessed_leak_test.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_work_account.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_workflow_yaml_parses.py +0 -0
- {dos_kernel-0.28.0 → dos_kernel-0.30.0}/tests/test_worktree_lifecycle_spike.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dos-kernel
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.30.0
|
|
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
|
|
@@ -128,7 +128,7 @@ install is one small Python package.
|
|
|
128
128
|
> entries there undoes it. (No runtime detected? It says so and lists the
|
|
129
129
|
> names to pick from — it never guesses.)
|
|
130
130
|
|
|
131
|
-
<sub>**v0.
|
|
131
|
+
<sub>**v0.30.0** · 5,600+ tests · CI: Python 3.11–3.13 on Linux + a Windows 3.13
|
|
132
132
|
smoke run · the only runtime dependency is **PyYAML** · **MIT**.</sub>
|
|
133
133
|
|
|
134
134
|
> 🧭 **Where to go next:** the [why & evidence](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/guide/why-a-referee.md) (plain-words story, the 20-lines-of-bash answer, what's proven),
|
|
@@ -370,6 +370,21 @@ verdict vocabulary, from the agent's tool call to your dashboard.
|
|
|
370
370
|
|
|
371
371
|
*Next level up — run it every day: [Operating a fleet](#operating-a-fleet).*
|
|
372
372
|
|
|
373
|
+
## From the same team
|
|
374
|
+
|
|
375
|
+
DOS is one of three open tools from [Anthony Chaudhary](https://github.com/anthony-chaudhary)
|
|
376
|
+
for running AI agents you can actually trust — at three different moments:
|
|
377
|
+
|
|
378
|
+
- **[fak — the agent kernel](https://github.com/anthony-chaudhary/fak)** — DOS reads *what an
|
|
379
|
+
agent already did* (after the fact, from git and other witnesses it can't forge); `fak` governs
|
|
380
|
+
*what an agent is allowed to do* as it happens. A single static Go binary that fronts your token
|
|
381
|
+
engine and adjudicates every tool call at the boundary — capability gate, tool-result
|
|
382
|
+
quarantine, audit trail — the inline gate to DOS's out-of-loop referee. `go install
|
|
383
|
+
github.com/anthony-chaudhary/fak/cmd/fak@latest` · [docs](https://anthony-chaudhary.github.io/fak/).
|
|
384
|
+
- **[Diffgram](https://github.com/diffgram/diffgram)** — the AI datastore for human supervision of
|
|
385
|
+
AI *data* (labeling, workflow, catalog). Where DOS and `fak` supervise the *agents*, Diffgram
|
|
386
|
+
supervises the *data* they learn from and produce.
|
|
387
|
+
|
|
373
388
|
## Citation
|
|
374
389
|
|
|
375
390
|
The ideas here are written up in a paper — *"Verification Is All You Need — But
|
|
@@ -74,7 +74,7 @@ install is one small Python package.
|
|
|
74
74
|
> entries there undoes it. (No runtime detected? It says so and lists the
|
|
75
75
|
> names to pick from — it never guesses.)
|
|
76
76
|
|
|
77
|
-
<sub>**v0.
|
|
77
|
+
<sub>**v0.30.0** · 5,600+ tests · CI: Python 3.11–3.13 on Linux + a Windows 3.13
|
|
78
78
|
smoke run · the only runtime dependency is **PyYAML** · **MIT**.</sub>
|
|
79
79
|
|
|
80
80
|
> 🧭 **Where to go next:** the [why & evidence](https://github.com/anthony-chaudhary/dos-kernel/blob/master/docs/guide/why-a-referee.md) (plain-words story, the 20-lines-of-bash answer, what's proven),
|
|
@@ -316,6 +316,21 @@ verdict vocabulary, from the agent's tool call to your dashboard.
|
|
|
316
316
|
|
|
317
317
|
*Next level up — run it every day: [Operating a fleet](#operating-a-fleet).*
|
|
318
318
|
|
|
319
|
+
## From the same team
|
|
320
|
+
|
|
321
|
+
DOS is one of three open tools from [Anthony Chaudhary](https://github.com/anthony-chaudhary)
|
|
322
|
+
for running AI agents you can actually trust — at three different moments:
|
|
323
|
+
|
|
324
|
+
- **[fak — the agent kernel](https://github.com/anthony-chaudhary/fak)** — DOS reads *what an
|
|
325
|
+
agent already did* (after the fact, from git and other witnesses it can't forge); `fak` governs
|
|
326
|
+
*what an agent is allowed to do* as it happens. A single static Go binary that fronts your token
|
|
327
|
+
engine and adjudicates every tool call at the boundary — capability gate, tool-result
|
|
328
|
+
quarantine, audit trail — the inline gate to DOS's out-of-loop referee. `go install
|
|
329
|
+
github.com/anthony-chaudhary/fak/cmd/fak@latest` · [docs](https://anthony-chaudhary.github.io/fak/).
|
|
330
|
+
- **[Diffgram](https://github.com/diffgram/diffgram)** — the AI datastore for human supervision of
|
|
331
|
+
AI *data* (labeling, workflow, catalog). Where DOS and `fak` supervise the *agents*, Diffgram
|
|
332
|
+
supervises the *data* they learn from and produce.
|
|
333
|
+
|
|
319
334
|
## Citation
|
|
320
335
|
|
|
321
336
|
The ideas here are written up in a paper — *"Verification Is All You Need — But
|
|
@@ -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.30.0"
|
|
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
|
|
@@ -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.30.0"
|
|
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
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""One shared, mtime-keyed reader+parser for ``dos.toml`` — the anti-storm cache.
|
|
2
|
+
|
|
3
|
+
Every config-layer readback (`config._load_toml_table`,
|
|
4
|
+
`config.load_class_budgets_from_toml`, and the ~two-dozen per-module
|
|
5
|
+
`load_from_toml` seams in `reasons`/`stamp`/`enumerate`/`cooldown`/… ) used to
|
|
6
|
+
`tomllib.loads(p.read_text(encoding="utf-8-sig"))` the SAME file independently.
|
|
7
|
+
One `load_workspace_config()` call therefore re-read and re-parsed a single
|
|
8
|
+
`dos.toml` ~25 times with zero caching; the MCP server rebuilds the config on
|
|
9
|
+
EVERY tool call, so a burst of tool calls turned into a page-fault / allocation
|
|
10
|
+
storm on one small file.
|
|
11
|
+
|
|
12
|
+
This module holds the ONE cached parse. `read_toml_cached(path)` returns the
|
|
13
|
+
fully-parsed top-level table (a plain ``dict``), keyed on the file's
|
|
14
|
+
``(resolved_path, st_mtime_ns, st_size)`` so a live edit to ``dos.toml`` is
|
|
15
|
+
picked up on the next read (invalidation is correct by construction — a changed
|
|
16
|
+
mtime is a cache miss). It is a pure, stdlib-only helper (no `dos` imports), so
|
|
17
|
+
any kernel/seam module can route through it without an import cycle.
|
|
18
|
+
|
|
19
|
+
Semantics preserved exactly, so every caller behaves byte-identically:
|
|
20
|
+
|
|
21
|
+
* **Missing file → ``{}``.** Callers today branch on ``p.exists()`` and return
|
|
22
|
+
their ``base`` when it is False; an empty dict makes ``data.get(key)`` return
|
|
23
|
+
``None`` down the SAME "degrade to base" path. The missing-file semantics of
|
|
24
|
+
no caller change.
|
|
25
|
+
* **`tomllib` unavailable (py<3.11 with no `tomli`) → ``{}``.** Same "degrade
|
|
26
|
+
to base" outcome the callers' own `except ModuleNotFoundError` branch took.
|
|
27
|
+
* **Present but MALFORMED → the parse error propagates** (`tomllib` raises
|
|
28
|
+
`TOMLDecodeError`, a `ValueError` subclass) and is NOT cached — exactly as
|
|
29
|
+
today, where `load_workspace_config`'s `_layer` catches the `ValueError`,
|
|
30
|
+
warns, and keeps the base. A malformed file never poisons the cache.
|
|
31
|
+
* **BOM preserved.** Read via ``encoding="utf-8-sig"`` so a UTF-8 BOM (what
|
|
32
|
+
PowerShell's default `utf8` writes) is transparently stripped, the same as
|
|
33
|
+
every call site did before.
|
|
34
|
+
|
|
35
|
+
The cache is bounded (a small LRU-ish cap, evicting the oldest entry) so it can
|
|
36
|
+
never grow without limit even if a long-lived process reads many distinct
|
|
37
|
+
workspaces.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from __future__ import annotations
|
|
41
|
+
|
|
42
|
+
import os
|
|
43
|
+
from pathlib import Path
|
|
44
|
+
|
|
45
|
+
__all__ = ["read_toml_cached", "clear_cache"]
|
|
46
|
+
|
|
47
|
+
# (resolved_path_str, st_mtime_ns, st_size) -> parsed top-level table.
|
|
48
|
+
# Insertion-ordered; oldest entry evicted first once _MAX_ENTRIES is exceeded.
|
|
49
|
+
_CACHE: dict[tuple[str, int, int], dict] = {}
|
|
50
|
+
|
|
51
|
+
# Cap the number of distinct (file, version) entries. Small on purpose: a process
|
|
52
|
+
# typically touches ONE dos.toml (its workspace), and re-reads dominate; extra
|
|
53
|
+
# room covers a handful of workspaces or a few live edits without unbounded growth.
|
|
54
|
+
_MAX_ENTRIES = 64
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def read_toml_cached(path: Path | str) -> dict:
|
|
58
|
+
"""Parsed top-level table of the ``dos.toml`` at ``path`` — cached per version.
|
|
59
|
+
|
|
60
|
+
Returns ``{}`` when the file is absent or `tomllib`/`tomli` is unavailable
|
|
61
|
+
(both the "degrade to base" outcomes the callers already handle via
|
|
62
|
+
``data.get(key) is None``). A present-but-malformed file lets the parse error
|
|
63
|
+
propagate (uncached), so the caller's existing warn-and-fall-back still fires.
|
|
64
|
+
The returned dict is the shared cached object — callers only READ it (they
|
|
65
|
+
pull a sub-table and validate a copy), so it is not defensively copied.
|
|
66
|
+
"""
|
|
67
|
+
p = Path(path)
|
|
68
|
+
try:
|
|
69
|
+
st = os.stat(p)
|
|
70
|
+
except OSError:
|
|
71
|
+
# Absent (or unstatable) → the missing-file branch every caller took.
|
|
72
|
+
return {}
|
|
73
|
+
|
|
74
|
+
key = (str(p.resolve()), st.st_mtime_ns, st.st_size)
|
|
75
|
+
cached = _CACHE.get(key)
|
|
76
|
+
if cached is not None:
|
|
77
|
+
return cached
|
|
78
|
+
|
|
79
|
+
try:
|
|
80
|
+
import tomllib # py3.11+
|
|
81
|
+
except ModuleNotFoundError: # pragma: no cover - py<3.11 fallback
|
|
82
|
+
try:
|
|
83
|
+
import tomli as tomllib # type: ignore
|
|
84
|
+
except ModuleNotFoundError:
|
|
85
|
+
return {}
|
|
86
|
+
|
|
87
|
+
# `utf-8-sig` transparently strips a UTF-8 BOM (a no-op when absent). A parse
|
|
88
|
+
# error propagates here (NOT stored) so the caller's existing handling stands.
|
|
89
|
+
data = tomllib.loads(p.read_text(encoding="utf-8-sig"))
|
|
90
|
+
|
|
91
|
+
if len(_CACHE) >= _MAX_ENTRIES:
|
|
92
|
+
# Evict the oldest inserted entry (dicts preserve insertion order).
|
|
93
|
+
oldest = next(iter(_CACHE))
|
|
94
|
+
del _CACHE[oldest]
|
|
95
|
+
_CACHE[key] = data
|
|
96
|
+
return data
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def clear_cache() -> None:
|
|
100
|
+
"""Drop every cached parse. For tests / a host that wants a cold read."""
|
|
101
|
+
_CACHE.clear()
|
|
@@ -138,6 +138,36 @@ class AccountAuthSpec:
|
|
|
138
138
|
out[self.token_env] = token
|
|
139
139
|
return out
|
|
140
140
|
|
|
141
|
+
def launch_env(
|
|
142
|
+
self,
|
|
143
|
+
account: object | None = None,
|
|
144
|
+
*,
|
|
145
|
+
config_dir: str | None = None,
|
|
146
|
+
token: Optional[str] = None,
|
|
147
|
+
) -> dict[str, str]:
|
|
148
|
+
"""The env-override to (re)launch a worker as one seat of this agent.
|
|
149
|
+
|
|
150
|
+
The SINGLE builder every consumer uses — the launcher and the rotate-on-wall
|
|
151
|
+
handoff (docs/386 §4) — so neither branches on the agent NAME. It prefers this
|
|
152
|
+
spec's disk-aware ``launch_env_fn`` (a CAPABILITY, not a name: Claude's docs/380
|
|
153
|
+
``env_for``, which defers to a fresh ``.credentials.json`` rather than freezing a
|
|
154
|
+
static token into a live session) when it is set AND an ``account`` object is
|
|
155
|
+
supplied; otherwise it falls to the pure ``env_overrides`` floor built from
|
|
156
|
+
``config_dir`` (+ optional ``token``). A consumer reads ``spec.launch_env_fn``
|
|
157
|
+
ONLY through this method, never ``if kind == "claude"`` (the vendor-blindness
|
|
158
|
+
litmus).
|
|
159
|
+
|
|
160
|
+
Fail-LOUD by design: a ``launch_env_fn`` that raises (Claude's ``OriginError`` on
|
|
161
|
+
a missing/logged-out config dir) propagates — launching under the WRONG or empty
|
|
162
|
+
identity is the hazard this contract exists to prevent, so it must fail, never
|
|
163
|
+
emit a logged-out env. ``account`` is opaque (the callable's own type); the
|
|
164
|
+
kernel does not import it.
|
|
165
|
+
"""
|
|
166
|
+
if self.launch_env_fn is not None and account is not None:
|
|
167
|
+
env = self.launch_env_fn(account)
|
|
168
|
+
return dict(env) if isinstance(env, dict) else {}
|
|
169
|
+
return self.env_overrides(config_dir or "", token=token)
|
|
170
|
+
|
|
141
171
|
|
|
142
172
|
# --------------------------------------------------------------------------- #
|
|
143
173
|
# By-name resolution — in-tree driver first, then the dos.account_auth group.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""The admission-predicate seam — Axis 3 of hackability: pluggable safety hooks (ADM, docs/73).
|
|
2
2
|
|
|
3
|
-
The arbiter's admission logic —
|
|
4
|
-
|
|
3
|
+
The arbiter's admission logic — known-tree intersection plus shared/exclusive
|
|
4
|
+
lock compatibility, with the legacy ratio scorer still selectable by config — is the kernel's
|
|
5
5
|
**safety element**: it is what stops two agents editing the same files
|
|
6
6
|
concurrently. That logic used to be fixed. A workspace could not add its own
|
|
7
7
|
admission rule ("refuse a new lease when over the monthly token budget,"
|
|
@@ -158,19 +158,18 @@ class AdmissionRequest:
|
|
|
158
158
|
tree: tuple[str, ...]
|
|
159
159
|
command: str = ""
|
|
160
160
|
arg_values: tuple[str, ...] = ()
|
|
161
|
+
mode: str = ""
|
|
161
162
|
|
|
162
163
|
|
|
163
164
|
class DisjointnessPredicate:
|
|
164
165
|
"""The built-in tree-disjointness predicate — today's fixed admission rule,
|
|
165
166
|
now the FIRST registered predicate.
|
|
166
167
|
|
|
167
|
-
Delegates the both-known scoring to a resolved `overlap_policy.OverlapPolicy
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
stays byte-for-byte behavior-preserving (the load-bearing litmus: the entire
|
|
173
|
-
existing arbiter/overlap suite is green through this path).
|
|
168
|
+
Delegates the both-known scoring to a resolved `overlap_policy.OverlapPolicy`.
|
|
169
|
+
The default is `LockModeOverlapPolicy`: EXCLUSIVE/EXCLUSIVE intersections
|
|
170
|
+
refuse at zero tolerance while SHARED/SHARED intersections admit. The legacy
|
|
171
|
+
`PrefixOverlapPolicy` is still selectable explicitly, where it is AND-ed under
|
|
172
|
+
the deterministic prefix floor.
|
|
174
173
|
|
|
175
174
|
The **empty-tree rules** (asymmetric on the lease side) are owned HERE, not in
|
|
176
175
|
the policy — they are soundness invariants about *unknown blast radius*, not a
|
|
@@ -184,13 +183,13 @@ class DisjointnessPredicate:
|
|
|
184
183
|
* both known → delegate to the policy via `admissible_under_floor`.
|
|
185
184
|
|
|
186
185
|
``policy`` is the scorer for the both-known case. It defaults to the built-in
|
|
187
|
-
`
|
|
188
|
-
args is pure and byte-identical to the old inline rule). A boundary caller
|
|
186
|
+
`LockModeOverlapPolicy` (pure, no I/O). A boundary caller
|
|
189
187
|
(`built_in_predicates`) resolves a workspace's declared `dos.overlap_policies`
|
|
190
188
|
plugin and passes it in here — the resolve-at-the-boundary, I/O-free-hot-path
|
|
191
189
|
discipline `SelfModifyPredicate`'s `runtime_files` already uses. Whatever the
|
|
192
|
-
policy is, `admissible_under_floor` AND-s it under the unforgeable
|
|
193
|
-
so a misbehaving
|
|
190
|
+
non-lock policy is, `admissible_under_floor` AND-s it under the unforgeable
|
|
191
|
+
prefix floor, so a misbehaving scorer can only refuse-more, never admit a
|
|
192
|
+
legacy prefix collision.
|
|
194
193
|
"""
|
|
195
194
|
|
|
196
195
|
name = "disjointness"
|
|
@@ -200,13 +199,13 @@ class DisjointnessPredicate:
|
|
|
200
199
|
# same leaf `admission` already imports — no cycle, but keep it local so a
|
|
201
200
|
# default-constructed predicate has zero extra import cost on the hot path).
|
|
202
201
|
if policy is None:
|
|
203
|
-
from dos.overlap_policy import
|
|
204
|
-
policy =
|
|
202
|
+
from dos.overlap_policy import LockModeOverlapPolicy
|
|
203
|
+
policy = LockModeOverlapPolicy()
|
|
205
204
|
self._policy = policy
|
|
206
205
|
|
|
207
206
|
def __call__(self, request: AdmissionRequest, live_lease: dict,
|
|
208
207
|
config: object) -> AdmissionVerdict:
|
|
209
|
-
from dos.overlap_policy import admissible_under_floor
|
|
208
|
+
from dos.overlap_policy import admissible_under_floor, lock_mode_decision
|
|
210
209
|
requested_tree = list(request.tree)
|
|
211
210
|
lease_tree = list(live_lease.get("tree") or [])
|
|
212
211
|
if not lease_tree:
|
|
@@ -218,7 +217,15 @@ class DisjointnessPredicate:
|
|
|
218
217
|
f"{live_lease.get('lane')!r} — unknown blast radius is never "
|
|
219
218
|
f"safe to admit concurrently."
|
|
220
219
|
)
|
|
221
|
-
|
|
220
|
+
if getattr(self._policy, "name", "") == "lock_modes":
|
|
221
|
+
ov = lock_mode_decision(
|
|
222
|
+
requested_tree,
|
|
223
|
+
lease_tree,
|
|
224
|
+
requested_mode=request.mode,
|
|
225
|
+
lease_mode=live_lease.get("mode", live_lease.get("lock_mode", "")),
|
|
226
|
+
)
|
|
227
|
+
else:
|
|
228
|
+
ov = admissible_under_floor(self._policy, requested_tree, lease_tree, config)
|
|
222
229
|
if ov.admissible:
|
|
223
230
|
return AdmissionVerdict.admit()
|
|
224
231
|
return AdmissionVerdict.refuse(
|
|
@@ -390,10 +397,10 @@ def built_in_predicates(*, workspace=None, config=None) -> list[AdmissionPredica
|
|
|
390
397
|
|
|
391
398
|
The **overlap policy** (the both-known disjointness scorer) is resolved HERE
|
|
392
399
|
too, at the boundary, and threaded into `DisjointnessPredicate(policy=…)` — so
|
|
393
|
-
the pure `arbitrate` never does the discovery I/O that resolving a
|
|
400
|
+
the pure `arbitrate` never does the discovery I/O that resolving a third-party
|
|
394
401
|
policy needs. With no `config` (or a config naming no policy / the built-in
|
|
395
|
-
`
|
|
396
|
-
discovery, so the default predicate list
|
|
402
|
+
`lock_modes`), `active_overlap_policy` returns `LockModeOverlapPolicy` with NO
|
|
403
|
+
discovery, so the default predicate list uses the sound S/X lock-mode rule.
|
|
397
404
|
A workspace that declares `dos.toml [overlap] policy = "import-graph"` (or sets
|
|
398
405
|
`config.overlap_policy_name`) gets its plugin resolved and AND-ed under the
|
|
399
406
|
deterministic prefix floor inside the predicate.
|
|
@@ -42,9 +42,13 @@ The three states (mutually exclusive):
|
|
|
42
42
|
viability length, and matches no disqualifying marker. Shaped
|
|
43
43
|
like an answer. (NOT a claim of correctness — see the boundary.)
|
|
44
44
|
* ``NON_ANSWER`` — structurally disqualified: empty/whitespace-only, below the
|
|
45
|
-
viability floor,
|
|
45
|
+
viability floor, OVER the verbosity ceiling, degenerated into a
|
|
46
|
+
repeating loop, OR matches a declared non-answer marker (a
|
|
46
47
|
process/CoT-log signature, a bare-refusal signature, a stub).
|
|
47
|
-
The q_025 catch
|
|
48
|
+
The q_025 catch (the stub/CoT end) PLUS the opposite failures the
|
|
49
|
+
same shape guard should see — the runaway/padded dump and the
|
|
50
|
+
decode-degeneration loop (the verbosity/drift end). The dangerous
|
|
51
|
+
case a grounding gate misses.
|
|
48
52
|
* ``INDETERMINATE`` — no policy supplied, or the text is non-trivial but the policy
|
|
49
53
|
cannot disqualify it on shape — the abstain floor. The semantic
|
|
50
54
|
"is it a good answer?" residue goes here, to a JUDGE / HUMAN.
|
|
@@ -116,6 +120,34 @@ class AnswerShapePolicy:
|
|
|
116
120
|
(the RAG app's q_025 leaked-CoT was 5,780 chars, so length alone never catches that;
|
|
117
121
|
the *markers* do — length catches the opposite failure, the empty/stub end).
|
|
118
122
|
|
|
123
|
+
``max_viable_chars`` is the SYMMETRIC ceiling — the verbosity/bloat end the floor
|
|
124
|
+
can't see. Above it, a non-empty output is a runaway/padded generation, structurally
|
|
125
|
+
not a focused answer (the q_025 leaked-CoT was *long*; gross length is itself a
|
|
126
|
+
structural tell once a host declares its budget). Default ``0`` DISABLES the ceiling
|
|
127
|
+
(no upper bound) — exactly like the floor's default-1 only-empty behavior, the host
|
|
128
|
+
declares the threshold; the kernel never guesses a length budget (the "ceiling fixed
|
|
129
|
+
by the source, never inferred from content" rule, docs/156 §3.2). Still SHAPE, not
|
|
130
|
+
quality: a host setting a ceiling is declaring "in my domain an answer over N chars
|
|
131
|
+
is structurally a dump", the same kind of host call as setting ``min_viable_chars``.
|
|
132
|
+
|
|
133
|
+
``max_repeat_ratio`` is the DEGENERATION guard — the drift-into-a-loop failure where
|
|
134
|
+
a generation collapses into repeating the same line/sentence (the classic decode
|
|
135
|
+
degeneration, and the most common *mechanism* of padded verbosity). It is the
|
|
136
|
+
fraction of repeated (non-distinct) units the output may carry before it is
|
|
137
|
+
structurally a non-answer: ``repeat_ratio = (n_units - n_distinct) / n_units`` over
|
|
138
|
+
the segmented units (see ``_repeat_ratio``). Above the threshold ⇒ NON_ANSWER.
|
|
139
|
+
Default ``0.0`` DISABLES it (the fail-safe UNDER-disqualify direction — the kernel
|
|
140
|
+
ships the *mechanism*, the host opts in with a threshold like ``0.5``). Mechanically
|
|
141
|
+
checkable and domain-free, so it stays inside the SHAPE boundary: a text that is
|
|
142
|
+
mostly the same sentence over and over is not an answer regardless of the topic.
|
|
143
|
+
|
|
144
|
+
⚠ SCOPE IT TO PROSE. The metric is the fraction of EXACT (stripped+casefolded)
|
|
145
|
+
duplicate units — content-blind, not semantic. So a list/table/CSV/log channel whose
|
|
146
|
+
rows legitimately repeat a short literal (``- N/A`` ten times, a ``| --- |`` rule)
|
|
147
|
+
will read as high-ratio and be disqualified. That is WHY it defaults off and the host
|
|
148
|
+
opts in: point ``max_repeat_ratio`` at free-prose answer channels, not at structured
|
|
149
|
+
output, where exact-row repetition is a feature, not degeneration.
|
|
150
|
+
|
|
119
151
|
``non_answer_patterns`` is the host's closed set of disqualifying regexes — a
|
|
120
152
|
process/CoT-log signature, a bare-refusal signature, a tool-call dump. Matched
|
|
121
153
|
case-insensitively, in a `search` (anywhere in the text). The kernel ships a generic
|
|
@@ -133,6 +165,8 @@ class AnswerShapePolicy:
|
|
|
133
165
|
"""
|
|
134
166
|
|
|
135
167
|
min_viable_chars: int = 1
|
|
168
|
+
max_viable_chars: int = 0
|
|
169
|
+
max_repeat_ratio: float = 0.0
|
|
136
170
|
non_answer_patterns: tuple[str, ...] = ()
|
|
137
171
|
answer_markers: tuple[str, ...] = ()
|
|
138
172
|
|
|
@@ -193,6 +227,35 @@ class AnswerShapeVerdict:
|
|
|
193
227
|
}
|
|
194
228
|
|
|
195
229
|
|
|
230
|
+
# The minimum number of segmented units before a repeat ratio is meaningful. Below it
|
|
231
|
+
# there is too little signal to call degeneration, so the guard ABSTAINS (under-
|
|
232
|
+
# disqualify — the same fail-safe direction as `_safe_search`). A short Q&A like
|
|
233
|
+
# "Yes. No. Yes." must never trip the loop guard; a real degeneration repeats many times.
|
|
234
|
+
_MIN_REPEAT_UNITS = 4
|
|
235
|
+
|
|
236
|
+
# Segment on sentence terminators OR newlines, so a degeneration is caught whether it
|
|
237
|
+
# repeats one-unit-per-line or many-sentences-on-one-line.
|
|
238
|
+
_UNIT_SPLIT = re.compile(r"[.!?\n]+")
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def _repeat_ratio(text: str) -> tuple[float, int]:
|
|
242
|
+
"""The fraction of REPEATED (non-distinct) units in ``text``, and the unit count.
|
|
243
|
+
|
|
244
|
+
Splits ``text`` into units on sentence terminators / newlines, normalizes each
|
|
245
|
+
(stripped + casefolded), drops empties, and returns
|
|
246
|
+
``((n_units - n_distinct) / n_units, n_units)``. A clean answer with all-distinct
|
|
247
|
+
units scores ~0; a generation that has collapsed into repeating one line/sentence
|
|
248
|
+
approaches 1. PURE; returns ``(0.0, n)`` when there are too few units to judge (the
|
|
249
|
+
caller's `_MIN_REPEAT_UNITS` floor makes that an abstain, never a disqualification).
|
|
250
|
+
"""
|
|
251
|
+
units = [u.strip().casefold() for u in _UNIT_SPLIT.split(text)]
|
|
252
|
+
units = [u for u in units if u]
|
|
253
|
+
n = len(units)
|
|
254
|
+
if n < 2:
|
|
255
|
+
return 0.0, n
|
|
256
|
+
return (n - len(set(units))) / n, n
|
|
257
|
+
|
|
258
|
+
|
|
196
259
|
def _safe_search(pattern: str, text: str) -> bool:
|
|
197
260
|
"""Case-insensitive `re.search`, fail-safe to False on a bad pattern.
|
|
198
261
|
|
|
@@ -224,12 +287,18 @@ def classify(
|
|
|
224
287
|
2. ``text`` empty / whitespace-only → NON_ANSWER (nothing was delivered).
|
|
225
288
|
3. ``len(text) < min_viable_chars`` → NON_ANSWER (below the viability floor — a
|
|
226
289
|
stub / ack token, not an answer).
|
|
227
|
-
4.
|
|
290
|
+
4. ``max_viable_chars`` set AND
|
|
291
|
+
``len(text) > max_viable_chars`` → NON_ANSWER (over the verbosity/bloat ceiling
|
|
292
|
+
— a runaway/padded dump, not a focused answer).
|
|
293
|
+
5. a ``non_answer_patterns`` hit → NON_ANSWER (a process/CoT-log / bare-refusal
|
|
228
294
|
/ tool-dump signature — the q_025 catch).
|
|
229
|
-
|
|
295
|
+
6. ``max_repeat_ratio`` set AND the
|
|
296
|
+
repeat ratio exceeds it → NON_ANSWER (degenerated into a loop — the
|
|
297
|
+
same line/sentence over and over; drift).
|
|
298
|
+
7. ``answer_markers`` non-empty AND
|
|
230
299
|
none matched → INDETERMINATE (the strict host required a
|
|
231
300
|
positive answer marker and found none; abstain).
|
|
232
|
-
|
|
301
|
+
8. otherwise → ANSWER_SHAPED (no disqualifier; shaped like
|
|
233
302
|
an answer — NOT a claim of correctness).
|
|
234
303
|
|
|
235
304
|
Returns an `AnswerShapeVerdict`; NEVER raises. Remember the boundary: a `NON_ANSWER`
|
|
@@ -268,6 +337,18 @@ def classify(
|
|
|
268
337
|
f"answer (NON_ANSWER)"),
|
|
269
338
|
)
|
|
270
339
|
|
|
340
|
+
ceiling = int(policy.max_viable_chars)
|
|
341
|
+
if ceiling > 0 and len(stripped) > ceiling:
|
|
342
|
+
return AnswerShapeVerdict(
|
|
343
|
+
state=AnswerShape.NON_ANSWER,
|
|
344
|
+
length=n,
|
|
345
|
+
matched="",
|
|
346
|
+
reason=(f"output is {len(stripped)} non-space chars, over the verbosity "
|
|
347
|
+
f"ceiling of {ceiling} — a runaway/padded dump, not a focused "
|
|
348
|
+
f"answer (NON_ANSWER; a SHAPE call on the host's length budget, "
|
|
349
|
+
f"not a correctness judgment)"),
|
|
350
|
+
)
|
|
351
|
+
|
|
271
352
|
for pat in policy.non_answer_patterns:
|
|
272
353
|
if _safe_search(pat, raw):
|
|
273
354
|
return AnswerShapeVerdict(
|
|
@@ -279,6 +360,20 @@ def classify(
|
|
|
279
360
|
f"answer (the grounded-but-not-an-answer catch, docs/156 §4)"),
|
|
280
361
|
)
|
|
281
362
|
|
|
363
|
+
repeat_cap = float(policy.max_repeat_ratio)
|
|
364
|
+
if repeat_cap > 0.0:
|
|
365
|
+
ratio, units = _repeat_ratio(raw)
|
|
366
|
+
if units >= _MIN_REPEAT_UNITS and ratio > repeat_cap:
|
|
367
|
+
return AnswerShapeVerdict(
|
|
368
|
+
state=AnswerShape.NON_ANSWER,
|
|
369
|
+
length=n,
|
|
370
|
+
matched="",
|
|
371
|
+
reason=(f"output repeat ratio {ratio:.2f} over {units} units exceeds "
|
|
372
|
+
f"the degeneration cap of {repeat_cap:.2f} — collapsed into "
|
|
373
|
+
f"repeating the same line/sentence (NON_ANSWER; a structural "
|
|
374
|
+
f"loop/drift tell, not a correctness judgment)"),
|
|
375
|
+
)
|
|
376
|
+
|
|
282
377
|
if policy.answer_markers:
|
|
283
378
|
if not any(_safe_search(m, raw) for m in policy.answer_markers):
|
|
284
379
|
return AnswerShapeVerdict(
|