test_task_policy.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from __future__ import annotations
  2. import pytest
  3. from script_build_host.domain.artifacts import DirectionConstraint
  4. from script_build_host.domain.task_contracts import (
  5. PlannerCriterionInput,
  6. ScriptTaskKind,
  7. TaskContractError,
  8. )
  9. from script_build_host.domain.task_policy import TaskPolicyCatalog
  10. def test_task_policy_injects_protected_kind_and_direction_constraint_criteria() -> None:
  11. catalog = TaskPolicyCatalog()
  12. criteria = catalog.criteria(
  13. task_id="paragraph-task",
  14. task_kind=ScriptTaskKind.PARAGRAPH,
  15. business=(
  16. PlannerCriterionInput(
  17. client_key="business-quality",
  18. description="the opening is memorable",
  19. hard=False,
  20. ),
  21. ),
  22. direction_constraints=(
  23. DirectionConstraint(
  24. constraint_id="facts-traceable",
  25. statement="Every factual claim remains traceable",
  26. rationale="hard publication rule",
  27. ),
  28. ),
  29. )
  30. assert criteria[0].criterion_id == "paragraph-content-complete"
  31. assert criteria[0].hard is True
  32. assert criteria[1].criterion_id == "direction-constraint-facts-traceable"
  33. assert criteria[1].hard is True
  34. assert criteria[2].description == "the opening is memorable"
  35. assert criteria[2].hard is False
  36. def test_retrieval_criteria_are_typed_and_host_rendered() -> None:
  37. criteria = TaskPolicyCatalog().criteria(
  38. task_id="external",
  39. task_kind=ScriptTaskKind.EXTERNAL_RETRIEVAL,
  40. business=(
  41. PlannerCriterionInput(
  42. client_key="coverage",
  43. criterion_type="concept_coverage",
  44. params={"concepts": ["占器械", "玩手机", "双重标准"], "minimum_matches": 2},
  45. ),
  46. ),
  47. )
  48. assert criteria[1].description == "Evidence covers at least 2 of: 占器械, 玩手机, 双重标准"
  49. def test_retrieval_rejects_free_text_synthesis_contract_before_dispatch() -> None:
  50. with pytest.raises(TaskContractError, match="TASK_CAPABILITY_MISMATCH"):
  51. TaskPolicyCatalog().criteria(
  52. task_id="external",
  53. task_kind=ScriptTaskKind.EXTERNAL_RETRIEVAL,
  54. business=(
  55. PlannerCriterionInput(
  56. client_key="persona-analysis",
  57. description="write a persona analysis and element mapping document",
  58. ),
  59. ),
  60. )