test_layout.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. from __future__ import annotations
  2. import hashlib
  3. import unittest
  4. from pathlib import Path
  5. from production_build_agents.run.layout import (
  6. accepted_segment_ref_path,
  7. checkpoint_path,
  8. delivery_artifact_path,
  9. executor_candidate_path,
  10. executor_delivery_path,
  11. final_production_delivery_path,
  12. global_data_delivery_path,
  13. plan_json_path,
  14. plan_mermaid_path,
  15. preprocess_report_path,
  16. production_assembly_delivery_path,
  17. production_assembly_package_path,
  18. production_brief_path,
  19. production_media_inspection_path,
  20. production_package_path,
  21. production_plan_json_path,
  22. production_plan_mermaid_path,
  23. production_planning_package_path,
  24. production_progress_decision_path,
  25. production_progress_package_path,
  26. production_readiness_report_path,
  27. production_run_summary_path,
  28. production_tool_output_dir,
  29. production_validation_report_path,
  30. production_validator_candidate_path,
  31. run_lock_path,
  32. run_directory,
  33. run_metrics_path,
  34. run_summary_path,
  35. segment_execution_directive_path,
  36. segment_package_path,
  37. stage_candidate_path,
  38. stage_validation_report_path,
  39. stage_validator_tool_output_dir,
  40. task_package_path,
  41. tool_operation_path,
  42. tool_output_dir,
  43. validation_report_path,
  44. validator_tool_output_dir,
  45. )
  46. class RunLayoutTest(unittest.TestCase):
  47. def test_all_path_formulas_preserve_existing_layout(self) -> None:
  48. root = Path("/tmp/production-run")
  49. self.assertEqual(
  50. run_directory(Path("/tmp"), "production-run"),
  51. root,
  52. )
  53. self.assertEqual(run_lock_path(root), root / ".run.lock")
  54. self.assertEqual(checkpoint_path(root), root / "checkpoints.sqlite")
  55. self.assertEqual(
  56. checkpoint_path(root, "agent_checkpoints.sqlite"),
  57. root / "agent_checkpoints.sqlite",
  58. )
  59. self.assertEqual(
  60. production_brief_path(root),
  61. root / "production_brief.json",
  62. )
  63. self.assertEqual(
  64. preprocess_report_path(root),
  65. root / "preprocess_report.md",
  66. )
  67. self.assertEqual(
  68. plan_json_path(root, 2),
  69. root / "plans" / "global_data_dag.v2.json",
  70. )
  71. self.assertEqual(
  72. plan_mermaid_path(root, 2),
  73. root / "plans" / "global_data_dag.v2.mmd",
  74. )
  75. self.assertEqual(
  76. task_package_path(root, "Task3", 2),
  77. root / "tasks" / "Task3.v2.json",
  78. )
  79. self.assertEqual(
  80. executor_candidate_path(root, "Task3", 2),
  81. root / "artifacts" / "Task3" / "v2" / "executor_candidate.json",
  82. )
  83. self.assertEqual(
  84. delivery_artifact_path(root, "Task3", 2),
  85. root / "artifacts" / "Task3" / "v2" / "delivery_artifact.json",
  86. )
  87. self.assertEqual(
  88. executor_delivery_path(root, "Task3", 2),
  89. root / "executor_results" / "Task3.v2.json",
  90. )
  91. self.assertEqual(
  92. validation_report_path(root, "Task3", 2),
  93. root / "validation_results" / "Task3.v2.json",
  94. )
  95. self.assertEqual(
  96. stage_candidate_path(root, 2),
  97. root / "stage_candidates" / "global_data.v2.json",
  98. )
  99. self.assertEqual(
  100. stage_validation_report_path(root, 2),
  101. root / "stage_validation_results" / "global_data.v2.json",
  102. )
  103. self.assertEqual(
  104. global_data_delivery_path(root),
  105. root / "global_data_stage_delivery.json",
  106. )
  107. self.assertEqual(run_summary_path(root), root / "run_summary.json")
  108. self.assertEqual(run_metrics_path(root), root / "run_metrics.json")
  109. self.assertEqual(tool_output_dir(root), root / "tool_outputs")
  110. self.assertEqual(
  111. validator_tool_output_dir(root),
  112. root / "validator_tool_outputs",
  113. )
  114. self.assertEqual(
  115. stage_validator_tool_output_dir(root),
  116. root / "stage_validator_tool_outputs",
  117. )
  118. def test_operation_path_keeps_hashed_filename(self) -> None:
  119. root = Path("/tmp/production-run")
  120. operation_id = "run-executor-Task1-v1:3"
  121. filename = hashlib.sha256(operation_id.encode("utf-8")).hexdigest()
  122. self.assertEqual(
  123. tool_operation_path(root, operation_id),
  124. root / "tool_operations" / f"{filename}.json",
  125. )
  126. def test_production_paths_are_versioned_and_isolated(self) -> None:
  127. root = Path("/tmp/production-run")
  128. self.assertEqual(
  129. production_planning_package_path(root, 3),
  130. root / "production_planning_packages" / "v3.json",
  131. )
  132. self.assertEqual(
  133. production_plan_json_path(root, 3),
  134. root / "production_plans" / "production_dag.v3.json",
  135. )
  136. self.assertEqual(
  137. production_plan_mermaid_path(root, 3),
  138. root / "production_plans" / "production_dag.v3.mmd",
  139. )
  140. self.assertEqual(
  141. production_package_path(root, 3),
  142. root / "production_packages" / "production.v3.json",
  143. )
  144. self.assertEqual(
  145. segment_package_path(root, "Segment2", 3),
  146. root / "segment_packages" / "Segment2.v3.json",
  147. )
  148. self.assertEqual(
  149. segment_execution_directive_path(root, "Segment2", 3),
  150. root / "segment_directives" / "Segment2.v3.json",
  151. )
  152. self.assertEqual(
  153. accepted_segment_ref_path(root, "Segment2", 3),
  154. root / "accepted_segments" / "Segment2.v3.json",
  155. )
  156. self.assertEqual(
  157. production_progress_package_path(root, "Segment2", 3),
  158. root / "production_progress_packages" / "Segment2.v3.json",
  159. )
  160. self.assertEqual(
  161. production_progress_decision_path(root, "Segment2", 3),
  162. root / "production_progress_decisions" / "Segment2.v3.json",
  163. )
  164. self.assertEqual(
  165. production_assembly_package_path(root, 3),
  166. root / "production_assembly_packages" / "production.v3.json",
  167. )
  168. self.assertEqual(
  169. production_assembly_delivery_path(root, 3),
  170. root / "production_assembly_deliveries" / "production.v3.json",
  171. )
  172. self.assertEqual(
  173. production_media_inspection_path(root, 3),
  174. root / "production_media_inspections" / "production.v3.json",
  175. )
  176. self.assertEqual(
  177. production_readiness_report_path(root, 3),
  178. root / "production_readiness_reports" / "production.v3.json",
  179. )
  180. self.assertEqual(
  181. production_validator_candidate_path(root, 3),
  182. root / "production_validator_candidates" / "production.v3.json",
  183. )
  184. self.assertEqual(
  185. production_validation_report_path(root, 3),
  186. root / "production_validation_reports" / "production.v3.json",
  187. )
  188. self.assertEqual(
  189. production_tool_output_dir(root, 3),
  190. root / "production_tool_outputs" / "v3",
  191. )
  192. self.assertEqual(
  193. final_production_delivery_path(root),
  194. root / "final_production_delivery.json",
  195. )
  196. self.assertEqual(
  197. production_run_summary_path(root),
  198. root / "production_run_summary.json",
  199. )
  200. if __name__ == "__main__":
  201. unittest.main()