prettyplay 0.0.1__tar.gz → 0.0.2__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 (287) hide show
  1. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/Dockerfile +4 -1
  2. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/config.yml +6 -3
  3. prettyplay-0.0.2/.goga/history/2026/backoff-for-llm-backend/acceptance.md +296 -0
  4. prettyplay-0.0.2/.goga/history/2026/backoff-for-llm-backend/adr.md +18 -0
  5. prettyplay-0.0.2/.goga/history/2026/backoff-for-llm-backend/arch.md +544 -0
  6. prettyplay-0.0.2/.goga/history/2026/backoff-for-llm-backend/bugs/aria-snapshot-error-pollution.md +70 -0
  7. prettyplay-0.0.2/.goga/history/2026/backoff-for-llm-backend/completed/plan.md +1323 -0
  8. prettyplay-0.0.2/.goga/history/2026/backoff-for-llm-backend/design.md +1567 -0
  9. prettyplay-0.0.2/.goga/history/2026/backoff-for-llm-backend/task.md +134 -0
  10. prettyplay-0.0.2/.goga/history/2026/step-memory/acceptance.md +73 -0
  11. prettyplay-0.0.2/.goga/history/2026/step-memory/adr.md +37 -0
  12. prettyplay-0.0.2/.goga/history/2026/step-memory/arch.md +1310 -0
  13. prettyplay-0.0.2/.goga/history/2026/step-memory/completed/plan.md +815 -0
  14. prettyplay-0.0.2/.goga/history/2026/step-memory/design.md +1067 -0
  15. prettyplay-0.0.2/.goga/history/2026/step-memory/prd.md +156 -0
  16. prettyplay-0.0.2/.goga/history/2026/step-memory/task.md +140 -0
  17. prettyplay-0.0.2/.goga/history/2026/step-memory/todo.md +9 -0
  18. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/memory/architecture.md +25 -25
  19. prettyplay-0.0.2/.goga/memory/code-design.md +45 -0
  20. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/usages/conventions.md +2 -2
  21. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/usages/cooks/anthropic.md +19 -2
  22. prettyplay-0.0.2/.goga/usages/cooks/jinja.md +63 -0
  23. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/usages/cooks/openai.md +19 -2
  24. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/usages/prompts/group_diagnosis.md +9 -5
  25. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/usages/prompts/step_generation.md +7 -3
  26. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/workflows/development.yml +1 -17
  27. prettyplay-0.0.2/.goga/workflows/epic.yml +28 -0
  28. prettyplay-0.0.2/.goga/workflows/story.yml +28 -0
  29. prettyplay-0.0.2/.goga/workflows/task.yml +28 -0
  30. {prettyplay-0.0.1 → prettyplay-0.0.2}/PKG-INFO +24 -4
  31. {prettyplay-0.0.1 → prettyplay-0.0.2}/README.md +22 -3
  32. prettyplay-0.0.2/agents/analyst.sh +10 -0
  33. prettyplay-0.0.2/agents/product.sh +10 -0
  34. prettyplay-0.0.2/agents/reviewer.sh +9 -0
  35. prettyplay-0.0.2/agents/tester.sh +9 -0
  36. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/configuration.md +3 -0
  37. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/getting-started.md +1 -1
  38. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/guides/writing-steps.md +26 -4
  39. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/reference/failure-taxonomy.md +1 -1
  40. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/reference/groups.md +7 -4
  41. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/reference/hooks.md +9 -3
  42. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/reference/llm-providers.md +18 -5
  43. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/reference/step-cache.md +7 -1
  44. {prettyplay-0.0.1 → prettyplay-0.0.2}/example/tests/test_youtube.py +5 -3
  45. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/.usages/lifecycle.md +4 -1
  46. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/.usages/steps.md +55 -6
  47. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/cache/.usages/addressing.md +14 -1
  48. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/cache/budgets.py +6 -24
  49. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/cache/models.py +5 -12
  50. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/cache/store.py +4 -7
  51. prettyplay-0.0.2/prettyplay/cache/text.py +36 -0
  52. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/config/.usages/configuration.md +24 -0
  53. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/config/loader.py +8 -53
  54. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/config/models.py +12 -13
  55. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/driver/errors.py +6 -20
  56. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/driver/page.py +22 -84
  57. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/driver/session.py +29 -87
  58. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/.usages/generation.md +34 -11
  59. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/.usages/healing.md +10 -5
  60. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/attempts.py +6 -21
  61. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/classification.py +5 -11
  62. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/compliance.py +21 -15
  63. prettyplay-0.0.2/prettyplay/engine/execution.py +48 -0
  64. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/generator.py +231 -199
  65. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/groups/.usages/recovery.md +27 -4
  66. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/groups/diagnosis.py +25 -20
  67. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/groups/outcome.py +15 -14
  68. prettyplay-0.0.2/prettyplay/engine/groups/recovery.py +491 -0
  69. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/healer.py +33 -26
  70. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/polling/.usages/settle.md +4 -0
  71. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/polling/settle.py +32 -34
  72. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/polling/window.py +5 -22
  73. prettyplay-0.0.2/prettyplay/engine/renderer/.usages/memory.md +24 -0
  74. prettyplay-0.0.2/prettyplay/engine/renderer/.usages/rendering.md +44 -0
  75. prettyplay-0.0.2/prettyplay/engine/renderer/.usages/validation.md +20 -0
  76. prettyplay-0.0.2/prettyplay/engine/renderer/__init__.py +7 -0
  77. prettyplay-0.0.2/prettyplay/engine/renderer/memory.py +37 -0
  78. prettyplay-0.0.2/prettyplay/engine/renderer/render.py +184 -0
  79. prettyplay-0.0.2/prettyplay/engine/renderer/validation.py +76 -0
  80. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/steering/.usages/steering.md +7 -2
  81. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/steering/steering.py +171 -147
  82. prettyplay-0.0.2/prettyplay/engine/text.py +41 -0
  83. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/executor.py +147 -138
  84. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/failures/.usages/taxonomy.md +1 -1
  85. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/failures/errors.py +23 -86
  86. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/groups.py +88 -70
  87. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/llm/.usages/providers.md +43 -12
  88. prettyplay-0.0.2/prettyplay/llm/.usages/transport.md +81 -0
  89. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/llm/__init__.py +12 -0
  90. prettyplay-0.0.2/prettyplay/llm/_request.py +823 -0
  91. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/llm/anthropic_provider.py +139 -93
  92. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/llm/models.py +18 -42
  93. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/llm/openai_provider.py +131 -84
  94. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/llm/provider.py +62 -42
  95. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/reporting/hooks.py +5 -20
  96. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/runtime.py +6 -32
  97. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/scenario.py +93 -93
  98. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay.egg-info/PKG-INFO +24 -4
  99. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay.egg-info/SOURCES.txt +30 -0
  100. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay.egg-info/requires.txt +1 -0
  101. prettyplay-0.0.2/prettyplay.egg-info/scm_file_list.json +280 -0
  102. {prettyplay-0.0.1 → prettyplay-0.0.2}/pyproject.toml +1 -0
  103. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/cache/test_text.py +34 -0
  104. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/config/test_loader.py +27 -0
  105. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/config/test_models.py +26 -2
  106. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/conftest.py +14 -3
  107. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/groups/test_diagnosis.py +116 -3
  108. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/groups/test_outcome.py +57 -10
  109. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/groups/test_recovery.py +298 -25
  110. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/polling/test_settle.py +57 -2
  111. prettyplay-0.0.2/tests/engine/renderer/test_memory.py +84 -0
  112. prettyplay-0.0.2/tests/engine/renderer/test_render.py +220 -0
  113. prettyplay-0.0.2/tests/engine/renderer/test_validation.py +110 -0
  114. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/steering/test_steering.py +237 -52
  115. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/test_compliance.py +50 -17
  116. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/test_execution.py +55 -2
  117. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/test_generator.py +943 -83
  118. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/test_healer.py +198 -31
  119. prettyplay-0.0.2/tests/engine/test_text.py +74 -0
  120. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/llm/test_anthropic_provider.py +268 -22
  121. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/llm/test_models.py +36 -6
  122. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/llm/test_openai_provider.py +308 -21
  123. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/llm/test_provider.py +111 -11
  124. prettyplay-0.0.2/tests/llm/test_request.py +1468 -0
  125. prettyplay-0.0.2/tests/reporting/__init__.py +0 -0
  126. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/test_executor.py +276 -34
  127. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/test_groups_integration.py +221 -13
  128. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/test_integration.py +168 -7
  129. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/test_scenario.py +159 -14
  130. prettyplay-0.0.2/tests/test_transport_retries_integration.py +239 -0
  131. prettyplay-0.0.1/.goga/memory/code-design.md +0 -57
  132. prettyplay-0.0.1/.goga/workflows/epic.yml +0 -13
  133. prettyplay-0.0.1/.goga/workflows/story.yml +0 -13
  134. prettyplay-0.0.1/.goga/workflows/task.yml +0 -13
  135. prettyplay-0.0.1/agents/analyst.sh +0 -7
  136. prettyplay-0.0.1/agents/product.sh +0 -7
  137. prettyplay-0.0.1/agents/reviewer.sh +0 -7
  138. prettyplay-0.0.1/agents/tester.sh +0 -7
  139. prettyplay-0.0.1/prettyplay/cache/text.py +0 -35
  140. prettyplay-0.0.1/prettyplay/engine/execution.py +0 -30
  141. prettyplay-0.0.1/prettyplay/engine/groups/recovery.py +0 -413
  142. prettyplay-0.0.1/prettyplay/engine/text.py +0 -25
  143. prettyplay-0.0.1/prettyplay/llm/_request.py +0 -376
  144. prettyplay-0.0.1/tests/engine/test_text.py +0 -34
  145. prettyplay-0.0.1/tests/llm/test_request.py +0 -573
  146. {prettyplay-0.0.1 → prettyplay-0.0.2}/.github/workflows/docs.yml +0 -0
  147. {prettyplay-0.0.1 → prettyplay-0.0.2}/.github/workflows/lint.yml +0 -0
  148. {prettyplay-0.0.1 → prettyplay-0.0.2}/.github/workflows/new_version.yml +0 -0
  149. {prettyplay-0.0.1 → prettyplay-0.0.2}/.github/workflows/notify.yml +0 -0
  150. {prettyplay-0.0.1 → prettyplay-0.0.2}/.github/workflows/publish.yml +0 -0
  151. {prettyplay-0.0.1 → prettyplay-0.0.2}/.github/workflows/strictacode.yml +0 -0
  152. {prettyplay-0.0.1 → prettyplay-0.0.2}/.github/workflows/tests.yml +0 -0
  153. {prettyplay-0.0.1 → prettyplay-0.0.2}/.gitignore +0 -0
  154. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/add-actions/adr.md +0 -0
  155. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/add-actions/arch.md +0 -0
  156. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/add-actions/completed/plan.md +0 -0
  157. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/add-actions/design.md +0 -0
  158. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/add-actions/task.md +0 -0
  159. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/add-expect-count/adr.md +0 -0
  160. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/add-expect-count/arch.md +0 -0
  161. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/add-expect-count/completed/plan.md +0 -0
  162. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/add-expect-count/design.md +0 -0
  163. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/add-expect-count/task.md +0 -0
  164. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/additional-configuration/adr.md +0 -0
  165. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/additional-configuration/arch.md +0 -0
  166. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/additional-configuration/completed/plan.md +0 -0
  167. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/additional-configuration/design.md +0 -0
  168. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/additional-configuration/task.md +0 -0
  169. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/agent-context-window/adr.md +0 -0
  170. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/agent-context-window/arch.md +0 -0
  171. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/agent-context-window/completed/plan.md +0 -0
  172. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/agent-context-window/design.md +0 -0
  173. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/agent-context-window/task.md +0 -0
  174. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/better-healt/adr.md +0 -0
  175. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/better-healt/arch.md +0 -0
  176. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/better-healt/completed/plan.md +0 -0
  177. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/better-healt/design.md +0 -0
  178. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/better-healt/task.md +0 -0
  179. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/better-healt-2/adr.md +0 -0
  180. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/better-healt-2/arch.md +0 -0
  181. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/better-healt-2/completed/plan.md +0 -0
  182. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/better-healt-2/design.md +0 -0
  183. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/better-healt-2/task.md +0 -0
  184. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/fix-interactive-loop/adr.md +0 -0
  185. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/fix-interactive-loop/arch.md +0 -0
  186. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/fix-interactive-loop/completed/plan.md +0 -0
  187. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/fix-interactive-loop/design.md +0 -0
  188. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/fix-interactive-loop/task.md +0 -0
  189. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/fix-interactive-loop/todo.md +0 -0
  190. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/fix-user-instructions/adr.md +0 -0
  191. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/fix-user-instructions/arch.md +0 -0
  192. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/fix-user-instructions/completed/plan.md +0 -0
  193. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/fix-user-instructions/design.md +0 -0
  194. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/fix-user-instructions/task.md +0 -0
  195. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/more-usability/adr.md +0 -0
  196. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/more-usability/arch.md +0 -0
  197. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/more-usability/completed/plan.md +0 -0
  198. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/more-usability/design.md +0 -0
  199. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/more-usability/task.md +0 -0
  200. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/step-group-and-step-params/adr.md +0 -0
  201. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/step-group-and-step-params/arch.md +0 -0
  202. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/step-group-and-step-params/completed/plan.md +0 -0
  203. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/step-group-and-step-params/design.md +0 -0
  204. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/step-group-and-step-params/prd.md +0 -0
  205. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/step-group-and-step-params/task.md +0 -0
  206. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/strict-and-fullscreen-mode/adr.md +0 -0
  207. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/strict-and-fullscreen-mode/arch.md +0 -0
  208. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/strict-and-fullscreen-mode/completed/plan.md +0 -0
  209. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/strict-and-fullscreen-mode/design.md +0 -0
  210. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/strict-and-fullscreen-mode/task.md +0 -0
  211. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/the-first-version/adr.md +0 -0
  212. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/the-first-version/arch.md +0 -0
  213. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/the-first-version/completed/plan.md +0 -0
  214. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/the-first-version/design.md +0 -0
  215. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/the-first-version/prd.md +0 -0
  216. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/history/2026/the-first-version/task.md +0 -0
  217. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/scaffold.yml +0 -0
  218. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/tools/mkdocs/traceability.yml +0 -0
  219. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/usages/cooks/json_repair.md +0 -0
  220. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/usages/cooks/playwright.md +0 -0
  221. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/usages/cooks/pydantic.md +0 -0
  222. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/usages/prompts/group_framing.md +0 -0
  223. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/usages/prompts/step_cheatsheet.md +0 -0
  224. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/workflows/bugfix.yml +0 -0
  225. {prettyplay-0.0.1 → prettyplay-0.0.2}/.goga/workflows/sync.yml +0 -0
  226. {prettyplay-0.0.1 → prettyplay-0.0.2}/.strictacode.yml +0 -0
  227. {prettyplay-0.0.1 → prettyplay-0.0.2}/LICENSE +0 -0
  228. {prettyplay-0.0.1 → prettyplay-0.0.2}/MANIFEST.in +0 -0
  229. {prettyplay-0.0.1 → prettyplay-0.0.2}/agents/architector.sh +0 -0
  230. {prettyplay-0.0.1 → prettyplay-0.0.2}/agents/developer.sh +0 -0
  231. {prettyplay-0.0.1 → prettyplay-0.0.2}/agents/manager.sh +0 -0
  232. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/guides/browser-setup.md +0 -0
  233. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/index.md +0 -0
  234. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/overrides/main.html +0 -0
  235. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/reference/driver-facade.md +0 -0
  236. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/reference/interactive-steering.md +0 -0
  237. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/reference/self-healing.md +0 -0
  238. {prettyplay-0.0.1 → prettyplay-0.0.2}/docs/reference/settle-polling.md +0 -0
  239. {prettyplay-0.0.1 → prettyplay-0.0.2}/example/conftest.py +0 -0
  240. {prettyplay-0.0.1 → prettyplay-0.0.2}/example/tests/__init__.py +0 -0
  241. {prettyplay-0.0.1 → prettyplay-0.0.2}/example/tests/test_duckduckgo.py +0 -0
  242. {prettyplay-0.0.1 → prettyplay-0.0.2}/example/tests/test_yandex.py +0 -0
  243. {prettyplay-0.0.1 → prettyplay-0.0.2}/mkdocs.yml +0 -0
  244. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/__init__.py +0 -0
  245. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/cache/.usages/budgets.md +0 -0
  246. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/cache/.usages/storage.md +0 -0
  247. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/cache/__init__.py +0 -0
  248. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/config/__init__.py +0 -0
  249. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/driver/.usages/error_kinds.md +0 -0
  250. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/driver/.usages/plumbing.md +0 -0
  251. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/driver/__init__.py +0 -0
  252. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/__init__.py +0 -0
  253. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/groups/__init__.py +0 -0
  254. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/polling/__init__.py +0 -0
  255. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/engine/steering/__init__.py +0 -0
  256. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/failures/__init__.py +0 -0
  257. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/llm/.usages/classification.md +0 -0
  258. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/reporting/.usages/hooks.md +0 -0
  259. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/reporting/__init__.py +0 -0
  260. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay/reporting/reporter.py +0 -0
  261. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay.egg-info/dependency_links.txt +0 -0
  262. {prettyplay-0.0.1 → prettyplay-0.0.2}/prettyplay.egg-info/top_level.txt +0 -0
  263. {prettyplay-0.0.1 → prettyplay-0.0.2}/setup.cfg +0 -0
  264. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/__init__.py +0 -0
  265. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/cache/__init__.py +0 -0
  266. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/cache/test_budgets.py +0 -0
  267. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/cache/test_models.py +0 -0
  268. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/cache/test_store.py +0 -0
  269. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/config/__init__.py +0 -0
  270. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/driver/__init__.py +0 -0
  271. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/driver/test_errors.py +0 -0
  272. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/driver/test_page.py +0 -0
  273. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/driver/test_session.py +0 -0
  274. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/__init__.py +0 -0
  275. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/groups/__init__.py +0 -0
  276. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/polling/__init__.py +0 -0
  277. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/polling/test_window.py +0 -0
  278. {prettyplay-0.0.1/tests/failures → prettyplay-0.0.2/tests/engine/renderer}/__init__.py +0 -0
  279. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/steering/__init__.py +0 -0
  280. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/test_attempts.py +0 -0
  281. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/engine/test_classification.py +0 -0
  282. {prettyplay-0.0.1/tests/llm → prettyplay-0.0.2/tests/failures}/__init__.py +0 -0
  283. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/failures/test_errors.py +0 -0
  284. {prettyplay-0.0.1/tests/reporting → prettyplay-0.0.2/tests/llm}/__init__.py +0 -0
  285. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/reporting/test_hooks.py +0 -0
  286. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/reporting/test_reporter.py +0 -0
  287. {prettyplay-0.0.1 → prettyplay-0.0.2}/tests/test_runtime.py +0 -0
@@ -1,4 +1,4 @@
1
- FROM qarium/goga-python-3.14:1.3
1
+ FROM qarium/goga-python-3.14:2.0
2
2
 
3
3
  USER root
4
4
 
@@ -12,4 +12,7 @@ COPY agents/tester.sh /home/goga/bin/tester-as-claude.sh
12
12
 
13
13
  RUN chmod +x /home/goga/bin/*.sh
14
14
 
15
+ COPY . /tmp/project
16
+ RUN cd /tmp/project && goga install && rm -rf /tmp/project
17
+
15
18
  USER goga
@@ -10,9 +10,8 @@ dockerfile: .goga/Dockerfile
10
10
  ANTHROPIC_BASE_URL: "https://api.z.ai/api/anthropic"
11
11
 
12
12
  build:
13
- task_executor:
14
- agent: developer
15
- review_executor:
13
+ agent: developer
14
+ review:
16
15
  agent: reviewer
17
16
  base_ref: *base-ref
18
17
 
@@ -22,6 +21,10 @@ pipeline:
22
21
  <<: *claude-env
23
22
  ANTHROPIC_DEFAULT_OPUS_MODEL: "glm-5.3[1m]"
24
23
 
24
+ tools:
25
+ autonomous: latest
26
+ basic-build: latest
27
+
25
28
  topics:
26
29
  base_ref: *base-ref
27
30
 
@@ -0,0 +1,296 @@
1
+ # Final Acceptance Report
2
+
3
+ ## Summary
4
+ Audited bounded LLM transport retries across five changed cells against their CODEMANIFEST contracts, implementation and consumer usages. Found and fixed one critical supported-SDK incompatibility after explicit file-dialog approval: quota evidence in older SDK response bodies was ignored. Added 36 regression cases, reconciled consumer documentation, and completed local validation. Verdict: ACCEPTED_WITH_NOTES.
5
+
6
+ ## Acceptance Scope
7
+ | Cell | Change types reviewed |
8
+ |---|---|
9
+ | prettyplay/config | CODE, MANIFEST, USAGE, TEST |
10
+ | prettyplay/llm | CODE, MANIFEST, USAGE, TEST |
11
+ | prettyplay/failures | CODE (docstrings), MANIFEST, USAGE |
12
+ | prettyplay/engine | CODE (docstrings), MANIFEST, TEST (integration) |
13
+ | prettyplay/engine/groups | CODE (docstrings), MANIFEST |
14
+
15
+ Feature baseline: b23929d..21585a1, excluding unrelated workflow/agent edits. The pre-existing relocation of the completed execution plan is not part of this audit's commit.
16
+
17
+ ## CODEMANIFEST Status
18
+ CONSISTENT for the changed feature. Zero manifest edits. goga lint: 11 cells, 0 errors. Contract comparison covered 38 declarations in five cells; generated constructors and inherited/instance members were reconciled with runtime/source evidence. Existing public signatures remain unchanged.
19
+
20
+ ## Usages Status
21
+ CONSISTENT at the scoped cell level after six documentation updates (five modified files, one new file). Both new transport examples execute successfully with the SDK boundary mocked. Shared project-practice inaccuracies were recorded without editing shared practices.
22
+
23
+ ## Test Coverage Assessment
24
+ ADEQUATE. Full suite: 1182 passed, 0 failures/errors/skips. Combined line/branch coverage: 99.47% (lines 99.81%, branches 98.02%). Minimum supported openai 1.30.0 / anthropic 0.28.0: 337 LLM/integration tests passed. Ruff lint and format checks pass; 111 Python files already formatted.
25
+
26
+ ## Critical Findings
27
+ | Source | Finding | Status |
28
+ |---|---|---|
29
+ | Manifest/Test | Older Anthropic SDK exposes quota evidence only in body; HTTP 429 billing_error incorrectly classified as retryable | Fixed: inspect flat/nested body code/type, preserve permanent precedence; 36 regression cases and minimum-SDK validation |
30
+
31
+ Approval was received in autonomous_execution.q1.answer.json before remediation. The acceptance pipeline resumed only after the critical finding was resolved.
32
+
33
+ ## Warnings
34
+ | Source | Finding | Recommendation |
35
+ |---|---|---|
36
+ | Shared SDK usages | Opening operation counts and direct error-mapping examples predate transport retries | Update shared examples in their owning documentation workflow; current cell usages and explicit contracts are authoritative |
37
+ | Shared Pydantic usage | Automatic env propagation claim omits required loader registries | Clarify shared guidance; this feature includes the required registry entries |
38
+ | Shared Playwright usage | Some examples still use removed flat configuration names | Update shared driver examples separately; unchanged error-shape guidance used here remains applicable |
39
+
40
+ ## Applied Updates
41
+ - prettyplay/llm/_request.py
42
+ - tests/llm/test_request.py
43
+ - prettyplay/llm/.usages/providers.md
44
+ - prettyplay/llm/.usages/transport.md
45
+ - prettyplay/failures/.usages/taxonomy.md
46
+ - prettyplay/engine/.usages/generation.md
47
+ - prettyplay/engine/.usages/healing.md
48
+ - prettyplay/engine/groups/.usages/recovery.md
49
+ - .goga/history/2026/backoff-for-llm-backend/acceptance.md
50
+
51
+ No project usages or dependency bounds changed. Detailed step reports and raw validation artifacts are retained in the acceptance stage directory; the step reports are reproduced below for a self-contained repository record.
52
+
53
+ ## Risks
54
+ | Risk | Severity | Mitigation |
55
+ |---|---|---|
56
+ | Shared-practice wording may confuse future implementers | Low | Record specific discrepancies; corrected cell consumer guidance accompanies the implementation |
57
+ | Live provider/network behavior is not exercised locally | Low | Real SDK exception classes, current/minimum SDK versions, deterministic external-boundary tests; no claim of live API validation |
58
+ | Current interpreter is Python 3.12 | Low | Python 3.10-compatible source and ruff target retained; older interpreter fallback was not executed |
59
+
60
+ ## Verdict
61
+ ACCEPTED_WITH_NOTES. All five ordered acceptance steps completed; no unresolved critical contract discrepancy or critical changed-API coverage gap. Shared-documentation remarks and validation limits remain recorded above.
62
+
63
+ ---
64
+
65
+ # Acceptance Scope Report
66
+
67
+ ## Data source
68
+ The build stage context, feature history, and git diff b23929d..21585a1 identify bounded LLM transport retries. The working tree only contains the pre-existing completed-plan relocation; reviewing that relocation alone would omit the built feature. Unrelated agent/workflow changes are excluded.
69
+
70
+ ## Functionality
71
+ Bounded transport retries for both SDK providers, configurable total sends, permanent-first classification, capped exponential pauses, Retry-After handling, safe logging, and engine-budget neutrality.
72
+
73
+ ## Cells for acceptance
74
+ | Cell | Path | Change types |
75
+ |---|---|---|
76
+ | Configuration | prettyplay/config | CODE, MANIFEST, USAGE, TEST |
77
+ | LLM port | prettyplay/llm | CODE, MANIFEST, USAGE, TEST |
78
+ | Failures | prettyplay/failures | CODE (docstring), MANIFEST, USAGE |
79
+ | Engine | prettyplay/engine | CODE (docstrings), MANIFEST, TEST (integration) |
80
+ | Group recovery | prettyplay/engine/groups | CODE (docstrings), MANIFEST |
81
+
82
+ ## Affected dependencies
83
+ | Dependent cell | Dependency type | Impact assessment |
84
+ |---|---|---|
85
+ | prettyplay | DIRECT | Imports configuration and failure types; public root exports must stay unchanged. |
86
+ | prettyplay/cache | DIRECT | Imports Config; default construction remains compatible. |
87
+ | prettyplay/driver | DIRECT | Imports Config; browser settings unchanged. |
88
+ | prettyplay/engine/steering | DIRECT | Imports Config, LLMProvider, engine and failure APIs; receives bounded transport behavior. |
89
+ | prettyplay/engine/polling | TRANSITIVE | Imports driver; no changed settle behavior. |
90
+
91
+ ## Scope summary
92
+ Five changed cells; 26 source/contract/usage/test paths: 12 implementation files (including facade), 5 manifests, 3 cell usage files, and 6 test files. Cross-cell regression checks include the complete test suite. Shared practices and feature documentation are supporting evidence. The pre-existing plan relocation is excluded from acceptance edits.
93
+
94
+
95
+ ---
96
+
97
+ # Manifest Review Report
98
+
99
+ ## Linter Results
100
+ | Cell | Linter Status | Errors |
101
+ |---|---|---|
102
+ | config, llm, failures, engine, engine/groups | PASS | 0; project-wide goga lint checks all 11 cells |
103
+
104
+ ## Analysis 1 — Code vs Requirements
105
+ | Cell | Signature Match | Method Coverage | Property Coverage | Facade | Status |
106
+ |---|---|---|---|---|---|
107
+ | config | Runtime/Pydantic match | Complete | Complete | PASS | CONSISTENT |
108
+ | llm | Match | All four operations on both providers | Complete | PASS | CONSISTENT after quota fix |
109
+ | failures | Match including inherited constructors | Complete | Instance fields verified in source | PASS | CONSISTENT for changed behavior |
110
+ | engine | Match | Complete | Complete | PASS | CONSISTENT for changed behavior |
111
+ | engine/groups | Match | Complete | Complete | PASS | CONSISTENT for changed behavior |
112
+
113
+ The CLI returns comparison evidence, not a semantic pass/fail verdict. Its empty generated constructors and absent instance attributes were reconciled with runtime signatures/Pydantic fields and source. Return labels, Python defaults, and PositiveInt/Literal constraints are compatible differences. All 38 declared types are exported. PrettyConfig is an existing alias of Config, not a new implementation type.
114
+
115
+ ## Analysis 2 — Requirements vs Code
116
+ | Cell | Undocumented Entities | Description Accuracy | Annotation Quality | Status |
117
+ |---|---|---|---|---|
118
+ | config | No new omissions | Request-attempt setting matches | Changed parameters and constraints explicit | CONSISTENT |
119
+ | llm | Five transport exports declared | Classification, pause, retry and SDK wiring match after fix | Changed algorithms explicit | CONSISTENT |
120
+ | failures | No new omissions | Infrastructure error wording matches | Changed guarantees explicit | CONSISTENT |
121
+ | engine | No new omissions | No additional engine retries | Changed guarantee explicit | CONSISTENT |
122
+ | engine/groups | No new omissions | Diagnosis propagation matches | Changed guarantee explicit | CONSISTENT |
123
+
124
+ ## Algorithm Consistency
125
+ Configuration: positive total sends, default 3, file/env/explicit merge. LLM: permanent evidence precedes retryable status; raw quota body now supports older SDKs; timeout before connection; bounded pause; permanent/over-cap/exhaustion order; identical SDK request reused. Failures: existing chained error type. Engine: transport sends occur inside one logical attempt. Groups: infrastructure error escapes the recovery cycle rather than becoming another recovery attempt. All changed algorithms match.
126
+
127
+ ## Operational Flow Consistency
128
+ Both providers construct clients with max_retries=0, route all four operations through send_with_retries, and parse successful content outside that loop. Missing API keys fail before the loop. Config feeds attempts. Failure propagation and the existing quiet verdict skip remain unchanged in engine/groups.
129
+
130
+ ## Guarantee Verification
131
+ Fixed quota precedence for body-only SDK exceptions. Send budget, pause cap, Retry-After termination, chained causes, interruption, no secret-bearing retry records, and no engine budget access are preserved. Minimum supported SDK validation: 337 LLM/integration tests passed with openai 1.30.0 and anthropic 0.28.0.
132
+
133
+ ## Practice Consistency
134
+ Changed implementation uses relative imports, typed functions, private helpers, Pydantic settings, and structured retry logs. Tests use SDK boundary objects and patched sleep. Pre-existing model/style choices outside the transport change were not refactored.
135
+
136
+ ## Baseline Usages/Annotations Audit
137
+ | Cell | Baseline Usages present? | Baseline Annotations present? |
138
+ |---|---|---|
139
+ | config | Yes | Yes |
140
+ | llm | Yes | Yes |
141
+ | failures | Yes | Yes |
142
+ | engine | Yes | Yes |
143
+ | engine/groups | Yes | Yes |
144
+
145
+ ## Findings
146
+ | Cell | Analysis | Finding | Severity | Proposed Action |
147
+ |---|---|---|---|---|
148
+ | llm | Code vs requirements | Anthropic 0.28 lacks parsed type/code attributes; billing_error in body was retried | CRITICAL, fixed | Approved in autonomous_execution.q1.answer.json; inspect flat/nested body code/type and add regression tests |
149
+ | All | Tool interpretation | Static contract output omits generated/inherited members | INFO | Verified runtime facade and source; no manifest change |
150
+
151
+ ## Applied Updates
152
+ | Cell | Updated Section | Previous Value | New Value | Reason |
153
+ |---|---|---|---|---|
154
+ | llm | _request.py permanent evidence | Exception attributes only | Attributes plus flat/nested dictionary body | Supported SDK compatibility |
155
+ | llm tests | test_request.py | No body-only quota cases | 36 parameterized regression cases | Lock quota precedence, malformed-body handling, immediate termination |
156
+
157
+ No CODEMANIFEST updates. Remediation task: reproduce body-only quota failure, extend evidence extraction without changing contracts or dependency bounds, verify both providers and supported SDK minima. Completed after user approval; before-fix regressions: 18 failed/18 passed; after-fix request module: 142 passed.
158
+
159
+ ## Critical Discrepancies
160
+ None open. The single critical discrepancy above was fixed and revalidated before advancing to usages review.
161
+
162
+ ## Overall Status
163
+ CONSISTENT for the bounded transport retry feature across the five scoped cells. All manifest lint checks pass; no contract relaxation or public signature changes.
164
+
165
+
166
+ ---
167
+
168
+ # Usage Review Report
169
+
170
+ ## Cell-level usages
171
+ | Cell | Usage file | Examples valid? | Descriptions accurate? | Names aligned? | Updated? |
172
+ |---|---|---|---|---|---|
173
+ | config | configuration.md | Yes, signatures/config fields reviewed | Yes for request retries | Yes | No |
174
+ | llm | classification.md | Yes, call signature reviewed | Yes | Yes | No |
175
+ | llm | providers.md | Yes, facade/model construction reviewed | Corrected model fallback and operation list | Yes | Yes |
176
+ | llm | transport.md | Both snippets executed with SDK constructor mocked | Yes | Yes | Created |
177
+ | failures | taxonomy.md | API/exception fields reviewed; placeholders remain illustrative | Added over-cap Retry-After termination | Yes | Yes |
178
+ | engine | generation.md | Call signature reviewed | Added logical vs physical send accounting | Yes | Yes |
179
+ | engine | healing.md | Call signature reviewed | Added provider retry termination | Yes | Yes |
180
+ | engine/groups | recovery.md | Call signature reviewed | Added propagation without another cycle | Yes | Yes |
181
+
182
+ ## Project usages — remarks
183
+ | Usage file | Referenced by cells | Remark | Type |
184
+ |---|---|---|---|
185
+ | .goga/usages/cooks/openai.md | llm | Opening says three operations; examples show direct error mapping while later transport section correctly requires bounded retries. Resynchronize examples in a separate shared-practice update. | Inaccurate description, nonblocking |
186
+ | .goga/usages/cooks/anthropic.md | llm | Same older three-operation/direct-send presentation; retry policy section is current. | Inaccurate description, nonblocking |
187
+ | .goga/usages/cooks/pydantic.md | config | Says new settings receive env overrides automatically; implementation requires registry entries, correctly added for this setting. | Inaccurate description, nonblocking |
188
+ | .goga/usages/cooks/playwright.md | failures | Driver examples still use removed flat browser/headless fields. Error-message shapes used by failures remain applicable; browser configuration is outside this feature. | Stale example, nonblocking |
189
+ | .goga/usages/conventions.md | All five | Applied to changed code/tests; no shared-file update. | No new discrepancy |
190
+ | .goga/usages/cooks/json_repair.md | llm | Strict parsing after salvage and failure handling match. | No discrepancy |
191
+ | .goga/usages/prompts/step_generation.md, step_cheatsheet.md, group_framing.md, group_diagnosis.md | engine, engine/groups | Request construction and unchanged prompt responsibilities reviewed; transport wrapper does not rebuild or change prompts. | No new discrepancy |
192
+
193
+ Project usages remain unchanged, as required by this review skill. Shared-practice remarks do not change the explicit cell contracts.
194
+
195
+ ## Integrity
196
+ | Cell | All Usages have files? | All imported usages exist? | All usages referenced in annotations? |
197
+ |---|---|---|---|
198
+ | config | Yes | Yes | Yes |
199
+ | llm | Yes | Yes; no imported practices | Yes |
200
+ | failures | Yes | Yes; no imported practices | Yes |
201
+ | engine | Yes; classification/compliance practices inline | Yes | Yes |
202
+ | engine/groups | Yes | Yes; no imported practices | Yes |
203
+
204
+ Validated with goga lint: 11 cells, 0 errors.
205
+
206
+ ## Applied updates
207
+ | Usage file | Change | Reason |
208
+ |---|---|---|
209
+ | prettyplay/llm/.usages/providers.md | All four operations and accurate model fallback | Defaults can use the same model for generation and verdict |
210
+ | prettyplay/llm/.usages/transport.md | Facade examples, SDK compatibility and helper preconditions | Cover all five new transport exports |
211
+ | prettyplay/failures/.usages/taxonomy.md | Excessive Retry-After outcome and reaction | Complete terminal outcome description |
212
+ | prettyplay/engine/.usages/generation.md | Logical attempt accounting and terminal propagation | Distinguish SDK sends from engine attempts |
213
+ | prettyplay/engine/.usages/healing.md | Provider retry termination | Match runtime propagation |
214
+ | prettyplay/engine/groups/.usages/recovery.md | Retry/cycle boundary | Document no extra group cycles |
215
+
216
+ ## Uncovered patterns
217
+ None in the changed transport facade after adding transport.md. Live provider calls were not made; SDK call syntax and operation routing are covered by local tests.
218
+
219
+ ## Overall consistency
220
+ CONSISTENT for scoped cell usages after six documentation updates. Shared project-practice remarks remain advisory and were not edited.
221
+
222
+
223
+ ---
224
+
225
+ # Test Assessment Report
226
+
227
+ ## Coverage Points
228
+ | Cell | Coverage Point | Type | Source |
229
+ |---|---|---|---|
230
+ | config | llm_request_attempts field, default 3, positive value, keyword construction | contract/boundary | CODEMANIFEST |
231
+ | config | File/env/explicit layer precedence and actionable parsing errors | integration/branch | CODEMANIFEST, loader.py |
232
+ | llm | Five transport exports and function signatures | contract | CODEMANIFEST |
233
+ | llm | Nine categories, permanent precedence, unknown exception fallback | contract/branch | CODEMANIFEST, _request.py |
234
+ | llm | Raw flat/nested quota bodies without convenience SDK attributes | boundary/integration | _request.py, supported SDK versions |
235
+ | llm | Decimal/malformed Retry-After and zero wait behavior | boundary | CODEMANIFEST |
236
+ | llm | Exponential pause sequence, jitter endpoints, inclusive cap and large budget | boundary/branch | CODEMANIFEST |
237
+ | llm | Success identity, permanent/over-cap/exhaustion ordering, cause chaining | contract/branch | CODEMANIFEST |
238
+ | llm | Interruption, send ceiling, warning fields and payload exclusion | contract/integration | CODEMANIFEST |
239
+ | llm | Both SDK constructors disable retries; all eight operation routes | integration | Provider implementations |
240
+ | llm | Missing API key before retry, response validation after retry | branch | Provider implementations |
241
+ | failures | Infrastructure exception type/message and chained transport cause | contract/integration | CODEMANIFEST |
242
+ | engine | No extra logical attempt, single generation hook and cache write | integration | CODEMANIFEST, generator.py |
243
+ | engine | Compliance retry does not repeat browser action or cache unchecked code | integration/branch | compliance.py, generator.py |
244
+ | engine/groups | Infrastructure propagation; existing group-cycle and healing accounting | contract/integration | CODEMANIFEST, diagnosis.py, recovery.py |
245
+
246
+ ## Existing Tests
247
+ | Test Name / Group | File | Type | What It Verifies | Status |
248
+ |---|---|---|---|---|
249
+ | test_config_llm_request_attempts_field_defaults_and_order; test_config_rejects_llm_request_attempts_below_one | tests/config/test_models.py | CONTRACT | Setting shape/default and 0/-1 rejection | passed |
250
+ | TestLlmRequestAttemptsEnv; test_every_setting_has_an_env_override; override tests | tests/config/test_loader.py | CONTRACT/INTEGRATION | Env registry, decimal parse, actionable error and generic merge logic | passed |
251
+ | TestTransportFailureClassificationContract; TestClassifiersContract; TestFacadeExports | tests/llm/test_request.py | CONTRACT | Model, signatures, root-facade isolation | passed |
252
+ | TestTransportFailureClassification; TestClassifyFailures | tests/llm/test_request.py | CONTRACT | Category truth table, exception mapping, Retry-After | passed |
253
+ | TestQuotaBodyEvidence (36 cases, added in this audit) | tests/llm/test_request.py | CONTRACT/INTEGRATION | Both SDKs; flat/nested code/type; 429/503; malformed bodies; no resend/sleep/log on quota | passed |
254
+ | TestComputeTransportPause | tests/llm/test_request.py | CONTRACT | Sequence, jitter bounds, Retry-After lift, large attempt number | passed |
255
+ | TestSendWithRetries; TestSendWithRetriesTerminal; TestSendWithRetriesEdges | tests/llm/test_request.py | CONTRACT/INTEGRATION | Retry state machine, send budget, terminal precedence, interruption and logging | passed |
256
+ | TestOpenAIProviderTransportWiring | tests/llm/test_openai_provider.py | INTEGRATION | Four routes, both max_retries constructors, recovery, rejection, missing key | passed |
257
+ | TestAnthropicProviderTransportWiring | tests/llm/test_anthropic_provider.py | INTEGRATION | Four mirrored routes and SDK behavior | passed |
258
+ | Failure taxonomy suite | tests/failures/ | CONTRACT | Exception API, inheritance, rendering | passed |
259
+ | test_engine_budgets_untouched_by_transport_retries | tests/test_transport_retries_integration.py | INTEGRATION | Two sends inside one generation attempt and one cache write | passed |
260
+ | test_compliance_retry_does_not_repeat_candidate_or_cache_without_verdict (2 cases) | tests/test_transport_retries_integration.py | INTEGRATION | Recovery/exhaustion after one browser action, cache gated by verdict | passed |
261
+ | Engine and group suites | tests/engine/ | CONTRACT/INTEGRATION | Existing classification, healing and group propagation/accounting | passed |
262
+
263
+ Full test enumeration and status: stage artifact test_inventory.tsv (1182 cases), with machine-readable tests.xml. Tests use real domain logic and SDK exception classes; SDK network/browser boundaries and sleeps are replaced.
264
+
265
+ ## Coverage Assessment
266
+ | Coverage Point | Covered by Test? | Test | Test Type | Coverage Completeness |
267
+ |---|---|---|---|---|
268
+ | Config field and loading | Yes | Model and loader groups above | CONTRACT/INTEGRATION | Adequate; shared merge tests also exercise scalar precedence |
269
+ | Transport API surface | Yes | Contract/facade groups above | CONTRACT | Complete changed API |
270
+ | Classifiers and SDK compatibility | Yes | Classifier groups + quota regressions, minimum-SDK run | CONTRACT/INTEGRATION | Adequate; fixed uncovered body-only representation |
271
+ | Delay and terminal state machine | Yes | Pause/terminal/edge groups | CONTRACT | Adequate; branches exercised for valid positive budgets |
272
+ | Provider parity and parsing boundary | Yes | Both provider suites | CONTRACT/INTEGRATION | All four operations per provider; validation remains outside loop |
273
+ | Error taxonomy and engine semantics | Yes | Failure/engine/group suites + three transport integration cases | CONTRACT/INTEGRATION | Adequate; generation and compliance covered end to end with fake external boundaries |
274
+
275
+ Measured combined line/branch coverage: whole project 99.47% (lines 99.81%, branches 98.02%); config models 100%, loader 98.69%; engine and engine/groups scoped modules 100%; failures 100%; _request.py 99.23%; OpenAI provider 98.36%; Anthropic provider 98.55%. Coverage percentages are supporting evidence, not proof of all semantics.
276
+
277
+ ## Test Run Results
278
+ - Current environment, complete suite: 1182 passed, 0 failed, 0 errors, no skips (8.66 seconds).
279
+ - Minimum supported SDK environment: openai 1.30.0, anthropic 0.28.0, httpx below 0.28; LLM and transport integration suites: 337 passed.
280
+ - Regression proof before fix: 18 failing quota cases and 18 passing malformed-body cases. After fix: request module 142 passed.
281
+ - Ruff source/tests lint: passed. Format check: 111 files already formatted. git diff --check: passed.
282
+ - Coverage data and test output are preserved in stage artifacts coverage.json, tests.log, tests.xml and min-sdk-tests.log.
283
+
284
+ ## Coverage Gaps
285
+ | Coverage Point | Gap Type | Description |
286
+ |---|---|---|
287
+ | Supported SDK body-only quota | CRITICAL, resolved | Regression suite added with approved remediation; no open gap |
288
+ | Defensive loop tail | INFO | Unexecuted assertion requires attempts <= 0, outside Config's positive-budget contract |
289
+ | Unchanged SDK client reuse branch and Python 3.10 TOML import | INFO | Not traversed in this Python 3.12 run; unrelated existing paths, not changed transport behavior |
290
+ | Live hosted provider/network/browser behavior | INFO | Deterministic acceptance uses external-boundary fakes; no paid provider or live browser session exercised |
291
+
292
+ ## Proposed Tests
293
+ No outstanding CRITICAL or WARNING test proposal for changed behavior. The approved body-only quota proposal was implemented before acceptance resumed. Future live-service smoke testing is optional and not part of this local audit.
294
+
295
+ ## Overall Coverage Assessment
296
+ ADEQUATE. All new public transport APIs and changed configuration behavior have tests; core retry outcomes and generation/compliance integration are covered. The discovered critical SDK compatibility gap is closed. Remaining observations concern existing branches or external live-service validation, not missing tests for the changed public contract.
@@ -0,0 +1,18 @@
1
+ # Bounded backoff for LLM backend requests
2
+
3
+ Transient LLM backend failures currently terminate operations under an explicit no-retry contract. We will replace that rule with bounded transport retries of the same request, independently of generation and healing budgets, so temporary outages can recover without replaying the task or browser actions. The user confirmed this decision on 2026-10-07.
4
+
5
+ - Apply the same policy to OpenAI and Anthropic, including custom base URLs, for generation, failure classification, group diagnosis, and compliance checks. Transport retries remain within one logical LLM attempt and consume no additional generation, healing, or group recovery attempts.
6
+ - Retry connection failures, timeouts, HTTP 408/429, and transient 5xx failures. Authentication, authorization, invalid requests, and explicitly exhausted quota fail immediately; explicit permanent causes take precedence over a retryable HTTP status. Invalid content in a successful response remains subject to existing response validation and recovery, not transport backoff.
7
+ - Default to **3 total attempts**, including the initial request. Only the attempt count is configurable, using the existing precedence: explicit test parameters > environment > pyproject. One attempt disables retries; values below one are configuration errors. Disable SDK retries so the configured limit also limits request sends.
8
+ - Fix the minimum and maximum delays at **1 and 10 seconds**. Base delays grow as 1, 2, 4, 8, 10, 10… seconds. Add a random 0–25% of the base delay, then cap the final delay at 10 seconds. With the default attempt count, the two pauses are 1–1.25 and 2–2.5 seconds.
9
+ - Honor a valid `Retry-After` by taking the greater of its indicated wait and the computed delay, provided the indicated wait is at most 10 seconds. If it exceeds 10 seconds, terminate with an actionable error instead of retrying earlier than requested or exceeding the delay cap. Ignore malformed values.
10
+ - Preserve current SDK request timeouts; adding timeout configuration or an overall deadline is outside this change. Cancellation interrupts backoff waiting and prevents another retry.
11
+ - After exhaustion, retain existing `LLMUnavailableError` handling and the original cause. Required operations fail the current test through normal error handling and resource cleanup. Optional terminal-failure classification logs a warning and preserves the original failure; steering likewise preserves its original terminal failure. Retry only the compliance request after browser actions have run, and never cache a candidate without a successful compliance verdict. Preserve modes that make no LLM requests.
12
+ - Log retries with provider, operation, attempt number, error category, and delay. Exclude secrets and request/response contents. Introduce no new public monitoring events.
13
+
14
+ ## Consequences
15
+
16
+ Transport recovery deliberately replaces the existing immediate-failure rule and must remain distinct from browser polling, which repeats browser code. Central control of retries avoids multiplying SDK and application attempts. Bounded attempts and capped pauses trade outage tolerance for predictable retry counts, but do not provide a total wall-clock bound because request timeouts are unchanged. When a response is lost after server-side processing, retrying may duplicate provider work and increase usage costs; exactly-once provider execution is not guaranteed.
17
+
18
+ This decision is based on architecture contracts and usage documentation, not an implementation audit. Implementation must reconcile the existing no-retry rules and verify actual SDK retry settings. Cell design, signatures, and contract layout are outside this ADR; no behavioral decision remains open.