pdl-taskmaster 2.4.0__tar.gz → 2.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/.gitignore +2 -0
  2. pdl_taskmaster-2.5.1/NOTICE.md +28 -0
  3. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/PKG-INFO +22 -7
  4. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/README.md +18 -4
  5. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/docs/adr/README.md +5 -0
  6. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/pyproject.toml +2 -3
  7. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/__init__.py +1 -1
  8. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/schemas/result_ir_repair.schema.json +21 -0
  9. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/host/app.py +2 -0
  10. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/host/cli.py +17 -1
  11. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/host/repl.py +534 -51
  12. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/providers/api_worker.py +290 -44
  13. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys1/__init__.py +20 -0
  14. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys1/client.py +102 -0
  15. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys1/gating.py +82 -0
  16. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys1/recipes/__init__.py +16 -0
  17. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys1/recipes/activation_route.py +71 -0
  18. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys1/recipes/base.py +54 -0
  19. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys1/recipes/confirmation_match.py +78 -0
  20. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys1/recipes/problem_class.py +95 -0
  21. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys1/recipes/review_facets.py +155 -0
  22. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys1/schema.py +66 -0
  23. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys2/__init__.py +5 -0
  24. pdl_taskmaster-2.5.1/src/pdl_taskmaster/providers/sys2/client.py +51 -0
  25. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/model_classification.py +38 -2
  26. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/operation_bridge.py +133 -11
  27. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/result_ir.py +260 -44
  28. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/session_engine.py +385 -14
  29. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/wire_payloads.py +118 -11
  30. pdl_taskmaster-2.5.1/src/pdl_taskmaster/tools/repl_viewer.html +276 -0
  31. pdl_taskmaster-2.5.1/src/pdl_taskmaster/tools/viewer_server.py +272 -0
  32. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/tracking/log_live_session.py +16 -3
  33. pdl_taskmaster-2.5.1/src/pdl_taskmaster/verification/__init__.py +26 -0
  34. pdl_taskmaster-2.5.1/src/pdl_taskmaster/verification/checkers/__init__.py +14 -0
  35. pdl_taskmaster-2.5.1/src/pdl_taskmaster/verification/checkers/base.py +37 -0
  36. pdl_taskmaster-2.5.1/src/pdl_taskmaster/verification/checkers/fallback.py +77 -0
  37. pdl_taskmaster-2.5.1/src/pdl_taskmaster/verification/checkers/partition_sum_triples.py +227 -0
  38. pdl_taskmaster-2.5.1/src/pdl_taskmaster/verification/output_verifier.py +73 -0
  39. pdl_taskmaster-2.5.1/src/pdl_taskmaster/verification/plan_soundness.py +135 -0
  40. pdl_taskmaster-2.5.1/src/pdl_taskmaster/verification/sandbox.py +398 -0
  41. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/verify/verify_repl_baseline.py +23 -5
  42. pdl_taskmaster-2.5.1/tests/test_bump_version.py +45 -0
  43. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_codex_decoupling.py +2 -2
  44. pdl_taskmaster-2.5.1/tests/test_dev_mode.py +205 -0
  45. pdl_taskmaster-2.5.1/tests/test_output_verifier.py +238 -0
  46. pdl_taskmaster-2.5.1/tests/test_plan_soundness.py +130 -0
  47. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_pydantic_wire.py +68 -0
  48. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_repl_integration.py +14 -0
  49. pdl_taskmaster-2.5.1/tests/test_repl_paste.py +140 -0
  50. pdl_taskmaster-2.5.1/tests/test_sandbox.py +76 -0
  51. pdl_taskmaster-2.5.1/tests/test_sys1_foundation.py +170 -0
  52. pdl_taskmaster-2.5.1/tests/test_sys1_recipes.py +142 -0
  53. pdl_taskmaster-2.5.1/tests/test_sys1_worker_wiring.py +215 -0
  54. pdl_taskmaster-2.5.1/tests/test_viewer_command.py +51 -0
  55. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_wire_repairs.py +109 -0
  56. pdl_taskmaster-2.5.1/tests/test_witness_projection.py +147 -0
  57. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/LICENSE +0 -0
  58. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/AUTHORITY_MAP.json +0 -0
  59. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/CALIBRATION.json +0 -0
  60. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/CONTRACT_MANIFEST.json +0 -0
  61. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/EXECUTION_CONTRACT.json +0 -0
  62. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/IMPLEMENTATION_BOUNDARY.json +0 -0
  63. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/VERIFICATION_CONTRACT.json +0 -0
  64. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/ARTIFACT_STANDARD.md +0 -0
  65. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/AUTHORITY_STANDARD.md +0 -0
  66. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/CONFORMANCE_STANDARD.md +0 -0
  67. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/CONTEXT_STANDARD.md +0 -0
  68. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/EXECUTION_STANDARD.md +0 -0
  69. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/HANDOFF_STANDARD.md +0 -0
  70. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/INSTALLATION_STANDARD.md +0 -0
  71. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/PDL_STANDARD.md +0 -0
  72. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/PROMPT_STANDARD.md +0 -0
  73. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/PROTOCOL_STANDARD.md +0 -0
  74. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/RESPONSE_PLAN_STANDARD.md +0 -0
  75. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/RESULT_STANDARD.md +0 -0
  76. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/REVIEW_STANDARD.md +0 -0
  77. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/SEMANTIC_INPUT_STANDARD.md +0 -0
  78. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/contracts/standards/TASK_SEMANTICS_STANDARD.md +0 -0
  79. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/AUTHORITY_MAP.json +0 -0
  80. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/CALIBRATION.json +0 -0
  81. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/CONTRACT_MANIFEST.json +0 -0
  82. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/EXECUTION_CONTRACT.json +0 -0
  83. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/IMPLEMENTATION_BOUNDARY.json +0 -0
  84. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/VERIFICATION_CONTRACT.json +0 -0
  85. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/ARTIFACT_STANDARD.md +0 -0
  86. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/AUTHORITY_STANDARD.md +0 -0
  87. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/CONFORMANCE_STANDARD.md +0 -0
  88. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/CONTEXT_STANDARD.md +0 -0
  89. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/EXECUTION_STANDARD.md +0 -0
  90. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/HANDOFF_STANDARD.md +0 -0
  91. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/INSTALLATION_STANDARD.md +0 -0
  92. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/PDL_STANDARD.md +0 -0
  93. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/PROMPT_STANDARD.md +0 -0
  94. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/PROTOCOL_STANDARD.md +0 -0
  95. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/RESPONSE_PLAN_STANDARD.md +0 -0
  96. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/RESULT_STANDARD.md +0 -0
  97. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/REVIEW_STANDARD.md +0 -0
  98. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/SEMANTIC_INPUT_STANDARD.md +0 -0
  99. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/contracts/standards/TASK_SEMANTICS_STANDARD.md +0 -0
  100. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/__init__.py +0 -0
  101. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/mechanical_controller.py +0 -0
  102. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/schemas/activation_decision.schema.json +0 -0
  103. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/schemas/artifact_body.schema.json +0 -0
  104. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/schemas/artifact_review_facts.schema.json +0 -0
  105. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/schemas/bootstrap_analysis.schema.json +0 -0
  106. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/schemas/execution_draft.schema.json +0 -0
  107. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/schemas/execution_input_decision.schema.json +0 -0
  108. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/schemas/execution_outcome.schema.json +0 -0
  109. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/schemas/plan_artifact.schema.json +0 -0
  110. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/schemas/prompt_artifact.schema.json +0 -0
  111. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/controller/schemas/protocol_discussion.schema.json +0 -0
  112. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/__init__.py +0 -0
  113. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/build_adversarial_battery.py +0 -0
  114. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/compare_eval_runs.py +0 -0
  115. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/control_api_call.py +0 -0
  116. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/export_rlcd_dataset.py +0 -0
  117. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/fidelity_scan.py +0 -0
  118. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/gen_fidelity_battery.py +0 -0
  119. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/leak_scan.py +0 -0
  120. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/rerecord_fixtures.py +0 -0
  121. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/run_canary_shape_probe.py +0 -0
  122. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/run_dual_gate_probe.py +0 -0
  123. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/run_qualified_batch.py +0 -0
  124. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/eval/summarize_run.py +0 -0
  125. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/host/__init__.py +0 -0
  126. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/observation/__init__.py +0 -0
  127. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/observation/cli.py +0 -0
  128. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/observation/observed_session.py +0 -0
  129. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/observation/parsers.py +0 -0
  130. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/observation/records.py +0 -0
  131. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/observation/session.py +0 -0
  132. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/observation/sink.py +0 -0
  133. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/observation/sinks.py +0 -0
  134. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/providers/README.md +0 -0
  135. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/providers/__init__.py +0 -0
  136. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/providers/base.py +0 -0
  137. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/providers/codex_worker.py +0 -0
  138. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/providers/fixtures.py +0 -0
  139. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/providers/live_stub.py +0 -0
  140. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/providers/recorded.py +0 -0
  141. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/py.typed +0 -0
  142. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/__init__.py +0 -0
  143. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/context_compiler.py +0 -0
  144. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/normative_store.py +0 -0
  145. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/presentation.py +0 -0
  146. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/quarantine.py +0 -0
  147. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/semantic_observer.py +0 -0
  148. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/standard_registry.py +0 -0
  149. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/worker-bootstrap.txt +0 -0
  150. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/runtime/workspace.py +0 -0
  151. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/tracking/__init__.py +0 -0
  152. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/src/pdl_taskmaster/tracking/mlflow_sink.py +0 -0
  153. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/FIXTURE_MANIFEST.json +0 -0
  154. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/BND-00/turns.json +0 -0
  155. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/DRIP-01/turns.json +0 -0
  156. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/DRIP-02/turns.json +0 -0
  157. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/DRIP-03/turns.json +0 -0
  158. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/DRIP-04/turns.json +0 -0
  159. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/DRIP-05/turns.json +0 -0
  160. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/DRIP-06/turns.json +0 -0
  161. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/DRIP-07/turns.json +0 -0
  162. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/DRIP-08/turns.json +0 -0
  163. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/DRIP-09/turns.json +0 -0
  164. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/DRIP-10/turns.json +0 -0
  165. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/ENC-01/turns.json +0 -0
  166. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/ENC-02/turns.json +0 -0
  167. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/ENC-03/turns.json +0 -0
  168. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/ENC-04/turns.json +0 -0
  169. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/ENC-05/turns.json +0 -0
  170. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/ENC-06/turns.json +0 -0
  171. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/ENC-07/turns.json +0 -0
  172. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/ENC-08/turns.json +0 -0
  173. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/ENC-09/turns.json +0 -0
  174. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/ENC-10/turns.json +0 -0
  175. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/F4-CONTRADICTION/turns.json +0 -0
  176. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/MANIFEST.json +0 -0
  177. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/STACK-01/turns.json +0 -0
  178. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/STACK-02/turns.json +0 -0
  179. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/STACK-03/turns.json +0 -0
  180. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/STACK-04/turns.json +0 -0
  181. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/adversarial/STACK-05/turns.json +0 -0
  182. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/ACTOR-01/turns.json +0 -0
  183. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/ACTOR-02/turns.json +0 -0
  184. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/ACTOR-03/turns.json +0 -0
  185. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/DISAMB-01/turns.json +0 -0
  186. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/DISAMB-02/turns.json +0 -0
  187. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/DISAMB-03/turns.json +0 -0
  188. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/DISAMB-04/turns.json +0 -0
  189. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/MANIFEST.json +0 -0
  190. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/MC-01/turns.json +0 -0
  191. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/MC-02/turns.json +0 -0
  192. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/MC-03/turns.json +0 -0
  193. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/MC-04/turns.json +0 -0
  194. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/MC-05/turns.json +0 -0
  195. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/fidelity/MC-06/turns.json +0 -0
  196. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/fixtures/recorded-cases.json +0 -0
  197. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_adversarial_battery.py +0 -0
  198. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_evidence_sink.py +0 -0
  199. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_fidelity_scan.py +0 -0
  200. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_harness_baseline.py +0 -0
  201. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_mlflow_logger.py +0 -0
  202. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_phase9_turns.py +0 -0
  203. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_quarantine.py +0 -0
  204. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_quarantine_generalized.py +0 -0
  205. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_rlcd_dataset.py +0 -0
  206. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_sem05_wiring.py +0 -0
  207. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_task_entities.py +0 -0
  208. {pdl_taskmaster-2.4.0 → pdl_taskmaster-2.5.1}/tests/test_v230_features.py +0 -0
@@ -7,7 +7,9 @@ dist/
7
7
  build/
8
8
  *.egg-info/
9
9
  mlflow.db
10
+ **/mlflow.db
10
11
  mlruns/
12
+ **/mlruns/
11
13
  runs/
12
14
  scratch/
13
15
  *.log
@@ -0,0 +1,28 @@
1
+ # Notices and attribution
2
+
3
+ ## Project license
4
+
5
+ Original project code and documentation are released under the
6
+ [MIT License](LICENSE).
7
+
8
+ ## Pseudocode-standard compatibility
9
+
10
+ The local PDL compatibility profile was informed by a supplied HTML snapshot
11
+ titled **Pseudocode Standard**, attributed in its source history to J. Dalbey
12
+ and published on the Cal Poly course site at:
13
+
14
+ <https://users.csc.calpoly.edu/~jdalbey/SWE/pdl_std.html>
15
+
16
+ The public bundle does not include the supplied HTML snapshot or copy its prose
17
+ or examples. It contains a project-authored description of the functional
18
+ notation and an original set of examples needed for compatibility. That local
19
+ profile is released under MIT with the project's other original contributions.
20
+ The source title, author attribution, and site name are used only for provenance
21
+ and compatibility identification; their rights remain with their respective
22
+ owners.
23
+
24
+ ## Evaluation models and product names
25
+
26
+ Model, product, and organization names in the evaluation documentation are
27
+ used for identification and do not imply endorsement. Their marks remain the
28
+ property of their respective owners.
@@ -1,10 +1,11 @@
1
- Metadata-Version: 2.5
1
+ Metadata-Version: 2.3
2
2
  Name: pdl-taskmaster
3
- Version: 2.4.0
3
+ Version: 2.5.1
4
4
  Summary: Deterministic protocol governance and bounded AI agent harness
5
5
  Author: PDL-Standard Contributors
6
- License-Expression: MIT
6
+ License: MIT
7
7
  License-File: LICENSE
8
+ License-File: NOTICE.md
8
9
  Classifier: Development Status :: 5 - Production/Stable
9
10
  Classifier: Intended Audience :: Developers
10
11
  Classifier: License :: OSI Approved :: MIT License
@@ -52,6 +53,8 @@ docs/ documentation
52
53
  architecture/ framing.md, whitepaper.md, protocol specs
53
54
  operations/ eval-metrics.md, efficiency-report.md
54
55
  governance/ roadmap.md, experiment-log.md (full decision history)
56
+ releases/ v2.5.0.md release notes
57
+ ABLATIONS.md substantive correctness and dual-plane empirical ablations
55
58
  adr/ trd/ background architecture-decision records (history, not required reading)
56
59
  ```
57
60
 
@@ -93,7 +96,7 @@ pdlt # Launch interactive REPL (default)
93
96
 
94
97
  ```powershell
95
98
  pdlt verify # Deterministic baseline verifier
96
- pytest # Run complete test suite (offline, 87 passed)
99
+ pytest # Run complete test suite (offline, 174 passed, 2 skipped)
97
100
  ```
98
101
 
99
102
  The verifier checks required runtime/instructional files, imports, the zero-template workspace invariant, fixture hashes, REPL subprocess-script presence, source-repository isolation, a fresh-workspace lifecycle test (prompt → plan → execute → result), and resuming that same workspace. All verifier workspaces are temporary.
@@ -107,22 +110,34 @@ pdlt --worker recorded --case-ids G06 --new-session
107
110
 
108
111
  Recorded mode is **exact, deterministic replay**: it only responds to the exact interaction sequences captured in the fixture (`G06`: full lifecycle; `A02`: prompt revision). Use `--quit` to exit — there's no `/exit` command.
109
112
 
110
- Commands: `/help`, `/status`, `/session`, `/new`, `/resume`, `/mlflow [on|off]`, `/tokens [on|off]`, `/timeout [seconds]`, `/model [name]`, `/worker [api|codex|recorded]`, `/config` (codex only), `/sandbox` (codex only), `/workdir [path]`, `/transcript [path]`, `/quit`.
113
+ Commands: `/help`, `/status`, `/session`, `/new`, `/resume`, `/dev [on|off]`, `/mlflow [on|off]`, `/tokens [on|off]`, `/timeout [seconds]`, `/model [name]`, `/worker [api|codex|recorded]`, `/config` (codex only), `/sandbox` (codex only), `/workdir [path]`, `/transcript [path]`, `/paste` (or `"""`), `/quit`.
111
114
 
112
115
  Fast-path review commands: `/confirm`, `/revise <feedback>`, `/stop`.
113
116
 
114
117
  ## Live model worker (default)
115
118
 
116
119
  ```powershell
117
- # Default worker is 'api' with model 'z-ai/glm-4.7'
120
+ # Default worker is 'api' with model 'openai/gpt-oss-120b'
118
121
  pdlt --new-session
119
122
  # or: python -m pdl_taskmaster.host.repl --candidate-repo . --new-session
120
123
  ```
121
124
 
122
- > **System 1 / System 2 Architecture Note**: Production default is `--worker api` (System 2, e.g. `z-ai/glm-4.7`). Local fast System 1 classification models are undergoing contrastive RLCD fine-tuning (ADR-0012) and fail-closed to System 2 via the confidence ladder if threshold ($0.85$) or top-2 margin ($0.40$) are unmet.
125
+ > **System 1 / System 2 Architecture Note**: Production default is `--worker api` (System 2: `openai/gpt-oss-120b` with reasoning effort `low`; benchmarks evaluated on `z-ai/glm-4.7`). Local fast System 1 classification models are undergoing contrastive RLCD fine-tuning (ADR-0012) and fail-closed to System 2 via the confidence ladder if threshold ($0.85$) or top-2 margin ($0.40$) are unmet.
123
126
 
124
127
  `--worker api` sends the compiled interpretation/plan directly to an OpenAI-compatible `/responses` endpoint (instructions bundled in `src/pdl_taskmaster/runtime/worker-bootstrap.txt`), with no tool definitions, sandbox, or agentic system prompt attached — deliberately; see the "instruction-lightness" finding in the whitepaper (§3).
125
128
 
129
+ ### REPL Dev Mode & Substantive Verification
130
+
131
+ ```powershell
132
+ pdlt --dev # Launch with live telemetry inspector and stage controls
133
+ pdlt --dev --exit-on-close # Headless test run: exit when CLOSED_SUCCESS or error reached
134
+ ```
135
+
136
+ - **Interactive Telemetry Inspector**: Displays real-time controller stage transitions, entity drops, and verification events.
137
+ - **Substantive Witness Verification & OS Sandbox**: For combinatorial and algorithmic tasks, execution occurs within an OS-confined sandbox (Job Objects on Windows, `rlimit` on POSIX) with deterministic witness verification ([ADR-0013](docs/adr/0013-substantive-correctness-verification.md), [ADR-0015](docs/adr/0015-model-synthesized-verification-and-confinement-boundaries.md)).
138
+ - **Deliverable Formatting**: Automatic ASCII-safe human/agent deliverable cards (`format_friendly_deliverable`) replacing raw Result IR wire blocks in user view.
139
+ - **Empirical Benchmarks & Ablations**: Full evaluation results comparing System 1, ungrounded System 2, and the dual-plane harness: [`docs/ABLATIONS.md`](docs/ABLATIONS.md).
140
+
126
141
  ### Efficiency flags (`--worker api`)
127
142
 
128
143
  - `--api-reasoning-effort low|medium|high` — reasoning budget override, applied globally.
@@ -26,6 +26,8 @@ docs/ documentation
26
26
  architecture/ framing.md, whitepaper.md, protocol specs
27
27
  operations/ eval-metrics.md, efficiency-report.md
28
28
  governance/ roadmap.md, experiment-log.md (full decision history)
29
+ releases/ v2.5.0.md release notes
30
+ ABLATIONS.md substantive correctness and dual-plane empirical ablations
29
31
  adr/ trd/ background architecture-decision records (history, not required reading)
30
32
  ```
31
33
 
@@ -67,7 +69,7 @@ pdlt # Launch interactive REPL (default)
67
69
 
68
70
  ```powershell
69
71
  pdlt verify # Deterministic baseline verifier
70
- pytest # Run complete test suite (offline, 87 passed)
72
+ pytest # Run complete test suite (offline, 174 passed, 2 skipped)
71
73
  ```
72
74
 
73
75
  The verifier checks required runtime/instructional files, imports, the zero-template workspace invariant, fixture hashes, REPL subprocess-script presence, source-repository isolation, a fresh-workspace lifecycle test (prompt → plan → execute → result), and resuming that same workspace. All verifier workspaces are temporary.
@@ -81,22 +83,34 @@ pdlt --worker recorded --case-ids G06 --new-session
81
83
 
82
84
  Recorded mode is **exact, deterministic replay**: it only responds to the exact interaction sequences captured in the fixture (`G06`: full lifecycle; `A02`: prompt revision). Use `--quit` to exit — there's no `/exit` command.
83
85
 
84
- Commands: `/help`, `/status`, `/session`, `/new`, `/resume`, `/mlflow [on|off]`, `/tokens [on|off]`, `/timeout [seconds]`, `/model [name]`, `/worker [api|codex|recorded]`, `/config` (codex only), `/sandbox` (codex only), `/workdir [path]`, `/transcript [path]`, `/quit`.
86
+ Commands: `/help`, `/status`, `/session`, `/new`, `/resume`, `/dev [on|off]`, `/mlflow [on|off]`, `/tokens [on|off]`, `/timeout [seconds]`, `/model [name]`, `/worker [api|codex|recorded]`, `/config` (codex only), `/sandbox` (codex only), `/workdir [path]`, `/transcript [path]`, `/paste` (or `"""`), `/quit`.
85
87
 
86
88
  Fast-path review commands: `/confirm`, `/revise <feedback>`, `/stop`.
87
89
 
88
90
  ## Live model worker (default)
89
91
 
90
92
  ```powershell
91
- # Default worker is 'api' with model 'z-ai/glm-4.7'
93
+ # Default worker is 'api' with model 'openai/gpt-oss-120b'
92
94
  pdlt --new-session
93
95
  # or: python -m pdl_taskmaster.host.repl --candidate-repo . --new-session
94
96
  ```
95
97
 
96
- > **System 1 / System 2 Architecture Note**: Production default is `--worker api` (System 2, e.g. `z-ai/glm-4.7`). Local fast System 1 classification models are undergoing contrastive RLCD fine-tuning (ADR-0012) and fail-closed to System 2 via the confidence ladder if threshold ($0.85$) or top-2 margin ($0.40$) are unmet.
98
+ > **System 1 / System 2 Architecture Note**: Production default is `--worker api` (System 2: `openai/gpt-oss-120b` with reasoning effort `low`; benchmarks evaluated on `z-ai/glm-4.7`). Local fast System 1 classification models are undergoing contrastive RLCD fine-tuning (ADR-0012) and fail-closed to System 2 via the confidence ladder if threshold ($0.85$) or top-2 margin ($0.40$) are unmet.
97
99
 
98
100
  `--worker api` sends the compiled interpretation/plan directly to an OpenAI-compatible `/responses` endpoint (instructions bundled in `src/pdl_taskmaster/runtime/worker-bootstrap.txt`), with no tool definitions, sandbox, or agentic system prompt attached — deliberately; see the "instruction-lightness" finding in the whitepaper (§3).
99
101
 
102
+ ### REPL Dev Mode & Substantive Verification
103
+
104
+ ```powershell
105
+ pdlt --dev # Launch with live telemetry inspector and stage controls
106
+ pdlt --dev --exit-on-close # Headless test run: exit when CLOSED_SUCCESS or error reached
107
+ ```
108
+
109
+ - **Interactive Telemetry Inspector**: Displays real-time controller stage transitions, entity drops, and verification events.
110
+ - **Substantive Witness Verification & OS Sandbox**: For combinatorial and algorithmic tasks, execution occurs within an OS-confined sandbox (Job Objects on Windows, `rlimit` on POSIX) with deterministic witness verification ([ADR-0013](docs/adr/0013-substantive-correctness-verification.md), [ADR-0015](docs/adr/0015-model-synthesized-verification-and-confinement-boundaries.md)).
111
+ - **Deliverable Formatting**: Automatic ASCII-safe human/agent deliverable cards (`format_friendly_deliverable`) replacing raw Result IR wire blocks in user view.
112
+ - **Empirical Benchmarks & Ablations**: Full evaluation results comparing System 1, ungrounded System 2, and the dual-plane harness: [`docs/ABLATIONS.md`](docs/ABLATIONS.md).
113
+
100
114
  ### Efficiency flags (`--worker api`)
101
115
 
102
116
  - `--api-reasoning-effort low|medium|high` — reasoning budget override, applied globally.
@@ -14,6 +14,11 @@
14
14
  | [ADR-0010](0010-pydantic-wire-enforcement.md) | Accepted | Pydantic v2 schema enforcement and automated operator retry corrections for wire contracts. |
15
15
  | [ADR-0011](0011-in-memory-vfs-and-microvm-sandboxing.md) | Accepted | Software-defined in-memory VFS context flow and ephemeral MicroVM agent sandboxing via MCP. |
16
16
  | [ADR-0012](0012-system-1-decision-models-via-rlcd.md) | Accepted | Realign Track L to System 1 decision models (Laya/Jev) aligned via RLCD contrastive distillation. |
17
+ | [ADR-0013](0013-substantive-correctness-verification.md) | Proposed | Verified execution and bidirectional witness retention for substantive correctness. |
18
+ | [ADR-0014](0014-dual-plane-boundary-and-wire-conformance.md) | Accepted | Dual-plane boundary architecture: positive structural guidance, wire-level Pydantic contract enforcement, and tripartite clause governance. |
19
+ | [ADR-0015](0015-model-synthesized-verification-and-confinement-boundaries.md) | Proposed | Model-synthesized verification and confinement boundaries in ephemeral sandboxes. |
20
+ | [ADR-0016](0016-pydantic-ssot-wire-and-deliverable-boundary-enforcement.md) | Accepted | Pydantic Single Source of Truth (SSOT) for wire and deliverable boundary enforcement. |
21
+ | [ADR-0017](0017-dual-plane-runtime-realignment-and-mrv-solver-governance.md) | Accepted | Dual-Plane Runtime Realignment: System 1 (Jev) Baseline & Constraint-Ordered Solver Governance. |
17
22
 
18
23
  The records are intentionally separated so UI, context construction, execution
19
24
  isolation, output representation, and reasoning policy can evolve without
@@ -1,5 +1,5 @@
1
1
  [build-system]
2
- requires = ["hatchling"]
2
+ requires = ["hatchling<1.26.0"]
3
3
  build-backend = "hatchling.build"
4
4
 
5
5
  [project]
@@ -8,8 +8,7 @@ dynamic = ["version"]
8
8
  description = "Deterministic protocol governance and bounded AI agent harness"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
11
- license = "MIT"
12
- license-files = ["LICENSE"]
11
+ license = { text = "MIT" }
13
12
  authors = [
14
13
  { name = "PDL-Standard Contributors" },
15
14
  ]
@@ -1,6 +1,6 @@
1
1
  """PDL-Taskmaster: Deterministic protocol governance and bounded AI agent harnesses."""
2
2
 
3
- __version__ = "2.4.0"
3
+ __version__ = "2.5.1"
4
4
  __protocol_version__ = "v2"
5
5
 
6
6
  __all__ = ["__version__", "__protocol_version__"]
@@ -16,6 +16,27 @@
16
16
  "open_defects"
17
17
  ],
18
18
  "properties": {
19
+ "witness": {
20
+ "type": "object",
21
+ "description": "Witness certifying substantive execution correctness (ADR-0013 / ADR-0015).",
22
+ "properties": {
23
+ "polarity": { "type": "string", "enum": ["positive", "negative"] },
24
+ "evidence": {
25
+ "type": "object",
26
+ "properties": {
27
+ "path": { "type": "string" },
28
+ "section": { "type": "string" },
29
+ "observed": { "type": "string" }
30
+ },
31
+ "required": ["path"]
32
+ },
33
+ "data": { "type": "object" },
34
+ "search_exhausted": { "type": "boolean" },
35
+ "nodes_explored": { "type": "integer" },
36
+ "method": { "type": "string" }
37
+ },
38
+ "required": ["polarity"]
39
+ },
19
40
  "files": {
20
41
  "type": "array",
21
42
  "items": {
@@ -84,6 +84,7 @@ class PDLtHost:
84
84
  higher_priority_constraints=self.higher_priority_constraints,
85
85
  available_execution_tools=[],
86
86
  render_compact=self.render_compact,
87
+ sys1_client=getattr(self.worker, "sys1_client", None),
87
88
  )
88
89
  except Exception as exc:
89
90
  # Graceful degradation: a session with no committed protocol
@@ -99,6 +100,7 @@ class PDLtHost:
99
100
  available_execution_tools=[],
100
101
  workspace_root=self.workspace_root,
101
102
  render_compact=self.render_compact,
103
+ sys1_client=getattr(self.worker, "sys1_client", None),
102
104
  )
103
105
  self.engine = engine
104
106
  if self.observation_dir is not None:
@@ -73,7 +73,13 @@ def _cmd_verify(argv: list[str]) -> int:
73
73
  return verify_main()
74
74
 
75
75
 
76
- def main(argv: list[str] | None = None) -> int:
76
+ def _cmd_viewer(argv: list[str]) -> int:
77
+ from pdl_taskmaster.tools.viewer_server import main as viewer_main
78
+
79
+ return viewer_main(argv)
80
+
81
+
82
+ def _main_impl(argv: list[str] | None = None) -> int:
77
83
  if argv is None:
78
84
  argv = sys.argv[1:]
79
85
 
@@ -89,6 +95,8 @@ def main(argv: list[str] | None = None) -> int:
89
95
  return _cmd_init(argv[1:])
90
96
  if subcmd == "verify":
91
97
  return _cmd_verify(argv[1:])
98
+ if subcmd in {"viewer", "ui", "dashboard"}:
99
+ return _cmd_viewer(argv[1:])
92
100
 
93
101
  # Default: route all other invocations to REPL
94
102
  from pdl_taskmaster.host.repl import main as repl_main
@@ -96,5 +104,13 @@ def main(argv: list[str] | None = None) -> int:
96
104
  return repl_main()
97
105
 
98
106
 
107
+ def main(argv: list[str] | None = None) -> int:
108
+ try:
109
+ return _main_impl(argv)
110
+ except KeyboardInterrupt:
111
+ print("\n[session terminated by user]", file=sys.stderr, flush=True)
112
+ return 130
113
+
114
+
99
115
  if __name__ == "__main__":
100
116
  raise SystemExit(main())